xai-review 0.31.0__tar.gz → 0.33.0__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 xai-review might be problematic. Click here for more details.

Files changed (389) hide show
  1. {xai_review-0.31.0/xai_review.egg-info → xai_review-0.33.0}/PKG-INFO +2 -2
  2. {xai_review-0.31.0 → xai_review-0.33.0}/README.md +1 -1
  3. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/schema/comments.py +0 -2
  4. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/artifacts/tools.py +2 -2
  5. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitea/client.py +25 -34
  6. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/gitea.py +0 -2
  7. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/artifacts.py +6 -0
  8. xai_review-0.33.0/ai_review/tests/suites/services/artifacts/test_service.py +92 -0
  9. xai_review-0.33.0/ai_review/tests/suites/services/artifacts/test_tools.py +28 -0
  10. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/gitea/test_client.py +11 -10
  11. xai_review-0.33.0/ai_review/tests/suites/services/vcs/gitlab/__init__.py +0 -0
  12. {xai_review-0.31.0 → xai_review-0.33.0}/pyproject.toml +1 -1
  13. {xai_review-0.31.0 → xai_review-0.33.0/xai_review.egg-info}/PKG-INFO +2 -2
  14. {xai_review-0.31.0 → xai_review-0.33.0}/xai_review.egg-info/SOURCES.txt +3 -0
  15. {xai_review-0.31.0 → xai_review-0.33.0}/LICENSE +0 -0
  16. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/__init__.py +0 -0
  17. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/__init__.py +0 -0
  18. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/__init__.py +0 -0
  19. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_context_review.py +0 -0
  20. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_inline_reply_review.py +0 -0
  21. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_inline_review.py +0 -0
  22. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_review.py +0 -0
  23. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_summary_reply_review.py +0 -0
  24. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/commands/run_summary_review.py +0 -0
  25. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/cli/main.py +0 -0
  26. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/__init__.py +0 -0
  27. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/__init__.py +0 -0
  28. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/client.py +0 -0
  29. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/__init__.py +0 -0
  30. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/client.py +0 -0
  31. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/schema/__init__.py +0 -0
  32. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/schema/comments.py +0 -0
  33. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/schema/files.py +0 -0
  34. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/schema/pull_request.py +0 -0
  35. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/schema/user.py +0 -0
  36. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/pr/types.py +0 -0
  37. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/bitbucket/tools.py +0 -0
  38. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/claude/__init__.py +0 -0
  39. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/claude/client.py +0 -0
  40. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/claude/schema.py +0 -0
  41. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/claude/types.py +0 -0
  42. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gemini/__init__.py +0 -0
  43. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gemini/client.py +0 -0
  44. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gemini/schema.py +0 -0
  45. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gemini/types.py +0 -0
  46. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/__init__.py +0 -0
  47. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/client.py +0 -0
  48. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/__init__.py +0 -0
  49. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/client.py +0 -0
  50. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/schema/__init__.py +0 -0
  51. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/schema/files.py +0 -0
  52. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/schema/pull_request.py +0 -0
  53. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/schema/user.py +0 -0
  54. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/pr/types.py +0 -0
  55. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitea/tools.py +0 -0
  56. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/__init__.py +0 -0
  57. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/client.py +0 -0
  58. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/__init__.py +0 -0
  59. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/client.py +0 -0
  60. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/__init__.py +0 -0
  61. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/comments.py +0 -0
  62. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/files.py +0 -0
  63. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/pull_request.py +0 -0
  64. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/reviews.py +0 -0
  65. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/schema/user.py +0 -0
  66. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/pr/types.py +0 -0
  67. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/github/tools.py +0 -0
  68. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/__init__.py +0 -0
  69. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/client.py +0 -0
  70. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/__init__.py +0 -0
  71. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/client.py +0 -0
  72. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/__init__.py +0 -0
  73. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/changes.py +0 -0
  74. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/discussions.py +0 -0
  75. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/notes.py +0 -0
  76. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/position.py +0 -0
  77. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/schema/user.py +0 -0
  78. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/mr/types.py +0 -0
  79. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/gitlab/tools.py +0 -0
  80. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/ollama/__init__.py +0 -0
  81. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/ollama/client.py +0 -0
  82. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/ollama/schema.py +0 -0
  83. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/ollama/types.py +0 -0
  84. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/openai/__init__.py +0 -0
  85. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/openai/client.py +0 -0
  86. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/openai/schema.py +0 -0
  87. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/clients/openai/types.py +0 -0
  88. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/config.py +0 -0
  89. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/__init__.py +0 -0
  90. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/asynchronous/__init__.py +0 -0
  91. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/asynchronous/gather.py +0 -0
  92. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/__init__.py +0 -0
  93. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/artifacts.py +0 -0
  94. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/base.py +0 -0
  95. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/core.py +0 -0
  96. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/http.py +0 -0
  97. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/__init__.py +0 -0
  98. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/base.py +0 -0
  99. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/claude.py +0 -0
  100. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/gemini.py +0 -0
  101. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/meta.py +0 -0
  102. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/ollama.py +0 -0
  103. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/llm/openai.py +0 -0
  104. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/logger.py +0 -0
  105. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/prompt.py +0 -0
  106. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/review.py +0 -0
  107. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/__init__.py +0 -0
  108. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/base.py +0 -0
  109. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/bitbucket.py +0 -0
  110. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/gitea.py +0 -0
  111. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/github.py +0 -0
  112. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/gitlab.py +0 -0
  113. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/config/vcs/pagination.py +0 -0
  114. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/constants/__init__.py +0 -0
  115. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/constants/llm_provider.py +0 -0
  116. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/constants/vcs_provider.py +0 -0
  117. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/diff/__init__.py +0 -0
  118. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/diff/models.py +0 -0
  119. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/diff/parser.py +0 -0
  120. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/diff/tools.py +0 -0
  121. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/__init__.py +0 -0
  122. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/client.py +0 -0
  123. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/event_hooks/__init__.py +0 -0
  124. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/event_hooks/base.py +0 -0
  125. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/event_hooks/logger.py +0 -0
  126. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/handlers.py +0 -0
  127. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/paginate.py +0 -0
  128. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/transports/__init__.py +0 -0
  129. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/http/transports/retry.py +0 -0
  130. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/json.py +0 -0
  131. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/llm/__init__.py +0 -0
  132. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/llm/output_json_parser.py +0 -0
  133. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/logger.py +0 -0
  134. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/resources.py +0 -0
  135. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/template/__init__.py +0 -0
  136. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/libs/template/render.py +0 -0
  137. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/__init__.py +0 -0
  138. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_context.md +0 -0
  139. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_inline.md +0 -0
  140. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_inline_reply.md +0 -0
  141. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_summary.md +0 -0
  142. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_summary_reply.md +0 -0
  143. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_system_context.md +0 -0
  144. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_system_inline.md +0 -0
  145. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_system_inline_reply.md +0 -0
  146. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_system_summary.md +0 -0
  147. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/prompts/default_system_summary_reply.md +0 -0
  148. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/resources/__init__.py +0 -0
  149. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/resources/pricing.yaml +0 -0
  150. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/__init__.py +0 -0
  151. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/artifacts/__init__.py +0 -0
  152. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/artifacts/schema.py +0 -0
  153. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/artifacts/service.py +0 -0
  154. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/artifacts/types.py +0 -0
  155. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/cost/__init__.py +0 -0
  156. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/cost/schema.py +0 -0
  157. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/cost/service.py +0 -0
  158. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/cost/types.py +0 -0
  159. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/__init__.py +0 -0
  160. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/renderers.py +0 -0
  161. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/schema.py +0 -0
  162. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/service.py +0 -0
  163. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/tools.py +0 -0
  164. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/diff/types.py +0 -0
  165. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/git/__init__.py +0 -0
  166. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/git/service.py +0 -0
  167. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/git/types.py +0 -0
  168. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/hook/__init__.py +0 -0
  169. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/hook/constants.py +0 -0
  170. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/hook/service.py +0 -0
  171. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/hook/types.py +0 -0
  172. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/__init__.py +0 -0
  173. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/claude/__init__.py +0 -0
  174. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/claude/client.py +0 -0
  175. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/factory.py +0 -0
  176. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/gemini/__init__.py +0 -0
  177. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/gemini/client.py +0 -0
  178. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/ollama/__init__.py +0 -0
  179. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/ollama/client.py +0 -0
  180. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/openai/__init__.py +0 -0
  181. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/openai/client.py +0 -0
  182. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/llm/types.py +0 -0
  183. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/__init__.py +0 -0
  184. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/adapter.py +0 -0
  185. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/schema.py +0 -0
  186. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/service.py +0 -0
  187. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/tools.py +0 -0
  188. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/prompt/types.py +0 -0
  189. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/__init__.py +0 -0
  190. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/gateway/__init__.py +0 -0
  191. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/gateway/review_comment_gateway.py +0 -0
  192. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
  193. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/gateway/review_llm_gateway.py +0 -0
  194. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/gateway/types.py +0 -0
  195. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/__init__.py +0 -0
  196. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline/__init__.py +0 -0
  197. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline/schema.py +0 -0
  198. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline/service.py +0 -0
  199. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline/types.py +0 -0
  200. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline_reply/__init__.py +0 -0
  201. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline_reply/schema.py +0 -0
  202. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline_reply/service.py +0 -0
  203. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/inline_reply/types.py +0 -0
  204. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/policy/__init__.py +0 -0
  205. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/policy/service.py +0 -0
  206. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/policy/types.py +0 -0
  207. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary/__init__.py +0 -0
  208. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary/schema.py +0 -0
  209. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary/service.py +0 -0
  210. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary/types.py +0 -0
  211. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary_reply/__init__.py +0 -0
  212. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary_reply/schema.py +0 -0
  213. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary_reply/service.py +0 -0
  214. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/internal/summary_reply/types.py +0 -0
  215. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/__init__.py +0 -0
  216. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/context.py +0 -0
  217. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/inline.py +0 -0
  218. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/inline_reply.py +0 -0
  219. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/summary.py +0 -0
  220. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/summary_reply.py +0 -0
  221. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/runner/types.py +0 -0
  222. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/review/service.py +0 -0
  223. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/__init__.py +0 -0
  224. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/bitbucket/__init__.py +0 -0
  225. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/bitbucket/adapter.py +0 -0
  226. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/bitbucket/client.py +0 -0
  227. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/factory.py +0 -0
  228. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitea/__init__.py +0 -0
  229. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitea/adapter.py +0 -0
  230. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/github/__init__.py +0 -0
  231. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/github/adapter.py +0 -0
  232. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/github/client.py +0 -0
  233. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitlab/__init__.py +0 -0
  234. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitlab/adapter.py +0 -0
  235. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/gitlab/client.py +0 -0
  236. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/services/vcs/types.py +0 -0
  237. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/__init__.py +0 -0
  238. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/__init__.py +0 -0
  239. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/__init__.py +0 -0
  240. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/bitbucket.py +0 -0
  241. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/claude.py +0 -0
  242. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/gemini.py +0 -0
  243. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/github.py +0 -0
  244. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/gitlab.py +0 -0
  245. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/ollama.py +0 -0
  246. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/clients/openai.py +0 -0
  247. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/libs/__init__.py +0 -0
  248. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/libs/llm/__init__.py +0 -0
  249. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/libs/llm/output_json_parser.py +0 -0
  250. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/__init__.py +0 -0
  251. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/cost.py +0 -0
  252. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/diff.py +0 -0
  253. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/git.py +0 -0
  254. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/hook.py +0 -0
  255. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/llm.py +0 -0
  256. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/prompt.py +0 -0
  257. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/__init__.py +0 -0
  258. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/base.py +0 -0
  259. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/gateway/__init__.py +0 -0
  260. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py +0 -0
  261. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
  262. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py +0 -0
  263. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/__init__.py +0 -0
  264. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/inline.py +0 -0
  265. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/inline_reply.py +0 -0
  266. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/policy.py +0 -0
  267. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/summary.py +0 -0
  268. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/internal/summary_reply.py +0 -0
  269. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/__init__.py +0 -0
  270. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/context.py +0 -0
  271. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/inline.py +0 -0
  272. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/inline_reply.py +0 -0
  273. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/summary.py +0 -0
  274. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/review/runner/summary_reply.py +0 -0
  275. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/fixtures/services/vcs.py +0 -0
  276. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/__init__.py +0 -0
  277. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/cli/__init__.py +0 -0
  278. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/cli/test_main.py +0 -0
  279. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/__init__.py +0 -0
  280. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/bitbucket/__init__.py +0 -0
  281. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/bitbucket/test_client.py +0 -0
  282. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/bitbucket/test_tools.py +0 -0
  283. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/claude/__init__.py +0 -0
  284. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/claude/test_client.py +0 -0
  285. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/claude/test_schema.py +0 -0
  286. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gemini/__init__.py +0 -0
  287. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gemini/test_client.py +0 -0
  288. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gemini/test_schema.py +0 -0
  289. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitea/__init__.py +0 -0
  290. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitea/test_client.py +0 -0
  291. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitea/test_tools.py +0 -0
  292. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/github/__init__.py +0 -0
  293. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/github/test_client.py +0 -0
  294. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/github/test_tools.py +0 -0
  295. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitlab/__init__.py +0 -0
  296. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitlab/test_client.py +0 -0
  297. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/gitlab/test_tools.py +0 -0
  298. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/ollama/__init__.py +0 -0
  299. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/ollama/test_client.py +0 -0
  300. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/ollama/test_schema.py +0 -0
  301. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/openai/__init__.py +0 -0
  302. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/openai/test_client.py +0 -0
  303. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/clients/openai/test_schema.py +0 -0
  304. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/__init__.py +0 -0
  305. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/asynchronous/__init__.py +0 -0
  306. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/asynchronous/test_gather.py +0 -0
  307. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/config/__init__.py +0 -0
  308. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/config/test_prompt.py +0 -0
  309. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/diff/__init__.py +0 -0
  310. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/diff/test_models.py +0 -0
  311. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/diff/test_parser.py +0 -0
  312. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/diff/test_tools.py +0 -0
  313. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/http/__init__.py +0 -0
  314. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/http/test_paginate.py +0 -0
  315. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/llm/__init__.py +0 -0
  316. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/llm/test_output_json_parser.py +0 -0
  317. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/template/__init__.py +0 -0
  318. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/template/test_render.py +0 -0
  319. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/libs/test_json.py +0 -0
  320. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/__init__.py +0 -0
  321. {xai_review-0.31.0/ai_review/tests/suites/services/cost → xai_review-0.33.0/ai_review/tests/suites/services/artifacts}/__init__.py +0 -0
  322. {xai_review-0.31.0/ai_review/tests/suites/services/diff → xai_review-0.33.0/ai_review/tests/suites/services/cost}/__init__.py +0 -0
  323. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/cost/test_schema.py +0 -0
  324. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/cost/test_service.py +0 -0
  325. {xai_review-0.31.0/ai_review/tests/suites/services/hook → xai_review-0.33.0/ai_review/tests/suites/services/diff}/__init__.py +0 -0
  326. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/diff/test_renderers.py +0 -0
  327. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/diff/test_service.py +0 -0
  328. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/diff/test_tools.py +0 -0
  329. {xai_review-0.31.0/ai_review/tests/suites/services/llm → xai_review-0.33.0/ai_review/tests/suites/services/hook}/__init__.py +0 -0
  330. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/hook/test_service.py +0 -0
  331. {xai_review-0.31.0/ai_review/tests/suites/services/llm/claude → xai_review-0.33.0/ai_review/tests/suites/services/llm}/__init__.py +0 -0
  332. {xai_review-0.31.0/ai_review/tests/suites/services/llm/gemini → xai_review-0.33.0/ai_review/tests/suites/services/llm/claude}/__init__.py +0 -0
  333. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/llm/claude/test_client.py +0 -0
  334. {xai_review-0.31.0/ai_review/tests/suites/services/llm/ollama → xai_review-0.33.0/ai_review/tests/suites/services/llm/gemini}/__init__.py +0 -0
  335. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/llm/gemini/test_client.py +0 -0
  336. {xai_review-0.31.0/ai_review/tests/suites/services/llm/openai → xai_review-0.33.0/ai_review/tests/suites/services/llm/ollama}/__init__.py +0 -0
  337. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/llm/ollama/test_client.py +0 -0
  338. {xai_review-0.31.0/ai_review/tests/suites/services/prompt → xai_review-0.33.0/ai_review/tests/suites/services/llm/openai}/__init__.py +0 -0
  339. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/llm/openai/test_client.py +0 -0
  340. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/llm/test_factory.py +0 -0
  341. {xai_review-0.31.0/ai_review/tests/suites/services/review → xai_review-0.33.0/ai_review/tests/suites/services/prompt}/__init__.py +0 -0
  342. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/prompt/test_adapter.py +0 -0
  343. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/prompt/test_schema.py +0 -0
  344. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/prompt/test_service.py +0 -0
  345. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/prompt/test_tools.py +0 -0
  346. {xai_review-0.31.0/ai_review/tests/suites/services/review/gateway → xai_review-0.33.0/ai_review/tests/suites/services/review}/__init__.py +0 -0
  347. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal → xai_review-0.33.0/ai_review/tests/suites/services/review/gateway}/__init__.py +0 -0
  348. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py +0 -0
  349. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +0 -0
  350. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py +0 -0
  351. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal/inline → xai_review-0.33.0/ai_review/tests/suites/services/review/internal}/__init__.py +0 -0
  352. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal/inline_reply → xai_review-0.33.0/ai_review/tests/suites/services/review/internal/inline}/__init__.py +0 -0
  353. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/inline/test_schema.py +0 -0
  354. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/inline/test_service.py +0 -0
  355. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal/policy → xai_review-0.33.0/ai_review/tests/suites/services/review/internal/inline_reply}/__init__.py +0 -0
  356. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_schema.py +0 -0
  357. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_service.py +0 -0
  358. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal/summary → xai_review-0.33.0/ai_review/tests/suites/services/review/internal/policy}/__init__.py +0 -0
  359. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/policy/test_service.py +0 -0
  360. {xai_review-0.31.0/ai_review/tests/suites/services/review/internal/summary_reply → xai_review-0.33.0/ai_review/tests/suites/services/review/internal/summary}/__init__.py +0 -0
  361. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/summary/test_schema.py +0 -0
  362. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/summary/test_service.py +0 -0
  363. {xai_review-0.31.0/ai_review/tests/suites/services/review/runner → xai_review-0.33.0/ai_review/tests/suites/services/review/internal/summary_reply}/__init__.py +0 -0
  364. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_schema.py +0 -0
  365. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_service.py +0 -0
  366. {xai_review-0.31.0/ai_review/tests/suites/services/vcs → xai_review-0.33.0/ai_review/tests/suites/services/review/runner}/__init__.py +0 -0
  367. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/runner/test_context.py +0 -0
  368. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/runner/test_inline.py +0 -0
  369. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/runner/test_inline_reply.py +0 -0
  370. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/runner/test_summary.py +0 -0
  371. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/runner/test_summary_reply.py +0 -0
  372. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/review/test_service.py +0 -0
  373. {xai_review-0.31.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.33.0/ai_review/tests/suites/services/vcs}/__init__.py +0 -0
  374. {xai_review-0.31.0/ai_review/tests/suites/services/vcs/gitea → xai_review-0.33.0/ai_review/tests/suites/services/vcs/bitbucket}/__init__.py +0 -0
  375. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/bitbucket/test_adapter.py +0 -0
  376. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/bitbucket/test_client.py +0 -0
  377. {xai_review-0.31.0/ai_review/tests/suites/services/vcs/github → xai_review-0.33.0/ai_review/tests/suites/services/vcs/gitea}/__init__.py +0 -0
  378. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/gitea/test_adapter.py +0 -0
  379. {xai_review-0.31.0/ai_review/tests/suites/services/vcs/gitlab → xai_review-0.33.0/ai_review/tests/suites/services/vcs/github}/__init__.py +0 -0
  380. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/github/test_adapter.py +0 -0
  381. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/github/test_client.py +0 -0
  382. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/gitlab/test_adapter.py +0 -0
  383. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/gitlab/test_client.py +0 -0
  384. {xai_review-0.31.0 → xai_review-0.33.0}/ai_review/tests/suites/services/vcs/test_factory.py +0 -0
  385. {xai_review-0.31.0 → xai_review-0.33.0}/setup.cfg +0 -0
  386. {xai_review-0.31.0 → xai_review-0.33.0}/xai_review.egg-info/dependency_links.txt +0 -0
  387. {xai_review-0.31.0 → xai_review-0.33.0}/xai_review.egg-info/entry_points.txt +0 -0
  388. {xai_review-0.31.0 → xai_review-0.33.0}/xai_review.egg-info/requires.txt +0 -0
  389. {xai_review-0.31.0 → xai_review-0.33.0}/xai_review.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.31.0
