@gitkraken/core-gitlens 0.2.0 → 0.3.1

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 (448) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/git/cache.d.ts +38 -8
  3. package/dist/git/cache.d.ts.map +1 -1
  4. package/dist/git/cache.js +120 -55
  5. package/dist/git/cache.js.map +1 -1
  6. package/dist/git/context.d.ts +19 -0
  7. package/dist/git/context.d.ts.map +1 -1
  8. package/dist/git/context.js.map +1 -1
  9. package/dist/git/features.d.ts +1 -1
  10. package/dist/git/features.d.ts.map +1 -1
  11. package/dist/git/features.js +1 -0
  12. package/dist/git/features.js.map +1 -1
  13. package/dist/git/models/commit.d.ts.map +1 -1
  14. package/dist/git/models/commit.js.map +1 -1
  15. package/dist/git/models/graph.d.ts +96 -0
  16. package/dist/git/models/graph.d.ts.map +1 -1
  17. package/dist/git/models/graph.js +24 -1
  18. package/dist/git/models/graph.js.map +1 -1
  19. package/dist/git/models/reference.d.ts +31 -0
  20. package/dist/git/models/reference.d.ts.map +1 -1
  21. package/dist/git/models/remote.d.ts.map +1 -1
  22. package/dist/git/models/remote.js.map +1 -1
  23. package/dist/git/models/remoteProvider.d.ts +1 -0
  24. package/dist/git/models/remoteProvider.d.ts.map +1 -1
  25. package/dist/git/models/remoteProvider.js.map +1 -1
  26. package/dist/git/models/repository.d.ts +30 -13
  27. package/dist/git/models/repository.d.ts.map +1 -1
  28. package/dist/git/models/repository.js +89 -87
  29. package/dist/git/models/repository.js.map +1 -1
  30. package/dist/git/models/search.d.ts +2 -2
  31. package/dist/git/models/search.d.ts.map +1 -1
  32. package/dist/git/models/statusFile.d.ts +9 -0
  33. package/dist/git/models/statusFile.d.ts.map +1 -1
  34. package/dist/git/models/statusFile.js +11 -0
  35. package/dist/git/models/statusFile.js.map +1 -1
  36. package/dist/git/models/worktree.d.ts +4 -1
  37. package/dist/git/models/worktree.d.ts.map +1 -1
  38. package/dist/git/models/worktree.js +2 -2
  39. package/dist/git/models/worktree.js.map +1 -1
  40. package/dist/git/parsers/diffParser.d.ts.map +1 -1
  41. package/dist/git/parsers/diffParser.js.map +1 -1
  42. package/dist/git/providers/branches.d.ts +15 -4
  43. package/dist/git/providers/branches.d.ts.map +1 -1
  44. package/dist/git/providers/commits.d.ts +4 -0
  45. package/dist/git/providers/commits.d.ts.map +1 -1
  46. package/dist/git/providers/config.d.ts +5 -4
  47. package/dist/git/providers/config.d.ts.map +1 -1
  48. package/dist/git/providers/operations.d.ts +61 -12
  49. package/dist/git/providers/operations.d.ts.map +1 -1
  50. package/dist/git/providers/pausedOperations.d.ts +3 -1
  51. package/dist/git/providers/pausedOperations.d.ts.map +1 -1
  52. package/dist/git/providers/refs.d.ts +23 -2
  53. package/dist/git/providers/refs.d.ts.map +1 -1
  54. package/dist/git/providers/staging.d.ts +16 -0
  55. package/dist/git/providers/staging.d.ts.map +1 -1
  56. package/dist/git/providers/status.d.ts +4 -1
  57. package/dist/git/providers/status.d.ts.map +1 -1
  58. package/dist/git/remotes/azure-devops.d.ts.map +1 -1
  59. package/dist/git/remotes/azure-devops.js.map +1 -1
  60. package/dist/git/remotes/custom.d.ts +2 -0
  61. package/dist/git/remotes/custom.d.ts.map +1 -1
  62. package/dist/git/remotes/custom.js +20 -0
  63. package/dist/git/remotes/custom.js.map +1 -1
  64. package/dist/git/{exec.types.d.ts → run.types.d.ts} +22 -3
  65. package/dist/git/run.types.d.ts.map +1 -0
  66. package/dist/git/run.types.js +2 -0
  67. package/dist/git/run.types.js.map +1 -0
  68. package/dist/git/service.d.ts.map +1 -1
  69. package/dist/git/service.js.map +1 -1
  70. package/dist/git/utils/autolink.utils.d.ts.map +1 -1
  71. package/dist/git/utils/autolink.utils.js.map +1 -1
  72. package/dist/git/utils/blame.utils.d.ts.map +1 -1
  73. package/dist/git/utils/blame.utils.js.map +1 -1
  74. package/dist/git/utils/conflictResolution.utils.d.ts +6 -0
  75. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -0
  76. package/dist/git/utils/conflictResolution.utils.js +25 -0
  77. package/dist/git/utils/conflictResolution.utils.js.map +1 -0
  78. package/dist/git/utils/contributor.utils.d.ts +3 -0
  79. package/dist/git/utils/contributor.utils.d.ts.map +1 -1
  80. package/dist/git/utils/contributor.utils.js +22 -0
  81. package/dist/git/utils/contributor.utils.js.map +1 -1
  82. package/dist/git/utils/fileStatus.utils.d.ts +2 -1
  83. package/dist/git/utils/fileStatus.utils.d.ts.map +1 -1
  84. package/dist/git/utils/fileStatus.utils.js +4 -0
  85. package/dist/git/utils/fileStatus.utils.js.map +1 -1
  86. package/dist/git/utils/reachability.utils.d.ts +37 -0
  87. package/dist/git/utils/reachability.utils.d.ts.map +1 -0
  88. package/dist/git/utils/reachability.utils.js +96 -0
  89. package/dist/git/utils/reachability.utils.js.map +1 -0
  90. package/dist/git/utils/search.utils.d.ts.map +1 -1
  91. package/dist/git/utils/search.utils.js +3 -0
  92. package/dist/git/utils/search.utils.js.map +1 -1
  93. package/dist/git/utils/sorting.d.ts +8 -0
  94. package/dist/git/utils/sorting.d.ts.map +1 -1
  95. package/dist/git/utils/sorting.js +15 -0
  96. package/dist/git/utils/sorting.js.map +1 -1
  97. package/dist/git/utils/status.utils.d.ts.map +1 -1
  98. package/dist/git/utils/status.utils.js.map +1 -1
  99. package/dist/git/watching/classifyChange.d.ts.map +1 -1
  100. package/dist/git/watching/classifyChange.js +8 -0
  101. package/dist/git/watching/classifyChange.js.map +1 -1
  102. package/dist/git/watching/gitIgnoreFilter.js +1 -1
  103. package/dist/git/watching/gitIgnoreFilter.js.map +1 -1
  104. package/dist/git/watching/initWatcher.d.ts.map +1 -1
  105. package/dist/git/watching/initWatcher.js.map +1 -1
  106. package/dist/git/watching/watchGroup.d.ts.map +1 -1
  107. package/dist/git/watching/watchGroup.js.map +1 -1
  108. package/dist/git/watching/watchService.d.ts +4 -2
  109. package/dist/git/watching/watchService.d.ts.map +1 -1
  110. package/dist/git/watching/watchService.js +31 -6
  111. package/dist/git/watching/watchService.js.map +1 -1
  112. package/dist/git/watching/watchSession.d.ts +14 -12
  113. package/dist/git/watching/watchSession.d.ts.map +1 -1
  114. package/dist/git/watching/watchSession.js +56 -55
  115. package/dist/git/watching/watchSession.js.map +1 -1
  116. package/dist/git-cli/exec/exec.types.d.ts +1 -1
  117. package/dist/git-cli/exec/exec.types.d.ts.map +1 -1
  118. package/dist/git-cli/exec/git.d.ts +3 -3
  119. package/dist/git-cli/exec/git.d.ts.map +1 -1
  120. package/dist/git-cli/exec/git.js.map +1 -1
  121. package/dist/git-cli/exec/gitQueue.d.ts +10 -2
  122. package/dist/git-cli/exec/gitQueue.d.ts.map +1 -1
  123. package/dist/git-cli/exec/gitQueue.js +39 -12
  124. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  125. package/dist/git-cli/parsers/blameParser.d.ts.map +1 -1
  126. package/dist/git-cli/parsers/blameParser.js.map +1 -1
  127. package/dist/git-cli/parsers/logParser.js.map +1 -1
  128. package/dist/git-cli/parsers/refParser.d.ts +3 -30
  129. package/dist/git-cli/parsers/refParser.d.ts.map +1 -1
  130. package/dist/git-cli/parsers/refParser.js +30 -30
  131. package/dist/git-cli/parsers/refParser.js.map +1 -1
  132. package/dist/git-cli/providers/blame.d.ts.map +1 -1
  133. package/dist/git-cli/providers/blame.js.map +1 -1
  134. package/dist/git-cli/providers/branches.d.ts +15 -5
  135. package/dist/git-cli/providers/branches.d.ts.map +1 -1
  136. package/dist/git-cli/providers/branches.js +99 -68
  137. package/dist/git-cli/providers/branches.js.map +1 -1
  138. package/dist/git-cli/providers/commits.d.ts +1 -0
  139. package/dist/git-cli/providers/commits.d.ts.map +1 -1
  140. package/dist/git-cli/providers/commits.js +86 -30
  141. package/dist/git-cli/providers/commits.js.map +1 -1
  142. package/dist/git-cli/providers/config.d.ts +19 -6
  143. package/dist/git-cli/providers/config.d.ts.map +1 -1
  144. package/dist/git-cli/providers/config.js +86 -38
  145. package/dist/git-cli/providers/config.js.map +1 -1
  146. package/dist/git-cli/providers/diff.d.ts.map +1 -1
  147. package/dist/git-cli/providers/diff.js +5 -3
  148. package/dist/git-cli/providers/diff.js.map +1 -1
  149. package/dist/git-cli/providers/graph.d.ts.map +1 -1
  150. package/dist/git-cli/providers/graph.js +139 -16
  151. package/dist/git-cli/providers/graph.js.map +1 -1
  152. package/dist/git-cli/providers/operations.d.ts +17 -14
  153. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  154. package/dist/git-cli/providers/operations.js +135 -63
  155. package/dist/git-cli/providers/operations.js.map +1 -1
  156. package/dist/git-cli/providers/patch.d.ts.map +1 -1
  157. package/dist/git-cli/providers/patch.js.map +1 -1
  158. package/dist/git-cli/providers/pausedOperations.d.ts +3 -1
  159. package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
  160. package/dist/git-cli/providers/pausedOperations.js +7 -1
  161. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  162. package/dist/git-cli/providers/refs.d.ts +19 -2
  163. package/dist/git-cli/providers/refs.d.ts.map +1 -1
  164. package/dist/git-cli/providers/refs.js +286 -2
  165. package/dist/git-cli/providers/refs.js.map +1 -1
  166. package/dist/git-cli/providers/revision.js.map +1 -1
  167. package/dist/git-cli/providers/staging.d.ts +6 -0
  168. package/dist/git-cli/providers/staging.d.ts.map +1 -1
  169. package/dist/git-cli/providers/staging.js +32 -0
  170. package/dist/git-cli/providers/staging.js.map +1 -1
  171. package/dist/git-cli/providers/stash.d.ts.map +1 -1
  172. package/dist/git-cli/providers/stash.js +20 -2
  173. package/dist/git-cli/providers/stash.js.map +1 -1
  174. package/dist/git-cli/providers/status.d.ts +4 -1
  175. package/dist/git-cli/providers/status.d.ts.map +1 -1
  176. package/dist/git-cli/providers/status.js +8 -4
  177. package/dist/git-cli/providers/status.js.map +1 -1
  178. package/dist/git-cli/providers/tags.d.ts.map +1 -1
  179. package/dist/git-cli/providers/tags.js +10 -6
  180. package/dist/git-cli/providers/tags.js.map +1 -1
  181. package/dist/ipc/discovery.d.ts +49 -0
  182. package/dist/ipc/discovery.d.ts.map +1 -0
  183. package/dist/ipc/discovery.js +147 -0
  184. package/dist/ipc/discovery.js.map +1 -0
  185. package/dist/ipc/ipcServer.d.ts +20 -0
  186. package/dist/ipc/ipcServer.d.ts.map +1 -0
  187. package/dist/ipc/ipcServer.js +162 -0
  188. package/dist/ipc/ipcServer.js.map +1 -0
  189. package/dist/plus/agents/providers/claudeCodeProvider.d.ts +167 -0
  190. package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -0
  191. package/dist/plus/agents/providers/claudeCodeProvider.js +1786 -0
  192. package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -0
  193. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +36 -0
  194. package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -0
  195. package/dist/plus/agents/providers/claudeCodeTranscript.js +171 -0
  196. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -0
  197. package/dist/plus/agents/sanitizePrompt.d.ts +15 -0
  198. package/dist/plus/agents/sanitizePrompt.d.ts.map +1 -0
  199. package/dist/plus/agents/sanitizePrompt.js +103 -0
  200. package/dist/plus/agents/sanitizePrompt.js.map +1 -0
  201. package/dist/plus/agents/stateMachine.d.ts +32 -0
  202. package/dist/plus/agents/stateMachine.d.ts.map +1 -0
  203. package/dist/plus/agents/stateMachine.js +180 -0
  204. package/dist/plus/agents/stateMachine.js.map +1 -0
  205. package/dist/plus/agents/types.d.ts +254 -0
  206. package/dist/plus/agents/types.d.ts.map +1 -0
  207. package/dist/plus/agents/types.js +49 -0
  208. package/dist/plus/agents/types.js.map +1 -0
  209. package/dist/plus/ai/errors.d.ts +4 -1
  210. package/dist/plus/ai/errors.d.ts.map +1 -1
  211. package/dist/plus/ai/errors.js +38 -0
  212. package/dist/plus/ai/errors.js.map +1 -1
  213. package/dist/plus/ai/models/model.d.ts +1 -1
  214. package/dist/plus/ai/models/model.d.ts.map +1 -1
  215. package/dist/plus/ai/models/model.js.map +1 -1
  216. package/dist/plus/ai/models/promptTemplates.d.ts +11 -2
  217. package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
  218. package/dist/plus/ai/models/provider.d.ts +3 -0
  219. package/dist/plus/ai/models/provider.d.ts.map +1 -1
  220. package/dist/plus/ai/prompts.d.ts +1 -0
  221. package/dist/plus/ai/prompts.d.ts.map +1 -1
  222. package/dist/plus/ai/prompts.js +48 -8
  223. package/dist/plus/ai/prompts.js.map +1 -1
  224. package/dist/plus/ai/providers/gitkrakenProvider.d.ts +1 -1
  225. package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
  226. package/dist/plus/ai/providers/gitkrakenProvider.js +4 -1
  227. package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
  228. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +4 -3
  229. package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
  230. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +9 -6
  231. package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
  232. package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
  233. package/dist/plus/ai/utils/ai.utils.js +2 -0
  234. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  235. package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
  236. package/dist/plus/ai/utils/results.utils.js.map +1 -1
  237. package/dist/plus/git-github/api/github.d.ts +12 -1
  238. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  239. package/dist/plus/git-github/api/github.js +245 -51
  240. package/dist/plus/git-github/api/github.js.map +1 -1
  241. package/dist/plus/git-github/api/types.d.ts +8 -0
  242. package/dist/plus/git-github/api/types.d.ts.map +1 -1
  243. package/dist/plus/git-github/models.d.ts +1 -1
  244. package/dist/plus/git-github/models.d.ts.map +1 -1
  245. package/dist/plus/git-github/models.js.map +1 -1
  246. package/dist/plus/git-github/providers/github/blame.d.ts.map +1 -1
  247. package/dist/plus/git-github/providers/github/blame.js.map +1 -1
  248. package/dist/plus/git-github/providers/github/branches.d.ts +5 -1
  249. package/dist/plus/git-github/providers/github/branches.d.ts.map +1 -1
  250. package/dist/plus/git-github/providers/github/branches.js +47 -24
  251. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  252. package/dist/plus/git-github/providers/github/commits.d.ts.map +1 -1
  253. package/dist/plus/git-github/providers/github/commits.js +144 -92
  254. package/dist/plus/git-github/providers/github/commits.js.map +1 -1
  255. package/dist/plus/git-github/providers/github/diff.d.ts +1 -1
  256. package/dist/plus/git-github/providers/github/diff.d.ts.map +1 -1
  257. package/dist/plus/git-github/providers/github/diff.js +23 -9
  258. package/dist/plus/git-github/providers/github/diff.js.map +1 -1
  259. package/dist/plus/git-github/providers/github/refs.d.ts +9 -1
  260. package/dist/plus/git-github/providers/github/refs.d.ts.map +1 -1
  261. package/dist/plus/git-github/providers/github/refs.js +39 -14
  262. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  263. package/dist/plus/git-github/providers/github/revision.d.ts.map +1 -1
  264. package/dist/plus/git-github/providers/github/revision.js +1 -2
  265. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  266. package/dist/plus/git-github/providers/github/status.d.ts +4 -1
  267. package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
  268. package/dist/plus/git-github/providers/github/status.js +1 -1
  269. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  270. package/dist/plus/git-github/providers/github/tags.d.ts.map +1 -1
  271. package/dist/plus/git-github/providers/github/tags.js +35 -36
  272. package/dist/plus/git-github/providers/github/tags.js.map +1 -1
  273. package/dist/plus/git-github/providers/githubGitProvider.d.ts.map +1 -1
  274. package/dist/plus/git-github/providers/githubGitProvider.js.map +1 -1
  275. package/dist/utils/color.d.ts.map +1 -1
  276. package/dist/utils/color.js.map +1 -1
  277. package/dist/utils/date.d.ts.map +1 -1
  278. package/dist/utils/date.js +6 -0
  279. package/dist/utils/date.js.map +1 -1
  280. package/dist/utils/debounce.js +1 -1
  281. package/dist/utils/decorators/serializable.d.ts.map +1 -1
  282. package/dist/utils/decorators/serializable.js.map +1 -1
  283. package/dist/utils/dedupedAsyncCache.d.ts +37 -0
  284. package/dist/utils/dedupedAsyncCache.d.ts.map +1 -0
  285. package/dist/utils/dedupedAsyncCache.js +68 -0
  286. package/dist/utils/dedupedAsyncCache.js.map +1 -0
  287. package/dist/utils/diff.d.ts +2 -0
  288. package/dist/utils/diff.d.ts.map +1 -0
  289. package/dist/utils/diff.js +53 -0
  290. package/dist/utils/diff.js.map +1 -0
  291. package/dist/utils/disposable.d.ts.map +1 -1
  292. package/dist/utils/disposable.js.map +1 -1
  293. package/dist/utils/env/node/exec.d.ts.map +1 -1
  294. package/dist/utils/env/node/exec.js.map +1 -1
  295. package/dist/utils/error.d.ts.map +1 -1
  296. package/dist/utils/error.js.map +1 -1
  297. package/dist/utils/iterable.d.ts +7 -1
  298. package/dist/utils/iterable.d.ts.map +1 -1
  299. package/dist/utils/iterable.js +12 -4
  300. package/dist/utils/iterable.js.map +1 -1
  301. package/dist/utils/logger.d.ts.map +1 -1
  302. package/dist/utils/logger.js.map +1 -1
  303. package/dist/utils/lruMap.d.ts +9 -0
  304. package/dist/utils/lruMap.d.ts.map +1 -1
  305. package/dist/utils/lruMap.js +26 -4
  306. package/dist/utils/lruMap.js.map +1 -1
  307. package/dist/utils/markdown.d.ts.map +1 -1
  308. package/dist/utils/markdown.js.map +1 -1
  309. package/dist/utils/mru.d.ts.map +1 -1
  310. package/dist/utils/mru.js.map +1 -1
  311. package/dist/utils/object.d.ts +22 -1
  312. package/dist/utils/object.d.ts.map +1 -1
  313. package/dist/utils/object.js +56 -3
  314. package/dist/utils/object.js.map +1 -1
  315. package/dist/utils/paging.js +14 -15
  316. package/dist/utils/paging.js.map +1 -1
  317. package/dist/utils/path.d.ts.map +1 -1
  318. package/dist/utils/path.js.map +1 -1
  319. package/dist/utils/promise.d.ts +1 -0
  320. package/dist/utils/promise.d.ts.map +1 -1
  321. package/dist/utils/promise.js +17 -0
  322. package/dist/utils/promise.js.map +1 -1
  323. package/dist/utils/promiseCache.d.ts +10 -0
  324. package/dist/utils/promiseCache.d.ts.map +1 -1
  325. package/dist/utils/promiseCache.js +34 -4
  326. package/dist/utils/promiseCache.js.map +1 -1
  327. package/dist/utils/string.d.ts.map +1 -1
  328. package/dist/utils/string.js +1 -1
  329. package/dist/utils/string.js.map +1 -1
  330. package/dist/utils/uri.d.ts.map +1 -1
  331. package/dist/utils/uri.js.map +1 -1
  332. package/dist/utils/version.d.ts.map +1 -1
  333. package/dist/utils/version.js.map +1 -1
  334. package/package.json +13 -1
  335. package/src/git/cache.ts +192 -90
  336. package/src/git/context.ts +21 -0
  337. package/src/git/features.ts +2 -0
  338. package/src/git/models/commit.ts +1 -0
  339. package/src/git/models/graph.ts +97 -0
  340. package/src/git/models/reference.ts +33 -0
  341. package/src/git/models/remote.ts +1 -0
  342. package/src/git/models/remoteProvider.ts +1 -0
  343. package/src/git/models/repository.ts +105 -96
  344. package/src/git/models/search.ts +2 -2
  345. package/src/git/models/statusFile.ts +12 -0
  346. package/src/git/models/worktree.ts +10 -2
  347. package/src/git/parsers/diffParser.ts +2 -0
  348. package/src/git/providers/branches.ts +22 -4
  349. package/src/git/providers/commits.ts +4 -0
  350. package/src/git/providers/config.ts +3 -5
  351. package/src/git/providers/operations.ts +65 -1
  352. package/src/git/providers/pausedOperations.ts +1 -0
  353. package/src/git/providers/refs.ts +32 -3
  354. package/src/git/providers/staging.ts +12 -0
  355. package/src/git/providers/status.ts +6 -1
  356. package/src/git/remotes/azure-devops.ts +2 -0
  357. package/src/git/remotes/custom.ts +23 -0
  358. package/src/git/{exec.types.ts → run.types.ts} +22 -2
  359. package/src/git/service.ts +1 -0
  360. package/src/git/utils/autolink.utils.ts +1 -0
  361. package/src/git/utils/blame.utils.ts +2 -0
  362. package/src/git/utils/conflictResolution.utils.ts +31 -0
  363. package/src/git/utils/contributor.utils.ts +24 -0
  364. package/src/git/utils/fileStatus.utils.ts +7 -1
  365. package/src/git/utils/reachability.utils.ts +109 -0
  366. package/src/git/utils/search.utils.ts +2 -0
  367. package/src/git/utils/sorting.ts +17 -0
  368. package/src/git/utils/status.utils.ts +1 -0
  369. package/src/git/watching/classifyChange.ts +9 -0
  370. package/src/git/watching/gitIgnoreFilter.ts +2 -2
  371. package/src/git/watching/initWatcher.ts +2 -0
  372. package/src/git/watching/watchGroup.ts +3 -0
  373. package/src/git/watching/watchService.ts +45 -7
  374. package/src/git/watching/watchSession.ts +71 -55
  375. package/src/git-cli/exec/exec.types.ts +2 -2
  376. package/src/git-cli/exec/git.ts +6 -5
  377. package/src/git-cli/exec/gitQueue.ts +41 -12
  378. package/src/git-cli/parsers/blameParser.ts +1 -0
  379. package/src/git-cli/parsers/logParser.ts +1 -0
  380. package/src/git-cli/parsers/refParser.ts +33 -34
  381. package/src/git-cli/providers/blame.ts +1 -0
  382. package/src/git-cli/providers/branches.ts +165 -93
  383. package/src/git-cli/providers/commits.ts +107 -37
  384. package/src/git-cli/providers/config.ts +101 -48
  385. package/src/git-cli/providers/diff.ts +10 -3
  386. package/src/git-cli/providers/graph.ts +156 -16
  387. package/src/git-cli/providers/operations.ts +208 -83
  388. package/src/git-cli/providers/patch.ts +1 -0
  389. package/src/git-cli/providers/pausedOperations.ts +8 -0
  390. package/src/git-cli/providers/refs.ts +247 -3
  391. package/src/git-cli/providers/revision.ts +2 -2
  392. package/src/git-cli/providers/staging.ts +33 -0
  393. package/src/git-cli/providers/stash.ts +20 -2
  394. package/src/git-cli/providers/status.ts +24 -5
  395. package/src/git-cli/providers/tags.ts +15 -16
  396. package/src/ipc/discovery.ts +186 -0
  397. package/src/ipc/ipcServer.ts +171 -0
  398. package/src/plus/agents/providers/claudeCodeProvider.ts +2122 -0
  399. package/src/plus/agents/providers/claudeCodeTranscript.ts +214 -0
  400. package/src/plus/agents/sanitizePrompt.ts +109 -0
  401. package/src/plus/agents/stateMachine.ts +197 -0
  402. package/src/plus/agents/types.ts +325 -0
  403. package/src/plus/ai/errors.ts +40 -0
  404. package/src/plus/ai/models/model.ts +1 -0
  405. package/src/plus/ai/models/promptTemplates.ts +13 -0
  406. package/src/plus/ai/models/provider.ts +7 -1
  407. package/src/plus/ai/prompts.ts +49 -8
  408. package/src/plus/ai/providers/gitkrakenProvider.ts +4 -0
  409. package/src/plus/ai/providers/openAICompatibleProviderBase.ts +21 -4
  410. package/src/plus/ai/utils/ai.utils.ts +2 -0
  411. package/src/plus/ai/utils/results.utils.ts +2 -0
  412. package/src/plus/git-github/api/github.ts +315 -57
  413. package/src/plus/git-github/api/types.ts +15 -0
  414. package/src/plus/git-github/models.ts +1 -1
  415. package/src/plus/git-github/providers/github/blame.ts +2 -0
  416. package/src/plus/git-github/providers/github/branches.ts +61 -31
  417. package/src/plus/git-github/providers/github/commits.ts +231 -160
  418. package/src/plus/git-github/providers/github/diff.ts +27 -19
  419. package/src/plus/git-github/providers/github/refs.ts +58 -23
  420. package/src/plus/git-github/providers/github/revision.ts +1 -2
  421. package/src/plus/git-github/providers/github/status.ts +6 -1
  422. package/src/plus/git-github/providers/github/tags.ts +61 -62
  423. package/src/plus/git-github/providers/githubGitProvider.ts +1 -0
  424. package/src/utils/color.ts +2 -0
  425. package/src/utils/date.ts +5 -0
  426. package/src/utils/debounce.ts +1 -1
  427. package/src/utils/decorators/serializable.ts +1 -0
  428. package/src/utils/dedupedAsyncCache.ts +74 -0
  429. package/src/utils/diff.ts +61 -0
  430. package/src/utils/disposable.ts +2 -0
  431. package/src/utils/env/node/exec.ts +2 -0
  432. package/src/utils/error.ts +1 -0
  433. package/src/utils/iterable.ts +17 -3
  434. package/src/utils/logger.ts +1 -0
  435. package/src/utils/lruMap.ts +29 -4
  436. package/src/utils/markdown.ts +1 -0
  437. package/src/utils/mru.ts +2 -0
  438. package/src/utils/object.ts +55 -4
  439. package/src/utils/paging.ts +14 -14
  440. package/src/utils/path.ts +1 -0
  441. package/src/utils/promise.ts +22 -0
  442. package/src/utils/promiseCache.ts +48 -16
  443. package/src/utils/string.ts +3 -1
  444. package/src/utils/uri.ts +1 -0
  445. package/src/utils/version.ts +1 -0
  446. package/dist/git/exec.types.d.ts.map +0 -1
  447. package/dist/git/exec.types.js +0 -2
  448. package/dist/git/exec.types.js.map +0 -1
