@gitkraken/core-gitlens 0.4.0 → 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 (1036) hide show
  1. package/CHANGELOG.md +71 -1
  2. package/README.md +9 -2
  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.map +1 -1
  8. package/dist/git/errors.d.ts +31 -1
  9. package/dist/git/errors.d.ts.map +1 -1
  10. package/dist/git/errors.js +29 -0
  11. package/dist/git/errors.js.map +1 -1
  12. package/dist/git/models/author.d.ts.map +1 -1
  13. package/dist/git/models/author.js.map +1 -1
  14. package/dist/git/models/autolink.d.ts.map +1 -1
  15. package/dist/git/models/autolink.js.map +1 -1
  16. package/dist/git/models/blame.d.ts.map +1 -1
  17. package/dist/git/models/blame.js.map +1 -1
  18. package/dist/git/models/branch.d.ts.map +1 -1
  19. package/dist/git/models/branch.js.map +1 -1
  20. package/dist/git/models/commit.d.ts.map +1 -1
  21. package/dist/git/models/commit.js +1 -1
  22. package/dist/git/models/commit.js.map +1 -1
  23. package/dist/git/models/contributor.d.ts.map +1 -1
  24. package/dist/git/models/contributor.js.map +1 -1
  25. package/dist/git/models/defaultBranch.d.ts.map +1 -1
  26. package/dist/git/models/defaultBranch.js.map +1 -1
  27. package/dist/git/models/diff.d.ts.map +1 -1
  28. package/dist/git/models/diff.js.map +1 -1
  29. package/dist/git/models/file.d.ts.map +1 -1
  30. package/dist/git/models/file.js.map +1 -1
  31. package/dist/git/models/fileChange.d.ts.map +1 -1
  32. package/dist/git/models/fileChange.js.map +1 -1
  33. package/dist/git/models/fileStatus.d.ts +22 -22
  34. package/dist/git/models/fileStatus.d.ts.map +1 -1
  35. package/dist/git/models/fileStatus.js.map +1 -1
  36. package/dist/git/models/graph.d.ts +122 -1
  37. package/dist/git/models/graph.d.ts.map +1 -1
  38. package/dist/git/models/graph.js +4 -0
  39. package/dist/git/models/graph.js.map +1 -1
  40. package/dist/git/models/graphSearch.d.ts.map +1 -1
  41. package/dist/git/models/graphSearch.js.map +1 -1
  42. package/dist/git/models/graphSession.d.ts +177 -0
  43. package/dist/git/models/graphSession.d.ts.map +1 -0
  44. package/dist/git/models/graphSession.js +7 -0
  45. package/dist/git/models/graphSession.js.map +1 -0
  46. package/dist/git/models/issue.d.ts +12 -2
  47. package/dist/git/models/issue.d.ts.map +1 -1
  48. package/dist/git/models/issue.js +3 -1
  49. package/dist/git/models/issue.js.map +1 -1
  50. package/dist/git/models/issueOrPullRequest.d.ts.map +1 -1
  51. package/dist/git/models/issueOrPullRequest.js.map +1 -1
  52. package/dist/git/models/lineRange.d.ts.map +1 -1
  53. package/dist/git/models/lineRange.js.map +1 -1
  54. package/dist/git/models/log.d.ts.map +1 -1
  55. package/dist/git/models/log.js.map +1 -1
  56. package/dist/git/models/mergeConflicts.d.ts.map +1 -1
  57. package/dist/git/models/mergeConflicts.js.map +1 -1
  58. package/dist/git/models/patch.d.ts.map +1 -1
  59. package/dist/git/models/patch.js.map +1 -1
  60. package/dist/git/models/pausedOperationStatus.d.ts.map +1 -1
  61. package/dist/git/models/pausedOperationStatus.js.map +1 -1
  62. package/dist/git/models/pullRequest.d.ts +27 -2
  63. package/dist/git/models/pullRequest.d.ts.map +1 -1
  64. package/dist/git/models/pullRequest.js +7 -1
  65. package/dist/git/models/pullRequest.js.map +1 -1
  66. package/dist/git/models/rebase.d.ts.map +1 -1
  67. package/dist/git/models/rebase.js.map +1 -1
  68. package/dist/git/models/reference.d.ts.map +1 -1
  69. package/dist/git/models/reference.js.map +1 -1
  70. package/dist/git/models/reflog.d.ts.map +1 -1
  71. package/dist/git/models/reflog.js.map +1 -1
  72. package/dist/git/models/remote.d.ts.map +1 -1
  73. package/dist/git/models/remote.js.map +1 -1
  74. package/dist/git/models/remoteProvider.d.ts.map +1 -1
  75. package/dist/git/models/remoteProvider.js.map +1 -1
  76. package/dist/git/models/remoteResource.d.ts.map +1 -1
  77. package/dist/git/models/remoteResource.js.map +1 -1
  78. package/dist/git/models/repository.d.ts +20 -2
  79. package/dist/git/models/repository.d.ts.map +1 -1
  80. package/dist/git/models/repository.js +19 -0
  81. package/dist/git/models/repository.js.map +1 -1
  82. package/dist/git/models/repositoryChangeEvent.d.ts.map +1 -1
  83. package/dist/git/models/repositoryChangeEvent.js.map +1 -1
  84. package/dist/git/models/repositoryIdentities.d.ts.map +1 -1
  85. package/dist/git/models/repositoryIdentities.js.map +1 -1
  86. package/dist/git/models/repositoryMetadata.d.ts.map +1 -1
  87. package/dist/git/models/repositoryMetadata.js.map +1 -1
  88. package/dist/git/models/resourceDescriptor.d.ts +16 -0
  89. package/dist/git/models/resourceDescriptor.d.ts.map +1 -1
  90. package/dist/git/models/resourceDescriptor.js.map +1 -1
  91. package/dist/git/models/revision.d.ts.map +1 -1
  92. package/dist/git/models/revision.js.map +1 -1
  93. package/dist/git/models/search.d.ts.map +1 -1
  94. package/dist/git/models/search.js.map +1 -1
  95. package/dist/git/models/shortlog.d.ts.map +1 -1
  96. package/dist/git/models/shortlog.js.map +1 -1
  97. package/dist/git/models/signature.d.ts +14 -0
  98. package/dist/git/models/signature.d.ts.map +1 -1
  99. package/dist/git/models/signature.js.map +1 -1
  100. package/dist/git/models/staging.d.ts.map +1 -1
  101. package/dist/git/models/staging.js.map +1 -1
  102. package/dist/git/models/stash.d.ts.map +1 -1
  103. package/dist/git/models/stash.js.map +1 -1
  104. package/dist/git/models/status.d.ts.map +1 -1
  105. package/dist/git/models/status.js.map +1 -1
  106. package/dist/git/models/statusFile.d.ts.map +1 -1
  107. package/dist/git/models/statusFile.js.map +1 -1
  108. package/dist/git/models/tag.d.ts +11 -1
  109. package/dist/git/models/tag.d.ts.map +1 -1
  110. package/dist/git/models/tag.js +9 -2
  111. package/dist/git/models/tag.js.map +1 -1
  112. package/dist/git/models/tree.d.ts.map +1 -1
  113. package/dist/git/models/tree.js.map +1 -1
  114. package/dist/git/models/user.d.ts.map +1 -1
  115. package/dist/git/models/user.js.map +1 -1
  116. package/dist/git/models/worktree.d.ts.map +1 -1
  117. package/dist/git/models/worktree.js.map +1 -1
  118. package/dist/git/parsers/diffParser.d.ts.map +1 -1
  119. package/dist/git/parsers/diffParser.js +1 -1
  120. package/dist/git/parsers/diffParser.js.map +1 -1
  121. package/dist/git/parsers/rebaseTodoParser.d.ts.map +1 -1
  122. package/dist/git/parsers/rebaseTodoParser.js.map +1 -1
  123. package/dist/git/providers/blame.d.ts.map +1 -1
  124. package/dist/git/providers/blame.js.map +1 -1
  125. package/dist/git/providers/branches.d.ts +8 -1
  126. package/dist/git/providers/branches.d.ts.map +1 -1
  127. package/dist/git/providers/branches.js.map +1 -1
  128. package/dist/git/providers/commits.d.ts +6 -1
  129. package/dist/git/providers/commits.d.ts.map +1 -1
  130. package/dist/git/providers/commits.js.map +1 -1
  131. package/dist/git/providers/config.d.ts +6 -2
  132. package/dist/git/providers/config.d.ts.map +1 -1
  133. package/dist/git/providers/config.js.map +1 -1
  134. package/dist/git/providers/contributors.d.ts.map +1 -1
  135. package/dist/git/providers/contributors.js.map +1 -1
  136. package/dist/git/providers/diff.d.ts.map +1 -1
  137. package/dist/git/providers/diff.js.map +1 -1
  138. package/dist/git/providers/graph.d.ts +55 -1
  139. package/dist/git/providers/graph.d.ts.map +1 -1
  140. package/dist/git/providers/graph.js.map +1 -1
  141. package/dist/git/providers/operations.d.ts.map +1 -1
  142. package/dist/git/providers/operations.js.map +1 -1
  143. package/dist/git/providers/patch.d.ts.map +1 -1
  144. package/dist/git/providers/patch.js.map +1 -1
  145. package/dist/git/providers/pausedOperations.d.ts.map +1 -1
  146. package/dist/git/providers/pausedOperations.js.map +1 -1
  147. package/dist/git/providers/provider.d.ts.map +1 -1
  148. package/dist/git/providers/provider.js.map +1 -1
  149. package/dist/git/providers/refs.d.ts.map +1 -1
  150. package/dist/git/providers/refs.js.map +1 -1
  151. package/dist/git/providers/remotes.d.ts.map +1 -1
  152. package/dist/git/providers/remotes.js.map +1 -1
  153. package/dist/git/providers/revision.d.ts.map +1 -1
  154. package/dist/git/providers/revision.js.map +1 -1
  155. package/dist/git/providers/shared/remotes.d.ts.map +1 -1
  156. package/dist/git/providers/shared/remotes.js.map +1 -1
  157. package/dist/git/providers/staging.d.ts.map +1 -1
  158. package/dist/git/providers/staging.js.map +1 -1
  159. package/dist/git/providers/stash.d.ts.map +1 -1
  160. package/dist/git/providers/stash.js.map +1 -1
  161. package/dist/git/providers/status.d.ts +1 -0
  162. package/dist/git/providers/status.d.ts.map +1 -1
  163. package/dist/git/providers/status.js.map +1 -1
  164. package/dist/git/providers/tags.d.ts.map +1 -1
  165. package/dist/git/providers/tags.js.map +1 -1
  166. package/dist/git/providers/types.d.ts.map +1 -1
  167. package/dist/git/providers/types.js.map +1 -1
  168. package/dist/git/providers/worktrees.d.ts +3 -1
  169. package/dist/git/providers/worktrees.d.ts.map +1 -1
  170. package/dist/git/providers/worktrees.js.map +1 -1
  171. package/dist/git/remotes/azure-devops.d.ts.map +1 -1
  172. package/dist/git/remotes/azure-devops.js +27 -31
  173. package/dist/git/remotes/azure-devops.js.map +1 -1
  174. package/dist/git/remotes/bitbucket-server.d.ts.map +1 -1
  175. package/dist/git/remotes/bitbucket-server.js +21 -23
  176. package/dist/git/remotes/bitbucket-server.js.map +1 -1
  177. package/dist/git/remotes/bitbucket.d.ts.map +1 -1
  178. package/dist/git/remotes/bitbucket.js +21 -23
  179. package/dist/git/remotes/bitbucket.js.map +1 -1
  180. package/dist/git/remotes/custom.d.ts.map +1 -1
  181. package/dist/git/remotes/custom.js.map +1 -1
  182. package/dist/git/remotes/gerrit.d.ts.map +1 -1
  183. package/dist/git/remotes/gerrit.js +11 -13
  184. package/dist/git/remotes/gerrit.js.map +1 -1
  185. package/dist/git/remotes/gitea.d.ts.map +1 -1
  186. package/dist/git/remotes/gitea.js +12 -14
  187. package/dist/git/remotes/gitea.js.map +1 -1
  188. package/dist/git/remotes/github.d.ts.map +1 -1
  189. package/dist/git/remotes/github.js +54 -56
  190. package/dist/git/remotes/github.js.map +1 -1
  191. package/dist/git/remotes/gitlab.d.ts.map +1 -1
  192. package/dist/git/remotes/gitlab.js +93 -95
  193. package/dist/git/remotes/gitlab.js.map +1 -1
  194. package/dist/git/remotes/google-source.d.ts.map +1 -1
  195. package/dist/git/remotes/google-source.js.map +1 -1
  196. package/dist/git/remotes/matcher.d.ts.map +1 -1
  197. package/dist/git/remotes/matcher.js.map +1 -1
  198. package/dist/git/run.types.d.ts +62 -3
  199. package/dist/git/run.types.d.ts.map +1 -1
  200. package/dist/git/service.d.ts.map +1 -1
  201. package/dist/git/utils/autolink.utils.d.ts.map +1 -1
  202. package/dist/git/utils/autolink.utils.js.map +1 -1
  203. package/dist/git/utils/blame.utils.d.ts.map +1 -1
  204. package/dist/git/utils/blame.utils.js.map +1 -1
  205. package/dist/git/utils/branch.utils.d.ts.map +1 -1
  206. package/dist/git/utils/branch.utils.js +12 -1
  207. package/dist/git/utils/branch.utils.js.map +1 -1
  208. package/dist/git/utils/commit.utils.d.ts.map +1 -1
  209. package/dist/git/utils/commit.utils.js.map +1 -1
  210. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -1
  211. package/dist/git/utils/conflictResolution.utils.js.map +1 -1
  212. package/dist/git/utils/contributor.utils.d.ts +1 -1
  213. package/dist/git/utils/contributor.utils.d.ts.map +1 -1
  214. package/dist/git/utils/contributor.utils.js +1 -2
  215. package/dist/git/utils/contributor.utils.js.map +1 -1
  216. package/dist/git/utils/fetch.utils.d.ts.map +1 -1
  217. package/dist/git/utils/fetch.utils.js.map +1 -1
  218. package/dist/git/utils/fileStatus.utils.d.ts +7 -0
  219. package/dist/git/utils/fileStatus.utils.d.ts.map +1 -1
  220. package/dist/git/utils/fileStatus.utils.js +6 -0
  221. package/dist/git/utils/fileStatus.utils.js.map +1 -1
  222. package/dist/git/utils/graph.utils.d.ts +20 -0
  223. package/dist/git/utils/graph.utils.d.ts.map +1 -0
  224. package/dist/git/utils/graph.utils.js +40 -0
  225. package/dist/git/utils/graph.utils.js.map +1 -0
  226. package/dist/git/utils/issue.utils.d.ts.map +1 -1
  227. package/dist/git/utils/issue.utils.js +1 -0
  228. package/dist/git/utils/issue.utils.js.map +1 -1
  229. package/dist/git/utils/issueOrPullRequest.utils.d.ts.map +1 -1
  230. package/dist/git/utils/issueOrPullRequest.utils.js.map +1 -1
  231. package/dist/git/utils/mergeConflicts.utils.d.ts.map +1 -1
  232. package/dist/git/utils/mergeConflicts.utils.js.map +1 -1
  233. package/dist/git/utils/pausedOperationStatus.utils.d.ts +13 -13
  234. package/dist/git/utils/pausedOperationStatus.utils.d.ts.map +1 -1
  235. package/dist/git/utils/pausedOperationStatus.utils.js.map +1 -1
  236. package/dist/git/utils/pullRequest.utils.d.ts.map +1 -1
  237. package/dist/git/utils/pullRequest.utils.js +9 -0
  238. package/dist/git/utils/pullRequest.utils.js.map +1 -1
  239. package/dist/git/utils/reachability.utils.d.ts +20 -2
  240. package/dist/git/utils/reachability.utils.d.ts.map +1 -1
  241. package/dist/git/utils/reachability.utils.js +68 -7
  242. package/dist/git/utils/reachability.utils.js.map +1 -1
  243. package/dist/git/utils/rebase.utils.d.ts.map +1 -1
  244. package/dist/git/utils/rebase.utils.js.map +1 -1
  245. package/dist/git/utils/reference.utils.d.ts.map +1 -1
  246. package/dist/git/utils/reference.utils.js.map +1 -1
  247. package/dist/git/utils/remote.utils.d.ts.map +1 -1
  248. package/dist/git/utils/remote.utils.js.map +1 -1
  249. package/dist/git/utils/repository.utils.d.ts.map +1 -1
  250. package/dist/git/utils/repository.utils.js.map +1 -1
  251. package/dist/git/utils/resourceDescriptor.utils.d.ts.map +1 -1
  252. package/dist/git/utils/resourceDescriptor.utils.js.map +1 -1
  253. package/dist/git/utils/revision.utils.d.ts.map +1 -1
  254. package/dist/git/utils/revision.utils.js.map +1 -1
  255. package/dist/git/utils/search.utils.d.ts.map +1 -1
  256. package/dist/git/utils/search.utils.js.map +1 -1
  257. package/dist/git/utils/sorting.d.ts.map +1 -1
  258. package/dist/git/utils/sorting.js.map +1 -1
  259. package/dist/git/utils/sshKey.utils.d.ts +7 -0
  260. package/dist/git/utils/sshKey.utils.d.ts.map +1 -0
  261. package/dist/git/utils/sshKey.utils.js +25 -0
  262. package/dist/git/utils/sshKey.utils.js.map +1 -0
  263. package/dist/git/utils/status.utils.d.ts.map +1 -1
  264. package/dist/git/utils/status.utils.js.map +1 -1
  265. package/dist/git/utils/statusFile.utils.d.ts.map +1 -1
  266. package/dist/git/utils/statusFile.utils.js.map +1 -1
  267. package/dist/git/utils/tag.utils.d.ts.map +1 -1
  268. package/dist/git/utils/tag.utils.js.map +1 -1
  269. package/dist/git/utils/tooltip.utils.d.ts.map +1 -1
  270. package/dist/git/utils/tooltip.utils.js.map +1 -1
  271. package/dist/git/utils/uriAuthority.d.ts.map +1 -1
  272. package/dist/git/utils/uriAuthority.js.map +1 -1
  273. package/dist/git/utils/user.utils.d.ts.map +1 -1
  274. package/dist/git/utils/user.utils.js.map +1 -1
  275. package/dist/git/utils/worktree.utils.d.ts.map +1 -1
  276. package/dist/git/utils/worktree.utils.js.map +1 -1
  277. package/dist/git/watching/changeEvent.d.ts.map +1 -1
  278. package/dist/git/watching/changeEvent.js.map +1 -1
  279. package/dist/git/watching/classifyChange.d.ts.map +1 -1
  280. package/dist/git/watching/classifyChange.js.map +1 -1
  281. package/dist/git/watching/gitIgnoreFilter.d.ts.map +1 -1
  282. package/dist/git/watching/gitIgnoreFilter.js.map +1 -1
  283. package/dist/git/watching/initWatcher.d.ts.map +1 -1
  284. package/dist/git/watching/initWatcher.js.map +1 -1
  285. package/dist/git/watching/provider.d.ts.map +1 -1
  286. package/dist/git/watching/provider.js.map +1 -1
  287. package/dist/git/watching/watchGroup.d.ts.map +1 -1
  288. package/dist/git/watching/watchGroup.js.map +1 -1
  289. package/dist/git/watching/watchService.d.ts +4 -0
  290. package/dist/git/watching/watchService.d.ts.map +1 -1
  291. package/dist/git/watching/watchService.js +15 -1
  292. package/dist/git/watching/watchService.js.map +1 -1
  293. package/dist/git/watching/watchSession.d.ts +7 -0
  294. package/dist/git/watching/watchSession.d.ts.map +1 -1
  295. package/dist/git/watching/watchSession.js +14 -2
  296. package/dist/git/watching/watchSession.js.map +1 -1
  297. package/dist/git/watching/watcherPatterns.d.ts.map +1 -1
  298. package/dist/git/watching/watcherPatterns.js.map +1 -1
  299. package/dist/git-cli/cliGitProvider.d.ts.map +1 -1
  300. package/dist/git-cli/exec/exec.d.ts.map +1 -1
  301. package/dist/git-cli/exec/exec.errors.d.ts.map +1 -1
  302. package/dist/git-cli/exec/exec.errors.js.map +1 -1
  303. package/dist/git-cli/exec/exec.js.map +1 -1
  304. package/dist/git-cli/exec/exec.types.d.ts.map +1 -1
  305. package/dist/git-cli/exec/exec.types.js.map +1 -1
  306. package/dist/git-cli/exec/features.d.ts.map +1 -1
  307. package/dist/git-cli/exec/features.js.map +1 -1
  308. package/dist/git-cli/exec/git.d.ts +19 -27
  309. package/dist/git-cli/exec/git.d.ts.map +1 -1
  310. package/dist/git-cli/exec/git.js +126 -34
  311. package/dist/git-cli/exec/git.js.map +1 -1
  312. package/dist/git-cli/exec/gitQueue.d.ts.map +1 -1
  313. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  314. package/dist/git-cli/exec/locator.d.ts.map +1 -1
  315. package/dist/git-cli/exec/locator.js.map +1 -1
  316. package/dist/git-cli/parsers/blameParser.d.ts.map +1 -1
  317. package/dist/git-cli/parsers/blameParser.js.map +1 -1
  318. package/dist/git-cli/parsers/indexParser.d.ts.map +1 -1
  319. package/dist/git-cli/parsers/indexParser.js.map +1 -1
  320. package/dist/git-cli/parsers/logParser.d.ts +9 -1
  321. package/dist/git-cli/parsers/logParser.d.ts.map +1 -1
  322. package/dist/git-cli/parsers/logParser.js +141 -60
  323. package/dist/git-cli/parsers/logParser.js.map +1 -1
  324. package/dist/git-cli/parsers/mergeTreeParser.d.ts.map +1 -1
  325. package/dist/git-cli/parsers/mergeTreeParser.js.map +1 -1
  326. package/dist/git-cli/parsers/refParser.d.ts.map +1 -1
  327. package/dist/git-cli/parsers/refParser.js.map +1 -1
  328. package/dist/git-cli/parsers/reflogParser.d.ts.map +1 -1
  329. package/dist/git-cli/parsers/reflogParser.js.map +1 -1
  330. package/dist/git-cli/parsers/remoteParser.d.ts.map +1 -1
  331. package/dist/git-cli/parsers/remoteParser.js.map +1 -1
  332. package/dist/git-cli/parsers/shortlogParser.d.ts.map +1 -1
  333. package/dist/git-cli/parsers/shortlogParser.js.map +1 -1
  334. package/dist/git-cli/parsers/signatureParser.d.ts.map +1 -1
  335. package/dist/git-cli/parsers/signatureParser.js.map +1 -1
  336. package/dist/git-cli/parsers/sshSignatureParser.d.ts +21 -0
  337. package/dist/git-cli/parsers/sshSignatureParser.d.ts.map +1 -0
  338. package/dist/git-cli/parsers/sshSignatureParser.js +78 -0
  339. package/dist/git-cli/parsers/sshSignatureParser.js.map +1 -0
  340. package/dist/git-cli/parsers/statusParser.d.ts.map +1 -1
  341. package/dist/git-cli/parsers/statusParser.js.map +1 -1
  342. package/dist/git-cli/parsers/treeParser.d.ts.map +1 -1
  343. package/dist/git-cli/parsers/treeParser.js.map +1 -1
  344. package/dist/git-cli/parsers/worktreeParser.d.ts.map +1 -1
  345. package/dist/git-cli/parsers/worktreeParser.js +5 -7
  346. package/dist/git-cli/parsers/worktreeParser.js.map +1 -1
  347. package/dist/git-cli/providers/blame.d.ts.map +1 -1
  348. package/dist/git-cli/providers/blame.js.map +1 -1
  349. package/dist/git-cli/providers/branches.d.ts +1 -0
  350. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  351. package/dist/git-cli/providers/branches.js +51 -32
  352. package/dist/git-cli/providers/branches.js.map +1 -1
  353. package/dist/git-cli/providers/commitFilesetUtils.d.ts.map +1 -1
  354. package/dist/git-cli/providers/commitFilesetUtils.js.map +1 -1
  355. package/dist/git-cli/providers/commits.d.ts +12 -1
  356. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  357. package/dist/git-cli/providers/commits.js +89 -8
  358. package/dist/git-cli/providers/commits.js.map +1 -1
  359. package/dist/git-cli/providers/config.d.ts.map +1 -1
  360. package/dist/git-cli/providers/config.js.map +1 -1
  361. package/dist/git-cli/providers/contributors.d.ts.map +1 -1
  362. package/dist/git-cli/providers/contributors.js.map +1 -1
  363. package/dist/git-cli/providers/diff.d.ts.map +1 -1
  364. package/dist/git-cli/providers/diff.js.map +1 -1
  365. package/dist/git-cli/providers/graph.d.ts +35 -1
  366. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  367. package/dist/git-cli/providers/graph.js +1434 -330
  368. package/dist/git-cli/providers/graph.js.map +1 -1
  369. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  370. package/dist/git-cli/providers/operations.js.map +1 -1
  371. package/dist/git-cli/providers/patch.d.ts.map +1 -1
  372. package/dist/git-cli/providers/patch.js.map +1 -1
  373. package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
  374. package/dist/git-cli/providers/pausedOperations.js +3 -3
  375. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  376. package/dist/git-cli/providers/refs.d.ts.map +1 -1
  377. package/dist/git-cli/providers/refs.js.map +1 -1
  378. package/dist/git-cli/providers/remotes.d.ts.map +1 -1
  379. package/dist/git-cli/providers/remotes.js.map +1 -1
  380. package/dist/git-cli/providers/revision.d.ts +1 -0
  381. package/dist/git-cli/providers/revision.d.ts.map +1 -1
  382. package/dist/git-cli/providers/revision.js +33 -0
  383. package/dist/git-cli/providers/revision.js.map +1 -1
  384. package/dist/git-cli/providers/staging.d.ts.map +1 -1
  385. package/dist/git-cli/providers/staging.js.map +1 -1
  386. package/dist/git-cli/providers/stash.d.ts.map +1 -1
  387. package/dist/git-cli/providers/stash.js.map +1 -1
  388. package/dist/git-cli/providers/status.d.ts +28 -0
  389. package/dist/git-cli/providers/status.d.ts.map +1 -1
  390. package/dist/git-cli/providers/status.js +240 -154
  391. package/dist/git-cli/providers/status.js.map +1 -1
  392. package/dist/git-cli/providers/tags.d.ts.map +1 -1
  393. package/dist/git-cli/providers/tags.js +2 -1
  394. package/dist/git-cli/providers/tags.js.map +1 -1
  395. package/dist/git-cli/providers/worktrees.d.ts +2 -1
  396. package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
  397. package/dist/git-cli/providers/worktrees.js +28 -3
  398. package/dist/git-cli/providers/worktrees.js.map +1 -1
  399. package/dist/git-cli/service.d.ts.map +1 -1
  400. package/dist/git-cli/service.js +8 -0
  401. package/dist/git-cli/service.js.map +1 -1
  402. package/dist/ipc/ipcServer.d.ts.map +1 -1
  403. package/dist/ipc/ipcServer.js +1 -1
  404. package/dist/ipc/ipcServer.js.map +1 -1
  405. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +6 -1
  406. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -1
  407. package/dist/plus/agents/providers/claudeCodeProvider.js +19 -0
  408. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -1
  409. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +68 -0
  410. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -1
  411. package/dist/plus/agents/providers/claudeCodeTranscript.js +262 -8
  412. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
  413. package/dist/plus/agents/types.d.ts +36 -2
  414. package/dist/plus/agents/types.d.ts.map +1 -1
  415. package/dist/plus/ai/constants.d.ts +1 -2
  416. package/dist/plus/ai/constants.d.ts.map +1 -1
  417. package/dist/plus/ai/constants.js +1 -8
  418. package/dist/plus/ai/constants.js.map +1 -1
  419. package/dist/plus/ai/errors.d.ts.map +1 -1
  420. package/dist/plus/ai/errors.js.map +1 -1
  421. package/dist/plus/ai/models/conversation.d.ts.map +1 -1
  422. package/dist/plus/ai/models/conversation.js.map +1 -1
  423. package/dist/plus/ai/models/model.d.ts +2 -1
  424. package/dist/plus/ai/models/model.d.ts.map +1 -1
  425. package/dist/plus/ai/models/model.js +50 -1
  426. package/dist/plus/ai/models/model.js.map +1 -1
  427. package/dist/plus/ai/models/promptTemplates.d.ts +5 -2
  428. package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
  429. package/dist/plus/ai/models/promptTemplates.js.map +1 -1
  430. package/dist/plus/ai/models/provider.d.ts.map +1 -1
  431. package/dist/plus/ai/models/provider.js.map +1 -1
  432. package/dist/plus/ai/models/results.d.ts.map +1 -1
  433. package/dist/plus/ai/models/results.js.map +1 -1
  434. package/dist/plus/ai/prompts.d.ts +1 -1
  435. package/dist/plus/ai/prompts.d.ts.map +1 -1
  436. package/dist/plus/ai/prompts.js +15 -47
  437. package/dist/plus/ai/prompts.js.map +1 -1
  438. package/dist/plus/ai/providers/anthropicProvider.d.ts +5 -0
  439. package/dist/plus/ai/providers/anthropicProvider.d.ts.map +1 -1
  440. package/dist/plus/ai/providers/anthropicProvider.js +40 -3
  441. package/dist/plus/ai/providers/anthropicProvider.js.map +1 -1
  442. package/dist/plus/ai/providers/azureProvider.d.ts.map +1 -1
  443. package/dist/plus/ai/providers/azureProvider.js.map +1 -1
  444. package/dist/plus/ai/providers/context.d.ts.map +1 -1
  445. package/dist/plus/ai/providers/context.js.map +1 -1
  446. package/dist/plus/ai/providers/deepSeekProvider.d.ts.map +1 -1
  447. package/dist/plus/ai/providers/deepSeekProvider.js +17 -1
  448. package/dist/plus/ai/providers/deepSeekProvider.js.map +1 -1
  449. package/dist/plus/ai/providers/geminiProvider.d.ts.map +1 -1
  450. package/dist/plus/ai/providers/geminiProvider.js +25 -6
  451. package/dist/plus/ai/providers/geminiProvider.js.map +1 -1
  452. package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
  453. package/dist/plus/ai/providers/gitkrakenProvider.js +1 -0
  454. package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
  455. package/dist/plus/ai/providers/huggingFaceProvider.d.ts +1 -1
  456. package/dist/plus/ai/providers/huggingFaceProvider.d.ts.map +1 -1
  457. package/dist/plus/ai/providers/huggingFaceProvider.js +21 -18
  458. package/dist/plus/ai/providers/huggingFaceProvider.js.map +1 -1
  459. package/dist/plus/ai/providers/mistralProvider.d.ts.map +1 -1
  460. package/dist/plus/ai/providers/mistralProvider.js.map +1 -1
  461. package/dist/plus/ai/providers/ollamaProvider.d.ts.map +1 -1
  462. package/dist/plus/ai/providers/ollamaProvider.js.map +1 -1
  463. package/dist/plus/ai/providers/openAICompatibleProvider.d.ts.map +1 -1
  464. package/dist/plus/ai/providers/openAICompatibleProvider.js.map +1 -1
  465. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +10 -1
  466. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
  467. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +9 -1
  468. package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
  469. package/dist/plus/ai/providers/openRouterProvider.d.ts.map +1 -1
  470. package/dist/plus/ai/providers/openRouterProvider.js.map +1 -1
  471. package/dist/plus/ai/providers/openaiProvider.d.ts.map +1 -1
  472. package/dist/plus/ai/providers/openaiProvider.js.map +1 -1
  473. package/dist/plus/ai/providers/xaiProvider.d.ts.map +1 -1
  474. package/dist/plus/ai/providers/xaiProvider.js +14 -1
  475. package/dist/plus/ai/providers/xaiProvider.js.map +1 -1
  476. package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
  477. package/dist/plus/ai/utils/ai.utils.js +0 -2
  478. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  479. package/dist/plus/ai/utils/results.utils.d.ts +3 -0
  480. package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
  481. package/dist/plus/ai/utils/results.utils.js +26 -0
  482. package/dist/plus/ai/utils/results.utils.js.map +1 -1
  483. package/dist/plus/ai/utils/truncation.utils.d.ts +1 -1
  484. package/dist/plus/ai/utils/truncation.utils.d.ts.map +1 -1
  485. package/dist/plus/ai/utils/truncation.utils.js.map +1 -1
  486. package/dist/plus/git-github/api/config.d.ts.map +1 -1
  487. package/dist/plus/git-github/api/config.js.map +1 -1
  488. package/dist/plus/git-github/api/github.d.ts +66 -3
  489. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  490. package/dist/plus/git-github/api/github.js +345 -74
  491. package/dist/plus/git-github/api/github.js.map +1 -1
  492. package/dist/plus/git-github/api/github.utils.d.ts.map +1 -1
  493. package/dist/plus/git-github/api/github.utils.js.map +1 -1
  494. package/dist/plus/git-github/api/token.d.ts.map +1 -1
  495. package/dist/plus/git-github/api/token.js.map +1 -1
  496. package/dist/plus/git-github/api/tokenUtils.d.ts.map +1 -1
  497. package/dist/plus/git-github/api/tokenUtils.js.map +1 -1
  498. package/dist/plus/git-github/api/types.d.ts.map +1 -1
  499. package/dist/plus/git-github/api/types.js.map +1 -1
  500. package/dist/plus/git-github/context.d.ts.map +1 -1
  501. package/dist/plus/git-github/models.d.ts +5 -0
  502. package/dist/plus/git-github/models.d.ts.map +1 -1
  503. package/dist/plus/git-github/models.js +27 -2
  504. package/dist/plus/git-github/models.js.map +1 -1
  505. package/dist/plus/git-github/providers/github/blame.d.ts.map +1 -1
  506. package/dist/plus/git-github/providers/github/blame.js.map +1 -1
  507. package/dist/plus/git-github/providers/github/branches.d.ts +2 -1
  508. package/dist/plus/git-github/providers/github/branches.d.ts.map +1 -1
  509. package/dist/plus/git-github/providers/github/branches.js +7 -3
  510. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  511. package/dist/plus/git-github/providers/github/commits.d.ts.map +1 -1
  512. package/dist/plus/git-github/providers/github/commits.js.map +1 -1
  513. package/dist/plus/git-github/providers/github/config.d.ts.map +1 -1
  514. package/dist/plus/git-github/providers/github/config.js.map +1 -1
  515. package/dist/plus/git-github/providers/github/contributors.d.ts.map +1 -1
  516. package/dist/plus/git-github/providers/github/contributors.js.map +1 -1
  517. package/dist/plus/git-github/providers/github/diff.d.ts.map +1 -1
  518. package/dist/plus/git-github/providers/github/diff.js +2 -2
  519. package/dist/plus/git-github/providers/github/diff.js.map +1 -1
  520. package/dist/plus/git-github/providers/github/graph.d.ts +12 -1
  521. package/dist/plus/git-github/providers/github/graph.d.ts.map +1 -1
  522. package/dist/plus/git-github/providers/github/graph.js +85 -0
  523. package/dist/plus/git-github/providers/github/graph.js.map +1 -1
  524. package/dist/plus/git-github/providers/github/refs.d.ts.map +1 -1
  525. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  526. package/dist/plus/git-github/providers/github/remotes.d.ts.map +1 -1
  527. package/dist/plus/git-github/providers/github/remotes.js.map +1 -1
  528. package/dist/plus/git-github/providers/github/revision.d.ts.map +1 -1
  529. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  530. package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
  531. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  532. package/dist/plus/git-github/providers/github/tags.d.ts.map +1 -1
  533. package/dist/plus/git-github/providers/github/tags.js +3 -1
  534. package/dist/plus/git-github/providers/github/tags.js.map +1 -1
  535. package/dist/plus/git-github/providers/githubGitProvider.d.ts.map +1 -1
  536. package/dist/plus/git-github/providers/githubGitProvider.js.map +1 -1
  537. package/dist/plus/git-github/providers/githubProvider.d.ts.map +1 -1
  538. package/dist/plus/git-github/providers/githubProvider.js.map +1 -1
  539. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts +20 -1
  540. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts.map +1 -1
  541. package/dist/plus/integrations/authentication/cloudIntegrationService.js +134 -10
  542. package/dist/plus/integrations/authentication/cloudIntegrationService.js.map +1 -1
  543. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts +52 -5
  544. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts.map +1 -1
  545. package/dist/plus/integrations/authentication/configuredIntegrationService.js +248 -46
  546. package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -1
  547. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts +24 -4
  548. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts.map +1 -1
  549. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +58 -26
  550. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js.map +1 -1
  551. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts.map +1 -1
  552. package/dist/plus/integrations/authentication/integrationAuthenticationService.js +7 -3
  553. package/dist/plus/integrations/authentication/integrationAuthenticationService.js.map +1 -1
  554. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts +1 -0
  555. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts.map +1 -1
  556. package/dist/plus/integrations/authentication/manualTokenProvider.js +9 -5
  557. package/dist/plus/integrations/authentication/manualTokenProvider.js.map +1 -1
  558. package/dist/plus/integrations/authentication/models.d.ts +33 -0
  559. package/dist/plus/integrations/authentication/models.d.ts.map +1 -1
  560. package/dist/plus/integrations/authentication/models.js.map +1 -1
  561. package/dist/plus/integrations/collectionMetadata.d.ts +21 -0
  562. package/dist/plus/integrations/collectionMetadata.d.ts.map +1 -0
  563. package/dist/plus/integrations/collectionMetadata.js +121 -0
  564. package/dist/plus/integrations/collectionMetadata.js.map +1 -0
  565. package/dist/plus/integrations/constants.d.ts +12 -2
  566. package/dist/plus/integrations/constants.d.ts.map +1 -1
  567. package/dist/plus/integrations/constants.js +10 -0
  568. package/dist/plus/integrations/constants.js.map +1 -1
  569. package/dist/plus/integrations/context.d.ts +10 -6
  570. package/dist/plus/integrations/context.d.ts.map +1 -1
  571. package/dist/plus/integrations/errors.d.ts +65 -0
  572. package/dist/plus/integrations/errors.d.ts.map +1 -1
  573. package/dist/plus/integrations/errors.js +131 -0
  574. package/dist/plus/integrations/errors.js.map +1 -1
  575. package/dist/plus/integrations/index.d.ts +57 -12
  576. package/dist/plus/integrations/index.d.ts.map +1 -1
  577. package/dist/plus/integrations/index.js +39 -37
  578. package/dist/plus/integrations/index.js.map +1 -1
  579. package/dist/plus/integrations/integrationService.d.ts +293 -12
  580. package/dist/plus/integrations/integrationService.d.ts.map +1 -1
  581. package/dist/plus/integrations/integrationService.js +1305 -37
  582. package/dist/plus/integrations/integrationService.js.map +1 -1
  583. package/dist/plus/integrations/lite.d.ts +47 -0
  584. package/dist/plus/integrations/lite.d.ts.map +1 -0
  585. package/dist/plus/integrations/lite.js +141 -0
  586. package/dist/plus/integrations/lite.js.map +1 -0
  587. package/dist/plus/integrations/manager.d.ts +332 -0
  588. package/dist/plus/integrations/manager.d.ts.map +1 -0
  589. package/dist/plus/integrations/manager.js +2 -0
  590. package/dist/plus/integrations/manager.js.map +1 -0
  591. package/dist/plus/integrations/models/gitHostIntegration.d.ts +269 -10
  592. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -1
  593. package/dist/plus/integrations/models/gitHostIntegration.js +712 -88
  594. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  595. package/dist/plus/integrations/models/integration.d.ts +88 -3
  596. package/dist/plus/integrations/models/integration.d.ts.map +1 -1
  597. package/dist/plus/integrations/models/integration.js +192 -21
  598. package/dist/plus/integrations/models/integration.js.map +1 -1
  599. package/dist/plus/integrations/models/issuesIntegration.d.ts +87 -7
  600. package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -1
  601. package/dist/plus/integrations/models/issuesIntegration.js +148 -33
  602. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
  603. package/dist/plus/integrations/providerFilters.d.ts +12 -0
  604. package/dist/plus/integrations/providerFilters.d.ts.map +1 -0
  605. package/dist/plus/integrations/providerFilters.js +14 -0
  606. package/dist/plus/integrations/providerFilters.js.map +1 -0
  607. package/dist/plus/integrations/providers/apiClients.d.ts.map +1 -1
  608. package/dist/plus/integrations/providers/apiClients.js +3 -3
  609. package/dist/plus/integrations/providers/apiClients.js.map +1 -1
  610. package/dist/plus/integrations/providers/apiConfig.d.ts +52 -0
  611. package/dist/plus/integrations/providers/apiConfig.d.ts.map +1 -0
  612. package/dist/plus/integrations/providers/apiConfig.js +19 -0
  613. package/dist/plus/integrations/providers/apiConfig.js.map +1 -0
  614. package/dist/plus/integrations/providers/azure/azure.d.ts +14 -2
  615. package/dist/plus/integrations/providers/azure/azure.d.ts.map +1 -1
  616. package/dist/plus/integrations/providers/azure/azure.js +107 -32
  617. package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
  618. package/dist/plus/integrations/providers/azure/models.d.ts +16 -0
  619. package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -1
  620. package/dist/plus/integrations/providers/azure/models.js +6 -6
  621. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  622. package/dist/plus/integrations/providers/azureDevOps.d.ts +55 -9
  623. package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -1
  624. package/dist/plus/integrations/providers/azureDevOps.js +572 -79
  625. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  626. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +13 -2
  627. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts.map +1 -1
  628. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +108 -32
  629. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -1
  630. package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -1
  631. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
  632. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +19 -1
  633. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts.map +1 -1
  634. package/dist/plus/integrations/providers/bitbucket-server/models.js +20 -1
  635. package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -1
  636. package/dist/plus/integrations/providers/bitbucket-server.d.ts +28 -4
  637. package/dist/plus/integrations/providers/bitbucket-server.d.ts.map +1 -1
  638. package/dist/plus/integrations/providers/bitbucket-server.js +110 -6
  639. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
  640. package/dist/plus/integrations/providers/bitbucket.d.ts +38 -4
  641. package/dist/plus/integrations/providers/bitbucket.d.ts.map +1 -1
  642. package/dist/plus/integrations/providers/bitbucket.js +330 -34
  643. package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
  644. package/dist/plus/integrations/providers/github/github.d.ts.map +1 -1
  645. package/dist/plus/integrations/providers/github/github.js +1 -1
  646. package/dist/plus/integrations/providers/github/github.js.map +1 -1
  647. package/dist/plus/integrations/providers/github/github.utils.d.ts.map +1 -1
  648. package/dist/plus/integrations/providers/github/github.utils.js.map +1 -1
  649. package/dist/plus/integrations/providers/github/models.d.ts.map +1 -1
  650. package/dist/plus/integrations/providers/github/models.js.map +1 -1
  651. package/dist/plus/integrations/providers/github.d.ts +49 -6
  652. package/dist/plus/integrations/providers/github.d.ts.map +1 -1
  653. package/dist/plus/integrations/providers/github.js +289 -4
  654. package/dist/plus/integrations/providers/github.js.map +1 -1
  655. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +11 -3
  656. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts.map +1 -1
  657. package/dist/plus/integrations/providers/gitlab/gitlab.js +121 -47
  658. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -1
  659. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts +6 -0
  660. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts.map +1 -1
  661. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js +8 -0
  662. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js.map +1 -1
  663. package/dist/plus/integrations/providers/gitlab/models.d.ts +10 -0
  664. package/dist/plus/integrations/providers/gitlab/models.d.ts.map +1 -1
  665. package/dist/plus/integrations/providers/gitlab/models.js +8 -5
  666. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -1
  667. package/dist/plus/integrations/providers/gitlab.d.ts +50 -5
  668. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -1
  669. package/dist/plus/integrations/providers/gitlab.js +274 -8
  670. package/dist/plus/integrations/providers/gitlab.js.map +1 -1
  671. package/dist/plus/integrations/providers/jira.d.ts +13 -2
  672. package/dist/plus/integrations/providers/jira.d.ts.map +1 -1
  673. package/dist/plus/integrations/providers/jira.js +200 -30
  674. package/dist/plus/integrations/providers/jira.js.map +1 -1
  675. package/dist/plus/integrations/providers/linear.d.ts +16 -5
  676. package/dist/plus/integrations/providers/linear.d.ts.map +1 -1
  677. package/dist/plus/integrations/providers/linear.js +127 -21
  678. package/dist/plus/integrations/providers/linear.js.map +1 -1
  679. package/dist/plus/integrations/providers/models.d.ts +339 -60
  680. package/dist/plus/integrations/providers/models.d.ts.map +1 -1
  681. package/dist/plus/integrations/providers/models.js +307 -59
  682. package/dist/plus/integrations/providers/models.js.map +1 -1
  683. package/dist/plus/integrations/providers/providersApi.d.ts +144 -11
  684. package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -1
  685. package/dist/plus/integrations/providers/providersApi.js +486 -55
  686. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  687. package/dist/plus/integrations/providers/trello.d.ts +47 -0
  688. package/dist/plus/integrations/providers/trello.d.ts.map +1 -0
  689. package/dist/plus/integrations/providers/trello.js +141 -0
  690. package/dist/plus/integrations/providers/trello.js.map +1 -0
  691. package/dist/plus/integrations/providers/utils/providerPaging.d.ts +29 -0
  692. package/dist/plus/integrations/providers/utils/providerPaging.d.ts.map +1 -0
  693. package/dist/plus/integrations/providers/utils/providerPaging.js +154 -0
  694. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -0
  695. package/dist/plus/integrations/providers/utils.d.ts +21 -0
  696. package/dist/plus/integrations/providers/utils.d.ts.map +1 -1
  697. package/dist/plus/integrations/providers/utils.js +57 -6
  698. package/dist/plus/integrations/providers/utils.js.map +1 -1
  699. package/dist/plus/integrations/reads/context.d.ts +52 -0
  700. package/dist/plus/integrations/reads/context.d.ts.map +1 -0
  701. package/dist/plus/integrations/reads/context.js +2 -0
  702. package/dist/plus/integrations/reads/context.js.map +1 -0
  703. package/dist/plus/integrations/reads/cursors.d.ts +66 -0
  704. package/dist/plus/integrations/reads/cursors.d.ts.map +1 -0
  705. package/dist/plus/integrations/reads/cursors.js +133 -0
  706. package/dist/plus/integrations/reads/cursors.js.map +1 -0
  707. package/dist/plus/integrations/reads/drains.d.ts +60 -0
  708. package/dist/plus/integrations/reads/drains.d.ts.map +1 -0
  709. package/dist/plus/integrations/reads/drains.js +255 -0
  710. package/dist/plus/integrations/reads/drains.js.map +1 -0
  711. package/dist/plus/integrations/reads/filters.d.ts +81 -0
  712. package/dist/plus/integrations/reads/filters.d.ts.map +1 -0
  713. package/dist/plus/integrations/reads/filters.js +87 -0
  714. package/dist/plus/integrations/reads/filters.js.map +1 -0
  715. package/dist/plus/integrations/reads/hierarchy.d.ts +17 -0
  716. package/dist/plus/integrations/reads/hierarchy.d.ts.map +1 -0
  717. package/dist/plus/integrations/reads/hierarchy.js +348 -0
  718. package/dist/plus/integrations/reads/hierarchy.js.map +1 -0
  719. package/dist/plus/integrations/reads/hierarchy.utils.d.ts +53 -0
  720. package/dist/plus/integrations/reads/hierarchy.utils.d.ts.map +1 -0
  721. package/dist/plus/integrations/reads/hierarchy.utils.js +85 -0
  722. package/dist/plus/integrations/reads/hierarchy.utils.js.map +1 -0
  723. package/dist/plus/integrations/reads/issueTracker.d.ts +19 -0
  724. package/dist/plus/integrations/reads/issueTracker.d.ts.map +1 -0
  725. package/dist/plus/integrations/reads/issueTracker.js +346 -0
  726. package/dist/plus/integrations/reads/issueTracker.js.map +1 -0
  727. package/dist/plus/integrations/reads/issues.d.ts +34 -0
  728. package/dist/plus/integrations/reads/issues.d.ts.map +1 -0
  729. package/dist/plus/integrations/reads/issues.js +244 -0
  730. package/dist/plus/integrations/reads/issues.js.map +1 -0
  731. package/dist/plus/integrations/reads/paging.d.ts +136 -0
  732. package/dist/plus/integrations/reads/paging.d.ts.map +1 -0
  733. package/dist/plus/integrations/reads/paging.js +221 -0
  734. package/dist/plus/integrations/reads/paging.js.map +1 -0
  735. package/dist/plus/integrations/reads/pullRequests.d.ts +32 -0
  736. package/dist/plus/integrations/reads/pullRequests.d.ts.map +1 -0
  737. package/dist/plus/integrations/reads/pullRequests.js +151 -0
  738. package/dist/plus/integrations/reads/pullRequests.js.map +1 -0
  739. package/dist/plus/integrations/reads/warnings.d.ts +47 -0
  740. package/dist/plus/integrations/reads/warnings.d.ts.map +1 -0
  741. package/dist/plus/integrations/reads/warnings.js +81 -0
  742. package/dist/plus/integrations/reads/warnings.js.map +1 -0
  743. package/dist/plus/integrations/results.d.ts +189 -0
  744. package/dist/plus/integrations/results.d.ts.map +1 -0
  745. package/dist/plus/integrations/results.js +62 -0
  746. package/dist/plus/integrations/results.js.map +1 -0
  747. package/dist/plus/integrations/utils/domain.utils.d.ts +5 -0
  748. package/dist/plus/integrations/utils/domain.utils.d.ts.map +1 -0
  749. package/dist/plus/integrations/utils/domain.utils.js +27 -0
  750. package/dist/plus/integrations/utils/domain.utils.js.map +1 -0
  751. package/dist/plus/integrations/utils/integration.utils.d.ts +27 -1
  752. package/dist/plus/integrations/utils/integration.utils.d.ts.map +1 -1
  753. package/dist/plus/integrations/utils/integration.utils.js +86 -15
  754. package/dist/plus/integrations/utils/integration.utils.js.map +1 -1
  755. package/dist/utils/array.d.ts.map +1 -1
  756. package/dist/utils/array.js.map +1 -1
  757. package/dist/utils/brand.d.ts.map +1 -1
  758. package/dist/utils/cancellation.d.ts +13 -0
  759. package/dist/utils/cancellation.d.ts.map +1 -1
  760. package/dist/utils/cancellation.js +52 -7
  761. package/dist/utils/cancellation.js.map +1 -1
  762. package/dist/utils/charCode.d.ts.map +1 -1
  763. package/dist/utils/coalescedRun.d.ts +16 -0
  764. package/dist/utils/coalescedRun.d.ts.map +1 -0
  765. package/dist/utils/coalescedRun.js +43 -0
  766. package/dist/utils/coalescedRun.js.map +1 -0
  767. package/dist/utils/color.d.ts.map +1 -1
  768. package/dist/utils/color.js +3 -3
  769. package/dist/utils/color.js.map +1 -1
  770. package/dist/utils/date.d.ts +24 -0
  771. package/dist/utils/date.d.ts.map +1 -1
  772. package/dist/utils/date.js +62 -0
  773. package/dist/utils/date.js.map +1 -1
  774. package/dist/utils/debounce.js +1 -1
  775. package/dist/utils/debounce.js.map +1 -1
  776. package/dist/utils/decorators/debounce.d.ts.map +1 -1
  777. package/dist/utils/decorators/debounce.js.map +1 -1
  778. package/dist/utils/decorators/gate.d.ts.map +1 -1
  779. package/dist/utils/decorators/gate.js +2 -2
  780. package/dist/utils/decorators/gate.js.map +1 -1
  781. package/dist/utils/decorators/log.d.ts.map +1 -1
  782. package/dist/utils/decorators/log.js +5 -5
  783. package/dist/utils/decorators/log.js.map +1 -1
  784. package/dist/utils/decorators/memoize.d.ts.map +1 -1
  785. package/dist/utils/decorators/memoize.js +2 -2
  786. package/dist/utils/decorators/memoize.js.map +1 -1
  787. package/dist/utils/decorators/resolver.d.ts.map +1 -1
  788. package/dist/utils/decorators/resolver.js.map +1 -1
  789. package/dist/utils/decorators/sequentialize.d.ts.map +1 -1
  790. package/dist/utils/decorators/sequentialize.js +2 -2
  791. package/dist/utils/decorators/sequentialize.js.map +1 -1
  792. package/dist/utils/decorators/serializable.d.ts.map +1 -1
  793. package/dist/utils/decorators/serializable.js +1 -1
  794. package/dist/utils/decorators/serializable.js.map +1 -1
  795. package/dist/utils/dedupedAsyncCache.d.ts.map +1 -1
  796. package/dist/utils/env/browser/base64.d.ts.map +1 -1
  797. package/dist/utils/env/browser/base64.js.map +1 -1
  798. package/dist/utils/env/browser/crypto.d.ts.map +1 -1
  799. package/dist/utils/env/browser/crypto.js.map +1 -1
  800. package/dist/utils/env/browser/fs.d.ts.map +1 -1
  801. package/dist/utils/env/browser/fs.js.map +1 -1
  802. package/dist/utils/env/browser/hex.d.ts.map +1 -1
  803. package/dist/utils/env/browser/hex.js.map +1 -1
  804. package/dist/utils/env/browser/hrtime.d.ts.map +1 -1
  805. package/dist/utils/env/browser/hrtime.js.map +1 -1
  806. package/dist/utils/env/browser/logScope.d.ts.map +1 -1
  807. package/dist/utils/env/browser/logScope.js.map +1 -1
  808. package/dist/utils/env/browser/md5.d.ts.map +1 -1
  809. package/dist/utils/env/browser/md5.js.map +1 -1
  810. package/dist/utils/env/browser/platform.d.ts.map +1 -1
  811. package/dist/utils/env/browser/platform.js.map +1 -1
  812. package/dist/utils/env/node/base64.d.ts.map +1 -1
  813. package/dist/utils/env/node/base64.js.map +1 -1
  814. package/dist/utils/env/node/crypto.d.ts.map +1 -1
  815. package/dist/utils/env/node/crypto.js.map +1 -1
  816. package/dist/utils/env/node/exec.d.ts +9 -1
  817. package/dist/utils/env/node/exec.d.ts.map +1 -1
  818. package/dist/utils/env/node/exec.js +11 -4
  819. package/dist/utils/env/node/exec.js.map +1 -1
  820. package/dist/utils/env/node/fs.d.ts.map +1 -1
  821. package/dist/utils/env/node/fs.js.map +1 -1
  822. package/dist/utils/env/node/hex.d.ts.map +1 -1
  823. package/dist/utils/env/node/hex.js.map +1 -1
  824. package/dist/utils/env/node/hrtime.d.ts.map +1 -1
  825. package/dist/utils/env/node/hrtime.js.map +1 -1
  826. package/dist/utils/env/node/logScope.d.ts.map +1 -1
  827. package/dist/utils/env/node/logScope.js.map +1 -1
  828. package/dist/utils/env/node/platform.d.ts.map +1 -1
  829. package/dist/utils/env/node/platform.js.map +1 -1
  830. package/dist/utils/event.d.ts.map +1 -1
  831. package/dist/utils/event.js +18 -22
  832. package/dist/utils/event.js.map +1 -1
  833. package/dist/utils/formatter.d.ts.map +1 -1
  834. package/dist/utils/formatter.js.map +1 -1
  835. package/dist/utils/function.d.ts.map +1 -1
  836. package/dist/utils/function.js +3 -3
  837. package/dist/utils/function.js.map +1 -1
  838. package/dist/utils/hash.js.map +1 -1
  839. package/dist/utils/iterable.d.ts.map +1 -1
  840. package/dist/utils/iterable.js +2 -6
  841. package/dist/utils/iterable.js.map +1 -1
  842. package/dist/utils/lazy.d.ts.map +1 -1
  843. package/dist/utils/lazy.js.map +1 -1
  844. package/dist/utils/logger.d.ts.map +1 -1
  845. package/dist/utils/logger.js +1 -1
  846. package/dist/utils/logger.js.map +1 -1
  847. package/dist/utils/logger.scoped.js +1 -1
  848. package/dist/utils/logger.scoped.js.map +1 -1
  849. package/dist/utils/lruMap.d.ts.map +1 -1
  850. package/dist/utils/lruMap.js.map +1 -1
  851. package/dist/utils/mru.d.ts.map +1 -1
  852. package/dist/utils/mru.js.map +1 -1
  853. package/dist/utils/object.js.map +1 -1
  854. package/dist/utils/paging.d.ts +29 -0
  855. package/dist/utils/paging.d.ts.map +1 -1
  856. package/dist/utils/paging.js +18 -0
  857. package/dist/utils/paging.js.map +1 -1
  858. package/dist/utils/path.js.map +1 -1
  859. package/dist/utils/promise.d.ts +10 -0
  860. package/dist/utils/promise.d.ts.map +1 -1
  861. package/dist/utils/promise.js +26 -3
  862. package/dist/utils/promise.js.map +1 -1
  863. package/dist/utils/promiseCache.d.ts +12 -2
  864. package/dist/utils/promiseCache.d.ts.map +1 -1
  865. package/dist/utils/promiseCache.js +80 -50
  866. package/dist/utils/promiseCache.js.map +1 -1
  867. package/dist/utils/searchTree.d.ts.map +1 -1
  868. package/dist/utils/searchTree.js +4 -1
  869. package/dist/utils/searchTree.js.map +1 -1
  870. package/dist/utils/stopwatch.d.ts.map +1 -1
  871. package/dist/utils/string.js +1 -1
  872. package/dist/utils/string.js.map +1 -1
  873. package/dist/utils/subscriptionManager.d.ts.map +1 -1
  874. package/dist/utils/subscriptionManager.js.map +1 -1
  875. package/dist/utils/trie.d.ts.map +1 -1
  876. package/dist/utils/trie.js +1 -0
  877. package/dist/utils/trie.js.map +1 -1
  878. package/docs/integrations.md +372 -0
  879. package/docs/kepler-read-api-parity.md +112 -0
  880. package/package.json +238 -213
  881. package/src/git/cache.ts +75 -8
  882. package/src/git/errors.ts +36 -1
  883. package/src/git/models/commit.ts +1 -1
  884. package/src/git/models/graph.ts +147 -0
  885. package/src/git/models/graphSession.ts +205 -0
  886. package/src/git/models/issue.ts +12 -1
  887. package/src/git/models/pullRequest.ts +27 -1
  888. package/src/git/models/repository.ts +24 -1
  889. package/src/git/models/resourceDescriptor.ts +17 -0
  890. package/src/git/models/signature.ts +16 -0
  891. package/src/git/models/tag.ts +6 -1
  892. package/src/git/parsers/diffParser.ts +1 -1
  893. package/src/git/providers/branches.ts +6 -1
  894. package/src/git/providers/commits.ts +6 -1
  895. package/src/git/providers/config.ts +5 -1
  896. package/src/git/providers/graph.ts +69 -2
  897. package/src/git/providers/status.ts +1 -1
  898. package/src/git/providers/worktrees.ts +3 -1
  899. package/src/git/remotes/azure-devops.ts +29 -33
  900. package/src/git/remotes/bitbucket-server.ts +23 -25
  901. package/src/git/remotes/bitbucket.ts +23 -25
  902. package/src/git/remotes/gerrit.ts +12 -14
  903. package/src/git/remotes/gitea.ts +13 -15
  904. package/src/git/remotes/github.ts +56 -58
  905. package/src/git/remotes/gitlab.ts +102 -104
  906. package/src/git/run.types.ts +54 -4
  907. package/src/git/utils/branch.utils.ts +12 -1
  908. package/src/git/utils/contributor.utils.ts +1 -1
  909. package/src/git/utils/fileStatus.utils.ts +7 -0
  910. package/src/git/utils/graph.utils.ts +46 -0
  911. package/src/git/utils/issue.utils.ts +1 -0
  912. package/src/git/utils/pullRequest.utils.ts +9 -0
  913. package/src/git/utils/reachability.utils.ts +79 -8
  914. package/src/git/utils/sshKey.utils.ts +30 -0
  915. package/src/git/watching/watchService.ts +16 -1
  916. package/src/git/watching/watchSession.ts +20 -2
  917. package/src/git-cli/exec/git.ts +144 -42
  918. package/src/git-cli/parsers/logParser.ts +83 -1
  919. package/src/git-cli/parsers/sshSignatureParser.ts +85 -0
  920. package/src/git-cli/parsers/worktreeParser.ts +5 -7
  921. package/src/git-cli/providers/branches.ts +60 -38
  922. package/src/git-cli/providers/commits.ts +102 -9
  923. package/src/git-cli/providers/graph.ts +1771 -393
  924. package/src/git-cli/providers/pausedOperations.ts +3 -3
  925. package/src/git-cli/providers/revision.ts +42 -0
  926. package/src/git-cli/providers/status.ts +333 -178
  927. package/src/git-cli/providers/tags.ts +2 -0
  928. package/src/git-cli/providers/worktrees.ts +40 -4
  929. package/src/git-cli/service.ts +9 -0
  930. package/src/ipc/ipcServer.ts +1 -1
  931. package/src/plus/agents/providers/claudeCodeProvider.ts +25 -0
  932. package/src/plus/agents/providers/claudeCodeTranscript.ts +320 -8
  933. package/src/plus/agents/types.ts +34 -0
  934. package/src/plus/ai/constants.ts +1 -9
  935. package/src/plus/ai/models/model.ts +53 -2
  936. package/src/plus/ai/models/promptTemplates.ts +9 -2
  937. package/src/plus/ai/prompts.ts +16 -48
  938. package/src/plus/ai/providers/anthropicProvider.ts +45 -3
  939. package/src/plus/ai/providers/deepSeekProvider.ts +17 -1
  940. package/src/plus/ai/providers/geminiProvider.ts +25 -6
  941. package/src/plus/ai/providers/gitkrakenProvider.ts +2 -0
  942. package/src/plus/ai/providers/huggingFaceProvider.ts +28 -21
  943. package/src/plus/ai/providers/openAICompatibleProviderBase.ts +16 -1
  944. package/src/plus/ai/providers/xaiProvider.ts +14 -1
  945. package/src/plus/ai/utils/ai.utils.ts +0 -2
  946. package/src/plus/ai/utils/results.utils.ts +32 -0
  947. package/src/plus/ai/utils/truncation.utils.ts +0 -1
  948. package/src/plus/git-github/api/github.ts +484 -104
  949. package/src/plus/git-github/models.ts +33 -0
  950. package/src/plus/git-github/providers/github/branches.ts +6 -3
  951. package/src/plus/git-github/providers/github/diff.ts +1 -1
  952. package/src/plus/git-github/providers/github/graph.ts +131 -0
  953. package/src/plus/git-github/providers/github/tags.ts +2 -0
  954. package/src/plus/integrations/authentication/cloudIntegrationService.ts +189 -17
  955. package/src/plus/integrations/authentication/configuredIntegrationService.ts +287 -50
  956. package/src/plus/integrations/authentication/integrationAuthenticationProvider.ts +105 -31
  957. package/src/plus/integrations/authentication/integrationAuthenticationService.ts +7 -3
  958. package/src/plus/integrations/authentication/manualTokenProvider.ts +12 -5
  959. package/src/plus/integrations/authentication/models.ts +35 -1
  960. package/src/plus/integrations/collectionMetadata.ts +143 -0
  961. package/src/plus/integrations/constants.ts +21 -0
  962. package/src/plus/integrations/context.ts +8 -9
  963. package/src/plus/integrations/errors.ts +149 -0
  964. package/src/plus/integrations/index.ts +148 -51
  965. package/src/plus/integrations/integrationService.ts +1714 -49
  966. package/src/plus/integrations/lite.ts +233 -0
  967. package/src/plus/integrations/manager.ts +359 -0
  968. package/src/plus/integrations/models/gitHostIntegration.ts +1014 -121
  969. package/src/plus/integrations/models/integration.ts +293 -24
  970. package/src/plus/integrations/models/issuesIntegration.ts +178 -38
  971. package/src/plus/integrations/providerFilters.ts +12 -0
  972. package/src/plus/integrations/providers/apiClients.ts +8 -11
  973. package/src/plus/integrations/providers/apiConfig.ts +71 -0
  974. package/src/plus/integrations/providers/azure/azure.ts +164 -33
  975. package/src/plus/integrations/providers/azure/models.ts +19 -6
  976. package/src/plus/integrations/providers/azureDevOps.ts +766 -101
  977. package/src/plus/integrations/providers/bitbucket/bitbucket.ts +164 -34
  978. package/src/plus/integrations/providers/bitbucket-server/models.ts +32 -1
  979. package/src/plus/integrations/providers/bitbucket-server.ts +173 -8
  980. package/src/plus/integrations/providers/bitbucket.ts +489 -45
  981. package/src/plus/integrations/providers/github/github.ts +2 -2
  982. package/src/plus/integrations/providers/github/github.utils.ts +1 -1
  983. package/src/plus/integrations/providers/github.ts +390 -6
  984. package/src/plus/integrations/providers/gitlab/gitlab.ts +170 -60
  985. package/src/plus/integrations/providers/gitlab/gitlab.utils.ts +9 -0
  986. package/src/plus/integrations/providers/gitlab/models.ts +19 -5
  987. package/src/plus/integrations/providers/gitlab.ts +369 -10
  988. package/src/plus/integrations/providers/jira.ts +247 -42
  989. package/src/plus/integrations/providers/linear.ts +154 -27
  990. package/src/plus/integrations/providers/models.ts +583 -75
  991. package/src/plus/integrations/providers/providersApi.ts +849 -86
  992. package/src/plus/integrations/providers/trello.ts +205 -0
  993. package/src/plus/integrations/providers/utils/providerPaging.ts +177 -0
  994. package/src/plus/integrations/providers/utils.ts +68 -8
  995. package/src/plus/integrations/reads/context.ts +75 -0
  996. package/src/plus/integrations/reads/cursors.ts +224 -0
  997. package/src/plus/integrations/reads/drains.ts +343 -0
  998. package/src/plus/integrations/reads/filters.ts +124 -0
  999. package/src/plus/integrations/reads/hierarchy.ts +493 -0
  1000. package/src/plus/integrations/reads/hierarchy.utils.ts +106 -0
  1001. package/src/plus/integrations/reads/issueTracker.ts +480 -0
  1002. package/src/plus/integrations/reads/issues.ts +407 -0
  1003. package/src/plus/integrations/reads/paging.ts +277 -0
  1004. package/src/plus/integrations/reads/pullRequests.ts +267 -0
  1005. package/src/plus/integrations/reads/warnings.ts +170 -0
  1006. package/src/plus/integrations/results.ts +275 -0
  1007. package/src/plus/integrations/utils/domain.utils.ts +26 -0
  1008. package/src/plus/integrations/utils/integration.utils.ts +93 -16
  1009. package/src/utils/brand.ts +0 -2
  1010. package/src/utils/cancellation.ts +56 -7
  1011. package/src/utils/coalescedRun.ts +45 -0
  1012. package/src/utils/color.ts +3 -3
  1013. package/src/utils/date.ts +72 -0
  1014. package/src/utils/debounce.ts +1 -1
  1015. package/src/utils/decorators/gate.ts +2 -2
  1016. package/src/utils/decorators/log.ts +5 -5
  1017. package/src/utils/decorators/memoize.ts +2 -2
  1018. package/src/utils/decorators/sequentialize.ts +2 -2
  1019. package/src/utils/decorators/serializable.ts +1 -1
  1020. package/src/utils/env/node/exec.ts +20 -5
  1021. package/src/utils/event.ts +19 -25
  1022. package/src/utils/function.ts +3 -3
  1023. package/src/utils/iterable.ts +2 -6
  1024. package/src/utils/logger.scoped.ts +1 -1
  1025. package/src/utils/logger.ts +1 -1
  1026. package/src/utils/paging.ts +46 -0
  1027. package/src/utils/promise.ts +33 -3
  1028. package/src/utils/promiseCache.ts +81 -51
  1029. package/src/utils/searchTree.ts +4 -2
  1030. package/src/utils/string.ts +1 -1
  1031. package/src/utils/trie.ts +1 -0
  1032. package/dist/plus/ai/providers/githubModelsProvider.d.ts +0 -19
  1033. package/dist/plus/ai/providers/githubModelsProvider.d.ts.map +0 -1
  1034. package/dist/plus/ai/providers/githubModelsProvider.js +0 -51
  1035. package/dist/plus/ai/providers/githubModelsProvider.js.map +0 -1
  1036. package/src/plus/ai/providers/githubModelsProvider.ts +0 -92
