@gitkraken/core-gitlens 0.3.0 → 0.4.0

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 (378) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/README.md +13 -10
  3. package/dist/git/cache.d.ts +12 -6
  4. package/dist/git/cache.d.ts.map +1 -1
  5. package/dist/git/cache.js +40 -39
  6. package/dist/git/cache.js.map +1 -1
  7. package/dist/git/context.d.ts +23 -3
  8. package/dist/git/context.d.ts.map +1 -1
  9. package/dist/git/context.js.map +1 -1
  10. package/dist/git/features.d.ts +1 -1
  11. package/dist/git/features.d.ts.map +1 -1
  12. package/dist/git/features.js +1 -0
  13. package/dist/git/features.js.map +1 -1
  14. package/dist/git/models/graph.d.ts +96 -0
  15. package/dist/git/models/graph.d.ts.map +1 -1
  16. package/dist/git/models/graph.js +24 -1
  17. package/dist/git/models/graph.js.map +1 -1
  18. package/dist/git/models/remoteProvider.d.ts +1 -0
  19. package/dist/git/models/remoteProvider.d.ts.map +1 -1
  20. package/dist/git/models/remoteProvider.js.map +1 -1
  21. package/dist/git/models/repository.d.ts +21 -12
  22. package/dist/git/models/repository.d.ts.map +1 -1
  23. package/dist/git/models/repository.js +70 -84
  24. package/dist/git/models/repository.js.map +1 -1
  25. package/dist/git/models/statusFile.d.ts +9 -0
  26. package/dist/git/models/statusFile.d.ts.map +1 -1
  27. package/dist/git/models/statusFile.js +11 -0
  28. package/dist/git/models/statusFile.js.map +1 -1
  29. package/dist/git/providers/commits.d.ts +4 -0
  30. package/dist/git/providers/commits.d.ts.map +1 -1
  31. package/dist/git/providers/config.d.ts +1 -3
  32. package/dist/git/providers/config.d.ts.map +1 -1
  33. package/dist/git/providers/operations.d.ts +40 -13
  34. package/dist/git/providers/operations.d.ts.map +1 -1
  35. package/dist/git/providers/worktrees.d.ts +2 -0
  36. package/dist/git/providers/worktrees.d.ts.map +1 -1
  37. package/dist/git/remotes/custom.d.ts +2 -0
  38. package/dist/git/remotes/custom.d.ts.map +1 -1
  39. package/dist/git/remotes/custom.js +20 -0
  40. package/dist/git/remotes/custom.js.map +1 -1
  41. package/dist/git/utils/conflictResolution.utils.d.ts +32 -0
  42. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -1
  43. package/dist/git/utils/conflictResolution.utils.js +95 -0
  44. package/dist/git/utils/conflictResolution.utils.js.map +1 -1
  45. package/dist/git/utils/contributor.utils.d.ts +3 -0
  46. package/dist/git/utils/contributor.utils.d.ts.map +1 -1
  47. package/dist/git/utils/contributor.utils.js +22 -0
  48. package/dist/git/utils/contributor.utils.js.map +1 -1
  49. package/dist/git/utils/reachability.utils.d.ts +37 -0
  50. package/dist/git/utils/reachability.utils.d.ts.map +1 -0
  51. package/dist/git/utils/reachability.utils.js +96 -0
  52. package/dist/git/utils/reachability.utils.js.map +1 -0
  53. package/dist/git/watching/watchService.d.ts +4 -2
  54. package/dist/git/watching/watchService.d.ts.map +1 -1
  55. package/dist/git/watching/watchService.js +8 -3
  56. package/dist/git/watching/watchService.js.map +1 -1
  57. package/dist/git/watching/watchSession.d.ts +14 -12
  58. package/dist/git/watching/watchSession.d.ts.map +1 -1
  59. package/dist/git/watching/watchSession.js +56 -55
  60. package/dist/git/watching/watchSession.js.map +1 -1
  61. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  62. package/dist/git-cli/providers/branches.js +1 -0
  63. package/dist/git-cli/providers/branches.js.map +1 -1
  64. package/dist/git-cli/providers/commits.d.ts +1 -0
  65. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  66. package/dist/git-cli/providers/commits.js +12 -0
  67. package/dist/git-cli/providers/commits.js.map +1 -1
  68. package/dist/git-cli/providers/config.d.ts +8 -4
  69. package/dist/git-cli/providers/config.d.ts.map +1 -1
  70. package/dist/git-cli/providers/config.js +62 -39
  71. package/dist/git-cli/providers/config.js.map +1 -1
  72. package/dist/git-cli/providers/diff.d.ts.map +1 -1
  73. package/dist/git-cli/providers/diff.js +1 -1
  74. package/dist/git-cli/providers/diff.js.map +1 -1
  75. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  76. package/dist/git-cli/providers/graph.js +132 -14
  77. package/dist/git-cli/providers/graph.js.map +1 -1
  78. package/dist/git-cli/providers/operations.d.ts +7 -5
  79. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  80. package/dist/git-cli/providers/operations.js +118 -95
  81. package/dist/git-cli/providers/operations.js.map +1 -1
  82. package/dist/git-cli/providers/stash.d.ts.map +1 -1
  83. package/dist/git-cli/providers/stash.js +20 -2
  84. package/dist/git-cli/providers/stash.js.map +1 -1
  85. package/dist/git-cli/providers/status.d.ts.map +1 -1
  86. package/dist/git-cli/providers/status.js +5 -2
  87. package/dist/git-cli/providers/status.js.map +1 -1
  88. package/dist/git-cli/providers/worktrees.d.ts +2 -0
  89. package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
  90. package/dist/git-cli/providers/worktrees.js +3 -0
  91. package/dist/git-cli/providers/worktrees.js.map +1 -1
  92. package/dist/ipc/discovery.d.ts +22 -0
  93. package/dist/ipc/discovery.d.ts.map +1 -1
  94. package/dist/ipc/discovery.js +111 -2
  95. package/dist/ipc/discovery.js.map +1 -1
  96. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +73 -20
  97. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -1
  98. package/dist/plus/agents/providers/claudeCodeProvider.js +394 -88
  99. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -1
  100. package/dist/plus/agents/types.d.ts +62 -11
  101. package/dist/plus/agents/types.d.ts.map +1 -1
  102. package/dist/plus/ai/models/model.d.ts +1 -1
  103. package/dist/plus/ai/models/model.d.ts.map +1 -1
  104. package/dist/plus/ai/models/model.js.map +1 -1
  105. package/dist/plus/ai/models/provider.d.ts +3 -0
  106. package/dist/plus/ai/models/provider.d.ts.map +1 -1
  107. package/dist/plus/ai/providers/gitkrakenProvider.d.ts +1 -1
  108. package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
  109. package/dist/plus/ai/providers/gitkrakenProvider.js +4 -1
  110. package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
  111. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +4 -3
  112. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
  113. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +9 -6
  114. package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
  115. package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
  116. package/dist/plus/ai/utils/ai.utils.js +6 -4
  117. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  118. package/dist/plus/git-github/api/github.d.ts +8 -13
  119. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  120. package/dist/plus/git-github/api/github.js +96 -14
  121. package/dist/plus/git-github/api/github.js.map +1 -1
  122. package/dist/plus/git-github/providers/github/refs.js +1 -1
  123. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts +11 -0
  124. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts.map +1 -0
  125. package/dist/plus/integrations/authentication/cloudIntegrationService.js +90 -0
  126. package/dist/plus/integrations/authentication/cloudIntegrationService.js.map +1 -0
  127. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts +67 -0
  128. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts.map +1 -0
  129. package/dist/plus/integrations/authentication/configuredIntegrationService.js +295 -0
  130. package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -0
  131. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts +92 -0
  132. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts.map +1 -0
  133. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +185 -0
  134. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js.map +1 -0
  135. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts +62 -0
  136. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts.map +1 -0
  137. package/dist/plus/integrations/authentication/integrationAuthenticationService.js +122 -0
  138. package/dist/plus/integrations/authentication/integrationAuthenticationService.js.map +1 -0
  139. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts +15 -0
  140. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts.map +1 -0
  141. package/dist/plus/integrations/authentication/manualTokenProvider.js +49 -0
  142. package/dist/plus/integrations/authentication/manualTokenProvider.js.map +1 -0
  143. package/dist/plus/integrations/authentication/models.d.ts +87 -0
  144. package/dist/plus/integrations/authentication/models.d.ts.map +1 -0
  145. package/dist/plus/integrations/authentication/models.js +64 -0
  146. package/dist/plus/integrations/authentication/models.js.map +1 -0
  147. package/dist/plus/integrations/constants.d.ts +47 -0
  148. package/dist/plus/integrations/constants.d.ts.map +1 -0
  149. package/dist/plus/integrations/constants.js +128 -0
  150. package/dist/plus/integrations/constants.js.map +1 -0
  151. package/dist/plus/integrations/context.d.ts +354 -0
  152. package/dist/plus/integrations/context.d.ts.map +1 -0
  153. package/dist/plus/integrations/context.js +2 -0
  154. package/dist/plus/integrations/context.js.map +1 -0
  155. package/dist/plus/integrations/errors.d.ts +14 -0
  156. package/dist/plus/integrations/errors.d.ts.map +1 -0
  157. package/dist/plus/integrations/errors.js +19 -0
  158. package/dist/plus/integrations/errors.js.map +1 -0
  159. package/dist/plus/integrations/index.d.ts +32 -0
  160. package/dist/plus/integrations/index.d.ts.map +1 -0
  161. package/dist/plus/integrations/index.js +62 -0
  162. package/dist/plus/integrations/index.js.map +1 -0
  163. package/dist/plus/integrations/integrationService.d.ts +98 -0
  164. package/dist/plus/integrations/integrationService.d.ts.map +1 -0
  165. package/dist/plus/integrations/integrationService.js +627 -0
  166. package/dist/plus/integrations/integrationService.js.map +1 -0
  167. package/dist/plus/integrations/models/gitHostIntegration.d.ts +82 -0
  168. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -0
  169. package/dist/plus/integrations/models/gitHostIntegration.js +522 -0
  170. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -0
  171. package/dist/plus/integrations/models/integration.d.ts +127 -0
  172. package/dist/plus/integrations/models/integration.d.ts.map +1 -0
  173. package/dist/plus/integrations/models/integration.js +456 -0
  174. package/dist/plus/integrations/models/integration.js.map +1 -0
  175. package/dist/plus/integrations/models/issuesIntegration.d.ts +28 -0
  176. package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -0
  177. package/dist/plus/integrations/models/issuesIntegration.js +101 -0
  178. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -0
  179. package/dist/plus/integrations/providers/apiClients.d.ts +25 -0
  180. package/dist/plus/integrations/providers/apiClients.d.ts.map +1 -0
  181. package/dist/plus/integrations/providers/apiClients.js +39 -0
  182. package/dist/plus/integrations/providers/apiClients.js.map +1 -0
  183. package/dist/plus/integrations/providers/azure/azure.d.ts +47 -0
  184. package/dist/plus/integrations/providers/azure/azure.d.ts.map +1 -0
  185. package/dist/plus/integrations/providers/azure/azure.js +444 -0
  186. package/dist/plus/integrations/providers/azure/azure.js.map +1 -0
  187. package/dist/plus/integrations/providers/azure/models.d.ts +286 -0
  188. package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -0
  189. package/dist/plus/integrations/providers/azure/models.js +203 -0
  190. package/dist/plus/integrations/providers/azure/models.js.map +1 -0
  191. package/dist/plus/integrations/providers/azureDevOps.d.ts +95 -0
  192. package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -0
  193. package/dist/plus/integrations/providers/azureDevOps.js +432 -0
  194. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -0
  195. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +42 -0
  196. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts.map +1 -0
  197. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +513 -0
  198. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -0
  199. package/dist/plus/integrations/providers/bitbucket/models.d.ts +222 -0
  200. package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -0
  201. package/dist/plus/integrations/providers/bitbucket/models.js +158 -0
  202. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -0
  203. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +120 -0
  204. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts.map +1 -0
  205. package/dist/plus/integrations/providers/bitbucket-server/models.js +111 -0
  206. package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -0
  207. package/dist/plus/integrations/providers/bitbucket-server.d.ts +60 -0
  208. package/dist/plus/integrations/providers/bitbucket-server.d.ts.map +1 -0
  209. package/dist/plus/integrations/providers/bitbucket-server.js +138 -0
  210. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -0
  211. package/dist/plus/integrations/providers/bitbucket.d.ts +50 -0
  212. package/dist/plus/integrations/providers/bitbucket.d.ts.map +1 -0
  213. package/dist/plus/integrations/providers/bitbucket.js +181 -0
  214. package/dist/plus/integrations/providers/bitbucket.js.map +1 -0
  215. package/dist/plus/integrations/providers/github/github.d.ts +5 -0
  216. package/dist/plus/integrations/providers/github/github.d.ts.map +1 -0
  217. package/dist/plus/integrations/providers/github/github.js +47 -0
  218. package/dist/plus/integrations/providers/github/github.js.map +1 -0
  219. package/dist/plus/integrations/providers/github/github.utils.d.ts +11 -0
  220. package/dist/plus/integrations/providers/github/github.utils.d.ts.map +1 -0
  221. package/dist/plus/integrations/providers/github/github.utils.js +6 -0
  222. package/dist/plus/integrations/providers/github/github.utils.js.map +1 -0
  223. package/dist/plus/integrations/providers/github/models.d.ts +3 -0
  224. package/dist/plus/integrations/providers/github/models.d.ts.map +1 -0
  225. package/dist/plus/integrations/providers/github/models.js +2 -0
  226. package/dist/plus/integrations/providers/github/models.js.map +1 -0
  227. package/dist/plus/integrations/providers/github.d.ts +73 -0
  228. package/dist/plus/integrations/providers/github.d.ts.map +1 -0
  229. package/dist/plus/integrations/providers/github.js +160 -0
  230. package/dist/plus/integrations/providers/github.js.map +1 -0
  231. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +63 -0
  232. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts.map +1 -0
  233. package/dist/plus/integrations/providers/gitlab/gitlab.js +828 -0
  234. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -0
  235. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts +21 -0
  236. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts.map +1 -0
  237. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js +45 -0
  238. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js.map +1 -0
  239. package/dist/plus/integrations/providers/gitlab/models.d.ts +128 -0
  240. package/dist/plus/integrations/providers/gitlab/models.d.ts.map +1 -0
  241. package/dist/plus/integrations/providers/gitlab/models.js +96 -0
  242. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -0
  243. package/dist/plus/integrations/providers/gitlab.d.ts +79 -0
  244. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -0
  245. package/dist/plus/integrations/providers/gitlab.js +253 -0
  246. package/dist/plus/integrations/providers/gitlab.js.map +1 -0
  247. package/dist/plus/integrations/providers/jira.d.ts +46 -0
  248. package/dist/plus/integrations/providers/jira.d.ts.map +1 -0
  249. package/dist/plus/integrations/providers/jira.js +255 -0
  250. package/dist/plus/integrations/providers/jira.js.map +1 -0
  251. package/dist/plus/integrations/providers/linear.d.ts +47 -0
  252. package/dist/plus/integrations/providers/linear.d.ts.map +1 -0
  253. package/dist/plus/integrations/providers/linear.js +198 -0
  254. package/dist/plus/integrations/providers/linear.js.map +1 -0
  255. package/dist/plus/integrations/providers/models.d.ts +433 -0
  256. package/dist/plus/integrations/providers/models.d.ts.map +1 -0
  257. package/dist/plus/integrations/providers/models.js +602 -0
  258. package/dist/plus/integrations/providers/models.js.map +1 -0
  259. package/dist/plus/integrations/providers/providersApi.d.ts +129 -0
  260. package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -0
  261. package/dist/plus/integrations/providers/providersApi.js +602 -0
  262. package/dist/plus/integrations/providers/providersApi.js.map +1 -0
  263. package/dist/plus/integrations/providers/utils.d.ts +54 -0
  264. package/dist/plus/integrations/providers/utils.d.ts.map +1 -0
  265. package/dist/plus/integrations/providers/utils.js +262 -0
  266. package/dist/plus/integrations/providers/utils.js.map +1 -0
  267. package/dist/plus/integrations/telemetry.d.ts +26 -0
  268. package/dist/plus/integrations/telemetry.d.ts.map +1 -0
  269. package/dist/plus/integrations/telemetry.js +11 -0
  270. package/dist/plus/integrations/telemetry.js.map +1 -0
  271. package/dist/plus/integrations/utils/integration.utils.d.ts +14 -0
  272. package/dist/plus/integrations/utils/integration.utils.d.ts.map +1 -0
  273. package/dist/plus/integrations/utils/integration.utils.js +111 -0
  274. package/dist/plus/integrations/utils/integration.utils.js.map +1 -0
  275. package/dist/utils/date.d.ts.map +1 -1
  276. package/dist/utils/date.js +6 -0
  277. package/dist/utils/date.js.map +1 -1
  278. package/dist/utils/debounce.js +1 -1
  279. package/dist/utils/disposable.d.ts +15 -2
  280. package/dist/utils/disposable.d.ts.map +1 -1
  281. package/dist/utils/disposable.js.map +1 -1
  282. package/dist/utils/iterable.d.ts +7 -1
  283. package/dist/utils/iterable.d.ts.map +1 -1
  284. package/dist/utils/iterable.js +12 -4
  285. package/dist/utils/iterable.js.map +1 -1
  286. package/dist/utils/object.d.ts +22 -1
  287. package/dist/utils/object.d.ts.map +1 -1
  288. package/dist/utils/object.js +56 -3
  289. package/dist/utils/object.js.map +1 -1
  290. package/dist/utils/paging.js +14 -15
  291. package/dist/utils/paging.js.map +1 -1
  292. package/dist/utils/promiseCache.d.ts.map +1 -1
  293. package/dist/utils/promiseCache.js +12 -4
  294. package/dist/utils/promiseCache.js.map +1 -1
  295. package/dist/utils/string.js +1 -1
  296. package/package.json +43 -2
  297. package/src/git/cache.ts +58 -70
  298. package/src/git/context.ts +25 -3
  299. package/src/git/features.ts +2 -0
  300. package/src/git/models/graph.ts +97 -0
  301. package/src/git/models/remoteProvider.ts +1 -0
  302. package/src/git/models/repository.ts +84 -93
  303. package/src/git/models/statusFile.ts +12 -0
  304. package/src/git/providers/commits.ts +4 -0
  305. package/src/git/providers/config.ts +1 -5
  306. package/src/git/providers/operations.ts +42 -22
  307. package/src/git/providers/worktrees.ts +14 -2
  308. package/src/git/remotes/custom.ts +23 -0
  309. package/src/git/utils/conflictResolution.utils.ts +126 -0
  310. package/src/git/utils/contributor.utils.ts +24 -0
  311. package/src/git/utils/reachability.utils.ts +109 -0
  312. package/src/git/watching/watchService.ts +9 -4
  313. package/src/git/watching/watchSession.ts +61 -55
  314. package/src/git-cli/providers/branches.ts +1 -0
  315. package/src/git-cli/providers/commits.ts +24 -0
  316. package/src/git-cli/providers/config.ts +63 -49
  317. package/src/git-cli/providers/diff.ts +2 -1
  318. package/src/git-cli/providers/graph.ts +145 -14
  319. package/src/git-cli/providers/operations.ts +138 -130
  320. package/src/git-cli/providers/stash.ts +20 -2
  321. package/src/git-cli/providers/status.ts +11 -3
  322. package/src/git-cli/providers/worktrees.ts +17 -2
  323. package/src/ipc/discovery.ts +132 -2
  324. package/src/plus/agents/providers/claudeCodeProvider.ts +430 -90
  325. package/src/plus/agents/types.ts +59 -11
  326. package/src/plus/ai/models/model.ts +1 -0
  327. package/src/plus/ai/models/provider.ts +7 -1
  328. package/src/plus/ai/providers/gitkrakenProvider.ts +4 -0
  329. package/src/plus/ai/providers/openAICompatibleProviderBase.ts +21 -4
  330. package/src/plus/ai/utils/ai.utils.ts +6 -4
  331. package/src/plus/git-github/api/github.ts +131 -31
  332. package/src/plus/git-github/providers/github/refs.ts +1 -1
  333. package/src/plus/integrations/authentication/cloudIntegrationService.ts +120 -0
  334. package/src/plus/integrations/authentication/configuredIntegrationService.ts +414 -0
  335. package/src/plus/integrations/authentication/integrationAuthenticationProvider.ts +289 -0
  336. package/src/plus/integrations/authentication/integrationAuthenticationService.ts +144 -0
  337. package/src/plus/integrations/authentication/manualTokenProvider.ts +72 -0
  338. package/src/plus/integrations/authentication/models.ts +168 -0
  339. package/src/plus/integrations/constants.ts +169 -0
  340. package/src/plus/integrations/context.ts +383 -0
  341. package/src/plus/integrations/errors.ts +35 -0
  342. package/src/plus/integrations/index.ts +119 -0
  343. package/src/plus/integrations/integrationService.ts +924 -0
  344. package/src/plus/integrations/models/gitHostIntegration.ts +738 -0
  345. package/src/plus/integrations/models/integration.ts +657 -0
  346. package/src/plus/integrations/models/issuesIntegration.ts +124 -0
  347. package/src/plus/integrations/providers/apiClients.ts +72 -0
  348. package/src/plus/integrations/providers/azure/azure.ts +691 -0
  349. package/src/plus/integrations/providers/azure/models.ts +605 -0
  350. package/src/plus/integrations/providers/azureDevOps.ts +677 -0
  351. package/src/plus/integrations/providers/bitbucket/bitbucket.ts +774 -0
  352. package/src/plus/integrations/providers/bitbucket/models.ts +445 -0
  353. package/src/plus/integrations/providers/bitbucket-server/models.ts +252 -0
  354. package/src/plus/integrations/providers/bitbucket-server.ts +282 -0
  355. package/src/plus/integrations/providers/bitbucket.ts +350 -0
  356. package/src/plus/integrations/providers/github/github.ts +64 -0
  357. package/src/plus/integrations/providers/github/github.utils.ts +23 -0
  358. package/src/plus/integrations/providers/github/models.ts +29 -0
  359. package/src/plus/integrations/providers/github.ts +366 -0
  360. package/src/plus/integrations/providers/gitlab/gitlab.ts +1210 -0
  361. package/src/plus/integrations/providers/gitlab/gitlab.utils.ts +71 -0
  362. package/src/plus/integrations/providers/gitlab/models.ts +257 -0
  363. package/src/plus/integrations/providers/gitlab.ts +473 -0
  364. package/src/plus/integrations/providers/jira.ts +359 -0
  365. package/src/plus/integrations/providers/linear.ts +275 -0
  366. package/src/plus/integrations/providers/models.ts +1114 -0
  367. package/src/plus/integrations/providers/providersApi.ts +1126 -0
  368. package/src/plus/integrations/providers/utils.ts +359 -0
  369. package/src/plus/integrations/telemetry.ts +29 -0
  370. package/src/plus/integrations/utils/integration.utils.ts +138 -0
  371. package/src/utils/date.ts +5 -0
  372. package/src/utils/debounce.ts +1 -1
  373. package/src/utils/disposable.ts +15 -2
  374. package/src/utils/iterable.ts +14 -3
  375. package/src/utils/object.ts +55 -4
  376. package/src/utils/paging.ts +14 -14
  377. package/src/utils/promiseCache.ts +24 -16
  378. package/src/utils/string.ts +1 -1