@@ -1,19 +1,27 @@
1
1
  import type { Cache } from '../../git/cache.js';
2
2
  import type { GitServiceContext } from '../../git/context.js';
3
3
  import type { GitBranch } from '../../git/models/branch.js';
4
- import type { GitReference } from '../../git/models/reference.js';
4
+ import type { GitReference, GitRefTip, RefRecord } from '../../git/models/reference.js';
5
5
  import { deletedOrMissing } from '../../git/models/revision.js';
6
6
  import type { GitTag } from '../../git/models/tag.js';
7
7
  import type { GitRefsSubProvider } from '../../git/providers/refs.js';
8
+ import type { GitCommandPriority } from '../../git/run.types.js';
9
+ import { isRemoteHEAD } from '../../git/utils/branch.utils.js';
8
10
  import { createReference } from '../../git/utils/reference.utils.js';
9
11
  import { isSha, isShaWithOptionalRevisionSuffix, isUncommitted } from '../../git/utils/revision.utils.js';
10
- import { isCancellationError } from '../../utils/cancellation.js';
12
+ import { compareRefTips } from '../../git/utils/sorting.js';
13
+ import { CancellationError, isCancellationError } from '../../utils/cancellation.js';
11
14
  import { debug, trace } from '../../utils/decorators/log.js';