@@ -1,7 +1,9 @@
1
+ import type { CollectionMetadata, CollectionScopeFailure } from '@gitkraken/provider-apis';
1
2
  import type { Account, UnidentifiedAuthor } from '../../../git/models/author.js';
2
3
  import type { DefaultBranch } from '../../../git/models/defaultBranch.js';
4
+ import type { IssueShape, IssueStateFilter } from '../../../git/models/issue.js';
3
5
  import type { IssueOrPullRequestState as PullRequestState } from '../../../git/models/issueOrPullRequest.js';
4
- import type { PullRequest, PullRequestMergeMethod } from '../../../git/models/pullRequest.js';
6
+ import type { PullRequest, PullRequestMergeMethod, PullRequestStateFilter } from '../../../git/models/pullRequest.js';
5
7
  import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata.js';
6
8
  import type { ResourceDescriptor } from '../../../git/models/resourceDescriptor.js';
7
9
  import type { PullRequestUrlIdentity } from '../../../git/utils/pullRequest.utils.js';
@@ -12,24 +14,96 @@ import { Logger } from '../../../utils/logger.js';
12
14
  import { getScopedLogger } from '../../../utils/logger.scoped.js';
13
15
  import type { PagedResult } from '../../../utils/paging.js';
14
16
  import type { ProviderAuthenticationSession } from '../authentication/models.js';
