@gitkraken/core-gitlens 0.3.1 → 0.4.100

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 (1070) hide show
  1. package/CHANGELOG.md +83 -1
  2. package/README.md +22 -12
  3. package/dist/git/cache.d.ts +29 -2
  4. package/dist/git/cache.d.ts.map +1 -1
  5. package/dist/git/cache.js +67 -7
  6. package/dist/git/cache.js.map +1 -1
  7. package/dist/git/context.d.ts +4 -3
  8. package/dist/git/context.d.ts.map +1 -1
  9. package/dist/git/context.js.map +1 -1
  10. package/dist/git/errors.d.ts +31 -1
  11. package/dist/git/errors.d.ts.map +1 -1
  12. package/dist/git/errors.js +29 -0
  13. package/dist/git/errors.js.map +1 -1
  14. package/dist/git/models/author.d.ts.map +1 -1
  15. package/dist/git/models/author.js.map +1 -1
  16. package/dist/git/models/autolink.d.ts.map +1 -1
  17. package/dist/git/models/autolink.js.map +1 -1
  18. package/dist/git/models/blame.d.ts.map +1 -1
  19. package/dist/git/models/blame.js.map +1 -1
  20. package/dist/git/models/branch.d.ts.map +1 -1
  21. package/dist/git/models/branch.js.map +1 -1
  22. package/dist/git/models/commit.d.ts.map +1 -1
  23. package/dist/git/models/commit.js +1 -1
  24. package/dist/git/models/commit.js.map +1 -1
  25. package/dist/git/models/contributor.d.ts.map +1 -1
  26. package/dist/git/models/contributor.js.map +1 -1
  27. package/dist/git/models/defaultBranch.d.ts.map +1 -1
  28. package/dist/git/models/defaultBranch.js.map +1 -1
  29. package/dist/git/models/diff.d.ts.map +1 -1
  30. package/dist/git/models/diff.js.map +1 -1
  31. package/dist/git/models/file.d.ts.map +1 -1
  32. package/dist/git/models/file.js.map +1 -1
  33. package/dist/git/models/fileChange.d.ts.map +1 -1
  34. package/dist/git/models/fileChange.js.map +1 -1
  35. package/dist/git/models/fileStatus.d.ts +22 -22
  36. package/dist/git/models/fileStatus.d.ts.map +1 -1
  37. package/dist/git/models/fileStatus.js.map +1 -1
  38. package/dist/git/models/graph.d.ts +122 -1
  39. package/dist/git/models/graph.d.ts.map +1 -1
  40. package/dist/git/models/graph.js +4 -0
  41. package/dist/git/models/graph.js.map +1 -1
  42. package/dist/git/models/graphSearch.d.ts.map +1 -1
  43. package/dist/git/models/graphSearch.js.map +1 -1
  44. package/dist/git/models/graphSession.d.ts +177 -0
  45. package/dist/git/models/graphSession.d.ts.map +1 -0
  46. package/dist/git/models/graphSession.js +7 -0
  47. package/dist/git/models/graphSession.js.map +1 -0
  48. package/dist/git/models/issue.d.ts +12 -2
  49. package/dist/git/models/issue.d.ts.map +1 -1
  50. package/dist/git/models/issue.js +3 -1
  51. package/dist/git/models/issue.js.map +1 -1
  52. package/dist/git/models/issueOrPullRequest.d.ts.map +1 -1
  53. package/dist/git/models/issueOrPullRequest.js.map +1 -1
  54. package/dist/git/models/lineRange.d.ts.map +1 -1
  55. package/dist/git/models/lineRange.js.map +1 -1
  56. package/dist/git/models/log.d.ts.map +1 -1
  57. package/dist/git/models/log.js.map +1 -1
  58. package/dist/git/models/mergeConflicts.d.ts.map +1 -1
  59. package/dist/git/models/mergeConflicts.js.map +1 -1
  60. package/dist/git/models/patch.d.ts.map +1 -1
  61. package/dist/git/models/patch.js.map +1 -1
  62. package/dist/git/models/pausedOperationStatus.d.ts.map +1 -1
  63. package/dist/git/models/pausedOperationStatus.js.map +1 -1
  64. package/dist/git/models/pullRequest.d.ts +27 -2
  65. package/dist/git/models/pullRequest.d.ts.map +1 -1
  66. package/dist/git/models/pullRequest.js +7 -1
  67. package/dist/git/models/pullRequest.js.map +1 -1
  68. package/dist/git/models/rebase.d.ts.map +1 -1
  69. package/dist/git/models/rebase.js.map +1 -1
  70. package/dist/git/models/reference.d.ts.map +1 -1
  71. package/dist/git/models/reference.js.map +1 -1
  72. package/dist/git/models/reflog.d.ts.map +1 -1
  73. package/dist/git/models/reflog.js.map +1 -1
  74. package/dist/git/models/remote.d.ts.map +1 -1
  75. package/dist/git/models/remote.js.map +1 -1
  76. package/dist/git/models/remoteProvider.d.ts.map +1 -1
  77. package/dist/git/models/remoteProvider.js.map +1 -1
  78. package/dist/git/models/remoteResource.d.ts.map +1 -1
  79. package/dist/git/models/remoteResource.js.map +1 -1
  80. package/dist/git/models/repository.d.ts +20 -2
  81. package/dist/git/models/repository.d.ts.map +1 -1
  82. package/dist/git/models/repository.js +19 -0
  83. package/dist/git/models/repository.js.map +1 -1
  84. package/dist/git/models/repositoryChangeEvent.d.ts.map +1 -1
  85. package/dist/git/models/repositoryChangeEvent.js.map +1 -1
  86. package/dist/git/models/repositoryIdentities.d.ts.map +1 -1
  87. package/dist/git/models/repositoryIdentities.js.map +1 -1
  88. package/dist/git/models/repositoryMetadata.d.ts.map +1 -1
  89. package/dist/git/models/repositoryMetadata.js.map +1 -1
  90. package/dist/git/models/resourceDescriptor.d.ts +16 -0
  91. package/dist/git/models/resourceDescriptor.d.ts.map +1 -1
  92. package/dist/git/models/resourceDescriptor.js.map +1 -1
  93. package/dist/git/models/revision.d.ts.map +1 -1
  94. package/dist/git/models/revision.js.map +1 -1
  95. package/dist/git/models/search.d.ts.map +1 -1
  96. package/dist/git/models/search.js.map +1 -1
  97. package/dist/git/models/shortlog.d.ts.map +1 -1
  98. package/dist/git/models/shortlog.js.map +1 -1
  99. package/dist/git/models/signature.d.ts +14 -0
  100. package/dist/git/models/signature.d.ts.map +1 -1
  101. package/dist/git/models/signature.js.map +1 -1
  102. package/dist/git/models/staging.d.ts.map +1 -1
  103. package/dist/git/models/staging.js.map +1 -1
  104. package/dist/git/models/stash.d.ts.map +1 -1
  105. package/dist/git/models/stash.js.map +1 -1
  106. package/dist/git/models/status.d.ts.map +1 -1
  107. package/dist/git/models/status.js.map +1 -1
  108. package/dist/git/models/statusFile.d.ts.map +1 -1
  109. package/dist/git/models/statusFile.js.map +1 -1
  110. package/dist/git/models/tag.d.ts +11 -1
  111. package/dist/git/models/tag.d.ts.map +1 -1
  112. package/dist/git/models/tag.js +9 -2
  113. package/dist/git/models/tag.js.map +1 -1
  114. package/dist/git/models/tree.d.ts.map +1 -1
  115. package/dist/git/models/tree.js.map +1 -1
  116. package/dist/git/models/user.d.ts.map +1 -1
  117. package/dist/git/models/user.js.map +1 -1
  118. package/dist/git/models/worktree.d.ts.map +1 -1
  119. package/dist/git/models/worktree.js.map +1 -1
  120. package/dist/git/parsers/diffParser.d.ts.map +1 -1
  121. package/dist/git/parsers/diffParser.js +1 -1
  122. package/dist/git/parsers/diffParser.js.map +1 -1
  123. package/dist/git/parsers/rebaseTodoParser.d.ts.map +1 -1
  124. package/dist/git/parsers/rebaseTodoParser.js.map +1 -1
  125. package/dist/git/providers/blame.d.ts.map +1 -1
  126. package/dist/git/providers/blame.js.map +1 -1
  127. package/dist/git/providers/branches.d.ts +8 -1
  128. package/dist/git/providers/branches.d.ts.map +1 -1
  129. package/dist/git/providers/branches.js.map +1 -1
  130. package/dist/git/providers/commits.d.ts +6 -1
  131. package/dist/git/providers/commits.d.ts.map +1 -1
  132. package/dist/git/providers/commits.js.map +1 -1
  133. package/dist/git/providers/config.d.ts +6 -2
  134. package/dist/git/providers/config.d.ts.map +1 -1
  135. package/dist/git/providers/config.js.map +1 -1
  136. package/dist/git/providers/contributors.d.ts.map +1 -1
  137. package/dist/git/providers/contributors.js.map +1 -1
  138. package/dist/git/providers/diff.d.ts.map +1 -1
  139. package/dist/git/providers/diff.js.map +1 -1
  140. package/dist/git/providers/graph.d.ts +55 -1
  141. package/dist/git/providers/graph.d.ts.map +1 -1
  142. package/dist/git/providers/graph.js.map +1 -1
  143. package/dist/git/providers/operations.d.ts +1 -0
  144. package/dist/git/providers/operations.d.ts.map +1 -1
  145. package/dist/git/providers/operations.js.map +1 -1
  146. package/dist/git/providers/patch.d.ts.map +1 -1
  147. package/dist/git/providers/patch.js.map +1 -1
  148. package/dist/git/providers/pausedOperations.d.ts.map +1 -1
  149. package/dist/git/providers/pausedOperations.js.map +1 -1
  150. package/dist/git/providers/provider.d.ts.map +1 -1
  151. package/dist/git/providers/provider.js.map +1 -1
  152. package/dist/git/providers/refs.d.ts.map +1 -1
  153. package/dist/git/providers/refs.js.map +1 -1
  154. package/dist/git/providers/remotes.d.ts.map +1 -1
  155. package/dist/git/providers/remotes.js.map +1 -1
  156. package/dist/git/providers/revision.d.ts.map +1 -1
  157. package/dist/git/providers/revision.js.map +1 -1
  158. package/dist/git/providers/shared/remotes.d.ts.map +1 -1
  159. package/dist/git/providers/shared/remotes.js.map +1 -1
  160. package/dist/git/providers/staging.d.ts.map +1 -1
  161. package/dist/git/providers/staging.js.map +1 -1
  162. package/dist/git/providers/stash.d.ts.map +1 -1
  163. package/dist/git/providers/stash.js.map +1 -1
  164. package/dist/git/providers/status.d.ts +1 -0
  165. package/dist/git/providers/status.d.ts.map +1 -1
  166. package/dist/git/providers/status.js.map +1 -1
  167. package/dist/git/providers/tags.d.ts.map +1 -1
  168. package/dist/git/providers/tags.js.map +1 -1
  169. package/dist/git/providers/types.d.ts.map +1 -1
  170. package/dist/git/providers/types.js.map +1 -1
  171. package/dist/git/providers/worktrees.d.ts +5 -1
  172. package/dist/git/providers/worktrees.d.ts.map +1 -1
  173. package/dist/git/providers/worktrees.js.map +1 -1
  174. package/dist/git/remotes/azure-devops.d.ts.map +1 -1
  175. package/dist/git/remotes/azure-devops.js +27 -31
  176. package/dist/git/remotes/azure-devops.js.map +1 -1
  177. package/dist/git/remotes/bitbucket-server.d.ts.map +1 -1
  178. package/dist/git/remotes/bitbucket-server.js +21 -23
  179. package/dist/git/remotes/bitbucket-server.js.map +1 -1
  180. package/dist/git/remotes/bitbucket.d.ts.map +1 -1
  181. package/dist/git/remotes/bitbucket.js +21 -23
  182. package/dist/git/remotes/bitbucket.js.map +1 -1
  183. package/dist/git/remotes/custom.d.ts.map +1 -1
  184. package/dist/git/remotes/custom.js.map +1 -1
  185. package/dist/git/remotes/gerrit.d.ts.map +1 -1
  186. package/dist/git/remotes/gerrit.js +11 -13
  187. package/dist/git/remotes/gerrit.js.map +1 -1
  188. package/dist/git/remotes/gitea.d.ts.map +1 -1
  189. package/dist/git/remotes/gitea.js +12 -14
  190. package/dist/git/remotes/gitea.js.map +1 -1
  191. package/dist/git/remotes/github.d.ts.map +1 -1
  192. package/dist/git/remotes/github.js +54 -56
  193. package/dist/git/remotes/github.js.map +1 -1
  194. package/dist/git/remotes/gitlab.d.ts.map +1 -1
  195. package/dist/git/remotes/gitlab.js +93 -95
  196. package/dist/git/remotes/gitlab.js.map +1 -1
  197. package/dist/git/remotes/google-source.d.ts.map +1 -1
  198. package/dist/git/remotes/google-source.js.map +1 -1
  199. package/dist/git/remotes/matcher.d.ts.map +1 -1
  200. package/dist/git/remotes/matcher.js.map +1 -1
  201. package/dist/git/run.types.d.ts +62 -3
  202. package/dist/git/run.types.d.ts.map +1 -1
  203. package/dist/git/service.d.ts.map +1 -1
  204. package/dist/git/utils/autolink.utils.d.ts.map +1 -1
  205. package/dist/git/utils/autolink.utils.js.map +1 -1
  206. package/dist/git/utils/blame.utils.d.ts.map +1 -1
  207. package/dist/git/utils/blame.utils.js.map +1 -1
  208. package/dist/git/utils/branch.utils.d.ts.map +1 -1
  209. package/dist/git/utils/branch.utils.js +12 -1
  210. package/dist/git/utils/branch.utils.js.map +1 -1
  211. package/dist/git/utils/commit.utils.d.ts.map +1 -1
  212. package/dist/git/utils/commit.utils.js.map +1 -1
  213. package/dist/git/utils/conflictResolution.utils.d.ts +32 -0
  214. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -1
  215. package/dist/git/utils/conflictResolution.utils.js +95 -0
  216. package/dist/git/utils/conflictResolution.utils.js.map +1 -1
  217. package/dist/git/utils/contributor.utils.d.ts +1 -1
  218. package/dist/git/utils/contributor.utils.d.ts.map +1 -1
  219. package/dist/git/utils/contributor.utils.js +1 -2
  220. package/dist/git/utils/contributor.utils.js.map +1 -1
  221. package/dist/git/utils/fetch.utils.d.ts.map +1 -1
  222. package/dist/git/utils/fetch.utils.js.map +1 -1
  223. package/dist/git/utils/fileStatus.utils.d.ts +7 -0
  224. package/dist/git/utils/fileStatus.utils.d.ts.map +1 -1
  225. package/dist/git/utils/fileStatus.utils.js +6 -0
  226. package/dist/git/utils/fileStatus.utils.js.map +1 -1
  227. package/dist/git/utils/graph.utils.d.ts +20 -0
  228. package/dist/git/utils/graph.utils.d.ts.map +1 -0
  229. package/dist/git/utils/graph.utils.js +40 -0
  230. package/dist/git/utils/graph.utils.js.map +1 -0
  231. package/dist/git/utils/issue.utils.d.ts.map +1 -1
  232. package/dist/git/utils/issue.utils.js +1 -0
  233. package/dist/git/utils/issue.utils.js.map +1 -1
  234. package/dist/git/utils/issueOrPullRequest.utils.d.ts.map +1 -1
  235. package/dist/git/utils/issueOrPullRequest.utils.js.map +1 -1
  236. package/dist/git/utils/mergeConflicts.utils.d.ts.map +1 -1
  237. package/dist/git/utils/mergeConflicts.utils.js.map +1 -1
  238. package/dist/git/utils/pausedOperationStatus.utils.d.ts +13 -13
  239. package/dist/git/utils/pausedOperationStatus.utils.d.ts.map +1 -1
  240. package/dist/git/utils/pausedOperationStatus.utils.js.map +1 -1
  241. package/dist/git/utils/pullRequest.utils.d.ts.map +1 -1
  242. package/dist/git/utils/pullRequest.utils.js +9 -0
  243. package/dist/git/utils/pullRequest.utils.js.map +1 -1
  244. package/dist/git/utils/reachability.utils.d.ts +20 -2
  245. package/dist/git/utils/reachability.utils.d.ts.map +1 -1
  246. package/dist/git/utils/reachability.utils.js +68 -7
  247. package/dist/git/utils/reachability.utils.js.map +1 -1
  248. package/dist/git/utils/rebase.utils.d.ts.map +1 -1
  249. package/dist/git/utils/rebase.utils.js.map +1 -1
  250. package/dist/git/utils/reference.utils.d.ts.map +1 -1
  251. package/dist/git/utils/reference.utils.js.map +1 -1
  252. package/dist/git/utils/remote.utils.d.ts.map +1 -1
  253. package/dist/git/utils/remote.utils.js.map +1 -1
  254. package/dist/git/utils/repository.utils.d.ts.map +1 -1
  255. package/dist/git/utils/repository.utils.js.map +1 -1
  256. package/dist/git/utils/resourceDescriptor.utils.d.ts.map +1 -1
  257. package/dist/git/utils/resourceDescriptor.utils.js.map +1 -1
  258. package/dist/git/utils/revision.utils.d.ts.map +1 -1
  259. package/dist/git/utils/revision.utils.js.map +1 -1
  260. package/dist/git/utils/search.utils.d.ts.map +1 -1
  261. package/dist/git/utils/search.utils.js.map +1 -1
  262. package/dist/git/utils/sorting.d.ts.map +1 -1
  263. package/dist/git/utils/sorting.js.map +1 -1
  264. package/dist/git/utils/sshKey.utils.d.ts +7 -0
  265. package/dist/git/utils/sshKey.utils.d.ts.map +1 -0
  266. package/dist/git/utils/sshKey.utils.js +25 -0
  267. package/dist/git/utils/sshKey.utils.js.map +1 -0
  268. package/dist/git/utils/status.utils.d.ts.map +1 -1
  269. package/dist/git/utils/status.utils.js.map +1 -1
  270. package/dist/git/utils/statusFile.utils.d.ts.map +1 -1
  271. package/dist/git/utils/statusFile.utils.js.map +1 -1
  272. package/dist/git/utils/tag.utils.d.ts.map +1 -1
  273. package/dist/git/utils/tag.utils.js.map +1 -1
  274. package/dist/git/utils/tooltip.utils.d.ts.map +1 -1
  275. package/dist/git/utils/tooltip.utils.js.map +1 -1
  276. package/dist/git/utils/uriAuthority.d.ts.map +1 -1
  277. package/dist/git/utils/uriAuthority.js.map +1 -1
  278. package/dist/git/utils/user.utils.d.ts.map +1 -1
  279. package/dist/git/utils/user.utils.js.map +1 -1
  280. package/dist/git/utils/worktree.utils.d.ts.map +1 -1
  281. package/dist/git/utils/worktree.utils.js.map +1 -1
  282. package/dist/git/watching/changeEvent.d.ts.map +1 -1
  283. package/dist/git/watching/changeEvent.js.map +1 -1
  284. package/dist/git/watching/classifyChange.d.ts.map +1 -1
  285. package/dist/git/watching/classifyChange.js.map +1 -1
  286. package/dist/git/watching/gitIgnoreFilter.d.ts.map +1 -1
  287. package/dist/git/watching/gitIgnoreFilter.js.map +1 -1
  288. package/dist/git/watching/initWatcher.d.ts.map +1 -1
  289. package/dist/git/watching/initWatcher.js.map +1 -1
  290. package/dist/git/watching/provider.d.ts.map +1 -1
  291. package/dist/git/watching/provider.js.map +1 -1
  292. package/dist/git/watching/watchGroup.d.ts.map +1 -1
  293. package/dist/git/watching/watchGroup.js.map +1 -1
  294. package/dist/git/watching/watchService.d.ts +4 -0
  295. package/dist/git/watching/watchService.d.ts.map +1 -1
  296. package/dist/git/watching/watchService.js +15 -1
  297. package/dist/git/watching/watchService.js.map +1 -1
  298. package/dist/git/watching/watchSession.d.ts +7 -0
  299. package/dist/git/watching/watchSession.d.ts.map +1 -1
  300. package/dist/git/watching/watchSession.js +14 -2
  301. package/dist/git/watching/watchSession.js.map +1 -1
  302. package/dist/git/watching/watcherPatterns.d.ts.map +1 -1
  303. package/dist/git/watching/watcherPatterns.js.map +1 -1
  304. package/dist/git-cli/cliGitProvider.d.ts.map +1 -1
  305. package/dist/git-cli/exec/exec.d.ts.map +1 -1
  306. package/dist/git-cli/exec/exec.errors.d.ts.map +1 -1
  307. package/dist/git-cli/exec/exec.errors.js.map +1 -1
  308. package/dist/git-cli/exec/exec.js.map +1 -1
  309. package/dist/git-cli/exec/exec.types.d.ts.map +1 -1
  310. package/dist/git-cli/exec/exec.types.js.map +1 -1
  311. package/dist/git-cli/exec/features.d.ts.map +1 -1
  312. package/dist/git-cli/exec/features.js.map +1 -1
  313. package/dist/git-cli/exec/git.d.ts +19 -27
  314. package/dist/git-cli/exec/git.d.ts.map +1 -1
  315. package/dist/git-cli/exec/git.js +126 -34
  316. package/dist/git-cli/exec/git.js.map +1 -1
  317. package/dist/git-cli/exec/gitQueue.d.ts.map +1 -1
  318. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  319. package/dist/git-cli/exec/locator.d.ts.map +1 -1
  320. package/dist/git-cli/exec/locator.js.map +1 -1
  321. package/dist/git-cli/parsers/blameParser.d.ts.map +1 -1
  322. package/dist/git-cli/parsers/blameParser.js.map +1 -1
  323. package/dist/git-cli/parsers/indexParser.d.ts.map +1 -1
  324. package/dist/git-cli/parsers/indexParser.js.map +1 -1
  325. package/dist/git-cli/parsers/logParser.d.ts +9 -1
  326. package/dist/git-cli/parsers/logParser.d.ts.map +1 -1
  327. package/dist/git-cli/parsers/logParser.js +141 -60
  328. package/dist/git-cli/parsers/logParser.js.map +1 -1
  329. package/dist/git-cli/parsers/mergeTreeParser.d.ts.map +1 -1
  330. package/dist/git-cli/parsers/mergeTreeParser.js.map +1 -1
  331. package/dist/git-cli/parsers/refParser.d.ts.map +1 -1
  332. package/dist/git-cli/parsers/refParser.js.map +1 -1
  333. package/dist/git-cli/parsers/reflogParser.d.ts.map +1 -1
  334. package/dist/git-cli/parsers/reflogParser.js.map +1 -1
  335. package/dist/git-cli/parsers/remoteParser.d.ts.map +1 -1
  336. package/dist/git-cli/parsers/remoteParser.js.map +1 -1
  337. package/dist/git-cli/parsers/shortlogParser.d.ts.map +1 -1
  338. package/dist/git-cli/parsers/shortlogParser.js.map +1 -1
  339. package/dist/git-cli/parsers/signatureParser.d.ts.map +1 -1
  340. package/dist/git-cli/parsers/signatureParser.js.map +1 -1
  341. package/dist/git-cli/parsers/sshSignatureParser.d.ts +21 -0
  342. package/dist/git-cli/parsers/sshSignatureParser.d.ts.map +1 -0
  343. package/dist/git-cli/parsers/sshSignatureParser.js +78 -0
  344. package/dist/git-cli/parsers/sshSignatureParser.js.map +1 -0
  345. package/dist/git-cli/parsers/statusParser.d.ts.map +1 -1
  346. package/dist/git-cli/parsers/statusParser.js.map +1 -1
  347. package/dist/git-cli/parsers/treeParser.d.ts.map +1 -1
  348. package/dist/git-cli/parsers/treeParser.js.map +1 -1
  349. package/dist/git-cli/parsers/worktreeParser.d.ts.map +1 -1
  350. package/dist/git-cli/parsers/worktreeParser.js +5 -7
  351. package/dist/git-cli/parsers/worktreeParser.js.map +1 -1
  352. package/dist/git-cli/providers/blame.d.ts.map +1 -1
  353. package/dist/git-cli/providers/blame.js.map +1 -1
  354. package/dist/git-cli/providers/branches.d.ts +1 -0
  355. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  356. package/dist/git-cli/providers/branches.js +51 -32
  357. package/dist/git-cli/providers/branches.js.map +1 -1
  358. package/dist/git-cli/providers/commitFilesetUtils.d.ts.map +1 -1
  359. package/dist/git-cli/providers/commitFilesetUtils.js.map +1 -1
  360. package/dist/git-cli/providers/commits.d.ts +12 -1
  361. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  362. package/dist/git-cli/providers/commits.js +89 -8
  363. package/dist/git-cli/providers/commits.js.map +1 -1
  364. package/dist/git-cli/providers/config.d.ts.map +1 -1
  365. package/dist/git-cli/providers/config.js.map +1 -1
  366. package/dist/git-cli/providers/contributors.d.ts.map +1 -1
  367. package/dist/git-cli/providers/contributors.js.map +1 -1
  368. package/dist/git-cli/providers/diff.d.ts.map +1 -1
  369. package/dist/git-cli/providers/diff.js.map +1 -1
  370. package/dist/git-cli/providers/graph.d.ts +35 -1
  371. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  372. package/dist/git-cli/providers/graph.js +1434 -330
  373. package/dist/git-cli/providers/graph.js.map +1 -1
  374. package/dist/git-cli/providers/operations.d.ts +1 -0
  375. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  376. package/dist/git-cli/providers/operations.js +22 -1
  377. package/dist/git-cli/providers/operations.js.map +1 -1
  378. package/dist/git-cli/providers/patch.d.ts.map +1 -1
  379. package/dist/git-cli/providers/patch.js.map +1 -1
  380. package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
  381. package/dist/git-cli/providers/pausedOperations.js +3 -3
  382. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  383. package/dist/git-cli/providers/refs.d.ts.map +1 -1
  384. package/dist/git-cli/providers/refs.js.map +1 -1
  385. package/dist/git-cli/providers/remotes.d.ts.map +1 -1
  386. package/dist/git-cli/providers/remotes.js.map +1 -1
  387. package/dist/git-cli/providers/revision.d.ts +1 -0
  388. package/dist/git-cli/providers/revision.d.ts.map +1 -1
  389. package/dist/git-cli/providers/revision.js +33 -0
  390. package/dist/git-cli/providers/revision.js.map +1 -1
  391. package/dist/git-cli/providers/staging.d.ts.map +1 -1
  392. package/dist/git-cli/providers/staging.js.map +1 -1
  393. package/dist/git-cli/providers/stash.d.ts.map +1 -1
  394. package/dist/git-cli/providers/stash.js.map +1 -1
  395. package/dist/git-cli/providers/status.d.ts +28 -0
  396. package/dist/git-cli/providers/status.d.ts.map +1 -1
  397. package/dist/git-cli/providers/status.js +240 -154
  398. package/dist/git-cli/providers/status.js.map +1 -1
  399. package/dist/git-cli/providers/tags.d.ts.map +1 -1
  400. package/dist/git-cli/providers/tags.js +2 -1
  401. package/dist/git-cli/providers/tags.js.map +1 -1
  402. package/dist/git-cli/providers/worktrees.d.ts +4 -1
  403. package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
  404. package/dist/git-cli/providers/worktrees.js +31 -3
  405. package/dist/git-cli/providers/worktrees.js.map +1 -1
  406. package/dist/git-cli/service.d.ts.map +1 -1
  407. package/dist/git-cli/service.js +8 -0
  408. package/dist/git-cli/service.js.map +1 -1
  409. package/dist/ipc/ipcServer.d.ts.map +1 -1
  410. package/dist/ipc/ipcServer.js +1 -1
  411. package/dist/ipc/ipcServer.js.map +1 -1
  412. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +6 -1
  413. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -1
  414. package/dist/plus/agents/providers/claudeCodeProvider.js +19 -0
  415. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -1
  416. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +68 -0
  417. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -1
  418. package/dist/plus/agents/providers/claudeCodeTranscript.js +262 -8
  419. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
  420. package/dist/plus/agents/types.d.ts +36 -2
  421. package/dist/plus/agents/types.d.ts.map +1 -1
  422. package/dist/plus/ai/constants.d.ts +1 -2
  423. package/dist/plus/ai/constants.d.ts.map +1 -1
  424. package/dist/plus/ai/constants.js +1 -8
  425. package/dist/plus/ai/constants.js.map +1 -1
  426. package/dist/plus/ai/errors.d.ts.map +1 -1
  427. package/dist/plus/ai/errors.js.map +1 -1
  428. package/dist/plus/ai/models/conversation.d.ts.map +1 -1
  429. package/dist/plus/ai/models/conversation.js.map +1 -1
  430. package/dist/plus/ai/models/model.d.ts +2 -1
  431. package/dist/plus/ai/models/model.d.ts.map +1 -1
  432. package/dist/plus/ai/models/model.js +50 -1
  433. package/dist/plus/ai/models/model.js.map +1 -1
  434. package/dist/plus/ai/models/promptTemplates.d.ts +5 -2
  435. package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
  436. package/dist/plus/ai/models/promptTemplates.js.map +1 -1
  437. package/dist/plus/ai/models/provider.d.ts.map +1 -1
  438. package/dist/plus/ai/models/provider.js.map +1 -1
  439. package/dist/plus/ai/models/results.d.ts.map +1 -1
  440. package/dist/plus/ai/models/results.js.map +1 -1
  441. package/dist/plus/ai/prompts.d.ts +1 -1
  442. package/dist/plus/ai/prompts.d.ts.map +1 -1
  443. package/dist/plus/ai/prompts.js +15 -47
  444. package/dist/plus/ai/prompts.js.map +1 -1
  445. package/dist/plus/ai/providers/anthropicProvider.d.ts +5 -0
  446. package/dist/plus/ai/providers/anthropicProvider.d.ts.map +1 -1
  447. package/dist/plus/ai/providers/anthropicProvider.js +40 -3
  448. package/dist/plus/ai/providers/anthropicProvider.js.map +1 -1
  449. package/dist/plus/ai/providers/azureProvider.d.ts.map +1 -1
  450. package/dist/plus/ai/providers/azureProvider.js.map +1 -1
  451. package/dist/plus/ai/providers/context.d.ts.map +1 -1
  452. package/dist/plus/ai/providers/context.js.map +1 -1
  453. package/dist/plus/ai/providers/deepSeekProvider.d.ts.map +1 -1
  454. package/dist/plus/ai/providers/deepSeekProvider.js +17 -1
  455. package/dist/plus/ai/providers/deepSeekProvider.js.map +1 -1
  456. package/dist/plus/ai/providers/geminiProvider.d.ts.map +1 -1
  457. package/dist/plus/ai/providers/geminiProvider.js +25 -6
  458. package/dist/plus/ai/providers/geminiProvider.js.map +1 -1
  459. package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
  460. package/dist/plus/ai/providers/gitkrakenProvider.js +1 -0
  461. package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
  462. package/dist/plus/ai/providers/huggingFaceProvider.d.ts +1 -1
  463. package/dist/plus/ai/providers/huggingFaceProvider.d.ts.map +1 -1
  464. package/dist/plus/ai/providers/huggingFaceProvider.js +21 -18
  465. package/dist/plus/ai/providers/huggingFaceProvider.js.map +1 -1
  466. package/dist/plus/ai/providers/mistralProvider.d.ts.map +1 -1
  467. package/dist/plus/ai/providers/mistralProvider.js.map +1 -1
  468. package/dist/plus/ai/providers/ollamaProvider.d.ts.map +1 -1
  469. package/dist/plus/ai/providers/ollamaProvider.js.map +1 -1
  470. package/dist/plus/ai/providers/openAICompatibleProvider.d.ts.map +1 -1
  471. package/dist/plus/ai/providers/openAICompatibleProvider.js.map +1 -1
  472. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +10 -1
  473. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
  474. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +9 -1
  475. package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
  476. package/dist/plus/ai/providers/openRouterProvider.d.ts.map +1 -1
  477. package/dist/plus/ai/providers/openRouterProvider.js.map +1 -1
  478. package/dist/plus/ai/providers/openaiProvider.d.ts.map +1 -1
  479. package/dist/plus/ai/providers/openaiProvider.js.map +1 -1
  480. package/dist/plus/ai/providers/xaiProvider.d.ts.map +1 -1
  481. package/dist/plus/ai/providers/xaiProvider.js +14 -1
  482. package/dist/plus/ai/providers/xaiProvider.js.map +1 -1
  483. package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
  484. package/dist/plus/ai/utils/ai.utils.js +5 -7
  485. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  486. package/dist/plus/ai/utils/results.utils.d.ts +3 -0
  487. package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
  488. package/dist/plus/ai/utils/results.utils.js +26 -0
  489. package/dist/plus/ai/utils/results.utils.js.map +1 -1
  490. package/dist/plus/ai/utils/truncation.utils.d.ts +1 -1
  491. package/dist/plus/ai/utils/truncation.utils.d.ts.map +1 -1
  492. package/dist/plus/ai/utils/truncation.utils.js.map +1 -1
  493. package/dist/plus/git-github/api/config.d.ts.map +1 -1
  494. package/dist/plus/git-github/api/config.js.map +1 -1
  495. package/dist/plus/git-github/api/github.d.ts +71 -15
  496. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  497. package/dist/plus/git-github/api/github.js +350 -84
  498. package/dist/plus/git-github/api/github.js.map +1 -1
  499. package/dist/plus/git-github/api/github.utils.d.ts.map +1 -1
  500. package/dist/plus/git-github/api/github.utils.js.map +1 -1
  501. package/dist/plus/git-github/api/token.d.ts.map +1 -1
  502. package/dist/plus/git-github/api/token.js.map +1 -1
  503. package/dist/plus/git-github/api/tokenUtils.d.ts.map +1 -1
  504. package/dist/plus/git-github/api/tokenUtils.js.map +1 -1
  505. package/dist/plus/git-github/api/types.d.ts.map +1 -1
  506. package/dist/plus/git-github/api/types.js.map +1 -1
  507. package/dist/plus/git-github/context.d.ts.map +1 -1
  508. package/dist/plus/git-github/models.d.ts +5 -0
  509. package/dist/plus/git-github/models.d.ts.map +1 -1
  510. package/dist/plus/git-github/models.js +27 -2
  511. package/dist/plus/git-github/models.js.map +1 -1
  512. package/dist/plus/git-github/providers/github/blame.d.ts.map +1 -1
  513. package/dist/plus/git-github/providers/github/blame.js.map +1 -1
  514. package/dist/plus/git-github/providers/github/branches.d.ts +2 -1
  515. package/dist/plus/git-github/providers/github/branches.d.ts.map +1 -1
  516. package/dist/plus/git-github/providers/github/branches.js +7 -3
  517. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  518. package/dist/plus/git-github/providers/github/commits.d.ts.map +1 -1
  519. package/dist/plus/git-github/providers/github/commits.js.map +1 -1
  520. package/dist/plus/git-github/providers/github/config.d.ts.map +1 -1
  521. package/dist/plus/git-github/providers/github/config.js.map +1 -1
  522. package/dist/plus/git-github/providers/github/contributors.d.ts.map +1 -1
  523. package/dist/plus/git-github/providers/github/contributors.js.map +1 -1
  524. package/dist/plus/git-github/providers/github/diff.d.ts.map +1 -1
  525. package/dist/plus/git-github/providers/github/diff.js +2 -2
  526. package/dist/plus/git-github/providers/github/diff.js.map +1 -1
  527. package/dist/plus/git-github/providers/github/graph.d.ts +12 -1
  528. package/dist/plus/git-github/providers/github/graph.d.ts.map +1 -1
  529. package/dist/plus/git-github/providers/github/graph.js +85 -0
  530. package/dist/plus/git-github/providers/github/graph.js.map +1 -1
  531. package/dist/plus/git-github/providers/github/refs.d.ts.map +1 -1
  532. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  533. package/dist/plus/git-github/providers/github/remotes.d.ts.map +1 -1
  534. package/dist/plus/git-github/providers/github/remotes.js.map +1 -1
  535. package/dist/plus/git-github/providers/github/revision.d.ts.map +1 -1
  536. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  537. package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
  538. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  539. package/dist/plus/git-github/providers/github/tags.d.ts.map +1 -1
  540. package/dist/plus/git-github/providers/github/tags.js +3 -1
  541. package/dist/plus/git-github/providers/github/tags.js.map +1 -1
  542. package/dist/plus/git-github/providers/githubGitProvider.d.ts.map +1 -1
  543. package/dist/plus/git-github/providers/githubGitProvider.js.map +1 -1
  544. package/dist/plus/git-github/providers/githubProvider.d.ts.map +1 -1
  545. package/dist/plus/git-github/providers/githubProvider.js.map +1 -1
  546. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts +30 -0
  547. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts.map +1 -0
  548. package/dist/plus/integrations/authentication/cloudIntegrationService.js +214 -0
  549. package/dist/plus/integrations/authentication/cloudIntegrationService.js.map +1 -0
  550. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts +114 -0
  551. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts.map +1 -0
  552. package/dist/plus/integrations/authentication/configuredIntegrationService.js +497 -0
  553. package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -0
  554. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts +112 -0
  555. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts.map +1 -0
  556. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +217 -0
  557. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js.map +1 -0
  558. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts +62 -0
  559. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts.map +1 -0
  560. package/dist/plus/integrations/authentication/integrationAuthenticationService.js +126 -0
  561. package/dist/plus/integrations/authentication/integrationAuthenticationService.js.map +1 -0
  562. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts +16 -0
  563. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts.map +1 -0
  564. package/dist/plus/integrations/authentication/manualTokenProvider.js +53 -0
  565. package/dist/plus/integrations/authentication/manualTokenProvider.js.map +1 -0
  566. package/dist/plus/integrations/authentication/models.d.ts +120 -0
  567. package/dist/plus/integrations/authentication/models.d.ts.map +1 -0
  568. package/dist/plus/integrations/authentication/models.js +64 -0
  569. package/dist/plus/integrations/authentication/models.js.map +1 -0
  570. package/dist/plus/integrations/collectionMetadata.d.ts +21 -0
  571. package/dist/plus/integrations/collectionMetadata.d.ts.map +1 -0
  572. package/dist/plus/integrations/collectionMetadata.js +121 -0
  573. package/dist/plus/integrations/collectionMetadata.js.map +1 -0
  574. package/dist/plus/integrations/constants.d.ts +57 -0
  575. package/dist/plus/integrations/constants.d.ts.map +1 -0
  576. package/dist/plus/integrations/constants.js +138 -0
  577. package/dist/plus/integrations/constants.js.map +1 -0
  578. package/dist/plus/integrations/context.d.ts +358 -0
  579. package/dist/plus/integrations/context.d.ts.map +1 -0
  580. package/dist/plus/integrations/context.js +2 -0
  581. package/dist/plus/integrations/context.js.map +1 -0
  582. package/dist/plus/integrations/errors.d.ts +79 -0
  583. package/dist/plus/integrations/errors.d.ts.map +1 -0
  584. package/dist/plus/integrations/errors.js +150 -0
  585. package/dist/plus/integrations/errors.js.map +1 -0
  586. package/dist/plus/integrations/index.d.ts +77 -0
  587. package/dist/plus/integrations/index.d.ts.map +1 -0
  588. package/dist/plus/integrations/index.js +64 -0
  589. package/dist/plus/integrations/index.js.map +1 -0
  590. package/dist/plus/integrations/integrationService.d.ts +379 -0
  591. package/dist/plus/integrations/integrationService.d.ts.map +1 -0
  592. package/dist/plus/integrations/integrationService.js +1895 -0
  593. package/dist/plus/integrations/integrationService.js.map +1 -0
  594. package/dist/plus/integrations/lite.d.ts +47 -0
  595. package/dist/plus/integrations/lite.d.ts.map +1 -0
  596. package/dist/plus/integrations/lite.js +141 -0
  597. package/dist/plus/integrations/lite.js.map +1 -0
  598. package/dist/plus/integrations/manager.d.ts +332 -0
  599. package/dist/plus/integrations/manager.d.ts.map +1 -0
  600. package/dist/plus/integrations/manager.js +2 -0
  601. package/dist/plus/integrations/manager.js.map +1 -0
  602. package/dist/plus/integrations/models/gitHostIntegration.d.ts +341 -0
  603. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -0
  604. package/dist/plus/integrations/models/gitHostIntegration.js +1146 -0
  605. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -0
  606. package/dist/plus/integrations/models/integration.d.ts +212 -0
  607. package/dist/plus/integrations/models/integration.d.ts.map +1 -0
  608. package/dist/plus/integrations/models/integration.js +627 -0
  609. package/dist/plus/integrations/models/integration.js.map +1 -0
  610. package/dist/plus/integrations/models/issuesIntegration.d.ts +108 -0
  611. package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -0
  612. package/dist/plus/integrations/models/issuesIntegration.js +216 -0
  613. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -0
  614. package/dist/plus/integrations/providerFilters.d.ts +12 -0
  615. package/dist/plus/integrations/providerFilters.d.ts.map +1 -0
  616. package/dist/plus/integrations/providerFilters.js +14 -0
  617. package/dist/plus/integrations/providerFilters.js.map +1 -0
  618. package/dist/plus/integrations/providers/apiClients.d.ts +25 -0
  619. package/dist/plus/integrations/providers/apiClients.d.ts.map +1 -0
  620. package/dist/plus/integrations/providers/apiClients.js +39 -0
  621. package/dist/plus/integrations/providers/apiClients.js.map +1 -0
  622. package/dist/plus/integrations/providers/apiConfig.d.ts +52 -0
  623. package/dist/plus/integrations/providers/apiConfig.d.ts.map +1 -0
  624. package/dist/plus/integrations/providers/apiConfig.js +19 -0
  625. package/dist/plus/integrations/providers/apiConfig.js.map +1 -0
  626. package/dist/plus/integrations/providers/azure/azure.d.ts +59 -0
  627. package/dist/plus/integrations/providers/azure/azure.d.ts.map +1 -0
  628. package/dist/plus/integrations/providers/azure/azure.js +519 -0
  629. package/dist/plus/integrations/providers/azure/azure.js.map +1 -0
  630. package/dist/plus/integrations/providers/azure/models.d.ts +302 -0
  631. package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -0
  632. package/dist/plus/integrations/providers/azure/models.js +203 -0
  633. package/dist/plus/integrations/providers/azure/models.js.map +1 -0
  634. package/dist/plus/integrations/providers/azureDevOps.d.ts +141 -0
  635. package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -0
  636. package/dist/plus/integrations/providers/azureDevOps.js +925 -0
  637. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -0
  638. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +53 -0
  639. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts.map +1 -0
  640. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +589 -0
  641. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -0
  642. package/dist/plus/integrations/providers/bitbucket/models.d.ts +222 -0
  643. package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -0
  644. package/dist/plus/integrations/providers/bitbucket/models.js +158 -0
  645. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -0
  646. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +138 -0
  647. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts.map +1 -0
  648. package/dist/plus/integrations/providers/bitbucket-server/models.js +130 -0
  649. package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -0
  650. package/dist/plus/integrations/providers/bitbucket-server.d.ts +84 -0
  651. package/dist/plus/integrations/providers/bitbucket-server.d.ts.map +1 -0
  652. package/dist/plus/integrations/providers/bitbucket-server.js +242 -0
  653. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -0
  654. package/dist/plus/integrations/providers/bitbucket.d.ts +84 -0
  655. package/dist/plus/integrations/providers/bitbucket.d.ts.map +1 -0
  656. package/dist/plus/integrations/providers/bitbucket.js +477 -0
  657. package/dist/plus/integrations/providers/bitbucket.js.map +1 -0
  658. package/dist/plus/integrations/providers/github/github.d.ts +5 -0
  659. package/dist/plus/integrations/providers/github/github.d.ts.map +1 -0
  660. package/dist/plus/integrations/providers/github/github.js +47 -0
  661. package/dist/plus/integrations/providers/github/github.js.map +1 -0
  662. package/dist/plus/integrations/providers/github/github.utils.d.ts +11 -0
  663. package/dist/plus/integrations/providers/github/github.utils.d.ts.map +1 -0
  664. package/dist/plus/integrations/providers/github/github.utils.js +6 -0
  665. package/dist/plus/integrations/providers/github/github.utils.js.map +1 -0
  666. package/dist/plus/integrations/providers/github/models.d.ts +3 -0
  667. package/dist/plus/integrations/providers/github/models.d.ts.map +1 -0
  668. package/dist/plus/integrations/providers/github/models.js +2 -0
  669. package/dist/plus/integrations/providers/github/models.js.map +1 -0
  670. package/dist/plus/integrations/providers/github.d.ts +116 -0
  671. package/dist/plus/integrations/providers/github.d.ts.map +1 -0
  672. package/dist/plus/integrations/providers/github.js +445 -0
  673. package/dist/plus/integrations/providers/github.js.map +1 -0
  674. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +71 -0
  675. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts.map +1 -0
  676. package/dist/plus/integrations/providers/gitlab/gitlab.js +902 -0
  677. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -0
  678. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts +27 -0
  679. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts.map +1 -0
  680. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js +53 -0
  681. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js.map +1 -0
  682. package/dist/plus/integrations/providers/gitlab/models.d.ts +138 -0
  683. package/dist/plus/integrations/providers/gitlab/models.d.ts.map +1 -0
  684. package/dist/plus/integrations/providers/gitlab/models.js +99 -0
  685. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -0
  686. package/dist/plus/integrations/providers/gitlab.d.ts +124 -0
  687. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -0
  688. package/dist/plus/integrations/providers/gitlab.js +519 -0
  689. package/dist/plus/integrations/providers/gitlab.js.map +1 -0
  690. package/dist/plus/integrations/providers/jira.d.ts +57 -0
  691. package/dist/plus/integrations/providers/jira.d.ts.map +1 -0
  692. package/dist/plus/integrations/providers/jira.js +425 -0
  693. package/dist/plus/integrations/providers/jira.js.map +1 -0
  694. package/dist/plus/integrations/providers/linear.d.ts +58 -0
  695. package/dist/plus/integrations/providers/linear.d.ts.map +1 -0
  696. package/dist/plus/integrations/providers/linear.js +304 -0
  697. package/dist/plus/integrations/providers/linear.js.map +1 -0
  698. package/dist/plus/integrations/providers/models.d.ts +712 -0
  699. package/dist/plus/integrations/providers/models.d.ts.map +1 -0
  700. package/dist/plus/integrations/providers/models.js +850 -0
  701. package/dist/plus/integrations/providers/models.js.map +1 -0
  702. package/dist/plus/integrations/providers/providersApi.d.ts +262 -0
  703. package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -0
  704. package/dist/plus/integrations/providers/providersApi.js +1033 -0
  705. package/dist/plus/integrations/providers/providersApi.js.map +1 -0
  706. package/dist/plus/integrations/providers/trello.d.ts +47 -0
  707. package/dist/plus/integrations/providers/trello.d.ts.map +1 -0
  708. package/dist/plus/integrations/providers/trello.js +141 -0
  709. package/dist/plus/integrations/providers/trello.js.map +1 -0
  710. package/dist/plus/integrations/providers/utils/providerPaging.d.ts +29 -0
  711. package/dist/plus/integrations/providers/utils/providerPaging.d.ts.map +1 -0
  712. package/dist/plus/integrations/providers/utils/providerPaging.js +154 -0
  713. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -0
  714. package/dist/plus/integrations/providers/utils.d.ts +75 -0
  715. package/dist/plus/integrations/providers/utils.d.ts.map +1 -0
  716. package/dist/plus/integrations/providers/utils.js +313 -0
  717. package/dist/plus/integrations/providers/utils.js.map +1 -0
  718. package/dist/plus/integrations/reads/context.d.ts +52 -0
  719. package/dist/plus/integrations/reads/context.d.ts.map +1 -0
  720. package/dist/plus/integrations/reads/context.js +2 -0
  721. package/dist/plus/integrations/reads/context.js.map +1 -0
  722. package/dist/plus/integrations/reads/cursors.d.ts +66 -0
  723. package/dist/plus/integrations/reads/cursors.d.ts.map +1 -0
  724. package/dist/plus/integrations/reads/cursors.js +133 -0
  725. package/dist/plus/integrations/reads/cursors.js.map +1 -0
  726. package/dist/plus/integrations/reads/drains.d.ts +60 -0
  727. package/dist/plus/integrations/reads/drains.d.ts.map +1 -0
  728. package/dist/plus/integrations/reads/drains.js +255 -0
  729. package/dist/plus/integrations/reads/drains.js.map +1 -0
  730. package/dist/plus/integrations/reads/filters.d.ts +81 -0
  731. package/dist/plus/integrations/reads/filters.d.ts.map +1 -0
  732. package/dist/plus/integrations/reads/filters.js +87 -0
  733. package/dist/plus/integrations/reads/filters.js.map +1 -0
  734. package/dist/plus/integrations/reads/hierarchy.d.ts +17 -0
  735. package/dist/plus/integrations/reads/hierarchy.d.ts.map +1 -0
  736. package/dist/plus/integrations/reads/hierarchy.js +348 -0
  737. package/dist/plus/integrations/reads/hierarchy.js.map +1 -0
  738. package/dist/plus/integrations/reads/hierarchy.utils.d.ts +53 -0
  739. package/dist/plus/integrations/reads/hierarchy.utils.d.ts.map +1 -0
  740. package/dist/plus/integrations/reads/hierarchy.utils.js +85 -0
  741. package/dist/plus/integrations/reads/hierarchy.utils.js.map +1 -0
  742. package/dist/plus/integrations/reads/issueTracker.d.ts +19 -0
  743. package/dist/plus/integrations/reads/issueTracker.d.ts.map +1 -0
  744. package/dist/plus/integrations/reads/issueTracker.js +346 -0
  745. package/dist/plus/integrations/reads/issueTracker.js.map +1 -0
  746. package/dist/plus/integrations/reads/issues.d.ts +34 -0
  747. package/dist/plus/integrations/reads/issues.d.ts.map +1 -0
  748. package/dist/plus/integrations/reads/issues.js +244 -0
  749. package/dist/plus/integrations/reads/issues.js.map +1 -0
  750. package/dist/plus/integrations/reads/paging.d.ts +136 -0
  751. package/dist/plus/integrations/reads/paging.d.ts.map +1 -0
  752. package/dist/plus/integrations/reads/paging.js +221 -0
  753. package/dist/plus/integrations/reads/paging.js.map +1 -0
  754. package/dist/plus/integrations/reads/pullRequests.d.ts +32 -0
  755. package/dist/plus/integrations/reads/pullRequests.d.ts.map +1 -0
  756. package/dist/plus/integrations/reads/pullRequests.js +151 -0
  757. package/dist/plus/integrations/reads/pullRequests.js.map +1 -0
  758. package/dist/plus/integrations/reads/warnings.d.ts +47 -0
  759. package/dist/plus/integrations/reads/warnings.d.ts.map +1 -0
  760. package/dist/plus/integrations/reads/warnings.js +81 -0
  761. package/dist/plus/integrations/reads/warnings.js.map +1 -0
  762. package/dist/plus/integrations/results.d.ts +189 -0
  763. package/dist/plus/integrations/results.d.ts.map +1 -0
  764. package/dist/plus/integrations/results.js +62 -0
  765. package/dist/plus/integrations/results.js.map +1 -0
  766. package/dist/plus/integrations/telemetry.d.ts +26 -0
  767. package/dist/plus/integrations/telemetry.d.ts.map +1 -0
  768. package/dist/plus/integrations/telemetry.js +11 -0
  769. package/dist/plus/integrations/telemetry.js.map +1 -0
  770. package/dist/plus/integrations/utils/domain.utils.d.ts +5 -0
  771. package/dist/plus/integrations/utils/domain.utils.d.ts.map +1 -0
  772. package/dist/plus/integrations/utils/domain.utils.js +27 -0
  773. package/dist/plus/integrations/utils/domain.utils.js.map +1 -0
  774. package/dist/plus/integrations/utils/integration.utils.d.ts +40 -0
  775. package/dist/plus/integrations/utils/integration.utils.d.ts.map +1 -0
  776. package/dist/plus/integrations/utils/integration.utils.js +182 -0
  777. package/dist/plus/integrations/utils/integration.utils.js.map +1 -0
  778. package/dist/utils/array.d.ts.map +1 -1
  779. package/dist/utils/array.js.map +1 -1
  780. package/dist/utils/brand.d.ts.map +1 -1
  781. package/dist/utils/cancellation.d.ts +13 -0
  782. package/dist/utils/cancellation.d.ts.map +1 -1
  783. package/dist/utils/cancellation.js +52 -7
  784. package/dist/utils/cancellation.js.map +1 -1
  785. package/dist/utils/charCode.d.ts.map +1 -1
  786. package/dist/utils/coalescedRun.d.ts +16 -0
  787. package/dist/utils/coalescedRun.d.ts.map +1 -0
  788. package/dist/utils/coalescedRun.js +43 -0
  789. package/dist/utils/coalescedRun.js.map +1 -0
  790. package/dist/utils/color.d.ts.map +1 -1
  791. package/dist/utils/color.js +3 -3
  792. package/dist/utils/color.js.map +1 -1
  793. package/dist/utils/date.d.ts +24 -0
  794. package/dist/utils/date.d.ts.map +1 -1
  795. package/dist/utils/date.js +62 -0
  796. package/dist/utils/date.js.map +1 -1
  797. package/dist/utils/debounce.js +1 -1
  798. package/dist/utils/debounce.js.map +1 -1
  799. package/dist/utils/decorators/debounce.d.ts.map +1 -1
  800. package/dist/utils/decorators/debounce.js.map +1 -1
  801. package/dist/utils/decorators/gate.d.ts.map +1 -1
  802. package/dist/utils/decorators/gate.js +2 -2
  803. package/dist/utils/decorators/gate.js.map +1 -1
  804. package/dist/utils/decorators/log.d.ts.map +1 -1
  805. package/dist/utils/decorators/log.js +5 -5
  806. package/dist/utils/decorators/log.js.map +1 -1
  807. package/dist/utils/decorators/memoize.d.ts.map +1 -1
  808. package/dist/utils/decorators/memoize.js +2 -2
  809. package/dist/utils/decorators/memoize.js.map +1 -1
  810. package/dist/utils/decorators/resolver.d.ts.map +1 -1
  811. package/dist/utils/decorators/resolver.js.map +1 -1
  812. package/dist/utils/decorators/sequentialize.d.ts.map +1 -1
  813. package/dist/utils/decorators/sequentialize.js +2 -2
  814. package/dist/utils/decorators/sequentialize.js.map +1 -1
  815. package/dist/utils/decorators/serializable.d.ts.map +1 -1
  816. package/dist/utils/decorators/serializable.js +1 -1
  817. package/dist/utils/decorators/serializable.js.map +1 -1
  818. package/dist/utils/dedupedAsyncCache.d.ts.map +1 -1
  819. package/dist/utils/disposable.d.ts +15 -2
  820. package/dist/utils/disposable.d.ts.map +1 -1
  821. package/dist/utils/disposable.js.map +1 -1
  822. package/dist/utils/env/browser/base64.d.ts.map +1 -1
  823. package/dist/utils/env/browser/base64.js.map +1 -1
  824. package/dist/utils/env/browser/crypto.d.ts.map +1 -1
  825. package/dist/utils/env/browser/crypto.js.map +1 -1
  826. package/dist/utils/env/browser/fs.d.ts.map +1 -1
  827. package/dist/utils/env/browser/fs.js.map +1 -1
  828. package/dist/utils/env/browser/hex.d.ts.map +1 -1
  829. package/dist/utils/env/browser/hex.js.map +1 -1
  830. package/dist/utils/env/browser/hrtime.d.ts.map +1 -1
  831. package/dist/utils/env/browser/hrtime.js.map +1 -1
  832. package/dist/utils/env/browser/logScope.d.ts.map +1 -1
  833. package/dist/utils/env/browser/logScope.js.map +1 -1
  834. package/dist/utils/env/browser/md5.d.ts.map +1 -1
  835. package/dist/utils/env/browser/md5.js.map +1 -1
  836. package/dist/utils/env/browser/platform.d.ts.map +1 -1
  837. package/dist/utils/env/browser/platform.js.map +1 -1
  838. package/dist/utils/env/node/base64.d.ts.map +1 -1
  839. package/dist/utils/env/node/base64.js.map +1 -1
  840. package/dist/utils/env/node/crypto.d.ts.map +1 -1
  841. package/dist/utils/env/node/crypto.js.map +1 -1
  842. package/dist/utils/env/node/exec.d.ts +9 -1
  843. package/dist/utils/env/node/exec.d.ts.map +1 -1
  844. package/dist/utils/env/node/exec.js +11 -4
  845. package/dist/utils/env/node/exec.js.map +1 -1
  846. package/dist/utils/env/node/fs.d.ts.map +1 -1
  847. package/dist/utils/env/node/fs.js.map +1 -1
  848. package/dist/utils/env/node/hex.d.ts.map +1 -1
  849. package/dist/utils/env/node/hex.js.map +1 -1
  850. package/dist/utils/env/node/hrtime.d.ts.map +1 -1
  851. package/dist/utils/env/node/hrtime.js.map +1 -1
  852. package/dist/utils/env/node/logScope.d.ts.map +1 -1
  853. package/dist/utils/env/node/logScope.js.map +1 -1
  854. package/dist/utils/env/node/platform.d.ts.map +1 -1
  855. package/dist/utils/env/node/platform.js.map +1 -1
  856. package/dist/utils/event.d.ts.map +1 -1
  857. package/dist/utils/event.js +18 -22
  858. package/dist/utils/event.js.map +1 -1
  859. package/dist/utils/formatter.d.ts.map +1 -1
  860. package/dist/utils/formatter.js.map +1 -1
  861. package/dist/utils/function.d.ts.map +1 -1
  862. package/dist/utils/function.js +3 -3
  863. package/dist/utils/function.js.map +1 -1
  864. package/dist/utils/hash.js.map +1 -1
  865. package/dist/utils/iterable.d.ts.map +1 -1
  866. package/dist/utils/iterable.js +2 -6
  867. package/dist/utils/iterable.js.map +1 -1
  868. package/dist/utils/lazy.d.ts.map +1 -1
  869. package/dist/utils/lazy.js.map +1 -1
  870. package/dist/utils/logger.d.ts.map +1 -1
  871. package/dist/utils/logger.js +1 -1
  872. package/dist/utils/logger.js.map +1 -1
  873. package/dist/utils/logger.scoped.js +1 -1
  874. package/dist/utils/logger.scoped.js.map +1 -1
  875. package/dist/utils/lruMap.d.ts.map +1 -1
  876. package/dist/utils/lruMap.js.map +1 -1
  877. package/dist/utils/mru.d.ts.map +1 -1
  878. package/dist/utils/mru.js.map +1 -1
  879. package/dist/utils/object.js.map +1 -1
  880. package/dist/utils/paging.d.ts +29 -0
  881. package/dist/utils/paging.d.ts.map +1 -1
  882. package/dist/utils/paging.js +18 -0
  883. package/dist/utils/paging.js.map +1 -1
  884. package/dist/utils/path.js.map +1 -1
  885. package/dist/utils/promise.d.ts +10 -0
  886. package/dist/utils/promise.d.ts.map +1 -1
  887. package/dist/utils/promise.js +26 -3
  888. package/dist/utils/promise.js.map +1 -1
  889. package/dist/utils/promiseCache.d.ts +12 -2
  890. package/dist/utils/promiseCache.d.ts.map +1 -1
  891. package/dist/utils/promiseCache.js +80 -50
  892. package/dist/utils/promiseCache.js.map +1 -1
  893. package/dist/utils/searchTree.d.ts.map +1 -1
  894. package/dist/utils/searchTree.js +4 -1
  895. package/dist/utils/searchTree.js.map +1 -1
  896. package/dist/utils/stopwatch.d.ts.map +1 -1
  897. package/dist/utils/string.js +1 -1
  898. package/dist/utils/string.js.map +1 -1
  899. package/dist/utils/subscriptionManager.d.ts.map +1 -1
  900. package/dist/utils/subscriptionManager.js.map +1 -1
  901. package/dist/utils/trie.d.ts.map +1 -1
  902. package/dist/utils/trie.js +1 -0
  903. package/dist/utils/trie.js.map +1 -1
  904. package/docs/integrations.md +372 -0
  905. package/docs/kepler-read-api-parity.md +112 -0
  906. package/package.json +238 -172
  907. package/src/git/cache.ts +75 -8
  908. package/src/git/context.ts +4 -3
  909. package/src/git/errors.ts +36 -1
  910. package/src/git/models/commit.ts +1 -1
  911. package/src/git/models/graph.ts +147 -0
  912. package/src/git/models/graphSession.ts +205 -0
  913. package/src/git/models/issue.ts +12 -1
  914. package/src/git/models/pullRequest.ts +27 -1
  915. package/src/git/models/repository.ts +24 -1
  916. package/src/git/models/resourceDescriptor.ts +17 -0
  917. package/src/git/models/signature.ts +16 -0
  918. package/src/git/models/tag.ts +6 -1
  919. package/src/git/parsers/diffParser.ts +1 -1
  920. package/src/git/providers/branches.ts +6 -1
  921. package/src/git/providers/commits.ts +6 -1
  922. package/src/git/providers/config.ts +5 -1
  923. package/src/git/providers/graph.ts +69 -2
  924. package/src/git/providers/operations.ts +1 -1
  925. package/src/git/providers/status.ts +1 -1
  926. package/src/git/providers/worktrees.ts +17 -3
  927. package/src/git/remotes/azure-devops.ts +29 -33
  928. package/src/git/remotes/bitbucket-server.ts +23 -25
  929. package/src/git/remotes/bitbucket.ts +23 -25
  930. package/src/git/remotes/gerrit.ts +12 -14
  931. package/src/git/remotes/gitea.ts +13 -15
  932. package/src/git/remotes/github.ts +56 -58
  933. package/src/git/remotes/gitlab.ts +102 -104
  934. package/src/git/run.types.ts +54 -4
  935. package/src/git/utils/branch.utils.ts +12 -1
  936. package/src/git/utils/conflictResolution.utils.ts +126 -0
  937. package/src/git/utils/contributor.utils.ts +1 -1
  938. package/src/git/utils/fileStatus.utils.ts +7 -0
  939. package/src/git/utils/graph.utils.ts +46 -0
  940. package/src/git/utils/issue.utils.ts +1 -0
  941. package/src/git/utils/pullRequest.utils.ts +9 -0
  942. package/src/git/utils/reachability.utils.ts +79 -8
  943. package/src/git/utils/sshKey.utils.ts +30 -0
  944. package/src/git/watching/watchService.ts +16 -1
  945. package/src/git/watching/watchSession.ts +20 -2
  946. package/src/git-cli/exec/git.ts +144 -42
  947. package/src/git-cli/parsers/logParser.ts +83 -1
  948. package/src/git-cli/parsers/sshSignatureParser.ts +85 -0
  949. package/src/git-cli/parsers/worktreeParser.ts +5 -7
  950. package/src/git-cli/providers/branches.ts +60 -38
  951. package/src/git-cli/providers/commits.ts +102 -9
  952. package/src/git-cli/providers/graph.ts +1771 -393
  953. package/src/git-cli/providers/operations.ts +22 -2
  954. package/src/git-cli/providers/pausedOperations.ts +3 -3
  955. package/src/git-cli/providers/revision.ts +42 -0
  956. package/src/git-cli/providers/status.ts +333 -178
  957. package/src/git-cli/providers/tags.ts +2 -0
  958. package/src/git-cli/providers/worktrees.ts +57 -6
  959. package/src/git-cli/service.ts +9 -0
  960. package/src/ipc/ipcServer.ts +1 -1
  961. package/src/plus/agents/providers/claudeCodeProvider.ts +25 -0
  962. package/src/plus/agents/providers/claudeCodeTranscript.ts +320 -8
  963. package/src/plus/agents/types.ts +34 -0
  964. package/src/plus/ai/constants.ts +1 -9
  965. package/src/plus/ai/models/model.ts +53 -2
  966. package/src/plus/ai/models/promptTemplates.ts +9 -2
  967. package/src/plus/ai/prompts.ts +16 -48
  968. package/src/plus/ai/providers/anthropicProvider.ts +45 -3
  969. package/src/plus/ai/providers/deepSeekProvider.ts +17 -1
  970. package/src/plus/ai/providers/geminiProvider.ts +25 -6
  971. package/src/plus/ai/providers/gitkrakenProvider.ts +2 -0
  972. package/src/plus/ai/providers/huggingFaceProvider.ts +28 -21
  973. package/src/plus/ai/providers/openAICompatibleProviderBase.ts +16 -1
  974. package/src/plus/ai/providers/xaiProvider.ts +14 -1
  975. package/src/plus/ai/utils/ai.utils.ts +5 -7
  976. package/src/plus/ai/utils/results.utils.ts +32 -0
  977. package/src/plus/ai/utils/truncation.utils.ts +0 -1
  978. package/src/plus/git-github/api/github.ts +497 -129
  979. package/src/plus/git-github/models.ts +33 -0
  980. package/src/plus/git-github/providers/github/branches.ts +6 -3
  981. package/src/plus/git-github/providers/github/diff.ts +1 -1
  982. package/src/plus/git-github/providers/github/graph.ts +131 -0
  983. package/src/plus/git-github/providers/github/tags.ts +2 -0
  984. package/src/plus/integrations/authentication/cloudIntegrationService.ts +292 -0
  985. package/src/plus/integrations/authentication/configuredIntegrationService.ts +651 -0
  986. package/src/plus/integrations/authentication/integrationAuthenticationProvider.ts +363 -0
  987. package/src/plus/integrations/authentication/integrationAuthenticationService.ts +148 -0
  988. package/src/plus/integrations/authentication/manualTokenProvider.ts +79 -0
  989. package/src/plus/integrations/authentication/models.ts +202 -0
  990. package/src/plus/integrations/collectionMetadata.ts +143 -0
  991. package/src/plus/integrations/constants.ts +190 -0
  992. package/src/plus/integrations/context.ts +382 -0
  993. package/src/plus/integrations/errors.ts +184 -0
  994. package/src/plus/integrations/index.ts +216 -0
  995. package/src/plus/integrations/integrationService.ts +2589 -0
  996. package/src/plus/integrations/lite.ts +233 -0
  997. package/src/plus/integrations/manager.ts +359 -0
  998. package/src/plus/integrations/models/gitHostIntegration.ts +1631 -0
  999. package/src/plus/integrations/models/integration.ts +926 -0
  1000. package/src/plus/integrations/models/issuesIntegration.ts +264 -0
  1001. package/src/plus/integrations/providerFilters.ts +12 -0
  1002. package/src/plus/integrations/providers/apiClients.ts +69 -0
  1003. package/src/plus/integrations/providers/apiConfig.ts +71 -0
  1004. package/src/plus/integrations/providers/azure/azure.ts +822 -0
  1005. package/src/plus/integrations/providers/azure/models.ts +618 -0
  1006. package/src/plus/integrations/providers/azureDevOps.ts +1342 -0
  1007. package/src/plus/integrations/providers/bitbucket/bitbucket.ts +904 -0
  1008. package/src/plus/integrations/providers/bitbucket/models.ts +445 -0
  1009. package/src/plus/integrations/providers/bitbucket-server/models.ts +283 -0
  1010. package/src/plus/integrations/providers/bitbucket-server.ts +447 -0
  1011. package/src/plus/integrations/providers/bitbucket.ts +794 -0
  1012. package/src/plus/integrations/providers/github/github.ts +64 -0
  1013. package/src/plus/integrations/providers/github/github.utils.ts +23 -0
  1014. package/src/plus/integrations/providers/github/models.ts +29 -0
  1015. package/src/plus/integrations/providers/github.ts +750 -0
  1016. package/src/plus/integrations/providers/gitlab/gitlab.ts +1320 -0
  1017. package/src/plus/integrations/providers/gitlab/gitlab.utils.ts +80 -0
  1018. package/src/plus/integrations/providers/gitlab/models.ts +271 -0
  1019. package/src/plus/integrations/providers/gitlab.ts +832 -0
  1020. package/src/plus/integrations/providers/jira.ts +564 -0
  1021. package/src/plus/integrations/providers/linear.ts +402 -0
  1022. package/src/plus/integrations/providers/models.ts +1622 -0
  1023. package/src/plus/integrations/providers/providersApi.ts +1889 -0
  1024. package/src/plus/integrations/providers/trello.ts +205 -0
  1025. package/src/plus/integrations/providers/utils/providerPaging.ts +177 -0
  1026. package/src/plus/integrations/providers/utils.ts +419 -0
  1027. package/src/plus/integrations/reads/context.ts +75 -0
  1028. package/src/plus/integrations/reads/cursors.ts +224 -0
  1029. package/src/plus/integrations/reads/drains.ts +343 -0
  1030. package/src/plus/integrations/reads/filters.ts +124 -0
  1031. package/src/plus/integrations/reads/hierarchy.ts +493 -0
  1032. package/src/plus/integrations/reads/hierarchy.utils.ts +106 -0
  1033. package/src/plus/integrations/reads/issueTracker.ts +480 -0
  1034. package/src/plus/integrations/reads/issues.ts +407 -0
  1035. package/src/plus/integrations/reads/paging.ts +277 -0
  1036. package/src/plus/integrations/reads/pullRequests.ts +267 -0
  1037. package/src/plus/integrations/reads/warnings.ts +170 -0
  1038. package/src/plus/integrations/results.ts +275 -0
  1039. package/src/plus/integrations/telemetry.ts +29 -0
  1040. package/src/plus/integrations/utils/domain.utils.ts +26 -0
  1041. package/src/plus/integrations/utils/integration.utils.ts +215 -0
  1042. package/src/utils/brand.ts +0 -2
  1043. package/src/utils/cancellation.ts +56 -7
  1044. package/src/utils/coalescedRun.ts +45 -0
  1045. package/src/utils/color.ts +3 -3
  1046. package/src/utils/date.ts +72 -0
  1047. package/src/utils/debounce.ts +1 -1
  1048. package/src/utils/decorators/gate.ts +2 -2
  1049. package/src/utils/decorators/log.ts +5 -5
  1050. package/src/utils/decorators/memoize.ts +2 -2
  1051. package/src/utils/decorators/sequentialize.ts +2 -2
  1052. package/src/utils/decorators/serializable.ts +1 -1
  1053. package/src/utils/disposable.ts +15 -2
  1054. package/src/utils/env/node/exec.ts +20 -5
  1055. package/src/utils/event.ts +19 -25
  1056. package/src/utils/function.ts +3 -3
  1057. package/src/utils/iterable.ts +2 -6
  1058. package/src/utils/logger.scoped.ts +1 -1
  1059. package/src/utils/logger.ts +1 -1
  1060. package/src/utils/paging.ts +46 -0
  1061. package/src/utils/promise.ts +33 -3
  1062. package/src/utils/promiseCache.ts +81 -51
  1063. package/src/utils/searchTree.ts +4 -2
  1064. package/src/utils/string.ts +1 -1
  1065. package/src/utils/trie.ts +1 -0
  1066. package/dist/plus/ai/providers/githubModelsProvider.d.ts +0 -19
  1067. package/dist/plus/ai/providers/githubModelsProvider.d.ts.map +0 -1
  1068. package/dist/plus/ai/providers/githubModelsProvider.js +0 -51
  1069. package/dist/plus/ai/providers/githubModelsProvider.js.map +0 -1
  1070. package/src/plus/ai/providers/githubModelsProvider.ts +0 -92