15
+ import { createDisposable } from '../../utils/disposable.js';
12
16
  import { getScopedLogger } from '../../utils/logger.scoped.js';
17
+ import { maybeStopWatch } from '../../utils/stopwatch.js';
18
+ import { iterateAsyncByDelimiter } from '../../utils/string.js';
13
19
  import type { Uri } from '../../utils/uri.js';
14
20
  import { toFsPath } from '../../utils/uri.js';
15
21
  import type { CliGitProviderInternal } from '../cliGitProvider.js';
16
22
  import type { Git } from '../exec/git.js';
23
+ import { gitConfigsBranch } from '../exec/git.js';
24
+ import { getRefParser } from '../parsers/refParser.js';
17
25
 
18
26
  export class RefsGitSubProvider implements GitRefsSubProvider {
19
27
  constructor(
@@ -33,12 +41,245 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
33
41
  }
34
42
  }
35
43
 
44
+ /**
45
+ * Raw `git for-each-ref` records covering branches, remotes, and tags in a single pass.
46
+ * CLI-internal — siblings call via `this.provider.refs.getRefs(...)`. The `RefRecord` shape
47
+ * is `for-each-ref`-specific and intentionally absent from the public `GitRefsSubProvider`
48
+ * interface.
49
+ */
50
+ @debug()
51
+ async getRefs(repoPath: string, cancellation?: AbortSignal): Promise<RefRecord[]> {
52
+ if (!repoPath) return [];
53
+
54
+ const scope = getScopedLogger();
55
+
56
+ return this.cache.getRefs(
57
+ repoPath,
58
+ async (commonPath, cacheable, signal) => {
59
+ try {
60
+ const supported = await this.git.supported('git:for-each-ref');
61
+ const parser = getRefParser(supported);
62
+ const result = await this.git.run(
63
+ { cwd: commonPath, cancellation: signal, configs: gitConfigsBranch, errors: 'ignore' },
64
+ 'for-each-ref',
65
+ ...parser.arguments,
66
+ 'refs/heads/',
67
+ 'refs/remotes/',
68
+ 'refs/tags/',
69
+ );
70
+ if (!result?.stdout) return [];
71
+
72
+ using sw = maybeStopWatch(scope, { log: { onlyExit: true, level: 'debug' } });
73
+
74
+ const records = [...parser.parse(result.stdout)];
75
+
76
+ sw?.stop({ suffix: ` parsed ${records.length} ref records` });
77
+
78
+ return records;
79
+ } catch (ex) {
80
+ cacheable?.invalidate();
81
+ if (isCancellationError(ex)) throw ex;
82
+
83
+ scope?.error(ex);
84
+ return [];
85
+ }
86
+ },
87
+ cancellation,
88
+ );
89
+ }
90
+
91
+ @debug()
92
+ async getRefTips(
93
+ repoPath: string,
94
+ options?: { include?: ReadonlyArray<'heads' | 'remotes' | 'tags'> },
95
+ cancellation?: AbortSignal,
96
+ ): Promise<GitRefTip[]> {
97
+ if (!repoPath) return [];
98
+
99
+ const scope = getScopedLogger();
100
+
101
+ // Cache always holds the full set; subset filtering is applied on read so callers asking
102
+ // for different subsets share one cache entry.
103
+ const all = await this.cache.getRefTips(
104
+ repoPath,
105
+ async (_commonPath, _cacheable, signal) => {
106
+ const records = await this.getRefs(repoPath, signal);
107
+
108
+ using sw = maybeStopWatch(scope, { log: { onlyExit: true, level: 'debug' } });
109
+
110
+ const tips: GitRefTip[] = [];
111
+ for (const record of records) {
112
+ const fullName = record.name;
113
+ if (!fullName) continue;
114
+ // Skip refs/remotes/<remote>/HEAD — symbolic, not a real tip.
115
+ if (isRemoteHEAD(fullName)) continue;
116
+
117
+ let type: GitRefTip['type'];
118
+ let name: string;
119
+ if (fullName.startsWith('refs/heads/')) {
120
+ type = 'branch';
121
+ name = fullName.substring(11);
122
+ } else if (fullName.startsWith('refs/remotes/')) {
123
+ type = 'remote';
124
+ name = fullName.substring(13);
125
+ } else if (fullName.startsWith('refs/tags/')) {
126
+ type = 'tag';
127
+ name = fullName.substring(10);
128
+ } else {
129
+ continue;
130
+ }
131
+
132
+ // Annotated tags: peeledObjectname is the commit SHA; objectname is the tag-object SHA.
133
+ // Lightweight tags / branches: peeledObjectname is empty; objectname is already the commit SHA.
134
+ const sha = record.peeledObjectname || record.objectname;
135
+
136
+ tips.push({ type: type, name: name, fullName: fullName, sha: sha });
137
+ }
138
+
139
+ sw?.stop({ suffix: ` projected ${tips.length} ref tips` });
140
+
141
+ return tips;
142
+ },
143
+ cancellation,
144
+ );
145
+
146
+ const include = options?.include;
147
+ if (include == null || (include.includes('heads') && include.includes('remotes') && include.includes('tags'))) {
148
+ return all;
149
+ }
150
+
151
+ return all.filter(r => {
152
+ switch (r.type) {
153
+ case 'branch':
154
+ return include.includes('heads');
155
+ case 'remote':
156
+ return include.includes('remotes');
157
+ case 'tag':
158
+ return include.includes('tags');
159
+ }
160
+ });
161
+ }
162
+
163
+ @debug()
164
+ async getRefsContainingShas(
165
+ repoPath: string,
166
+ shas: ReadonlySet<string> | readonly string[],
167
+ oldestSha: string,
168
+ options?: { include?: ReadonlyArray<'heads' | 'remotes' | 'tags'> },
169
+ cancellation?: AbortSignal,
170
+ ): Promise<Map<string, GitRefTip[]>> {
171
+ const targetShas = shas instanceof Set ? shas : new Set(shas);
172
+ if (!targetShas.size || !oldestSha) return new Map();
173
+
174
+ const scope = getScopedLogger();
175
+
176
+ const tips = await this.getRefTips(repoPath, options, cancellation);
177
+ if (cancellation?.aborted) throw new CancellationError();
178
+ if (!tips.length) return new Map();
179
+
180
+ // Index tips by full ref name (for projection back to GitRefTip later) and seed the
181
+ // propagation map by tip SHA. Multiple refs sharing a tip (e.g. local + remote-tracking)
182
+ // collapse into one Set entry whose union covers all of them.
183
+ const tipsByName = new Map<string, GitRefTip>();
184
+ const propMap = new Map<string, Set<string>>();
185
+ for (const tip of tips) {
186
+ tipsByName.set(tip.fullName, tip);
187
+ let names = propMap.get(tip.sha);
188
+ if (names == null) {
189
+ names = new Set();
190
+ propMap.set(tip.sha, names);
191
+ }
192
+ names.add(tip.fullName);
193
+ }
194
+
195
+ using sw = maybeStopWatch(scope, { log: { onlyExit: true, level: 'debug' } });
196
+
197
+ // `^<oldestSha>^@` excludes the parents of <oldestSha> and everything older. When <oldestSha>
198
+ // is a root commit, `^@` resolves to nothing and the walk is naturally unbounded — git
199
+ // doesn't error in that case (no negative refs to apply).
200
+ const stream = this.git.stream(
201
+ { cwd: repoPath, cancellation: cancellation, configs: gitConfigsBranch },
202
+ 'rev-list',
203
+ '--topo-order',
204
+ '--parents',
205
+ '--all',
206
+ `^${oldestSha}^@`,
207
+ );
208
+ using _streamDisposer = createDisposable(() => void stream.return?.(undefined));
209
+
210
+ // Topological propagation: `--topo-order` emits all children of X before X's own line, so
211
+ // by the time we process "X P1 P2..." every child has already merged its set into X. We
212
+ // then forward X's accumulated set to each parent — one-pass and correct.
213
+ try {
214
+ for await (const line of iterateAsyncByDelimiter(stream, '\n')) {
215
+ if (cancellation?.aborted) throw new CancellationError();
216
+ if (!line) continue;
217
+
218
+ const firstSpace = line.indexOf(' ');
219
+ const sha = firstSpace === -1 ? line : line.substring(0, firstSpace);
220
+ if (!sha) continue;
221
+
222
+ const refs = propMap.get(sha);
223
+ if (!refs?.size) continue;
224
+
225
+ if (firstSpace === -1) continue; // No parents — nothing to propagate to
226
+
227
+ // Walk parent SHAs by index without splitting the whole line.
228
+ let start = firstSpace + 1;
229
+ while (start < line.length) {
230
+ const next = line.indexOf(' ', start);
231
+ const parentSha = next === -1 ? line.substring(start) : line.substring(start, next);
232
+ if (parentSha) {
233
+ let parentRefs = propMap.get(parentSha);
234
+ if (parentRefs == null) {
235
+ parentRefs = new Set(refs);
236
+ propMap.set(parentSha, parentRefs);
237
+ } else {
238
+ for (const name of refs) {
239
+ parentRefs.add(name);
240
+ }
241
+ }
242
+ }
243
+ if (next === -1) break;
244
+
245
+ start = next + 1;
246
+ }
247
+ }
248
+ } catch (ex) {
249
+ if (isCancellationError(ex)) throw ex;
250
+
251
+ scope?.error(ex);
252
+ return new Map();
253
+ }
254
+
255
+ // Project to targets, materialize GitRefTip[], sort.
256
+ const result = new Map<string, GitRefTip[]>();
257
+ for (const sha of targetShas) {
258
+ const names = propMap.get(sha);
259
+ if (!names?.size) continue;
260
+
261
+ const refs: GitRefTip[] = [];
262
+ for (const name of names) {
263
+ const tip = tipsByName.get(name);
264
+ if (tip != null) {
265
+ refs.push(tip);
266
+ }
267
+ }
268
+ refs.sort(compareRefTips);
269
+ result.set(sha, refs);
270
+ }
271
+
272
+ sw?.stop({ suffix: ` resolved ${result.size}/${targetShas.size} target shas` });
273
+
274
+ return result;
275
+ }
276
+
36
277
  @debug()
