@gitkraken/core-gitlens 0.2.0 → 0.3.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 (361) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/git/cache.d.ts +28 -4
  3. package/dist/git/cache.d.ts.map +1 -1
  4. package/dist/git/cache.js +82 -18
  5. package/dist/git/cache.js.map +1 -1
  6. package/dist/git/models/commit.d.ts.map +1 -1
  7. package/dist/git/models/commit.js.map +1 -1
  8. package/dist/git/models/reference.d.ts +31 -0
  9. package/dist/git/models/reference.d.ts.map +1 -1
  10. package/dist/git/models/remote.d.ts.map +1 -1
  11. package/dist/git/models/remote.js.map +1 -1
  12. package/dist/git/models/repository.d.ts +9 -1
  13. package/dist/git/models/repository.d.ts.map +1 -1
  14. package/dist/git/models/repository.js +19 -3
  15. package/dist/git/models/repository.js.map +1 -1
  16. package/dist/git/models/search.d.ts +2 -2
  17. package/dist/git/models/search.d.ts.map +1 -1
  18. package/dist/git/models/worktree.d.ts +4 -1
  19. package/dist/git/models/worktree.d.ts.map +1 -1
  20. package/dist/git/models/worktree.js +2 -2
  21. package/dist/git/models/worktree.js.map +1 -1
  22. package/dist/git/parsers/diffParser.d.ts.map +1 -1
  23. package/dist/git/parsers/diffParser.js.map +1 -1
  24. package/dist/git/providers/branches.d.ts +15 -4
  25. package/dist/git/providers/branches.d.ts.map +1 -1
  26. package/dist/git/providers/config.d.ts +4 -1
  27. package/dist/git/providers/config.d.ts.map +1 -1
  28. package/dist/git/providers/operations.d.ts +33 -10
  29. package/dist/git/providers/operations.d.ts.map +1 -1
  30. package/dist/git/providers/pausedOperations.d.ts +3 -1
  31. package/dist/git/providers/pausedOperations.d.ts.map +1 -1
  32. package/dist/git/providers/refs.d.ts +23 -2
  33. package/dist/git/providers/refs.d.ts.map +1 -1
  34. package/dist/git/providers/staging.d.ts +16 -0
  35. package/dist/git/providers/staging.d.ts.map +1 -1
  36. package/dist/git/providers/status.d.ts +4 -1
  37. package/dist/git/providers/status.d.ts.map +1 -1
  38. package/dist/git/remotes/azure-devops.d.ts.map +1 -1
  39. package/dist/git/remotes/azure-devops.js.map +1 -1
  40. package/dist/git/{exec.types.d.ts → run.types.d.ts} +22 -3
  41. package/dist/git/run.types.d.ts.map +1 -0
  42. package/dist/git/run.types.js +2 -0
  43. package/dist/git/run.types.js.map +1 -0
  44. package/dist/git/service.d.ts.map +1 -1
  45. package/dist/git/service.js.map +1 -1
  46. package/dist/git/utils/autolink.utils.d.ts.map +1 -1
  47. package/dist/git/utils/autolink.utils.js.map +1 -1
  48. package/dist/git/utils/blame.utils.d.ts.map +1 -1
  49. package/dist/git/utils/blame.utils.js.map +1 -1
  50. package/dist/git/utils/conflictResolution.utils.d.ts +6 -0
  51. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -0
  52. package/dist/git/utils/conflictResolution.utils.js +25 -0
  53. package/dist/git/utils/conflictResolution.utils.js.map +1 -0
  54. package/dist/git/utils/fileStatus.utils.d.ts +2 -1
  55. package/dist/git/utils/fileStatus.utils.d.ts.map +1 -1
  56. package/dist/git/utils/fileStatus.utils.js +4 -0
  57. package/dist/git/utils/fileStatus.utils.js.map +1 -1
  58. package/dist/git/utils/search.utils.d.ts.map +1 -1
  59. package/dist/git/utils/search.utils.js +3 -0
  60. package/dist/git/utils/search.utils.js.map +1 -1
  61. package/dist/git/utils/sorting.d.ts +8 -0
  62. package/dist/git/utils/sorting.d.ts.map +1 -1
  63. package/dist/git/utils/sorting.js +15 -0
  64. package/dist/git/utils/sorting.js.map +1 -1
  65. package/dist/git/utils/status.utils.d.ts.map +1 -1
  66. package/dist/git/utils/status.utils.js.map +1 -1
  67. package/dist/git/watching/classifyChange.d.ts.map +1 -1
  68. package/dist/git/watching/classifyChange.js +8 -0
  69. package/dist/git/watching/classifyChange.js.map +1 -1
  70. package/dist/git/watching/gitIgnoreFilter.js +1 -1
  71. package/dist/git/watching/gitIgnoreFilter.js.map +1 -1
  72. package/dist/git/watching/initWatcher.d.ts.map +1 -1
  73. package/dist/git/watching/initWatcher.js.map +1 -1
  74. package/dist/git/watching/watchGroup.d.ts.map +1 -1
  75. package/dist/git/watching/watchGroup.js.map +1 -1
  76. package/dist/git/watching/watchService.d.ts.map +1 -1
  77. package/dist/git/watching/watchService.js +24 -4
  78. package/dist/git/watching/watchService.js.map +1 -1
  79. package/dist/git/watching/watchSession.d.ts.map +1 -1
  80. package/dist/git/watching/watchSession.js.map +1 -1
  81. package/dist/git-cli/exec/exec.types.d.ts +1 -1
  82. package/dist/git-cli/exec/exec.types.d.ts.map +1 -1
  83. package/dist/git-cli/exec/git.d.ts +3 -3
  84. package/dist/git-cli/exec/git.d.ts.map +1 -1
  85. package/dist/git-cli/exec/git.js.map +1 -1
  86. package/dist/git-cli/exec/gitQueue.d.ts +10 -2
  87. package/dist/git-cli/exec/gitQueue.d.ts.map +1 -1
  88. package/dist/git-cli/exec/gitQueue.js +39 -12
  89. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  90. package/dist/git-cli/parsers/blameParser.d.ts.map +1 -1
  91. package/dist/git-cli/parsers/blameParser.js.map +1 -1
  92. package/dist/git-cli/parsers/logParser.js.map +1 -1
  93. package/dist/git-cli/parsers/refParser.d.ts +3 -30
  94. package/dist/git-cli/parsers/refParser.d.ts.map +1 -1
  95. package/dist/git-cli/parsers/refParser.js +30 -30
  96. package/dist/git-cli/parsers/refParser.js.map +1 -1
  97. package/dist/git-cli/providers/blame.d.ts.map +1 -1
  98. package/dist/git-cli/providers/blame.js.map +1 -1
  99. package/dist/git-cli/providers/branches.d.ts +15 -5
  100. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  101. package/dist/git-cli/providers/branches.js +98 -68
  102. package/dist/git-cli/providers/branches.js.map +1 -1
  103. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  104. package/dist/git-cli/providers/commits.js +74 -30
  105. package/dist/git-cli/providers/commits.js.map +1 -1
  106. package/dist/git-cli/providers/config.d.ts +11 -2
  107. package/dist/git-cli/providers/config.d.ts.map +1 -1
  108. package/dist/git-cli/providers/config.js +27 -2
  109. package/dist/git-cli/providers/config.js.map +1 -1
  110. package/dist/git-cli/providers/diff.d.ts.map +1 -1
  111. package/dist/git-cli/providers/diff.js +4 -2
  112. package/dist/git-cli/providers/diff.js.map +1 -1
  113. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  114. package/dist/git-cli/providers/graph.js +7 -2
  115. package/dist/git-cli/providers/graph.js.map +1 -1
  116. package/dist/git-cli/providers/operations.d.ts +13 -11
  117. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  118. package/dist/git-cli/providers/operations.js +108 -38
  119. package/dist/git-cli/providers/operations.js.map +1 -1
  120. package/dist/git-cli/providers/patch.d.ts.map +1 -1
  121. package/dist/git-cli/providers/patch.js.map +1 -1
  122. package/dist/git-cli/providers/pausedOperations.d.ts +3 -1
  123. package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
  124. package/dist/git-cli/providers/pausedOperations.js +7 -1
  125. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  126. package/dist/git-cli/providers/refs.d.ts +19 -2
  127. package/dist/git-cli/providers/refs.d.ts.map +1 -1
  128. package/dist/git-cli/providers/refs.js +286 -2
  129. package/dist/git-cli/providers/refs.js.map +1 -1
  130. package/dist/git-cli/providers/revision.js.map +1 -1
  131. package/dist/git-cli/providers/staging.d.ts +6 -0
  132. package/dist/git-cli/providers/staging.d.ts.map +1 -1
  133. package/dist/git-cli/providers/staging.js +32 -0
  134. package/dist/git-cli/providers/staging.js.map +1 -1
  135. package/dist/git-cli/providers/status.d.ts +4 -1
  136. package/dist/git-cli/providers/status.d.ts.map +1 -1
  137. package/dist/git-cli/providers/status.js +4 -3
  138. package/dist/git-cli/providers/status.js.map +1 -1
  139. package/dist/git-cli/providers/tags.d.ts.map +1 -1
  140. package/dist/git-cli/providers/tags.js +10 -6
  141. package/dist/git-cli/providers/tags.js.map +1 -1
  142. package/dist/ipc/discovery.d.ts +27 -0
  143. package/dist/ipc/discovery.d.ts.map +1 -0
  144. package/dist/ipc/discovery.js +38 -0
  145. package/dist/ipc/discovery.js.map +1 -0
  146. package/dist/ipc/ipcServer.d.ts +20 -0
  147. package/dist/ipc/ipcServer.d.ts.map +1 -0
  148. package/dist/ipc/ipcServer.js +162 -0
  149. package/dist/ipc/ipcServer.js.map +1 -0
  150. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +114 -0
  151. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -0
  152. package/dist/plus/agents/providers/claudeCodeProvider.js +1480 -0
  153. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -0
  154. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +36 -0
  155. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -0
  156. package/dist/plus/agents/providers/claudeCodeTranscript.js +171 -0
  157. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -0
  158. package/dist/plus/agents/sanitizePrompt.d.ts +15 -0
  159. package/dist/plus/agents/sanitizePrompt.d.ts.map +1 -0
  160. package/dist/plus/agents/sanitizePrompt.js +103 -0
  161. package/dist/plus/agents/sanitizePrompt.js.map +1 -0
  162. package/dist/plus/agents/stateMachine.d.ts +32 -0
  163. package/dist/plus/agents/stateMachine.d.ts.map +1 -0
  164. package/dist/plus/agents/stateMachine.js +180 -0
  165. package/dist/plus/agents/stateMachine.js.map +1 -0
  166. package/dist/plus/agents/types.d.ts +203 -0
  167. package/dist/plus/agents/types.d.ts.map +1 -0
  168. package/dist/plus/agents/types.js +49 -0
  169. package/dist/plus/agents/types.js.map +1 -0
  170. package/dist/plus/ai/errors.d.ts +4 -1
  171. package/dist/plus/ai/errors.d.ts.map +1 -1
  172. package/dist/plus/ai/errors.js +38 -0
  173. package/dist/plus/ai/errors.js.map +1 -1
  174. package/dist/plus/ai/models/promptTemplates.d.ts +11 -2
  175. package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
  176. package/dist/plus/ai/prompts.d.ts +1 -0
  177. package/dist/plus/ai/prompts.d.ts.map +1 -1
  178. package/dist/plus/ai/prompts.js +48 -8
  179. package/dist/plus/ai/prompts.js.map +1 -1
  180. package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
  181. package/dist/plus/ai/utils/results.utils.js.map +1 -1
  182. package/dist/plus/git-github/api/github.d.ts +10 -1
  183. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  184. package/dist/plus/git-github/api/github.js +156 -49
  185. package/dist/plus/git-github/api/github.js.map +1 -1
  186. package/dist/plus/git-github/api/types.d.ts +8 -0
  187. package/dist/plus/git-github/api/types.d.ts.map +1 -1
  188. package/dist/plus/git-github/models.d.ts +1 -1
  189. package/dist/plus/git-github/models.d.ts.map +1 -1
  190. package/dist/plus/git-github/models.js.map +1 -1
  191. package/dist/plus/git-github/providers/github/blame.d.ts.map +1 -1
  192. package/dist/plus/git-github/providers/github/blame.js.map +1 -1
  193. package/dist/plus/git-github/providers/github/branches.d.ts +5 -1
  194. package/dist/plus/git-github/providers/github/branches.d.ts.map +1 -1
  195. package/dist/plus/git-github/providers/github/branches.js +47 -24
  196. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  197. package/dist/plus/git-github/providers/github/commits.d.ts.map +1 -1
  198. package/dist/plus/git-github/providers/github/commits.js +144 -92
  199. package/dist/plus/git-github/providers/github/commits.js.map +1 -1
  200. package/dist/plus/git-github/providers/github/diff.d.ts +1 -1
  201. package/dist/plus/git-github/providers/github/diff.d.ts.map +1 -1
  202. package/dist/plus/git-github/providers/github/diff.js +23 -9
  203. package/dist/plus/git-github/providers/github/diff.js.map +1 -1
  204. package/dist/plus/git-github/providers/github/refs.d.ts +9 -1
  205. package/dist/plus/git-github/providers/github/refs.d.ts.map +1 -1
  206. package/dist/plus/git-github/providers/github/refs.js +38 -13
  207. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  208. package/dist/plus/git-github/providers/github/revision.d.ts.map +1 -1
  209. package/dist/plus/git-github/providers/github/revision.js +1 -2
  210. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  211. package/dist/plus/git-github/providers/github/status.d.ts +4 -1
  212. package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
  213. package/dist/plus/git-github/providers/github/status.js +1 -1
  214. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  215. package/dist/plus/git-github/providers/github/tags.d.ts.map +1 -1
  216. package/dist/plus/git-github/providers/github/tags.js +35 -36
  217. package/dist/plus/git-github/providers/github/tags.js.map +1 -1
  218. package/dist/plus/git-github/providers/githubGitProvider.d.ts.map +1 -1
  219. package/dist/plus/git-github/providers/githubGitProvider.js.map +1 -1
  220. package/dist/utils/color.d.ts.map +1 -1
  221. package/dist/utils/color.js.map +1 -1
  222. package/dist/utils/decorators/serializable.d.ts.map +1 -1
  223. package/dist/utils/decorators/serializable.js.map +1 -1
  224. package/dist/utils/dedupedAsyncCache.d.ts +37 -0
  225. package/dist/utils/dedupedAsyncCache.d.ts.map +1 -0
  226. package/dist/utils/dedupedAsyncCache.js +68 -0
  227. package/dist/utils/dedupedAsyncCache.js.map +1 -0
  228. package/dist/utils/diff.d.ts +2 -0
  229. package/dist/utils/diff.d.ts.map +1 -0
  230. package/dist/utils/diff.js +53 -0
  231. package/dist/utils/diff.js.map +1 -0
  232. package/dist/utils/disposable.d.ts.map +1 -1
  233. package/dist/utils/disposable.js.map +1 -1
  234. package/dist/utils/env/node/exec.d.ts.map +1 -1
  235. package/dist/utils/env/node/exec.js.map +1 -1
  236. package/dist/utils/error.d.ts.map +1 -1
  237. package/dist/utils/error.js.map +1 -1
  238. package/dist/utils/iterable.d.ts.map +1 -1
  239. package/dist/utils/iterable.js.map +1 -1
  240. package/dist/utils/logger.d.ts.map +1 -1
  241. package/dist/utils/logger.js.map +1 -1
  242. package/dist/utils/lruMap.d.ts +9 -0
  243. package/dist/utils/lruMap.d.ts.map +1 -1
  244. package/dist/utils/lruMap.js +26 -4
  245. package/dist/utils/lruMap.js.map +1 -1
  246. package/dist/utils/markdown.d.ts.map +1 -1
  247. package/dist/utils/markdown.js.map +1 -1
  248. package/dist/utils/mru.d.ts.map +1 -1
  249. package/dist/utils/mru.js.map +1 -1
  250. package/dist/utils/path.d.ts.map +1 -1
  251. package/dist/utils/path.js.map +1 -1
  252. package/dist/utils/promise.d.ts +1 -0
  253. package/dist/utils/promise.d.ts.map +1 -1
  254. package/dist/utils/promise.js +17 -0
  255. package/dist/utils/promise.js.map +1 -1
  256. package/dist/utils/promiseCache.d.ts +10 -0
  257. package/dist/utils/promiseCache.d.ts.map +1 -1
  258. package/dist/utils/promiseCache.js +22 -0
  259. package/dist/utils/promiseCache.js.map +1 -1
  260. package/dist/utils/string.d.ts.map +1 -1
  261. package/dist/utils/string.js.map +1 -1
  262. package/dist/utils/uri.d.ts.map +1 -1
  263. package/dist/utils/uri.js.map +1 -1
  264. package/dist/utils/version.d.ts.map +1 -1
  265. package/dist/utils/version.js.map +1 -1
  266. package/package.json +13 -1
  267. package/src/git/cache.ts +142 -28
  268. package/src/git/models/commit.ts +1 -0
  269. package/src/git/models/reference.ts +33 -0
  270. package/src/git/models/remote.ts +1 -0
  271. package/src/git/models/repository.ts +21 -3
  272. package/src/git/models/search.ts +2 -2
  273. package/src/git/models/worktree.ts +10 -2
  274. package/src/git/parsers/diffParser.ts +2 -0
  275. package/src/git/providers/branches.ts +22 -4
  276. package/src/git/providers/config.ts +2 -0
  277. package/src/git/providers/operations.ts +44 -0
  278. package/src/git/providers/pausedOperations.ts +1 -0
  279. package/src/git/providers/refs.ts +32 -3
  280. package/src/git/providers/staging.ts +12 -0
  281. package/src/git/providers/status.ts +6 -1
  282. package/src/git/remotes/azure-devops.ts +2 -0
  283. package/src/git/{exec.types.ts → run.types.ts} +22 -2
  284. package/src/git/service.ts +1 -0
  285. package/src/git/utils/autolink.utils.ts +1 -0
  286. package/src/git/utils/blame.utils.ts +2 -0
  287. package/src/git/utils/conflictResolution.utils.ts +31 -0
  288. package/src/git/utils/fileStatus.utils.ts +7 -1
  289. package/src/git/utils/search.utils.ts +2 -0
  290. package/src/git/utils/sorting.ts +17 -0
  291. package/src/git/utils/status.utils.ts +1 -0
  292. package/src/git/watching/classifyChange.ts +9 -0
  293. package/src/git/watching/gitIgnoreFilter.ts +2 -2
  294. package/src/git/watching/initWatcher.ts +2 -0
  295. package/src/git/watching/watchGroup.ts +3 -0
  296. package/src/git/watching/watchService.ts +38 -5
  297. package/src/git/watching/watchSession.ts +10 -0
  298. package/src/git-cli/exec/exec.types.ts +2 -2
  299. package/src/git-cli/exec/git.ts +6 -5
  300. package/src/git-cli/exec/gitQueue.ts +41 -12
  301. package/src/git-cli/parsers/blameParser.ts +1 -0
  302. package/src/git-cli/parsers/logParser.ts +1 -0
  303. package/src/git-cli/parsers/refParser.ts +33 -34
  304. package/src/git-cli/providers/blame.ts +1 -0
  305. package/src/git-cli/providers/branches.ts +164 -93
  306. package/src/git-cli/providers/commits.ts +83 -37
  307. package/src/git-cli/providers/config.ts +41 -2
  308. package/src/git-cli/providers/diff.ts +8 -2
  309. package/src/git-cli/providers/graph.ts +11 -2
  310. package/src/git-cli/providers/operations.ts +186 -49
  311. package/src/git-cli/providers/patch.ts +1 -0
  312. package/src/git-cli/providers/pausedOperations.ts +8 -0
  313. package/src/git-cli/providers/refs.ts +247 -3
  314. package/src/git-cli/providers/revision.ts +2 -2
  315. package/src/git-cli/providers/staging.ts +33 -0
  316. package/src/git-cli/providers/status.ts +15 -4
  317. package/src/git-cli/providers/tags.ts +15 -16
  318. package/src/ipc/discovery.ts +56 -0
  319. package/src/ipc/ipcServer.ts +171 -0
  320. package/src/plus/agents/providers/claudeCodeProvider.ts +1782 -0
  321. package/src/plus/agents/providers/claudeCodeTranscript.ts +214 -0
  322. package/src/plus/agents/sanitizePrompt.ts +109 -0
  323. package/src/plus/agents/stateMachine.ts +197 -0
  324. package/src/plus/agents/types.ts +277 -0
  325. package/src/plus/ai/errors.ts +40 -0
  326. package/src/plus/ai/models/promptTemplates.ts +13 -0
  327. package/src/plus/ai/prompts.ts +49 -8
  328. package/src/plus/ai/utils/results.utils.ts +2 -0
  329. package/src/plus/git-github/api/github.ts +199 -53
  330. package/src/plus/git-github/api/types.ts +15 -0
  331. package/src/plus/git-github/models.ts +1 -1
  332. package/src/plus/git-github/providers/github/blame.ts +2 -0
  333. package/src/plus/git-github/providers/github/branches.ts +61 -31
  334. package/src/plus/git-github/providers/github/commits.ts +231 -160
  335. package/src/plus/git-github/providers/github/diff.ts +27 -19
  336. package/src/plus/git-github/providers/github/refs.ts +57 -22
  337. package/src/plus/git-github/providers/github/revision.ts +1 -2
  338. package/src/plus/git-github/providers/github/status.ts +6 -1
  339. package/src/plus/git-github/providers/github/tags.ts +61 -62
  340. package/src/plus/git-github/providers/githubGitProvider.ts +1 -0
  341. package/src/utils/color.ts +2 -0
  342. package/src/utils/decorators/serializable.ts +1 -0
  343. package/src/utils/dedupedAsyncCache.ts +74 -0
  344. package/src/utils/diff.ts +61 -0
  345. package/src/utils/disposable.ts +2 -0
  346. package/src/utils/env/node/exec.ts +2 -0
  347. package/src/utils/error.ts +1 -0
  348. package/src/utils/iterable.ts +3 -0
  349. package/src/utils/logger.ts +1 -0
  350. package/src/utils/lruMap.ts +29 -4
  351. package/src/utils/markdown.ts +1 -0
  352. package/src/utils/mru.ts +2 -0
  353. package/src/utils/path.ts +1 -0
  354. package/src/utils/promise.ts +22 -0
  355. package/src/utils/promiseCache.ts +24 -0
  356. package/src/utils/string.ts +2 -0
  357. package/src/utils/uri.ts +1 -0
  358. package/src/utils/version.ts +1 -0
  359. package/dist/git/exec.types.d.ts.map +0 -1
  360. package/dist/git/exec.types.js +0 -2
  361. package/dist/git/exec.types.js.map +0 -1