3
+ Version: 0.33.0
4
4
  Summary: AI-powered code review tool
5
5
  Author-email: Nikita Filonov <nikita.filonov@example.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
@@ -220,7 +220,7 @@ jobs:
220
220
  with:
221
221
  fetch-depth: 0
222
222
 
223
- - uses: Nikita-Filonov/ai-review@v0.31.0
223
+ - uses: Nikita-Filonov/ai-review@v0.33.0
224
224
  with:
225
225
  review-command: ${{ inputs.review-command }}
226
226
  env:
@@ -186,7 +186,7 @@ jobs:
186
186
  with:
187
187
  fetch-depth: 0
188
188
 
189
- - uses: Nikita-Filonov/ai-review@v0.31.0
189
+ - uses: Nikita-Filonov/ai-review@v0.33.0
190
190
  with:
191
191
  review-command: ${{ inputs.review-command }}
192
192
  env:
@@ -28,8 +28,6 @@ class GiteaGetPRCommentsResponseSchema(RootModel[list[GiteaPRCommentSchema]]):
28
28
 
29
29
  class GiteaCreateCommentRequestSchema(BaseModel):
30
30
  body: str
31
- path: str | None = None
32
- line: int | None = None
33
31
 
34
32
 
35
33
  class GiteaCreateCommentResponseSchema(BaseModel):