37
278
  async getMergeBase(
38
279
  repoPath: string,
39
280
  ref1: string,
40
281
  ref2: string,
41
- options?: { forkPoint?: boolean },
282
+ options?: { forkPoint?: boolean; priority?: GitCommandPriority },
42
283
  cancellation?: AbortSignal,
43
284
  ): Promise<string | undefined> {
44
285
  const scope = getScopedLogger();
@@ -52,6 +293,7 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
52
293
  // cleared on 'heads'/'remotes' events when refs move. Web (no fs watcher) sees up to
53
294
  // `accessTTL` of staleness — acceptable trade-off for the perf win on graph/branch reads.
54
295
  caching: { cache: this.cache.gitResults, options: { accessTTL: 5 * 60 * 1000 } },
296
+ ...(options?.priority != null ? { priority: options.priority } : undefined),
55
297
  },
56
298
  'merge-base',
57
299
  options?.forkPoint ? '--fork-point' : undefined,
@@ -104,6 +346,7 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
104
346
  async getSymbolicReferenceName(
105
347
  repoPath: string,
106
348
  ref: string,
349
+ options?: { priority?: GitCommandPriority },
107
350
  cancellation?: AbortSignal,
108
351
  ): Promise<string | undefined> {
109
352
  const supportsEndOfOptions = await this.git.supports('git:rev-parse:end-of-options');
@@ -117,6 +360,7 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
117
360
  // gitResults cache is cleared on 'head' events. 60s TTL is the failsafe for watcher
118
361
  // latency / web — matches the other "resolve symbolic state" calls in commits.ts.
119
362
  caching: { cache: this.cache.gitResults, options: { accessTTL: 60 * 1000 } },
363
+ ...(options?.priority != null ? { priority: options.priority } : undefined),
120
364
  },