@@ -1,3 +1,7 @@
1
+ import { graphql, GraphqlResponseError } from '@octokit/graphql';
2
+ import { request } from '@octokit/request';
3
+ import { RequestError } from '@octokit/request-error';
4
+ import type { Endpoints, RequestParameters } from '@octokit/types';
1
5
  import {
2
6
  AuthenticationError,
3
7
  AuthenticationErrorReason,
@@ -37,10 +41,6 @@ import { maybeStopWatch } from '../../../utils/stopwatch.js';
37
41
  import { parseUri } from '../../../utils/uri.js';
38
42
  import type { Version } from '../../../utils/version.js';
39
43
  import { fromString, satisfies } from '../../../utils/version.js';
40
- import { graphql, GraphqlResponseError } from '@octokit/graphql';
41
- import { request } from '@octokit/request';
42
- import { RequestError } from '@octokit/request-error';
43
- import type { Endpoints, RequestParameters } from '@octokit/types';
44
44
  import type {
45
45
  GitHubBlame,
46
46
  GitHubBlameRange,
@@ -120,7 +120,7 @@ repository {
120
120
  const gqlPullRequestFragment = `
121
121
  ${gqlPullRequestLiteFragment}
122
122
  additions
123
- assignees(first: 10) {
123
+ assignees(first: 25) {
124
124
  nodes {
125
125
  login
126
126
  avatarUrl(size: $avatarSize)
@@ -134,7 +134,7 @@ mergedBy {
134
134
  login
135
135
  }
136
136
  reviewDecision
137
- latestReviews(first: 10) {
137
+ latestReviews(first: 25) {
138
138
  nodes {
139
139
  author {
140
140
  login
@@ -144,7 +144,7 @@ latestReviews(first: 10) {
144
144
  state
145
145
  }
146
146
  }
147
- reviewRequests(first: 10) {
147
+ reviewRequests(first: 25) {
148
148
  nodes {
149
149
  asCodeOwner
150
150
  id
@@ -187,7 +187,7 @@ author {
187
187
  comments {
188
188
  totalCount
189
189
  }
190
- labels(first: 20) {
190
+ labels(first: 50) {
191
191
  nodes {
192
192
  color
193
193
  name
@@ -1138,7 +1138,7 @@ export class GitHubApi {
1138
1138
  endingLine
1139
1139
  commit {
1140
1140
  oid
1141
- parents(first: 3) { nodes { oid } }
1141
+ parents(first: 8) { nodes { oid } }
1142
1142
  message
1143
1143
  additions
1144
1144
  changedFiles
@@ -1406,7 +1406,7 @@ export class GitHubApi {
1406
1406
  $until: GitTimestamp!
1407
1407
  ) {
1408
1408
  repository(owner: $owner, name: $repo) {
1409
- refs(first: 20, refPrefix: "refs/heads/") {
1409
+ refs(first: 100, refPrefix: "refs/heads/") {
1410
1410
  nodes {
1411
1411
  name
1412
1412
  target {
@@ -1691,7 +1691,7 @@ export class GitHubApi {
1691
1691
  ... on Commit {
1692
1692
  oid
1693
1693
  message
1694
- parents(first: 3) { nodes { oid } }
1694
+ parents(first: 8) { nodes { oid } }
1695
1695
  additions
1696
1696
  changedFiles
1697
1697
  deletions
@@ -1767,6 +1767,115 @@ export class GitHubApi {
1767
1767
  }
1768
1768
  }
1769
1769
 
1770
+ @trace({
1771
+ args: (token, owner, repo, ref) => ({
1772
+ token: `<token:${token.microHash}>`,
1773
+ owner: owner,
1774
+ repo: repo,
1775
+ ref: ref,
1776
+ }),
1777
+ })
1778
+ async getCommitShas(
1779
+ token: GitHubTokenInfo,
1780
+ owner: string,
1781
+ repo: string,
1782
+ ref: string,
1783
+ options?: {
1784
+ after?: string;
1785
+ before?: string;
1786
+ limit?: number;
1787
+ path?: string;
1788
+ since?: string | Date;
1789
+ until?: string | Date;
1790
+ },
1791
+ ): Promise<PagedResult<string>> {
1792
+ const scope = getScopedLogger();
1793
+
1794
+ interface QueryResult {
1795
+ repository:
1796
+ | {
1797
+ object:
1798
+ | {
1799
+ history: {
1800
+ pageInfo: GitHubPageInfo;
1801
+ nodes: { oid: string }[];
1802
+ };
1803
+ }
1804
+ | null
1805
+ | undefined;
1806
+ }
1807
+ | null
1808
+ | undefined;
1809
+ }
1810
+
1811
+ try {
1812
+ const query = `query getCommitShas(
1813
+ $owner: String!
1814
+ $repo: String!
1815
+ $ref: String!
1816
+ $path: String
1817
+ $after: String
1818
+ $before: String
1819
+ $limit: Int = 100
1820
+ $since: GitTimestamp
1821
+ $until: GitTimestamp
1822
+ ) {
1823
+ repository(name: $repo, owner: $owner) {
1824
+ object(expression: $ref) {
1825
+ ... on Commit {
1826
+ history(first: $limit, path: $path, after: $after, before: $before, since: $since, until: $until) {
1827
+ pageInfo {
1828
+ startCursor
1829
+ endCursor
1830
+ hasNextPage
1831
+ hasPreviousPage
1832
+ }
1833
+ nodes {
1834
+ ... on Commit { oid }
1835
+ }
1836
+ }
1837
+ }
1838
+ }
1839
+ }
1840
+ }`;
1841
+
1842
+ const rsp = await this.graphql<QueryResult>(
1843
+ undefined,
1844
+ token,
1845
+ query,
1846
+ {
1847
+ owner: owner,
1848
+ repo: repo,
1849
+ ref: ref,
1850
+ after: options?.after,
1851
+ before: options?.before,
1852
+ path: options?.path,
1853
+ limit: Math.min(100, options?.limit ?? 100),
1854
+ since: typeof options?.since === 'string' ? options?.since : options?.since?.toISOString(),
1855
+ until: typeof options?.until === 'string' ? options?.until : options?.until?.toISOString(),
1856
+ },
1857
+ scope,
1858
+ );
1859
+ const history = rsp?.repository?.object?.history;
1860
+ if (history == null) return emptyPagedResult;
1861
+
1862
+ return {
1863
+ paging:
1864
+ history.pageInfo.endCursor != null
1865
+ ? {
1866
+ cursor: history.pageInfo.endCursor ?? undefined,
1867
+ more: history.pageInfo.hasNextPage,
1868
+ }
1869
+ : undefined,
1870
+ values: history.nodes.map(n => n.oid),
1871
+ };
1872
+ } catch (ex) {
1873
+ if (ex instanceof RequestNotFoundError) return emptyPagedResult;
1874
+
1875
+ throw this.handleException(ex, undefined, scope);
1876
+ }
1877
+ }
1878
+
1770
1879
  private async getCommitsCoreRange(
1771
1880
  token: GitHubTokenInfo,
1772
1881
  owner: string,
@@ -1830,7 +1939,7 @@ export class GitHubApi {
1830
1939
  object(expression: $ref) {
1831
1940
  ...on Commit {
1832
1941
  oid
1833
- parents(first: 3) { nodes { oid } }
1942
+ parents(first: 8) { nodes { oid } }
1834
1943
  message
1835
1944
  additions
1836
1945
  changedFiles
@@ -2016,12 +2125,12 @@ export class GitHubApi {
2016
2125
  $until: GitTimestamp!
2017
2126
  ) {
2018
2127
  repository(owner: $owner, name: $repo) {
2019
- refs(first: 20, refPrefix: "refs/tags/") {
2128
+ refs(first: 100, refPrefix: "refs/tags/") {
2020
2129
  nodes {
2021
2130
  name
2022
2131
  target {
2023
2132
  ... on Commit {
2024
- history(first: 3, since: $since until: $until) {
2133
+ history(first: 10, since: $since until: $until) {
2025
2134
  nodes { oid }
2026
2135
  }
2027
2136
  }
@@ -2757,6 +2866,10 @@ export class GitHubApi {
2757
2866
  return version ?? undefined;
2758
2867
  }
2759
2868
 
2869
+ // Inflight dedupe: identical concurrent GraphQL requests share a single promise
2870
+ // to cut redundant traffic during graph/details enrichment bursts.
2871
+ private readonly _pendingGraphQL = new Map<string, Promise<unknown>>();
2872
+
2760
2873
  private async graphql<T>(
2761
2874
  provider: Provider | undefined,
2762
2875
  token: GitHubTokenInfo,
@@ -2766,56 +2879,89 @@ export class GitHubApi {
2766
2879
  cancellation?: CancellationToken | undefined,
2767
2880
  ): Promise<T | undefined> {
2768
2881
  const { accessToken, ...tokenInfo } = token;
2769
- try {
2770
- let aborter: AbortController | undefined;
2771
- if (cancellation != null) {
2772
- if (cancellation.isCancellationRequested) throw new CancellationError();
2773
2882
 
2774
- aborter = new AbortController();
2775
- cancellation.onCancellationRequested(() => aborter!.abort());
2776
-
2777
- variables = {
2778
- ...variables,
2779
- request: { ...variables?.request, signal: aborter.signal },
2780
- };
2883
+ // Only dedupe when no cancellation/request option is in play — sharing a promise that
2884
+ // carries one caller's AbortSignal would let one cancellation cancel for everyone.
2885
+ const dedupable = cancellation == null && variables?.request == null;
2886
+ let dedupeKey: string | undefined;
2887
+ if (dedupable) {
2888
+ try {
2889
+ dedupeKey = `${token.microHash}|${provider?.id ?? ''}|${query}|${JSON.stringify(variables ?? null)}`;
2890
+ } catch {
2891
+ // Non-serializable variable (BigInt, function, circular ref) — fall through to direct exec.
2892
+ dedupeKey = undefined;
2781
2893
  }
2894
+ if (dedupeKey != null) {
2895
+ const inflight = this._pendingGraphQL.get(dedupeKey);
2896
+ if (inflight != null) return inflight as Promise<T | undefined>;
2897
+ }
2898
+ }
2782
2899
 
2783
- return await this.config.wrapForForcedInsecureSSL(provider?.getIgnoreSSLErrors() ?? false, () =>
2784
- this.getDefaults(accessToken, graphql)(query, variables),
2785
- );
2786
- } catch (ex) {
2787
- if (ex instanceof GraphqlResponseError) {
2788
- switch (ex.errors?.[0]?.type) {
2789
- case 'NOT_FOUND':
2790
- throw new RequestNotFoundError(ex);
2791
- case 'FORBIDDEN':
2792
- throw new AuthenticationError(tokenInfo, AuthenticationErrorReason.Forbidden, ex);
2793
- case 'RATE_LIMITED': {
2794
- let resetAt: number | undefined;
2795
-
2796
- const reset = ex.headers?.['x-ratelimit-reset'];
2797
- if (reset != null) {
2798
- resetAt = parseInt(reset, 10);
2799
- if (Number.isNaN(resetAt)) {
2800
- resetAt = undefined;
2900
+ const run = async (): Promise<T | undefined> => {
2901
+ try {
2902
+ let aborter: AbortController | undefined;
2903
+ if (cancellation != null) {
2904
+ if (cancellation.isCancellationRequested) throw new CancellationError();
2905
+
2906
+ aborter = new AbortController();
2907
+ cancellation.onCancellationRequested(() => aborter!.abort());
2908
+
2909
+ variables = {
2910
+ ...variables,
2911
+ request: { ...variables?.request, signal: aborter.signal },
2912
+ };
2913
+ }
2914
+
2915
+ return await this.config.wrapForForcedInsecureSSL(provider?.getIgnoreSSLErrors() ?? false, () =>
2916
+ this.getDefaults(accessToken, graphql)(query, variables),
2917
+ );
2918
+ } catch (ex) {
2919
+ if (ex instanceof GraphqlResponseError) {
2920
+ switch (ex.errors?.[0]?.type) {
2921
+ case 'NOT_FOUND':
2922
+ throw new RequestNotFoundError(ex);
2923
+ case 'FORBIDDEN':
2924
+ throw new AuthenticationError(tokenInfo, AuthenticationErrorReason.Forbidden, ex);
2925
+ case 'RATE_LIMITED': {
2926
+ let resetAt: number | undefined;
2927
+
2928
+ const reset = ex.headers?.['x-ratelimit-reset'];
2929
+ if (reset != null) {
2930
+ resetAt = parseInt(reset, 10);
2931
+ if (Number.isNaN(resetAt)) {
2932
+ resetAt = undefined;
2933
+ }
2801
2934
  }
2935
+
2936
+ throw new RequestRateLimitError(ex, accessToken, resetAt);
2802
2937
  }
2938
+ }
2803
2939
 
2804
- throw new RequestRateLimitError(ex, accessToken, resetAt);
2940
+ if (Logger.isDebugging) {
2941
+ this.config.onDebugError?.(`GitHub request failed: ${ex.errors?.[0]?.message ?? ex.message}`);
2805
2942
  }
2943
+ } else if (ex instanceof RequestError || ex.name === 'AbortError') {
2944
+ this.handleRequestError(provider, token, ex, scope);
2945
+ } else if (Logger.isDebugging) {
2946
+ this.config.onDebugError?.(`GitHub request failed: ${ex.message}`);
2806
2947
  }
2807
2948
 
2808
- if (Logger.isDebugging) {
2809
- this.config.onDebugError?.(`GitHub request failed: ${ex.errors?.[0]?.message ?? ex.message}`);
2810
- }
2811
- } else if (ex instanceof RequestError || ex.name === 'AbortError') {
2812
- this.handleRequestError(provider, token, ex, scope);
2813
- } else if (Logger.isDebugging) {
2814
- this.config.onDebugError?.(`GitHub request failed: ${ex.message}`);
2949
+ throw ex;
2815
2950
  }
2951
+ };
2816
2952
 
2817
- throw ex;
2818
- }
2953
+ if (dedupeKey == null) return run();
2954
+
2955
+ const promise = run();
2956
+ this._pendingGraphQL.set(dedupeKey, promise);
2957
+ // Clear from the inflight map once the promise settles — successes and failures both
2958
+ // clear, so failed requests don't poison subsequent retries.
2959
+ void promise.finally(() => {
2960
+ if (this._pendingGraphQL.get(dedupeKey) === promise) {
2961
+ this._pendingGraphQL.delete(dedupeKey);
2962
+ }
2963
+ });
2964
+ return promise;
2819
2965
  }
2820
2966
 
2821
2967
  private async request<R extends keyof Endpoints>(
@@ -103,6 +103,21 @@ export interface GitHubApiClient {
103
103
  },
104
104
  ): Promise<PagedResult<GitHubCommit> & { viewer?: string }>;
105
105
 
106
+ getCommitShas(
107
+ token: GitHubTokenInfo,
108
+ owner: string,
109
+ repo: string,
110
+ ref: string,
111
+ options?: {
112
+ after?: string;
113
+ before?: string;
114
+ limit?: number;
115
+ path?: string;
116
+ since?: string | Date;
117
+ until?: string | Date;
118
+ },
119
+ ): Promise<PagedResult<string>>;
120
+
106
121
  getCommitRefs(
107
122
  token: GitHubTokenInfo,
108
123
  owner: string,
@@ -1,3 +1,4 @@
1
+ import type { Endpoints } from '@octokit/types';
1
2
  import { GitFileIndexStatus } from '../../git/models/fileStatus.js';
2
3
  import type { IssueLabel } from '../../git/models/issue.js';
3
4
  import { Issue, RepositoryAccessLevel } from '../../git/models/issue.js';
@@ -10,7 +11,6 @@ import {
10
11
  PullRequestStatusCheckRollupState,
11
12
  } from '../../git/models/pullRequest.js';
12
13
  import type { Provider } from '../../git/models/remoteProvider.js';
13
- import type { Endpoints } from '@octokit/types';
14
14
 
15
15
  export interface GitHubBlame {
16
16
  ranges: GitHubBlameRange[];
@@ -73,6 +73,7 @@ export class BlameGitHubSubProvider implements GitBlameSubProvider {
73
73
  let blameLine = blame.lines[editorLine];
74
74
  if (blameLine == null) {
75
75
  if (blame.lines.length !== editorLine) return undefined;
76
+
76
77
  blameLine = blame.lines[editorLine - 1];
77
78
  }
78
79
 
@@ -106,6 +107,7 @@ export class BlameGitHubSubProvider implements GitBlameSubProvider {
106
107
  try {
107
108
  const context = await this.provider.ensureRepositoryContext(repoPath);
108
109
  if (context == null) return undefined;
110
+
109
111
  const { metadata, github, session } = context;
110
112
 
111
113
  const root = this.provider.createVirtualUri(repoPath, undefined);
@@ -1,6 +1,7 @@
1
1
  import type { Cache } from '../../../../git/cache.js';
2
2
  import { GitBranch } from '../../../../git/models/branch.js';
3
3
  import type { BranchContributionsOverview, GitBranchesSubProvider } from '../../../../git/providers/branches.js';
4
+ import type { GitCommandPriority } from '../../../../git/run.types.js';
4
5
  import { createRevisionRange, stripOrigin } from '../../../../git/utils/revision.utils.js';
5
6
  import type { BranchSortOptions } from '../../../../git/utils/sorting.js';
6
7
  import { sortBranches, sortContributors } from '../../../../git/utils/sorting.js';
@@ -86,6 +87,7 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
86
87
  cancellation?: AbortSignal,
87
88
  ): Promise<PagedResult<GitBranch>> {
88
89
  if (repoPath == null) return emptyPagedResult;
90
+
89
91
  const path = repoPath;
90
92
 
91
93
  const scope = getScopedLogger();
@@ -176,12 +178,14 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
176
178
  }
177
179
  };
178
180
 
179
- // Bypass cache entirely for paged follow-ups they're driven by an opaque cursor and
180
- // don't represent "all branches".
181
- const branchesPromise =
182
- options?.paging?.cursor != null
183
- ? load()
184
- : this.cache.branches.getOrCreate(path, cacheable => load(cacheable), cancellation);
181
+ // Compose cache key with cursor so re-loads of the same page hit the cache;
182
+ // `repoPath` (no suffix) is reserved for the full "all branches" entry.
183
+ // TODO: `cache.branches` is `PromiseMap<RepoPath, ...>` keyed exactly by repoPath, so
184
+ // `clearCaches('branches')` / `unregisterRepoPath` will not invalidate composite-key entries.
185
+ // Acceptable today because branches don't change during a virtual-repo session, but the entries
186
+ // leak in memory until provider GC. Long-term: switch to RepoPromiseCacheMap or add prefix-invalidate.
187
+ const cacheKey = options?.paging?.cursor != null ? `${path}#${options.paging.cursor}` : path;
188
+ const branchesPromise = this.cache.branches.getOrCreate(cacheKey, cacheable => load(cacheable), cancellation);
185
189
 
186
190
  let result = await branchesPromise;
187
191
  if (options?.filter != null) {
@@ -202,28 +206,19 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
202
206
  async getBranchContributionsOverview(
203
207
  repoPath: string,
204
208
  ref: string,
205
- options?: { associatedPullRequest?: Promise<{ refs?: { base?: { branch: string } } } | undefined> },
209
+ // `priority` is unused the GitHub provider doesn't go through the local git command
210
+ // queue, so the priority signal has no effect here. Accepted for interface compatibility.
211
+ options?: {
212
+ associatedPullRequest?: Promise<{ refs?: { base?: { branch: string } } } | undefined>;
213
+ priority?: GitCommandPriority;
214
+ },
206
215
  _cancellation?: AbortSignal,
207
216
  ): Promise<BranchContributionsOverview | undefined> {
208
217
  const scope = getScopedLogger();
209
218
 
210
- // No outer cache here GitHub provider has no stored-target safety net (no Tier 1
211
- // equivalent), so the result is purely PR-resolution-dependent and a `ref`-keyed cache
212
- // would serve stale data when the PR is later retargeted.
213
- try {
214
- let mergeTarget: string | undefined;
215
-
216
- // PR-based lookup (GitHub provider has no stored targets or base branch detection)
217
- if (options?.associatedPullRequest != null) {
218
- const pr = await options.associatedPullRequest;
219
- if (pr?.refs?.base != null) {
220
- mergeTarget = pr.refs.base.branch;
221
- }
222
- }
223
-
224
- mergeTarget ??= await this.getDefaultBranchName(repoPath);
225
- if (mergeTarget == null) return undefined;
226
-
219
+ // Expensive body runs only on cache miss. Closes over `mergeTarget` so the cache key
220
+ // (`${ref}|${mergeTarget}`) fully captures every input that affects the result.
221
+ const fetchBody = async (mergeTarget: string): Promise<BranchContributionsOverview | undefined> => {
227
222
  const mergeBase = await this.provider.refs.getMergeBase(repoPath, ref, mergeTarget);
228
223
  if (mergeBase == null) return undefined;
229
224
 
@@ -288,6 +283,31 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
288
283
 
289
284
  contributors: result.contributors,
290
285
  };
286
+ };
287
+
288
+ try {
289
+ // Resolve `mergeTarget` (PR base or default branch). Only the expensive body below is
290
+ // cached — keyed on `${ref}|${mergeTarget}` so callers that resolve to the same target
291
+ // share the result, while differing targets get independent slots.
292
+ let mergeTarget: string | undefined;
293
+
294
+ if (options?.associatedPullRequest != null) {
295
+ const pr = await options.associatedPullRequest;
296
+ if (pr?.refs?.base != null) {
297
+ mergeTarget = pr.refs.base.branch;
298
+ }
299
+ }
300
+
301
+ mergeTarget ??= await this.getDefaultBranchName(repoPath);
302
+ if (mergeTarget == null) return undefined;
303
+
304
+ // Safe to cache despite PR retargeting: the cache key includes the resolved `mergeTarget`,
305
+ // so a retargeted PR resolves to a fresh slot and the old entry is stale-but-unused (and
306
+ // TTL-evicts). The prior "no outer cache here" rationale assumed a `ref`-only key.
307
+ const resolvedTarget = mergeTarget;
308
+ return await this.cache.getBranchOverview(repoPath, `${ref}|${resolvedTarget}`, () =>
309
+ fetchBody(resolvedTarget),
310
+ );
291
311
  } catch (ex) {
292
312
  scope?.error(ex);
293
313
  return undefined;
@@ -345,20 +365,30 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
345
365
  @debug()
346
366
  async getDefaultBranchName(
347
367
  repoPath: string | undefined,
348
- _remote?: string,
368
+ remote?: string,
369
+ // `priority` is unused — the GitHub provider doesn't go through the local git command
370
+ // queue, so the priority signal has no effect here. Accepted for interface compatibility.
371
+ _options?: { priority?: GitCommandPriority },
349
372
  _cancellation?: AbortSignal,
350
373
  ): Promise<string | undefined> {
351
374
  if (repoPath == null) return undefined;
352
375
 
376
+ remote ??= 'origin';
377
+
353
378
  const scope = getScopedLogger();
354
379
 
380
+ // Throw inside the factory so RepoPromiseCacheMap's default `expireOnError` evicts the
381
+ // entry — a transient API failure shouldn't poison the cache for the rest of the session.
382
+ // The outer try/catch preserves the existing `undefined`-on-error contract for callers.
355
383
  try {
356
- const { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);
357
- return await github.getDefaultBranchName(
358
- toTokenInfo(this.provider.authenticationProviderId, session),
359
- metadata.repo.owner,
360
- metadata.repo.name,
361
- );
384
+ return await this.cache.getDefaultBranchName(repoPath, remote, async () => {
385
+ const { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);
386
+ return github.getDefaultBranchName(
387
+ toTokenInfo(this.provider.authenticationProviderId, session),
388
+ metadata.repo.owner,
389
+ metadata.repo.name,
390
+ );
391
+ });
362
392
  } catch (ex) {
363
393
  scope?.error(ex);
364
394
  debugger;