xai-review 0.37.0__tar.gz → 0.39.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 (442) hide show
  1. {xai_review-0.37.0/xai_review.egg-info → xai_review-0.39.0}/PKG-INFO +9 -7
  2. {xai_review-0.37.0 → xai_review-0.39.0}/README.md +5 -3
  3. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/client.py +6 -6
  4. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/client.py +52 -40
  5. xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/comments.py +59 -0
  6. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/schema/files.py +7 -7
  7. xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/pull_request.py +34 -0
  8. xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/user.py +7 -0
  9. xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/types.py +44 -0
  10. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/tools.py +1 -1
  11. xai_review-0.39.0/ai_review/clients/bitbucket_server/client.py +32 -0
  12. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/client.py +163 -0
  13. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/changes.py +36 -0
  14. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/comments.py +55 -0
  15. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/pull_request.py +48 -0
  16. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/user.py +13 -0
  17. xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/types.py +44 -0
  18. xai_review-0.39.0/ai_review/clients/bitbucket_server/tools.py +6 -0
  19. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/base.py +23 -6
  20. xai_review-0.37.0/ai_review/libs/config/vcs/bitbucket.py → xai_review-0.39.0/ai_review/libs/config/vcs/bitbucket_cloud.py +2 -2
  21. xai_review-0.39.0/ai_review/libs/config/vcs/bitbucket_server.py +13 -0
  22. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/constants/vcs_provider.py +2 -1
  23. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/client.py +1 -1
  24. {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/adapter.py +4 -4
  25. {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/client.py +26 -23
  26. xai_review-0.39.0/ai_review/services/vcs/bitbucket_server/adapter.py +27 -0
  27. xai_review-0.39.0/ai_review/services/vcs/bitbucket_server/client.py +263 -0
  28. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/factory.py +6 -3
  29. xai_review-0.39.0/ai_review/tests/fixtures/clients/bitbucket_cloud.py +207 -0
  30. xai_review-0.39.0/ai_review/tests/fixtures/clients/bitbucket_server.py +265 -0
  31. xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud/test_client.py +14 -0
  32. xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud/test_tools.py +31 -0
  33. xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server/test_client.py +14 -0
  34. xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server/test_tools.py +38 -0
  35. xai_review-0.39.0/ai_review/tests/suites/services/vcs/__init__.py +0 -0
  36. xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud/__init__.py +0 -0
  37. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud}/test_adapter.py +24 -24
  38. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud}/test_client.py +51 -51
  39. xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/__init__.py +0 -0
  40. xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/test_adapter.py +115 -0
  41. xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/test_client.py +201 -0
  42. xai_review-0.39.0/ai_review/tests/suites/services/vcs/gitea/__init__.py +0 -0
  43. xai_review-0.39.0/ai_review/tests/suites/services/vcs/github/__init__.py +0 -0
  44. xai_review-0.39.0/ai_review/tests/suites/services/vcs/gitlab/__init__.py +0 -0
  45. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/test_factory.py +11 -4
  46. {xai_review-0.37.0 → xai_review-0.39.0}/pyproject.toml +6 -4
  47. {xai_review-0.37.0 → xai_review-0.39.0/xai_review.egg-info}/PKG-INFO +9 -7
  48. {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/SOURCES.txt +44 -22
  49. xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/comments.py +0 -63
  50. xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/pull_request.py +0 -34
  51. xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/user.py +0 -7
  52. xai_review-0.37.0/ai_review/clients/bitbucket/pr/types.py +0 -44
  53. xai_review-0.37.0/ai_review/tests/fixtures/clients/bitbucket.py +0 -204
  54. xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket/test_client.py +0 -14
  55. xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket/test_tools.py +0 -31
  56. {xai_review-0.37.0 → xai_review-0.39.0}/LICENSE +0 -0
  57. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/__init__.py +0 -0
  58. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/__init__.py +0 -0
  59. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/__init__.py +0 -0
  60. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_context_review.py +0 -0
  61. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_inline_reply_review.py +0 -0
  62. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_inline_review.py +0 -0
  63. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_review.py +0 -0
  64. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_summary_reply_review.py +0 -0
  65. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_summary_review.py +0 -0
  66. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/main.py +0 -0
  67. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/__init__.py +0 -0
  68. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/__init__.py +0 -0
  69. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/__init__.py +0 -0
  70. {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/schema/__init__.py +0 -0
  71. {xai_review-0.37.0/ai_review/clients/claude → xai_review-0.39.0/ai_review/clients/bitbucket_server}/__init__.py +0 -0
  72. {xai_review-0.37.0/ai_review/clients/gemini → xai_review-0.39.0/ai_review/clients/bitbucket_server/pr}/__init__.py +0 -0
  73. {xai_review-0.37.0/ai_review/clients/gitea → xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema}/__init__.py +0 -0
  74. {xai_review-0.37.0/ai_review/clients/gitea/pr → xai_review-0.39.0/ai_review/clients/claude}/__init__.py +0 -0
  75. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/client.py +0 -0
  76. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/schema.py +0 -0
  77. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/types.py +0 -0
  78. {xai_review-0.37.0/ai_review/clients/gitea/pr/schema → xai_review-0.39.0/ai_review/clients/gemini}/__init__.py +0 -0
  79. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/client.py +0 -0
  80. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/schema.py +0 -0
  81. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/types.py +0 -0
  82. {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/__init__.py +0 -0
  83. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/client.py +0 -0
  84. {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/pr/__init__.py +0 -0
  85. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/client.py +0 -0
  86. {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/pr/schema/__init__.py +0 -0
  87. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/comments.py +0 -0
  88. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/files.py +0 -0
  89. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/pull_request.py +0 -0
  90. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/user.py +0 -0
  91. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/types.py +0 -0
  92. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/tools.py +0 -0
  93. {xai_review-0.37.0/ai_review/clients/gitlab → xai_review-0.39.0/ai_review/clients/github}/__init__.py +0 -0
  94. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/client.py +0 -0
  95. {xai_review-0.37.0/ai_review/clients/gitlab/mr → xai_review-0.39.0/ai_review/clients/github/pr}/__init__.py +0 -0
  96. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/client.py +0 -0
  97. {xai_review-0.37.0/ai_review/clients/gitlab/mr → xai_review-0.39.0/ai_review/clients/github/pr}/schema/__init__.py +0 -0
  98. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/comments.py +0 -0
  99. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/files.py +0 -0
  100. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/pull_request.py +0 -0
  101. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/reviews.py +0 -0
  102. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/user.py +0 -0
  103. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/types.py +0 -0
  104. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/tools.py +0 -0
  105. {xai_review-0.37.0/ai_review/clients/ollama → xai_review-0.39.0/ai_review/clients/gitlab}/__init__.py +0 -0
  106. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/client.py +0 -0
  107. {xai_review-0.37.0/ai_review/clients/openai → xai_review-0.39.0/ai_review/clients/gitlab/mr}/__init__.py +0 -0
  108. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/client.py +0 -0
  109. {xai_review-0.37.0/ai_review/clients/openai/v1 → xai_review-0.39.0/ai_review/clients/gitlab/mr/schema}/__init__.py +0 -0
  110. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/changes.py +0 -0
  111. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/discussions.py +0 -0
  112. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/notes.py +0 -0
  113. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/position.py +0 -0
  114. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/user.py +0 -0
  115. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/types.py +0 -0
  116. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/tools.py +0 -0
  117. {xai_review-0.37.0/ai_review/clients/openai/v2 → xai_review-0.39.0/ai_review/clients/ollama}/__init__.py +0 -0
  118. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/client.py +0 -0
  119. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/schema.py +0 -0
  120. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/types.py +0 -0
  121. {xai_review-0.37.0/ai_review/clients/openrouter → xai_review-0.39.0/ai_review/clients/openai}/__init__.py +0 -0
  122. {xai_review-0.37.0/ai_review/libs → xai_review-0.39.0/ai_review/clients/openai/v1}/__init__.py +0 -0
  123. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/client.py +0 -0
  124. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/schema.py +0 -0
  125. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/types.py +0 -0
  126. {xai_review-0.37.0/ai_review/libs/asynchronous → xai_review-0.39.0/ai_review/clients/openai/v2}/__init__.py +0 -0
  127. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/client.py +0 -0
  128. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/schema.py +0 -0
  129. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/types.py +0 -0
  130. {xai_review-0.37.0/ai_review/libs/config → xai_review-0.39.0/ai_review/clients/openrouter}/__init__.py +0 -0
  131. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/client.py +0 -0
  132. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/schema.py +0 -0
  133. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/types.py +0 -0
  134. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/config.py +0 -0
  135. {xai_review-0.37.0/ai_review/libs/config/llm → xai_review-0.39.0/ai_review/libs}/__init__.py +0 -0
  136. {xai_review-0.37.0/ai_review/libs/config/vcs → xai_review-0.39.0/ai_review/libs/asynchronous}/__init__.py +0 -0
  137. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/asynchronous/gather.py +0 -0
  138. {xai_review-0.37.0/ai_review/libs/constants → xai_review-0.39.0/ai_review/libs/config}/__init__.py +0 -0
  139. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/artifacts.py +0 -0
  140. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/base.py +0 -0
  141. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/core.py +0 -0
  142. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/http.py +0 -0
  143. {xai_review-0.37.0/ai_review/libs/diff → xai_review-0.39.0/ai_review/libs/config/llm}/__init__.py +0 -0
  144. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/base.py +0 -0
  145. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/claude.py +0 -0
  146. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/gemini.py +0 -0
  147. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/meta.py +0 -0
  148. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/ollama.py +0 -0
  149. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/openai.py +0 -0
  150. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/openrouter.py +0 -0
  151. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/logger.py +0 -0
  152. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/prompt.py +0 -0
  153. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/review.py +0 -0
  154. {xai_review-0.37.0/ai_review/libs/http → xai_review-0.39.0/ai_review/libs/config/vcs}/__init__.py +0 -0
  155. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/gitea.py +0 -0
  156. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/github.py +0 -0
  157. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/gitlab.py +0 -0
  158. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/pagination.py +0 -0
  159. {xai_review-0.37.0/ai_review/libs/http/event_hooks → xai_review-0.39.0/ai_review/libs/constants}/__init__.py +0 -0
  160. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/constants/llm_provider.py +0 -0
  161. {xai_review-0.37.0/ai_review/libs/http/transports → xai_review-0.39.0/ai_review/libs/diff}/__init__.py +0 -0
  162. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/models.py +0 -0
  163. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/parser.py +0 -0
  164. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/tools.py +0 -0
  165. {xai_review-0.37.0/ai_review/libs/llm → xai_review-0.39.0/ai_review/libs/http}/__init__.py +0 -0
  166. {xai_review-0.37.0/ai_review/libs/template → xai_review-0.39.0/ai_review/libs/http/event_hooks}/__init__.py +0 -0
  167. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/event_hooks/base.py +0 -0
  168. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/event_hooks/logger.py +0 -0
  169. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/handlers.py +0 -0
  170. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/paginate.py +0 -0
  171. {xai_review-0.37.0/ai_review/prompts → xai_review-0.39.0/ai_review/libs/http/transports}/__init__.py +0 -0
  172. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/transports/retry.py +0 -0
  173. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/json.py +0 -0
  174. {xai_review-0.37.0/ai_review/resources → xai_review-0.39.0/ai_review/libs/llm}/__init__.py +0 -0
  175. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/llm/output_json_parser.py +0 -0
  176. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/logger.py +0 -0
  177. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/resources.py +0 -0
  178. {xai_review-0.37.0/ai_review/services → xai_review-0.39.0/ai_review/libs/template}/__init__.py +0 -0
  179. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/template/render.py +0 -0
  180. {xai_review-0.37.0/ai_review/services/artifacts → xai_review-0.39.0/ai_review/prompts}/__init__.py +0 -0
  181. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_context.md +0 -0
  182. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_inline.md +0 -0
  183. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_inline_reply.md +0 -0
  184. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_summary.md +0 -0
  185. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_summary_reply.md +0 -0
  186. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_context.md +0 -0
  187. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_inline.md +0 -0
  188. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_inline_reply.md +0 -0
  189. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_summary.md +0 -0
  190. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_summary_reply.md +0 -0
  191. {xai_review-0.37.0/ai_review/services/cost → xai_review-0.39.0/ai_review/resources}/__init__.py +0 -0
  192. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/resources/pricing.yaml +0 -0
  193. {xai_review-0.37.0/ai_review/services/diff → xai_review-0.39.0/ai_review/services}/__init__.py +0 -0
  194. {xai_review-0.37.0/ai_review/services/git → xai_review-0.39.0/ai_review/services/artifacts}/__init__.py +0 -0
  195. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/schema.py +0 -0
  196. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/service.py +0 -0
  197. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/tools.py +0 -0
  198. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/types.py +0 -0
  199. {xai_review-0.37.0/ai_review/services/llm → xai_review-0.39.0/ai_review/services/cost}/__init__.py +0 -0
  200. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/schema.py +0 -0
  201. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/service.py +0 -0
  202. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/types.py +0 -0
  203. {xai_review-0.37.0/ai_review/services/llm/claude → xai_review-0.39.0/ai_review/services/diff}/__init__.py +0 -0
  204. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/renderers.py +0 -0
  205. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/schema.py +0 -0
  206. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/service.py +0 -0
  207. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/tools.py +0 -0
  208. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/types.py +0 -0
  209. {xai_review-0.37.0/ai_review/services/llm/gemini → xai_review-0.39.0/ai_review/services/git}/__init__.py +0 -0
  210. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/git/service.py +0 -0
  211. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/git/types.py +0 -0
  212. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/__init__.py +0 -0
  213. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/constants.py +0 -0
  214. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/service.py +0 -0
  215. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/types.py +0 -0
  216. {xai_review-0.37.0/ai_review/services/llm/ollama → xai_review-0.39.0/ai_review/services/llm}/__init__.py +0 -0
  217. {xai_review-0.37.0/ai_review/services/llm/openai → xai_review-0.39.0/ai_review/services/llm/claude}/__init__.py +0 -0
  218. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/claude/client.py +0 -0
  219. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/factory.py +0 -0
  220. {xai_review-0.37.0/ai_review/services/llm/openrouter → xai_review-0.39.0/ai_review/services/llm/gemini}/__init__.py +0 -0
  221. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/gemini/client.py +0 -0
  222. {xai_review-0.37.0/ai_review/services/prompt → xai_review-0.39.0/ai_review/services/llm/ollama}/__init__.py +0 -0
  223. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/ollama/client.py +0 -0
  224. {xai_review-0.37.0/ai_review/services/review → xai_review-0.39.0/ai_review/services/llm/openai}/__init__.py +0 -0
  225. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/openai/client.py +0 -0
  226. {xai_review-0.37.0/ai_review/services/review/gateway → xai_review-0.39.0/ai_review/services/llm/openrouter}/__init__.py +0 -0
  227. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/openrouter/client.py +0 -0
  228. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/types.py +0 -0
  229. {xai_review-0.37.0/ai_review/services/review/internal → xai_review-0.39.0/ai_review/services/prompt}/__init__.py +0 -0
  230. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/adapter.py +0 -0
  231. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/schema.py +0 -0
  232. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/service.py +0 -0
  233. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/tools.py +0 -0
  234. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/types.py +0 -0
  235. {xai_review-0.37.0/ai_review/services/review/internal/inline → xai_review-0.39.0/ai_review/services/review}/__init__.py +0 -0
  236. {xai_review-0.37.0/ai_review/services/review/internal/inline_reply → xai_review-0.39.0/ai_review/services/review/gateway}/__init__.py +0 -0
  237. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_comment_gateway.py +0 -0
  238. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
  239. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_llm_gateway.py +0 -0
  240. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/types.py +0 -0
  241. {xai_review-0.37.0/ai_review/services/review/internal/policy → xai_review-0.39.0/ai_review/services/review/internal}/__init__.py +0 -0
  242. {xai_review-0.37.0/ai_review/services/review/internal/summary → xai_review-0.39.0/ai_review/services/review/internal/inline}/__init__.py +0 -0
  243. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/schema.py +0 -0
  244. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/service.py +0 -0
  245. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/types.py +0 -0
  246. {xai_review-0.37.0/ai_review/services/review/internal/summary_reply → xai_review-0.39.0/ai_review/services/review/internal/inline_reply}/__init__.py +0 -0
  247. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/schema.py +0 -0
  248. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/service.py +0 -0
  249. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/types.py +0 -0
  250. {xai_review-0.37.0/ai_review/services/review/runner → xai_review-0.39.0/ai_review/services/review/internal/policy}/__init__.py +0 -0
  251. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/policy/service.py +0 -0
  252. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/policy/types.py +0 -0
  253. {xai_review-0.37.0/ai_review/services/vcs → xai_review-0.39.0/ai_review/services/review/internal/summary}/__init__.py +0 -0
  254. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/schema.py +0 -0
  255. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/service.py +0 -0
  256. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/types.py +0 -0
  257. {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/review/internal/summary_reply}/__init__.py +0 -0
  258. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/schema.py +0 -0
  259. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/service.py +0 -0
  260. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/types.py +0 -0
  261. {xai_review-0.37.0/ai_review/services/vcs/gitea → xai_review-0.39.0/ai_review/services/review/runner}/__init__.py +0 -0
  262. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/context.py +0 -0
  263. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/inline.py +0 -0
  264. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/inline_reply.py +0 -0
  265. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/summary.py +0 -0
  266. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/summary_reply.py +0 -0
  267. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/types.py +0 -0
  268. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/service.py +0 -0
  269. {xai_review-0.37.0/ai_review/services/vcs/github → xai_review-0.39.0/ai_review/services/vcs}/__init__.py +0 -0
  270. {xai_review-0.37.0/ai_review/services/vcs/gitlab → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/__init__.py +0 -0
  271. {xai_review-0.37.0/ai_review/tests → xai_review-0.39.0/ai_review/services/vcs/bitbucket_server}/__init__.py +0 -0
  272. {xai_review-0.37.0/ai_review/tests/fixtures → xai_review-0.39.0/ai_review/services/vcs/gitea}/__init__.py +0 -0
  273. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitea/adapter.py +0 -0
  274. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitea/client.py +0 -0
  275. {xai_review-0.37.0/ai_review/tests/fixtures/clients → xai_review-0.39.0/ai_review/services/vcs/github}/__init__.py +0 -0
  276. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/github/adapter.py +0 -0
  277. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/github/client.py +0 -0
  278. {xai_review-0.37.0/ai_review/tests/fixtures/libs → xai_review-0.39.0/ai_review/services/vcs/gitlab}/__init__.py +0 -0
  279. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitlab/adapter.py +0 -0
  280. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitlab/client.py +0 -0
  281. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/types.py +0 -0
  282. {xai_review-0.37.0/ai_review/tests/fixtures/libs/llm → xai_review-0.39.0/ai_review/tests}/__init__.py +0 -0
  283. {xai_review-0.37.0/ai_review/tests/fixtures/services → xai_review-0.39.0/ai_review/tests/fixtures}/__init__.py +0 -0
  284. {xai_review-0.37.0/ai_review/tests/fixtures/services/review → xai_review-0.39.0/ai_review/tests/fixtures/clients}/__init__.py +0 -0
  285. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/claude.py +0 -0
  286. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gemini.py +0 -0
  287. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gitea.py +0 -0
  288. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/github.py +0 -0
  289. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gitlab.py +0 -0
  290. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/ollama.py +0 -0
  291. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/openai.py +0 -0
  292. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/openrouter.py +0 -0
  293. {xai_review-0.37.0/ai_review/tests/fixtures/services/review/gateway → xai_review-0.39.0/ai_review/tests/fixtures/libs}/__init__.py +0 -0
  294. {xai_review-0.37.0/ai_review/tests/fixtures/services/review/internal → xai_review-0.39.0/ai_review/tests/fixtures/libs/llm}/__init__.py +0 -0
  295. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/libs/llm/output_json_parser.py +0 -0
  296. {xai_review-0.37.0/ai_review/tests/fixtures/services/review/runner → xai_review-0.39.0/ai_review/tests/fixtures/services}/__init__.py +0 -0
  297. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/artifacts.py +0 -0
  298. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/cost.py +0 -0
  299. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/diff.py +0 -0
  300. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/git.py +0 -0
  301. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/hook.py +0 -0
  302. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/llm.py +0 -0
  303. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/prompt.py +0 -0
  304. {xai_review-0.37.0/ai_review/tests/suites → xai_review-0.39.0/ai_review/tests/fixtures/services/review}/__init__.py +0 -0
  305. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/base.py +0 -0
  306. {xai_review-0.37.0/ai_review/tests/suites/cli → xai_review-0.39.0/ai_review/tests/fixtures/services/review/gateway}/__init__.py +0 -0
  307. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py +0 -0
  308. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
  309. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py +0 -0
  310. {xai_review-0.37.0/ai_review/tests/suites/clients → xai_review-0.39.0/ai_review/tests/fixtures/services/review/internal}/__init__.py +0 -0
  311. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/inline.py +0 -0
  312. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/inline_reply.py +0 -0
  313. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/policy.py +0 -0
  314. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/summary.py +0 -0
  315. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/summary_reply.py +0 -0
  316. {xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket → xai_review-0.39.0/ai_review/tests/fixtures/services/review/runner}/__init__.py +0 -0
  317. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/context.py +0 -0
  318. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/inline.py +0 -0
  319. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/inline_reply.py +0 -0
  320. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/summary.py +0 -0
  321. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/summary_reply.py +0 -0
  322. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/vcs.py +0 -0
  323. {xai_review-0.37.0/ai_review/tests/suites/clients/claude → xai_review-0.39.0/ai_review/tests/suites}/__init__.py +0 -0
  324. {xai_review-0.37.0/ai_review/tests/suites/clients/gemini → xai_review-0.39.0/ai_review/tests/suites/cli}/__init__.py +0 -0
  325. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/cli/test_main.py +0 -0
  326. {xai_review-0.37.0/ai_review/tests/suites/clients/gitea → xai_review-0.39.0/ai_review/tests/suites/clients}/__init__.py +0 -0
  327. {xai_review-0.37.0/ai_review/tests/suites/clients/github → xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud}/__init__.py +0 -0
  328. {xai_review-0.37.0/ai_review/tests/suites/clients/gitlab → xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server}/__init__.py +0 -0
  329. {xai_review-0.37.0/ai_review/tests/suites/clients/ollama → xai_review-0.39.0/ai_review/tests/suites/clients/claude}/__init__.py +0 -0
  330. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/claude/test_client.py +0 -0
  331. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/claude/test_schema.py +0 -0
  332. {xai_review-0.37.0/ai_review/tests/suites/clients/openai → xai_review-0.39.0/ai_review/tests/suites/clients/gemini}/__init__.py +0 -0
  333. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gemini/test_client.py +0 -0
  334. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gemini/test_schema.py +0 -0
  335. {xai_review-0.37.0/ai_review/tests/suites/clients/openai/v1 → xai_review-0.39.0/ai_review/tests/suites/clients/gitea}/__init__.py +0 -0
  336. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitea/test_client.py +0 -0
  337. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitea/test_tools.py +0 -0
  338. {xai_review-0.37.0/ai_review/tests/suites/clients/openai/v2 → xai_review-0.39.0/ai_review/tests/suites/clients/github}/__init__.py +0 -0
  339. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/github/test_client.py +0 -0
  340. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/github/test_tools.py +0 -0
  341. {xai_review-0.37.0/ai_review/tests/suites/clients/openrouter → xai_review-0.39.0/ai_review/tests/suites/clients/gitlab}/__init__.py +0 -0
  342. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitlab/test_client.py +0 -0
  343. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitlab/test_tools.py +0 -0
  344. {xai_review-0.37.0/ai_review/tests/suites/libs → xai_review-0.39.0/ai_review/tests/suites/clients/ollama}/__init__.py +0 -0
  345. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/ollama/test_client.py +0 -0
  346. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/ollama/test_schema.py +0 -0
  347. {xai_review-0.37.0/ai_review/tests/suites/libs/asynchronous → xai_review-0.39.0/ai_review/tests/suites/clients/openai}/__init__.py +0 -0
  348. {xai_review-0.37.0/ai_review/tests/suites/libs/config → xai_review-0.39.0/ai_review/tests/suites/clients/openai/v1}/__init__.py +0 -0
  349. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v1/test_client.py +0 -0
  350. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v1/test_schema.py +0 -0
  351. {xai_review-0.37.0/ai_review/tests/suites/libs/config/llm → xai_review-0.39.0/ai_review/tests/suites/clients/openai/v2}/__init__.py +0 -0
  352. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v2/test_client.py +0 -0
  353. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v2/test_schema.py +0 -0
  354. {xai_review-0.37.0/ai_review/tests/suites/libs/diff → xai_review-0.39.0/ai_review/tests/suites/clients/openrouter}/__init__.py +0 -0
  355. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openrouter/test_client.py +0 -0
  356. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openrouter/test_schema.py +0 -0
  357. {xai_review-0.37.0/ai_review/tests/suites/libs/http → xai_review-0.39.0/ai_review/tests/suites/libs}/__init__.py +0 -0
  358. {xai_review-0.37.0/ai_review/tests/suites/libs/llm → xai_review-0.39.0/ai_review/tests/suites/libs/asynchronous}/__init__.py +0 -0
  359. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/asynchronous/test_gather.py +0 -0
  360. {xai_review-0.37.0/ai_review/tests/suites/libs/template → xai_review-0.39.0/ai_review/tests/suites/libs/config}/__init__.py +0 -0
  361. {xai_review-0.37.0/ai_review/tests/suites/services → xai_review-0.39.0/ai_review/tests/suites/libs/config/llm}/__init__.py +0 -0
  362. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/config/llm/test_openai.py +0 -0
  363. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/config/test_prompt.py +0 -0
  364. {xai_review-0.37.0/ai_review/tests/suites/services/artifacts → xai_review-0.39.0/ai_review/tests/suites/libs/diff}/__init__.py +0 -0
  365. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_models.py +0 -0
  366. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_parser.py +0 -0
  367. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_tools.py +0 -0
  368. {xai_review-0.37.0/ai_review/tests/suites/services/cost → xai_review-0.39.0/ai_review/tests/suites/libs/http}/__init__.py +0 -0
  369. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/http/test_paginate.py +0 -0
  370. {xai_review-0.37.0/ai_review/tests/suites/services/diff → xai_review-0.39.0/ai_review/tests/suites/libs/llm}/__init__.py +0 -0
  371. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/llm/test_output_json_parser.py +0 -0
  372. {xai_review-0.37.0/ai_review/tests/suites/services/hook → xai_review-0.39.0/ai_review/tests/suites/libs/template}/__init__.py +0 -0
  373. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/template/test_render.py +0 -0
  374. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/test_json.py +0 -0
  375. {xai_review-0.37.0/ai_review/tests/suites/services/llm → xai_review-0.39.0/ai_review/tests/suites/services}/__init__.py +0 -0
  376. {xai_review-0.37.0/ai_review/tests/suites/services/llm/claude → xai_review-0.39.0/ai_review/tests/suites/services/artifacts}/__init__.py +0 -0
  377. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/artifacts/test_service.py +0 -0
  378. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/artifacts/test_tools.py +0 -0
  379. {xai_review-0.37.0/ai_review/tests/suites/services/llm/gemini → xai_review-0.39.0/ai_review/tests/suites/services/cost}/__init__.py +0 -0
  380. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/cost/test_schema.py +0 -0
  381. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/cost/test_service.py +0 -0
  382. {xai_review-0.37.0/ai_review/tests/suites/services/llm/ollama → xai_review-0.39.0/ai_review/tests/suites/services/diff}/__init__.py +0 -0
  383. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_renderers.py +0 -0
  384. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_service.py +0 -0
  385. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_tools.py +0 -0
  386. {xai_review-0.37.0/ai_review/tests/suites/services/llm/openai → xai_review-0.39.0/ai_review/tests/suites/services/hook}/__init__.py +0 -0
  387. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/hook/test_service.py +0 -0
  388. {xai_review-0.37.0/ai_review/tests/suites/services/llm/openrouter → xai_review-0.39.0/ai_review/tests/suites/services/llm}/__init__.py +0 -0
  389. {xai_review-0.37.0/ai_review/tests/suites/services/prompt → xai_review-0.39.0/ai_review/tests/suites/services/llm/claude}/__init__.py +0 -0
  390. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/claude/test_client.py +0 -0
  391. {xai_review-0.37.0/ai_review/tests/suites/services/review → xai_review-0.39.0/ai_review/tests/suites/services/llm/gemini}/__init__.py +0 -0
  392. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/gemini/test_client.py +0 -0
  393. {xai_review-0.37.0/ai_review/tests/suites/services/review/gateway → xai_review-0.39.0/ai_review/tests/suites/services/llm/ollama}/__init__.py +0 -0
  394. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/ollama/test_client.py +0 -0
  395. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal → xai_review-0.39.0/ai_review/tests/suites/services/llm/openai}/__init__.py +0 -0
  396. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/openai/test_client.py +0 -0
  397. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/inline → xai_review-0.39.0/ai_review/tests/suites/services/llm/openrouter}/__init__.py +0 -0
  398. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/openrouter/test_client.py +0 -0
  399. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/test_factory.py +0 -0
  400. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/inline_reply → xai_review-0.39.0/ai_review/tests/suites/services/prompt}/__init__.py +0 -0
  401. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_adapter.py +0 -0
  402. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_schema.py +0 -0
  403. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_service.py +0 -0
  404. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_tools.py +0 -0
  405. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/policy → xai_review-0.39.0/ai_review/tests/suites/services/review}/__init__.py +0 -0
  406. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/summary → xai_review-0.39.0/ai_review/tests/suites/services/review/gateway}/__init__.py +0 -0
  407. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py +0 -0
  408. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +0 -0
  409. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py +0 -0
  410. {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/summary_reply → xai_review-0.39.0/ai_review/tests/suites/services/review/internal}/__init__.py +0 -0
  411. {xai_review-0.37.0/ai_review/tests/suites/services/review/runner → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/inline}/__init__.py +0 -0
  412. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline/test_schema.py +0 -0
  413. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline/test_service.py +0 -0
  414. {xai_review-0.37.0/ai_review/tests/suites/services/vcs → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/inline_reply}/__init__.py +0 -0
  415. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_schema.py +0 -0
  416. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_service.py +0 -0
  417. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/policy}/__init__.py +0 -0
  418. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/policy/test_service.py +0 -0
  419. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/gitea → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/summary}/__init__.py +0 -0
  420. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary/test_schema.py +0 -0
  421. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary/test_service.py +0 -0
  422. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/github → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/summary_reply}/__init__.py +0 -0
  423. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_schema.py +0 -0
  424. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_service.py +0 -0
  425. {xai_review-0.37.0/ai_review/tests/suites/services/vcs/gitlab → xai_review-0.39.0/ai_review/tests/suites/services/review/runner}/__init__.py +0 -0
  426. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_context.py +0 -0
  427. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_inline.py +0 -0
  428. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_inline_reply.py +0 -0
  429. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_summary.py +0 -0
  430. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_summary_reply.py +0 -0
  431. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/test_service.py +0 -0
  432. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitea/test_adapter.py +0 -0
  433. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitea/test_client.py +0 -0
  434. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/github/test_adapter.py +0 -0
  435. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/github/test_client.py +0 -0
  436. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitlab/test_adapter.py +0 -0
  437. {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitlab/test_client.py +0 -0
  438. {xai_review-0.37.0 → xai_review-0.39.0}/setup.cfg +0 -0
  439. {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/dependency_links.txt +0 -0
  440. {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/entry_points.txt +0 -0
  441. {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/requires.txt +0 -0
  442. {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/top_level.txt +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.37.0
4
- Summary: AI-powered code review tool for GitHub, GitLab, Bitbucket and Gitea — built with LLMs like OpenAI, Claude, Gemini, Ollama, and OpenRouter
5
- Author-email: Nikita Filonov <nikita.filonov@example.com>
3
+ Version: 0.39.0
4
+ Summary: AI-powered code review tool for GitHub, GitLab, Bitbucket Cloud, Bitbucket Server and Gitea — built with LLMs like OpenAI, Claude, Gemini, Ollama, and OpenRouter
5
+ Author-email: Nikita Filonov <nikita.filonov@gmail.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
7
7
  License: Apache License
8
8
  Version 2.0, January 2004
@@ -208,7 +208,7 @@ License: Apache License
208
208
  Project-URL: Issues, https://github.com/Nikita-Filonov/ai-review/issues
209
209
  Project-URL: Homepage, https://github.com/Nikita-Filonov/ai-review
210
210
  Project-URL: Repository, https://github.com/Nikita-Filonov/ai-review
211
- Keywords: ai,code review,llm,openai,claude,gemini,ollama,openrouter,ci/cd,gitlab,github,gitea,bitbucket
211
+ Keywords: ai,code review,llm,openai,claude,gemini,ollama,openrouter,ci/cd,gitlab,github,gitea,bitbucket,bitbucket cloud,bitbucket server
212
212
  Classifier: Programming Language :: Python :: 3
213
213
  Classifier: Programming Language :: Python :: 3.11
214
214
  Classifier: Programming Language :: Python :: 3.12
@@ -268,7 +268,8 @@ improve code quality, enforce consistency, and speed up the review process.
268
268
 
269
269
  - **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, **Ollama**, or **OpenRouter**, and
270
270
  switch anytime.
271
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**.
271
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**,
272
+ and **Gitea**.
272
273
  - **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
273
274
  - **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
274
275
  summary discussions.
@@ -379,7 +380,8 @@ Key things you can customize:
379
380
 
380
381
  - **LLM provider** — OpenAI, Gemini, Claude, Ollama, or OpenRouter
381
382
  - **Model settings** — model name, temperature, max tokens
382
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**
383
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**, and
384
+ **Gitea**
383
385
  - **Review policy** — which files to include/exclude, review modes
384
386
  - **Prompts** — inline/context/summary prompt templates
385
387
 
@@ -421,7 +423,7 @@ jobs:
421
423
  with:
422
424
  fetch-depth: 0
423
425
 
424
- - uses: Nikita-Filonov/ai-review@v0.37.0
426
+ - uses: Nikita-Filonov/ai-review@v0.39.0
425
427
  with:
426
428
  review-command: ${{ inputs.review-command }}
427
429
  env:
@@ -34,7 +34,8 @@ improve code quality, enforce consistency, and speed up the review process.
34
34
 
35
35
  - **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, **Ollama**, or **OpenRouter**, and
36
36
  switch anytime.
37
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**.
37
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**,
38
+ and **Gitea**.
38
39
  - **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
39
40
  - **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
40
41
  summary discussions.
@@ -145,7 +146,8 @@ Key things you can customize:
145
146
 
146
147
  - **LLM provider** — OpenAI, Gemini, Claude, Ollama, or OpenRouter
147
148
  - **Model settings** — model name, temperature, max tokens
148
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**
149
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**, and
150
+ **Gitea**
149
151
  - **Review policy** — which files to include/exclude, review modes
150
152
  - **Prompts** — inline/context/summary prompt templates
151
153
 
@@ -187,7 +189,7 @@ jobs:
187
189
  with:
188
190
  fetch-depth: 0
189
191
 
190
- - uses: Nikita-Filonov/ai-review@v0.37.0
192
+ - uses: Nikita-Filonov/ai-review@v0.39.0
191
193
  with:
192
194
  review-command: ${{ inputs.review-command }}
193
195
  env:
@@ -1,19 +1,19 @@
1
- from ai_review.clients.bitbucket.pr.client import BitbucketPullRequestsHTTPClient
2
1
  from httpx import AsyncClient, AsyncHTTPTransport
3
2
 
3
+ from ai_review.clients.bitbucket_cloud.pr.client import BitbucketCloudPullRequestsHTTPClient
4
4
  from ai_review.config import settings
5
5
  from ai_review.libs.http.event_hooks.logger import LoggerEventHook
6
6
  from ai_review.libs.http.transports.retry import RetryTransport
7
7
  from ai_review.libs.logger import get_logger
8
8
 
9
9
 
10
- class BitbucketHTTPClient:
10
+ class BitbucketCloudHTTPClient:
11
11
  def __init__(self, client: AsyncClient):
12
- self.pr = BitbucketPullRequestsHTTPClient(client)
12
+ self.pr = BitbucketCloudPullRequestsHTTPClient(client)
13
13
 
14
14
 
15
- def get_bitbucket_http_client() -> BitbucketHTTPClient:
16
- logger = get_logger("BITBUCKET_HTTP_CLIENT")
15
+ def get_bitbucket_cloud_http_client() -> BitbucketCloudHTTPClient:
16
+ logger = get_logger("BITBUCKET_CLOUD_HTTP_CLIENT")
17
17
  logger_event_hook = LoggerEventHook(logger=logger)
18
18
  retry_transport = RetryTransport(logger=logger, transport=AsyncHTTPTransport())
19
19
 
@@ -29,4 +29,4 @@ def get_bitbucket_http_client() -> BitbucketHTTPClient:
29
29
  }
30
30
  )
31
31
 
32
- return BitbucketHTTPClient(client=client)
32
+ return BitbucketCloudHTTPClient(client=client)
@@ -1,72 +1,84 @@
1
1
  from httpx import Response, QueryParams
2
2
 
3
- from ai_review.clients.bitbucket.pr.schema.comments import (
4
- BitbucketPRCommentSchema,
5
- BitbucketGetPRCommentsQuerySchema,
6
- BitbucketGetPRCommentsResponseSchema,
7
- BitbucketCreatePRCommentRequestSchema,
8
- BitbucketCreatePRCommentResponseSchema,
3
+ from ai_review.clients.bitbucket_cloud.pr.schema.comments import (
4
+ BitbucketCloudPRCommentSchema,
5
+ BitbucketCloudGetPRCommentsQuerySchema,
6
+ BitbucketCloudGetPRCommentsResponseSchema,
7
+ BitbucketCloudCreatePRCommentRequestSchema,
8
+ BitbucketCloudCreatePRCommentResponseSchema,
9
9
  )
10
- from ai_review.clients.bitbucket.pr.schema.files import (
11
- BitbucketPRFileSchema,
12
- BitbucketGetPRFilesQuerySchema,
13
- BitbucketGetPRFilesResponseSchema,
10
+ from ai_review.clients.bitbucket_cloud.pr.schema.files import (
11
+ BitbucketCloudPRFileSchema,
12
+ BitbucketCloudGetPRFilesQuerySchema,
13
+ BitbucketCloudGetPRFilesResponseSchema,
14
14
  )
15
- from ai_review.clients.bitbucket.pr.schema.pull_request import BitbucketGetPRResponseSchema
16
- from ai_review.clients.bitbucket.pr.types import BitbucketPullRequestsHTTPClientProtocol
17
- from ai_review.clients.bitbucket.tools import bitbucket_has_next_page
15
+ from ai_review.clients.bitbucket_cloud.pr.schema.pull_request import BitbucketCloudGetPRResponseSchema
16
+ from ai_review.clients.bitbucket_cloud.pr.types import BitbucketCloudPullRequestsHTTPClientProtocol
17
+ from ai_review.clients.bitbucket_cloud.tools import bitbucket_cloud_has_next_page
18
18
  from ai_review.config import settings
19
19
  from ai_review.libs.http.client import HTTPClient
20
20
  from ai_review.libs.http.handlers import handle_http_error, HTTPClientError
21
21
  from ai_review.libs.http.paginate import paginate
22
22
 
23
23
 
24
- class BitbucketPullRequestsHTTPClientError(HTTPClientError):
24
+ class BitbucketCloudPullRequestsHTTPClientError(HTTPClientError):
25
25
  pass
26
26
 
27
27
 
28
- class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClientProtocol):
29
- @handle_http_error(client="BitbucketPullRequestsHTTPClient", exception=BitbucketPullRequestsHTTPClientError)
28
+ class BitbucketCloudPullRequestsHTTPClient(HTTPClient, BitbucketCloudPullRequestsHTTPClientProtocol):
29
+ @handle_http_error(
30
+ client="BitbucketCloudPullRequestsHTTPClient",
31
+ exception=BitbucketCloudPullRequestsHTTPClientError
32
+ )
30
33
  async def get_pull_request_api(self, workspace: str, repo_slug: str, pull_request_id: str) -> Response:
31
34
  return await self.get(f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}")
32
35
 
33
- @handle_http_error(client="BitbucketPullRequestsHTTPClient", exception=BitbucketPullRequestsHTTPClientError)
36
+ @handle_http_error(
37
+ client="BitbucketCloudPullRequestsHTTPClient",
38
+ exception=BitbucketCloudPullRequestsHTTPClientError
39
+ )
34
40
  async def get_diffstat_api(
35
41
  self,
36
42
  workspace: str,
37
43
  repo_slug: str,
38
44
  pull_request_id: str,
39
- query: BitbucketGetPRFilesQuerySchema,
45
+ query: BitbucketCloudGetPRFilesQuerySchema,
40
46
  ) -> Response:
41
47
  return await self.get(
42
48
  f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/diffstat",
43
49
  query=QueryParams(**query.model_dump(by_alias=True)),
44
50
  )
45
51
 
46
- @handle_http_error(client="BitbucketPullRequestsHTTPClient", exception=BitbucketPullRequestsHTTPClientError)
52
+ @handle_http_error(
53
+ client="BitbucketCloudPullRequestsHTTPClient",
54
+ exception=BitbucketCloudPullRequestsHTTPClientError
55
+ )
47
56
  async def get_comments_api(
48
57
  self,
49
58
  workspace: str,
50
59
  repo_slug: str,
51
60
  pull_request_id: str,
52
- query: BitbucketGetPRCommentsQuerySchema,
61
+ query: BitbucketCloudGetPRCommentsQuerySchema,
53
62
  ) -> Response:
54
63
  return await self.get(
55
64
  f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments",
56
65
  query=QueryParams(**query.model_dump(by_alias=True)),
57
66
  )
58
67
 
59
- @handle_http_error(client="BitbucketPullRequestsHTTPClient", exception=BitbucketPullRequestsHTTPClientError)
68
+ @handle_http_error(
69
+ client="BitbucketCloudPullRequestsHTTPClient",
70
+ exception=BitbucketCloudPullRequestsHTTPClientError
71
+ )
60
72
  async def create_comment_api(
61
73
  self,
62
74
  workspace: str,
63
75
  repo_slug: str,
64
76
  pull_request_id: str,
65
- request: BitbucketCreatePRCommentRequestSchema,
77
+ request: BitbucketCloudCreatePRCommentRequestSchema,
66
78
  ) -> Response:
67
79
  return await self.post(
68
80
  f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments",
69
- json=request.model_dump(by_alias=True),
81
+ json=request.model_dump(by_alias=True, exclude_none=True),
70
82
  )
71
83
 
72
84
  async def get_pull_request(
@@ -74,31 +86,31 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
74
86
  workspace: str,
75
87
  repo_slug: str,
76
88
  pull_request_id: str
77
- ) -> BitbucketGetPRResponseSchema:
89
+ ) -> BitbucketCloudGetPRResponseSchema:
78
90
  resp = await self.get_pull_request_api(workspace, repo_slug, pull_request_id)
79
- return BitbucketGetPRResponseSchema.model_validate_json(resp.text)
91
+ return BitbucketCloudGetPRResponseSchema.model_validate_json(resp.text)
80
92
 
81
93
  async def get_files(
82
94
  self,
83
95
  workspace: str,
84
96
  repo_slug: str,
85
97
  pull_request_id: str
86
- ) -> BitbucketGetPRFilesResponseSchema:
98
+ ) -> BitbucketCloudGetPRFilesResponseSchema:
87
99
  async def fetch_page(page: int) -> Response:
88
- query = BitbucketGetPRFilesQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
100
+ query = BitbucketCloudGetPRFilesQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
89
101
  return await self.get_diffstat_api(workspace, repo_slug, pull_request_id, query)
90
102
 
91
- def extract_items(response: Response) -> list[BitbucketPRFileSchema]:
92
- result = BitbucketGetPRFilesResponseSchema.model_validate_json(response.text)
103
+ def extract_items(response: Response) -> list[BitbucketCloudPRFileSchema]:
104
+ result = BitbucketCloudGetPRFilesResponseSchema.model_validate_json(response.text)
93
105
  return result.values
94
106
 
95
107
  items = await paginate(
96
108
  max_pages=settings.vcs.pagination.max_pages,
97
109
  fetch_page=fetch_page,
98
110
  extract_items=extract_items,
99
- has_next_page=bitbucket_has_next_page
111
+ has_next_page=bitbucket_cloud_has_next_page
100
112
  )
101
- return BitbucketGetPRFilesResponseSchema(
113
+ return BitbucketCloudGetPRFilesResponseSchema(
102
114
  size=len(items),
103
115
  values=items,
104
116
  page_len=settings.vcs.pagination.per_page
@@ -109,22 +121,22 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
109
121
  workspace: str,
110
122
  repo_slug: str,
111
123
  pull_request_id: str
112
- ) -> BitbucketGetPRCommentsResponseSchema:
124
+ ) -> BitbucketCloudGetPRCommentsResponseSchema:
113
125
  async def fetch_page(page: int) -> Response:
114
- query = BitbucketGetPRCommentsQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
126
+ query = BitbucketCloudGetPRCommentsQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
115
127
  return await self.get_comments_api(workspace, repo_slug, pull_request_id, query)
116
128
 
117
- def extract_items(response: Response) -> list[BitbucketPRCommentSchema]:
118
- result = BitbucketGetPRCommentsResponseSchema.model_validate_json(response.text)
129
+ def extract_items(response: Response) -> list[BitbucketCloudPRCommentSchema]:
130
+ result = BitbucketCloudGetPRCommentsResponseSchema.model_validate_json(response.text)
119
131
  return result.values
120
132
 
121
133
  items = await paginate(
122
134
  max_pages=settings.vcs.pagination.max_pages,
123
135
  fetch_page=fetch_page,
124
136
  extract_items=extract_items,
125
- has_next_page=bitbucket_has_next_page
137
+ has_next_page=bitbucket_cloud_has_next_page
126
138
  )
127
- return BitbucketGetPRCommentsResponseSchema(
139
+ return BitbucketCloudGetPRCommentsResponseSchema(
128
140
  size=len(items),
129
141
  values=items,
130
142
  page_len=settings.vcs.pagination.per_page
@@ -135,7 +147,7 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
135
147
  workspace: str,
136
148
  repo_slug: str,
137
149
  pull_request_id: str,
138
- request: BitbucketCreatePRCommentRequestSchema
139
- ) -> BitbucketCreatePRCommentResponseSchema:
150
+ request: BitbucketCloudCreatePRCommentRequestSchema
151
+ ) -> BitbucketCloudCreatePRCommentResponseSchema:
140
152
  response = await self.create_comment_api(workspace, repo_slug, pull_request_id, request)
141
- return BitbucketCreatePRCommentResponseSchema.model_validate_json(response.text)
153
+ return BitbucketCloudCreatePRCommentResponseSchema.model_validate_json(response.text)
@@ -0,0 +1,59 @@
1
+ from pydantic import BaseModel, Field, ConfigDict
2
+
3
+ from ai_review.clients.bitbucket_cloud.pr.schema.user import BitbucketCloudUserSchema
4
+
5
+
6
+ class BitbucketCloudCommentContentSchema(BaseModel):
7
+ raw: str
8
+ html: str | None = None
9
+ markup: str | None = None
10
+
11
+
12
+ class BitbucketCloudCommentInlineSchema(BaseModel):
13
+ model_config = ConfigDict(populate_by_name=True)
14
+
15
+ path: str
16
+ to_line: int | None = Field(alias="to", default=None)
17
+ from_line: int | None = Field(alias="from", default=None)
18
+
19
+
20
+ class BitbucketCloudCommentParentSchema(BaseModel):
21
+ id: int
22
+
23
+
24
+ class BitbucketCloudPRCommentSchema(BaseModel):
25
+ id: int
26
+ user: BitbucketCloudUserSchema | None = None
27
+ parent: BitbucketCloudCommentParentSchema | None = None
28
+ inline: BitbucketCloudCommentInlineSchema | None = None
29
+ content: BitbucketCloudCommentContentSchema
30
+
31
+
32
+ class BitbucketCloudGetPRCommentsQuerySchema(BaseModel):
33
+ model_config = ConfigDict(populate_by_name=True)
34
+
35
+ page: int = 1
36
+ page_len: int = Field(alias="pagelen", default=100)
37
+
38
+
39
+ class BitbucketCloudGetPRCommentsResponseSchema(BaseModel):
40
+ model_config = ConfigDict(populate_by_name=True)
41
+
42
+ size: int
43
+ page: int | None = None
44
+ next: str | None = None
45
+ values: list[BitbucketCloudPRCommentSchema]
46
+ page_len: int = Field(alias="pagelen")
47
+
48
+
49
+ class BitbucketCloudCreatePRCommentRequestSchema(BaseModel):
50
+ parent: BitbucketCloudCommentParentSchema | None = None
51
+ inline: BitbucketCloudCommentInlineSchema | None = None
52
+ content: BitbucketCloudCommentContentSchema
53
+
54
+
55
+ class BitbucketCloudCreatePRCommentResponseSchema(BaseModel):
56
+ id: int
57
+ parent: BitbucketCloudCommentParentSchema | None = None
58
+ inline: BitbucketCloudCommentInlineSchema | None = None
59
+ content: BitbucketCloudCommentContentSchema
@@ -1,30 +1,30 @@
1
1
  from pydantic import BaseModel, Field, ConfigDict
2
2
 
3
3
 
4
- class BitbucketPRFilePathSchema(BaseModel):
4
+ class BitbucketCloudPRFilePathSchema(BaseModel):
5
5
  path: str
6
6
 
7
7
 
8
- class BitbucketPRFileSchema(BaseModel):
9
- new: BitbucketPRFilePathSchema | None = None
10
- old: BitbucketPRFilePathSchema | None = None
8
+ class BitbucketCloudPRFileSchema(BaseModel):
9
+ new: BitbucketCloudPRFilePathSchema | None = None
10
+ old: BitbucketCloudPRFilePathSchema | None = None
11
11
  status: str
12
12
  lines_added: int
13
13
  lines_removed: int
14
14
 
15
15
 
16
- class BitbucketGetPRFilesQuerySchema(BaseModel):
16
+ class BitbucketCloudGetPRFilesQuerySchema(BaseModel):
17
17
  model_config = ConfigDict(populate_by_name=True)
18
18
 
19
19
  page: int = 1
20
20
  page_len: int = Field(alias="pagelen", default=100)
21
21
 
22
22
 
23
- class BitbucketGetPRFilesResponseSchema(BaseModel):
23
+ class BitbucketCloudGetPRFilesResponseSchema(BaseModel):
24
24
  model_config = ConfigDict(populate_by_name=True)
25
25
 
26
26
  size: int
27
27
  page: int | None = None
28
28
  next: str | None = None
29
- values: list[BitbucketPRFileSchema]
29
+ values: list[BitbucketCloudPRFileSchema]
30
30
  page_len: int = Field(alias="pagelen")
@@ -0,0 +1,34 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from ai_review.clients.bitbucket_cloud.pr.schema.user import BitbucketCloudUserSchema
4
+
5
+
6
+ class BitbucketCloudBranchSchema(BaseModel):
7
+ name: str
8
+
9
+
10
+ class BitbucketCloudCommitSchema(BaseModel):
11
+ hash: str
12
+
13
+
14
+ class BitbucketCloudRepositorySchema(BaseModel):
15
+ uuid: str
16
+ full_name: str
17
+
18
+
19
+ class BitbucketCloudPRLocationSchema(BaseModel):
20
+ branch: BitbucketCloudBranchSchema
21
+ commit: BitbucketCloudCommitSchema
22
+ repository: BitbucketCloudRepositorySchema
23
+
24
+
25
+ class BitbucketCloudGetPRResponseSchema(BaseModel):
26
+ id: int
27
+ title: str
28
+ description: str | None = None
29
+ state: str
30
+ author: BitbucketCloudUserSchema
31
+ source: BitbucketCloudPRLocationSchema
32
+ destination: BitbucketCloudPRLocationSchema
33
+ reviewers: list[BitbucketCloudUserSchema] = Field(default_factory=list)
34
+ participants: list[BitbucketCloudUserSchema] = Field(default_factory=list)
@@ -0,0 +1,7 @@
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class BitbucketCloudUserSchema(BaseModel):
5
+ uuid: str | None = None
6
+ nickname: str | None = None
7
+ display_name: str | None = None
@@ -0,0 +1,44 @@
1
+ from typing import Protocol
2
+
3
+ from ai_review.clients.bitbucket_cloud.pr.schema.comments import (
4
+ BitbucketCloudGetPRCommentsResponseSchema,
5
+ BitbucketCloudCreatePRCommentRequestSchema,
6
+ BitbucketCloudCreatePRCommentResponseSchema,
7
+ )
8
+ from ai_review.clients.bitbucket_cloud.pr.schema.files import BitbucketCloudGetPRFilesResponseSchema
9
+ from ai_review.clients.bitbucket_cloud.pr.schema.pull_request import BitbucketCloudGetPRResponseSchema
10
+
11
+
12
+ class BitbucketCloudPullRequestsHTTPClientProtocol(Protocol):
13
+ async def get_pull_request(
14
+ self,
15
+ workspace: str,
16
+ repo_slug: str,
17
+ pull_request_id: str
18
+ ) -> BitbucketCloudGetPRResponseSchema:
19
+ ...
20
+
21
+ async def get_files(
22
+ self,
23
+ workspace: str,
24
+ repo_slug: str,
25
+ pull_request_id: str
26
+ ) -> BitbucketCloudGetPRFilesResponseSchema:
27
+ ...
28
+
29
+ async def get_comments(
30
+ self,
31
+ workspace: str,
32
+ repo_slug: str,
33
+ pull_request_id: str
34
+ ) -> BitbucketCloudGetPRCommentsResponseSchema:
35
+ ...
36
+
37
+ async def create_comment(
38
+ self,
39
+ workspace: str,
40
+ repo_slug: str,
41
+ pull_request_id: str,
42
+ request: BitbucketCloudCreatePRCommentRequestSchema,
43
+ ) -> BitbucketCloudCreatePRCommentResponseSchema:
44
+ ...
@@ -1,6 +1,6 @@
1
1
  from httpx import Response
2
2
 
3
3
 
4
- def bitbucket_has_next_page(response: Response) -> bool:
4
+ def bitbucket_cloud_has_next_page(response: Response) -> bool:
5
5
  data = response.json()
6
6
  return bool(data.get("next"))
@@ -0,0 +1,32 @@
1
+ from ai_review.clients.bitbucket_server.pr.client import BitbucketServerPullRequestsHTTPClient
2
+ from httpx import AsyncClient, AsyncHTTPTransport
3
+
4
+ from ai_review.config import settings
5
+ from ai_review.libs.http.event_hooks.logger import LoggerEventHook
6
+ from ai_review.libs.http.transports.retry import RetryTransport
7
+ from ai_review.libs.logger import get_logger
8
+
9
+
10
+ class BitbucketServerHTTPClient:
11
+ def __init__(self, client: AsyncClient):
12
+ self.pr = BitbucketServerPullRequestsHTTPClient(client)
13
+
14
+
15
+ def get_bitbucket_server_http_client() -> BitbucketServerHTTPClient:
16
+ logger = get_logger("BITBUCKET_SERVER_HTTP_CLIENT")
17
+ logger_event_hook = LoggerEventHook(logger=logger)
18
+ retry_transport = RetryTransport(logger=logger, transport=AsyncHTTPTransport())
19
+
20
+ client = AsyncClient(
21
+ verify=settings.vcs.http_client.verify,
22
+ timeout=settings.vcs.http_client.timeout,
23
+ headers={"Authorization": f"Basic {settings.vcs.http_client.api_token_value}"},
24
+ base_url=settings.vcs.http_client.api_url_value,
25
+ transport=retry_transport,
26
+ event_hooks={
27
+ "request": [logger_event_hook.request],
28
+ "response": [logger_event_hook.response],
29
+ },
30
+ )
31
+
32
+ return BitbucketServerHTTPClient(client=client)