17
+ import { toTokenWithInfo } from '../authentication/models.js';
18
+ import { toCollectionScopeFailure } from '../collectionMetadata.js';
15
19
  import type { IntegrationIds } from '../constants.js';
16
- import { GitCloudHostIntegrationId } from '../constants.js';
20
+ import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId } from '../constants.js';
21
+ import { toError } from '../errors.js';
17
22
  import type {
18
23
  GetIssuesOptions,
19
24
  GetPullRequestsOptions,
20
25
  PagedProjectInput,
21
26
  PagedRepoInput,
22
27
  ProviderAccount,
28
+ ProviderApiPagedResult,
29
+ ProviderHierarchyResult,
23
30
  ProviderIssue,
31
+ ProviderOrganization,
24
32
  ProviderPullRequest,
25
33
  ProviderRepoInput,
26
34
  ProviderReposInput,
27
35
  ProviderRepository,
28
36
  } from '../providers/models.js';
29
- import { IssueFilter, PagingMode, PullRequestFilter } 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';
30
47
  import type { IntegrationResult, IntegrationType } from './integration.js';
31
48
  import { IntegrationBase } from './integration.js';
32
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
+
33
107
  export abstract class GitHostIntegration<
34
108
  ID extends IntegrationIds = IntegrationIds,
