@gitkraken/core-gitlens 0.5.109 → 0.5.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/dist/git/cache.d.ts +111 -6
  3. package/dist/git/cache.d.ts.map +1 -1
  4. package/dist/git/cache.js +312 -43
  5. package/dist/git/cache.js.map +1 -1
  6. package/dist/git/context.d.ts +11 -0
  7. package/dist/git/context.d.ts.map +1 -1
  8. package/dist/git/context.js.map +1 -1
  9. package/dist/git/models/fileStatus.d.ts +1 -0
  10. package/dist/git/models/fileStatus.d.ts.map +1 -1
  11. package/dist/git/models/fileStatus.js +1 -0
  12. package/dist/git/models/fileStatus.js.map +1 -1
  13. package/dist/git/models/issue.d.ts +4 -0
  14. package/dist/git/models/issue.d.ts.map +1 -1
  15. package/dist/git/models/mergeConflicts.d.ts +2 -0
  16. package/dist/git/models/mergeConflicts.d.ts.map +1 -1
  17. package/dist/git/models/pullRequest.d.ts +119 -2
  18. package/dist/git/models/pullRequest.d.ts.map +1 -1
  19. package/dist/git/models/pullRequest.js +27 -1
  20. package/dist/git/models/pullRequest.js.map +1 -1
  21. package/dist/git/models/repository.d.ts +32 -5
  22. package/dist/git/models/repository.d.ts.map +1 -1
  23. package/dist/git/models/repository.js +58 -12
  24. package/dist/git/models/repository.js.map +1 -1
  25. package/dist/git/models/statusFile.d.ts.map +1 -1
  26. package/dist/git/models/statusFile.js +3 -0
  27. package/dist/git/models/statusFile.js.map +1 -1
  28. package/dist/git/providers/branches.d.ts +2 -0
  29. package/dist/git/providers/branches.d.ts.map +1 -1
  30. package/dist/git/providers/commits.d.ts +8 -0
  31. package/dist/git/providers/commits.d.ts.map +1 -1
  32. package/dist/git/providers/config.d.ts +19 -1
  33. package/dist/git/providers/config.d.ts.map +1 -1
  34. package/dist/git/providers/operations.d.ts +1 -0
  35. package/dist/git/providers/operations.d.ts.map +1 -1
  36. package/dist/git/providers/pausedOperations.d.ts +2 -0
  37. package/dist/git/providers/pausedOperations.d.ts.map +1 -1
  38. package/dist/git/providers/status.d.ts +1 -0
  39. package/dist/git/providers/status.d.ts.map +1 -1
  40. package/dist/git/utils/config.utils.d.ts +3 -0
  41. package/dist/git/utils/config.utils.d.ts.map +1 -0
  42. package/dist/git/utils/config.utils.js +8 -0
  43. package/dist/git/utils/config.utils.js.map +1 -0
  44. package/dist/git/utils/issue.utils.d.ts.map +1 -1
  45. package/dist/git/utils/issue.utils.js +2 -0
  46. package/dist/git/utils/issue.utils.js.map +1 -1
  47. package/dist/git/utils/pausedOperationStatus.utils.d.ts +14 -0
  48. package/dist/git/utils/pausedOperationStatus.utils.d.ts.map +1 -1
  49. package/dist/git/utils/pausedOperationStatus.utils.js +23 -0
  50. package/dist/git/utils/pausedOperationStatus.utils.js.map +1 -1
  51. package/dist/git/utils/pullRequest.utils.d.ts +24 -1
  52. package/dist/git/utils/pullRequest.utils.d.ts.map +1 -1
  53. package/dist/git/utils/pullRequest.utils.js +71 -0
  54. package/dist/git/utils/pullRequest.utils.js.map +1 -1
  55. package/dist/git/watching/changeEvent.d.ts +6 -1
  56. package/dist/git/watching/changeEvent.d.ts.map +1 -1
  57. package/dist/git/watching/classifyChange.d.ts.map +1 -1
  58. package/dist/git/watching/classifyChange.js +14 -1
  59. package/dist/git/watching/classifyChange.js.map +1 -1
  60. package/dist/git/watching/watchService.d.ts.map +1 -1
  61. package/dist/git/watching/watchService.js +18 -3
  62. package/dist/git/watching/watchService.js.map +1 -1
  63. package/dist/git/watching/watchSession.d.ts +8 -1
  64. package/dist/git/watching/watchSession.d.ts.map +1 -1
  65. package/dist/git/watching/watchSession.js +38 -6
  66. package/dist/git/watching/watchSession.js.map +1 -1
  67. package/dist/git/watching/watcherPatterns.d.ts +2 -2
  68. package/dist/git/watching/watcherPatterns.d.ts.map +1 -1
  69. package/dist/git/watching/watcherPatterns.js +1 -1
  70. package/dist/git/watching/watcherPatterns.js.map +1 -1
  71. package/dist/git-cli/exec/git.d.ts +1 -1
  72. package/dist/git-cli/exec/git.d.ts.map +1 -1
  73. package/dist/git-cli/exec/git.js +13 -3
  74. package/dist/git-cli/exec/git.js.map +1 -1
  75. package/dist/git-cli/providers/branches.d.ts +19 -0
  76. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  77. package/dist/git-cli/providers/branches.js +282 -78
  78. package/dist/git-cli/providers/branches.js.map +1 -1
  79. package/dist/git-cli/providers/commits.d.ts +4 -0
  80. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  81. package/dist/git-cli/providers/commits.js +84 -11
  82. package/dist/git-cli/providers/commits.js.map +1 -1
  83. package/dist/git-cli/providers/config.d.ts +42 -0
  84. package/dist/git-cli/providers/config.d.ts.map +1 -1
  85. package/dist/git-cli/providers/config.js +186 -5
  86. package/dist/git-cli/providers/config.js.map +1 -1
  87. package/dist/git-cli/providers/contributors.d.ts.map +1 -1
  88. package/dist/git-cli/providers/contributors.js +1 -1
  89. package/dist/git-cli/providers/contributors.js.map +1 -1
  90. package/dist/git-cli/providers/graph.d.ts +2 -2
  91. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  92. package/dist/git-cli/providers/graph.js +27 -9
  93. package/dist/git-cli/providers/graph.js.map +1 -1
  94. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  95. package/dist/git-cli/providers/operations.js +40 -12
  96. package/dist/git-cli/providers/operations.js.map +1 -1
  97. package/dist/git-cli/providers/pausedOperations.d.ts +5 -0
  98. package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
  99. package/dist/git-cli/providers/pausedOperations.js +87 -16
  100. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  101. package/dist/git-cli/providers/refs.d.ts +5 -3
  102. package/dist/git-cli/providers/refs.d.ts.map +1 -1
  103. package/dist/git-cli/providers/refs.js +33 -4
  104. package/dist/git-cli/providers/refs.js.map +1 -1
  105. package/dist/git-cli/providers/status.d.ts +1 -0
  106. package/dist/git-cli/providers/status.d.ts.map +1 -1
  107. package/dist/git-cli/providers/status.js +18 -3
  108. package/dist/git-cli/providers/status.js.map +1 -1
  109. package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
  110. package/dist/git-cli/providers/worktrees.js +4 -0
  111. package/dist/git-cli/providers/worktrees.js.map +1 -1
  112. package/dist/git-cli/service.d.ts.map +1 -1
  113. package/dist/git-cli/service.js.map +1 -1
  114. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +39 -1
  115. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -1
  116. package/dist/plus/agents/providers/claudeCodeProvider.js +978 -71
  117. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -1
  118. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +24 -2
  119. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -1
  120. package/dist/plus/agents/providers/claudeCodeTranscript.js +84 -9
  121. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
  122. package/dist/plus/agents/types.d.ts +37 -2
  123. package/dist/plus/agents/types.d.ts.map +1 -1
  124. package/dist/plus/agents/types.js +2 -0
  125. package/dist/plus/agents/types.js.map +1 -1
  126. package/dist/plus/ai/errors.d.ts +10 -0
  127. package/dist/plus/ai/errors.d.ts.map +1 -1
  128. package/dist/plus/ai/errors.js +29 -0
  129. package/dist/plus/ai/errors.js.map +1 -1
  130. package/dist/plus/ai/models/model.d.ts +4 -0
  131. package/dist/plus/ai/models/model.d.ts.map +1 -1
  132. package/dist/plus/ai/models/model.js +51 -6
  133. package/dist/plus/ai/models/model.js.map +1 -1
  134. package/dist/plus/ai/models/promptTemplates.d.ts +1 -1
  135. package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
  136. package/dist/plus/ai/models/provider.d.ts +60 -2
  137. package/dist/plus/ai/models/provider.d.ts.map +1 -1
  138. package/dist/plus/ai/prompts.d.ts +12 -0
  139. package/dist/plus/ai/prompts.d.ts.map +1 -1
  140. package/dist/plus/ai/prompts.js +177 -61
  141. package/dist/plus/ai/prompts.js.map +1 -1
  142. package/dist/plus/ai/providers/anthropicProvider.d.ts +10 -2
  143. package/dist/plus/ai/providers/anthropicProvider.d.ts.map +1 -1
  144. package/dist/plus/ai/providers/anthropicProvider.js +139 -46
  145. package/dist/plus/ai/providers/anthropicProvider.js.map +1 -1
  146. package/dist/plus/ai/providers/deepSeekProvider.d.ts +2 -0
  147. package/dist/plus/ai/providers/deepSeekProvider.d.ts.map +1 -1
  148. package/dist/plus/ai/providers/deepSeekProvider.js +10 -21
  149. package/dist/plus/ai/providers/deepSeekProvider.js.map +1 -1
  150. package/dist/plus/ai/providers/geminiProvider.d.ts +1 -0
  151. package/dist/plus/ai/providers/geminiProvider.d.ts.map +1 -1
  152. package/dist/plus/ai/providers/geminiProvider.js +19 -0
  153. package/dist/plus/ai/providers/geminiProvider.js.map +1 -1
  154. package/dist/plus/ai/providers/gitkrakenProvider.d.ts +5 -1
  155. package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
  156. package/dist/plus/ai/providers/gitkrakenProvider.js +118 -3
  157. package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
  158. package/dist/plus/ai/providers/huggingFaceProvider.d.ts +1 -0
  159. package/dist/plus/ai/providers/huggingFaceProvider.d.ts.map +1 -1
  160. package/dist/plus/ai/providers/huggingFaceProvider.js +5 -0
  161. package/dist/plus/ai/providers/huggingFaceProvider.js.map +1 -1
  162. package/dist/plus/ai/providers/mistralProvider.d.ts +3 -1
  163. package/dist/plus/ai/providers/mistralProvider.d.ts.map +1 -1
  164. package/dist/plus/ai/providers/mistralProvider.js +99 -19
  165. package/dist/plus/ai/providers/mistralProvider.js.map +1 -1
  166. package/dist/plus/ai/providers/ollamaProvider.d.ts +4 -3
  167. package/dist/plus/ai/providers/ollamaProvider.d.ts.map +1 -1
  168. package/dist/plus/ai/providers/ollamaProvider.js +38 -3
  169. package/dist/plus/ai/providers/ollamaProvider.js.map +1 -1
  170. package/dist/plus/ai/providers/openAICompatibleProvider.d.ts +1 -0
  171. package/dist/plus/ai/providers/openAICompatibleProvider.d.ts.map +1 -1
  172. package/dist/plus/ai/providers/openAICompatibleProvider.js +4 -0
  173. package/dist/plus/ai/providers/openAICompatibleProvider.js.map +1 -1
  174. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +154 -5
  175. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
  176. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +259 -10
  177. package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
  178. package/dist/plus/ai/providers/openRouterProvider.d.ts +4 -0
  179. package/dist/plus/ai/providers/openRouterProvider.d.ts.map +1 -1
  180. package/dist/plus/ai/providers/openRouterProvider.js +9 -0
  181. package/dist/plus/ai/providers/openRouterProvider.js.map +1 -1
  182. package/dist/plus/ai/providers/openaiProvider.d.ts +1 -0
  183. package/dist/plus/ai/providers/openaiProvider.d.ts.map +1 -1
  184. package/dist/plus/ai/providers/openaiProvider.js +1 -0
  185. package/dist/plus/ai/providers/openaiProvider.js.map +1 -1
  186. package/dist/plus/ai/providers/responseFormatCache.d.ts +8 -0
  187. package/dist/plus/ai/providers/responseFormatCache.d.ts.map +1 -0
  188. package/dist/plus/ai/providers/responseFormatCache.js +25 -0
  189. package/dist/plus/ai/providers/responseFormatCache.js.map +1 -0
  190. package/dist/plus/ai/providers/xaiProvider.d.ts +1 -0
  191. package/dist/plus/ai/providers/xaiProvider.d.ts.map +1 -1
  192. package/dist/plus/ai/providers/xaiProvider.js +10 -1
  193. package/dist/plus/ai/providers/xaiProvider.js.map +1 -1
  194. package/dist/plus/ai/utils/ai.utils.d.ts +3 -0
  195. package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
  196. package/dist/plus/ai/utils/ai.utils.js +13 -0
  197. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  198. package/dist/plus/ai/utils/results.utils.d.ts +16 -2
  199. package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
  200. package/dist/plus/ai/utils/results.utils.js +204 -28
  201. package/dist/plus/ai/utils/results.utils.js.map +1 -1
  202. package/dist/plus/git-github/api/github.d.ts +92 -4
  203. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  204. package/dist/plus/git-github/api/github.js +324 -20
  205. package/dist/plus/git-github/api/github.js.map +1 -1
  206. package/dist/plus/git-github/api/pullRequestSearchQuery.d.ts +27 -1
  207. package/dist/plus/git-github/api/pullRequestSearchQuery.d.ts.map +1 -1
  208. package/dist/plus/git-github/api/pullRequestSearchQuery.js +73 -6
  209. package/dist/plus/git-github/api/pullRequestSearchQuery.js.map +1 -1
  210. package/dist/plus/git-github/models.d.ts +33 -5
  211. package/dist/plus/git-github/models.d.ts.map +1 -1
  212. package/dist/plus/git-github/models.js +43 -4
  213. package/dist/plus/git-github/models.js.map +1 -1
  214. package/dist/plus/git-github/providers/github/status.d.ts +1 -0
  215. package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
  216. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  217. package/dist/plus/integrations/context.d.ts +4 -0
  218. package/dist/plus/integrations/context.d.ts.map +1 -1
  219. package/dist/plus/integrations/index.d.ts.map +1 -1
  220. package/dist/plus/integrations/index.js +2 -0
  221. package/dist/plus/integrations/index.js.map +1 -1
  222. package/dist/plus/integrations/integrationService.d.ts +16 -1
  223. package/dist/plus/integrations/integrationService.d.ts.map +1 -1
  224. package/dist/plus/integrations/integrationService.js +9 -1
  225. package/dist/plus/integrations/integrationService.js.map +1 -1
  226. package/dist/plus/integrations/manager.d.ts +45 -5
  227. package/dist/plus/integrations/manager.d.ts.map +1 -1
  228. package/dist/plus/integrations/models/gitHostIntegration.d.ts +18 -3
  229. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -1
  230. package/dist/plus/integrations/models/gitHostIntegration.js +30 -2
  231. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  232. package/dist/plus/integrations/models/integration.d.ts +4 -2
  233. package/dist/plus/integrations/models/integration.d.ts.map +1 -1
  234. package/dist/plus/integrations/models/integration.js +2 -2
  235. package/dist/plus/integrations/models/integration.js.map +1 -1
  236. package/dist/plus/integrations/providerFilters.d.ts +1 -1
  237. package/dist/plus/integrations/providerFilters.d.ts.map +1 -1
  238. package/dist/plus/integrations/providers/accounts.d.ts +6 -0
  239. package/dist/plus/integrations/providers/accounts.d.ts.map +1 -0
  240. package/dist/plus/integrations/providers/accounts.js +34 -0
  241. package/dist/plus/integrations/providers/accounts.js.map +1 -0
  242. package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -1
  243. package/dist/plus/integrations/providers/azure/models.js +3 -0
  244. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  245. package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -1
  246. package/dist/plus/integrations/providers/bitbucket/models.js +1 -0
  247. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
  248. package/dist/plus/integrations/providers/github.d.ts +23 -2
  249. package/dist/plus/integrations/providers/github.d.ts.map +1 -1
  250. package/dist/plus/integrations/providers/github.js +169 -138
  251. package/dist/plus/integrations/providers/github.js.map +1 -1
  252. package/dist/plus/integrations/providers/gitlab.d.ts +9 -0
  253. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -1
  254. package/dist/plus/integrations/providers/gitlab.js +23 -4
  255. package/dist/plus/integrations/providers/gitlab.js.map +1 -1
  256. package/dist/plus/integrations/providers/models.d.ts +14 -32
  257. package/dist/plus/integrations/providers/models.d.ts.map +1 -1
  258. package/dist/plus/integrations/providers/models.js +66 -109
  259. package/dist/plus/integrations/providers/models.js.map +1 -1
  260. package/dist/plus/integrations/providers/pullRequestReviews.d.ts +50 -0
  261. package/dist/plus/integrations/providers/pullRequestReviews.d.ts.map +1 -0
  262. package/dist/plus/integrations/providers/pullRequestReviews.js +99 -0
  263. package/dist/plus/integrations/providers/pullRequestReviews.js.map +1 -0
  264. package/dist/plus/integrations/reads/broaden.d.ts.map +1 -1
  265. package/dist/plus/integrations/reads/broaden.js +6 -1
  266. package/dist/plus/integrations/reads/broaden.js.map +1 -1
  267. package/dist/plus/integrations/reads/counts.d.ts +55 -0
  268. package/dist/plus/integrations/reads/counts.d.ts.map +1 -1
  269. package/dist/plus/integrations/reads/counts.js +146 -2
  270. package/dist/plus/integrations/reads/counts.js.map +1 -1
  271. package/dist/plus/integrations/reads/drains.d.ts +7 -1
  272. package/dist/plus/integrations/reads/drains.d.ts.map +1 -1
  273. package/dist/plus/integrations/reads/drains.js +20 -6
  274. package/dist/plus/integrations/reads/drains.js.map +1 -1
  275. package/dist/plus/integrations/reads/filters.d.ts.map +1 -1
  276. package/dist/plus/integrations/reads/filters.js +22 -0
  277. package/dist/plus/integrations/reads/filters.js.map +1 -1
  278. package/dist/plus/integrations/reads/hierarchy.d.ts.map +1 -1
  279. package/dist/plus/integrations/reads/hierarchy.js +3 -1
  280. package/dist/plus/integrations/reads/hierarchy.js.map +1 -1
  281. package/dist/plus/integrations/reads/issueTracker.d.ts.map +1 -1
  282. package/dist/plus/integrations/reads/issueTracker.js +8 -3
  283. package/dist/plus/integrations/reads/issueTracker.js.map +1 -1
  284. package/dist/plus/integrations/reads/issues.d.ts.map +1 -1
  285. package/dist/plus/integrations/reads/issues.js +9 -4
  286. package/dist/plus/integrations/reads/issues.js.map +1 -1
  287. package/dist/plus/integrations/reads/pullRequests.d.ts.map +1 -1
  288. package/dist/plus/integrations/reads/pullRequests.js +9 -4
  289. package/dist/plus/integrations/reads/pullRequests.js.map +1 -1
  290. package/dist/plus/integrations/reads/searchPullRequests.d.ts +4 -3
  291. package/dist/plus/integrations/reads/searchPullRequests.d.ts.map +1 -1
  292. package/dist/plus/integrations/reads/searchPullRequests.js +6 -4
  293. package/dist/plus/integrations/reads/searchPullRequests.js.map +1 -1
  294. package/dist/plus/integrations/reads/sweeps.js +1 -1
  295. package/dist/plus/integrations/reads/sweeps.js.map +1 -1
  296. package/dist/plus/integrations/reads/warnings.d.ts +2 -2
  297. package/dist/plus/integrations/reads/warnings.d.ts.map +1 -1
  298. package/dist/plus/integrations/reads/warnings.js +11 -2
  299. package/dist/plus/integrations/reads/warnings.js.map +1 -1
  300. package/dist/plus/integrations/results.d.ts +6 -1
  301. package/dist/plus/integrations/results.d.ts.map +1 -1
  302. package/dist/plus/integrations/results.js.map +1 -1
  303. package/dist/utils/env/browser/base64.d.ts +1 -1
  304. package/dist/utils/env/browser/base64.d.ts.map +1 -1
  305. package/dist/utils/env/node/base64.d.ts +1 -1
  306. package/dist/utils/env/node/base64.d.ts.map +1 -1
  307. package/dist/utils/env/node/base64.js +2 -0
  308. package/dist/utils/env/node/base64.js.map +1 -1
  309. package/dist/utils/keys/chord.d.ts +52 -0
  310. package/dist/utils/keys/chord.d.ts.map +1 -0
  311. package/dist/utils/keys/chord.js +135 -0
  312. package/dist/utils/keys/chord.js.map +1 -0
  313. package/dist/utils/keys/keybinding.d.ts +53 -0
  314. package/dist/utils/keys/keybinding.d.ts.map +1 -0
  315. package/dist/utils/keys/keybinding.js +58 -0
  316. package/dist/utils/keys/keybinding.js.map +1 -0
  317. package/dist/utils/path.d.ts +11 -0
  318. package/dist/utils/path.d.ts.map +1 -1
  319. package/dist/utils/path.js +13 -0
  320. package/dist/utils/path.js.map +1 -1
  321. package/docs/integrations.md +76 -10
  322. package/docs/kepler-read-api-parity.md +9 -0
  323. package/package.json +13 -5
  324. package/src/git/cache.ts +383 -47
  325. package/src/git/context.ts +11 -0
  326. package/src/git/models/fileStatus.ts +1 -0
  327. package/src/git/models/issue.ts +4 -0
  328. package/src/git/models/mergeConflicts.ts +3 -2
  329. package/src/git/models/pullRequest.ts +117 -1
  330. package/src/git/models/repository.ts +58 -17
  331. package/src/git/models/statusFile.ts +3 -0
  332. package/src/git/providers/branches.ts +6 -0
  333. package/src/git/providers/commits.ts +11 -0
  334. package/src/git/providers/config.ts +18 -0
  335. package/src/git/providers/operations.ts +1 -0
  336. package/src/git/providers/pausedOperations.ts +2 -0
  337. package/src/git/providers/status.ts +1 -0
  338. package/src/git/utils/config.utils.ts +8 -0
  339. package/src/git/utils/issue.utils.ts +2 -0
  340. package/src/git/utils/pausedOperationStatus.utils.ts +28 -0
  341. package/src/git/utils/pullRequest.utils.ts +86 -0
  342. package/src/git/watching/changeEvent.ts +6 -1
  343. package/src/git/watching/classifyChange.ts +15 -1
  344. package/src/git/watching/watchService.ts +20 -3
  345. package/src/git/watching/watchSession.ts +41 -6
  346. package/src/git/watching/watcherPatterns.ts +1 -1
  347. package/src/git-cli/exec/git.ts +13 -3
  348. package/src/git-cli/providers/branches.ts +384 -132
  349. package/src/git-cli/providers/commits.ts +106 -15
  350. package/src/git-cli/providers/config.ts +229 -8
  351. package/src/git-cli/providers/contributors.ts +5 -1
  352. package/src/git-cli/providers/graph.ts +26 -13
  353. package/src/git-cli/providers/operations.ts +45 -20
  354. package/src/git-cli/providers/pausedOperations.ts +109 -17
  355. package/src/git-cli/providers/refs.ts +33 -3
  356. package/src/git-cli/providers/status.ts +25 -4
  357. package/src/git-cli/providers/worktrees.ts +5 -0
  358. package/src/git-cli/service.ts +0 -1
  359. package/src/plus/agents/providers/claudeCodeProvider.ts +1130 -87
  360. package/src/plus/agents/providers/claudeCodeTranscript.ts +95 -9
  361. package/src/plus/agents/types.ts +46 -2
  362. package/src/plus/ai/errors.ts +30 -0
  363. package/src/plus/ai/models/model.ts +56 -6
  364. package/src/plus/ai/models/promptTemplates.ts +1 -1
  365. package/src/plus/ai/models/provider.ts +69 -2
  366. package/src/plus/ai/prompts.ts +186 -61
  367. package/src/plus/ai/providers/anthropicProvider.ts +155 -47
  368. package/src/plus/ai/providers/deepSeekProvider.ts +11 -21
  369. package/src/plus/ai/providers/geminiProvider.ts +19 -0
  370. package/src/plus/ai/providers/gitkrakenProvider.ts +126 -3
  371. package/src/plus/ai/providers/huggingFaceProvider.ts +6 -0
  372. package/src/plus/ai/providers/mistralProvider.ts +102 -19
  373. package/src/plus/ai/providers/ollamaProvider.ts +55 -4
  374. package/src/plus/ai/providers/openAICompatibleProvider.ts +5 -0
  375. package/src/plus/ai/providers/openAICompatibleProviderBase.ts +360 -17
  376. package/src/plus/ai/providers/openRouterProvider.ts +17 -0
  377. package/src/plus/ai/providers/openaiProvider.ts +1 -0
  378. package/src/plus/ai/providers/responseFormatCache.ts +39 -0
  379. package/src/plus/ai/providers/xaiProvider.ts +10 -1
  380. package/src/plus/ai/utils/ai.utils.ts +14 -0
  381. package/src/plus/ai/utils/results.utils.ts +255 -31
  382. package/src/plus/git-github/api/github.ts +467 -23
  383. package/src/plus/git-github/api/pullRequestSearchQuery.ts +81 -7
  384. package/src/plus/git-github/models.ts +77 -7
  385. package/src/plus/git-github/providers/github/status.ts +1 -0
  386. package/src/plus/integrations/context.ts +4 -0
  387. package/src/plus/integrations/index.ts +2 -0
  388. package/src/plus/integrations/integrationService.ts +25 -2
  389. package/src/plus/integrations/manager.ts +50 -5
  390. package/src/plus/integrations/models/gitHostIntegration.ts +54 -2
  391. package/src/plus/integrations/models/integration.ts +24 -13
  392. package/src/plus/integrations/providerFilters.ts +6 -1
  393. package/src/plus/integrations/providers/accounts.ts +38 -0
  394. package/src/plus/integrations/providers/azure/models.ts +3 -0
  395. package/src/plus/integrations/providers/bitbucket/models.ts +1 -0
  396. package/src/plus/integrations/providers/github.ts +218 -145
  397. package/src/plus/integrations/providers/gitlab.ts +30 -20
  398. package/src/plus/integrations/providers/models.ts +99 -127
  399. package/src/plus/integrations/providers/pullRequestReviews.ts +122 -0
  400. package/src/plus/integrations/reads/broaden.ts +6 -1
  401. package/src/plus/integrations/reads/counts.ts +273 -2
  402. package/src/plus/integrations/reads/drains.ts +19 -6
  403. package/src/plus/integrations/reads/filters.ts +22 -0
  404. package/src/plus/integrations/reads/hierarchy.ts +3 -1
  405. package/src/plus/integrations/reads/issueTracker.ts +9 -3
  406. package/src/plus/integrations/reads/issues.ts +9 -4
  407. package/src/plus/integrations/reads/pullRequests.ts +9 -4
  408. package/src/plus/integrations/reads/searchPullRequests.ts +12 -4
  409. package/src/plus/integrations/reads/sweeps.ts +1 -1
  410. package/src/plus/integrations/reads/warnings.ts +12 -1
  411. package/src/plus/integrations/results.ts +6 -1
  412. package/src/utils/env/browser/base64.ts +1 -1
  413. package/src/utils/env/node/base64.ts +3 -1
  414. package/src/utils/keys/chord.ts +184 -0
  415. package/src/utils/keys/keybinding.ts +116 -0
  416. package/src/utils/path.ts +14 -0