@@ -0,0 +1,1631 @@
1
+ import type { CollectionMetadata, CollectionScopeFailure } from '@gitkraken/provider-apis';
2
+ import type { Account, UnidentifiedAuthor } from '../../../git/models/author.js';
3
+ import type { DefaultBranch } from '../../../git/models/defaultBranch.js';
4
+ import type { IssueShape, IssueStateFilter } from '../../../git/models/issue.js';
5
+ import type { IssueOrPullRequestState as PullRequestState } from '../../../git/models/issueOrPullRequest.js';
6
+ import type { PullRequest, PullRequestMergeMethod, PullRequestStateFilter } from '../../../git/models/pullRequest.js';
7
+ import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata.js';
8
+ import type { ResourceDescriptor } from '../../../git/models/resourceDescriptor.js';
9
+ import type { PullRequestUrlIdentity } from '../../../git/utils/pullRequest.utils.js';
10
+ import { gate } from '../../../utils/decorators/gate.js';
11
+ import { trace } from '../../../utils/decorators/log.js';
12
+ import { first } from '../../../utils/iterable.js';
13
+ import { Logger } from '../../../utils/logger.js';
14
+ import { getScopedLogger } from '../../../utils/logger.scoped.js';
15
+ import type { PagedResult } from '../../../utils/paging.js';
16
+ import type { ProviderAuthenticationSession } from '../authentication/models.js';
17
+ import { toTokenWithInfo } from '../authentication/models.js';
18
+ import { toCollectionScopeFailure } from '../collectionMetadata.js';
19
+ import type { IntegrationIds } from '../constants.js';
20
+ import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId } from '../constants.js';
21
+ import { toError } from '../errors.js';
22
+ import type {
23
+ GetIssuesOptions,
24
+ GetPullRequestsOptions,
25
+ PagedProjectInput,
26
+ PagedRepoInput,
27
+ ProviderAccount,
28
+ ProviderApiPagedResult,
29
+ ProviderHierarchyResult,
30
+ ProviderIssue,
31
+ ProviderOrganization,
32
+ ProviderPullRequest,
33
+ ProviderRepoInput,
34
+ ProviderReposInput,
35
+ ProviderRepository,
36
+ } from '../providers/models.js';
37
+ import {
38
+ IssueFilter,
39
+ PagingMode,
40
+ PullRequestFilter,
41
+ toIssueShape,
42
+ toProviderIssueStates,
43
+ toProviderPullRequestStates,
44
+ } from '../providers/models.js';
45
+ import type { ProvidersApi } from '../providers/providersApi.js';
46
+ import { mergeCollectionMetadata } from '../providers/utils/providerPaging.js';
47
+ import type { IntegrationResult, IntegrationType } from './integration.js';
48
+ import { IntegrationBase } from './integration.js';
49
+
50
+ function isAzureDevOpsProvider(
51
+ providerId: IntegrationIds,
52
+ ): providerId is GitCloudHostIntegrationId.AzureDevOps | GitSelfManagedHostIntegrationId.AzureDevOpsServer {
53
+ return (
54
+ providerId === GitCloudHostIntegrationId.AzureDevOps ||
55
+ providerId === GitSelfManagedHostIntegrationId.AzureDevOpsServer
56
+ );
57
+ }
58
+
59
+ function normalizeSelfManagedBaseUrl(domain: string | undefined, protocol: string | undefined): string | undefined {
60
+ const value = domain?.trim();
61
+ if (!value) return undefined;
62
+
63
+ if (/^[a-z][a-z\d+\-.]*:\/\//i.test(value)) {
64
+ try {
65
+ const url = new URL(value);
66
+ return `${url.protocol}//${url.host}${url.pathname.replace(/\/+$/, '')}`;
67
+ } catch {
68
+ return undefined;
69
+ }
70
+ }
71
+
72
+ const scheme = protocol ?? 'https:';
73
+ try {
74
+ const url = new URL(`${scheme}//${value}`);
75
+ return `${url.protocol}//${url.host}${url.pathname.replace(/\/+$/, '')}`;
76
+ } catch {
77
+ return undefined;
78
+ }
79
+ }
80
+
81
+ function getSelfManagedApiBaseUrl(
82
+ providerId: IntegrationIds,
83
+ domain: string | undefined,
84
+ protocol: string | undefined,
85
+ ): string | undefined {
86
+ const baseUrl = normalizeSelfManagedBaseUrl(domain, protocol);
87
+ if (baseUrl == null) return undefined;
88
+
89
+ switch (providerId) {
90
+ case GitSelfManagedHostIntegrationId.CloudGitHubEnterprise:
91
+ return `${baseUrl.replace(/\/api(?:\/v\d+)?$/, '')}/api/v3`;
92
+ case GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted:
93
+ return baseUrl.replace(/\/api(?:\/v\d+)?$/, '');
94
+ case GitSelfManagedHostIntegrationId.BitbucketServer:
95
+ return `${baseUrl.replace(/\/rest\/api\/1\.0$/, '')}/rest/api/1.0`;
96
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
97
+ return baseUrl;
98
+ default:
99
+ return undefined;
100
+ }
101
+ }
102
+
103
+ export type SearchMyPullRequestsOptions = {
104
+ includeReviewRequested?: boolean;
105
+ };
106
+
107
+ export abstract class GitHostIntegration<
108
+ ID extends IntegrationIds = IntegrationIds,
109
+ T extends ResourceDescriptor = ResourceDescriptor,
110
+ > extends IntegrationBase<ID> {
111
+ readonly type: IntegrationType = 'git';
112
+
113
+ @gate()
114
+ @trace()
115
+ async getAccountForEmail(repo: T, email: string, options?: { avatarSize?: number }): Promise<Account | undefined> {
116
+ const scope = getScopedLogger();
117
+
118
+ const connected = this.maybeConnected ?? (await this.isConnected());
119
+ if (!connected) return undefined;
120
+
121
+ await this.refreshSessionIfExpired(scope);
122
+
123
+ try {
124
+ const author = await this.getProviderAccountForEmail(this._session!, repo, email, options);
125
+ this.resetRequestExceptionCount('getAccountForEmail');
126
+ return author;
127
+ } catch (ex) {
128
+ this.handleProviderException('getAccountForEmail', ex, { scope: scope });
129
+ return undefined;
130
+ }
131
+ }
132
+
133
+ protected abstract getProviderAccountForEmail(
134
+ session: ProviderAuthenticationSession,
135
+ repo: T,
136
+ email: string,
137
+ options?: { avatarSize?: number },
138
+ ): Promise<Account | undefined>;
139
+
140
+ /**
141
+ * Returns the SSH signing keys (full OpenSSH-format `<type> <key> [comment]` strings) registered by the accounts
142
+ * matching the given emails on this integration, for building an `allowed_signers` file. Keyed by lowercased email;
143
+ * emails with no match (and unsupported integrations) are absent. Batching the lookups is left to the integration.
144
+ */
145
+ @gate()
146
+ @trace()
147
+ async getSshSigningKeysForEmails(repo: T, emails: string[]): Promise<Map<string, string[]>> {
148
+ const scope = getScopedLogger();
149
+
150
+ const connected = this.maybeConnected ?? (await this.isConnected());
151
+ if (!connected) return new Map();
152
+
153
+ await this.refreshSessionIfExpired(scope);
154
+
155
+ try {
156
+ const keys = await this.getProviderSshSigningKeysForEmails(this._session!, repo, emails);
157
+ this.resetRequestExceptionCount('getSshSigningKeysForEmails');
158
+ return keys;
159
+ } catch (ex) {
160
+ this.handleProviderException('getSshSigningKeysForEmails', ex, { scope: scope });
161
+ return new Map();
162
+ }
163
+ }
164
+
165
+ /** Override in integrations that expose users' SSH signing keys. Defaults to none. */
166
+ protected getProviderSshSigningKeysForEmails(
167
+ _session: ProviderAuthenticationSession,
168
+ _repo: T,
169
+ _emails: string[],
170
+ ): Promise<Map<string, string[]>> {
171
+ return Promise.resolve(new Map<string, string[]>());
172
+ }
173
+
174
+ @gate()
175
+ @trace()
176
+ async getAccountForCommit(
177
+ repo: T,
178
+ rev: string,
179
+ options?: { avatarSize?: number },
180
+ ): Promise<Account | UnidentifiedAuthor | undefined> {
181
+ const scope = getScopedLogger();
182
+
183
+ const connected = this.maybeConnected ?? (await this.isConnected());
184
+ if (!connected) return undefined;
185
+
186
+ await this.refreshSessionIfExpired(scope);
187
+
188
+ try {
189
+ const author = await this.getProviderAccountForCommit(this._session!, repo, rev, options);
190
+ this.resetRequestExceptionCount('getAccountForCommit');
191
+ return author;
192
+ } catch (ex) {
193
+ this.handleProviderException('getAccountForCommit', ex, { scope: scope });
194
+ return undefined;
195
+ }
196
+ }
197
+
198
+ protected abstract getProviderAccountForCommit(
199
+ session: ProviderAuthenticationSession,
200
+ repo: T,
201
+ rev: string,
202
+ options?: { avatarSize?: number },
203
+ ): Promise<Account | UnidentifiedAuthor | undefined>;
204
+
205
+ @trace()
206
+ async getDefaultBranch(
207
+ repo: T,
208
+ options?: { cancellation?: AbortSignal; expiryOverride?: boolean | number },
209
+ ): Promise<DefaultBranch | undefined> {
210
+ const scope = getScopedLogger();
211
+
212
+ const connected = this.maybeConnected ?? (await this.isConnected());
213
+ if (!connected) return undefined;
214
+
215
+ await this.refreshSessionIfExpired(scope);
216
+
217
+ const defaultBranch = this.ctx.cache.getRepositoryDefaultBranch(
218
+ repo,
219
+ this,
220
+ () => ({
221
+ value: (async () => {
222
+ try {
223
+ const result = await this.getProviderDefaultBranch(this._session!, repo, options?.cancellation);
224
+ this.resetRequestExceptionCount('getDefaultBranch');
225
+ return result;
226
+ } catch (ex) {
227
+ this.handleProviderException('getDefaultBranch', ex, { scope: scope });
228
+ return undefined;
229
+ }
230
+ })(),
231
+ }),
232
+ { expiryOverride: options?.expiryOverride },
233
+ );
234
+ return defaultBranch;
235
+ }
236
+
237
+ getRepoInfo?(repo: {
238
+ owner: string;
239
+ name: string;
240
+ project?: string;
241
+ connectionId?: string;
242
+ }): Promise<ProviderRepository | undefined>;
243
+
244
+ protected abstract getProviderDefaultBranch(
245
+ { accessToken }: ProviderAuthenticationSession,
246
+ repo: T,
247
+ cancellation?: AbortSignal,
248
+ ): Promise<DefaultBranch | undefined>;
249
+
250
+ @trace()
251
+ async getRepositoryMetadata(
252
+ repo: T,
253
+ options?: { cancellation?: AbortSignal; expiryOverride?: boolean | number },
254
+ ): Promise<RepositoryMetadata | undefined> {
255
+ const scope = getScopedLogger();
256
+
257
+ const connected = this.maybeConnected ?? (await this.isConnected());
258
+ if (!connected) return undefined;
259
+
260
+ await this.refreshSessionIfExpired(scope);
261
+
262
+ const metadata = this.ctx.cache.getRepositoryMetadata(
263
+ repo,
264
+ this,
265
+ () => ({
266
+ value: (async () => {
267
+ try {
268
+ const result = await this.getProviderRepositoryMetadata(
269
+ this._session!,
270
+ repo,
271
+ options?.cancellation,
272
+ );
273
+ this.resetRequestExceptionCount('getRepositoryMetadata');
274
+ return result;
275
+ } catch (ex) {
276
+ this.handleProviderException('getRepositoryMetadata', ex, { scope: scope });
277
+ return undefined;
278
+ }
279
+ })(),
280
+ }),
281
+ { expiryOverride: options?.expiryOverride },
282
+ );
283
+ return metadata;
284
+ }
285
+
286
+ protected abstract getProviderRepositoryMetadata(
287
+ session: ProviderAuthenticationSession,
288
+ repo: T,
289
+ cancellation?: AbortSignal,
290
+ ): Promise<RepositoryMetadata | undefined>;
291
+
292
+ /**
293
+ * Lists the organizations (orgs/workspaces/groups) the current user belongs to on this host.
294
+ * `truncated === true` means the defensive page-drain backstop stopped before the upstream listing
295
+ * was exhausted.
296
+ */
297
+ async getOrganizationsForUser(): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined> {
298
+ return (await this.getOrganizationsForUserResult())?.value;
299
+ }
300
+
301
+ /**
302
+ * Whether this git host implements generic org discovery. False for providers that register no
303
+ * {@link getProviderOrganizationsForUser} hook (e.g. Bitbucket Data Center) — the facade uses this to
304
+ * report `unsupported` instead of a silent empty list, which is indistinguishable from "has no orgs".
305
+ */
306
+ get supportsOrganizationDiscovery(): boolean {
307
+ return this.getProviderOrganizationsForUser != null;
308
+ }
309
+
310
+ /** Whether this git host implements generic repository discovery ({@link getProviderRepositoriesForOrg}). */
311
+ get supportsRepositoryDiscovery(): boolean {
312
+ return this.getProviderRepositoriesForOrg != null;
313
+ }
314
+
315
+ /**
316
+ * Whether this git host has a project tier between org and repo ({@link getProviderProjectsForOrg}). Only
317
+ * Azure DevOps does; the facade uses this to skip the read entirely rather than call a core that returns
318
+ * `undefined` for a session-less reason and be misread as a broken connection.
319
+ */
320
+ get supportsProjectDiscovery(): boolean {
321
+ return this.getProviderProjectsForOrg != null;
322
+ }
323
+
324
+ /**
325
+ * Whether this git host implements the account-wide user-affiliated repository read
326
+ * ({@link getProviderRepositoriesForUser}) — the org-less `gk provider repos <provider>` equivalent.
327
+ */
328
+ get supportsUserRepositoryDiscovery(): boolean {
329
+ return this.getProviderRepositoriesForUser != null;
330
+ }
331
+
332
+ /**
333
+ * Whether this git host exposes issues on the ProviderBackend surface. Most git hosts do; a host with no
334
+ * usable issue tracker overrides this to false — Bitbucket Cloud (deprecated in favor of dedicated issue
335
+ * integrations like Jira) and Bitbucket Data Center (never had one) — so the facade reports issues as
336
+ * unsupported instead of serving a partial/deprecated source or failing inside a provider client that
337
+ * registers no issue function at all.
338
+ *
339
+ * Keep this in sync with {@link ProviderMetadata.supportedIssueFilters}: a provider that declares no issue
340
+ * filters and no issue read is answering the same capability question twice, and the two must agree.
341
+ */
342
+ get supportsIssues(): boolean {
343
+ return true;
344
+ }
345
+
346
+ /**
347
+ * Result-returning core of {@link getOrganizationsForUser}. Resolves the session for `connectionId`
348
+ * (or the primary connection when omitted, honoring multi-account reads) and recovers a thrown error
349
+ * into `{ error }` so callers can surface it as a warning instead of swallowing it to `undefined`.
350
+ */
351
+ @trace()
352
+ async getOrganizationsForUserResult(
353
+ connectionId?: string,
354
+ ): Promise<IntegrationResult<ProviderHierarchyResult<ProviderOrganization> | undefined>> {
355
+ const scope = getScopedLogger();
356
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
357
+ const session = await this.resolveReadSession(connectionId, scope);
358
+ if (session == null) return undefined;
359
+
360
+ const start = performance.now();
361
+ try {
362
+ const result = await this.getProviderOrganizationsForUser?.(session);
363
+ this.resetRequestExceptionCount('getOrganizationsForUser');
364
+ return { value: result, duration: performance.now() - start };
365
+ } catch (ex) {
366
+ this.handleProviderException('getOrganizationsForUser', ex, { scope: scope });
367
+ return { error: toError(ex), duration: performance.now() - start };
368
+ }
369
+ }
370
+
371
+ protected getProviderOrganizationsForUser?(
372
+ session: ProviderAuthenticationSession,
373
+ ): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined>;
374
+
375
+ /**
376
+ * Result-returning list of the projects a git host exposes beneath its orgs, unified into the
377
+ * {@link ProviderOrganization} shape. Only Azure DevOps has a project tier between org and repo; other
378
+ * git hosts have none and leave {@link getProviderProjectsForOrg} undefined, so this returns `undefined`
379
+ * for them (the ProviderBackend facade then treats them as having no projects). With `org`, scopes to
380
+ * that org's projects; without, returns projects across every org the user can see.
381
+ */
382
+ @trace()
383
+ async getProjectsForOrgResult(
384
+ org?: string,
385
+ connectionId?: string,
386
+ ): Promise<IntegrationResult<ProviderHierarchyResult<ProviderOrganization> | undefined>> {
387
+ const scope = getScopedLogger();
388
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
389
+ const session = await this.resolveReadSession(connectionId, scope);
390
+ if (session == null) return undefined;
391
+
392
+ if (this.getProviderProjectsForOrg == null) {
393
+ return undefined;
394
+ }
395
+
396
+ const start = performance.now();
397
+ try {
398
+ const result = await this.getProviderProjectsForOrg(session, org);
399
+ this.resetRequestExceptionCount('getProjectsForOrg');
400
+ return { value: result, duration: performance.now() - start };
401
+ } catch (ex) {
402
+ this.handleProviderException('getProjectsForOrg', ex, { scope: scope });
403
+ return { error: toError(ex), duration: performance.now() - start };
404
+ }
405
+ }
406
+
407
+ protected getProviderProjectsForOrg?(
408
+ session: ProviderAuthenticationSession,
409
+ org?: string,
410
+ ): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined>;
411
+
412
+ /**
413
+ * Lists repositories under the given organization (org/workspace/group) one page at a time — follow
414
+ * `paging.cursor` to page, or drain with the integrations provider paging helper.
415
+ * `options.project` is only meaningful for Azure DevOps, whose repos are scoped by `org` + `project`;
416
+ * every other host ignores it. (Azure without a project can't page its cross-project merge, so it
417
+ * returns all matches in a single page.) `truncated === true` means the defensive page-drain
418
+ * backstop stopped before the upstream listing was exhausted.
419
+ */
420
+ async getRepositoriesForOrg(
421
+ org: string,
422
+ options?: { project?: string; cursor?: string },
423
+ ): Promise<ProviderHierarchyResult<ProviderRepository> | undefined> {
424
+ return (await this.getRepositoriesForOrgResult(org, options))?.value;
425
+ }
426
+
427
+ /**
428
+ * Result-returning core of {@link getRepositoriesForOrg}. Resolves the session for `connectionId`
429
+ * (or the primary connection when omitted) and recovers a thrown error into `{ error }` for warnings.
430
+ */
431
+ @trace()
432
+ async getRepositoriesForOrgResult(
433
+ org: string,
434
+ options?: { project?: string; cursor?: string; connectionId?: string },
435
+ ): Promise<IntegrationResult<ProviderHierarchyResult<ProviderRepository> | undefined>> {
436
+ const scope = getScopedLogger();
437
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
438
+ const session = await this.resolveReadSession(options?.connectionId, scope);
439
+ if (session == null) return undefined;
440
+
441
+ const start = performance.now();
442
+ try {
443
+ const result = await this.getProviderRepositoriesForOrg?.(session, org, options);
444
+ this.resetRequestExceptionCount('getRepositoriesForOrg');
445
+ return { value: result, duration: performance.now() - start };
446
+ } catch (ex) {
447
+ this.handleProviderException('getRepositoriesForOrg', ex, { scope: scope });
448
+ return { error: toError(ex), duration: performance.now() - start };
449
+ }
450
+ }
451
+
452
+ protected getProviderRepositoriesForOrg?(
453
+ session: ProviderAuthenticationSession,
454
+ org: string,
455
+ options?: { project?: string; cursor?: string },
456
+ ): Promise<ProviderHierarchyResult<ProviderRepository> | undefined>;
457
+
458
+ /**
459
+ * Result-returning account-wide, user-affiliated repository read (the org-less
460
+ * `gk provider repos <provider>` equivalent): repositories the user owns, collaborates on, or can
461
+ * access through org membership — NOT every repo of every org. Optional: providers without a native
462
+ * user-affiliated listing (Bitbucket workspaces, Azure orgs, which require an org/workspace scope)
463
+ * leave the hook undefined and the facade reports the read as unsupported so callers fan out per org.
464
+ */
465
+ @trace()
466
+ async getRepositoriesForUserResult(options?: {
467
+ cursor?: string;
468
+ connectionId?: string;
469
+ }): Promise<IntegrationResult<ProviderHierarchyResult<ProviderRepository> | undefined>> {
470
+ const scope = getScopedLogger();
471
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
472
+ const session = await this.resolveReadSession(options?.connectionId, scope);
473
+ if (session == null) return undefined;
474
+
475
+ if (this.getProviderRepositoriesForUser == null) {
476
+ return undefined;
477
+ }
478
+
479
+ const start = performance.now();
480
+ try {
481
+ const result = await this.getProviderRepositoriesForUser(session, options);
482
+ this.resetRequestExceptionCount('getRepositoriesForUser');
483
+ return { value: result, duration: performance.now() - start };
484
+ } catch (ex) {
485
+ this.handleProviderException('getRepositoriesForUser', ex, { scope: scope });
486
+ return { error: toError(ex), duration: performance.now() - start };
487
+ }
488
+ }
489
+
490
+ protected getProviderRepositoriesForUser?(
491
+ session: ProviderAuthenticationSession,
492
+ options?: { cursor?: string },
493
+ ): Promise<ProviderHierarchyResult<ProviderRepository> | undefined>;
494
+
495
+ async mergePullRequest(pr: PullRequest, options?: { mergeMethod?: PullRequestMergeMethod }): Promise<boolean> {
496
+ const scope = getScopedLogger();
497
+
498
+ const connected = this.maybeConnected ?? (await this.isConnected());
499
+ if (!connected) return false;
500
+
501
+ await this.refreshSessionIfExpired(scope);
502
+
503
+ try {
504
+ const result = await this.mergeProviderPullRequest(this._session!, pr, options);
505
+ this.resetRequestExceptionCount('mergePullRequest');
506
+ return result;
507
+ } catch (ex) {
508
+ this.handleProviderException('mergePullRequest', ex, { scope: scope });
509
+ return false;
510
+ }
511
+ }
512
+
513
+ protected abstract mergeProviderPullRequest(
514
+ session: ProviderAuthenticationSession,
515
+ pr: PullRequest,
516
+ options?: { mergeMethod?: PullRequestMergeMethod },
517
+ ): Promise<boolean>;
518
+
519
+ @trace()
520
+ async getPullRequestForBranch(
521
+ repo: T,
522
+ branch: string,
523
+ options?: { avatarSize?: number; expiryOverride?: boolean | number; include?: PullRequestState[] },
524
+ ): Promise<PullRequest | undefined> {
525
+ const scope = getScopedLogger();
526
+
527
+ const connected = this.maybeConnected ?? (await this.isConnected());
528
+ if (!connected) return undefined;
529
+
530
+ await this.refreshSessionIfExpired(scope);
531
+
532
+ const { expiryOverride, ...opts } = options ?? {};
533
+
534
+ const pr = this.ctx.cache.getPullRequestForBranch(
535
+ branch,
536
+ repo,
537
+ this,
538
+ () => ({
539
+ value: (async () => {
540
+ try {
541
+ const result = await this.getProviderPullRequestForBranch(this._session!, repo, branch, opts);
542
+ this.resetRequestExceptionCount('getPullRequestForBranch');
543
+ return result;
544
+ } catch (ex) {
545
+ this.handleProviderException('getPullRequestForBranch', ex, { scope: scope });
546
+ return undefined;
547
+ }
548
+ })(),
549
+ }),
550
+ { expiryOverride: expiryOverride },
551
+ );
552
+ return pr;
553
+ }
554
+
555
+ protected abstract getProviderPullRequestForBranch(
556
+ session: ProviderAuthenticationSession,
557
+ repo: T,
558
+ branch: string,
559
+ options?: { avatarSize?: number; include?: PullRequestState[] },
560
+ ): Promise<PullRequest | undefined>;
561
+
562
+ @trace()
563
+ async getPullRequestForCommit(
564
+ repo: T,
565
+ rev: string,
566
+ options?: { expiryOverride?: boolean | number },
567
+ ): Promise<PullRequest | undefined> {
568
+ const scope = getScopedLogger();
569
+
570
+ const connected = this.maybeConnected ?? (await this.isConnected());
571
+ if (!connected) return undefined;
572
+
573
+ await this.refreshSessionIfExpired(scope);
574
+
575
+ const pr = this.ctx.cache.getPullRequestForSha(
576
+ rev,
577
+ repo,
578
+ this,
579
+ () => ({
580
+ value: (async () => {
581
+ try {
582
+ const result = await this.getProviderPullRequestForCommit(this._session!, repo, rev);
583
+ this.resetRequestExceptionCount('getPullRequestForCommit');
584
+ return result;
585
+ } catch (ex) {
586
+ this.handleProviderException('getPullRequestForCommit', ex, { scope: scope });
587
+ return undefined;
588
+ }
589
+ })(),
590
+ }),
591
+ options,
592
+ );
593
+ return pr;
594
+ }
595
+
596
+ protected abstract getProviderPullRequestForCommit(
597
+ session: ProviderAuthenticationSession,
598
+ repo: T,
599
+ rev: string,
600
+ ): Promise<PullRequest | undefined>;
601
+
602
+ /**
603
+ * Memoized identity lookups backing filter resolution. Keyed by the session's token fingerprint plus the
604
+ * scope of the lookup (base URL, and the Azure organization for the per-instance variant), so a different
605
+ * account, host, or org never reuses an entry and a rotated token simply misses.
606
+ *
607
+ * Not cleared when the token changes: one integration instance serves every connection of its provider
608
+ * (multi-account), so clearing on a fingerprint change would make two accounts reading in alternation
609
+ * evict each other and defeat the memo. Entries are bounded by tokens x hosts x orgs seen — a handful for
610
+ * the life of the integration.
611
+ */
612
+ private readonly _filterAccounts = new Map<string, Promise<ProviderAccount | undefined>>();
613
+
614
+ /**
615
+ * Resolves the account a repo-scoped read turns `IssueFilter`/`PullRequestFilter` into a provider
616
+ * login/id with, memoized per token+scope.
617
+ *
618
+ * Every FILTERED read needs this, and `ProvidersApi.getCurrentUser` is a bare round trip — unlike
619
+ * {@link IntegrationBase.getCurrentAccount}, which the host caches. So a consumer that fans ONE page out
620
+ * into several filtered reads paid one identity request PER read, all resolving the same account: a
621
+ * per-user-facet fan-out (author + assignee + review-requested) doubled its request count, and paid it
622
+ * again on every page turn.
623
+ *
624
+ * The promise is memoized rather than the value, so concurrent facets share one in-flight request instead
625
+ * of racing. A rejection is evicted so the next read retries rather than caching a failure — matching how
626
+ * `getCurrentAccount` invalidates on error.
627
+ */
628
+ private getFilterAccount(
629
+ api: ProvidersApi,
630
+ session: ProviderAuthenticationSession,
631
+ customUrl: string | undefined,
632
+ organization?: string,
633
+ ): Promise<ProviderAccount | undefined> {
634
+ const key = `${this.getSessionFingerprint(session)}:${customUrl ?? ''}:${organization ?? ''}`;
635
+
636
+ let pending = this._filterAccounts.get(key);
637
+ if (pending == null) {
638
+ const tokenWithInfo = toTokenWithInfo(this.authProvider.id, session);
639
+ pending = (
640
+ organization != null
641
+ ? api.getCurrentUserForInstance(tokenWithInfo, organization, { baseUrl: customUrl })
642
+ : api.getCurrentUser(tokenWithInfo, { baseUrl: customUrl })
643
+ ).catch((ex: unknown) => {
644
+ this._filterAccounts.delete(key);
645
+ throw ex;
646
+ });
647
+ this._filterAccounts.set(key, pending);
648
+ }
649
+
650
+ return pending;
651
+ }
652
+
653
+ async getMyIssuesForRepos(
654
+ reposOrRepoIds: ProviderReposInput,
655
+ options?: {
656
+ filters?: IssueFilter[];
657
+ cursor?: string;
658
+ customUrl?: string;
659
+ page?: number;
660
+ pageSize?: number;
661
+ /** When true, don't constrain to the current user's assigned issues even if the Assignee filter is set. */
662
+ includeAllAssignees?: boolean;
663
+ /** Issue states to include; when omitted the provider returns its default (open only). */
664
+ state?: IssueStateFilter;
665
+ },
666
+ connectionId?: string,
667
+ ): Promise<PagedResult<ProviderIssue> | undefined> {
668
+ return (await this.getMyIssuesForReposResult(reposOrRepoIds, options, connectionId))?.value;
669
+ }
670
+
671
+ /**
672
+ * Result-returning core of {@link getMyIssuesForRepos}. Resolves the session for `connectionId`
673
+ * (or the primary connection when omitted, so multi-account reads use the right token) and recovers
674
+ * thrown errors and validation failures into `{ error }` so callers can surface them as warnings
675
+ * rather than swallowing them to `undefined`.
676
+ */
677
+ async getMyIssuesForReposResult(
678
+ reposOrRepoIds: ProviderReposInput,
679
+ options?: {
680
+ filters?: IssueFilter[];
681
+ cursor?: string;
682
+ customUrl?: string;
683
+ page?: number;
684
+ pageSize?: number;
685
+ includeAllAssignees?: boolean;
686
+ state?: IssueStateFilter;
687
+ },
688
+ connectionId?: string,
689
+ ): Promise<IntegrationResult<(PagedResult<ProviderIssue> & { metadata?: CollectionMetadata }) | undefined>> {
690
+ const scope = getScopedLogger();
691
+ const providerId = this.authProvider.id;
692
+ const states = toProviderIssueStates(options?.state);
693
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary. The session
694
+ // is resolved here for connectivity/bail; the connection's token is applied per API call below.
695
+ const session = await this.resolveReadSession(connectionId, scope);
696
+ if (session == null) return undefined;
697
+
698
+ const start = performance.now();
699
+ const customUrl =
700
+ options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
701
+
702
+ const api = await this.getProvidersApi();
703
+ if (
704
+ providerId !== GitCloudHostIntegrationId.GitLab &&
705
+ (api.isRepoIdsInput(reposOrRepoIds) ||
706
+ (isAzureDevOpsProvider(providerId) &&
707
+ !reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
708
+ ) {
709
+ Logger.warn(`Unsupported input for provider ${providerId}`, 'getIssuesForRepos');
710
+ return {
711
+ error: new Error(`Unsupported input for provider ${providerId}`),
712
+ duration: performance.now() - start,
713
+ };
714
+ }
715
+
716
+ let getIssuesOptions: GetIssuesOptions | undefined;
717
+ if (isAzureDevOpsProvider(providerId)) {
718
+ const organizations = new Set<string>();
719
+ const projects = new Set<string>();
720
+ for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
721
+ organizations.add(repo.namespace);
722
+ projects.add(repo.project!);
723
+ }
724
+
725
+ if (organizations.size > 1) {
726
+ Logger.warn(`Multiple organizations not supported for provider ${providerId}`, 'getIssuesForRepos');
727
+ return {
728
+ error: new Error(`Multiple organizations not supported for provider ${providerId}`),
729
+ duration: performance.now() - start,
730
+ };
731
+ } else if (organizations.size === 0) {
732
+ Logger.warn(`No organizations found for provider ${providerId}`, 'getIssuesForRepos');
733
+ return {
734
+ error: new Error(`No organizations found for provider ${providerId}`),
735
+ duration: performance.now() - start,
736
+ };
737
+ }
738
+
739
+ const organization: string = first(organizations.values())!;
740
+
741
+ if (options?.filters != null) {
742
+ if (!api.providerSupportsIssueFilters(providerId, options.filters)) {
743
+ Logger.warn(`Unsupported filters for provider ${providerId}`, 'getIssuesForRepos');
744
+ return {
745
+ error: new Error(`Unsupported filters for provider ${providerId}`),
746
+ duration: performance.now() - start,
747
+ };
748
+ }
749
+
750
+ let userAccount: ProviderAccount | undefined;
751
+ try {
752
+ userAccount = await this.getFilterAccount(api, session, customUrl, organization);
753
+ } catch (ex) {
754
+ Logger.error(ex, 'getIssuesForRepos');
755
+ return { error: toError(ex), duration: performance.now() - start };
756
+ }
757
+
758
+ if (userAccount == null) {
759
+ Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
760
+ return {
761
+ error: new Error(`Unable to get current user for ${providerId}`),
762
+ duration: performance.now() - start,
763
+ };
764
+ }
765
+
766
+ const userFilterProperty = userAccount.name;
767
+
768
+ if (userFilterProperty == null) {
769
+ Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
770
+ return {
771
+ error: new Error(`Unable to get user property for filter for ${providerId}`),
772
+ duration: performance.now() - start,
773
+ };
774
+ }
775
+
776
+ getIssuesOptions = {
777
+ authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
778
+ assigneeLogins:
779
+ !options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
780
+ ? [userFilterProperty]
781
+ : undefined,
782
+ mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
783
+ };
784
+ }
785
+
786
+ const cursorInfo = this.parseCursorInfo<PagedProjectInput>(options?.cursor);
787
+ const cursors: PagedProjectInput[] = cursorInfo.cursors ?? [];
788
+ let projectInputs: PagedProjectInput[] = Array.from(projects.values(), project => ({
789
+ namespace: organization,
790
+ project: project,
791
+ cursor: undefined,
792
+ }));
793
+ if (cursors.length > 0) {
794
+ projectInputs = cursors;
795
+ }
796
+
797
+ try {
798
+ const cursor: { cursors: PagedProjectInput[]; page?: number } = { cursors: [] };
799
+ let hasMore = false;
800
+ let truncated = false;
801
+ let metadata: CollectionMetadata | undefined;
802
+ const data: ProviderIssue[] = [];
803
+ // `allSettled`, not `Promise.all`: one project's read rejecting must not discard every sibling
804
+ // project's already-fetched issues and cursors. A rejected project is recorded as a structured
805
+ // failure so the facade can warn and set `fetchFailed` instead of reporting a partial project set
806
+ // as complete.
807
+ const settled = await Promise.allSettled(
808
+ projectInputs.map(async projectInput => {
809
+ const results = await api.getIssuesForAzureProject(
810
+ toTokenWithInfo(providerId, session),
811
+ projectInput.namespace,
812
+ projectInput.project,
813
+ {
814
+ ...getIssuesOptions,
815
+ cursor: projectInput.cursor,
816
+ baseUrl: customUrl,
817
+ // Continuation is driven by the per-project cursor; only apply an explicit page on the
818
+ // first request so it can't clobber a continuation cursor on later pages.
819
+ page: projectInput.cursor == null ? options?.page : undefined,
820
+ pageSize: options?.pageSize,
821
+ states: states,
822
+ },
823
+ );
824
+ return { projectInput: projectInput, results: results };
825
+ }),
826
+ );
827
+
828
+ for (let i = 0; i < settled.length; i++) {
829
+ const outcome = settled[i];
830
+ const projectInput = projectInputs[i];
831
+ if (outcome.status !== 'fulfilled') {
832
+ truncated = true;
833
+ const failure = toCollectionScopeFailure(
834
+ {
835
+ providerId: providerId,
836
+ resourceId: projectInput.namespace,
837
+ projectId: projectInput.project,
838
+ },
839
+ outcome.reason,
840
+ );
841
+ metadata = mergeCollectionMetadata(metadata, {
842
+ completeness: 'partial',
843
+ failures: [failure],
844
+ });
845
+ continue;
846
+ }
847
+
848
+ const { projectInput: _projectInput, results } = outcome.value;
849
+ data.push(...results.values);
850
+ if (results.paging?.more) {
851
+ hasMore = true;
852
+ cursor.cursors.push({
853
+ namespace: projectInput.namespace,
854
+ project: projectInput.project,
855
+ cursor: results.paging.cursor,
856
+ });
857
+ }
858
+ }
859
+
860
+ // Keep the requested page number in the composite cursor so the facade can report the real
861
+ // currentPage when the consumer continues using only the cursor.
862
+ if (options?.page != null) {
863
+ cursor.page = options.page;
864
+ }
865
+
866
+ return {
867
+ value: {
868
+ values: data,
869
+ paging: {
870
+ more: hasMore,
871
+ cursor: JSON.stringify(cursor),
872
+ truncated: truncated || undefined,
873
+ // Echo the requested numbered page so the facade reports the real currentPage for
874
+ // numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
875
+ // leave `page` undefined via their own reads.
876
+ page: options?.page,
877
+ },
878
+ metadata: metadata,
879
+ },
880
+ duration: performance.now() - start,
881
+ };
882
+ } catch (ex) {
883
+ Logger.error(ex, 'getIssuesForRepos');
884
+ return { error: toError(ex), duration: performance.now() - start };
885
+ }
886
+ }
887
+ if (options?.filters != null) {
888
+ // Validate the requested filters against what this provider actually supports — same guard the Azure
889
+ // branch above applies. Without it an unsupported filter (e.g. GitLab has no Mention endpoint) would
890
+ // resolve to no filter property being set and silently degrade to an unfiltered, project-wide read.
891
+ if (!api.providerSupportsIssueFilters(providerId, options.filters)) {
892
+ Logger.warn(`Unsupported filters for provider ${providerId}`, 'getIssuesForRepos');
893
+ return {
894
+ error: new Error(`Unsupported filters for provider ${providerId}`),
895
+ duration: performance.now() - start,
896
+ };
897
+ }
898
+
899
+ let userAccount: ProviderAccount | undefined;
900
+ try {
901
+ userAccount = await this.getFilterAccount(api, session, customUrl);
902
+ } catch (ex) {
903
+ Logger.error(ex, 'getIssuesForRepos');
904
+ return { error: toError(ex), duration: performance.now() - start };
905
+ }
906
+
907
+ if (userAccount == null) {
908
+ Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
909
+ return {
910
+ error: new Error(`Unable to get current user for ${providerId}`),
911
+ duration: performance.now() - start,
912
+ };
913
+ }
914
+
915
+ const userFilterProperty = userAccount.username;
916
+ if (userFilterProperty == null) {
917
+ Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
918
+ return {
919
+ error: new Error(`Unable to get user property for filter for ${providerId}`),
920
+ duration: performance.now() - start,
921
+ };
922
+ }
923
+
924
+ getIssuesOptions = {
925
+ authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
926
+ assigneeLogins:
927
+ !options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
928
+ ? [userFilterProperty]
929
+ : undefined,
930
+ mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
931
+ };
932
+ }
933
+
934
+ if (api.getProviderIssuesPagingMode(providerId) === PagingMode.Repo && !api.isRepoIdsInput(reposOrRepoIds)) {
935
+ const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
936
+ const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
937
+ let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
938
+ if (cursors.length > 0) {
939
+ repoInputs = cursors;
940
+ }
941
+
942
+ try {
943
+ const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
944
+ let hasMore = false;
945
+ let truncated = false;
946
+ let metadata: CollectionMetadata | undefined;
947
+ const data: ProviderIssue[] = [];
948
+ // `allSettled`, not `Promise.all`: one repo's read rejecting must not discard every sibling repo's
949
+ // already-fetched issues and cursors. A rejected repo is recorded as a structured failure so the
950
+ // facade can warn and set `fetchFailed` instead of reporting a partial repo set as complete.
951
+ const settled = await Promise.allSettled(
952
+ repoInputs.map(async repoInput => {
953
+ const results = await api.getIssuesForRepo(
954
+ toTokenWithInfo(providerId, session),
955
+ repoInput.repo,
956
+ {
957
+ ...getIssuesOptions,
958
+ cursor: repoInput.cursor,
959
+ baseUrl: customUrl,
960
+ // Continuation is driven by the per-repo cursor; only apply an explicit page on the
961
+ // first request so it can't clobber a continuation cursor on later pages.
962
+ page: repoInput.cursor == null ? options?.page : undefined,
963
+ pageSize: options?.pageSize,
964
+ states: states,
965
+ },
966
+ );
967
+ return { repoInput: repoInput, results: results };
968
+ }),
969
+ );
970
+
971
+ for (let i = 0; i < settled.length; i++) {
972
+ const outcome = settled[i];
973
+ const repoInput = repoInputs[i];
974
+ if (outcome.status !== 'fulfilled') {
975
+ truncated = true;
976
+ const failure = toCollectionScopeFailure(
977
+ {
978
+ providerId: providerId,
979
+ repositoryId: `${repoInput.repo.namespace}/${repoInput.repo.name}`,
980
+ },
981
+ outcome.reason,
982
+ );
983
+ metadata = mergeCollectionMetadata(metadata, {
984
+ completeness: 'partial',
985
+ failures: [failure],
986
+ });
987
+ continue;
988
+ }
989
+
990
+ const { repoInput: _repoInput, results } = outcome.value;
991
+ data.push(...results.values);
992
+ if (results.paging?.more) {
993
+ hasMore = true;
994
+ cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
995
+ }
996
+ }
997
+
998
+ if (options?.page != null) {
999
+ cursor.page = options.page;
1000
+ }
1001
+
1002
+ return {
1003
+ value: {
1004
+ values: data,
1005
+ paging: {
1006
+ more: hasMore,
1007
+ cursor: JSON.stringify(cursor),
1008
+ truncated: truncated || undefined,
1009
+ // Echo the requested numbered page so the facade reports the real currentPage for
1010
+ // numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
1011
+ // leave `page` undefined via their own reads.
1012
+ page: options?.page,
1013
+ },
1014
+ metadata: metadata,
1015
+ },
1016
+ duration: performance.now() - start,
1017
+ };
1018
+ } catch (ex) {
1019
+ Logger.error(ex, 'getIssuesForRepos');
1020
+ return { error: toError(ex), duration: performance.now() - start };
1021
+ }
1022
+ }
1023
+
1024
+ try {
1025
+ const result = await api.getIssuesForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
1026
+ ...getIssuesOptions,
1027
+ cursor: options?.cursor,
1028
+ baseUrl: customUrl,
1029
+ page: options?.page,
1030
+ pageSize: options?.pageSize,
1031
+ states: states,
1032
+ });
1033
+ return { value: result, duration: performance.now() - start };
1034
+ } catch (ex) {
1035
+ Logger.error(ex, 'getIssuesForRepos');
1036
+ return { error: toError(ex), duration: performance.now() - start };
1037
+ }
1038
+ }
1039
+
1040
+ /**
1041
+ * Repo-scoped "my issues" read returning the normalized {@link IssueShape} the ProviderBackend facade
1042
+ * consumes (`listIssuesPage({ repos })`, `broadenIssues`). Maps {@link getMyIssuesForReposResult} — the raw
1043
+ * provider-apis path — to IssueShape.
1044
+ *
1045
+ * It's the seam rather than an inline map so a provider whose only issue client already yields normalized
1046
+ * shapes, and isn't wired into the raw path, can override it and serve these reads without a
1047
+ * `ProviderIssue` round-trip. No provider does today: the one candidate (Bitbucket Cloud's legacy
1048
+ * `getUsersIssuesForRepo`) reports `supportsIssues: false`, so the facade never reaches this for it.
1049
+ */
1050
+ async getMyIssuesForReposAsShapesResult(
1051
+ reposOrRepoIds: ProviderReposInput,
1052
+ options?: {
1053
+ filters?: IssueFilter[];
1054
+ cursor?: string;
1055
+ customUrl?: string;
1056
+ page?: number;
1057
+ pageSize?: number;
1058
+ includeAllAssignees?: boolean;
1059
+ state?: IssueStateFilter;
1060
+ },
1061
+ connectionId?: string,
1062
+ ): Promise<IntegrationResult<(PagedResult<IssueShape> & { metadata?: CollectionMetadata }) | undefined>> {
1063
+ const result = await this.getMyIssuesForReposResult(reposOrRepoIds, options, connectionId);
1064
+ if (result == null) return undefined;
1065
+ if (result.error != null) return { error: result.error, duration: result.duration };
1066
+ if (result.value == null) return { value: undefined, duration: result.duration };
1067
+
1068
+ const values = result.value.values
1069
+ .map(issue => toIssueShape(issue, this))
1070
+ .filter((issue): issue is IssueShape => issue != null);
1071
+ return { value: { ...result.value, values: values }, duration: result.duration };
1072
+ }
1073
+
1074
+ async getMyPullRequestsForRepos(
1075
+ reposOrRepoIds: ProviderReposInput,
1076
+ options?: {
1077
+ filters?: PullRequestFilter[];
1078
+ cursor?: string;
1079
+ customUrl?: string;
1080
+ page?: number;
1081
+ pageSize?: number;
1082
+ /** PR states to include; when omitted the provider returns its default (open only). */
1083
+ state?: PullRequestStateFilter | PullRequestStateFilter[];
1084
+ },
1085
+ connectionId?: string,
1086
+ ): Promise<ProviderApiPagedResult<ProviderPullRequest> | undefined> {
1087
+ return (await this.getMyPullRequestsForReposResult(reposOrRepoIds, options, connectionId))?.value;
1088
+ }
1089
+
1090
+ /**
1091
+ * Result-returning core of {@link getMyPullRequestsForRepos}. Resolves the session for `connectionId`
1092
+ * (or the primary connection when omitted, so multi-account reads use the right token) and recovers
1093
+ * thrown errors and validation failures into `{ error }` so callers can surface them as warnings
1094
+ * rather than swallowing them to `undefined`.
1095
+ */
1096
+ async getMyPullRequestsForReposResult(
1097
+ reposOrRepoIds: ProviderReposInput,
1098
+ options?: {
1099
+ filters?: PullRequestFilter[];
1100
+ cursor?: string;
1101
+ customUrl?: string;
1102
+ page?: number;
1103
+ pageSize?: number;
1104
+ state?: PullRequestStateFilter | PullRequestStateFilter[];
1105
+ },
1106
+ connectionId?: string,
1107
+ ): Promise<IntegrationResult<ProviderApiPagedResult<ProviderPullRequest> | undefined>> {
1108
+ const scope = getScopedLogger();
1109
+ const providerId = this.authProvider.id;
1110
+ const states = toProviderPullRequestStates(options?.state);
1111
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary. The session
1112
+ // is resolved here for connectivity/bail; the connection's token is applied per API call below.
1113
+ const session = await this.resolveReadSession(connectionId, scope);
1114
+ if (session == null) return undefined;
1115
+
1116
+ const start = performance.now();
1117
+ const customUrl =
1118
+ options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
1119
+
1120
+ const api = await this.getProvidersApi();
1121
+ if (
1122
+ providerId !== GitCloudHostIntegrationId.GitLab &&
1123
+ (api.isRepoIdsInput(reposOrRepoIds) ||
1124
+ (isAzureDevOpsProvider(providerId) &&
1125
+ !reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
1126
+ ) {
1127
+ Logger.warn(`Unsupported input for provider ${providerId}`);
1128
+ return {
1129
+ error: new Error(`Unsupported input for provider ${providerId}`),
1130
+ duration: performance.now() - start,
1131
+ };
1132
+ }
1133
+
1134
+ let getPullRequestsOptions: GetPullRequestsOptions | undefined;
1135
+ if (options?.filters != null) {
1136
+ if (!api.providerSupportsPullRequestFilters(providerId, options.filters)) {
1137
+ Logger.warn(`Unsupported filters for provider ${providerId}`, 'getPullRequestsForRepos');
1138
+ return {
1139
+ error: new Error(`Unsupported filters for provider ${providerId}`),
1140
+ duration: performance.now() - start,
1141
+ };
1142
+ }
1143
+
1144
+ let userAccount: ProviderAccount | undefined;
1145
+ if (isAzureDevOpsProvider(providerId)) {
1146
+ const organizations = new Set<string>();
1147
+ for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
1148
+ organizations.add(repo.namespace);
1149
+ }
1150
+
1151
+ if (organizations.size > 1) {
1152
+ Logger.warn(
1153
+ `Multiple organizations not supported for provider ${providerId}`,
1154
+ 'getPullRequestsForRepos',
1155
+ );
1156
+ return {
1157
+ error: new Error(`Multiple organizations not supported for provider ${providerId}`),
1158
+ duration: performance.now() - start,
1159
+ };
1160
+ } else if (organizations.size === 0) {
1161
+ Logger.warn(`No organizations found for provider ${providerId}`, 'getPullRequestsForRepos');
1162
+ return {
1163
+ error: new Error(`No organizations found for provider ${providerId}`),
1164
+ duration: performance.now() - start,
1165
+ };
1166
+ }
1167
+
1168
+ const organization: string = first(organizations.values())!;
1169
+ try {
1170
+ userAccount = await this.getFilterAccount(api, session, customUrl, organization);
1171
+ } catch (ex) {
1172
+ Logger.error(ex, 'getPullRequestsForRepos');
1173
+ return { error: toError(ex), duration: performance.now() - start };
1174
+ }
1175
+ } else {
1176
+ try {
1177
+ userAccount = await this.getFilterAccount(api, session, customUrl);
1178
+ } catch (ex) {
1179
+ Logger.error(ex, 'getPullRequestsForRepos');
1180
+ return { error: toError(ex), duration: performance.now() - start };
1181
+ }
1182
+ }
1183
+
1184
+ if (userAccount == null) {
1185
+ Logger.warn(`Unable to get current user for ${providerId}`, 'getPullRequestsForRepos');
1186
+ return {
1187
+ error: new Error(`Unable to get current user for ${providerId}`),
1188
+ duration: performance.now() - start,
1189
+ };
1190
+ }
1191
+
1192
+ let userFilterProperty: string | null;
1193
+ switch (providerId) {
1194
+ case GitCloudHostIntegrationId.Bitbucket:
1195
+ case GitCloudHostIntegrationId.AzureDevOps:
1196
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
1197
+ userFilterProperty = userAccount.id;
1198
+ break;
1199
+ default:
1200
+ userFilterProperty = userAccount.username;
1201
+ break;
1202
+ }
1203
+
1204
+ if (userFilterProperty == null) {
1205
+ Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getPullRequestsForRepos');
1206
+ return {
1207
+ error: new Error(`Unable to get user property for filter for ${providerId}`),
1208
+ duration: performance.now() - start,
1209
+ };
1210
+ }
1211
+
1212
+ // Route the "review requested from me" filter to the field each provider actually reads:
1213
+ // GitHub/GitLab expect a login (reviewRequestedLogin), Bitbucket/Azure an account id (reviewerId),
1214
+ // and Bitbucket Server a login (reviewerLogin). `userFilterProperty` is already the account id for
1215
+ // Bitbucket/Azure and the username for the rest.
1216
+ let reviewRequestedLogin: string | undefined;
1217
+ let reviewerId: string | undefined;
1218
+ let reviewerLogin: string | undefined;
1219
+ if (options.filters.includes(PullRequestFilter.ReviewRequested)) {
1220
+ switch (providerId) {
1221
+ case GitCloudHostIntegrationId.Bitbucket:
1222
+ case GitCloudHostIntegrationId.AzureDevOps:
1223
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
1224
+ reviewerId = userFilterProperty;
1225
+ break;
1226
+ case GitSelfManagedHostIntegrationId.BitbucketServer:
1227
+ reviewerLogin = userFilterProperty;
1228
+ break;
1229
+ default:
1230
+ reviewRequestedLogin = userFilterProperty;
1231
+ break;
1232
+ }
1233
+ }
1234
+
1235
+ getPullRequestsOptions = {
1236
+ authorLogin: options.filters.includes(PullRequestFilter.Author) ? userFilterProperty : undefined,
1237
+ assigneeLogins: options.filters.includes(PullRequestFilter.Assignee) ? [userFilterProperty] : undefined,
1238
+ reviewRequestedLogin: reviewRequestedLogin,
1239
+ reviewerId: reviewerId,
1240
+ reviewerLogin: reviewerLogin,
1241
+ mentionLogin: options.filters.includes(PullRequestFilter.Mention) ? userFilterProperty : undefined,
1242
+ };
1243
+ }
1244
+
1245
+ if (
1246
+ api.getProviderPullRequestsPagingMode(providerId) === PagingMode.Repo &&
1247
+ !api.isRepoIdsInput(reposOrRepoIds)
1248
+ ) {
1249
+ const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
1250
+ const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
1251
+ let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
1252
+ if (cursors.length > 0) {
1253
+ repoInputs = cursors;
1254
+ }
1255
+
1256
+ try {
1257
+ const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
1258
+ let hasMore = false;
1259
+ let truncated = false;
1260
+ let metadata: CollectionMetadata | undefined;
1261
+ const failures: CollectionScopeFailure[] = [];
1262
+ const data: ProviderPullRequest[] = [];
1263
+ // `allSettled`, not `Promise.all`: one repo's read rejecting must not discard every sibling repo's
1264
+ // already-fetched PRs and cursors. A rejected repo becomes a structured `CollectionScopeFailure`
1265
+ // (attributed to that repo) so the facade warns on it + sets `fetchFailed`, while the survivors and
1266
+ // their continuation cursors are still returned.
1267
+ const settled = await Promise.allSettled(
1268
+ repoInputs.map(async repoInput => {
1269
+ const results = await api.getPullRequestsForRepo(
1270
+ toTokenWithInfo(providerId, session),
1271
+ repoInput.repo,
1272
+ {
1273
+ ...getPullRequestsOptions,
1274
+ cursor: repoInput.cursor,
1275
+ baseUrl: customUrl,
1276
+ // Continuation is driven by the per-repo cursor; only apply an explicit page on the
1277
+ // first request so it can't clobber a continuation cursor on later pages.
1278
+ page: repoInput.cursor == null ? options?.page : undefined,
1279
+ pageSize: options?.pageSize,
1280
+ states: states,
1281
+ // Azure DevOps only populates clone URLs on request (extra call); no-op elsewhere.
1282
+ includeRemoteInfo: isAzureDevOpsProvider(providerId) ? true : undefined,
1283
+ },
1284
+ );
1285
+ return { repoInput: repoInput, results: results };
1286
+ }),
1287
+ );
1288
+
1289
+ // `allSettled` preserves order, so `settled[i]` is `repoInputs[i]`.
1290
+ settled.forEach((outcome, i) => {
1291
+ if (outcome.status !== 'fulfilled') {
1292
+ const failedRepo = repoInputs[i].repo;
1293
+ failures.push(
1294
+ toCollectionScopeFailure(
1295
+ { providerId: providerId, repositoryId: `${failedRepo.namespace}/${failedRepo.name}` },
1296
+ outcome.reason,
1297
+ ),
1298
+ );
1299
+ return;
1300
+ }
1301
+
1302
+ const { repoInput, results } = outcome.value;
1303
+ data.push(...results.values);
1304
+ // Fan-out across repos: preserve each repo's SDK completeness/failures and its terminal
1305
+ // truncation so a single failed/incomplete repo isn't lost when merged with its siblings.
1306
+ metadata = mergeCollectionMetadata(metadata, results.metadata);
1307
+ if (results.paging?.truncated) {
1308
+ truncated = true;
1309
+ }
1310
+ if (results.paging?.more) {
1311
+ hasMore = true;
1312
+ cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
1313
+ }
1314
+ });
1315
+
1316
+ // Merge the GitLens-side per-repo rejections into the SDK metadata so both flow through the same
1317
+ // warning/fetchFailed assessment downstream.
1318
+ if (failures.length > 0) {
1319
+ metadata = mergeCollectionMetadata(metadata, { completeness: 'partial', failures: failures });
1320
+ }
1321
+
1322
+ // Keep the requested page number in the composite cursor so the facade can report the real
1323
+ // currentPage when the consumer continues using only the cursor.
1324
+ if (options?.page != null) {
1325
+ cursor.page = options.page;
1326
+ }
1327
+
1328
+ return {
1329
+ value: {
1330
+ values: data,
1331
+ paging: {
1332
+ more: hasMore,
1333
+ cursor: JSON.stringify(cursor),
1334
+ truncated: truncated || undefined,
1335
+ // Echo the requested numbered page so the facade reports the real currentPage for
1336
+ // numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
1337
+ // leave `page` undefined via their own reads.
1338
+ page: options?.page,
1339
+ },
1340
+ metadata: metadata,
1341
+ },
1342
+ duration: performance.now() - start,
1343
+ };
1344
+ } catch (ex) {
1345
+ Logger.error(ex, 'getPullRequestsForRepos');
1346
+ return { error: toError(ex), duration: performance.now() - start };
1347
+ }
1348
+ }
1349
+
1350
+ try {
1351
+ const result = await api.getPullRequestsForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
1352
+ ...getPullRequestsOptions,
1353
+ cursor: options?.cursor,
1354
+ baseUrl: customUrl,
1355
+ page: options?.page,
1356
+ pageSize: options?.pageSize,
1357
+ states: states,
1358
+ // Azure DevOps only populates clone URLs on request (extra call); no-op elsewhere.
1359
+ includeRemoteInfo: isAzureDevOpsProvider(providerId) ? true : undefined,
1360
+ });
1361
+ return { value: result, duration: performance.now() - start };
1362
+ } catch (ex) {
1363
+ Logger.error(ex, 'getPullRequestsForRepos');
1364
+ return { error: toError(ex), duration: performance.now() - start };
1365
+ }
1366
+ }
1367
+
1368
+ async searchMyPullRequests(
1369
+ repo?: T,
1370
+ cancellation?: AbortSignal,
1371
+ silent?: boolean,
1372
+ connectionId?: string,
1373
+ state?: PullRequestStateFilter,
1374
+ options?: SearchMyPullRequestsOptions,
1375
+ ): Promise<IntegrationResult<PullRequest[] | undefined>>;
1376
+ async searchMyPullRequests(
1377
+ repos?: T[],
1378
+ cancellation?: AbortSignal,
1379
+ silent?: boolean,
1380
+ connectionId?: string,
1381
+ state?: PullRequestStateFilter,
1382
+ options?: SearchMyPullRequestsOptions,
1383
+ ): Promise<IntegrationResult<PullRequest[] | undefined>>;
1384
+ @trace()
1385
+ async searchMyPullRequests(
1386
+ repos?: T | T[],
1387
+ cancellation?: AbortSignal,
1388
+ silent?: boolean,
1389
+ connectionId?: string,
1390
+ state?: PullRequestStateFilter,
1391
+ options?: SearchMyPullRequestsOptions,
1392
+ ): Promise<IntegrationResult<PullRequest[] | undefined>> {
1393
+ const scope = getScopedLogger();
1394
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
1395
+ const session = await this.resolveReadSession(connectionId, scope);
1396
+ if (session == null) return undefined;
1397
+
1398
+ const start = performance.now();
1399
+ try {
1400
+ // Prefer the optional metadata-aware path for account-wide reads so partial failures (e.g. one Azure
1401
+ // org rejecting) are surfaced as a soft `{ value, error }` instead of being lost. Repo-scoped reads and
1402
+ // providers without that override keep using the legacy array path.
1403
+ let result: IntegrationResult<PullRequest[] | undefined>;
1404
+ if (this.searchProviderMyPullRequestsResult != null && repos == null) {
1405
+ result = await this.searchProviderMyPullRequestsResult(
1406
+ session,
1407
+ repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
1408
+ cancellation,
1409
+ silent,
1410
+ state,
1411
+ options,
1412
+ );
1413
+ } else {
1414
+ result = {
1415
+ value: await this.searchProviderMyPullRequests(
1416
+ session,
1417
+ repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
1418
+ cancellation,
1419
+ silent,
1420
+ state,
1421
+ options,
1422
+ ),
1423
+ };
1424
+ }
1425
+ this.resetRequestExceptionCount('searchMyPullRequests');
1426
+ // `IntegrationResult` is a strict union of value-only or error-only (and may be `undefined`). Return the
1427
+ // matching branch explicitly; a missing result is treated as a successful empty read.
1428
+ if (result == null) {
1429
+ return { value: undefined, duration: performance.now() - start };
1430
+ }
1431
+ if (result.error != null) {
1432
+ return { error: result.error, duration: performance.now() - start };
1433
+ }
1434
+ return { value: result.value, duration: performance.now() - start };
1435
+ } catch (ex) {
1436
+ this.handleProviderException('searchMyPullRequests', ex, {
1437
+ scope: scope,
1438
+ silent: true,
1439
+ });
1440
+ return {
1441
+ error: toError(ex),
1442
+ duration: performance.now() - start,
1443
+ };
1444
+ }
1445
+ }
1446
+
1447
+ /**
1448
+ * Account-wide, user-scoped counterpart of {@link getMyPullRequestsForReposResult} that returns the raw
1449
+ * `ProviderPullRequest` shape (not the normalized model). Unlike the repo-scoped core, this needs no
1450
+ * `repos` — it reads the current user's pull requests across the account, so the ProviderBackend sweep
1451
+ * can drive its Kanban "done" column even when no repositories are supplied (where the repo-scoped core
1452
+ * rejects an empty `repos` input). Recovers thrown errors into `{ error }` so callers surface warnings.
1453
+ */
1454
+ async getMyPullRequestsForUserResult(
1455
+ options?: {
1456
+ state?: PullRequestStateFilter[];
1457
+ cursor?: string;
1458
+ includeReviewRequested?: boolean;
1459
+ /** Exact OR union of account-wide relationships to include. */
1460
+ filters?: PullRequestFilter[];
1461
+ /** Request only the stable list fields, omitting optional provider enrichments. */
1462
+ summary?: boolean;
1463
+ },
1464
+ connectionId?: string,
1465
+ ): Promise<IntegrationResult<ProviderApiPagedResult<ProviderPullRequest> | undefined>> {
1466
+ const scope = getScopedLogger();
1467
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
1468
+ const session = await this.resolveReadSession(connectionId, scope);
1469
+ if (session == null) return undefined;
1470
+
1471
+ if (this.getProviderMyPullRequestsForUser == null) {
1472
+ return undefined;
1473
+ }
1474
+
1475
+ const start = performance.now();
1476
+ try {
1477
+ const result = await this.getProviderMyPullRequestsForUser(session, options);
1478
+ this.resetRequestExceptionCount('getMyPullRequestsForUser');
1479
+ return { value: result, duration: performance.now() - start };
1480
+ } catch (ex) {
1481
+ this.handleProviderException('getMyPullRequestsForUser', ex, { scope: scope });
1482
+ return { error: toError(ex), duration: performance.now() - start };
1483
+ }
1484
+ }
1485
+
1486
+ /**
1487
+ * Reads the current user's pull requests across the whole account using each provider's native "my PRs"
1488
+ * query, returning the raw provider shape. Without `filters`, the exact user scopes depend on provider-native
1489
+ * behavior and options like `includeReviewRequested`. With `filters`, each member is an exact account-wide OR
1490
+ * relationship validated by the facade before this provider hook is called. Optional: providers that can't
1491
+ * express an account-wide user query leave it undefined and the surface falls back to repo-scoped.
1492
+ *
1493
+ * These native user queries are cursor-based, so `cursor` (not a page number) drives continuation; there
1494
+ * is no jump-to-page-N and no per-call page size on this path.
1495
+ *
1496
+ * `includeReviewRequested` opts into the review-requested slice for providers whose account-wide read
1497
+ * only returns authored PRs natively and must fan out per-repo to add reviewer PRs (Bitbucket). It's off
1498
+ * by default so a sweep pays gkcli-parity cost (authored only) unless the caller deliberately opts in;
1499
+ * providers whose native query already covers review-requested PRs ignore it.
1500
+ */
1501
+ protected getProviderMyPullRequestsForUser?(
1502
+ session: ProviderAuthenticationSession,
1503
+ options?: {
1504
+ state?: PullRequestStateFilter[];
1505
+ cursor?: string;
1506
+ includeReviewRequested?: boolean;
1507
+ filters?: PullRequestFilter[];
1508
+ summary?: boolean;
1509
+ },
1510
+ ): Promise<ProviderApiPagedResult<ProviderPullRequest> | undefined>;
1511
+
1512
+ /**
1513
+ * Parses a Repo/Project paging cursor into its `cursors` bundle. Guards against valid JSON whose
1514
+ * `cursors` is a truthy non-array (e.g. `{ "cursors": "..." }`), which would otherwise bypass the
1515
+ * `?? []` fallback at call sites and flow into `.map()` downstream, throwing instead of degrading to
1516
+ * the first page.
1517
+ */
1518
+ private parseCursorInfo<T>(cursor?: string): { cursors?: T[] } {
1519
+ try {
1520
+ const parsed = JSON.parse(cursor ?? '{}') as { cursors?: T[] };
1521
+ return Array.isArray(parsed?.cursors) ? parsed : {};
1522
+ } catch {
1523
+ return {};
1524
+ }
1525
+ }
1526
+
1527
+ // `state` selects which PR states to include (open/closed/merged/all). Providers that cannot express it
1528
+ // in a single query filter the normalized results; omitted preserves the historical open-only behavior.
1529
+ protected abstract searchProviderMyPullRequests(
1530
+ session: ProviderAuthenticationSession,
1531
+ repos?: T[],
1532
+ cancellation?: AbortSignal,
1533
+ silent?: boolean,
1534
+ state?: PullRequestStateFilter,
1535
+ options?: SearchMyPullRequestsOptions,
1536
+ ): Promise<PullRequest[] | undefined>;
1537
+
1538
+ /**
1539
+ * Optional metadata-aware counterpart of {@link searchProviderMyPullRequests}. Providers whose account-wide
1540
+ * "my PRs" read already produces {@link ProviderApiPagedResult} with completeness/failures can override
1541
+ * this to return a soft `{ value, error }` result so `searchMyPullRequests` surfaces partial data and a
1542
+ * warning instead of silently discarding the failure signal. The wrapper prefers this when present; the
1543
+ * abstract {@link searchProviderMyPullRequests} remains the required fallback for repo-scoped and
1544
+ * metadata-oblivious paths.
1545
+ */
1546
+ protected searchProviderMyPullRequestsResult?(
1547
+ session: ProviderAuthenticationSession,
1548
+ repos?: T[],
1549
+ cancellation?: AbortSignal,
1550
+ silent?: boolean,
1551
+ state?: PullRequestStateFilter,
1552
+ options?: SearchMyPullRequestsOptions,
1553
+ ): Promise<IntegrationResult<PullRequest[] | undefined>>;
1554
+
1555
+ async searchPullRequests(
1556
+ searchQuery: string,
1557
+ repo?: T,
1558
+ cancellation?: AbortSignal,
1559
+ options?: { include?: PullRequestState[] },
1560
+ ): Promise<PullRequest[] | undefined>;
1561
+ async searchPullRequests(
1562
+ searchQuery: string,
1563
+ repos?: T[],
1564
+ cancellation?: AbortSignal,
1565
+ options?: { include?: PullRequestState[] },
1566
+ ): Promise<PullRequest[] | undefined>;
1567
+ async searchPullRequests(
1568
+ searchQuery: string,
1569
+ repo?: T,
1570
+ cancellation?: AbortSignal,
1571
+ connectionId?: string,
1572
+ options?: { include?: PullRequestState[] },
1573
+ ): Promise<PullRequest[] | undefined>;
1574
+ async searchPullRequests(
1575
+ searchQuery: string,
1576
+ repos?: T[],
1577
+ cancellation?: AbortSignal,
1578
+ connectionId?: string,
1579
+ options?: { include?: PullRequestState[] },
1580
+ ): Promise<PullRequest[] | undefined>;
1581
+ @trace()
1582
+ async searchPullRequests(
1583
+ searchQuery: string,
1584
+ repos?: T | T[],
1585
+ cancellation?: AbortSignal,
1586
+ connectionIdOrOptions?: string | { include?: PullRequestState[] },
1587
+ options?: { include?: PullRequestState[] },
1588
+ ): Promise<PullRequest[] | undefined> {
1589
+ // `connectionId` (string) can be omitted when passing `options`; split the overlapping 4th arg.
1590
+ // When the 4th arg isn't the options object (a string `connectionId` or `undefined`), fall back to
1591
+ // the 5th-arg `options` so an explicit `undefined` connectionId still honors state filtering.
1592
+ const connectionId = typeof connectionIdOrOptions === 'string' ? connectionIdOrOptions : undefined;
1593
+ const searchOptions =
1594
+ connectionIdOrOptions != null && typeof connectionIdOrOptions !== 'string'
1595
+ ? connectionIdOrOptions
1596
+ : options;
1597
+ const scope = getScopedLogger();
1598
+ // `connectionId` targets a specific account (multi-account); omitted reads the primary.
1599
+ const session = await this.resolveReadSession(connectionId, scope);
1600
+ if (session == null) return undefined;
1601
+
1602
+ try {
1603
+ const prs = await this.searchProviderPullRequests?.(
1604
+ session,
1605
+ searchQuery,
1606
+ repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
1607
+ cancellation,
1608
+ searchOptions,
1609
+ );
1610
+ this.resetRequestExceptionCount('searchPullRequests');
1611
+ return prs;
1612
+ } catch (ex) {
1613
+ this.handleProviderException('searchPullRequests', ex, { scope: scope });
1614
+ return undefined;
1615
+ }
1616
+ }
1617
+
1618
+ protected searchProviderPullRequests?(
1619
+ session: ProviderAuthenticationSession,
1620
+ searchQuery: string,
1621
+ repos?: T[],
1622
+ cancellation?: AbortSignal,
1623
+ options?: { include?: PullRequestState[] },
1624
+ ): Promise<PullRequest[] | undefined>;
1625
+
1626
+ getPullRequestIdentityFromMaybeUrl(search: string): PullRequestUrlIdentity | undefined {
1627
+ return this.getProviderPullRequestIdentityFromMaybeUrl?.(search);
1628
+ }
1629
+
1630
+ protected getProviderPullRequestIdentityFromMaybeUrl?(search: string): PullRequestUrlIdentity | undefined;
1631
+ }