121
365
  'rev-parse',
122
366
  '--verify',
@@ -19,7 +19,7 @@ import { splitPath } from '../../utils/path.js';
19
19
  import type { Uri } from '../../utils/uri.js';
20
20
  import { toFsPath } from '../../utils/uri.js';
21
21
  import type { CliGitProviderInternal } from '../cliGitProvider.js';
22
- import type { GitErrorHandling, GitExecOptions } from '../exec/exec.types.js';
22
+ import type { GitErrorHandling, GitRunOptions } from '../exec/exec.types.js';
23
23
  import type { Git } from '../exec/git.js';
24
24
  import { defaultExceptionHandler, getGitCommandError, gitConfigsLog, GitErrors } from '../exec/git.js';
25
25
  import { parseGitLsFilesStaged } from '../parsers/indexParser.js';
@@ -165,7 +165,7 @@ export class RevisionGitSubProvider implements GitRevisionSubProvider {
165
165
  }
166
166
  if (isUncommitted(rev)) throw new Error(`ref=${rev} is uncommitted`);
167
167
 
168
- const opts: GitExecOptions = {
168
+ const opts: GitRunOptions = {
169
169
  configs: gitConfigsLog,
170
170
  cwd: root,
171
171
  encoding: options?.encoding ?? 'utf8',
@@ -56,6 +56,7 @@ export class StagingGitSubProvider implements GitStagingSubProvider {
56
56
  // Copy the current index to preserve staged state
57
57
  const gitDir = await this.provider.config.getGitDir?.(repoPath);
58
58
  if (gitDir == null) throw new Error(`Unable to determine git directory for ${repoPath}`);
59
+
59
60
  const currentIndex = joinPaths(gitDir.uri.fsPath, 'index');
60
61
  await fs.copyFile(currentIndex, tempIndex);
61
62
  break;
@@ -158,6 +159,38 @@ export class StagingGitSubProvider implements GitStagingSubProvider {
158
159
  await this.git.run({ cwd: repoPath }, 'reset', '-q', '--', toFsPath(directoryOrUri));
159
160
  }
160
161
 
162
+ @debug()
163
+ async removeFile(repoPath: string, pathOrUri: string | Uri, options?: { force?: boolean }): Promise<void> {
164
+ const args = ['rm'];
165
+ if (options?.force) {
166
+ args.push('-f');
167
+ }
168
+ args.push('--', toFsPath(pathOrUri));
169
+ await this.git.run({ cwd: repoPath }, ...args);
170
+ }
171
+
172
+ @debug()
173
+ async removeFiles(repoPath: string, pathsOrUris: (string | Uri)[], options?: { force?: boolean }): Promise<void> {
174
+ const paths = pathsOrUris.map(toFsPath);
175
+ if (!paths.length) return;
176
+
177
+ const args: string[] = ['rm'];
178
+ if (options?.force) {
179
+ args.push('-f');
180
+ }
181
+ args.push('--');
182
+
183
+ // Calculate a safe batch size based on average path length
184
+ const avgPathLength = countStringLength(paths) / paths.length;
185
+ const batchSize = Math.max(1, Math.floor(maxGitCliLength / avgPathLength));
186
+
187
+ // Process files in batches (will be a single batch if under the limit)
188
+ const batches = chunk(paths, batchSize);
189
+ for (const batch of batches) {
190
+ await this.git.run({ cwd: repoPath }, ...args, ...batch);
191
+ }
192
+ }
193
+
161
194
  @debug()
162
195
  async stageAll(repoPath: string): Promise<void> {
163
196
  await this.git.run({ cwd: repoPath }, 'add', '-A');
@@ -390,7 +390,25 @@ export class StashGitSubProvider implements GitStashSubProvider {
390
390
  params.push('--include-untracked');
391
391
  }
392
392
 
393
- if (options?.keepIndex && !options?.includeUntracked) {
393
+ // `git stash push --keep-index --include-untracked -- <pathspec>` hits a bug in git when the
394
+ // pathspec names an untracked file: the restoring checkout can't match an untracked path in the
395
+ // index tree, so it fails and the staged changes are lost.
396
+ //
397
+ // $ mkdir stash-test && cd stash-test && git init
398
+ // $ echo a > a.txt
399
+ // $ git add a.txt
400
+ // $ git commit -m init
401
+ // $ echo b > b.txt
402
+ // $ git stash push --keep-index --include-untracked -- b.txt
403
+ // Saved working directory and index state WIP on main: 8a280fe init
404
+ // error: pathspec ':(prefix:0)b.txt' did not match any file(s) known to git
405
+ //
406
+ // Only suppress --keep-index for that case — when the selection actually includes untracked
407
+ // files (`includeUntracked`) AND we're stashing by pathspec. Keying off `includeUntracked` (the
408
+ // caller's intent) rather than the `--include-untracked` flag is deliberate: we add
409
+ // `--include-untracked` to every pathspec push above as a safety net, but a tracked-only
410
+ // selection can — and must — still keep the index intact.
411
+ if (options?.keepIndex && !(options?.includeUntracked && options?.pathspecs?.length)) {
394
412
  params.push('--keep-index');
395
413
  }
396
414
 
@@ -494,7 +512,7 @@ export function convertStashesToStdin(stashOrStashes: GitStash | ReadonlyMap<str
494
512
  }
495
513
 
496
514
  const stashSummaryRegex =
497
- // eslint-disable-next-line no-control-regex
515
+ // oxlint-disable-next-line no-control-regex
498
516
  /(?:(?:(?<wip>WIP) on|On) (?<onref>[^/](?!.*\/\.)(?!.*\.\.)(?!.*\/\/)(?!.*@\{)[^\x00-\x1F\x7F ~^:?*[\\]+[^./]):\s*)?(?<summary>.*)$/s;
499
517
 
500
518
  function createStash(
@@ -6,6 +6,7 @@ import type { GitConflictFile } from '../../git/models/staging.js';
6
6
  import { GitStatus } from '../../git/models/status.js';
7
7
  import type { GitStatusFile } from '../../git/models/statusFile.js';
8
8
  import type { GitStatusSubProvider, GitWorkingChangesState } from '../../git/providers/status.js';
9
+ import type { GitCommandPriority } from '../../git/run.types.js';
9
10
  import { isCancellationError } from '../../utils/cancellation.js';
10
11
  import { gate } from '../../utils/decorators/gate.js';
11
12
  import { debug } from '../../utils/decorators/log.js';
@@ -33,19 +34,35 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
33
34
 
34
35
  @gate(rp => rp ?? '')
35
36
  @debug()
36
- async getStatus(repoPath: string | undefined, cancellation?: AbortSignal): Promise<GitStatus | undefined> {
37
+ async getStatus(
38
+ repoPath: string | undefined,
39
+ options?: { priority?: GitCommandPriority },
40
+ cancellation?: AbortSignal,
41
+ ): Promise<GitStatus | undefined> {
37
42
  if (repoPath == null) return undefined;
38
43
 
39
44
  const porcelainVersion = (await this.git.supports('git:status:porcelain-v2')) ? 2 : 1;
40
45
 
41
- const result = await this.statusCore(repoPath, porcelainVersion, {}, cancellation);
46
+ const result = await this.statusCore(
47
+ repoPath,
48
+ porcelainVersion,
49
+ {
50
+ similarityThreshold: this.context.config?.commits.similarityThreshold,
51
+ priority: options?.priority,
52
+ },
53
+ cancellation,
54
+ );
42
55
  const repoUri = fileUri(normalizePath(repoPath));
43
56
  const status = parseGitStatus(result.stdout, repoPath, porcelainVersion, p =>
44
57
  joinUriPath(repoUri, normalizePath(p)),
45
58
  );
46
59
 
47
60
  if (status?.detached) {
48
- const pausedOpStatus = await this.provider.pausedOps?.getPausedOperationStatus?.(repoPath, cancellation);
61
+ const pausedOpStatus = await this.provider.pausedOps?.getPausedOperationStatus?.(
62
+ repoPath,
63
+ undefined,
64
+ cancellation,
65
+ );
49
66
  if (pausedOpStatus?.type === 'rebase') {
50
67
  return new GitStatus(
51
68
  repoPath,
@@ -102,7 +119,7 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
102
119
  const result = await this.statusCore(
103
120
  repoPath,
104
121
  porcelainVersion,
105
- {},
122
+ { similarityThreshold: this.context.config?.commits.similarityThreshold },
106
123
  cancellation,
107
124
  // If we want renames, don't include the path as Git won't do rename detection
108
125
  ...(renames ? [] : [relativePath]),
@@ -126,7 +143,7 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
126
143
  private async statusCore(
127
144
  repoPath: string,
128
145
  porcelainVersion: number = 1,
129
- options?: { similarityThreshold?: number },
146
+ options?: { similarityThreshold?: number | null; priority?: GitCommandPriority },
130
147
  cancellation?: AbortSignal,
131
148
  ...pathspecs: string[]
132
149
  ): Promise<GitResult> {
@@ -148,6 +165,7 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
148
165
  cancellation: cancellation,
149
166
  configs: gitConfigsStatus,
150
167
  env: { GIT_OPTIONAL_LOCKS: '0' },
168
+ ...(options?.priority != null ? { priority: options.priority } : undefined),
151
169
  },
152
170
  ...params,
153
171
  '--',
@@ -247,6 +265,7 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
247
265
  return result;
248
266
  } catch (ex) {
249
267
  if (isCancellationError(ex)) throw ex;
268
+
250
269
  scope?.error(ex);
251
270
  scope?.addExitInfo('error checking for changes');
252
271
  // Return all false on error for graceful degradation
@@ -16,7 +16,6 @@ import type { CliGitProviderInternal } from '../cliGitProvider.js';
16
16
  import type { GitResult } from '../exec/exec.types.js';
17
17
  import type { Git, GitError } from '../exec/git.js';
18
18
  import { getGitCommandError, gitConfigsBranch } from '../exec/git.js';
19
- import { getTagParser } from '../parsers/refParser.js';
20
19
 
21
20
  export class TagsGitSubProvider implements GitTagsSubProvider {
22
21
  constructor(
@@ -54,29 +53,29 @@ export class TagsGitSubProvider implements GitTagsSubProvider {
54
53
  // Prefer the aggregate signal from the cache; fall back to the caller's cancellation.
55
54
  signal ??= cancellation;
56
55
  try {
57
- const parser = getTagParser();
58
-
59
- const result = await this.git.run(
60
- { cwd: repoPath, cancellation: signal },
61
- 'for-each-ref',
62
- ...parser.arguments,
63
- 'refs/tags/',
64
- );
65
- if (!result.stdout) return emptyPagedResult;
56
+ const records = await this.provider.refs.getRefs(commonPath, signal);
57
+ if (!records.length) return emptyPagedResult;
66
58
 
67
59
  using sw = maybeStopWatch(scope, { log: { onlyExit: true, level: 'debug' } });
68
60
 
69
61
  const tags: GitTag[] = [];
70
62
 
71
- for (const entry of parser.parse(result.stdout)) {
63
+ for (const record of records) {
64
+ const fullName = record.name;
65
+ if (!fullName.startsWith('refs/tags/')) continue;
66
+
67
+ // Annotated tags: peeledObjectname is the commit SHA; objectname is the tag-object SHA.
68
+ // Lightweight tags: peeledObjectname is empty; objectname is already the commit SHA.
69
+ const sha = record.peeledObjectname || record.objectname;
70
+
72
71
  tags.push(
73
72
  new GitTag(
74
73
  commonPath,
75
- entry.name,
76
- entry.sha || entry.tagSha,
77
- entry.message,
78
- entry.date ? new Date(entry.date) : undefined,
79
- entry.commitDate ? new Date(entry.commitDate) : undefined,
74
+ fullName,
75
+ sha,
76
+ record.subject,
77
+ record.creatorDate ? new Date(record.creatorDate) : undefined,
78
+ record.authorDate ? new Date(record.authorDate) : undefined,
80
79
  ),
81
80
  );
82
81
  }