35
109
  T extends ResourceDescriptor = ResourceDescriptor,
@@ -63,6 +137,40 @@ export abstract class GitHostIntegration<
63
137
  options?: { avatarSize?: number },
64
138
  ): Promise<Account | undefined>;
65
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
+
66
174
  @gate()
67
175
  @trace()
68
176
  async getAccountForCommit(
@@ -126,7 +234,12 @@ export abstract class GitHostIntegration<
126
234
  return defaultBranch;
127
235
  }
128
236
 
129
- getRepoInfo?(repo: { owner: string; name: string; project?: string }): Promise<ProviderRepository | undefined>;
237
+ getRepoInfo?(repo: {
238
+ owner: string;
239
+ name: string;
240
+ project?: string;
241
+ connectionId?: string;
242
+ }): Promise<ProviderRepository | undefined>;
130
243
 
131
244
  protected abstract getProviderDefaultBranch(
132
245
  { accessToken }: ProviderAuthenticationSession,
@@ -176,6 +289,209 @@ export abstract class GitHostIntegration<
176
289
  cancellation?: AbortSignal,
177
290
  ): Promise<RepositoryMetadata | undefined>;
178
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
+
179
495
  async mergePullRequest(pr: PullRequest, options?: { mergeMethod?: PullRequestMergeMethod }): Promise<boolean> {
180
496
  const scope = getScopedLogger();
181
497
 
@@ -283,30 +599,122 @@ export abstract class GitHostIntegration<
283
599
  rev: string,
284
600
  ): Promise<PullRequest | undefined>;