@@ -1,8 +1,8 @@
1
1
  import hashlib
2
- from datetime import datetime
2
+ from datetime import datetime, timezone
3
3
 
4
4
 
5
5
  def make_artifact_id(text: str) -> str:
6
6
  sha = hashlib.sha1(text.encode()).hexdigest()[:8]
7
- ts = datetime.utcnow().strftime("%Y.%m.%d_%H-%M-%S")
7
+ ts = datetime.now(timezone.utc).strftime("%Y.%m.%d_%H-%M-%S")
8
8
  return f"{ts}_{sha}"
@@ -2,7 +2,10 @@ from ai_review.clients.gitea.client import get_gitea_http_client
2
2
  from ai_review.clients.gitea.pr.schema.comments import GiteaCreateCommentRequestSchema
3
3
  from ai_review.config import settings
4
4
  from ai_review.libs.logger import get_logger
5
- from ai_review.services.vcs.gitea.adapter import get_review_comment_from_gitea_comment, get_user_from_gitea_user
5
+ from ai_review.services.vcs.gitea.adapter import (
6
+ get_user_from_gitea_user,
7
+ get_review_comment_from_gitea_comment,
8
+ )
6
9
  from ai_review.services.vcs.types import (
7
10
  VCSClientProtocol,
8
11
  ThreadKind,
@@ -67,12 +70,13 @@ class GiteaVCSClient(VCSClientProtocol):
67
70
  return []
68
71
 
69
72
  async def get_inline_comments(self) -> list[ReviewCommentSchema]:
70
- try:
71
- comments = await self.get_general_comments()
72
- return [comment for comment in comments if comment.file]
73
- except Exception as error:
74
- logger.exception(f"Failed to fetch inline comments for {self.pull_request_ref}: {error}")
75
- return []
73
+ comments = await self.get_general_comments()
74
+ if comments:
75
+ logger.warning(
76
+ f"Gitea API does not support inline comments — "
77
+ f"returning {len(comments)} general comments as fallback inline comments"
78
+ )
79
+ return comments
76
80
 
77
81
  async def create_general_comment(self, message: str) -> None:
78
82
  try:
@@ -90,25 +94,15 @@ class GiteaVCSClient(VCSClientProtocol):
90
94
  raise
91
95
 
92
96
  async def create_inline_comment(self, file: str, line: int, message: str) -> None:
93
- try:
94
- logger.info(f"Posting inline comment to {self.pull_request_ref} at {file}:{line}")
95
- request = GiteaCreateCommentRequestSchema(
96
- body=message,
97
- path=file,
98
- line=line,
99
- )
100
- await self.http_client.pr.create_comment(
101
- owner=self.owner,
102
- repo=self.repo,
103
- pull_number=self.pull_number,
104
- request=request,
105
- )
106
- logger.info(f"Created inline comment in {self.pull_request_ref} at {file}:{line}")
107
- except Exception as error:
108
- logger.exception(f"Failed to create inline comment in {self.pull_request_ref} at {file}:{line}: {error}")
109
- raise
97
+ fallback_message = f"[{file}:{line}] {message}"
98
+ logger.warning(
99
+ f"Gitea does not support inline comments. "
100
+ f"Falling back to general comment: {fallback_message}"
101
+ )
102
+ await self.create_general_comment(fallback_message)
110
103
 
111
104
  async def create_inline_reply(self, thread_id: int | str, message: str) -> None:
105
+ logger.warning("Gitea does not support threaded replies — posting new general comment instead")
112
106
  await self.create_general_comment(message)
113
107
 
114
108
  async def create_summary_reply(self, thread_id: int | str, message: str) -> None:
@@ -118,17 +112,15 @@ class GiteaVCSClient(VCSClientProtocol):
118
112
  async def get_inline_threads(self) -> list[ReviewThreadSchema]:
119
113
  try:
120
114
  comments = await self.get_inline_comments()
121
- threads = {comment.thread_id: [comment] for comment in comments}
122
-
123
115
  return [
124
116
  ReviewThreadSchema(
125
- id=thread_id,
117
+ id=comment.thread_id,
126
118
  kind=ThreadKind.INLINE,
127
- file=thread[0].file,
128
- line=thread[0].line,
129
- comments=thread,
119
+ file=comment.file,
120
+ line=comment.line,
121
+ comments=[comment],
130
122
  )
131
- for thread_id, thread in threads.items()
123
+ for comment in comments
132
124
  ]
133
125
  except Exception as error:
134
126
  logger.exception(f"Failed to build inline threads for {self.pull_request_ref}: {error}")
@@ -137,15 +129,14 @@ class GiteaVCSClient(VCSClientProtocol):
137
129
  async def get_general_threads(self) -> list[ReviewThreadSchema]:
138
130
  try:
139
131
  comments = await self.get_general_comments()
140
- threads = [
132
+ return [
141
133
  ReviewThreadSchema(
142
134
  id=comment.thread_id,
143
135
  kind=ThreadKind.SUMMARY,
144
- comments=[comment]
136
+ comments=[comment],
145
137
  )
146
138
  for comment in comments
147
139
  ]
148
- return threads
149
140
  except Exception as error:
150
141
  logger.exception(f"Failed to build general threads for {self.pull_request_ref}: {error}")
151
142
  return []
@@ -45,13 +45,11 @@ class FakeGiteaPullRequestsHTTPClient(GiteaPullRequestsHTTPClientProtocol):
45
45
  return GiteaGetPRFilesResponseSchema(
46
46
  root=[
47
47
  GiteaPRFileSchema(
48
- sha="abc",
49
48
  status="modified",
50
49
  filename="src/main.py",
51
50
  patch="@@ -1,2 +1,2 @@\n- old\n+ new",
52
51
  ),
53
52
  GiteaPRFileSchema(
54
- sha="def",
55
53
  status="added",
56
54
  filename="utils/helper.py",
57
55
  patch="+ print('Hello')",
@@ -2,6 +2,7 @@ from pathlib import Path
2
2
 
3
3
  import pytest
4
4
 
5
+ from ai_review.services.artifacts.service import ArtifactsService
5
6
  from ai_review.services.artifacts.types import ArtifactsServiceProtocol
6
7
 
7
8
 
@@ -49,3 +50,8 @@ class FakeArtifactsService(ArtifactsServiceProtocol):
49
50
  @pytest.fixture
50
51
  def fake_artifacts_service() -> FakeArtifactsService:
51
52
  return FakeArtifactsService()
53
+
54
+
55
+ @pytest.fixture
56
+ def artifacts_service() -> ArtifactsService:
57
+ return ArtifactsService()
@@ -0,0 +1,92 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ import aiofiles
5
+ import pytest
6
+
7
+ from ai_review.config import settings
8
+ from ai_review.libs.config.artifacts import ArtifactsConfig
9
+ from ai_review.services.artifacts.service import ArtifactsService
10
+
11
+
12
+ @pytest.mark.asyncio
13
+ async def test_save_llm_interaction_creates_file(
14
+ tmp_path: Path,
15
+ monkeypatch: pytest.MonkeyPatch,
16
+ artifacts_service: ArtifactsService
17
+ ):
18
+ """Checks that a JSON file is created with the correct name and content when LLM saving is enabled."""
19
+ monkeypatch.setattr(settings, "artifacts", ArtifactsConfig(llm_dir=tmp_path, llm_enabled=True))
20
+
21
+ artifact_id = await artifacts_service.save_llm_interaction(
22
+ prompt="Hello world",
23
+ prompt_system="system prompt",
24
+ response="model answer"
25
+ )
26
+
27
+ assert artifact_id is not None
28
+ artifact_path = tmp_path / f"{artifact_id}.json"
29
+ assert artifact_path.exists(), "Artifact file was not created"
30
+
31
+ async with aiofiles.open(artifact_path, "r", encoding="utf-8") as file:
32
+ content = await file.read()
33
+ data = json.loads(content)
34
+ assert data["id"] == artifact_id
35
+ assert data["prompt"] == "Hello world"
36
+ assert data["response"] == "model answer"
37
+ assert data["prompt_system"] == "system prompt"
38
+
39
+
40
+ @pytest.mark.asyncio
41
+ async def test_save_llm_interaction_disabled(
42
+ monkeypatch: pytest.MonkeyPatch,
43
+ artifacts_service: ArtifactsService
44
+ ):
45
+ """Checks that the method returns None and does not create a file if LLM saving is disabled."""
46
+ monkeypatch.setattr(settings, "artifacts", ArtifactsConfig(llm_enabled=False))
47
+
48
+ artifact_id = await artifacts_service.save_llm_interaction(
49
+ prompt="ignored",
50
+ prompt_system="ignored",
51
+ response="ignored"
52
+ )
53
+
54
+ assert artifact_id is None
55
+
56
+
57
+ @pytest.mark.asyncio
58
+ async def test_save_artifact_writes_file(tmp_path: Path, artifacts_service: ArtifactsService):
59
+ """Checks that save_artifact writes content to the given file path."""
60
+ file_path = tmp_path / "test.json"
61
+ content = '{"key": "value"}'
62
+
63
+ result = await artifacts_service.save_artifact(file=file_path, content=content, kind="test")
64
+
65
+ assert result == file_path
66
+ assert file_path.exists()
67
+ async with aiofiles.open(file_path, "r", encoding="utf-8") as f:
68
+ saved_content = await f.read()
69
+ assert saved_content == content
70
+
71
+
72
+ @pytest.mark.asyncio
73
+ async def test_save_artifact_handles_exception(
74
+ monkeypatch: pytest.MonkeyPatch,
75
+ artifacts_service: ArtifactsService
76
+ ):
77
+ """Checks that save_artifact gracefully returns None on write error."""
78
+
79
+ class BrokenAsyncFile:
80
+ async def __aenter__(self):
81
+ raise OSError("disk full")
82
+
83
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
84
+ return False
85
+
86
+ monkeypatch.setattr(
87
+ "ai_review.services.artifacts.service.aiofiles.open",
88
+ lambda *args, **kwargs: BrokenAsyncFile()
89
+ )
90
+
91
+ result = await artifacts_service.save_artifact(Path("/fake/path.json"), "data")
92
+ assert result is None
@@ -0,0 +1,28 @@
1
+ import hashlib
2
+ import re
3
+
4
+ import pytest
5
+
6
+ from ai_review.services.artifacts.tools import make_artifact_id
7
+
8
+
9
+ @pytest.mark.parametrize("text", ["hello", "some longer text", ""])
10
+ def test_make_artifact_id_format_and_sha(text: str):
11
+ """Checks that the function returns a valid artifact ID format and correct SHA prefix."""
12
+ artifact_id = make_artifact_id(text)
13
+
14
+ pattern = r"^\d{4}\.\d{2}\.\d{2}_\d{2}-\d{2}-\d{2}_[0-9a-f]{8}$"
15
+ assert re.match(pattern, artifact_id), f"Invalid format: {artifact_id}"
16
+
17
+ expected_sha = hashlib.sha1(text.encode()).hexdigest()[:8]
18
+ assert artifact_id.endswith(expected_sha)
19
+
20
+
21
+ def test_make_artifact_id_is_deterministic_for_same_input():
22
+ """Checks that the SHA part is deterministic (identical for the same input)."""
23
+ sha1 = hashlib.sha1("repeatable".encode()).hexdigest()[:8]
24
+ artifact_id1 = make_artifact_id("repeatable")
25
+ artifact_id2 = make_artifact_id("repeatable")
26
+
27
+ assert artifact_id1.split("_")[2] == sha1
28
+ assert artifact_id2.split("_")[2] == sha1
@@ -29,19 +29,20 @@ async def test_get_general_comments_returns_list(
29
29
  fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
30
30
  ):
31
31
  comments = await gitea_vcs_client.get_general_comments()
32
- assert all(isinstance(c, ReviewCommentSchema) for c in comments)
32
+ assert all(isinstance(comment, ReviewCommentSchema) for comment in comments)
33
33
  assert len(comments) > 0
34
34
 
35
35
 
36
36
  @pytest.mark.asyncio
37
37
  @pytest.mark.usefixtures("gitea_http_client_config")
38
- async def test_get_inline_comments_filters_by_file(
38
+ async def test_get_inline_comments_returns_fallback_general_comments(
39
39
  gitea_vcs_client: GiteaVCSClient,
40
40
  fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
41
41
  ):
42
42
  comments = await gitea_vcs_client.get_inline_comments()
43
- assert all(c.file for c in comments)
44
- assert all(isinstance(c, ReviewCommentSchema) for c in comments)
43
+ assert isinstance(comments, list)
44
+ assert all(isinstance(comment, ReviewCommentSchema) for comment in comments)
45
+ assert len(comments) > 0
45
46
 
46
47
 
47
48
  @pytest.mark.asyncio
@@ -57,11 +58,11 @@ async def test_create_general_comment_posts_comment(
57
58
 
58
59
  @pytest.mark.asyncio
59
60
  @pytest.mark.usefixtures("gitea_http_client_config")
60
- async def test_create_inline_comment_posts_comment(
61
+ async def test_create_inline_comment_falls_back_to_general_comment(
61
62
  gitea_vcs_client: GiteaVCSClient,
62
63
  fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
63
64
  ):
64
- await gitea_vcs_client.create_inline_comment("src/main.py", 10, "Inline comment")
65
+ await gitea_vcs_client.create_inline_comment(file="src/main.py", line=10, message="Inline comment")
65
66
  calls = [name for name, _ in fake_gitea_pull_requests_http_client.calls]
66
67
  assert "create_comment" in calls
67
68
 
@@ -72,8 +73,8 @@ async def test_get_inline_threads_groups_by_comment(
72
73
  gitea_vcs_client: GiteaVCSClient,
73
74
  ):
74
75
  threads = await gitea_vcs_client.get_inline_threads()
75
- assert all(isinstance(t, ReviewThreadSchema) for t in threads)
76
- assert all(t.kind == ThreadKind.INLINE for t in threads)
76
+ assert all(isinstance(thread, ReviewThreadSchema) for thread in threads)
77
+ assert all(thread.kind == ThreadKind.INLINE for thread in threads)
77
78
 
78
79
 
79
80
  @pytest.mark.asyncio
@@ -82,5 +83,5 @@ async def test_get_general_threads_wraps_comments(
82
83
  gitea_vcs_client: GiteaVCSClient,
83
84
  ):
84
85
  threads = await gitea_vcs_client.get_general_threads()
85
- assert all(isinstance(t, ReviewThreadSchema) for t in threads)
86
- assert all(t.kind == ThreadKind.SUMMARY for t in threads)
86
+ assert all(isinstance(thread, ReviewThreadSchema) for thread in threads)
87
+ assert all(thread.kind == ThreadKind.SUMMARY for thread in threads)
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "xai-review"
7
7
  readme = { file = "README.md", content-type = "text/markdown" }
8
- version = "0.31.0"
8
+ version = "0.33.0"
9
9
  license = { text = "Apache-2.0" }
10
10
  authors = [
11
11
  { name = "Nikita Filonov", email = "nikita.filonov@example.com" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.31.0
3
+ Version: 0.33.0
4
4
  Summary: AI-powered code review tool
5
5
  Author-email: Nikita Filonov <nikita.filonov@example.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
@@ -220,7 +220,7 @@ jobs:
220
220
  with:
221
221
  fetch-depth: 0
222
222
 
223
- - uses: Nikita-Filonov/ai-review@v0.31.0
223
+ - uses: Nikita-Filonov/ai-review@v0.33.0
224
224
  with:
225
225
  review-command: ${{ inputs.review-command }}
226
226
  env:
@@ -311,6 +311,9 @@ ai_review/tests/suites/libs/llm/test_output_json_parser.py
311
311
  ai_review/tests/suites/libs/template/__init__.py
312
312
  ai_review/tests/suites/libs/template/test_render.py
313
313
  ai_review/tests/suites/services/__init__.py
314
+ ai_review/tests/suites/services/artifacts/__init__.py
315
+ ai_review/tests/suites/services/artifacts/test_service.py
316
+ ai_review/tests/suites/services/artifacts/test_tools.py
314
317
  ai_review/tests/suites/services/cost/__init__.py
315
318
  ai_review/tests/suites/services/cost/test_schema.py
316
319
  ai_review/tests/suites/services/cost/test_service.py
File without changes