shotgun-sh 0.4.7.dev2__tar.gz → 0.4.7.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 (244) hide show
  1. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/PKG-INFO +13 -2
  2. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/README.md +11 -0
  3. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/pyproject.toml +2 -2
  4. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/change_detector.py +6 -2
  5. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/ingestor.py +10 -3
  6. shotgun_sh-0.4.7.dev4/src/shotgun/codebase/core/kuzu_compat.py +119 -0
  7. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/manager.py +17 -4
  8. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/chat_screen.py +8 -0
  9. shotgun_sh-0.4.7.dev4/src/shotgun/tui/screens/kuzu_error_dialog.py +135 -0
  10. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/.gitignore +0 -0
  11. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/LICENSE +0 -0
  12. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/hatch_build.py +0 -0
  13. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/__init__.py +0 -0
  14. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/__init__.py +0 -0
  15. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/agent_manager.py +0 -0
  16. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/common.py +0 -0
  17. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/README.md +0 -0
  18. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/__init__.py +0 -0
  19. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/constants.py +0 -0
  20. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/manager.py +0 -0
  21. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/models.py +0 -0
  22. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/provider.py +0 -0
  23. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/config/streaming_test.py +0 -0
  24. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/context_analyzer/__init__.py +0 -0
  25. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/context_analyzer/analyzer.py +0 -0
  26. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/context_analyzer/constants.py +0 -0
  27. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/context_analyzer/formatter.py +0 -0
  28. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/context_analyzer/models.py +0 -0
  29. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/__init__.py +0 -0
  30. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/filters.py +0 -0
  31. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/__init__.py +0 -0
  32. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/chunking.py +0 -0
  33. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/compaction.py +0 -0
  34. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/constants.py +0 -0
  35. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/context_extraction.py +0 -0
  36. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/file_content_deduplication.py +0 -0
  37. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/history_building.py +0 -0
  38. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/history_processors.py +0 -0
  39. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/message_utils.py +0 -0
  40. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/__init__.py +0 -0
  41. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/anthropic.py +0 -0
  42. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/base.py +0 -0
  43. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/openai.py +0 -0
  44. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/sentencepiece_counter.py +0 -0
  45. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/tokenizer_cache.py +0 -0
  46. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_counting/utils.py +0 -0
  47. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/history/token_estimation.py +0 -0
  48. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/manager.py +0 -0
  49. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/conversation/models.py +0 -0
  50. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/error/__init__.py +0 -0
  51. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/error/models.py +0 -0
  52. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/export.py +0 -0
  53. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/llm.py +0 -0
  54. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/messages.py +0 -0
  55. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/models.py +0 -0
  56. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/plan.py +0 -0
  57. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/research.py +0 -0
  58. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/__init__.py +0 -0
  59. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/models.py +0 -0
  60. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/router.py +0 -0
  61. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/tools/__init__.py +0 -0
  62. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/tools/delegation_tools.py +0 -0
  63. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/router/tools/plan_tools.py +0 -0
  64. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/runner.py +0 -0
  65. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/specify.py +0 -0
  66. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tasks.py +0 -0
  67. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/__init__.py +0 -0
  68. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  69. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  70. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  71. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  72. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/models.py +0 -0
  73. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  74. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  75. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/file_management.py +0 -0
  76. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/registry.py +0 -0
  77. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  78. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  79. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  80. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  81. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  82. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/agents/usage_manager.py +0 -0
  83. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/api_endpoints.py +0 -0
  84. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/build_constants.py +0 -0
  85. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/__init__.py +0 -0
  86. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/clear.py +0 -0
  87. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/codebase/__init__.py +0 -0
  88. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/codebase/commands.py +0 -0
  89. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/codebase/models.py +0 -0
  90. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/compact.py +0 -0
  91. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/config.py +0 -0
  92. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/context.py +0 -0
  93. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/error_handler.py +0 -0
  94. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/export.py +0 -0
  95. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/feedback.py +0 -0
  96. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/models.py +0 -0
  97. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/plan.py +0 -0
  98. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/research.py +0 -0
  99. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/spec/__init__.py +0 -0
  100. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/spec/backup.py +0 -0
  101. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/spec/commands.py +0 -0
  102. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/spec/models.py +0 -0
  103. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/spec/pull_service.py +0 -0
  104. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/specify.py +0 -0
  105. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/tasks.py +0 -0
  106. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/update.py +0 -0
  107. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/cli/utils.py +0 -0
  108. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/__init__.py +0 -0
  109. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/__init__.py +0 -0
  110. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  111. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/cypher_models.py +0 -0
  112. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/language_config.py +0 -0
  113. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/nl_query.py +0 -0
  114. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/core/parser_loader.py +0 -0
  115. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/models.py +0 -0
  116. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/codebase/service.py +0 -0
  117. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/exceptions.py +0 -0
  118. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/llm_proxy/__init__.py +0 -0
  119. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/llm_proxy/client.py +0 -0
  120. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/llm_proxy/clients.py +0 -0
  121. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/llm_proxy/constants.py +0 -0
  122. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/llm_proxy/models.py +0 -0
  123. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/logging_config.py +0 -0
  124. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/main.py +0 -0
  125. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/posthog_telemetry.py +0 -0
  126. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/__init__.py +0 -0
  127. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/__init__.py +0 -0
  128. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/export.j2 +0 -0
  129. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  130. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  131. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  132. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  133. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/partials/router_delegation_mode.j2 +0 -0
  134. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/plan.j2 +0 -0
  135. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/research.j2 +0 -0
  136. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/router.j2 +0 -0
  137. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/specify.j2 +0 -0
  138. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  139. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  140. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  141. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/__init__.py +0 -0
  142. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  143. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  144. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  145. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  146. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  147. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  148. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/history/__init__.py +0 -0
  149. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/history/chunk_summarization.j2 +0 -0
  150. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/history/combine_summaries.j2 +0 -0
  151. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  152. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/history/summarization.j2 +0 -0
  153. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/loader.py +0 -0
  154. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/prompts/tools/web_search.j2 +0 -0
  155. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/py.typed +0 -0
  156. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sdk/__init__.py +0 -0
  157. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sdk/codebase.py +0 -0
  158. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sdk/exceptions.py +0 -0
  159. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sdk/models.py +0 -0
  160. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sdk/services.py +0 -0
  161. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/sentry_telemetry.py +0 -0
  162. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/settings.py +0 -0
  163. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/__init__.py +0 -0
  164. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/client.py +0 -0
  165. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/constants.py +0 -0
  166. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/exceptions.py +0 -0
  167. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/models.py +0 -0
  168. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/__init__.py +0 -0
  169. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/file_scanner.py +0 -0
  170. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/hasher.py +0 -0
  171. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/models.py +0 -0
  172. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/upload_pipeline.py +0 -0
  173. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/shared_specs/utils.py +0 -0
  174. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/specs_client.py +0 -0
  175. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/shotgun_web/supabase_client.py +0 -0
  176. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/telemetry.py +0 -0
  177. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/__init__.py +0 -0
  178. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/app.py +0 -0
  179. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/commands/__init__.py +0 -0
  180. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/context_indicator.py +0 -0
  181. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/mode_indicator.py +0 -0
  182. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/prompt_input.py +0 -0
  183. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/spinner.py +0 -0
  184. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/splash.py +0 -0
  185. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/status_bar.py +0 -0
  186. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/components/vertical_tail.py +0 -0
  187. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/containers.py +0 -0
  188. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/dependencies.py +0 -0
  189. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/filtered_codebase_service.py +0 -0
  190. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/layout.py +0 -0
  191. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/protocols.py +0 -0
  192. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/__init__.py +0 -0
  193. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/chat.tcss +0 -0
  194. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/codebase_index_prompt_screen.py +0 -0
  195. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/codebase_index_selection.py +0 -0
  196. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/help_text.py +0 -0
  197. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat/prompt_history.py +0 -0
  198. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat.tcss +0 -0
  199. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  200. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -0
  201. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  202. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/__init__.py +0 -0
  203. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/agent_response.py +0 -0
  204. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/chat_history.py +0 -0
  205. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/formatters.py +0 -0
  206. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/partial_response.py +0 -0
  207. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/history/user_question.py +0 -0
  208. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/chat_screen/messages.py +0 -0
  209. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/confirmation_dialog.py +0 -0
  210. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/directory_setup.py +0 -0
  211. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/feedback.py +0 -0
  212. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/github_issue.py +0 -0
  213. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/model_picker.py +0 -0
  214. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/pipx_migration.py +0 -0
  215. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/provider_config.py +0 -0
  216. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shared_specs/__init__.py +0 -0
  217. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shared_specs/create_spec_dialog.py +0 -0
  218. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shared_specs/models.py +0 -0
  219. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shared_specs/share_specs_dialog.py +0 -0
  220. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shared_specs/upload_progress_screen.py +0 -0
  221. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/shotgun_auth.py +0 -0
  222. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/spec_pull.py +0 -0
  223. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/splash.py +0 -0
  224. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/screens/welcome.py +0 -0
  225. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/services/__init__.py +0 -0
  226. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/services/conversation_service.py +0 -0
  227. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/state/__init__.py +0 -0
  228. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/state/processing_state.py +0 -0
  229. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/styles.tcss +0 -0
  230. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/utils/__init__.py +0 -0
  231. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/utils/mode_progress.py +0 -0
  232. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/__init__.py +0 -0
  233. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/approval_widget.py +0 -0
  234. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/cascade_confirmation_widget.py +0 -0
  235. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/plan_panel.py +0 -0
  236. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/step_checkpoint_widget.py +0 -0
  237. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/tui/widgets/widget_coordinator.py +0 -0
  238. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/__init__.py +0 -0
  239. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/datetime_utils.py +0 -0
  240. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/env_utils.py +0 -0
  241. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/file_system_utils.py +0 -0
  242. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/marketing.py +0 -0
  243. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.dev4}/src/shotgun/utils/source_detection.py +0 -0
  244. {shotgun_sh-0.4.7.dev2 → shotgun_sh-0.4.7.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.7.dev2
3
+ Version: 0.4.7.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
@@ -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
@@ -165,6 +165,17 @@ uv tool install --python 3.12 shotgun-sh
165
165
 
166
166
  **Important:** Run in **PowerShell**, not Command Prompt or VS Developer shells.
167
167
 
168
+ #### Optional: Enable Code Indexing
169
+
170
+ Code indexing requires the Visual C++ Redistributable. Run this in PowerShell (as Administrator):
171
+
172
+ ```powershell
173
+ # Download and install Visual C++ Redistributable
174
+ Import-Module BitsTransfer
175
+ Start-BitsTransfer -Source "https://aka.ms/vs/17/release/vc_redist.x64.exe" -Destination "$env:TEMP\vc_redist.x64.exe"
176
+ Start-Process -FilePath "$env:TEMP\vc_redist.x64.exe" -ArgumentList "/install", "/quiet", "/norestart" -Wait
177
+ ```
178
+
168
179
  </details>
169
180
 
170
181
  _💡 Restart your terminal after installation_
@@ -110,6 +110,17 @@ uv tool install --python 3.12 shotgun-sh
110
110
 
111
111
  **Important:** Run in **PowerShell**, not Command Prompt or VS Developer shells.
112
112
 
113
+ #### Optional: Enable Code Indexing
114
+
115
+ Code indexing requires the Visual C++ Redistributable. Run this in PowerShell (as Administrator):
116
+
117
+ ```powershell
118
+ # Download and install Visual C++ Redistributable
119
+ Import-Module BitsTransfer
120
+ Start-BitsTransfer -Source "https://aka.ms/vs/17/release/vc_redist.x64.exe" -Destination "$env:TEMP\vc_redist.x64.exe"
121
+ Start-Process -FilePath "$env:TEMP\vc_redist.x64.exe" -ArgumentList "/install", "/quiet", "/norestart" -Wait
122
+ ```
123
+
113
124
  </details>
114
125
 
115
126
  _💡 Restart your terminal after installation_
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shotgun-sh"
3
- version = "0.4.7.dev2"
3
+ version = "0.4.7.dev4"
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,119 @@
1
+ """Lazy import wrapper for kuzu (real_ladybug) with Windows compatibility handling."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+ import webbrowser
7
+ from typing import Any
8
+
9
+ _kuzu_module: Any = None
10
+ _import_error: ImportError | None = None
11
+
12
+ # Windows VC++ download URL
13
+ _VC_REDIST_URL = "https://aka.ms/vs/17/release/vc_redist.x64.exe"
14
+
15
+ # PowerShell installation script for VC++ Redistributable
16
+ _VC_INSTALL_SCRIPT = f"""\
17
+ # Download and install Visual C++ Redistributable (run as Administrator)
18
+ Import-Module BitsTransfer
19
+ Start-BitsTransfer -Source "{_VC_REDIST_URL}" -Destination "$env:TEMP\\vc_redist.x64.exe"
20
+ Start-Process -FilePath "$env:TEMP\\vc_redist.x64.exe" -ArgumentList "/install", "/quiet", "/norestart" -Wait\
21
+ """
22
+
23
+ # Windows VC++ installation instructions
24
+ _WINDOWS_INSTALL_INSTRUCTIONS = f"""
25
+ To fix this, install the Visual C++ Redistributable.
26
+
27
+ Option 1: Run this PowerShell script (as Administrator):
28
+
29
+ {_VC_INSTALL_SCRIPT}
30
+
31
+ Option 2: Download manually from:
32
+ {_VC_REDIST_URL}
33
+ """
34
+
35
+
36
+ def copy_vcpp_script_to_clipboard() -> bool:
37
+ """Copy the VC++ installation PowerShell script to clipboard.
38
+
39
+ Returns:
40
+ True if successful, False otherwise
41
+ """
42
+ try:
43
+ import pyperclip # type: ignore[import-untyped]
44
+
45
+ pyperclip.copy(_VC_INSTALL_SCRIPT)
46
+ return True
47
+ except Exception:
48
+ return False
49
+
50
+
51
+ def open_vcpp_download_page() -> bool:
52
+ """Open the VC++ Redistributable download page in the default browser.
53
+
54
+ Returns:
55
+ True if successful, False otherwise
56
+ """
57
+ try:
58
+ webbrowser.open(_VC_REDIST_URL)
59
+ return True
60
+ except Exception:
61
+ return False
62
+
63
+
64
+ class KuzuImportError(ImportError):
65
+ """Raised when kuzu cannot be imported, typically on Windows due to DLL issues."""
66
+
67
+ def __init__(self, original_error: ImportError) -> None:
68
+ self.original_error = original_error
69
+ if sys.platform == "win32":
70
+ message = (
71
+ "Failed to load the graph database library (real_ladybug).\n\n"
72
+ "This error typically occurs on Windows when the Visual C++ "
73
+ "Redistributable is not installed.\n"
74
+ f"{_WINDOWS_INSTALL_INSTRUCTIONS}\n"
75
+ f"Original error: {original_error}"
76
+ )
77
+ else:
78
+ message = f"Failed to import real_ladybug: {original_error}"
79
+ super().__init__(message)
80
+
81
+
82
+ def get_kuzu() -> Any:
83
+ """Get the kuzu module, importing it lazily on first use.
84
+
85
+ Raises:
86
+ KuzuImportError: If kuzu cannot be imported (e.g., Windows DLL issues)
87
+
88
+ Returns:
89
+ The real_ladybug module
90
+ """
91
+ global _kuzu_module, _import_error
92
+
93
+ if _kuzu_module is not None:
94
+ return _kuzu_module
95
+
96
+ if _import_error is not None:
97
+ raise KuzuImportError(_import_error)
98
+
99
+ try:
100
+ import real_ladybug
101
+
102
+ _kuzu_module = real_ladybug
103
+ return _kuzu_module
104
+ except ImportError as e:
105
+ _import_error = e
106
+ raise KuzuImportError(e) from e
107
+
108
+
109
+ def is_kuzu_available() -> bool:
110
+ """Check if kuzu is available without raising an error.
111
+
112
+ Returns:
113
+ True if kuzu can be imported, False otherwise
114
+ """
115
+ try:
116
+ get_kuzu()
117
+ return True
118
+ except KuzuImportError:
119
+ 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,135 @@
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_INSTALL_SCRIPT,
12
+ _VC_REDIST_URL,
13
+ copy_vcpp_script_to_clipboard,
14
+ open_vcpp_download_page,
15
+ )
16
+ from shotgun.logging_config import get_logger
17
+
18
+ logger = get_logger(__name__)
19
+
20
+
21
+ class KuzuErrorDialog(ModalScreen[bool]):
22
+ """Error dialog for Windows kuzu import failures with copy/open buttons."""
23
+
24
+ DEFAULT_CSS = """
25
+ KuzuErrorDialog {
26
+ align: center middle;
27
+ background: rgba(0, 0, 0, 0.5);
28
+ }
29
+
30
+ KuzuErrorDialog > #dialog-container {
31
+ width: 90%;
32
+ max-width: 100;
33
+ height: auto;
34
+ max-height: 90%;
35
+ border: wide $error;
36
+ padding: 1 2;
37
+ layout: vertical;
38
+ background: $surface;
39
+ }
40
+
41
+ #error-title {
42
+ text-style: bold;
43
+ color: $error;
44
+ padding-bottom: 1;
45
+ }
46
+
47
+ #error-message {
48
+ padding: 1 0;
49
+ }
50
+
51
+ #script-display {
52
+ padding: 1;
53
+ margin: 1 0;
54
+ background: $surface-darken-1;
55
+ border: round $primary;
56
+ overflow-x: auto;
57
+ }
58
+
59
+ #status-label {
60
+ color: $success;
61
+ padding: 1 0;
62
+ min-height: 1;
63
+ }
64
+
65
+ #dialog-buttons {
66
+ layout: horizontal;
67
+ align-horizontal: center;
68
+ height: auto;
69
+ padding-top: 1;
70
+ }
71
+
72
+ #dialog-buttons Button {
73
+ margin: 0 1;
74
+ }
75
+ """
76
+
77
+ BINDINGS = [
78
+ ("escape", "close", "Close"),
79
+ ]
80
+
81
+ def compose(self) -> ComposeResult:
82
+ with Container(id="dialog-container"):
83
+ yield Label("Code Indexing Requires Visual C++", id="error-title")
84
+ yield Static(
85
+ "The graph database library requires the Visual C++ Redistributable "
86
+ "to be installed on Windows.\n\n"
87
+ "Run this PowerShell script as Administrator:",
88
+ id="error-message",
89
+ )
90
+ yield Static(_VC_INSTALL_SCRIPT, id="script-display")
91
+ yield Static("", id="status-label")
92
+ with Horizontal(id="dialog-buttons"):
93
+ yield Button(
94
+ "Copy Script to Clipboard", id="copy-btn", variant="primary"
95
+ )
96
+ yield Button("Open Download Page", id="open-btn", variant="default")
97
+ yield Button("Close", id="close-btn", variant="default")
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_script()
105
+ elif event.button.id == "open-btn":
106
+ self._open_download()
107
+ elif event.button.id == "close-btn":
108
+ self.dismiss(True)
109
+
110
+ def _copy_script(self) -> None:
111
+ """Copy the PowerShell installation script to clipboard."""
112
+ status_label = self.query_one("#status-label", Static)
113
+
114
+ if copy_vcpp_script_to_clipboard():
115
+ status_label.update("Copied script to clipboard!")
116
+ self.query_one("#copy-btn", Button).label = "Copied!"
117
+ logger.debug("Copied VC++ installation script to clipboard")
118
+ else:
119
+ status_label.update(f"Could not copy. Download from: {_VC_REDIST_URL}")
120
+ logger.warning("Failed to copy VC++ script to clipboard")
121
+
122
+ def _open_download(self) -> None:
123
+ """Open the download page in the default browser."""
124
+ status_label = self.query_one("#status-label", Static)
125
+
126
+ if open_vcpp_download_page():
127
+ status_label.update("Opened download page in browser")
128
+ logger.debug(f"Opened VC++ download page: {_VC_REDIST_URL}")
129
+ else:
130
+ status_label.update(f"Could not open browser. URL: {_VC_REDIST_URL}")
131
+ logger.warning("Failed to open VC++ download page")
132
+
133
+ def action_close(self) -> None:
134
+ """Close the dialog."""
135
+ self.dismiss(True)
File without changes