285
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
+
286
653
  async getMyIssuesForRepos(
287
654
  reposOrRepoIds: ProviderReposInput,
288
- options?: { filters?: IssueFilter[]; cursor?: string; customUrl?: string },
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,
289
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>> {
290
690
  const scope = getScopedLogger();
291
691
  const providerId = this.authProvider.id;
292
- const connected = this.maybeConnected ?? (await this.isConnected());
293
- if (!connected) return undefined;
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;
294
697
 
295
- await this.refreshSessionIfExpired(scope);
698
+ const start = performance.now();
699
+ const customUrl =
700
+ options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
296
701
 
297
702
  const api = await this.getProvidersApi();
298
703
  if (
299
704
  providerId !== GitCloudHostIntegrationId.GitLab &&
300
705
  (api.isRepoIdsInput(reposOrRepoIds) ||
301
- (providerId === GitCloudHostIntegrationId.AzureDevOps &&
706
+ (isAzureDevOpsProvider(providerId) &&
302
707
  !reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
303
708
  ) {
304
709
  Logger.warn(`Unsupported input for provider ${providerId}`, 'getIssuesForRepos');
305
- return undefined;
710
+ return {
711
+ error: new Error(`Unsupported input for provider ${providerId}`),
712
+ duration: performance.now() - start,
713
+ };
306
714
  }
307
715
 
308
716
  let getIssuesOptions: GetIssuesOptions | undefined;
309
- if (providerId === GitCloudHostIntegrationId.AzureDevOps) {
717
+ if (isAzureDevOpsProvider(providerId)) {
310
718
  const organizations = new Set<string>();
311
719
  const projects = new Set<string>();
312
720
  for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
@@ -316,10 +724,16 @@ export abstract class GitHostIntegration<
316
724
 
317
725
  if (organizations.size > 1) {
318
726
  Logger.warn(`Multiple organizations not supported for provider ${providerId}`, 'getIssuesForRepos');
319
- return undefined;
727
+ return {
728
+ error: new Error(`Multiple organizations not supported for provider ${providerId}`),
729
+ duration: performance.now() - start,
730
+ };
320
731
  } else if (organizations.size === 0) {
321
732
  Logger.warn(`No organizations found for provider ${providerId}`, 'getIssuesForRepos');
322
- return undefined;
733
+ return {
734
+ error: new Error(`No organizations found for provider ${providerId}`),
735
+ duration: performance.now() - start,
736
+ };
323
737
  }
324
738
 
325
739
  const organization: string = first(organizations.values())!;
@@ -327,37 +741,49 @@ export abstract class GitHostIntegration<
327
741
  if (options?.filters != null) {
328
742
  if (!api.providerSupportsIssueFilters(providerId, options.filters)) {
329
743
  Logger.warn(`Unsupported filters for provider ${providerId}`, 'getIssuesForRepos');
330
- return undefined;
744
+ return {
745
+ error: new Error(`Unsupported filters for provider ${providerId}`),
746
+ duration: performance.now() - start,
747
+ };
331
748
  }
332
749
 
333
750
  let userAccount: ProviderAccount | undefined;
334
751
  try {
335
- userAccount = await api.getCurrentUserForInstance({ providerId: providerId }, organization);
752
+ userAccount = await this.getFilterAccount(api, session, customUrl, organization);
336
753
  } catch (ex) {
337
754
  Logger.error(ex, 'getIssuesForRepos');
338
- return undefined;
755
+ return { error: toError(ex), duration: performance.now() - start };
339
756
  }
340
757
 
341
758
  if (userAccount == null) {
342
759
  Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
343
- return undefined;
760
+ return {
761
+ error: new Error(`Unable to get current user for ${providerId}`),
762
+ duration: performance.now() - start,
763
+ };
344
764
  }
345
765
 
346
766
  const userFilterProperty = userAccount.name;
347
767
 
348
768
  if (userFilterProperty == null) {
349
769
  Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
350
- return undefined;
770
+ return {
771
+ error: new Error(`Unable to get user property for filter for ${providerId}`),
772
+ duration: performance.now() - start,
773
+ };
351
774
  }
352
775
 
353
776
  getIssuesOptions = {
354
777
  authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
355
- assigneeLogins: options.filters.includes(IssueFilter.Assignee) ? [userFilterProperty] : undefined,
778
+ assigneeLogins:
779
+ !options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
780
+ ? [userFilterProperty]
781
+ : undefined,
356
782
  mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
357
783
  };
358
784
  }
359
785
 
360
- const cursorInfo = JSON.parse(options?.cursor ?? '{}');
786
+ const cursorInfo = this.parseCursorInfo<PagedProjectInput>(options?.cursor);
361
787
  const cursors: PagedProjectInput[] = cursorInfo.cursors ?? [];
362
788
  let projectInputs: PagedProjectInput[] = Array.from(projects.values(), project => ({
363
789
  namespace: organization,
@@ -369,73 +795,144 @@ export abstract class GitHostIntegration<
369
795
  }
370
796
 
371
797
  try {
372
- const cursor: { cursors: PagedProjectInput[] } = { cursors: [] };
798
+ const cursor: { cursors: PagedProjectInput[]; page?: number } = { cursors: [] };
373
799
  let hasMore = false;
800
+ let truncated = false;
801
+ let metadata: CollectionMetadata | undefined;
374
802
  const data: ProviderIssue[] = [];
375
- await Promise.all(
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(
376
808
  projectInputs.map(async projectInput => {
377
809
  const results = await api.getIssuesForAzureProject(
378
- { providerId: providerId },
810
+ toTokenWithInfo(providerId, session),
379
811
  projectInput.namespace,
380
812
  projectInput.project,
381
813
  {
382
814
  ...getIssuesOptions,
383
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,
384
822
  },
385
823
  );
386
- data.push(...results.values);
387
- if (results.paging?.more) {
388
- hasMore = true;
389
- cursor.cursors.push({
390
- namespace: projectInput.namespace,
391
- project: projectInput.project,
392
- cursor: results.paging.cursor,
393
- });
394
- }
824
+ return { projectInput: projectInput, results: results };
395
825
  }),
396
826
  );
397
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
+
398
866
  return {
399
- values: data,
400
- paging: {
401
- more: hasMore,
402
- cursor: JSON.stringify(cursor),
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,
403
879
  },
880
+ duration: performance.now() - start,
404
881
  };
405
882
  } catch (ex) {
406
883
  Logger.error(ex, 'getIssuesForRepos');
407
- return undefined;
884
+ return { error: toError(ex), duration: performance.now() - start };
408
885
  }
409
886
  }
410
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
+
411
899
  let userAccount: ProviderAccount | undefined;
412
900
  try {
413
- userAccount = await api.getCurrentUser({ providerId: providerId });
901
+ userAccount = await this.getFilterAccount(api, session, customUrl);
414
902
  } catch (ex) {
415
903
  Logger.error(ex, 'getIssuesForRepos');
416
- return undefined;
904
+ return { error: toError(ex), duration: performance.now() - start };
417
905
  }
418
906
 
419
907
  if (userAccount == null) {
420
908
  Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
421
- return undefined;
909
+ return {
910
+ error: new Error(`Unable to get current user for ${providerId}`),
911
+ duration: performance.now() - start,
912
+ };
422
913
  }
423
914
 
424
915
  const userFilterProperty = userAccount.username;
425
916
  if (userFilterProperty == null) {
426
917
  Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
427
- return undefined;
918
+ return {
919
+ error: new Error(`Unable to get user property for filter for ${providerId}`),
920
+ duration: performance.now() - start,
921
+ };
428
922
  }
429
923
 
430
924
  getIssuesOptions = {
431
925
  authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
432
- assigneeLogins: options.filters.includes(IssueFilter.Assignee) ? [userFilterProperty] : undefined,
926
+ assigneeLogins:
927
+ !options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
928
+ ? [userFilterProperty]
929
+ : undefined,
433
930
  mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
434
931
  };
435
932
  }
436
933
 
437
934
  if (api.getProviderIssuesPagingMode(providerId) === PagingMode.Repo && !api.isRepoIdsInput(reposOrRepoIds)) {
438
- const cursorInfo = JSON.parse(options?.cursor ?? '{}');
935
+ const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
439
936
  const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
440
937
  let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
441
938
  if (cursors.length > 0) {
@@ -443,80 +940,209 @@ export abstract class GitHostIntegration<
443
940
  }
444
941
 
445
942
  try {
446
- const cursor: { cursors: PagedRepoInput[] } = { cursors: [] };
943
+ const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
447
944
  let hasMore = false;
945
+ let truncated = false;
946
+ let metadata: CollectionMetadata | undefined;
448
947
  const data: ProviderIssue[] = [];
449
- await Promise.all(
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(
450
952
  repoInputs.map(async repoInput => {
451
- const results = await api.getIssuesForRepo({ providerId: providerId }, repoInput.repo, {
452
- ...getIssuesOptions,
453
- cursor: repoInput.cursor,
454
- baseUrl: options?.customUrl,
455
- });
456
- data.push(...results.values);
457
- if (results.paging?.more) {
458
- hasMore = true;
459
- cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
460
- }
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 };
461
968
  }),
462
969
  );
463
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
+
464
1002
  return {
465
- values: data,
466
- paging: {
467
- more: hasMore,
468
- cursor: JSON.stringify(cursor),
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,
469
1015
  },
1016
+ duration: performance.now() - start,
470
1017
  };
471
1018
  } catch (ex) {
472
1019
  Logger.error(ex, 'getIssuesForRepos');
473
- return undefined;
1020
+ return { error: toError(ex), duration: performance.now() - start };
474
1021
  }
475
1022
  }
476
1023
 
477
1024
  try {
478
- return await api.getIssuesForRepos({ providerId: providerId }, reposOrRepoIds, {
1025
+ const result = await api.getIssuesForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
479
1026
  ...getIssuesOptions,
480
1027
  cursor: options?.cursor,
481
- baseUrl: options?.customUrl,
1028
+ baseUrl: customUrl,
1029
+ page: options?.page,
1030
+ pageSize: options?.pageSize,
1031
+ states: states,
482
1032
  });
1033
+ return { value: result, duration: performance.now() - start };
483
1034
  } catch (ex) {
484
1035
  Logger.error(ex, 'getIssuesForRepos');
485
- return undefined;
1036
+ return { error: toError(ex), duration: performance.now() - start };
486
1037
  }
487
1038
  }
488
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
+
489
1074
  async getMyPullRequestsForRepos(
490
1075
  reposOrRepoIds: ProviderReposInput,
491
- options?: { filters?: PullRequestFilter[]; cursor?: string; customUrl?: string },
492
- ): Promise<PagedResult<ProviderPullRequest> | undefined> {
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>> {
493
1108
  const scope = getScopedLogger();
494
1109
  const providerId = this.authProvider.id;
495
- const connected = this.maybeConnected ?? (await this.isConnected());
496
- if (!connected) return undefined;
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;
497
1115
 
498
- await this.refreshSessionIfExpired(scope);
1116
+ const start = performance.now();
1117
+ const customUrl =
1118
+ options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
499
1119
 
500
1120
  const api = await this.getProvidersApi();
501
1121
  if (
502
1122
  providerId !== GitCloudHostIntegrationId.GitLab &&
503
1123
  (api.isRepoIdsInput(reposOrRepoIds) ||
504
- (providerId === GitCloudHostIntegrationId.AzureDevOps &&
1124
+ (isAzureDevOpsProvider(providerId) &&
505
1125
  !reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
506
1126
  ) {
507
1127
  Logger.warn(`Unsupported input for provider ${providerId}`);
508
- return undefined;
1128
+ return {
1129
+ error: new Error(`Unsupported input for provider ${providerId}`),
1130
+ duration: performance.now() - start,
1131
+ };
509
1132
  }
510
1133
 
511
1134
  let getPullRequestsOptions: GetPullRequestsOptions | undefined;
512
1135
  if (options?.filters != null) {
513
1136
  if (!api.providerSupportsPullRequestFilters(providerId, options.filters)) {
514
1137
  Logger.warn(`Unsupported filters for provider ${providerId}`, 'getPullRequestsForRepos');
515
- return undefined;
1138
+ return {
1139
+ error: new Error(`Unsupported filters for provider ${providerId}`),
1140
+ duration: performance.now() - start,
1141
+ };
516
1142
  }
517
1143
 
518
1144
  let userAccount: ProviderAccount | undefined;
519
- if (providerId === GitCloudHostIntegrationId.AzureDevOps) {
1145
+ if (isAzureDevOpsProvider(providerId)) {
520
1146
  const organizations = new Set<string>();
521
1147
  for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
522
1148
  organizations.add(repo.namespace);
@@ -527,37 +1153,47 @@ export abstract class GitHostIntegration<
527
1153
  `Multiple organizations not supported for provider ${providerId}`,
528
1154
  'getPullRequestsForRepos',
529
1155
  );
530
- return undefined;
1156
+ return {
1157
+ error: new Error(`Multiple organizations not supported for provider ${providerId}`),
1158
+ duration: performance.now() - start,
1159
+ };
531
1160
  } else if (organizations.size === 0) {
532
1161
  Logger.warn(`No organizations found for provider ${providerId}`, 'getPullRequestsForRepos');
533
- return undefined;
1162
+ return {
1163
+ error: new Error(`No organizations found for provider ${providerId}`),
1164
+ duration: performance.now() - start,
1165
+ };
534
1166
  }
535
1167
 
536
1168
  const organization: string = first(organizations.values())!;
537
1169
  try {
538
- userAccount = await api.getCurrentUserForInstance({ providerId: providerId }, organization);
1170
+ userAccount = await this.getFilterAccount(api, session, customUrl, organization);
539
1171
  } catch (ex) {
540
1172
  Logger.error(ex, 'getPullRequestsForRepos');
541
- return undefined;
1173
+ return { error: toError(ex), duration: performance.now() - start };
542
1174
  }
543
1175
  } else {
544
1176
  try {
545
- userAccount = await api.getCurrentUser({ providerId: providerId });
1177
+ userAccount = await this.getFilterAccount(api, session, customUrl);
546
1178
  } catch (ex) {
547
1179
  Logger.error(ex, 'getPullRequestsForRepos');
548
- return undefined;
1180
+ return { error: toError(ex), duration: performance.now() - start };
549
1181
  }
550
1182
  }
551
1183
 
552
1184
  if (userAccount == null) {
553
1185
  Logger.warn(`Unable to get current user for ${providerId}`, 'getPullRequestsForRepos');
554
- return undefined;
1186
+ return {
1187
+ error: new Error(`Unable to get current user for ${providerId}`),
1188
+ duration: performance.now() - start,
1189
+ };
555
1190
  }
556
1191
 
557
1192
  let userFilterProperty: string | null;
558
1193
  switch (providerId) {
559
1194
  case GitCloudHostIntegrationId.Bitbucket:
560
1195
  case GitCloudHostIntegrationId.AzureDevOps:
1196
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
561
1197
  userFilterProperty = userAccount.id;
562
1198
  break;
563
1199
  default:
@@ -567,15 +1203,41 @@ export abstract class GitHostIntegration<
567
1203
 
568
1204
  if (userFilterProperty == null) {
569
1205
  Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getPullRequestsForRepos');
570
- return undefined;
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
+ }
571
1233
  }
572
1234
 
573
1235
  getPullRequestsOptions = {
574
1236
  authorLogin: options.filters.includes(PullRequestFilter.Author) ? userFilterProperty : undefined,
575
1237
  assigneeLogins: options.filters.includes(PullRequestFilter.Assignee) ? [userFilterProperty] : undefined,
576
- reviewRequestedLogin: options.filters.includes(PullRequestFilter.ReviewRequested)
577
- ? userFilterProperty
578
- : undefined,
1238
+ reviewRequestedLogin: reviewRequestedLogin,
1239
+ reviewerId: reviewerId,
1240
+ reviewerLogin: reviewerLogin,
579
1241
  mentionLogin: options.filters.includes(PullRequestFilter.Mention) ? userFilterProperty : undefined,
580
1242
  };
581
1243
  }
@@ -584,7 +1246,7 @@ export abstract class GitHostIntegration<
584
1246
  api.getProviderPullRequestsPagingMode(providerId) === PagingMode.Repo &&
585
1247
  !api.isRepoIdsInput(reposOrRepoIds)
586
1248
  ) {
587
- const cursorInfo = JSON.parse(options?.cursor ?? '{}');
1249
+ const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
588
1250
  const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
589
1251
  let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
590
1252
  if (cursors.length > 0) {
@@ -592,46 +1254,114 @@ export abstract class GitHostIntegration<
592
1254
  }
593
1255
 
594
1256
  try {
595
- const cursor: { cursors: PagedRepoInput[] } = { cursors: [] };
1257
+ const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
596
1258
  let hasMore = false;
1259
+ let truncated = false;
1260
+ let metadata: CollectionMetadata | undefined;
1261
+ const failures: CollectionScopeFailure[] = [];
597
1262
  const data: ProviderPullRequest[] = [];
598
- await Promise.all(
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(
599
1268
  repoInputs.map(async repoInput => {
600
- const results = await api.getPullRequestsForRepo({ providerId: providerId }, repoInput.repo, {
601
- ...getPullRequestsOptions,
602
- cursor: repoInput.cursor,
603
- baseUrl: options?.customUrl,
604
- });
605
- data.push(...results.values);
606
- if (results.paging?.more) {
607
- hasMore = true;
608
- cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
609
- }
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 };
610
1286
  }),
611
1287
  );
612
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
+
613
1328
  return {
614
- values: data,
615
- paging: {
616
- more: hasMore,
617
- cursor: JSON.stringify(cursor),
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,
618
1341
  },
1342
+ duration: performance.now() - start,
619
1343
  };
620
1344
  } catch (ex) {
621
1345
  Logger.error(ex, 'getPullRequestsForRepos');
622
- return undefined;
1346
+ return { error: toError(ex), duration: performance.now() - start };
623
1347
  }
624
1348
  }
625
1349
 
626
1350
  try {
627
- return await api.getPullRequestsForRepos({ providerId: providerId }, reposOrRepoIds, {
1351
+ const result = await api.getPullRequestsForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
628
1352
  ...getPullRequestsOptions,
629
1353
  cursor: options?.cursor,
630
- baseUrl: options?.customUrl,
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,
631
1360
  });
1361
+ return { value: result, duration: performance.now() - start };
632
1362
  } catch (ex) {
633
1363
  Logger.error(ex, 'getPullRequestsForRepos');
634
- return undefined;
1364
+ return { error: toError(ex), duration: performance.now() - start };
635
1365
  }
636
1366
  }
637
1367
 
@@ -639,81 +1369,243 @@ export abstract class GitHostIntegration<
639
1369
  repo?: T,
640
1370
  cancellation?: AbortSignal,
641
1371
  silent?: boolean,
1372
+ connectionId?: string,
1373
+ state?: PullRequestStateFilter,
1374
+ options?: SearchMyPullRequestsOptions,
642
1375
  ): Promise<IntegrationResult<PullRequest[] | undefined>>;
643
1376
  async searchMyPullRequests(
644
1377
  repos?: T[],
645
1378
  cancellation?: AbortSignal,
646
1379
  silent?: boolean,
1380
+ connectionId?: string,
1381
+ state?: PullRequestStateFilter,
1382
+ options?: SearchMyPullRequestsOptions,
647
1383
  ): Promise<IntegrationResult<PullRequest[] | undefined>>;
648
1384
  @trace()
649
1385
  async searchMyPullRequests(
650
1386
  repos?: T | T[],
651
1387
  cancellation?: AbortSignal,
652
1388
  silent?: boolean,
1389
+ connectionId?: string,
1390
+ state?: PullRequestStateFilter,
1391
+ options?: SearchMyPullRequestsOptions,
653
1392
  ): Promise<IntegrationResult<PullRequest[] | undefined>> {
654
1393
  const scope = getScopedLogger();
655
- const connected = this.maybeConnected ?? (await this.isConnected());
656
- if (!connected) return undefined;
657
-
658
- await this.refreshSessionIfExpired(scope);
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;
659
1397
 
660
1398
  const start = performance.now();
661
1399
  try {
662
- const pullRequests = await this.searchProviderMyPullRequests(
663
- this._session!,
664
- repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
665
- cancellation,
666
- silent,
667
- );
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
+ }
668
1425
  this.resetRequestExceptionCount('searchMyPullRequests');
669
- return { value: pullRequests, duration: performance.now() - start };
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 };
670
1435
  } catch (ex) {
671
1436
  this.handleProviderException('searchMyPullRequests', ex, {
672
1437
  scope: scope,
673
1438
  silent: true,
674
1439
  });
675
1440
  return {
676
- error: ex,
1441
+ error: toError(ex),
677
1442
  duration: performance.now() - start,
678
1443
  };
679
1444
  }
680
1445
  }
681
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.
682
1529
  protected abstract searchProviderMyPullRequests(
683
1530
  session: ProviderAuthenticationSession,
684
1531
  repos?: T[],
685
1532
  cancellation?: AbortSignal,
686
1533
  silent?: boolean,
1534
+ state?: PullRequestStateFilter,
1535
+ options?: SearchMyPullRequestsOptions,
687
1536
  ): Promise<PullRequest[] | undefined>;
688
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
+
689
1555
  async searchPullRequests(
690
1556
  searchQuery: string,
691
1557
  repo?: T,
692
1558
  cancellation?: AbortSignal,
1559
+ options?: { include?: PullRequestState[] },
693
1560
  ): Promise<PullRequest[] | undefined>;
694
1561
  async searchPullRequests(
695
1562
  searchQuery: string,
696
1563
  repos?: T[],
697
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[] },
698
1580
  ): Promise<PullRequest[] | undefined>;
699
1581
  @trace()
700
1582
  async searchPullRequests(
701
1583
  searchQuery: string,
702
1584
  repos?: T | T[],
703
1585
  cancellation?: AbortSignal,
1586
+ connectionIdOrOptions?: string | { include?: PullRequestState[] },
1587
+ options?: { include?: PullRequestState[] },
704
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;
705
1597
  const scope = getScopedLogger();
706
- const connected = this.maybeConnected ?? (await this.isConnected());
707
- if (!connected) return undefined;
708
-
709
- await this.refreshSessionIfExpired(scope);
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;
710
1601
 
711
1602
  try {
712
1603
  const prs = await this.searchProviderPullRequests?.(
713
- this._session!,
1604
+ session,
714
1605
  searchQuery,
715
1606
  repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
716
1607
  cancellation,
1608
+ searchOptions,
717
1609
  );
718
1610
  this.resetRequestExceptionCount('searchPullRequests');
719
1611
  return prs;
@@ -728,6 +1620,7 @@ export abstract class GitHostIntegration<
728
1620
  searchQuery: string,
729
1621
  repos?: T[],
730
1622
  cancellation?: AbortSignal,
1623
+ options?: { include?: PullRequestState[] },
731
1624
  ): Promise<PullRequest[] | undefined>;
732
1625
 
733
1626
  getPullRequestIdentityFromMaybeUrl(search: string): PullRequestUrlIdentity | undefined {