@@ -0,0 +1,473 @@
1
+ import type { Account } from '../../../git/models/author.js';
2
+ import type { DefaultBranch } from '../../../git/models/defaultBranch.js';
3
+ import type { Issue, IssueShape } from '../../../git/models/issue.js';
4
+ import type { IssueOrPullRequest } from '../../../git/models/issueOrPullRequest.js';
5
+ import type { PullRequest, PullRequestMergeMethod, PullRequestState } from '../../../git/models/pullRequest.js';
6
+ import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata.js';
7
+ import type { RepositoryDescriptor } from '../../../git/models/resourceDescriptor.js';
8
+ import type { PullRequestUrlIdentity } from '../../../git/utils/pullRequest.utils.js';
9
+ import type { Emitter } from '../../../utils/event.js';
10
+ import { uniqueBy } from '../../../utils/iterable.js';
11
+ import type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider.js';
12
+ import type { IntegrationAuthenticationService } from '../authentication/integrationAuthenticationService.js';
13
+ import type { IntegrationServiceContext } from '../context.js';
14
+ import type { ProviderAuthenticationSession } from '../authentication/models.js';
15
+ import { toTokenWithInfo } from '../authentication/models.js';
16
+ import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId } from '../constants.js';
17
+ import type { IntegrationConnectionChangeEvent } from '../integrationService.js';
18
+ import { GitHostIntegration } from '../models/gitHostIntegration.js';
19
+ import type { GitLabIntegrationIds } from './gitlab/gitlab.utils.js';
20
+ import { getGitLabPullRequestIdentityFromMaybeUrl } from './gitlab/gitlab.utils.js';
21
+ import { fromGitLabMergeRequestProvidersApi } from './gitlab/models.js';
22
+ import type { ProviderRepository } from './models.js';
23
+ import { ProviderPullRequestReviewState, providersMetadata, toIssueShape } from './models.js';
24
+ import type { ProvidersApi } from './providersApi.js';
25
+
26
+ const metadata = providersMetadata[GitCloudHostIntegrationId.GitLab];
27
+ const authProvider: IntegrationAuthenticationProviderDescriptor = Object.freeze({
28
+ id: metadata.id,
29
+ scopes: metadata.scopes,
30
+ });
31
+
32
+ const cloudEnterpriseMetadata = providersMetadata[GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted];
33
+ const cloudEnterpriseAuthProvider: IntegrationAuthenticationProviderDescriptor = Object.freeze({
34
+ id: cloudEnterpriseMetadata.id,
35
+ scopes: cloudEnterpriseMetadata.scopes,
36
+ });
37
+
38
+ export type GitLabRepositoryDescriptor = RepositoryDescriptor;
39
+
40
+ abstract class GitLabIntegrationBase<ID extends GitLabIntegrationIds> extends GitHostIntegration<
41
+ ID,
42
+ GitLabRepositoryDescriptor
43
+ > {
44
+ protected abstract get apiBaseUrl(): string;
45
+
46
+ /** Self-hosted GitLab uses PAT semantics and a domain-based API base; gitlab.com does not. */
47
+ protected get isEnterprise(): boolean {
48
+ return this.id === GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted;
49
+ }
50
+
51
+ protected override async getProviderAccountForCommit(
52
+ session: ProviderAuthenticationSession,
53
+ repo: GitLabRepositoryDescriptor,
54
+ rev: string,
55
+ options?: {
56
+ avatarSize?: number;
57
+ },
58
+ ): Promise<Account | undefined> {
59
+ return (await this.authenticationService.apis.gitlab)?.getAccountForCommit(
60
+ this,
61
+ toTokenWithInfo(this.id, session),
62
+ repo.owner,
63
+ repo.name,
64
+ rev,
65
+ {
66
+ ...options,
67
+ baseUrl: this.apiBaseUrl,
68
+ },
69
+ );
70
+ }
71
+
72
+ protected override async getProviderAccountForEmail(
73
+ session: ProviderAuthenticationSession,
74
+ repo: GitLabRepositoryDescriptor,
75
+ email: string,
76
+ options?: {
77
+ avatarSize?: number;
78
+ },
79
+ ): Promise<Account | undefined> {
80
+ return (await this.authenticationService.apis.gitlab)?.getAccountForEmail(
81
+ this,
82
+ toTokenWithInfo(this.id, session),
83
+ repo.owner,
84
+ repo.name,
85
+ email,
86
+ {
87
+ ...options,
88
+ baseUrl: this.apiBaseUrl,
89
+ },
90
+ );
91
+ }
92
+
93
+ protected override async getProviderDefaultBranch(
94
+ session: ProviderAuthenticationSession,
95
+ repo: GitLabRepositoryDescriptor,
96
+ ): Promise<DefaultBranch | undefined> {
97
+ return (await this.authenticationService.apis.gitlab)?.getDefaultBranch(
98
+ this,
99
+ toTokenWithInfo(this.id, session),
100
+ repo.owner,
101
+ repo.name,
102
+ {
103
+ baseUrl: this.apiBaseUrl,
104
+ },
105
+ );
106
+ }
107
+
108
+ protected override async getProviderLinkedIssueOrPullRequest(
109
+ session: ProviderAuthenticationSession,
110
+ repo: GitLabRepositoryDescriptor,
111
+ { id }: { id: string; key: string },
112
+ ): Promise<IssueOrPullRequest | undefined> {
113
+ return (await this.authenticationService.apis.gitlab)?.getIssueOrPullRequest(
114
+ this,
115
+ toTokenWithInfo(this.id, session),
116
+ repo.owner,
117
+ repo.name,
118
+ Number(id),
119
+ {
120
+ baseUrl: this.apiBaseUrl,
121
+ },
122
+ );
123
+ }
124
+
125
+ protected override async getProviderIssue(
126
+ session: ProviderAuthenticationSession,
127
+ repo: GitLabRepositoryDescriptor,
128
+ id: string,
129
+ ): Promise<Issue | undefined> {
130
+ const api = await this.authenticationService.apis.gitlab;
131
+ const providerApi = await this.getProvidersApi();
132
+ if (!api || !repo || !id) {
133
+ return undefined;
134
+ }
135
+
136
+ const repoId = await api.getProjectId(
137
+ this,
138
+ toTokenWithInfo(this.id, session),
139
+ repo.owner,
140
+ repo.name,
141
+ this.apiBaseUrl,
142
+ undefined,
143
+ );
144
+ if (!repoId) {
145
+ return undefined;
146
+ }
147
+
148
+ const apiResult = await providerApi.getIssue(
149
+ toTokenWithInfo(this.id, session),
150
+ { namespace: repo.owner, name: repo.name, number: id },
151
+ {
152
+ isPAT: this.isEnterprise,
153
+ baseUrl: this.isEnterprise ? `https://${this.domain}` : undefined,
154
+ },
155
+ );
156
+ const issue = apiResult != null ? toIssueShape(apiResult, this) : undefined;
157
+ return issue != null ? { ...issue, type: 'issue' } : undefined;
158
+ }
159
+
160
+ protected override async getProviderPullRequestForBranch(
161
+ session: ProviderAuthenticationSession,
162
+ repo: GitLabRepositoryDescriptor,
163
+ branch: string,
164
+ options?: {
165
+ avatarSize?: number;
166
+ include?: PullRequestState[];
167
+ },
168
+ ): Promise<PullRequest | undefined> {
169
+ const { include, ...opts } = options ?? {};
170
+
171
+ const toGitLabMergeRequestState = (await import(/* webpackChunkName: "integrations" */ './gitlab/models.js'))
172
+ .toGitLabMergeRequestState;
173
+ return (await this.authenticationService.apis.gitlab)?.getPullRequestForBranch(
174
+ this,
175
+ toTokenWithInfo(this.id, session),
176
+ repo.owner,
177
+ repo.name,
178
+ branch,
179
+ {
180
+ ...opts,
181
+ include: include?.map(s => toGitLabMergeRequestState(s)),
182
+ baseUrl: this.apiBaseUrl,
183
+ },
184
+ );
185
+ }
186
+
187
+ protected override async getProviderPullRequestForCommit(
188
+ session: ProviderAuthenticationSession,
189
+ repo: GitLabRepositoryDescriptor,
190
+ rev: string,
191
+ ): Promise<PullRequest | undefined> {
192
+ return (await this.authenticationService.apis.gitlab)?.getPullRequestForCommit(
193
+ this,
194
+ toTokenWithInfo(this.id, session),
195
+ repo.owner,
196
+ repo.name,
197
+ rev,
198
+ {
199
+ baseUrl: this.apiBaseUrl,
200
+ },
201
+ );
202
+ }
203
+
204
+ protected override async getProviderPullRequest(
205
+ session: ProviderAuthenticationSession,
206
+ resource: GitLabRepositoryDescriptor,
207
+ id: string,
208
+ ): Promise<PullRequest | undefined> {
209
+ return (await this.authenticationService.apis.gitlab)?.getPullRequest(
210
+ this,
211
+ toTokenWithInfo(this.id, session),
212
+ resource.owner,
213
+ resource.name,
214
+ parseInt(id, 10),
215
+ {
216
+ baseUrl: this.apiBaseUrl,
217
+ },
218
+ );
219
+ }
220
+
221
+ public override async getRepoInfo(repo: { owner: string; name: string }): Promise<ProviderRepository | undefined> {
222
+ const api = await this.getProvidersApi();
223
+ const tokenOptInfo = this._session ? toTokenWithInfo(this.id, this._session) : { providerId: this.id };
224
+ return api.getRepo(tokenOptInfo, repo.owner, repo.name, undefined);
225
+ }
226
+
227
+ protected override async getProviderRepositoryMetadata(
228
+ session: ProviderAuthenticationSession,
229
+ repo: GitLabRepositoryDescriptor,
230
+ cancellation?: AbortSignal,
231
+ ): Promise<RepositoryMetadata | undefined> {
232
+ return (await this.authenticationService.apis.gitlab)?.getRepositoryMetadata(
233
+ this,
234
+ toTokenWithInfo(this.id, session),
235
+ repo.owner,
236
+ repo.name,
237
+ {
238
+ baseUrl: this.apiBaseUrl,
239
+ },
240
+ cancellation,
241
+ );
242
+ }
243
+
244
+ protected override async searchProviderMyPullRequests(
245
+ session: ProviderAuthenticationSession,
246
+ repos?: GitLabRepositoryDescriptor[],
247
+ ): Promise<PullRequest[] | undefined> {
248
+ const api = await this.getProvidersApi();
249
+ const username = (await this.getCurrentAccount())?.username;
250
+ if (!username) {
251
+ return Promise.resolve([]);
252
+ }
253
+
254
+ const apiResult = await api.getPullRequestsForUser(toTokenWithInfo(this.id, session), username, {
255
+ isPAT: this.isEnterprise,
256
+ baseUrl: this.isEnterprise ? `https://${this.domain}` : undefined,
257
+ });
258
+
259
+ if (apiResult == null) {
260
+ return Promise.resolve([]);
261
+ }
262
+
263
+ // now I'm going to filter prs from the result according to the repos parameter
264
+ let prs;
265
+ if (repos != null) {
266
+ const repoMap = new Map<string, GitLabRepositoryDescriptor>();
267
+ for (const repo of repos) {
268
+ repoMap.set(`${repo.owner}/${repo.name}`, repo);
269
+ }
270
+ prs = apiResult.values.filter(pr => {
271
+ const repo = repoMap.get(`${pr.repository.owner.login}/${pr.repository.name}`);
272
+ return repo != null;
273
+ });
274
+ } else {
275
+ prs = apiResult.values;
276
+ }
277
+
278
+ const results: IterableIterator<PullRequest> = uniqueBy(
279
+ [
280
+ ...prs
281
+ .filter(pr => {
282
+ const isAssignee = pr.assignees?.some(a => a.username === username);
283
+ const isRequestedReviewer = pr.reviews?.some(
284
+ review =>
285
+ review.reviewer?.username === username ||
286
+ review.state === ProviderPullRequestReviewState.ReviewRequested,
287
+ );
288
+ const isAuthor = pr.author?.username === username;
289
+ // It seems like GitLab doesn't give us mentioned PRs.
290
+ // const isMentioned = ???;
291
+
292
+ return isAssignee || isRequestedReviewer || isAuthor;
293
+ })
294
+ .map(pr => fromGitLabMergeRequestProvidersApi(pr, this)),
295
+ ],
296
+ r => r.url,
297
+ (original, _current) => original,
298
+ );
299
+
300
+ return [...results];
301
+ }
302
+
303
+ protected override async searchProviderMyIssues(
304
+ session: ProviderAuthenticationSession,
305
+ repos?: GitLabRepositoryDescriptor[],
306
+ ): Promise<IssueShape[] | undefined> {
307
+ const api = await this.authenticationService.apis.gitlab;
308
+ const providerApi = await this.getProvidersApi();
309
+ if (!api || !repos) {
310
+ return undefined;
311
+ }
312
+
313
+ const repoIdsResult = await Promise.allSettled(
314
+ repos.map(
315
+ (r: GitLabRepositoryDescriptor): Promise<string | undefined> =>
316
+ api.getProjectId(
317
+ this,
318
+ toTokenWithInfo(this.id, session),
319
+ r.owner,
320
+ r.name,
321
+ this.apiBaseUrl,
322
+ undefined,
323
+ ),
324
+ ) ?? [],
325
+ );
326
+ const repoInput = repoIdsResult
327
+ .map(result => (result.status === 'fulfilled' ? result.value : undefined))
328
+ .filter((r): r is string => r != null);
329
+ const apiResult = await providerApi.getIssuesForRepos(toTokenWithInfo(this.id, session), repoInput, {
330
+ isPAT: this.isEnterprise,
331
+ baseUrl: this.isEnterprise ? `https://${this.domain}` : undefined,
332
+ });
333
+
334
+ return apiResult.values
335
+ .map(issue => toIssueShape(issue, this))
336
+ .filter((result): result is IssueShape => result != null);
337
+ }
338
+
339
+ protected override async searchProviderPullRequests(
340
+ session: ProviderAuthenticationSession,
341
+ searchQuery: string,
342
+ repos?: GitLabRepositoryDescriptor[],
343
+ cancellation?: AbortSignal,
344
+ ): Promise<PullRequest[] | undefined> {
345
+ const api = await this.authenticationService.apis.gitlab;
346
+ if (!api) {
347
+ return undefined;
348
+ }
349
+
350
+ return api.searchPullRequests(
351
+ this,
352
+ toTokenWithInfo(this.id, session),
353
+ {
354
+ search: searchQuery,
355
+ repos: repos?.map(r => `${r.owner}/${r.name}`),
356
+ baseUrl: this.apiBaseUrl,
357
+ },
358
+ cancellation,
359
+ );
360
+ }
361
+
362
+ protected override async mergeProviderPullRequest(
363
+ session: ProviderAuthenticationSession,
364
+ pr: PullRequest,
365
+ options?: {
366
+ mergeMethod?: PullRequestMergeMethod;
367
+ },
368
+ ): Promise<boolean> {
369
+ if (!this.isPullRequest(pr)) return false;
370
+
371
+ const api = await this.getProvidersApi();
372
+ try {
373
+ const res = await api.mergePullRequest(toTokenWithInfo(this.id, session), pr, {
374
+ ...options,
375
+ isPAT: this.isEnterprise,
376
+ baseUrl: this.isEnterprise ? `https://${this.domain}` : undefined,
377
+ });
378
+ return res;
379
+ } catch (ex) {
380
+ void this.showMergeErrorMessage(ex);
381
+ return false;
382
+ }
383
+ }
384
+
385
+ private async showMergeErrorMessage(ex: Error) {
386
+ // Unfortunately, providers-api does not let us know the exact reason for the error,
387
+ // so we show the same message to everything.
388
+ // When we update the library, we can improve the error handling here.
389
+ const reauthenticate = await this.ctx.hooks?.onReauthenticationRequired?.(
390
+ `${ex.message}. Would you like to try reauthenticating to provide additional access? Your token needs to have the 'api' scope to perform merge.`,
391
+ );
392
+
393
+ if (reauthenticate) {
394
+ await this.reauthenticate();
395
+ }
396
+ }
397
+
398
+ private isPullRequest(pr: PullRequest | { id: string; headRefSha: string }): pr is PullRequest {
399
+ return (pr as PullRequest).refs != null;
400
+ }
401
+
402
+ protected override async getProviderCurrentAccount(
403
+ session: ProviderAuthenticationSession,
404
+ ): Promise<Account | undefined> {
405
+ const api = await this.getProvidersApi();
406
+ const currentUser = await api.getCurrentUser(toTokenWithInfo(this.id, session), {
407
+ isPAT: this.isEnterprise,
408
+ baseUrl: this.isEnterprise ? `https://${this.domain}` : undefined,
409
+ });
410
+ if (currentUser == null) return undefined;
411
+
412
+ return {
413
+ provider: {
414
+ id: this.id,
415
+ name: this.name,
416
+ domain: this.domain,
417
+ icon: this.icon,
418
+ },
419
+ id: currentUser.id,
420
+ name: currentUser.name || undefined,
421
+ email: currentUser.email || undefined,
422
+ avatarUrl: currentUser.avatarUrl || undefined,
423
+ username: currentUser.username || undefined,
424
+ };
425
+ }
426
+
427
+ protected override getProviderPullRequestIdentityFromMaybeUrl(search: string): PullRequestUrlIdentity | undefined {
428
+ return getGitLabPullRequestIdentityFromMaybeUrl(search, this.id);
429
+ }
430
+ }
431
+
432
+ export class GitLabIntegration extends GitLabIntegrationBase<GitCloudHostIntegrationId.GitLab> {
433
+ readonly authProvider = authProvider;
434
+ readonly id = GitCloudHostIntegrationId.GitLab;
435
+ protected readonly key = this.id;
436
+ readonly name: string = 'GitLab';
437
+ get domain(): string {
438
+ return metadata.domain;
439
+ }
440
+
441
+ protected get apiBaseUrl(): string {
442
+ return 'https://gitlab.com/api';
443
+ }
444
+
445
+ override access(): Promise<boolean> {
446
+ // Always allow GitHub cloud integration access
447
+ return Promise.resolve(true);
448
+ }
449
+ }
450
+
451
+ export class GitLabSelfHostedIntegration extends GitLabIntegrationBase<GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted> {
452
+ readonly authProvider = cloudEnterpriseAuthProvider;
453
+ readonly id = GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted;
454
+ protected readonly key;
455
+ readonly name = 'GitLab Self-Hosted';
456
+ get domain(): string {
457
+ return this._domain;
458
+ }
459
+ protected override get apiBaseUrl(): string {
460
+ return `https://${this._domain}/api`;
461
+ }
462
+
463
+ constructor(
464
+ ctx: IntegrationServiceContext,
465
+ authenticationService: IntegrationAuthenticationService,
466
+ getProvidersApi: () => Promise<ProvidersApi>,
467
+ didChangeConnection: Emitter<IntegrationConnectionChangeEvent>,
468
+ private readonly _domain: string,
469
+ ) {
470
+ super(ctx, authenticationService, getProvidersApi, didChangeConnection);
471
+ this.key = `${this.id}:${this.domain}` as const;
472
+ }
473
+ }