@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,144 @@
1
+ import type { GitRemote } from '../../../git/models/remote.js';
2
+ import { gate } from '../../../utils/decorators/gate.js';
3
+ import { debug } from '../../../utils/decorators/log.js';
4
+ import type { Disposable } from '../../../utils/disposable.js';
5
+ import type { IntegrationIds, SupportedCloudIntegrationIds } from '../constants.js';
6
+ import {
7
+ GitCloudHostIntegrationId,
8
+ GitSelfManagedHostIntegrationId,
9
+ IssuesCloudHostIntegrationId,
10
+ } from '../constants.js';
11
+ import type { IntegrationServiceContext } from '../context.js';
12
+ import type { IntegrationService } from '../integrationService.js';
13
+ import type { GitHostIntegration } from '../models/gitHostIntegration.js';
14
+ import type { ApiClients } from '../providers/apiClients.js';
15
+ import type { Source } from '../telemetry.js';
16
+ import { supportedIntegrationIds } from '../utils/integration.utils.js';
17
+ import type { CloudIntegrationService } from './cloudIntegrationService.js';
18
+ import type { ConfiguredIntegrationService } from './configuredIntegrationService.js';
19
+ import type { IntegrationAuthenticationProvider } from './integrationAuthenticationProvider.js';
20
+ import { CloudIntegrationAuthenticationProvider } from './integrationAuthenticationProvider.js';
21
+
22
+ export class IntegrationAuthenticationService implements Disposable {
23
+ private readonly providers = new Map<IntegrationIds, IntegrationAuthenticationProvider>();
24
+
25
+ constructor(
26
+ private readonly configuredIntegrationService: ConfiguredIntegrationService,
27
+ readonly ctx: IntegrationServiceContext,
28
+ /**
29
+ * Lazy accessor for the owning {@link IntegrationService}. Injected by the composition root
30
+ * ({@link createIntegrationManager}) to break the auth↔service construction cycle without a
31
+ * mutable setter or a host round-trip; only resolved at runtime (long after construction).
32
+ */
33
+ private readonly getIntegrationService: () => IntegrationService,
34
+ /** The package's cloud token-exchange client, constructed by the composition root. */
35
+ readonly cloudIntegrations: CloudIntegrationService,
36
+ ) {}
37
+
38
+ dispose(): void {
39
+ this.providers.forEach(p => p.dispose());
40
+ this.providers.clear();
41
+ }
42
+
43
+ /**
44
+ * Initiates the cloud-integration connect flow on the owning service. Cloud auth providers call
45
+ * this when they need a session that doesn't exist yet (see
46
+ * {@link CloudIntegrationAuthenticationProvider}).
47
+ */
48
+ connectCloudIntegrations(
49
+ connect: { integrationIds: SupportedCloudIntegrationIds[]; skipIfConnected?: boolean; skipPreSync?: boolean },
50
+ source?: Source,
51
+ ): Promise<boolean> {
52
+ return this.getIntegrationService().connectCloudIntegrations(connect, source);
53
+ }
54
+
55
+ /**
56
+ * Resolves the connected git-host integration for a `GitRemote`, via the owning service. Lets
57
+ * package-internal callers (e.g. the Bitbucket provider) resolve a remote's integration without a
58
+ * host round-trip.
59
+ */
60
+ getByRemote(remote: GitRemote): Promise<GitHostIntegration | undefined> {
61
+ return this.getIntegrationService().getByRemote(remote);
62
+ }
63
+
64
+ /** Resolves the per-integration `ignoreSSLErrors` flag via the owning service (host-config-backed). */
65
+ ignoreSSLErrors(integration: GitHostIntegration | { id: IntegrationIds; domain?: string }): boolean | 'force' {
66
+ return this.getIntegrationService().ignoreSSLErrors(integration);
67
+ }
68
+
69
+ /** The package-built per-provider API clients, via the owning service (built once + memoized there). */
70
+ get apis(): ApiClients {
71
+ return this.getIntegrationService().apis;
72
+ }
73
+
74
+ async get(providerId: IntegrationIds): Promise<IntegrationAuthenticationProvider> {
75
+ return this.ensureProvider(providerId);
76
+ }
77
+
78
+ @debug()
79
+ async reset(): Promise<void> {
80
+ // TODO: This really isn't ideal, since it will only work for "cloud" providers as we won't have any more specific descriptors
81
+ await Promise.allSettled(
82
+ supportedIntegrationIds.map(async providerId =>
83
+ (await this.ensureProvider(providerId)).deleteAllSessions(),
84
+ ),
85
+ );
86
+ }
87
+
88
+ supports(providerId: string): boolean {
89
+ switch (providerId) {
90
+ case GitCloudHostIntegrationId.AzureDevOps:
91
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
92
+ case GitCloudHostIntegrationId.Bitbucket:
93
+ case GitCloudHostIntegrationId.GitLab:
94
+ case IssuesCloudHostIntegrationId.Jira:
95
+ case GitCloudHostIntegrationId.GitHub:
96
+ return true;
97
+ default:
98
+ return false;
99
+ }
100
+ }
101
+
102
+ @gate()
103
+ private async ensureProvider(providerId: IntegrationIds): Promise<IntegrationAuthenticationProvider> {
104
+ let provider = this.providers.get(providerId);
105
+ if (provider != null) return provider;
106
+
107
+ // Optional consumer override for custom auth (e.g. a manual-token provider). GitLens omits it —
108
+ // the package constructs its own cloud providers below (so GitLens's cloud auth needs no host hook).
109
+ const hostProvider = await this.ctx.hooks?.createAuthenticationProvider?.({
110
+ id: providerId,
111
+ auth: this,
112
+ configured: this.configuredIntegrationService,
113
+ });
114
+ if (hostProvider != null) {
115
+ this.providers.set(providerId, hostProvider);
116
+ return hostProvider;
117
+ }
118
+
119
+ // Every cloud integration shares one provider, parameterized by id (cloud-only).
120
+ switch (providerId) {
121
+ case GitCloudHostIntegrationId.GitHub:
122
+ case GitSelfManagedHostIntegrationId.CloudGitHubEnterprise:
123
+ case GitCloudHostIntegrationId.GitLab:
124
+ case GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted:
125
+ case GitCloudHostIntegrationId.AzureDevOps:
126
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
127
+ case GitCloudHostIntegrationId.Bitbucket:
128
+ case GitSelfManagedHostIntegrationId.BitbucketServer:
129
+ case IssuesCloudHostIntegrationId.Jira:
130
+ case IssuesCloudHostIntegrationId.Linear:
131
+ provider = new CloudIntegrationAuthenticationProvider(
132
+ this,
133
+ this.configuredIntegrationService,
134
+ providerId,
135
+ );
136
+ break;
137
+ default:
138
+ throw new Error(`No authentication provider registered for integration '${providerId}'`);
139
+ }
140
+
141
+ this.providers.set(providerId, provider);
142
+ return provider;
143
+ }
144
+ }
@@ -0,0 +1,72 @@
1
+ // Convenience for "manual token" auth — when a consumer already has an access
2
+ // token (CLI flag, env var, secret manager) and just wants the package to use
3
+ // it without an OAuth dance. Wire it into the manager via the
4
+ // `createAuthenticationProvider` hook:
5
+ //
6
+ // const manager = createIntegrationManager({
7
+ // ...runtime,
8
+ // hooks: {
9
+ // createAuthenticationProvider: async ({ id }) =>
10
+ // id === GitCloudHostIntegrationId.GitHub
11
+ // ? createManualTokenAuthProvider({
12
+ // id: id,
13
+ // token: process.env.GITHUB_TOKEN!,
14
+ // account: { id: 'me', label: 'CLI Token' },
15
+ // })
16
+ // : undefined,
17
+ // },
18
+ // });
19
+ //
20
+ // The provider is intentionally minimal — sessions are non-cancellable, never
21
+ // expire, and persist for the lifetime of the manager. For OAuth flows or
22
+ // refreshable tokens, implement `IntegrationAuthenticationProvider` yourself.
23
+
24
+ import type { Event } from '../../../utils/event.js';
25
+ import { Emitter } from '../../../utils/event.js';
26
+ import type { IntegrationIds } from '../constants.js';
27
+ import type {
28
+ IntegrationAuthenticationProvider,
29
+ IntegrationAuthenticationSessionDescriptor,
30
+ } from './integrationAuthenticationProvider.js';
31
+ import type { ProviderAuthenticationSession } from './models.js';
32
+
33
+ export interface ManualTokenAuthProviderOptions {
34
+ readonly id: IntegrationIds;
35
+ readonly token: string;
36
+ readonly account: { readonly id: string; readonly label: string };
37
+ readonly scopes?: readonly string[];
38
+ readonly domain?: string;
39
+ readonly cloud?: boolean;
40
+ }
41
+
42
+ export function createManualTokenAuthProvider(
43
+ options: ManualTokenAuthProviderOptions,
44
+ ): IntegrationAuthenticationProvider {
45
+ const onDidChange = new Emitter<void>();
46
+ const session: ProviderAuthenticationSession = {
47
+ id: `manual:${options.id}`,
48
+ accessToken: options.token,
49
+ account: options.account,
50
+ scopes: options.scopes ?? [],
51
+ cloud: options.cloud ?? true,
52
+ type: undefined,
53
+ domain: options.domain ?? '',
54
+ };
55
+
56
+ return {
57
+ get onDidChange(): Event<void> {
58
+ return onDidChange.event;
59
+ },
60
+ getSession: (
61
+ _descriptor: IntegrationAuthenticationSessionDescriptor,
62
+ options?: Parameters<IntegrationAuthenticationProvider['getSession']>[1],
63
+ ) =>
64
+ // A manual token can't be refreshed; on a forced new session, fail safe by returning undefined
65
+ // rather than handing back the same (likely-rejected) token, which would loop a caller's
66
+ // reauthenticate-on-failure flow.
67
+ Promise.resolve(options?.forceNewSession ? undefined : session),
68
+ deleteSession: () => Promise.resolve(),
69
+ deleteAllSessions: () => Promise.resolve(),
70
+ dispose: () => onDidChange.dispose(),
71
+ };
72
+ }
@@ -0,0 +1,168 @@
1
+ import { microhash } from '../../../utils/hash.js';
2
+ import type { IntegrationIds, SupportedCloudIntegrationIds } from '../constants.js';
3
+ import {
4
+ GitCloudHostIntegrationId,
5
+ GitSelfManagedHostIntegrationId,
6
+ IssuesCloudHostIntegrationId,
7
+ supportedOrderedCloudIntegrationIds,
8
+ } from '../constants.js';
9
+
10
+ /**
11
+ * Mirrors the shape of `vscode.AuthenticationSession` so the integrations
12
+ * package can stay vscode-free. Host adapters bridge VS Code sessions to
13
+ * this shape via {@link AuthenticationProvider}.
14
+ */
15
+ export interface AuthenticationSessionLike {
16
+ readonly id: string;
17
+ readonly accessToken: string;
18
+ readonly account: { readonly id: string; readonly label: string };
19
+ readonly scopes: readonly string[];
20
+ }
21
+
22
+ export interface ProviderAuthenticationSession extends AuthenticationSessionLike {
23
+ readonly cloud: boolean;
24
+ readonly type: CloudIntegrationAuthType | undefined;
25
+ readonly expiresAt?: Date;
26
+ readonly domain: string;
27
+ readonly protocol?: string;
28
+ }
29
+
30
+ export interface TokenInfo<T extends IntegrationIds | 'gitkraken' = IntegrationIds | 'gitkraken'> {
31
+ readonly providerId: T;
32
+ /**
33
+ * The first 3 characters of the md5 hash of the token.
34
+ * It's a very obfuscated representation of the token that we can use in logs
35
+ * to see whether the token survives refreshing or gets updated.
36
+ */
37
+ readonly microHash: string | undefined;
38
+ readonly cloud: boolean;
39
+ readonly type: CloudIntegrationAuthType | undefined;
40
+ readonly scopes: readonly string[] | undefined;
41
+ readonly expiresAt?: Date;
42
+ }
43
+
44
+ export interface TokenWithInfo<T extends IntegrationIds = IntegrationIds> extends TokenInfo<T> {
45
+ readonly accessToken: string;
46
+ }
47
+
48
+ export function toTokenInfo<T extends IntegrationIds | 'gitkraken'>(
49
+ providerId: T,
50
+ accessToken: string | undefined,
51
+ info: { cloud: boolean; type: CloudIntegrationAuthType | undefined; scopes?: readonly string[]; expiresAt?: Date },
52
+ ): TokenInfo<T> {
53
+ return {
54
+ providerId: providerId,
55
+ microHash: microhash(accessToken, 3),
56
+ cloud: info.cloud,
57
+ type: info.type,
58
+ scopes: info.scopes,
59
+ expiresAt: info.expiresAt,
60
+ };
61
+ }
62
+
63
+ export function toTokenWithInfo<T extends IntegrationIds>(
64
+ providerId: T,
65
+ session: ProviderAuthenticationSession,
66
+ altToken?: string,
67
+ ): TokenWithInfo<T> {
68
+ const { accessToken: sessionToken, ...sessionInfo } = session;
69
+ const accessToken = altToken ?? session.accessToken;
70
+ return {
71
+ // pass original token info to form the correlated microhash
72
+ ...toTokenInfo(providerId, sessionToken, sessionInfo),
73
+ // use the actual token used for the request
74
+ accessToken: accessToken,
75
+ };
76
+ }
77
+
78
+ export type TokenOptInfo<T extends IntegrationIds = IntegrationIds> =
79
+ | TokenWithInfo<T>
80
+ | { providerId: T; accessToken?: undefined };
81
+
82
+ export interface ConfiguredIntegrationDescriptor {
83
+ readonly cloud: boolean;
84
+ readonly integrationId: IntegrationIds;
85
+ readonly scopes: string;
86
+ readonly domain?: string;
87
+ readonly expiresAt?: string | Date;
88
+ }
89
+
90
+ export interface CloudIntegrationAuthenticationSession {
91
+ type: CloudIntegrationAuthType;
92
+ accessToken: string;
93
+ domain: string;
94
+ expiresIn: number;
95
+ scopes: string;
96
+ }
97
+
98
+ export interface CloudIntegrationAuthorization {
99
+ url: string;
100
+ }
101
+
102
+ export interface CloudIntegrationConnection {
103
+ type: CloudIntegrationAuthType;
104
+ provider: CloudIntegrationType;
105
+ domain: string;
106
+ }
107
+
108
+ export type CloudIntegrationType =
109
+ | 'jira'
110
+ | 'linear'
111
+ | 'trello'
112
+ | 'gitlab'
113
+ | 'github'
114
+ | 'bitbucket'
115
+ | 'bitbucketServer'
116
+ | 'azure'
117
+ | 'azureDevopsServer'
118
+ | 'githubEnterprise'
119
+ | 'gitlabSelfHosted';
120
+
121
+ export type CloudIntegrationAuthType = 'oauth' | 'pat';
122
+
123
+ export const CloudIntegrationAuthenticationUriPathPrefix = 'did-authenticate-cloud-integration';
124
+
125
+ /** Returns all supported cloud integration ids. */
126
+ export function getSupportedCloudIntegrationIds(): readonly SupportedCloudIntegrationIds[] {
127
+ // Return the shared const directly (readonly so callers can't mutate it) — this runs on hot,
128
+ // per-integration membership paths, so avoid allocating a fresh array per call.
129
+ return supportedOrderedCloudIntegrationIds;
130
+ }
131
+
132
+ /** Whether `id` is a supported cloud integration id. */
133
+ export function isSupportedCloudIntegrationId(id: string): id is SupportedCloudIntegrationIds {
134
+ return getSupportedCloudIntegrationIds().includes(id as SupportedCloudIntegrationIds);
135
+ }
136
+
137
+ export function isIssueCloudIntegrationId(id: string): id is IssuesCloudHostIntegrationId {
138
+ const issueIds: string[] = Object.values(IssuesCloudHostIntegrationId);
139
+ return issueIds.includes(id);
140
+ }
141
+
142
+ export const toIntegrationId: { [key in CloudIntegrationType]: IntegrationIds } = {
143
+ jira: IssuesCloudHostIntegrationId.Jira,
144
+ linear: IssuesCloudHostIntegrationId.Linear,
145
+ trello: IssuesCloudHostIntegrationId.Trello,
146
+ gitlab: GitCloudHostIntegrationId.GitLab,
147
+ github: GitCloudHostIntegrationId.GitHub,
148
+ githubEnterprise: GitSelfManagedHostIntegrationId.CloudGitHubEnterprise,
149
+ gitlabSelfHosted: GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted,
150
+ bitbucket: GitCloudHostIntegrationId.Bitbucket,
151
+ bitbucketServer: GitSelfManagedHostIntegrationId.BitbucketServer,
152
+ azure: GitCloudHostIntegrationId.AzureDevOps,
153
+ azureDevopsServer: GitSelfManagedHostIntegrationId.AzureDevOpsServer,
154
+ };
155
+
156
+ export const toCloudIntegrationType: { [key in IntegrationIds]: CloudIntegrationType | undefined } = {
157
+ [IssuesCloudHostIntegrationId.Jira]: 'jira',
158
+ [IssuesCloudHostIntegrationId.Linear]: 'linear',
159
+ [IssuesCloudHostIntegrationId.Trello]: 'trello',
160
+ [GitCloudHostIntegrationId.GitLab]: 'gitlab',
161
+ [GitCloudHostIntegrationId.GitHub]: 'github',
162
+ [GitCloudHostIntegrationId.Bitbucket]: 'bitbucket',
163
+ [GitCloudHostIntegrationId.AzureDevOps]: 'azure',
164
+ [GitSelfManagedHostIntegrationId.AzureDevOpsServer]: 'azureDevopsServer',
165
+ [GitSelfManagedHostIntegrationId.CloudGitHubEnterprise]: 'githubEnterprise',
166
+ [GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted]: 'gitlabSelfHosted',
167
+ [GitSelfManagedHostIntegrationId.BitbucketServer]: 'bitbucketServer',
168
+ };
@@ -0,0 +1,169 @@
1
+ export enum GitCloudHostIntegrationId {
2
+ GitHub = 'github',
3
+ GitLab = 'gitlab',
4
+ Bitbucket = 'bitbucket',
5
+ AzureDevOps = 'azureDevOps',
6
+ }
7
+
8
+ export enum GitSelfManagedHostIntegrationId {
9
+ BitbucketServer = 'bitbucket-server',
10
+ CloudGitHubEnterprise = 'cloud-github-enterprise',
11
+ CloudGitLabSelfHosted = 'cloud-gitlab-self-hosted',
12
+ AzureDevOpsServer = 'azure-devops-server',
13
+ }
14
+
15
+ export enum IssuesCloudHostIntegrationId {
16
+ Jira = 'jira',
17
+ Linear = 'linear',
18
+ Trello = 'trello',
19
+ }
20
+
21
+ export type CloudGitSelfManagedHostIntegrationIds =
22
+ | GitSelfManagedHostIntegrationId.CloudGitHubEnterprise
23
+ | GitSelfManagedHostIntegrationId.BitbucketServer
24
+ | GitSelfManagedHostIntegrationId.AzureDevOpsServer
25
+ | GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted;
26
+
27
+ export type GitHostIntegrationIds = GitCloudHostIntegrationId | GitSelfManagedHostIntegrationId;
28
+ export type IssuesHostIntegrationIds = IssuesCloudHostIntegrationId;
29
+
30
+ export type IntegrationIds = GitHostIntegrationIds | IssuesHostIntegrationIds;
31
+
32
+ export const supportedOrderedCloudIssuesIntegrationIds = [
33
+ IssuesCloudHostIntegrationId.Jira,
34
+ IssuesCloudHostIntegrationId.Linear,
35
+ ];
36
+ export const supportedOrderedCloudIntegrationIds = [
37
+ GitCloudHostIntegrationId.GitHub,
38
+ GitSelfManagedHostIntegrationId.CloudGitHubEnterprise,
39
+ GitCloudHostIntegrationId.GitLab,
40
+ GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted,
41
+ GitCloudHostIntegrationId.AzureDevOps,
42
+ GitSelfManagedHostIntegrationId.AzureDevOpsServer,
43
+ GitCloudHostIntegrationId.Bitbucket,
44
+ GitSelfManagedHostIntegrationId.BitbucketServer,
45
+ IssuesCloudHostIntegrationId.Jira,
46
+ IssuesCloudHostIntegrationId.Linear,
47
+ ];
48
+
49
+ export const integrationIds = [
50
+ GitCloudHostIntegrationId.GitHub,
51
+ GitCloudHostIntegrationId.GitLab,
52
+ GitCloudHostIntegrationId.Bitbucket,
53
+ GitCloudHostIntegrationId.AzureDevOps,
54
+ GitSelfManagedHostIntegrationId.AzureDevOpsServer,
55
+ GitSelfManagedHostIntegrationId.BitbucketServer,
56
+ GitSelfManagedHostIntegrationId.CloudGitHubEnterprise,
57
+ GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted,
58
+ IssuesCloudHostIntegrationId.Jira,
59
+ IssuesCloudHostIntegrationId.Linear,
60
+ IssuesCloudHostIntegrationId.Trello,
61
+ ];
62
+
63
+ export type SupportedCloudIntegrationIds = (typeof supportedOrderedCloudIntegrationIds)[number];
64
+
65
+ export function isSupportedCloudIntegrationId(id: IntegrationIds): id is SupportedCloudIntegrationIds {
66
+ return supportedOrderedCloudIntegrationIds.includes(id);
67
+ }
68
+
69
+ export function isIntegrationId(id: string): id is IntegrationIds {
70
+ return integrationIds.includes(id as IntegrationIds);
71
+ }
72
+
73
+ export type IntegrationFeatures = 'prs' | 'issues';
74
+
75
+ export interface IntegrationDescriptor {
76
+ id: SupportedCloudIntegrationIds;
77
+ name: string;
78
+ icon: string;
79
+ supports: IntegrationFeatures[];
80
+ requiresPro: boolean;
81
+ }
82
+
83
+ /** Stored shape of a configured-integration descriptor in workspace state. */
84
+ export interface StoredConfiguredIntegrationDescriptor {
85
+ cloud: boolean;
86
+ integrationId: IntegrationIds;
87
+ domain?: string;
88
+ expiresAt?: string;
89
+ scopes: string;
90
+ }
91
+
92
+ /** Stored shape of the `integrations:configured` storage key. */
93
+ export type StoredIntegrationConfigurations = Record<
94
+ IntegrationIds,
95
+ StoredConfiguredIntegrationDescriptor[] | undefined
96
+ >;
97
+
98
+ export const supportedCloudIntegrationDescriptors: IntegrationDescriptor[] = [
99
+ {
100
+ id: GitCloudHostIntegrationId.GitHub,
101
+ name: 'GitHub',
102
+ icon: 'gl-provider-github',
103
+ supports: ['prs', 'issues'],
104
+ requiresPro: false,
105
+ },
106
+ {
107
+ id: GitSelfManagedHostIntegrationId.CloudGitHubEnterprise,
108
+ name: 'GitHub Enterprise',
109
+ icon: 'gl-provider-github',
110
+ supports: ['prs', 'issues'],
111
+ requiresPro: true,
112
+ },
113
+ {
114
+ id: GitCloudHostIntegrationId.GitLab,
115
+ name: 'GitLab',
116
+ icon: 'gl-provider-gitlab',
117
+ supports: ['prs', 'issues'],
118
+ requiresPro: false,
119
+ },
120
+ {
121
+ id: GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted,
122
+ name: 'GitLab Self-Hosted',
123
+ icon: 'gl-provider-gitlab',
124
+ supports: ['prs', 'issues'],
125
+ requiresPro: true,
126
+ },
127
+ {
128
+ id: GitCloudHostIntegrationId.AzureDevOps,
129
+ name: 'Azure DevOps',
130
+ icon: 'gl-provider-azdo',
131
+ supports: ['prs', 'issues'],
132
+ requiresPro: true,
133
+ },
134
+ {
135
+ id: GitSelfManagedHostIntegrationId.AzureDevOpsServer,
136
+ name: 'Azure DevOps Server',
137
+ icon: 'gl-provider-azdo',
138
+ supports: ['prs', 'issues'],
139
+ requiresPro: true,
140
+ },
141
+ {
142
+ id: GitCloudHostIntegrationId.Bitbucket,
143
+ name: 'Bitbucket',
144
+ icon: 'gl-provider-bitbucket',
145
+ supports: ['prs', 'issues'],
146
+ requiresPro: false,
147
+ },
148
+ {
149
+ id: GitSelfManagedHostIntegrationId.BitbucketServer,
150
+ name: 'Bitbucket Data Center',
151
+ icon: 'gl-provider-bitbucket',
152
+ supports: ['prs'],
153
+ requiresPro: true,
154
+ },
155
+ {
156
+ id: IssuesCloudHostIntegrationId.Jira,
157
+ name: 'Jira',
158
+ icon: 'gl-provider-jira',
159
+ supports: ['issues'],
160
+ requiresPro: true,
161
+ },
162
+ {
163
+ id: IssuesCloudHostIntegrationId.Linear,
164
+ name: 'Linear',
165
+ icon: 'gl-provider-linear',
166
+ supports: ['issues'],
167
+ requiresPro: true,
168
+ },
169
+ ];