@@ -13,6 +13,7 @@ import type {
13
13
  CursorPageInput,
14
14
  EnterpriseOptions,
15
15
  GetRepoInput,
16
+ GitBuildStatus,
16
17
  GitBuildStatusState as GitBuildStatusStateType,
17
18
  GitHub,
18
19
  GitIssueState as GitIssueStateType,
@@ -41,26 +42,22 @@ import type {
41
42
  SetPullRequestInput,
42
43
  Trello,
43
44
  } from '@gitkraken/provider-apis';
44
- import entityIdentifiersModule from '@gitkraken/provider-apis/entity-identifiers';
45
- import providerUtilsModule from '@gitkraken/provider-apis/provider-utils';
45
+ import { EntityIdentifierUtils } from '@gitkraken/provider-apis/entity-identifiers';
46
+ import { GitProviderUtils } from '@gitkraken/provider-apis/provider-utils';
46
47
  import { githubSearchResultLimit } from '../../git-github/api/config.js';
47
48
  import type { Account as UserAccount } from '../../../git/models/author.js';
48
- import type { IssueMember, IssueProject, IssueShape, IssueStateFilter } from '../../../git/models/issue.js';
49
+ import type { IssueProject, IssueShape, IssueStateFilter } from '../../../git/models/issue.js';
49
50
  import { Issue, RepositoryAccessLevel } from '../../../git/models/issue.js';
50
51
  import type {
51
- PullRequestMember,
52
52
  PullRequestRef,
53
53
  PullRequestRefs,
54
54
  PullRequestRepositoryIdentityDescriptor,
55
- PullRequestReviewer,
56
55
  PullRequestState,
57
56
  PullRequestStateFilter,
58
57
  } from '../../../git/models/pullRequest.js';
59
58
  import {
60
59
  PullRequest,
61
60
  PullRequestMergeableState,
62
- PullRequestReviewDecision,
63
- PullRequestReviewState,
64
61
  PullRequestStatusCheckRollupState,
65
62
  } from '../../../git/models/pullRequest.js';
66
63
  import type { Provider, ProviderReference } from '../../../git/models/remoteProvider.js';
@@ -75,7 +72,12 @@ import {
75
72
  IssuesCloudHostIntegrationId,
76
73
  } from '../constants.js';
77
74
  import type { Integration, IntegrationType } from '../models/integration.js';
78
- import type { IssueSearchCapabilities, IssueSorting, PullRequestSearchCapabilities } from '../providerFilters.js';
75
+ import type {
76
+ IssueSearchCapabilities,
77
+ IssueSorting,
78
+ PullRequestSearchCapabilities,
79
+ PullRequestSorting,
80
+ } from '../providerFilters.js';
79
81
  import { IssueFilter, PullRequestFilter } from '../providerFilters.js';
80
82
 
81
83
  export { IssueFilter, PullRequestFilter } from '../providerFilters.js';
@@ -87,10 +89,13 @@ export type {
87
89
  IssueSorting,
88
90
  PullRequestSearchCapabilities,
89
91
  PullRequestSearchCriteria,
92
+ PullRequestSortField,
93
+ PullRequestSorting,
90
94
  } from '../providerFilters.js';
91
95
  import type { ProviderRepositoryShape } from '../results.js';
92
96
 
93
97
  export type { ProviderOrganization, ProviderRepositoryShape } from '../results.js';
98
+ import { fromProviderAccount, toProviderAccount } from './accounts.js';
94
99
  import {
95
100
  azureAccountWideIssueSorts,
96
101
  azureIssueSorts,
@@ -102,6 +107,15 @@ import {
102
107
  linearIssueSorts,
103
108
  trelloIssueSorts,
104
109
  } from './issueSorts.js';
110
+ import type { ProviderPullRequestReview, ProviderPullRequestReviews } from './pullRequestReviews.js';
111
+ import {
112
+ fromPullRequestReviewDecision,
113
+ providerPullRequestReviewStateDismissed,
114
+ toCompletedReviews,
115
+ toProviderReviewDecision,
116
+ toProviderReviews,
117
+ toReviewRequests,
118
+ } from './pullRequestReviews.js';
105
119
  import { getEntityIdentifierInput } from './utils.js';
106
120
 
107
121
  type GitBuildStatusState = GitBuildStatusStateType;
@@ -110,9 +124,6 @@ type GitPullRequestMergeableState = GitPullRequestMergeableStateType;
110
124
  type GitPullRequestReviewState = GitPullRequestReviewStateType;
111
125
  type GitPullRequestState = GitPullRequestStateType;
112
126
 
113
- const { EntityIdentifierUtils } = entityIdentifiersModule;
114
- const { GitProviderUtils } = providerUtilsModule;
115
-
116
127
  // Local runtime copies of the `@gitkraken/provider-apis` string enums. Duplicated (not imported as
117
128
  // values) because the SDK ships as CJS whose named enum exports can't be statically imported as ESM
118
129
  // values from the bundled `dist`. Exported so the enum-parity test can deep-equal them against the
@@ -191,7 +202,7 @@ export function isRepoIdsInput(input: unknown): input is (string | number)[] {
191
202
  );
192
203
  }
193
204
 
194
- export type ProviderPullRequest = GitPullRequest;
205
+ export type ProviderPullRequest = Omit<GitPullRequest, 'reviews'> & { reviews: ProviderPullRequestReviews };
195
206
  export type ProviderRepository = GitRepository;
196
207
  export type ProviderIssue = ProviderApiIssue;
197
208
  export type ProviderEnterpriseOptions = EnterpriseOptions;
@@ -859,19 +870,36 @@ const githubIssueSearchCapabilities: IssueSearchCapabilities = {
859
870
  sorts: githubIssueSorts,
860
871
  };
861
872
 
873
+ /**
874
+ * The ordering vocabulary of GitHub's filtered PR search: `created` and `updated`, both directions.
875
+ *
876
+ * Hand-declared rather than derived from `@gitkraken/provider-apis` (which has no PR-sort surface), and narrower
877
+ * than the issue set on purpose: the merged relationship × state facets can only be re-ordered by a field a
878
+ * `PullRequestShape` carries (see `getPullRequestComparator`), and GitHub PRs have no priority and no relevance
879
+ * that orders stably under the result ceiling. A parity test pins this to `gitHubPullRequestSortQualifiers`' keys
880
+ * so the capability can't outrun the emitter.
881
+ */
882
+ const githubPullRequestSorts: PullRequestSorting[] = ['updated:desc', 'updated:asc', 'created:desc', 'created:asc'];
883
+
862
884
  /** GitHub and GHE use the same filtered pull-request search syntax and result ceiling. */
863
885
  const githubPullRequestSearchCapabilities: PullRequestSearchCapabilities = {
864
886
  relationships: [
865
887
  PullRequestFilter.Author,
866
888
  PullRequestFilter.Assignee,
867
889
  PullRequestFilter.ReviewRequested,
890
+ PullRequestFilter.Reviewed,
868
891
  PullRequestFilter.Mention,
869
892
  ],
870
893
  states: ['open', 'closed', 'merged', 'all'],
871
894
  text: true,
895
+ updatedAfter: true,
896
+ createdAfter: true,
872
897
  includeArchived: true,
898
+ draft: true,
873
899
  repositoryScope: true,
874
900
  organizationScope: true,
901
+ // `sort:updated`, `sort:updated-asc`, `sort:created-desc`, `sort:created-asc` — see `githubPullRequestSorts`.
902
+ sorts: githubPullRequestSorts,
875
903
  };
876
904
 
877
905
  export const providersMetadata: ProvidersMetadata = {
@@ -894,6 +922,7 @@ export const providersMetadata: ProvidersMetadata = {
894
922
  PullRequestFilter.Author,
895
923
  PullRequestFilter.Assignee,
896
924
  PullRequestFilter.ReviewRequested,
925
+ PullRequestFilter.Reviewed,
897
926
  PullRequestFilter.Mention,
898
927
  ],
899
928
  supportedPullRequestSearch: githubPullRequestSearchCapabilities,
@@ -930,6 +959,7 @@ export const providersMetadata: ProvidersMetadata = {
930
959
  PullRequestFilter.Author,
931
960
  PullRequestFilter.Assignee,
932
961
  PullRequestFilter.ReviewRequested,
962
+ PullRequestFilter.Reviewed,
933
963
  PullRequestFilter.Mention,
934
964
  ],
935
965
  supportedPullRequestSearch: githubPullRequestSearchCapabilities,
@@ -1320,21 +1350,35 @@ export const fromProviderBuildStatusState = {
1320
1350
  [GitBuildStatusState.Warning]: undefined,
1321
1351
  };
1322
1352
 
1323
- export const toProviderPullRequestReviewState = {
1324
- [PullRequestReviewState.Approved]: GitPullRequestReviewState.Approved,
1325
- [PullRequestReviewState.ChangesRequested]: GitPullRequestReviewState.ChangesRequested,
1326
- [PullRequestReviewState.Commented]: GitPullRequestReviewState.Commented,
1327
- [PullRequestReviewState.ReviewRequested]: GitPullRequestReviewState.ReviewRequested,
1328
- [PullRequestReviewState.Dismissed]: null,
1329
- [PullRequestReviewState.Pending]: null,
1330
- };
1331
-
1332
- export const fromProviderPullRequestReviewState = {
1333
- [GitPullRequestReviewState.Approved]: PullRequestReviewState.Approved,
1334
- [GitPullRequestReviewState.ChangesRequested]: PullRequestReviewState.ChangesRequested,
1335
- [GitPullRequestReviewState.Commented]: PullRequestReviewState.Commented,
1336
- [GitPullRequestReviewState.ReviewRequested]: PullRequestReviewState.ReviewRequested,
1337
- };
1353
+ /** Rolls every check context up into one state, the way a provider's own rollup does: failed, errored, or
1354
+ * action-required fails; else pending or running is pending; else success — reading only the first context
1355
+ * would call a pull request passing on the strength of whichever check happens to come back first. States
1356
+ * carrying no verdict (cancelled, skipped, optional action required, warning) don't vote. Reads the raw
1357
+ * state rather than `fromProviderBuildStatusState`, which drops errored and running to `undefined` and
1358
+ * would let a lone success outvote a check still in flight. */
1359
+ function toStatusCheckRollupState(
1360
+ statuses: GitBuildStatus[] | null | undefined,
1361
+ ): PullRequestStatusCheckRollupState | undefined {
1362
+ if (!statuses?.length) return undefined;
1363
+
1364
+ let rollup: PullRequestStatusCheckRollupState | undefined;
1365
+ for (const { state } of statuses) {
1366
+ switch (state) {
1367
+ case GitBuildStatusState.Failed:
1368
+ case GitBuildStatusState.Error:
1369
+ case GitBuildStatusState.ActionRequired:
1370
+ return PullRequestStatusCheckRollupState.Failed;
1371
+ case GitBuildStatusState.Pending:
1372
+ case GitBuildStatusState.Running:
1373
+ rollup = PullRequestStatusCheckRollupState.Pending;
1374
+ break;
1375
+ case GitBuildStatusState.Success:
1376
+ rollup ??= PullRequestStatusCheckRollupState.Success;
1377
+ break;
1378
+ }
1379
+ }
1380
+ return rollup;
1381
+ }
1338
1382
 
1339
1383
  export const toProviderPullRequestMergeableState = {
1340
1384
  [PullRequestMergeableState.Mergeable]: GitPullRequestMergeableState.Mergeable,
@@ -1355,68 +1399,6 @@ export const fromProviderPullRequestMergeableState = {
1355
1399
  [GitPullRequestMergeableState.Unstable]: PullRequestMergeableState.Unknown,
1356
1400
  };
1357
1401
 
1358
- export function toProviderReviews(reviewers: PullRequestReviewer[]): ProviderPullRequest['reviews'] {
1359
- return reviewers
1360
- .filter(r => r.state !== PullRequestReviewState.Dismissed && r.state !== PullRequestReviewState.Pending)
1361
- .map(reviewer => ({
1362
- reviewer: toProviderAccount(reviewer.reviewer),
1363
- state: toProviderPullRequestReviewState[reviewer.state] ?? GitPullRequestReviewState.ReviewRequested,
1364
- }));
1365
- }
1366
-
1367
- export function toReviewRequests(reviews: ProviderPullRequest['reviews']): PullRequestReviewer[] | undefined {
1368
- return reviews == null
1369
- ? undefined
1370
- : reviews
1371
- ?.filter(r => r.state === GitPullRequestReviewState.ReviewRequested)
1372
- .map(r => ({
1373
- isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
1374
- reviewer: fromProviderAccount(r.reviewer),
1375
- state: PullRequestReviewState.ReviewRequested,
1376
- }));
1377
- }
1378
-
1379
- export function toCompletedReviews(reviews: ProviderPullRequest['reviews']): PullRequestReviewer[] | undefined {
1380
- return reviews == null
1381
- ? undefined
1382
- : reviews
1383
- ?.filter(r => r.state !== GitPullRequestReviewState.ReviewRequested)
1384
- .map(r => ({
1385
- isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
1386
- reviewer: fromProviderAccount(r.reviewer),
1387
- state: fromProviderPullRequestReviewState[r.state],
1388
- }));
1389
- }
1390
-
1391
- export function toProviderReviewDecision(
1392
- reviewDecision?: PullRequestReviewDecision,
1393
- reviewers?: PullRequestReviewer[],
1394
- ): GitPullRequestReviewState | null {
1395
- switch (reviewDecision) {
1396
- case PullRequestReviewDecision.Approved:
1397
- return GitPullRequestReviewState.Approved;
1398
- case PullRequestReviewDecision.ChangesRequested:
1399
- return GitPullRequestReviewState.ChangesRequested;
1400
- case PullRequestReviewDecision.ReviewRequired:
1401
- return GitPullRequestReviewState.ReviewRequested;
1402
- default: {
1403
- if (reviewers?.some(r => r.state === PullRequestReviewState.ReviewRequested)) {
1404
- return GitPullRequestReviewState.ReviewRequested;
1405
- } else if (reviewers?.some(r => r.state === PullRequestReviewState.Commented)) {
1406
- return GitPullRequestReviewState.Commented;
1407
- }
1408
- return null;
1409
- }
1410
- }
1411
- }
1412
-
1413
- export const fromPullRequestReviewDecision = {
1414
- [GitPullRequestReviewState.Approved]: PullRequestReviewDecision.Approved,
1415
- [GitPullRequestReviewState.ChangesRequested]: PullRequestReviewDecision.ChangesRequested,
1416
- [GitPullRequestReviewState.Commented]: undefined,
1417
- [GitPullRequestReviewState.ReviewRequested]: PullRequestReviewDecision.ReviewRequired,
1418
- };
1419
-
1420
1402
  export function toProviderPullRequestState(state: PullRequestState): GitPullRequestState {
1421
1403
  return state === 'opened'
1422
1404
  ? GitPullRequestState.Open
@@ -1521,7 +1503,7 @@ export function toProviderPullRequest(pr: PullRequest): ProviderPullRequest {
1521
1503
  mergedDate: pr.mergedDate ?? null,
1522
1504
  commentCount: pr.commentsCount ?? null,
1523
1505
  upvoteCount: pr.thumbsUpCount ?? null,
1524
- commitCount: null,
1506
+ commitCount: pr.commitCount ?? null,
1525
1507
  fileCount: null,
1526
1508
  additions: pr.additions ?? null,
1527
1509
  deletions: pr.deletions ?? null,
@@ -1541,7 +1523,11 @@ export function toProviderPullRequest(pr: PullRequest): ProviderPullRequest {
1541
1523
  name: pr.refs.head.branch,
1542
1524
  oid: pr.refs.head.sha,
1543
1525
  },
1544
- reviews: toProviderReviews(prReviews),
1526
+ // `null` when the source carried no review data at all, rather than the empty array a lite read would
1527
+ // otherwise produce: `toCompletedReviews`/`toReviewRequests` map `null` back to `undefined`, which is what
1528
+ // lets a consumer tell "nobody has reviewed this" from "this read never fetched reviews" (see
1529
+ // `PullRequestShape.latestReviews`). An empty array from a full projection stays an empty array.
1530
+ reviews: pr.reviewRequests == null && pr.latestReviews == null ? null : toProviderReviews(prReviews),
1545
1531
  reviewDecision: toProviderReviewDecision(pr.reviewDecision, prReviews),
1546
1532
  repository:
1547
1533
  pr.repository != null
@@ -1678,11 +1664,12 @@ export function fromProviderPullRequest(
1678
1664
  toReviewRequests(pr.reviews),
1679
1665
  toCompletedReviews(pr.reviews),
1680
1666
  pr.assignees?.map(fromProviderAccount) ?? undefined,
1681
- pr.headCommit?.buildStatuses?.[0]?.state
1682
- ? fromProviderBuildStatusState[pr.headCommit.buildStatuses[0].state]
1683
- : undefined,
1667
+ toStatusCheckRollupState(pr.headCommit?.buildStatuses),
1684
1668
  options?.project,
1685
1669
  pr.version,
1670
+ pr.commitCount ?? undefined,
1671
+ undefined, // stack — GK's proxy type has no stack concept; membership is joined host-side
1672
+ pr.fileCount ?? undefined,
1686
1673
  pr.description ?? undefined,
1687
1674
  pr.number,
1688
1675
  options?.currentAccountId != null ? pr.author?.id === options.currentAccountId : undefined,
@@ -1740,46 +1727,31 @@ export function fromProviderIssue(
1740
1727
  }
1741
1728
 
1742
1729
  export function toProviderPullRequestWithUniqueId(pr: PullRequest): PullRequestWithUniqueID {
1730
+ const { reviews, ...providerPr } = toProviderPullRequest(pr);
1743
1731
  return {
1744
- ...toProviderPullRequest(pr),
1732
+ ...providerPr,
1733
+ // The SDK boundary: `getActionablePullRequests` categorizes by review state and only knows
1734
+ // provider-apis' own vocabulary, so the locally-added dismissed state is dropped here rather than
1735
+ // handed over as a value it would fall through on. Our own projection keeps it — see
1736
+ // `providerPullRequestReviewStateDismissed`. `commitOid` rides along on the surviving reviews: it is an
1737
+ // extra property the SDK ignores, not a value it could misread.
1738
+ reviews:
1739
+ reviews?.filter(
1740
+ (r): r is ProviderPullRequestReview & { state: GitPullRequestReviewState } =>
1741
+ r.state !== providerPullRequestReviewStateDismissed,
1742
+ ) ?? null,
1745
1743
  uuid: EntityIdentifierUtils.encode(getEntityIdentifierInput(pr)),
1746
1744
  };
1747
1745
  }
1748
1746
 
1749
- export function toProviderAccount(account: PullRequestMember | IssueMember): ProviderAccount {
1750
- return {
1751
- id: account.id ?? null,
1752
- avatarUrl: account.avatarUrl ?? null,
1753
- name: account.name ?? null,
1754
- url: account.url ?? null,
1755
- // TODO: Implement these in our own model
1756
- email: '',
1757
- username: account.name ?? null,
1758
- };
1759
- }
1760
-
1761
- export function fromProviderAccount(account: ProviderAccount | null): PullRequestMember | IssueMember {
1762
- return {
1763
- id: account?.id ?? '',
1764
- // An absent name stays absent. `'unknown'` was a display fallback invented in the provider layer, and a
1765
- // consumer couldn't tell it apart from a member genuinely named that — so it couldn't be undone where a
1766
- // name-shaped placeholder is wrong (rendering an avatar-only chip, or building an AI prompt, where
1767
- // `Assignees: unknown` reads as a real assignee). It also disagreed with {@link toIssueShape}, which
1768
- // collapsed the same absent name to `''` — same facade method, two fallbacks. Both now emit `undefined`.
1769
- name: account?.name ?? undefined,
1770
- avatarUrl: account?.avatarUrl ?? undefined,
1771
- // `url` is optional, so an absent one must be `undefined`, not `''`. `''` passes a `!= null` presence
1772
- // check and renders as a link to nowhere, and it disagreed with {@link toIssueShape} — which already
1773
- // collapses to `undefined` — even though BOTH mappers feed `listIssuesPage` (the repo-scoped path goes
1774
- // through `toIssueShape`, Azure's account-wide path through {@link fromProviderIssue}). Same facade
1775
- // method, two shapes. Matches {@link toProviderRepositoryShape}, which collapses every absent optional.
1776
- url: account?.url ?? undefined,
1777
- };
1778
- }
1779
-
1780
1747
  export type ProviderActionablePullRequest = ActionablePullRequest;
1781
1748
 
1782
- export type EnrichablePullRequest = ProviderPullRequest & {
1749
+ /**
1750
+ * Built on the SDK's `GitPullRequest`, NOT the local {@link ProviderPullRequest} widening: this is handed to
1751
+ * `getActionablePullRequests`, which categorizes by review state and only knows provider-apis' vocabulary.
1752
+ * {@link toProviderPullRequestWithUniqueId} is what narrows `reviews` down to it.
1753
+ */
1754
+ export type EnrichablePullRequest = GitPullRequest & {
1783
1755
  uuid: string;
1784
1756
  type: 'pullrequest';
1785
1757
  provider: ProviderReference;
@@ -0,0 +1,122 @@
1
+ import type { GitPullRequest } from '@gitkraken/provider-apis';
2
+ import { GitPullRequestReviewState } from '@gitkraken/provider-apis';
3
+ import type { PullRequestReviewer } from '../../../git/models/pullRequest.js';
4
+ import { PullRequestReviewDecision, PullRequestReviewState } from '../../../git/models/pullRequest.js';
5
+ import { fromProviderAccount, toProviderAccount } from './accounts.js';
6
+
7
+ /**
8
+ * The GitLens-local extension of provider-apis' review shape, in two parts: a `DISMISSED` state the upstream
9
+ * `GitPullRequestReviewState` has no member for, and the head-commit oid a review was submitted against
10
+ * (optional, so a raw SDK review stays assignable — only the GitHub path populates it).
11
+ *
12
+ * Both exist for the same case: on GitHub the `dismiss stale reviews` rule flips an approval to dismissed on
13
+ * the next push, which is exactly the "the PR moved past my review" situation the oid detects. Dropping such a
14
+ * review instead would hand a consumer a PR out of the `reviewed-by:@me` set with no review row at all,
15
+ * indistinguishable from never having reviewed it.
16
+ */
17
+ export const providerPullRequestReviewStateDismissed = 'DISMISSED' as const;
18
+ export type ProviderPullRequestReview = Omit<NonNullable<GitPullRequest['reviews']>[number], 'state'> & {
19
+ state: GitPullRequestReviewState | typeof providerPullRequestReviewStateDismissed;
20
+ commitOid?: string;
21
+ };
22
+ /**
23
+ * The review list as it travels on {@link ProviderPullRequest}: `null` when the read carried no review data at
24
+ * all, as opposed to an empty array for a pull request nobody has reviewed.
25
+ */
26
+ export type ProviderPullRequestReviews = ProviderPullRequestReview[] | null;
27
+
28
+ export const toProviderPullRequestReviewState = {
29
+ [PullRequestReviewState.Approved]: GitPullRequestReviewState.Approved,
30
+ [PullRequestReviewState.ChangesRequested]: GitPullRequestReviewState.ChangesRequested,
31
+ [PullRequestReviewState.Commented]: GitPullRequestReviewState.Commented,
32
+ [PullRequestReviewState.ReviewRequested]: GitPullRequestReviewState.ReviewRequested,
33
+ [PullRequestReviewState.Dismissed]: providerPullRequestReviewStateDismissed,
34
+ // A review the author started but never submitted. Visible only to that author and carrying no verdict, so
35
+ // it stays unmapped and is dropped by the projection.
36
+ [PullRequestReviewState.Pending]: null,
37
+ };
38
+
39
+ export const fromProviderPullRequestReviewState = {
40
+ [GitPullRequestReviewState.Approved]: PullRequestReviewState.Approved,
41
+ [GitPullRequestReviewState.ChangesRequested]: PullRequestReviewState.ChangesRequested,
42
+ [GitPullRequestReviewState.Commented]: PullRequestReviewState.Commented,
43
+ [GitPullRequestReviewState.ReviewRequested]: PullRequestReviewState.ReviewRequested,
44
+ [providerPullRequestReviewStateDismissed]: PullRequestReviewState.Dismissed,
45
+ };
46
+
47
+ export function toProviderReviews(reviewers: PullRequestReviewer[]): ProviderPullRequestReviews {
48
+ // Only `Pending` maps to null (see `toProviderPullRequestReviewState`), so this drops exactly the reviews
49
+ // that carry no verdict rather than defaulting them to `ReviewRequested` — which would report an unsubmitted
50
+ // draft as a pending request from that reviewer.
51
+ return reviewers
52
+ .filter(r => r.state !== PullRequestReviewState.Pending)
53
+ .map(reviewer => ({
54
+ reviewer: toProviderAccount(reviewer.reviewer),
55
+ state: toProviderPullRequestReviewState[reviewer.state] ?? GitPullRequestReviewState.ReviewRequested,
56
+ commitOid: reviewer.commitOid,
57
+ }));
58
+ }
59
+
60
+ export function toReviewRequests(reviews: ProviderPullRequestReviews): PullRequestReviewer[] | undefined {
61
+ return reviews == null
62
+ ? undefined
63
+ : reviews
64
+ ?.filter(r => r.state === GitPullRequestReviewState.ReviewRequested)
65
+ .map(r => ({
66
+ isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
67
+ reviewer: fromProviderAccount(r.reviewer),
68
+ state: PullRequestReviewState.ReviewRequested,
69
+ }));
70
+ }
71
+
72
+ export function toCompletedReviews(reviews: ProviderPullRequestReviews): PullRequestReviewer[] | undefined {
73
+ return reviews == null
74
+ ? undefined
75
+ : reviews
76
+ ?.filter(
77
+ r =>
78
+ r.state !== GitPullRequestReviewState.ReviewRequested &&
79
+ // provider-apis' own GitHub normalizer maps only its four known states, so a review it has no
80
+ // member for (a real `DISMISSED` one, which its `latestReviews(first: 100)` selection does
81
+ // return) arrives with `state: undefined` — a value its type says cannot happen. Publishing it
82
+ // would put an unswitchable state on `PullRequestShape.latestReviews`, and mapping back would
83
+ // hit `toProviderReviews`' fallback and report a dismissed review as an outstanding request.
84
+ // Our own GitHub path never lands here: it carries `providerPullRequestReviewStateDismissed`.
85
+ fromProviderPullRequestReviewState[r.state] != null,
86
+ )
87
+ .map(r => ({
88
+ isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
89
+ reviewer: fromProviderAccount(r.reviewer),
90
+ state: fromProviderPullRequestReviewState[r.state],
91
+ commitOid: r.commitOid,
92
+ }));
93
+ }
94
+
95
+ export function toProviderReviewDecision(
96
+ reviewDecision?: PullRequestReviewDecision,
97
+ reviewers?: PullRequestReviewer[],
98
+ ): GitPullRequestReviewState | null {
99
+ switch (reviewDecision) {
100
+ case PullRequestReviewDecision.Approved:
101
+ return GitPullRequestReviewState.Approved;
102
+ case PullRequestReviewDecision.ChangesRequested:
103
+ return GitPullRequestReviewState.ChangesRequested;
104
+ case PullRequestReviewDecision.ReviewRequired:
105
+ return GitPullRequestReviewState.ReviewRequested;
106
+ default: {
107
+ if (reviewers?.some(r => r.state === PullRequestReviewState.ReviewRequested)) {
108
+ return GitPullRequestReviewState.ReviewRequested;
109
+ } else if (reviewers?.some(r => r.state === PullRequestReviewState.Commented)) {
110
+ return GitPullRequestReviewState.Commented;
111
+ }
112
+ return null;
113
+ }
114
+ }
115
+ }
116
+
117
+ export const fromPullRequestReviewDecision = {
118
+ [GitPullRequestReviewState.Approved]: PullRequestReviewDecision.Approved,
119
+ [GitPullRequestReviewState.ChangesRequested]: PullRequestReviewDecision.ChangesRequested,
120
+ [GitPullRequestReviewState.Commented]: undefined,
121
+ [GitPullRequestReviewState.ReviewRequested]: PullRequestReviewDecision.ReviewRequired,
122
+ };
@@ -140,7 +140,12 @@ export async function broadenIssues(
140
140
  }
141
141
 
142
142
  items.push(...result.items);
143
- warnings.push(...result.warnings);
143
+ // Deduped across orgs: several orgs of one provider commonly fail the same way (one expired token, one
144
+ // rate limit), producing the identical warning per slice, and the array's contract is that no two entries
145
+ // are equal — `traverseToRequestedPage` already dedupes when it folds these same warnings across rounds.
146
+ for (const warning of result.warnings) {
147
+ appendDedupedWarning(warnings, warning);
148
+ }
144
149
  for (const id of result.broadenedProviderIds) {
145
150
  broadenedProviderIds.add(id);
146
151
  }