jj-plus 0.10.10

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 (404) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +102 -0
  3. package/assets/jj-plus-icon.png +0 -0
  4. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  5. package/dist/bin.cjs +112 -0
  6. package/dist/bin.cjs.map +1 -0
  7. package/dist/cli/options.cjs +376 -0
  8. package/dist/cli/options.cjs.map +1 -0
  9. package/dist/cli/timeline-json.cjs +29 -0
  10. package/dist/cli/timeline-json.cjs.map +1 -0
  11. package/dist/extension/blame-codelens.cjs +228 -0
  12. package/dist/extension/blame-codelens.cjs.map +1 -0
  13. package/dist/extension/command-runner.cjs +99 -0
  14. package/dist/extension/command-runner.cjs.map +1 -0
  15. package/dist/extension/constants.cjs +56 -0
  16. package/dist/extension/constants.cjs.map +1 -0
  17. package/dist/extension/editor-extra-features.cjs +464 -0
  18. package/dist/extension/editor-extra-features.cjs.map +1 -0
  19. package/dist/extension/history-adapters.cjs +702 -0
  20. package/dist/extension/history-adapters.cjs.map +1 -0
  21. package/dist/extension/index.cjs +657 -0
  22. package/dist/extension/index.cjs.map +1 -0
  23. package/dist/extension/repo-timeline-panel.cjs +402 -0
  24. package/dist/extension/repo-timeline-panel.cjs.map +1 -0
  25. package/dist/extension/resolve-file-path.cjs +16 -0
  26. package/dist/extension/resolve-file-path.cjs.map +1 -0
  27. package/dist/extension/revision-diff-nav.cjs +169 -0
  28. package/dist/extension/revision-diff-nav.cjs.map +1 -0
  29. package/dist/extension/settings.cjs +41 -0
  30. package/dist/extension/settings.cjs.map +1 -0
  31. package/dist/extension/timeline-at-line.cjs +72 -0
  32. package/dist/extension/timeline-at-line.cjs.map +1 -0
  33. package/dist/extension/timeline-panel.cjs +1113 -0
  34. package/dist/extension/timeline-panel.cjs.map +1 -0
  35. package/dist/extension/timeline-service.cjs +1154 -0
  36. package/dist/extension/timeline-service.cjs.map +1 -0
  37. package/dist/extension/uri-utils.cjs +75 -0
  38. package/dist/extension/uri-utils.cjs.map +1 -0
  39. package/dist/package.cjs +11 -0
  40. package/dist/package.cjs.map +1 -0
  41. package/dist/shared/blame.cjs +211 -0
  42. package/dist/shared/blame.cjs.map +1 -0
  43. package/dist/shared/diff-content-search.cjs +23 -0
  44. package/dist/shared/diff-content-search.cjs.map +1 -0
  45. package/dist/shared/diff-helpers.cjs +12 -0
  46. package/dist/shared/diff-helpers.cjs.map +1 -0
  47. package/dist/shared/diff-stats.cjs +129 -0
  48. package/dist/shared/diff-stats.cjs.map +1 -0
  49. package/dist/shared/file-oplog.cjs +82 -0
  50. package/dist/shared/file-oplog.cjs.map +1 -0
  51. package/dist/shared/history-helpers.cjs +257 -0
  52. package/dist/shared/history-helpers.cjs.map +1 -0
  53. package/dist/shared/history-search.cjs +85 -0
  54. package/dist/shared/history-search.cjs.map +1 -0
  55. package/dist/shared/jj-revset-suggestions.cjs +41 -0
  56. package/dist/shared/jj-revset-suggestions.cjs.map +1 -0
  57. package/dist/shared/line-history.cjs +181 -0
  58. package/dist/shared/line-history.cjs.map +1 -0
  59. package/dist/shared/list-file-revisions.cjs +36 -0
  60. package/dist/shared/list-file-revisions.cjs.map +1 -0
  61. package/dist/shared/non-textual-details.cjs +43 -0
  62. package/dist/shared/non-textual-details.cjs.map +1 -0
  63. package/dist/shared/resolve-file-path.cjs +14 -0
  64. package/dist/shared/resolve-file-path.cjs.map +1 -0
  65. package/dist/shared/revision-diff-availability.cjs +18 -0
  66. package/dist/shared/revision-diff-availability.cjs.map +1 -0
  67. package/dist/shared/revision-diff-pair.cjs +42 -0
  68. package/dist/shared/revision-diff-pair.cjs.map +1 -0
  69. package/dist/shared/revset.cjs +16 -0
  70. package/dist/shared/revset.cjs.map +1 -0
  71. package/dist/shared/timeline-model.cjs +29 -0
  72. package/dist/shared/timeline-model.cjs.map +1 -0
  73. package/dist/standalone/server.cjs +1733 -0
  74. package/dist/standalone/server.cjs.map +1 -0
  75. package/dist/webview/timeline-template.cjs +214 -0
  76. package/dist/webview/timeline-template.cjs.map +1 -0
  77. package/package.json +320 -0
  78. package/webview-dist/assets/worker-DuV13XDT.js +161 -0
  79. package/webview-dist/chunks/abap-CLvhMVsD.js +1 -0
  80. package/webview-dist/chunks/actionscript-3-Cs6JJXT5.js +1 -0
  81. package/webview-dist/chunks/ada-C5qYipkI.js +1 -0
  82. package/webview-dist/chunks/ahk-CA9gdOdF.js +1 -0
  83. package/webview-dist/chunks/ahk2-_6rzW9BS.js +1 -0
  84. package/webview-dist/chunks/andromeeda-vGVdxbeo.js +1 -0
  85. package/webview-dist/chunks/angular-html-DTpR04n4.js +1 -0
  86. package/webview-dist/chunks/angular-ts-BCtbMvbl.js +1 -0
  87. package/webview-dist/chunks/apache-U0d_L8uA.js +1 -0
  88. package/webview-dist/chunks/apex-KFGFyKwG.js +1 -0
  89. package/webview-dist/chunks/apl-BMZuN1Ql.js +1 -0
  90. package/webview-dist/chunks/applescript-CCn79oCD.js +1 -0
  91. package/webview-dist/chunks/ara-4CJ0cIlV.js +1 -0
  92. package/webview-dist/chunks/asciidoc-SCjQUq34.js +1 -0
  93. package/webview-dist/chunks/asm-Cmm7eHzH.js +1 -0
  94. package/webview-dist/chunks/astro-DrbV4Z7r.js +1 -0
  95. package/webview-dist/chunks/aurora-x-CDeNXAV0.js +1 -0
  96. package/webview-dist/chunks/awk-BWXHIvNe.js +1 -0
  97. package/webview-dist/chunks/ayu-dark-DluEY0Gj.js +1 -0
  98. package/webview-dist/chunks/ayu-light-C3h-C4tm.js +1 -0
  99. package/webview-dist/chunks/ayu-mirage-Bqwy1Gya.js +1 -0
  100. package/webview-dist/chunks/ballerina-B7ZEbQpA.js +1 -0
  101. package/webview-dist/chunks/bat-qdxAdBWQ.js +1 -0
  102. package/webview-dist/chunks/beancount-D-usSTwE.js +1 -0
  103. package/webview-dist/chunks/berry-DKpUyyne.js +1 -0
  104. package/webview-dist/chunks/bibtex-Ci_nEsc7.js +1 -0
  105. package/webview-dist/chunks/bicep-CUHmPFLl.js +1 -0
  106. package/webview-dist/chunks/bird2-CYIUgYqB.js +1 -0
  107. package/webview-dist/chunks/blade-oPV8S6rR.js +1 -0
  108. package/webview-dist/chunks/bsl-_VjlB9mv.js +1 -0
  109. package/webview-dist/chunks/c-DYf-3tob.js +1 -0
  110. package/webview-dist/chunks/c3-D0apG41V.js +1 -0
  111. package/webview-dist/chunks/cadence-CQ2zXKGN.js +1 -0
  112. package/webview-dist/chunks/cairo-DLTphjLi.js +1 -0
  113. package/webview-dist/chunks/catppuccin-frappe-C9Q5zVZY.js +1 -0
  114. package/webview-dist/chunks/catppuccin-latte-CtsyrtPq.js +1 -0
  115. package/webview-dist/chunks/catppuccin-macchiato-R8nAf1vR.js +1 -0
  116. package/webview-dist/chunks/catppuccin-mocha-DjuaAJKi.js +1 -0
  117. package/webview-dist/chunks/chapel-DY-WYB1D.js +1 -0
  118. package/webview-dist/chunks/clarity-CtfBBspg.js +1 -0
  119. package/webview-dist/chunks/clojure-DqKBuwfJ.js +1 -0
  120. package/webview-dist/chunks/cmake-Bj61d0ZC.js +1 -0
  121. package/webview-dist/chunks/cobol-DvdX_6CO.js +1 -0
  122. package/webview-dist/chunks/codeowners-C8r90Shi.js +1 -0
  123. package/webview-dist/chunks/codeql-oeQT6MSM.js +1 -0
  124. package/webview-dist/chunks/coffee-C1kO7jr_.js +1 -0
  125. package/webview-dist/chunks/common-lisp-Cv5bFMCO.js +1 -0
  126. package/webview-dist/chunks/coq-DuBRPxYg.js +1 -0
  127. package/webview-dist/chunks/cpp-CoSarUrI.js +1 -0
  128. package/webview-dist/chunks/crystal-SLJeZ5EP.js +1 -0
  129. package/webview-dist/chunks/csharp-oqKa8noW.js +1 -0
  130. package/webview-dist/chunks/css-cfScyrSP.js +1 -0
  131. package/webview-dist/chunks/csv-Dx-8-gkx.js +1 -0
  132. package/webview-dist/chunks/cue-CE9AQfxI.js +1 -0
  133. package/webview-dist/chunks/cypher-ClKdZ_lG.js +1 -0
  134. package/webview-dist/chunks/d-qD-0Kul2.js +1 -0
  135. package/webview-dist/chunks/dark-plus-Cs2F2srj.js +1 -0
  136. package/webview-dist/chunks/dart-CnvKMtbv.js +1 -0
  137. package/webview-dist/chunks/dax-BkyTk9wS.js +1 -0
  138. package/webview-dist/chunks/desktop-Dlh5hvp9.js +1 -0
  139. package/webview-dist/chunks/diff-woXpYk--.js +1 -0
  140. package/webview-dist/chunks/docker-IyjqRm3v.js +1 -0
  141. package/webview-dist/chunks/dotenv-_5a1GRtc.js +1 -0
  142. package/webview-dist/chunks/dracula-BHWKrbxM.js +1 -0
  143. package/webview-dist/chunks/dracula-soft-5eyTD99u.js +1 -0
  144. package/webview-dist/chunks/dream-maker-DW3nJb8Q.js +1 -0
  145. package/webview-dist/chunks/edge-lvBr3t3s.js +1 -0
  146. package/webview-dist/chunks/elixir-BLoPe0KG.js +1 -0
  147. package/webview-dist/chunks/elm-BveBINBn.js +1 -0
  148. package/webview-dist/chunks/emacs-lisp-c_oH4hRZ.js +1 -0
  149. package/webview-dist/chunks/erb-Bmf8z4ph.js +1 -0
  150. package/webview-dist/chunks/erlang-Cphh6RMH.js +1 -0
  151. package/webview-dist/chunks/everforest-dark-sB-x3p7T.js +1 -0
  152. package/webview-dist/chunks/everforest-light-Df2xbC6M.js +1 -0
  153. package/webview-dist/chunks/fennel-DQxkIbk2.js +1 -0
  154. package/webview-dist/chunks/fish-BJitypiv.js +1 -0
  155. package/webview-dist/chunks/fluent-C03EYrpw.js +1 -0
  156. package/webview-dist/chunks/fortran-fixed-form-DEKoE2YW.js +1 -0
  157. package/webview-dist/chunks/fortran-free-form-CYNrtFtB.js +1 -0
  158. package/webview-dist/chunks/fsharp-D13ZGOAj.js +1 -0
  159. package/webview-dist/chunks/gdresource-xMC7jr7x.js +1 -0
  160. package/webview-dist/chunks/gdscript-DYvRD3hg.js +1 -0
  161. package/webview-dist/chunks/gdshader-CBce3t8t.js +1 -0
  162. package/webview-dist/chunks/genie-CV2tkWYe.js +1 -0
  163. package/webview-dist/chunks/gherkin-DExj1W_8.js +1 -0
  164. package/webview-dist/chunks/git-commit-BSykSTBG.js +1 -0
  165. package/webview-dist/chunks/git-rebase-BBii7GBM.js +1 -0
  166. package/webview-dist/chunks/github-dark-C-LZuMrd.js +1 -0
  167. package/webview-dist/chunks/github-dark-default-DXG-b-1a.js +1 -0
  168. package/webview-dist/chunks/github-dark-dimmed-Bx1FflLF.js +1 -0
  169. package/webview-dist/chunks/github-dark-high-contrast-B_tTalzw.js +1 -0
  170. package/webview-dist/chunks/github-light-EUqPIrTm.js +1 -0
  171. package/webview-dist/chunks/github-light-default-BXViO-2h.js +1 -0
  172. package/webview-dist/chunks/github-light-high-contrast-B68TUdTA.js +1 -0
  173. package/webview-dist/chunks/gleam-CSRkHgEL.js +1 -0
  174. package/webview-dist/chunks/glimmer-js-CuCPna-X.js +1 -0
  175. package/webview-dist/chunks/glimmer-ts-DNAjZNDK.js +1 -0
  176. package/webview-dist/chunks/glsl-COQvRxdz.js +1 -0
  177. package/webview-dist/chunks/gn-ilITqXS6.js +1 -0
  178. package/webview-dist/chunks/gnuplot-7GGW24-e.js +1 -0
  179. package/webview-dist/chunks/go-rLFTqkRN.js +1 -0
  180. package/webview-dist/chunks/graphql-1cKCVreZ.js +1 -0
  181. package/webview-dist/chunks/groovy-CacY0gHj.js +1 -0
  182. package/webview-dist/chunks/gruvbox-dark-hard-C820rvS2.js +1 -0
  183. package/webview-dist/chunks/gruvbox-dark-medium-BPjhmG05.js +1 -0
  184. package/webview-dist/chunks/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  185. package/webview-dist/chunks/gruvbox-light-hard-BC_s9l72.js +1 -0
  186. package/webview-dist/chunks/gruvbox-light-medium-BAWPOn9u.js +1 -0
  187. package/webview-dist/chunks/gruvbox-light-soft-BSMLrYjP.js +1 -0
  188. package/webview-dist/chunks/hack-7CXYxWGO.js +1 -0
  189. package/webview-dist/chunks/haml-CeE16iG9.js +1 -0
  190. package/webview-dist/chunks/handlebars-CLm7Miue.js +1 -0
  191. package/webview-dist/chunks/haskell-D8IpX4py.js +1 -0
  192. package/webview-dist/chunks/haxe-C8oCnwJJ.js +1 -0
  193. package/webview-dist/chunks/hcl-Dh228itO.js +1 -0
  194. package/webview-dist/chunks/hjson-CxZEssPk.js +1 -0
  195. package/webview-dist/chunks/hlsl-Cvrh5tZx.js +1 -0
  196. package/webview-dist/chunks/horizon-CE9ld1lL.js +1 -0
  197. package/webview-dist/chunks/horizon-bright-DSNQnXHK.js +1 -0
  198. package/webview-dist/chunks/houston-CsvMBhTu.js +1 -0
  199. package/webview-dist/chunks/html-EbCri-_j.js +1 -0
  200. package/webview-dist/chunks/html-derivative-DGcE2kQi.js +1 -0
  201. package/webview-dist/chunks/http-DpnqgCg2.js +1 -0
  202. package/webview-dist/chunks/hurl-B6NGpamo.js +1 -0
  203. package/webview-dist/chunks/hxml-Dcm88srW.js +1 -0
  204. package/webview-dist/chunks/hy-CZbG8q4J.js +1 -0
  205. package/webview-dist/chunks/imba-DsUTQ-LC.js +1 -0
  206. package/webview-dist/chunks/ini-B5eOa1yu.js +1 -0
  207. package/webview-dist/chunks/java-ZkUoUSJy.js +1 -0
  208. package/webview-dist/chunks/javascript-DLd0EIw7.js +1 -0
  209. package/webview-dist/chunks/jinja-WhIqNp3q.js +1 -0
  210. package/webview-dist/chunks/jison-CIn1t7S8.js +1 -0
  211. package/webview-dist/chunks/json-AHG_JuKN.js +1 -0
  212. package/webview-dist/chunks/json5-BR5RXkoi.js +1 -0
  213. package/webview-dist/chunks/jsonc-CYpm1nAK.js +1 -0
  214. package/webview-dist/chunks/jsonl-CmCQp5Yx.js +1 -0
  215. package/webview-dist/chunks/jsonnet-CJTPZ8u_.js +1 -0
  216. package/webview-dist/chunks/jssm-DXw9l8Rf.js +1 -0
  217. package/webview-dist/chunks/jsx-BLy2KGb2.js +1 -0
  218. package/webview-dist/chunks/julia-XrhdGMY0.js +1 -0
  219. package/webview-dist/chunks/just-CiO9rOBq.js +1 -0
  220. package/webview-dist/chunks/kanagawa-dragon-Bozd7klA.js +1 -0
  221. package/webview-dist/chunks/kanagawa-lotus-BmuOG9ZW.js +1 -0
  222. package/webview-dist/chunks/kanagawa-wave-BML5mF2J.js +1 -0
  223. package/webview-dist/chunks/kdl-CsD5j6eV.js +1 -0
  224. package/webview-dist/chunks/kotlin-DhhofPvG.js +1 -0
  225. package/webview-dist/chunks/kusto-C7mF5XQf.js +1 -0
  226. package/webview-dist/chunks/laserwave-C_8bwKvT.js +1 -0
  227. package/webview-dist/chunks/latex-4tqdYtbu.js +1 -0
  228. package/webview-dist/chunks/lean-CewbzKMR.js +1 -0
  229. package/webview-dist/chunks/less-DVTAwKKz.js +1 -0
  230. package/webview-dist/chunks/light-plus-DVQuIRkW.js +1 -0
  231. package/webview-dist/chunks/liquid-BiiWRCLG.js +1 -0
  232. package/webview-dist/chunks/llvm-DqHOMS-s.js +1 -0
  233. package/webview-dist/chunks/log-BNLmms1o.js +1 -0
  234. package/webview-dist/chunks/logo-Cluzi2Zq.js +1 -0
  235. package/webview-dist/chunks/lua-BPFdS2Mc.js +1 -0
  236. package/webview-dist/chunks/luau-C2pBCSgt.js +1 -0
  237. package/webview-dist/chunks/make-Dixweg8N.js +1 -0
  238. package/webview-dist/chunks/markdown-BYOwaDjH.js +1 -0
  239. package/webview-dist/chunks/marko-BLi1Yy1V.js +1 -0
  240. package/webview-dist/chunks/material-theme-Bm3Qr25_.js +1 -0
  241. package/webview-dist/chunks/material-theme-darker-2IIEA8gg.js +1 -0
  242. package/webview-dist/chunks/material-theme-lighter-uhdI0v04.js +1 -0
  243. package/webview-dist/chunks/material-theme-ocean-CHQ94UKr.js +1 -0
  244. package/webview-dist/chunks/material-theme-palenight-B5W6OYN7.js +1 -0
  245. package/webview-dist/chunks/matlab-D7qyCx1q.js +1 -0
  246. package/webview-dist/chunks/mdc-Dx-qyM1x.js +1 -0
  247. package/webview-dist/chunks/mdx-DQZ5AkYe.js +1 -0
  248. package/webview-dist/chunks/mermaid-BxpfTIzt.js +1 -0
  249. package/webview-dist/chunks/min-dark-BSWPekZh.js +1 -0
  250. package/webview-dist/chunks/min-light-DDpmG2fV.js +1 -0
  251. package/webview-dist/chunks/mipsasm-BMqwQI7S.js +1 -0
  252. package/webview-dist/chunks/mojo-fg40_ntQ.js +1 -0
  253. package/webview-dist/chunks/monokai-B_bV9PQ9.js +1 -0
  254. package/webview-dist/chunks/moonbit-DgjMoLWr.js +1 -0
  255. package/webview-dist/chunks/move-BYnGhZoM.js +1 -0
  256. package/webview-dist/chunks/narrat-_X_XdTYD.js +1 -0
  257. package/webview-dist/chunks/nextflow-BJtWHP5T.js +1 -0
  258. package/webview-dist/chunks/nextflow-groovy-DJMQeKeT.js +1 -0
  259. package/webview-dist/chunks/nginx-rnpjAIVq.js +1 -0
  260. package/webview-dist/chunks/night-owl-DhmEMT88.js +1 -0
  261. package/webview-dist/chunks/night-owl-light-eJ-hLW7d.js +1 -0
  262. package/webview-dist/chunks/nim-kKTJ2fIs.js +1 -0
  263. package/webview-dist/chunks/nix-IvuFDN5E.js +1 -0
  264. package/webview-dist/chunks/nord-Cb4Vim4T.js +1 -0
  265. package/webview-dist/chunks/nsis-CjNLYCLg.js +1 -0
  266. package/webview-dist/chunks/nushell-DHYfO66s.js +1 -0
  267. package/webview-dist/chunks/objective-c-D1A_Heim.js +1 -0
  268. package/webview-dist/chunks/objective-cpp-BsSzOQcm.js +1 -0
  269. package/webview-dist/chunks/ocaml-O90oeIOV.js +1 -0
  270. package/webview-dist/chunks/odin-B1RWQWA5.js +1 -0
  271. package/webview-dist/chunks/one-dark-pro-CLwyXe_n.js +1 -0
  272. package/webview-dist/chunks/one-light-D7Lr4KcI.js +1 -0
  273. package/webview-dist/chunks/openscad-BUDT5pXO.js +1 -0
  274. package/webview-dist/chunks/org-BGWCjkJX.js +1 -0
  275. package/webview-dist/chunks/pascal-4ZHwLPI5.js +1 -0
  276. package/webview-dist/chunks/perl-DEimDILQ.js +1 -0
  277. package/webview-dist/chunks/php-QnaNN--1.js +1 -0
  278. package/webview-dist/chunks/pierre-dark-CpLgRqie.js +1 -0
  279. package/webview-dist/chunks/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  280. package/webview-dist/chunks/pierre-dark-soft-kZQmAZld.js +1 -0
  281. package/webview-dist/chunks/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  282. package/webview-dist/chunks/pierre-dark-vibrant-CpQYzh95.js +1 -0
  283. package/webview-dist/chunks/pierre-light-CoaEpmwp.js +1 -0
  284. package/webview-dist/chunks/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  285. package/webview-dist/chunks/pierre-light-soft-lWLdNTOI.js +1 -0
  286. package/webview-dist/chunks/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  287. package/webview-dist/chunks/pierre-light-vibrant-D80Fkn33.js +1 -0
  288. package/webview-dist/chunks/pkl-ot-7Btpt.js +1 -0
  289. package/webview-dist/chunks/plastic-DQwYfKfQ.js +1 -0
  290. package/webview-dist/chunks/plsql-DGHpHOYJ.js +1 -0
  291. package/webview-dist/chunks/po-BiJDBrnU.js +1 -0
  292. package/webview-dist/chunks/poimandres-DRFjx7u4.js +1 -0
  293. package/webview-dist/chunks/polar-C7UOKdEL.js +1 -0
  294. package/webview-dist/chunks/postcss-BXeXVLqQ.js +1 -0
  295. package/webview-dist/chunks/powerquery-DNMTfnFr.js +1 -0
  296. package/webview-dist/chunks/powershell-CCSX75yM.js +1 -0
  297. package/webview-dist/chunks/prisma-DMgNhnYS.js +1 -0
  298. package/webview-dist/chunks/prolog-iXnhIJG7.js +1 -0
  299. package/webview-dist/chunks/proto-DB4EqR-F.js +1 -0
  300. package/webview-dist/chunks/pug-D5rsKmMX.js +1 -0
  301. package/webview-dist/chunks/puppet-CDv2pdJW.js +1 -0
  302. package/webview-dist/chunks/purescript-9MfHhQsQ.js +1 -0
  303. package/webview-dist/chunks/python-gzcpVVnB.js +1 -0
  304. package/webview-dist/chunks/qml-wvbZb8UE.js +1 -0
  305. package/webview-dist/chunks/qmldir-DCQb3MpD.js +1 -0
  306. package/webview-dist/chunks/qss-Fe1Jh2GI.js +1 -0
  307. package/webview-dist/chunks/r-BNyBFaU1.js +1 -0
  308. package/webview-dist/chunks/racket-DcIDlBhZ.js +1 -0
  309. package/webview-dist/chunks/raku-B3gFvitq.js +1 -0
  310. package/webview-dist/chunks/razor-bKaHS6Kz.js +1 -0
  311. package/webview-dist/chunks/rbs-C0MpOrj4.js +1 -0
  312. package/webview-dist/chunks/red-DX1BQOs8.js +1 -0
  313. package/webview-dist/chunks/reg-CRGYupPL.js +1 -0
  314. package/webview-dist/chunks/regexp-B-mZuWUh.js +1 -0
  315. package/webview-dist/chunks/rel-BtDbiS_P.js +1 -0
  316. package/webview-dist/chunks/riscv-Ckw8ddFX.js +1 -0
  317. package/webview-dist/chunks/ron-VUp2lXgN.js +1 -0
  318. package/webview-dist/chunks/rose-pine-aMsaMD1D.js +1 -0
  319. package/webview-dist/chunks/rose-pine-dawn-8PwUyIlP.js +1 -0
  320. package/webview-dist/chunks/rose-pine-moon-DO-qXg-I.js +1 -0
  321. package/webview-dist/chunks/rosmsg-CAekHB0j.js +1 -0
  322. package/webview-dist/chunks/rst-Qq8ybXHe.js +1 -0
  323. package/webview-dist/chunks/ruby-U659LEwU.js +1 -0
  324. package/webview-dist/chunks/rust-Cfkwpbl8.js +1 -0
  325. package/webview-dist/chunks/sas-C4NtLApe.js +1 -0
  326. package/webview-dist/chunks/sass-DXrisJhu.js +1 -0
  327. package/webview-dist/chunks/scala-BiFt_7mu.js +1 -0
  328. package/webview-dist/chunks/scheme-DQCgrYNe.js +1 -0
  329. package/webview-dist/chunks/scss-KAaA4sHk.js +1 -0
  330. package/webview-dist/chunks/sdbl-bTVj8UrX.js +1 -0
  331. package/webview-dist/chunks/shaderlab-TOUzSsQk.js +1 -0
  332. package/webview-dist/chunks/shellscript-_7bOVsRC.js +1 -0
  333. package/webview-dist/chunks/shellsession-Bs_5k0qk.js +1 -0
  334. package/webview-dist/chunks/slack-dark-DnToyrRv.js +1 -0
  335. package/webview-dist/chunks/slack-ochin-B2OO5cIa.js +1 -0
  336. package/webview-dist/chunks/smalltalk-BHpQb5nM.js +1 -0
  337. package/webview-dist/chunks/smithy-Dgaz7aur.js +1 -0
  338. package/webview-dist/chunks/snazzy-light-4G7pJPwS.js +1 -0
  339. package/webview-dist/chunks/solarized-dark-UdsmMDCL.js +1 -0
  340. package/webview-dist/chunks/solarized-light-C1IUL_tW.js +1 -0
  341. package/webview-dist/chunks/solidity-Bj7E1mRn.js +1 -0
  342. package/webview-dist/chunks/soy-C5iuoFCh.js +1 -0
  343. package/webview-dist/chunks/sparql-D_iOobhT.js +1 -0
  344. package/webview-dist/chunks/splunk-BC2Px7Mm.js +1 -0
  345. package/webview-dist/chunks/sql-JX305rZh.js +1 -0
  346. package/webview-dist/chunks/ssh-config-BgfXC-Er.js +1 -0
  347. package/webview-dist/chunks/stata-2Rtik3TV.js +1 -0
  348. package/webview-dist/chunks/stylus-B6D30XZt.js +1 -0
  349. package/webview-dist/chunks/surrealql-IvpiLAIH.js +1 -0
  350. package/webview-dist/chunks/svelte-DeZcV_1u.js +1 -0
  351. package/webview-dist/chunks/swift-CyEgAFGc.js +1 -0
  352. package/webview-dist/chunks/synthwave-84-nFMaYfgc.js +1 -0
  353. package/webview-dist/chunks/system-verilog-Dh5ihWbf.js +1 -0
  354. package/webview-dist/chunks/systemd-BxMlprV5.js +1 -0
  355. package/webview-dist/chunks/talonscript-CohzipZa.js +1 -0
  356. package/webview-dist/chunks/tasl-DMoTqEGO.js +1 -0
  357. package/webview-dist/chunks/tcl-CZd0xW_V.js +1 -0
  358. package/webview-dist/chunks/templ-CcwjPXJr.js +1 -0
  359. package/webview-dist/chunks/terraform-DswuEJGm.js +1 -0
  360. package/webview-dist/chunks/tex-CZYHgHl8.js +1 -0
  361. package/webview-dist/chunks/tokyo-night-oM2G3aXe.js +1 -0
  362. package/webview-dist/chunks/toml-CcmNWLt0.js +1 -0
  363. package/webview-dist/chunks/ts-tags-DPINfEO_.js +1 -0
  364. package/webview-dist/chunks/tsv-sltzmVWM.js +1 -0
  365. package/webview-dist/chunks/tsx-Dq7pSIyE.js +1 -0
  366. package/webview-dist/chunks/turtle-ByJddavk.js +1 -0
  367. package/webview-dist/chunks/twig-DFpC8yDL.js +1 -0
  368. package/webview-dist/chunks/typescript-CN-guYmK.js +1 -0
  369. package/webview-dist/chunks/typespec-BRdr0IET.js +1 -0
  370. package/webview-dist/chunks/typst-hgW4q6mN.js +1 -0
  371. package/webview-dist/chunks/v-DBj4K9d_.js +1 -0
  372. package/webview-dist/chunks/vala-zf12oZj6.js +1 -0
  373. package/webview-dist/chunks/vb-DOwzaHZ0.js +1 -0
  374. package/webview-dist/chunks/verilog-B2gwz-sJ.js +1 -0
  375. package/webview-dist/chunks/vesper-DdrHHSXu.js +1 -0
  376. package/webview-dist/chunks/vhdl-BroJfC0k.js +1 -0
  377. package/webview-dist/chunks/viml-DvXPmvsu.js +1 -0
  378. package/webview-dist/chunks/vitesse-black-fwtXNY1n.js +1 -0
  379. package/webview-dist/chunks/vitesse-dark-BZCL-v6S.js +1 -0
  380. package/webview-dist/chunks/vitesse-light-VbXTXTou.js +1 -0
  381. package/webview-dist/chunks/vue-Dkz9ntel.js +1 -0
  382. package/webview-dist/chunks/vue-html-Dg8LQ5v3.js +1 -0
  383. package/webview-dist/chunks/vue-vine-CIEXICEN.js +1 -0
  384. package/webview-dist/chunks/vyper-CgoNMtux.js +1 -0
  385. package/webview-dist/chunks/wasm-BnjxR4X6.js +1 -0
  386. package/webview-dist/chunks/wasm-ByWQv1Qj.js +1 -0
  387. package/webview-dist/chunks/wenyan-C8pVoKbM.js +1 -0
  388. package/webview-dist/chunks/wgsl-BsKzXJz4.js +1 -0
  389. package/webview-dist/chunks/wikitext-ClFFjSW2.js +1 -0
  390. package/webview-dist/chunks/wit-DdvCle-K.js +1 -0
  391. package/webview-dist/chunks/wolfram-DLL8P-h_.js +1 -0
  392. package/webview-dist/chunks/worker-D52zl71O.js +1 -0
  393. package/webview-dist/chunks/worker-pool-lOjh8Q2A.js +1543 -0
  394. package/webview-dist/chunks/xml-X7YOen_c.js +1 -0
  395. package/webview-dist/chunks/xsl-h4d_Px-X.js +1 -0
  396. package/webview-dist/chunks/yaml-BRDpsfaj.js +1 -0
  397. package/webview-dist/chunks/zenscript-BnlCZFoB.js +1 -0
  398. package/webview-dist/chunks/zig-CMLA9XwU.js +1 -0
  399. package/webview-dist/index.html +18 -0
  400. package/webview-dist/pierre-worker-portable.js +13633 -0
  401. package/webview-dist/repo-timeline-app.js +7 -0
  402. package/webview-dist/repo-timeline.html +14 -0
  403. package/webview-dist/timeline-app.css +2 -0
  404. package/webview-dist/timeline-app.js +85 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-panel.cjs","names":["coerceFsPath","path","CLEAR_LINE_HISTORY_COMMAND","formatStatusBarLineHistoryChip","revisionMatchesBlame","TIMELINE_PRESET_DAYS","createSnapshotUri","OPEN_MULTI_DIFF_COMMAND","renderTimelineDocumentHtml","fsSync"],"sources":["../../src/extension/timeline-panel.ts"],"sourcesContent":["import fsSync from 'node:fs';\nimport path from 'node:path';\nimport * as vscode from 'vscode';\nimport { renderTimelineDocumentHtml } from '../webview/timeline-template.ts';\nimport type {\n\tComparisonSource,\n\tFileRevisionEntry,\n\tLineDiffType,\n\tThemePreference,\n\tTimelineCommand,\n\tTimelineInboundMessage,\n\tTimelinePreferences,\n} from '../shared/timeline-types.ts';\nimport { revisionMatchesBlame } from '../shared/blame.ts';\nimport { formatStatusBarLineHistoryChip } from '../shared/line-history.ts';\nimport { CLEAR_LINE_HISTORY_COMMAND, OPEN_MULTI_DIFF_COMMAND, TIMELINE_PRESET_DAYS } from './constants.ts';\nimport { coerceFsPath } from './resolve-file-path.ts';\nimport { createTimelineService } from './timeline-service.ts';\nimport { createSnapshotUri } from './uri-utils.ts';\nimport type { ExtensionTimelineSession, TimelineDebugState, TimelinePanelController } from './types.ts';\n\ntype TimelineService = ReturnType<typeof createTimelineService>;\n\nconst LARGE_MULTI_DIFF_CONFIRMATION_THRESHOLD = 200;\n\nfunction collectPendingSnapshotHydrationIndexes(session: ExtensionTimelineSession): number[] {\n\treturn session.entries.reduce<number[]>((indexes, entry, index) => {\n\t\tif (\n\t\t\tentry &&\n\t\t\t!entry.isWorkingTree &&\n\t\t\tentry.touchesFile &&\n\t\t\tentry.changeId &&\n\t\t\t!session.snapshotLoadedChangeIds.has(entry.changeId)\n\t\t) {\n\t\t\tindexes.push(index);\n\t\t}\n\t\treturn indexes;\n\t}, []);\n}\n\nfunction postTimelineMessage(request: {\n\tpanel: vscode.WebviewPanel;\n\tmessage: TimelineInboundMessage;\n}): Promise<boolean> {\n\treturn Promise.resolve(request.panel.webview.postMessage(request.message));\n}\n\nasync function buildSelectedEntryMultiDiffPlan(request: {\n\tadapter: ExtensionTimelineSession['adapter'];\n\tworkspacePath: string;\n\tsourceEntries: FileRevisionEntry[];\n\tcomparisonSource: ComparisonSource;\n\tentryIndexes: number[];\n\ttitle: string;\n\tsignal?: AbortSignal;\n}) {\n\tconst files: Array<{\n\t\trelativePath: string;\n\t\toriginalRevset: string;\n\t\tmodifiedRevset: string;\n\t\tbackend: 'git' | 'jj';\n\t}> = [];\n\n\tfor (const entryIndex of request.entryIndexes) {\n\t\tconst entry = request.sourceEntries[entryIndex];\n\t\tif (!entry) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet plan = {\n\t\t\ttitle: request.title,\n\t\t\tfiles: [] as Array<{\n\t\t\t\trelativePath: string;\n\t\t\t\toriginalRevset: string;\n\t\t\t\tmodifiedRevset: string;\n\t\t\t\tbackend: 'git' | 'jj';\n\t\t\t}>,\n\t\t};\n\t\tif (entry.isWorkingTree) {\n\t\t\tconst previousEntry = request.sourceEntries[entryIndex - 1];\n\t\t\tif (!previousEntry) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tplan = await request.adapter.buildRangeMultiDiffPlan({\n\t\t\t\tworkspacePath: request.workspacePath,\n\t\t\t\tfromEntry: previousEntry,\n\t\t\t\ttoEntry: entry,\n\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\tsourceEntries: request.sourceEntries,\n\t\t\t\tsignal: request.signal,\n\t\t\t});\n\t\t} else {\n\t\t\tplan = await request.adapter.buildRevisionMultiDiffPlan({\n\t\t\t\tworkspacePath: request.workspacePath,\n\t\t\t\tentry,\n\t\t\t\tentryIndex,\n\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\tsourceEntries: request.sourceEntries,\n\t\t\t\tsignal: request.signal,\n\t\t\t});\n\t\t}\n\n\t\tfiles.push(...plan.files);\n\t}\n\n\treturn {\n\t\ttitle: request.title,\n\t\tfiles,\n\t};\n}\n\nasync function resolveTimelineSourcePath(request: { absolutePath?: unknown }): Promise<string | undefined> {\n\tconst coerced = coerceFsPath(request.absolutePath);\n\tif (coerced) {\n\t\treturn coerced;\n\t}\n\n\tconst activeEditor = vscode.window.activeTextEditor;\n\tif (activeEditor && isWorkspaceFileUri(activeEditor.document.uri)) {\n\t\treturn activeEditor.document.uri.fsPath;\n\t}\n\n\treturn pickOpenWorkspaceEditorPath();\n}\n\nasync function pickOpenWorkspaceEditorPath(): Promise<string | undefined> {\n\tconst candidates = getOpenWorkspaceEditorCandidates();\n\tif (!candidates.length) {\n\t\treturn undefined;\n\t}\n\n\tconst selection = await vscode.window.showQuickPick(\n\t\tcandidates.map((candidate) => ({\n\t\t\tlabel: candidate.label,\n\t\t\tdescription: candidate.description,\n\t\t\tdetail: candidate.detail,\n\t\t\tpath: candidate.absolutePath,\n\t\t})),\n\t\t{\n\t\t\tplaceHolder: 'Select a workspace file to open its revision timeline',\n\t\t},\n\t);\n\n\treturn selection?.path;\n}\n\nfunction getOpenWorkspaceEditorCandidates(): Array<{\n\tlabel: string;\n\tdescription: string;\n\tdetail: string;\n\tabsolutePath: string;\n}> {\n\tconst candidates: Array<{\n\t\tlabel: string;\n\t\tdescription: string;\n\t\tdetail: string;\n\t\tabsolutePath: string;\n\t}> = [];\n\tconst seenPaths = new Set<string>();\n\n\tfor (const group of vscode.window.tabGroups?.all || []) {\n\t\tfor (const tab of group.tabs) {\n\t\t\tconst uri = getTabUri(tab);\n\t\t\tif (!uri || uri.scheme !== 'file') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst workspaceFolder = vscode.workspace.getWorkspaceFolder(uri);\n\t\t\tif (!workspaceFolder) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst absolutePath = uri.fsPath;\n\t\t\tif (seenPaths.has(absolutePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst relativePath = path.relative(workspaceFolder.uri.fsPath, absolutePath).replace(/\\\\/g, '/');\n\t\t\tif (!relativePath || relativePath.startsWith('..')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tseenPaths.add(absolutePath);\n\t\t\tcandidates.push({\n\t\t\t\tlabel: path.basename(absolutePath),\n\t\t\t\tdescription: relativePath,\n\t\t\t\tdetail: workspaceFolder.name,\n\t\t\t\tabsolutePath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction isWorkspaceFileUri(uri: vscode.Uri): boolean {\n\treturn uri.scheme === 'file' && Boolean(vscode.workspace.getWorkspaceFolder(uri));\n}\n\nfunction getTabUri(tab: vscode.Tab): vscode.Uri | undefined {\n\tconst input = tab.input as { uri?: vscode.Uri } | undefined;\n\treturn input?.uri;\n}\n\nexport function createTimelinePanelController(args: {\n\tcontext: vscode.ExtensionContext;\n\tservice: TimelineService;\n\tgetPreferences: () => TimelinePreferences;\n\tsavePreferences: (nextPreferences: TimelinePreferences) => Promise<void>;\n\tversion: string;\n}): TimelinePanelController {\n\tconst timelineSessions = new Map<vscode.WebviewPanel, ExtensionTimelineSession>();\n\tconst panelViewReady = new WeakMap<vscode.WebviewPanel, boolean>();\n\tconst panelLoadGeneration = new WeakMap<vscode.WebviewPanel, number>();\n\tlet activeTimelinePanel: vscode.WebviewPanel | undefined;\n\tlet timelineDebugState = createEmptyTimelineDebugState();\n\tlet timelinePreviewGeneration = 0;\n\tconst lineHistoryStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 90);\n\tlineHistoryStatusBar.command = CLEAR_LINE_HISTORY_COMMAND;\n\tlineHistoryStatusBar.tooltip = 'Clear line-history filter (show full file timeline)';\n\targs.context.subscriptions.push(lineHistoryStatusBar);\n\n\tfunction syncLineHistoryStatusBar(lineHistory: { startLine: number; endLine: number } | null | undefined): void {\n\t\tif (!lineHistory) {\n\t\t\tlineHistoryStatusBar.hide();\n\t\t\treturn;\n\t\t}\n\t\tlineHistoryStatusBar.text = `$(git-commit) ${formatStatusBarLineHistoryChip(lineHistory)}`;\n\t\tlineHistoryStatusBar.show();\n\t}\n\n\treturn {\n\t\tdispose() {\n\t\t\tfor (const panel of timelineSessions.keys()) {\n\t\t\t\tpanel.dispose();\n\t\t\t}\n\t\t\ttimelineSessions.clear();\n\t\t\tactiveTimelinePanel = undefined;\n\t\t\ttimelineDebugState = createEmptyTimelineDebugState();\n\t\t\tsyncLineHistoryStatusBar(null);\n\t\t},\n\t\tasync clearLineHistoryFilter() {\n\t\t\tconst panel = activeTimelinePanel;\n\t\t\tconst session = panel ? timelineSessions.get(panel) : undefined;\n\t\t\tif (!panel || !session?.lineHistory) {\n\t\t\t\tif (panel) {\n\t\t\t\t\tpanel.reveal(undefined, true);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel,\n\t\t\t\tworkspacePath: session.workspacePath,\n\t\t\t\tabsolutePath: session.absolutePath,\n\t\t\t\tcustomRevset: session.customRevset,\n\t\t\t});\n\t\t},\n\t\tgetDebugState() {\n\t\t\treturn { ...timelineDebugState };\n\t\t},\n\t\tasync getDiffLayoutMetrics() {\n\t\t\tconst panel = activeTimelinePanel;\n\t\t\tif (!panel) {\n\t\t\t\tthrow new Error('no active timeline panel');\n\t\t\t}\n\n\t\t\treturn await new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tsubscription.dispose();\n\t\t\t\t\treject(new Error('timed out waiting for webview layout metrics'));\n\t\t\t\t}, 8000);\n\n\t\t\t\tconst subscription = panel.webview.onDidReceiveMessage((message: unknown) => {\n\t\t\t\t\tif (!message || typeof message !== 'object') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (Reflect.get(message, 'command') !== 'layout-metrics') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst metrics = Reflect.get(message, 'metrics');\n\t\t\t\t\tif (!metrics || typeof metrics !== 'object') {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tsubscription.dispose();\n\t\t\t\t\tresolve(metrics as import('../shared/timeline-types.ts').DiffLayoutMetrics);\n\t\t\t\t});\n\n\t\t\t\tvoid panel.webview.postMessage({ type: 'debug-measure-layout' });\n\t\t\t});\n\t\t},\n\t\tasync selectTimelineRange(request) {\n\t\t\tconst panel = activeTimelinePanel;\n\t\t\tif (!panel) {\n\t\t\t\tthrow new Error('no active timeline panel');\n\t\t\t}\n\t\t\tconst session = timelineSessions.get(panel);\n\t\t\tif (!session) {\n\t\t\t\tthrow new Error('no active timeline session');\n\t\t\t}\n\t\t\tawait handleTimelineMessage({\n\t\t\t\tpanel,\n\t\t\t\tsession,\n\t\t\t\tmessage: {\n\t\t\t\t\tcommand: 'select-entry',\n\t\t\t\t\tfromIndex: request.fromIndex,\n\t\t\t\t\ttoIndex: request.toIndex,\n\t\t\t\t\tcomparisonSource: request.comparisonSource || 'revision',\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync setLayoutMode(layoutMode) {\n\t\t\tconst panel = activeTimelinePanel;\n\t\t\tif (!panel) {\n\t\t\t\tthrow new Error('no active timeline panel');\n\t\t\t}\n\t\t\tconst nextPreferences = {\n\t\t\t\t...args.getPreferences(),\n\t\t\t\tlayoutMode: layoutMode === 'unified' ? ('unified' as const) : ('split' as const),\n\t\t\t};\n\t\t\tawait args.savePreferences(nextPreferences);\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel,\n\t\t\t\tmessage: { type: 'debug-set-layout-mode', layoutMode: nextPreferences.layoutMode },\n\t\t\t});\n\t\t},\n\t\tasync openFileRevisionTimeline({ absolutePath, lineHistory, focusRevision }) {\n\t\t\tconst initialPath = await resolveTimelineSourcePath({ absolutePath });\n\t\t\tif (!initialPath) {\n\t\t\t\tvoid vscode.window.showErrorMessage('Open a workspace file to browse its revision timeline');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst documentUri = vscode.Uri.file(initialPath);\n\t\t\tconst workspaceFolder = vscode.workspace.getWorkspaceFolder(documentUri);\n\t\t\tif (!workspaceFolder) {\n\t\t\t\tvoid vscode.window.showErrorMessage('The active file must belong to a workspace folder');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (documentUri.scheme !== 'file') {\n\t\t\t\tvoid vscode.window.showErrorMessage('The revision timeline only supports files on disk');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst fileName = path.basename(documentUri.fsPath);\n\t\t\tconst hadExistingPanel = timelineSessions.size > 0;\n\t\t\tconst panel = createTimelinePanel({ fileName });\n\t\t\tactiveTimelinePanel = panel;\n\t\t\tpanel.webview.html = getTimelineWebviewHtml({\n\t\t\t\tcontext: args.context,\n\t\t\t\twebview: panel.webview,\n\t\t\t});\n\t\t\tpanel.title = lineHistory\n\t\t\t\t? `Revision Timeline: ${fileName} (L${lineHistory.startLine}${lineHistory.endLine === lineHistory.startLine ? '' : `–${lineHistory.endLine}`})`\n\t\t\t\t: `Revision Timeline: ${fileName}`;\n\t\t\ttimelineDebugState = {\n\t\t\t\t...createEmptyTimelineDebugState(),\n\t\t\t\tpanelOpen: true,\n\t\t\t\tpanelCount: timelineSessions.size + 1,\n\t\t\t\tpanelTitle: panel.title,\n\t\t\t\tworkspacePath: workspaceFolder.uri.fsPath,\n\t\t\t\trelativePath: path.relative(workspaceFolder.uri.fsPath, documentUri.fsPath).replace(/\\\\/g, '/'),\n\t\t\t\tfileName,\n\t\t\t\tlineHistory: lineHistory ? { startLine: lineHistory.startLine, endLine: lineHistory.endLine } : null,\n\t\t\t\tusesBundledWebview: hasBundledTimelineWebviewAssets({ context: args.context }),\n\t\t\t};\n\n\t\t\tif (!hadExistingPanel && shouldMaximizeTimelinePanel()) {\n\t\t\t\tawait maximizeTimelinePanel();\n\t\t\t}\n\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel,\n\t\t\t\tworkspacePath: workspaceFolder.uri.fsPath,\n\t\t\t\tabsolutePath: documentUri.fsPath,\n\t\t\t\tlineHistory,\n\t\t\t\tcustomRevset: args.getPreferences().customRevset || undefined,\n\t\t\t\tfocusRevision,\n\t\t\t});\n\t\t\tsyncLineHistoryStatusBar(lineHistory);\n\t\t},\n\t};\n\n\tasync function loadSessionIntoPanel(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tworkspacePath: string;\n\t\tabsolutePath: string;\n\t\tlineHistory?: { startLine: number; endLine: number };\n\t\tcustomRevset?: string;\n\t\tfocusRevision?: string;\n\t}): Promise<void> {\n\t\tconst generation = (panelLoadGeneration.get(request.panel) || 0) + 1;\n\t\tpanelLoadGeneration.set(request.panel, generation);\n\n\t\tconst session = await args.service.buildSession({\n\t\t\tworkspacePath: request.workspacePath,\n\t\t\tabsolutePath: request.absolutePath,\n\t\t\toptions: {\n\t\t\t\t...(request.lineHistory ? { lineHistory: request.lineHistory } : {}),\n\t\t\t\t...(request.customRevset ? { customRevset: request.customRevset } : {}),\n\t\t\t},\n\t\t});\n\n\t\tif (panelLoadGeneration.get(request.panel) !== generation || request.panel.webview.html === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!session.entries.length) {\n\t\t\tvoid vscode.window.showInformationMessage('No file revisions were found for the active file');\n\t\t\tif (!timelineSessions.has(request.panel)) {\n\t\t\t\trequest.panel.dispose();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttimelineSessions.set(request.panel, session);\n\t\tactiveTimelinePanel = request.panel;\n\t\trequest.panel.title = session.lineHistory\n\t\t\t? `Revision Timeline: ${session.fileName} (L${session.lineHistory.startLine}${\n\t\t\t\t\tsession.lineHistory.endLine === session.lineHistory.startLine ? '' : `–${session.lineHistory.endLine}`\n\t\t\t\t})`\n\t\t\t: `Revision Timeline: ${session.fileName}`;\n\t\tsyncLineHistoryStatusBar(session.lineHistory);\n\t\ttimelineDebugState = createDebugState({\n\t\t\tpanel: request.panel,\n\t\t\tsession,\n\t\t\tlastMessageCommand: timelineDebugState.lastMessageCommand,\n\t\t\tpanelCount: timelineSessions.size,\n\t\t});\n\t\ttimelineDebugState = {\n\t\t\t...timelineDebugState,\n\t\t\tviewReady: panelViewReady.get(request.panel) === true,\n\t\t};\n\n\t\tif (panelViewReady.get(request.panel)) {\n\t\t\tawait eagerlyBootstrapTimeline({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tsession,\n\t\t\t});\n\t\t}\n\n\t\tif (request.focusRevision) {\n\t\t\tconst mapped = args.service.mapEntriesForPayload(session.entries);\n\t\t\tconst match = mapped.find(\n\t\t\t\t(entry) => !entry.isWorkingTree && revisionMatchesBlame(entry.revision, request.focusRevision!),\n\t\t\t);\n\t\t\tif (match && typeof match.index === 'number') {\n\t\t\t\tconst fromIndex = Math.max(0, match.index - 1);\n\t\t\t\tawait handleTimelineMessage({\n\t\t\t\t\tpanel: request.panel,\n\t\t\t\t\tsession,\n\t\t\t\t\tmessage: {\n\t\t\t\t\t\tcommand: 'select-entry',\n\t\t\t\t\t\tfromIndex,\n\t\t\t\t\t\ttoIndex: match.index,\n\t\t\t\t\t\tcomparisonSource: 'revision',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction createTimelinePanel(request: { fileName: string }): vscode.WebviewPanel {\n\t\tconst panel = vscode.window.createWebviewPanel(\n\t\t\t'jjRangeDiffTimeline',\n\t\t\t`Revision Timeline: ${request.fileName}`,\n\t\t\tgetTimelineViewColumn(),\n\t\t\t{\n\t\t\t\tenableScripts: true,\n\t\t\t\tretainContextWhenHidden: true,\n\t\t\t\tenableFindWidget: true,\n\t\t\t\tlocalResourceRoots: [\n\t\t\t\t\tvscode.Uri.joinPath(args.context.extensionUri, 'webview'),\n\t\t\t\t\tvscode.Uri.joinPath(args.context.extensionUri, 'webview-dist'),\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tpanel.onDidDispose(\n\t\t\t() => {\n\t\t\t\ttimelineSessions.get(panel)?.activeActionAbortController?.abort();\n\t\t\t\ttimelineSessions.delete(panel);\n\n\t\t\t\tif (activeTimelinePanel === panel) {\n\t\t\t\t\tconst fallback = [...timelineSessions.entries()].at(-1);\n\t\t\t\t\tif (!fallback) {\n\t\t\t\t\t\tactiveTimelinePanel = undefined;\n\t\t\t\t\t\ttimelineDebugState = createEmptyTimelineDebugState();\n\t\t\t\t\t\tsyncLineHistoryStatusBar(null);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tactiveTimelinePanel = fallback[0];\n\t\t\t\t\ttimelineDebugState = createDebugState({\n\t\t\t\t\t\tpanel: fallback[0],\n\t\t\t\t\t\tsession: fallback[1],\n\t\t\t\t\t\tlastMessageCommand: timelineDebugState.lastMessageCommand,\n\t\t\t\t\t\tpanelCount: timelineSessions.size,\n\t\t\t\t\t});\n\t\t\t\t\tsyncLineHistoryStatusBar(fallback[1].lineHistory);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttimelineDebugState = {\n\t\t\t\t\t...timelineDebugState,\n\t\t\t\t\tpanelCount: timelineSessions.size,\n\t\t\t\t};\n\t\t\t},\n\t\t\tundefined,\n\t\t\targs.context.subscriptions,\n\t\t);\n\n\t\tpanel.webview.onDidReceiveMessage(\n\t\t\tasync (message: TimelineCommand | unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tactiveTimelinePanel = panel;\n\t\t\t\t\tconst command = message && typeof message === 'object' ? Reflect.get(message, 'command') : undefined;\n\n\t\t\t\t\tif (command === 'ready') {\n\t\t\t\t\t\tpanelViewReady.set(panel, true);\n\t\t\t\t\t\tconst session = timelineSessions.get(panel);\n\t\t\t\t\t\ttimelineDebugState = {\n\t\t\t\t\t\t\t...(session\n\t\t\t\t\t\t\t\t? createDebugState({\n\t\t\t\t\t\t\t\t\t\tpanel,\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\tlastMessageCommand: 'ready',\n\t\t\t\t\t\t\t\t\t\tpanelCount: timelineSessions.size,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: timelineDebugState),\n\t\t\t\t\t\t\tviewReady: true,\n\t\t\t\t\t\t\treadyCount: (timelineDebugState.readyCount || 0) + 1,\n\t\t\t\t\t\t\tlastReadyAt: Date.now(),\n\t\t\t\t\t\t\tlastMessageCommand: 'ready',\n\t\t\t\t\t\t\tpanelOpen: true,\n\t\t\t\t\t\t\tpanelTitle: panel.title,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (session?.entries.length) {\n\t\t\t\t\t\t\tawait eagerlyBootstrapTimeline({\n\t\t\t\t\t\t\t\tpanel,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = timelineSessions.get(panel);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait handleTimelineMessage({\n\t\t\t\t\t\tpanel,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst text = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tvoid vscode.window.showErrorMessage(`Timeline action failed: ${text}`);\n\t\t\t\t}\n\t\t\t},\n\t\t\tundefined,\n\t\t\targs.context.subscriptions,\n\t\t);\n\n\t\treturn panel;\n\t}\n\n\tasync function handleTimelineMessage(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tsession: ExtensionTimelineSession;\n\t\tmessage: TimelineCommand | unknown;\n\t}): Promise<void> {\n\t\tif (!request.message || typeof request.message !== 'object') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst command = Reflect.get(request.message, 'command');\n\t\tif (typeof command !== 'string') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'ready') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'layout-metrics') {\n\t\t\t// Handled by getDiffLayoutMetrics() waiter; ignore in the action router.\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'select-entry') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait sendTimelinePreview({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tsession: request.session,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-range-overview') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tconst selectedEntryIndexes = Array.isArray(Reflect.get(request.message, 'selectedEntryIndexes'))\n\t\t\t\t? (Reflect.get(request.message, 'selectedEntryIndexes') as unknown[])\n\t\t\t\t\t\t.map((value) => Number(value))\n\t\t\t\t\t\t.filter((value) => Number.isInteger(value))\n\t\t\t\t: [];\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait sendRangeOverview({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tsession: request.session,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t\tselectedEntryIndexes,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-range-stack') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tconst relativePaths = Array.isArray(Reflect.get(request.message, 'relativePaths'))\n\t\t\t\t? (Reflect.get(request.message, 'relativePaths') as unknown[])\n\t\t\t\t\t\t.map((value) => String(value || '').trim())\n\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t: [];\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex) || !relativePaths.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst normalizedFromIndex = Math.max(0, Math.min(fromIndex, toIndex));\n\t\t\tconst normalizedToIndex = Math.max(normalizedFromIndex, Math.max(fromIndex, toIndex));\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'range-stack-previews',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\t\t\tcomparisonSource,\n\t\t\t\t\t\titems: await args.service.getRangeStackPreviews({\n\t\t\t\t\t\t\tsession: request.session,\n\t\t\t\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\t\t\t\tcomparisonSource,\n\t\t\t\t\t\t\trelativePaths,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-diff-blame') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst normalizedFromIndex = Math.max(0, Math.min(fromIndex, toIndex));\n\t\t\tconst normalizedToIndex = Math.max(normalizedFromIndex, Math.max(fromIndex, toIndex));\n\t\t\tconst blame = await args.service.getDiffBlame({\n\t\t\t\tsession: request.session,\n\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t});\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'diff-blame',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\t\t\tcomparisonSource,\n\t\t\t\t\t\trelativePath: blame.relativePath,\n\t\t\t\t\t\tlines: blame.lines,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-file-oplog') {\n\t\t\tconst oplog = await args.service.getFileOpLog({ session: request.session });\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'file-oplog',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\trelativePath: oplog.relativePath,\n\t\t\t\t\t\tentries: oplog.entries,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-revision-tree-files') {\n\t\t\tconst revision = String(Reflect.get(request.message, 'revision') || '@');\n\t\t\tconst files = await args.service.loadRevisionTreeFiles({\n\t\t\t\tsession: request.session,\n\t\t\t\trevision,\n\t\t\t});\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'revision-tree-files',\n\t\t\t\t\tpayload: { revision, files },\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'search-history') {\n\t\t\tconst query = String(Reflect.get(request.message, 'query') || '');\n\t\t\tconst purpose = Reflect.get(request.message, 'purpose') === 'sidebar' ? 'sidebar' : 'history';\n\t\t\tconst result = await args.service.searchFileHistory({\n\t\t\t\tsession: request.session,\n\t\t\t\tquery,\n\t\t\t\tpurpose,\n\t\t\t});\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'history-search',\n\t\t\t\t\tpayload: { ...result, purpose },\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'load-entry-diff-counts') {\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tconst entryIndexes = Array.isArray(Reflect.get(request.message, 'entryIndexes'))\n\t\t\t\t? (Reflect.get(request.message, 'entryIndexes') as unknown[])\n\t\t\t\t\t\t.map((value) => Number(value))\n\t\t\t\t\t\t.filter((value) => Number.isInteger(value))\n\t\t\t\t: [];\n\t\t\tif (!entryIndexes.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'entry-diff-counts',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tcomparisonSource,\n\t\t\t\t\t\tcounts: await args.service.getEntryDiffCounts({\n\t\t\t\t\t\t\tsession: request.session,\n\t\t\t\t\t\t\tentryIndexes,\n\t\t\t\t\t\t\tcomparisonSource,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'hydrate-snapshot-entries') {\n\t\t\tconst revisionIndexes = Reflect.get(request.message, 'revisionIndexes');\n\t\t\tif (!Array.isArray(revisionIndexes)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst didUpdate = await args.service.hydrateSnapshotEntries({\n\t\t\t\tsession: request.session,\n\t\t\t\trevisionIndexes: revisionIndexes.map((value) => Number(value)).filter((value) => Number.isInteger(value)),\n\t\t\t});\n\n\t\t\tif (!didUpdate) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = buildPayload(request.session);\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'snapshot-entries',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsnapshotEntries: payload.snapshotEntries,\n\t\t\t\t\t\tsnapshotState: payload.snapshotState,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'resolve-nonempty-range') {\n\t\t\tconst candidateIndexes = Reflect.get(request.message, 'candidateIndexes');\n\t\t\tif (!Array.isArray(candidateIndexes)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst resolvedRange = await args.service.findNearestNonEmptyVisibleRange({\n\t\t\t\tsession: request.session,\n\t\t\t\tcandidateIndexes: candidateIndexes.map((value) => Number(value)).filter((value) => Number.isInteger(value)),\n\t\t\t});\n\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: { type: 'resolved-range', payload: resolvedRange },\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'open-editor-diff') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait openRangeDiffInEditor({\n\t\t\t\tsession: request.session,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'open-current-file') {\n\t\t\tawait vscode.commands.executeCommand('vscode.open', vscode.Uri.file(request.session.absolutePath), {\n\t\t\t\tpreview: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'open-range-files-diff') {\n\t\t\tconst fromIndex = Number(Reflect.get(request.message, 'fromIndex'));\n\t\t\tconst toIndex = Number(Reflect.get(request.message, 'toIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tconst selectedEntryIndexes = Array.isArray(Reflect.get(request.message, 'selectedEntryIndexes'))\n\t\t\t\t? (Reflect.get(request.message, 'selectedEntryIndexes') as unknown[])\n\t\t\t\t\t\t.map((value) => Number(value))\n\t\t\t\t\t\t.filter((value) => Number.isInteger(value))\n\t\t\t\t: [];\n\t\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait openRangeFilesDiff({\n\t\t\t\tsession: request.session,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t\tselectedEntryIndexes,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'open-revision-files-diff') {\n\t\t\tconst entryIndex = Number(Reflect.get(request.message, 'entryIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tif (!Number.isInteger(entryIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait openRevisionFilesDiff({\n\t\t\t\tsession: request.session,\n\t\t\t\tentryIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'open-revision-remote') {\n\t\t\tconst entryIndex = Number(Reflect.get(request.message, 'entryIndex'));\n\t\t\tconst comparisonSource = normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource'));\n\t\t\tif (!Number.isInteger(entryIndex)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait openRevisionOnRemote({\n\t\t\t\tsession: request.session,\n\t\t\t\tentryIndex,\n\t\t\t\tcomparisonSource,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'cancel-active-request') {\n\t\t\trequest.session.activeActionAbortController?.abort();\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'switch-file') {\n\t\t\tconst relativePath = String(Reflect.get(request.message, 'relativePath') || '').trim();\n\t\t\tif (!relativePath) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\tabsolutePath: path.join(request.session.workspacePath, relativePath),\n\t\t\t\tlineHistory: request.session.lineHistory,\n\t\t\t\tcustomRevset: request.session.customRevset,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'clear-line-history') {\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\tabsolutePath: request.session.absolutePath,\n\t\t\t\tcustomRevset: request.session.customRevset,\n\t\t\t});\n\t\t\tsyncLineHistoryStatusBar(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'set-custom-revset') {\n\t\t\tconst customRevset = String(Reflect.get(request.message, 'customRevset') || '').trim();\n\t\t\tconst nextPreferences = {\n\t\t\t\t...args.getPreferences(),\n\t\t\t\tcustomRevset,\n\t\t\t};\n\t\t\tawait args.savePreferences(nextPreferences);\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\tabsolutePath: request.session.absolutePath,\n\t\t\t\tlineHistory: request.session.lineHistory,\n\t\t\t\tcustomRevset: customRevset || undefined,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'persist-state') {\n\t\t\tawait args.savePreferences({\n\t\t\t\tsidebarWidth: Number(Reflect.get(request.message, 'sidebarWidth')),\n\t\t\t\tsidebarCollapsed: Boolean(Reflect.get(request.message, 'sidebarCollapsed')),\n\t\t\t\ttimelinePaneHeight: Number(Reflect.get(request.message, 'timelinePaneHeight')),\n\t\t\t\ttimelinePaneCollapsed: Boolean(Reflect.get(request.message, 'timelinePaneCollapsed')),\n\t\t\t\tlayoutMode: Reflect.get(request.message, 'layoutMode') === 'unified' ? 'unified' : 'split',\n\t\t\t\tcontentMode: Reflect.get(request.message, 'contentMode') === 'full' ? 'full' : 'diffs',\n\t\t\t\tcomparisonMode: Reflect.get(request.message, 'comparisonMode') === 'step' ? 'step' : 'range',\n\t\t\t\tcomparisonSource: normalizeComparisonSource(Reflect.get(request.message, 'comparisonSource')),\n\t\t\t\tshowIntermediateRevisions: Boolean(Reflect.get(request.message, 'showIntermediateRevisions')),\n\t\t\t\tpreset: normalizeTimelinePreset(Reflect.get(request.message, 'preset')),\n\t\t\t\tcustomRevset: String(Reflect.get(request.message, 'customRevset') || args.getPreferences().customRevset || ''),\n\t\t\t\tthemePreference: normalizeThemePreference(Reflect.get(request.message, 'themePreference')),\n\t\t\t\theatmapOpen: Boolean(Reflect.get(request.message, 'heatmapOpen')),\n\t\t\t\tlineDiffType: normalizeLineDiffType(Reflect.get(request.message, 'lineDiffType')),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (command === 'refresh') {\n\t\t\tawait loadSessionIntoPanel({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\tabsolutePath: request.session.absolutePath,\n\t\t\t\tlineHistory: request.session.lineHistory,\n\t\t\t\tcustomRevset: request.session.customRevset,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t}\n\n\tasync function eagerlyBootstrapTimeline(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tsession: ExtensionTimelineSession;\n\t}): Promise<void> {\n\t\tconst comparisonSource = normalizeComparisonSource(args.getPreferences().comparisonSource);\n\t\tif (\n\t\t\tcomparisonSource === 'snapshot' &&\n\t\t\trequest.session.backend === 'jj' &&\n\t\t\trequest.session.snapshotLoadedChangeIds.size === 0\n\t\t) {\n\t\t\tawait args.service.hydrateSnapshotEntries({\n\t\t\t\tsession: request.session,\n\t\t\t\trevisionIndexes: collectPendingSnapshotHydrationIndexes(request.session),\n\t\t\t});\n\t\t}\n\n\t\tconst payload = buildPayload(request.session);\n\t\tawait postTimelineMessage({\n\t\t\tpanel: request.panel,\n\t\t\tmessage: {\n\t\t\t\ttype: 'timeline-data',\n\t\t\t\tpayload,\n\t\t\t},\n\t\t});\n\n\t\tconst defaultFromIndex = Math.max(0, payload.defaultIndex - 1);\n\t\tawait sendTimelinePreview({\n\t\t\tpanel: request.panel,\n\t\t\tsession: request.session,\n\t\t\tfromIndex: defaultFromIndex,\n\t\t\ttoIndex: payload.defaultIndex,\n\t\t\tcomparisonSource,\n\t\t});\n\n\t\tvoid enrichSessionInBackground({\n\t\t\tpanel: request.panel,\n\t\t\tsession: request.session,\n\t\t});\n\t}\n\n\tasync function enrichSessionInBackground(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tsession: ExtensionTimelineSession;\n\t}): Promise<void> {\n\t\tconst generation = panelLoadGeneration.get(request.panel);\n\t\tconst isCurrent = () =>\n\t\t\tpanelLoadGeneration.get(request.panel) === generation && timelineSessions.get(request.panel) === request.session;\n\n\t\ttry {\n\t\t\tif (await args.service.ensureWorkspaceFiles({ session: request.session })) {\n\t\t\t\tif (!isCurrent()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait postTimelineMessage({\n\t\t\t\t\tpanel: request.panel,\n\t\t\t\t\tmessage: {\n\t\t\t\t\t\ttype: 'workspace-files',\n\t\t\t\t\t\tpayload: { workspaceFiles: request.session.workspaceFiles },\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst expanded = await args.service.expandFileHistory({ session: request.session });\n\t\t\tconst intermediates = await args.service.ensureIntermediateRevisions({ session: request.session });\n\t\t\tif (!isCurrent() || (!expanded && !intermediates)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait postTimelineMessage({\n\t\t\t\tpanel: request.panel,\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: 'entries-updated',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tentries: args.service.mapEntriesForPayload(request.session.entries),\n\t\t\t\t\t\thasIntermediateRevisions: request.session.entries.some((entry) => !entry.touchesFile),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {\n\t\t\t// Background enrichment is best-effort; first paint already succeeded.\n\t\t}\n\t}\n\n\tfunction buildPayload(session: ExtensionTimelineSession) {\n\t\treturn args.service.buildPayload({\n\t\t\tsession,\n\t\t\tpreferences: args.getPreferences(),\n\t\t\tversion: args.version,\n\t\t\tpresets: TIMELINE_PRESET_DAYS,\n\t\t});\n\t}\n\n\tasync function sendTimelinePreview(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tsession: ExtensionTimelineSession;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t}): Promise<void> {\n\t\tconst generation = ++timelinePreviewGeneration;\n\t\tconst preview = await args.service.getDiffPreview(request);\n\t\tif (generation !== timelinePreviewGeneration) {\n\t\t\treturn;\n\t\t}\n\t\tawait postTimelineMessage({\n\t\t\tpanel: request.panel,\n\t\t\tmessage: {\n\t\t\t\ttype: 'diff-preview',\n\t\t\t\tpayload: preview,\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function sendRangeOverview(request: {\n\t\tpanel: vscode.WebviewPanel;\n\t\tsession: ExtensionTimelineSession;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t\tselectedEntryIndexes?: number[];\n\t}): Promise<void> {\n\t\tconst normalizedFromIndex = Math.max(0, Math.min(request.fromIndex, request.toIndex));\n\t\tconst normalizedToIndex = Math.max(normalizedFromIndex, Math.max(request.fromIndex, request.toIndex));\n\t\tconst selectedEntryIndexes = request.selectedEntryIndexes || [];\n\t\tawait postTimelineMessage({\n\t\t\tpanel: request.panel,\n\t\t\tmessage: {\n\t\t\t\ttype: 'range-overview',\n\t\t\t\tpayload: {\n\t\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\tselectedEntryIndexes,\n\t\t\t\t\titems: await args.service.getRangeOverview({\n\t\t\t\t\t\tsession: request.session,\n\t\t\t\t\t\tfromIndex: normalizedFromIndex,\n\t\t\t\t\t\ttoIndex: normalizedToIndex,\n\t\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\t\tselectedEntryIndexes,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function openRangeDiffInEditor(request: {\n\t\tsession: ExtensionTimelineSession;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t}): Promise<void> {\n\t\tconst sourceEntries = args.service.getEntriesForSource({\n\t\t\tsession: request.session,\n\t\t\tcomparisonSource: request.comparisonSource,\n\t\t});\n\t\tconst comparison = args.service.getComparisonEntries({\n\t\t\tentries: sourceEntries,\n\t\t\tfromIndex: request.fromIndex,\n\t\t\ttoIndex: request.toIndex,\n\t\t});\n\t\tif (!comparison) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!comparison.fromEntry) {\n\t\t\tconst uri = await createRevisionUri({\n\t\t\t\tsession: request.session,\n\t\t\t\tentry: comparison.toEntry,\n\t\t\t});\n\t\t\tawait vscode.commands.executeCommand('vscode.open', uri, { preview: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst originalUri = createSnapshotUri({\n\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\trevset: comparison.fromEntry.revision,\n\t\t\trelativePath: await args.service.resolveEntryFilePath({\n\t\t\t\tsession: request.session,\n\t\t\t\tentry: comparison.fromEntry,\n\t\t\t\tentryIndex: Math.max(0, Math.min(request.fromIndex, request.toIndex)),\n\t\t\t}),\n\t\t\tbackend: request.session.backend,\n\t\t});\n\t\tconst modifiedUri = createSnapshotUri({\n\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\trevset: comparison.toEntry.revision,\n\t\t\trelativePath: await args.service.resolveEntryFilePath({\n\t\t\t\tsession: request.session,\n\t\t\t\tentry: comparison.toEntry,\n\t\t\t\tentryIndex: Math.max(request.fromIndex, request.toIndex),\n\t\t\t}),\n\t\t\tbackend: request.session.backend,\n\t\t});\n\t\tconst title = `${request.session.fileName}: ${comparison.fromEntry.shortRevision} -> ${comparison.toEntry.shortRevision}`;\n\t\tawait vscode.commands.executeCommand('vscode.diff', originalUri, modifiedUri, title, { preview: true });\n\t}\n\n\tasync function openRangeFilesDiff(request: {\n\t\tsession: ExtensionTimelineSession;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t\tselectedEntryIndexes?: number[];\n\t}): Promise<void> {\n\t\tawait args.service.runSessionAction({\n\t\t\tsession: request.session,\n\t\t\taction: async (signal) => {\n\t\t\t\tconst sourceEntries = args.service.getEntriesForSource({\n\t\t\t\t\tsession: request.session,\n\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t});\n\t\t\t\tconst comparison = args.service.getComparisonEntries({\n\t\t\t\t\tentries: sourceEntries,\n\t\t\t\t\tfromIndex: request.fromIndex,\n\t\t\t\t\ttoIndex: request.toIndex,\n\t\t\t\t});\n\t\t\t\tif (!comparison) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst plan = request.selectedEntryIndexes?.length\n\t\t\t\t\t? await buildSelectedEntryMultiDiffPlan({\n\t\t\t\t\t\t\tadapter: request.session.adapter,\n\t\t\t\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\t\t\t\tsourceEntries,\n\t\t\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\t\t\tentryIndexes: request.selectedEntryIndexes,\n\t\t\t\t\t\t\ttitle: `${comparison.fromEntry.shortRevision}..${comparison.toEntry.shortRevision}`,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await request.session.adapter.buildRangeMultiDiffPlan({\n\t\t\t\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\t\t\t\tfromEntry: comparison.fromEntry,\n\t\t\t\t\t\t\ttoEntry: comparison.toEntry,\n\t\t\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\t\t\tsourceEntries,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t});\n\n\t\t\t\tif (!plan.files.length) {\n\t\t\t\t\tvoid vscode.window.showInformationMessage(`No changes found for ${plan.title}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!(await confirmMultiDiffOpen({ title: plan.title, fileCount: plan.files.length }))) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait vscode.commands.executeCommand(OPEN_MULTI_DIFF_COMMAND, {\n\t\t\t\t\ttitle: plan.title,\n\t\t\t\t\tresources: await buildMultiDiffResources({\n\t\t\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\t\t\tfiles: plan.files,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function openRevisionFilesDiff(request: {\n\t\tsession: ExtensionTimelineSession;\n\t\tentryIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t}): Promise<void> {\n\t\tawait args.service.runSessionAction({\n\t\t\tsession: request.session,\n\t\t\taction: async (signal) => {\n\t\t\t\tconst sourceEntries = args.service.getEntriesForSource({\n\t\t\t\t\tsession: request.session,\n\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t});\n\t\t\t\tconst entry = sourceEntries[request.entryIndex];\n\t\t\t\tif (!entry) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (entry.isWorkingTree) {\n\t\t\t\t\tawait openRangeFilesDiff({\n\t\t\t\t\t\tsession: request.session,\n\t\t\t\t\t\tfromIndex: Math.max(0, request.entryIndex - 1),\n\t\t\t\t\t\ttoIndex: request.entryIndex,\n\t\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst plan = await request.session.adapter.buildRevisionMultiDiffPlan({\n\t\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\t\tentry,\n\t\t\t\t\tentryIndex: request.entryIndex,\n\t\t\t\t\tcomparisonSource: request.comparisonSource,\n\t\t\t\t\tsourceEntries,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\n\t\t\t\tif (!plan.files.length) {\n\t\t\t\t\tvoid vscode.window.showInformationMessage(`No files changed in ${entry.shortRevision}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!(await confirmMultiDiffOpen({ title: plan.title, fileCount: plan.files.length }))) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait vscode.commands.executeCommand(OPEN_MULTI_DIFF_COMMAND, {\n\t\t\t\t\ttitle: plan.title,\n\t\t\t\t\tresources: await buildMultiDiffResources({\n\t\t\t\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\t\t\t\tfiles: plan.files,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function openRevisionOnRemote(request: {\n\t\tsession: ExtensionTimelineSession;\n\t\tentryIndex: number;\n\t\tcomparisonSource: ComparisonSource;\n\t}): Promise<void> {\n\t\tconst entry = args.service.getEntriesForSource({\n\t\t\tsession: request.session,\n\t\t\tcomparisonSource: request.comparisonSource,\n\t\t})[request.entryIndex];\n\t\tif (!entry?.remoteUrl) {\n\t\t\tvoid vscode.window.showInformationMessage('No GitHub remote URL is available for this revision.');\n\t\t\treturn;\n\t\t}\n\n\t\tawait vscode.env.openExternal(vscode.Uri.parse(entry.remoteUrl));\n\t}\n\n\tasync function buildMultiDiffResources(request: {\n\t\tworkspacePath: string;\n\t\tfiles: Array<{\n\t\t\trelativePath: string;\n\t\t\toriginalRevset: string;\n\t\t\tmodifiedRevset: string;\n\t\t\tbackend: 'git' | 'jj';\n\t\t}>;\n\t}) {\n\t\treturn Promise.all(\n\t\t\trequest.files.map(async (file) => ({\n\t\t\t\toriginalUri: createSnapshotUri({\n\t\t\t\t\tworkspacePath: request.workspacePath,\n\t\t\t\t\trevset: file.originalRevset,\n\t\t\t\t\trelativePath: file.relativePath,\n\t\t\t\t\tbackend: file.backend,\n\t\t\t\t}),\n\t\t\t\tmodifiedUri: await createTargetUri({\n\t\t\t\t\tworkspacePath: request.workspacePath,\n\t\t\t\t\trevset: file.modifiedRevset,\n\t\t\t\t\trelativePath: file.relativePath,\n\t\t\t\t\tbackend: file.backend,\n\t\t\t\t}),\n\t\t\t})),\n\t\t);\n\t}\n\n\tasync function confirmMultiDiffOpen(request: { title: string; fileCount: number }): Promise<boolean> {\n\t\tif (request.fileCount <= LARGE_MULTI_DIFF_CONFIRMATION_THRESHOLD) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst confirmLabel = `Open ${request.fileCount} diffs`;\n\t\tconst selection = await vscode.window.showWarningMessage(\n\t\t\t`Open ${request.fileCount} file diffs?`,\n\t\t\t{\n\t\t\t\tmodal: true,\n\t\t\t\tdetail: `${request.title} touches a large number of files. Opening every diff at once may be slow and create a lot of editors.`,\n\t\t\t},\n\t\t\tconfirmLabel,\n\t\t);\n\n\t\treturn selection === confirmLabel;\n\t}\n\n\tasync function createTargetUri(request: {\n\t\tworkspacePath: string;\n\t\trevset: string;\n\t\trelativePath: string;\n\t\tbackend: 'git' | 'jj';\n\t}): Promise<vscode.Uri> {\n\t\tif (request.revset === '@') {\n\t\t\tconst fileUri = vscode.Uri.file(path.join(request.workspacePath, request.relativePath));\n\t\t\tif (\n\t\t\t\tawait vscode.workspace.fs.stat(fileUri).then(\n\t\t\t\t\t() => true,\n\t\t\t\t\t() => false,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn fileUri;\n\t\t\t}\n\t\t}\n\n\t\treturn createSnapshotUri({\n\t\t\tworkspacePath: request.workspacePath,\n\t\t\trevset: request.revset,\n\t\t\trelativePath: request.relativePath,\n\t\t\tbackend: request.backend,\n\t\t});\n\t}\n\n\tasync function createRevisionUri(request: {\n\t\tsession: ExtensionTimelineSession;\n\t\tentry: FileRevisionEntry;\n\t}): Promise<vscode.Uri> {\n\t\tif (request.entry.isWorkingTree) {\n\t\t\tconst fileUri = vscode.Uri.file(request.session.absolutePath);\n\t\t\tif (\n\t\t\t\tawait vscode.workspace.fs.stat(fileUri).then(\n\t\t\t\t\t() => true,\n\t\t\t\t\t() => false,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn fileUri;\n\t\t\t}\n\t\t}\n\n\t\tconst entryIndex = request.session.entries.findIndex((candidate) => candidate.id === request.entry.id);\n\t\tconst resolvedPath = await args.service.resolveEntryFilePath({\n\t\t\tsession: request.session,\n\t\t\tentry: request.entry,\n\t\t\tentryIndex,\n\t\t});\n\t\treturn createSnapshotUri({\n\t\t\tworkspacePath: request.session.workspacePath,\n\t\t\trevset: request.entry.revision,\n\t\t\trelativePath: resolvedPath,\n\t\t\tbackend: request.session.backend,\n\t\t});\n\t}\n}\n\nfunction getTimelineWebviewHtml(args: { context: vscode.ExtensionContext; webview: vscode.Webview }): string {\n\tif (!hasBundledTimelineWebviewAssets({ context: args.context })) {\n\t\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none';\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Revision Timeline</title>\n </head>\n <body>\n <p>Webview bundle is missing. Run pnpm build:webview and reopen the timeline.</p>\n </body>\n</html>`;\n\t}\n\n\tconst appStylePath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'timeline-app.css');\n\tconst appScriptPath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'timeline-app.js');\n\tconst workerPath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'pierre-worker-portable.js');\n\n\treturn renderTimelineDocumentHtml({\n\t\ttitle: 'Revision Timeline',\n\t\tcspSource: args.webview.cspSource,\n\t\tstyleHref: String(args.webview.asWebviewUri(appStylePath)),\n\t\tappSrc: String(args.webview.asWebviewUri(appScriptPath)),\n\t\tworkerSrc: String(args.webview.asWebviewUri(workerPath)),\n\t});\n}\n\nfunction hasBundledTimelineWebviewAssets(args: { context: vscode.ExtensionContext }): boolean {\n\tconst appStylePath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'timeline-app.css');\n\tconst appScriptPath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'timeline-app.js');\n\treturn fsSync.existsSync(appStylePath.fsPath) && fsSync.existsSync(appScriptPath.fsPath);\n}\n\nfunction createEmptyTimelineDebugState(): TimelineDebugState {\n\treturn {\n\t\tpanelOpen: false,\n\t\tpanelCount: 0,\n\t\tpanelTitle: '',\n\t\tbackend: '',\n\t\tworkspacePath: '',\n\t\trelativePath: '',\n\t\tfileName: '',\n\t\tentryCount: 0,\n\t\tsnapshotEntryCount: 0,\n\t\tlineHistory: null,\n\t\tusesBundledWebview: false,\n\t\tviewReady: false,\n\t\treadyCount: 0,\n\t\tlastMessageCommand: '',\n\t\tlastReadyAt: 0,\n\t\tentries: [],\n\t};\n}\n\nfunction createDebugState(args: {\n\tpanel: vscode.WebviewPanel;\n\tsession: ExtensionTimelineSession;\n\tlastMessageCommand: string;\n\tpanelCount: number;\n}): TimelineDebugState {\n\treturn {\n\t\tpanelOpen: true,\n\t\tpanelCount: args.panelCount,\n\t\tpanelTitle: args.panel.title,\n\t\tbackend: args.session.backend,\n\t\tworkspacePath: args.session.workspacePath,\n\t\trelativePath: args.session.relativePath,\n\t\tfileName: args.session.fileName,\n\t\tentryCount: args.session.entries.length,\n\t\tsnapshotEntryCount: args.session.snapshotEntries.length,\n\t\tlineHistory: args.session.lineHistory\n\t\t\t? { startLine: args.session.lineHistory.startLine, endLine: args.session.lineHistory.endLine }\n\t\t\t: null,\n\t\tusesBundledWebview: true,\n\t\tviewReady: false,\n\t\treadyCount: 0,\n\t\tlastMessageCommand: args.lastMessageCommand,\n\t\tlastReadyAt: 0,\n\t\tentries: args.session.entries.map((entry) => ({\n\t\t\tindex: entry.index ?? 0,\n\t\t\tdescription: entry.description,\n\t\t\tshortRevision: entry.shortRevision,\n\t\t})),\n\t};\n}\n\nfunction normalizeComparisonSource(value: unknown): ComparisonSource {\n\treturn value === 'snapshot' ? 'snapshot' : 'revision';\n}\n\nfunction normalizeThemePreference(value: unknown): ThemePreference {\n\treturn value === 'light' || value === 'dark' ? value : 'auto';\n}\n\nfunction normalizeLineDiffType(value: unknown): LineDiffType {\n\treturn value === 'word' || value === 'char' || value === 'none' || value === 'word-alt' ? value : 'word-alt';\n}\n\nfunction normalizeTimelinePreset(value: unknown): keyof typeof TIMELINE_PRESET_DAYS {\n\treturn typeof value === 'string' && value in TIMELINE_PRESET_DAYS\n\t\t? (value as keyof typeof TIMELINE_PRESET_DAYS)\n\t\t: 'year';\n}\n\nasync function maximizeTimelinePanel(): Promise<void> {\n\ttry {\n\t\tawait vscode.commands.executeCommand('workbench.action.toggleMaximizeEditorGroup');\n\t} catch {\n\t\t// Ignore if unavailable.\n\t}\n}\n\nfunction shouldMaximizeTimelinePanel(): boolean {\n\treturn getEditorGroupCount() > 1;\n}\n\nfunction getTimelineViewColumn(): vscode.ViewColumn {\n\treturn shouldMaximizeTimelinePanel() ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active;\n}\n\nfunction getEditorGroupCount(): number {\n\tconst groups = vscode.window.tabGroups?.all;\n\treturn Array.isArray(groups) && groups.length ? groups.length : 1;\n}\n"],"mappings":"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"}