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":"index.cjs","names":["createCommandRunner","createTimelineService","createTimelinePanelController","createRepoTimelinePanelController","DEFAULT_FROM_REVSET","OPEN_MULTI_DIFF_COMMAND","path","resolveHistoryWorkspacePath","resolveHistoryAdapter","createRevisionDiffNavigator","listFileRevisionIds","HELPER_COMMAND","OPEN_FILE_RANGE_DIFF_COMMAND","OPEN_CHANGES_WITH_PREVIOUS_COMMAND","OPEN_REVISION_DIFF_PREVIOUS_COMMAND","OPEN_REVISION_DIFF_NEXT_COMMAND","OPEN_REVISION_DIFF_TIMELINE_COMMAND","OPEN_FILE_TIMELINE_COMMAND","resolveCommandFilePath","OPEN_REPO_TIMELINE_COMMAND","OPEN_FILE_LINE_TIMELINE_COMMAND","CLEAR_LINE_HISTORY_COMMAND","OPEN_TIMELINE_AT_LINE_COMMAND","createEditorBlameDecorations","registerEditorExtraFeatures","GET_TIMELINE_DEBUG_STATE_COMMAND","GET_DIFF_LAYOUT_METRICS_COMMAND","DEBUG_SELECT_TIMELINE_RANGE_COMMAND","DEBUG_SET_LAYOUT_MODE_COMMAND","isRangeDiffUriTarget","parseRangeDiffUri","SNAPSHOT_SCHEME","parseSnapshotUri","TIMELINE_PREFERENCES_KEY","normalizeTimelinePreferences","createSnapshotUri","areSamePath","PENDING_RANGE_DIFF_KEY","sanitizeRangeDiffArgs"],"sources":["../../src/extension/index.ts"],"sourcesContent":["import path from 'node:path';\nimport * as vscode from 'vscode';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { createCommandRunner } from './command-runner.ts';\nimport {\n\tCLI_SOURCE,\n\tDEFAULT_FROM_REVSET,\n\tDEFAULT_TO_REVSET,\n\tEXTENSION_ID,\n\tGET_TIMELINE_DEBUG_STATE_COMMAND,\n\tGET_DIFF_LAYOUT_METRICS_COMMAND,\n\tDEBUG_SELECT_TIMELINE_RANGE_COMMAND,\n\tDEBUG_SET_LAYOUT_MODE_COMMAND,\n\tHELPER_COMMAND,\n\tCLEAR_LINE_HISTORY_COMMAND,\n\tOPEN_FILE_RANGE_DIFF_COMMAND,\n\tOPEN_FILE_TIMELINE_COMMAND,\n\tOPEN_REPO_TIMELINE_COMMAND,\n\tOPEN_FILE_LINE_TIMELINE_COMMAND,\n\tOPEN_TIMELINE_AT_LINE_COMMAND,\n\tOPEN_CHANGES_WITH_PREVIOUS_COMMAND,\n\tOPEN_REVISION_DIFF_PREVIOUS_COMMAND,\n\tOPEN_REVISION_DIFF_NEXT_COMMAND,\n\tOPEN_REVISION_DIFF_TIMELINE_COMMAND,\n\tOPEN_MULTI_DIFF_COMMAND,\n\tPENDING_RANGE_DIFF_KEY,\n\tSNAPSHOT_SCHEME,\n\tTIMELINE_PREFERENCES_KEY,\n} from './constants.ts';\nimport { createEditorBlameDecorations } from './blame-codelens.ts';\nimport { registerEditorExtraFeatures } from './editor-extra-features.ts';\nimport { resolveHistoryAdapter, resolveHistoryWorkspacePath } from './history-adapters.ts';\nimport { resolveCommandFilePath } from './resolve-file-path.ts';\nimport { createRevisionDiffNavigator, listFileRevisionIds } from './revision-diff-nav.ts';\nimport { createTimelinePanelController } from './timeline-panel.ts';\nimport { createRepoTimelinePanelController } from './repo-timeline-panel.ts';\nimport { createTimelineService, normalizeTimelinePreferences } from './timeline-service.ts';\nimport {\n\tareSamePath,\n\tcreateSnapshotUri,\n\tisRangeDiffUriTarget,\n\tparseRangeDiffUri,\n\tparseSnapshotUri,\n\tsanitizeRangeDiffArgs,\n} from './uri-utils.ts';\nimport type { RangeDiffArgs } from './types.ts';\n\ntype FileRangeDiffArgs = RangeDiffArgs & {\n\tabsolutePath?: string;\n};\n\ntype WorkspaceFileTarget = {\n\tabsolutePath: string;\n\trelativePath: string;\n\tfileName: string;\n};\n\nexport function activate(context: vscode.ExtensionContext): void {\n\tconst outputChannel = vscode.window.createOutputChannel('JJ Plus');\n\tconst runner = createCommandRunner({ outputChannel });\n\tconst service = createTimelineService({ runner });\n\tconst panelController = createTimelinePanelController({\n\t\tcontext,\n\t\tservice,\n\t\tgetPreferences: () => getTimelinePreferences(context),\n\t\tsavePreferences: (nextPreferences) => saveTimelinePreferences(context, nextPreferences),\n\t\tversion: packageJson.version,\n\t});\n\tconst repoTimelineController = createRepoTimelinePanelController({\n\t\tcontext,\n\t\trunner,\n\t\tversion: packageJson.version,\n\t});\n\tconst provider = new SnapshotContentProvider({ runner });\n\n\tconst openRangeMultiDiff = async (rawArgs?: RangeDiffArgs) => {\n\t\tif (rawArgs?.verbose) {\n\t\t\toutputChannel.show(true);\n\t\t}\n\n\t\tconst workspaceUri = await resolveWorkspaceUri({ context, args: rawArgs });\n\t\tif (workspaceUri === 'redirected') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!workspaceUri) {\n\t\t\tvoid vscode.window.showErrorMessage('No workspace folder available');\n\t\t\treturn;\n\t\t}\n\n\t\tconst base = shouldPromptForInputs(rawArgs)\n\t\t\t? await resolveInput({\n\t\t\t\t\tvalue: getFromValue(rawArgs),\n\t\t\t\t\tprompt: 'From change id or revset',\n\t\t\t\t\tplaceHolder: DEFAULT_FROM_REVSET,\n\t\t\t\t})\n\t\t\t: getFromValue(rawArgs);\n\t\tif (!base) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = shouldPromptForInputs(rawArgs)\n\t\t\t? await resolveInput({\n\t\t\t\t\tvalue: getToValue(rawArgs),\n\t\t\t\t\tprompt: 'To change id or revset',\n\t\t\t\t\tplaceHolder: DEFAULT_TO_REVSET,\n\t\t\t\t})\n\t\t\t: getToValue(rawArgs);\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst title = rawArgs?.title?.trim() || `${base}..${target}`;\n\n\t\ttry {\n\t\t\tconst { resolvedTitle, resources } = await buildWorkspaceMultiDiffResources({\n\t\t\t\trunner,\n\t\t\t\tworkspacePath: workspaceUri.fsPath,\n\t\t\t\tbase,\n\t\t\t\ttarget,\n\t\t\t\ttitle,\n\t\t\t});\n\t\t\tif (!resources.length) {\n\t\t\t\tvoid vscode.window.showInformationMessage(`No changes found for ${title}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait vscode.commands.executeCommand(OPEN_MULTI_DIFF_COMMAND, {\n\t\t\t\ttitle: resolvedTitle,\n\t\t\t\tresources,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tvoid vscode.window.showErrorMessage(`Failed to open JJ Plus range diff: ${message}`);\n\t\t}\n\t};\n\n\tconst openFileRangeDiff = async (rawArgs?: FileRangeDiffArgs) => {\n\t\tif (rawArgs?.verbose) {\n\t\t\toutputChannel.show(true);\n\t\t}\n\n\t\tconst workspaceUri = await resolveWorkspaceUri({ context, args: rawArgs });\n\t\tif (workspaceUri === 'redirected') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!workspaceUri) {\n\t\t\tvoid vscode.window.showErrorMessage('No workspace folder available');\n\t\t\treturn;\n\t\t}\n\n\t\tconst fileTarget = await resolveFileDiffTarget({\n\t\t\tworkspaceUri,\n\t\t\tabsolutePath: rawArgs?.absolutePath,\n\t\t});\n\t\tif (!fileTarget) {\n\t\t\tvoid vscode.window.showErrorMessage('No workspace file available from the active editor or open tabs');\n\t\t\treturn;\n\t\t}\n\n\t\tconst base = shouldPromptForInputs(rawArgs)\n\t\t\t? await resolveInput({\n\t\t\t\t\tvalue: getFromValue(rawArgs),\n\t\t\t\t\tprompt: 'From change id or revset',\n\t\t\t\t\tplaceHolder: DEFAULT_FROM_REVSET,\n\t\t\t\t})\n\t\t\t: getFromValue(rawArgs);\n\t\tif (!base) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = shouldPromptForInputs(rawArgs)\n\t\t\t? await resolveInput({\n\t\t\t\t\tvalue: getToValue(rawArgs),\n\t\t\t\t\tprompt: 'To change id or revset',\n\t\t\t\t\tplaceHolder: DEFAULT_TO_REVSET,\n\t\t\t\t})\n\t\t\t: getToValue(rawArgs);\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst title = rawArgs?.title?.trim() || `${fileTarget.fileName}: ${base} -> ${target}`;\n\n\t\ttry {\n\t\t\tconst preferredWorkspacePath = path.dirname(fileTarget.absolutePath);\n\t\t\tconst historyWorkspacePath = await resolveHistoryWorkspacePath({\n\t\t\t\tworkspacePath: preferredWorkspacePath,\n\t\t\t\trunner,\n\t\t\t});\n\t\t\tconst relativePath = toHistoryRelativePath({\n\t\t\t\thistoryWorkspacePath,\n\t\t\t\tabsolutePath: fileTarget.absolutePath,\n\t\t\t});\n\t\t\tif (!relativePath) {\n\t\t\t\tthrow new Error('The selected file is outside the resolved repository root');\n\t\t\t}\n\n\t\t\tlet adapter = await resolveHistoryAdapter({\n\t\t\t\tworkspacePath: historyWorkspacePath,\n\t\t\t\trunner,\n\t\t\t});\n\t\t\tlet resolvedWorkspacePath = historyWorkspacePath;\n\t\t\tlet resolvedRelativePath = relativePath;\n\t\t\tlet originalContent = '';\n\t\t\tlet modifiedContent = '';\n\n\t\t\ttry {\n\t\t\t\t[originalContent, modifiedContent] = await Promise.all([\n\t\t\t\t\tadapter.showFileAtRevision({\n\t\t\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\t\t\trevset: base,\n\t\t\t\t\t\tfilePath: resolvedRelativePath,\n\t\t\t\t\t}),\n\t\t\t\t\tadapter.showFileAtRevision({\n\t\t\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\t\t\trevset: target,\n\t\t\t\t\t\tfilePath: resolvedRelativePath,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t} catch (error) {\n\t\t\t\tconst fallback = await resolveJjFileFallback({\n\t\t\t\t\terror,\n\t\t\t\t\tadapter,\n\t\t\t\t\trunner,\n\t\t\t\t\tabsolutePath: fileTarget.absolutePath,\n\t\t\t\t\tbase,\n\t\t\t\t\ttarget,\n\t\t\t\t});\n\t\t\t\tif (!fallback) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\tadapter = fallback.adapter;\n\t\t\t\tresolvedWorkspacePath = fallback.workspacePath;\n\t\t\t\tresolvedRelativePath = fallback.relativePath;\n\t\t\t\t[originalContent, modifiedContent] = await Promise.all([\n\t\t\t\t\tadapter.showFileAtRevision({\n\t\t\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\t\t\trevset: base,\n\t\t\t\t\t\tfilePath: resolvedRelativePath,\n\t\t\t\t\t}),\n\t\t\t\t\tadapter.showFileAtRevision({\n\t\t\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\t\t\trevset: target,\n\t\t\t\t\t\tfilePath: resolvedRelativePath,\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tconst originalUri = provider.createInlineContentUri({\n\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\trevset: base,\n\t\t\t\trelativePath: resolvedRelativePath,\n\t\t\t\tcontent: originalContent,\n\t\t\t});\n\t\t\tconst modifiedUri = provider.createInlineContentUri({\n\t\t\t\tworkspacePath: resolvedWorkspacePath,\n\t\t\t\trevset: target,\n\t\t\t\trelativePath: resolvedRelativePath,\n\t\t\t\tcontent: modifiedContent,\n\t\t\t});\n\n\t\t\tawait vscode.commands.executeCommand('vscode.diff', originalUri, modifiedUri, title, { preview: true });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tvoid vscode.window.showErrorMessage(`Failed to open file diff: ${message}`);\n\t\t}\n\t};\n\n\tconst revisionDiffNav = createRevisionDiffNavigator({\n\t\tshowFile: async ({ workspacePath, revset, filePath }) => {\n\t\t\tconst adapter = await resolveHistoryAdapter({ workspacePath, runner });\n\t\t\treturn adapter.showFileAtRevision({ workspacePath, revset, filePath });\n\t\t},\n\t\tcreateUri: (uriArgs) => provider.createInlineContentUri(uriArgs),\n\t\tlistRevisions: async ({ workspacePath, relativePath, backend }) =>\n\t\t\tlistFileRevisionIds({ runner, workspacePath, relativePath, backend }),\n\t\tresolveBackend: async ({ workspacePath }) => resolveHistoryAdapter({ workspacePath, runner }),\n\t\tresolveHistoryWorkspacePath: async ({ workspacePath }) => resolveHistoryWorkspacePath({ workspacePath, runner }),\n\t\ttoRelativePath: toHistoryRelativePath,\n\t});\n\n\tcontext.subscriptions.push(\n\t\toutputChannel,\n\t\tvscode.workspace.registerTextDocumentContentProvider('jj-plus', provider),\n\t\tvscode.commands.registerCommand(HELPER_COMMAND, openRangeMultiDiff),\n\t\tvscode.commands.registerCommand(OPEN_FILE_RANGE_DIFF_COMMAND, openFileRangeDiff),\n\t\tvscode.commands.registerCommand(OPEN_CHANGES_WITH_PREVIOUS_COMMAND, (arg?: unknown) =>\n\t\t\trevisionDiffNav.openWithPrevious(arg),\n\t\t),\n\t\tvscode.commands.registerCommand(OPEN_REVISION_DIFF_PREVIOUS_COMMAND, () => revisionDiffNav.openPrevious()),\n\t\tvscode.commands.registerCommand(OPEN_REVISION_DIFF_NEXT_COMMAND, () => revisionDiffNav.openNext()),\n\t\tvscode.commands.registerCommand(OPEN_REVISION_DIFF_TIMELINE_COMMAND, () => revisionDiffNav.openTimelineHere()),\n\t\tvscode.commands.registerCommand(OPEN_FILE_TIMELINE_COMMAND, (arg?: unknown) =>\n\t\t\tpanelController.openFileRevisionTimeline({ context, absolutePath: resolveCommandFilePath(arg) }),\n\t\t),\n\t\tvscode.commands.registerCommand(OPEN_REPO_TIMELINE_COMMAND, () => repoTimelineController.open()),\n\t\tvscode.commands.registerCommand(OPEN_FILE_LINE_TIMELINE_COMMAND, async () => {\n\t\t\tconst editor = vscode.window.activeTextEditor;\n\t\t\tif (!editor || editor.document.uri.scheme !== 'file') {\n\t\t\t\tvoid vscode.window.showErrorMessage('Open a workspace file and select lines to browse line history');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst startLine = Math.min(editor.selection.start.line, editor.selection.end.line) + 1;\n\t\t\tconst endLine = Math.max(editor.selection.start.line, editor.selection.end.line) + 1;\n\t\t\tawait panelController.openFileRevisionTimeline({\n\t\t\t\tcontext,\n\t\t\t\tabsolutePath: editor.document.uri.fsPath,\n\t\t\t\tlineHistory: { startLine, endLine },\n\t\t\t});\n\t\t}),\n\t\tvscode.commands.registerCommand(CLEAR_LINE_HISTORY_COMMAND, () => panelController.clearLineHistoryFilter()),\n\t\tvscode.commands.registerCommand(\n\t\t\tOPEN_TIMELINE_AT_LINE_COMMAND,\n\t\t\tasync (args?: { absolutePath?: string; line?: number } | string) => {\n\t\t\t\tconst parsed =\n\t\t\t\t\ttypeof args === 'string' ? (JSON.parse(args) as { absolutePath?: string; line?: number }) : args || {};\n\t\t\t\tconst editor = vscode.window.activeTextEditor;\n\t\t\t\tconst absolutePath = parsed.absolutePath || editor?.document.uri.fsPath;\n\t\t\t\tconst line =\n\t\t\t\t\ttypeof parsed.line === 'number' ? parsed.line : editor ? editor.selection.active.line + 1 : undefined;\n\t\t\t\tif (!absolutePath || !line) {\n\t\t\t\t\tvoid vscode.window.showErrorMessage('Place the cursor on a workspace file line to open timeline');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workspaceFolder = vscode.workspace.getWorkspaceFolder(vscode.Uri.file(absolutePath));\n\t\t\t\tif (!workspaceFolder) {\n\t\t\t\t\tvoid vscode.window.showErrorMessage('The file must belong to a workspace folder');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst relativePath = path.relative(workspaceFolder.uri.fsPath, absolutePath).replace(/\\\\/g, '/');\n\t\t\t\tconst adapter = await resolveHistoryAdapter({\n\t\t\t\t\tworkspacePath: workspaceFolder.uri.fsPath,\n\t\t\t\t\trunner,\n\t\t\t\t});\n\t\t\t\tconst focusRevision = await service.resolveBlameRevisionForLine({\n\t\t\t\t\tworkspacePath: workspaceFolder.uri.fsPath,\n\t\t\t\t\trelativePath,\n\t\t\t\t\tline,\n\t\t\t\t\tbackend: adapter.backend,\n\t\t\t\t});\n\n\t\t\t\tawait panelController.openFileRevisionTimeline({\n\t\t\t\t\tcontext,\n\t\t\t\t\tabsolutePath,\n\t\t\t\t\tlineHistory: { startLine: line, endLine: line },\n\t\t\t\t\tfocusRevision,\n\t\t\t\t});\n\t\t\t},\n\t\t),\n\t\tcreateEditorBlameDecorations({\n\t\t\trunner,\n\t\t\tresolveBackend: async ({ workspacePath }) =>\n\t\t\t\tresolveHistoryAdapter({\n\t\t\t\t\tworkspacePath,\n\t\t\t\t\trunner,\n\t\t\t\t}),\n\t\t}),\n\t\tregisterEditorExtraFeatures({\n\t\t\tcontext,\n\t\t\trunner,\n\t\t\tresolveBackend: async ({ workspacePath }) => resolveHistoryAdapter({ workspacePath, runner }),\n\t\t\tcreateInlineContentUri: (uriArgs) => provider.createInlineContentUri(uriArgs),\n\t\t\tgetRemoteBaseUrl: async ({ workspacePath }) => {\n\t\t\t\tconst adapter = await resolveHistoryAdapter({ workspacePath, runner });\n\t\t\t\treturn adapter.getRemoteBaseUrl({ workspacePath });\n\t\t\t},\n\t\t\tshowFileAtRevision: async ({ workspacePath, revset, filePath }) => {\n\t\t\t\tconst adapter = await resolveHistoryAdapter({ workspacePath, runner });\n\t\t\t\treturn adapter.showFileAtRevision({ workspacePath, revset, filePath });\n\t\t\t},\n\t\t\topenRevisionMultiDiff: async ({ workspacePath, revision }) => {\n\t\t\t\tawait openRevisionMultiDiff({ workspacePath, revision, runner });\n\t\t\t},\n\t\t}),\n\t\trevisionDiffNav,\n\t\tvscode.commands.registerCommand(GET_TIMELINE_DEBUG_STATE_COMMAND, () => panelController.getDebugState()),\n\t\tvscode.commands.registerCommand(GET_DIFF_LAYOUT_METRICS_COMMAND, () => panelController.getDiffLayoutMetrics()),\n\t\tvscode.commands.registerCommand(\n\t\t\tDEBUG_SELECT_TIMELINE_RANGE_COMMAND,\n\t\t\t(args: { fromIndex: number; toIndex: number; comparisonSource?: 'revision' | 'snapshot' }) =>\n\t\t\t\tpanelController.selectTimelineRange(args),\n\t\t),\n\t\tvscode.commands.registerCommand(DEBUG_SET_LAYOUT_MODE_COMMAND, (layoutMode: 'split' | 'unified') =>\n\t\t\tpanelController.setLayoutMode(layoutMode),\n\t\t),\n\t\tvscode.window.registerUriHandler({\n\t\t\tasync handleUri(uri) {\n\t\t\t\tif (!isRangeDiffUriTarget({ uri, extensionId: EXTENSION_ID })) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait openRangeMultiDiff(parseRangeDiffUri(uri));\n\t\t\t},\n\t\t}),\n\t\t{ dispose: () => panelController.dispose() },\n\t\t{ dispose: () => repoTimelineController.dispose() },\n\t);\n\n\tvoid resumePendingRangeDiff({ context, openRangeMultiDiff });\n}\n\nexport function deactivate(): void {}\n\nclass SnapshotContentProvider implements vscode.TextDocumentContentProvider {\n\tprivate readonly runner;\n\tprivate readonly inlineContent = new Map<string, string>();\n\n\tconstructor(args: { runner: ReturnType<typeof createCommandRunner> }) {\n\t\tthis.runner = args.runner;\n\t}\n\n\tcreateInlineContentUri(args: {\n\t\tworkspacePath: string;\n\t\trevset: string;\n\t\trelativePath: string;\n\t\tcontent: string;\n\t}): vscode.Uri {\n\t\tconst contentId = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n\t\tthis.inlineContent.set(contentId, args.content);\n\t\treturn vscode.Uri.from({\n\t\t\tscheme: SNAPSHOT_SCHEME,\n\t\t\tpath: `/${args.relativePath}`,\n\t\t\tquery: JSON.stringify({\n\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\tfilePath: args.relativePath,\n\t\t\t\trevset: args.revset,\n\t\t\t\tcontentId,\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync provideTextDocumentContent(uri: vscode.Uri): Promise<string> {\n\t\tconst query = parseSnapshotUri(uri);\n\t\tif (query.contentId) {\n\t\t\treturn this.inlineContent.get(query.contentId) || '';\n\t\t}\n\n\t\tif (!query.workspacePath || !query.revset || !query.filePath) {\n\t\t\treturn '';\n\t\t}\n\n\t\ttry {\n\t\t\tconst adapter = await resolveHistoryAdapter({\n\t\t\t\tworkspacePath: query.workspacePath,\n\t\t\t\trunner: this.runner,\n\t\t\t});\n\t\t\treturn await adapter.showFileAtRevision({\n\t\t\t\tworkspacePath: query.workspacePath,\n\t\t\t\trevset: query.revset,\n\t\t\t\tfilePath: query.filePath,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn '';\n\t\t}\n\t}\n}\n\nfunction getTimelinePreferences(context: vscode.ExtensionContext): ReturnType<typeof normalizeTimelinePreferences> {\n\tconst rawValue = context.globalState.get(TIMELINE_PREFERENCES_KEY);\n\treturn normalizeTimelinePreferences(rawValue as Record<string, unknown> | undefined);\n}\n\nasync function saveTimelinePreferences(\n\tcontext: vscode.ExtensionContext,\n\tnextPreferences: Record<string, unknown>,\n): Promise<void> {\n\tconst currentPreferences = getTimelinePreferences(context);\n\tawait context.globalState.update(TIMELINE_PREFERENCES_KEY, {\n\t\t...currentPreferences,\n\t\t...nextPreferences,\n\t});\n}\n\nasync function buildWorkspaceMultiDiffResources(args: {\n\trunner: ReturnType<typeof createCommandRunner>;\n\tworkspacePath: string;\n\tbase: string;\n\ttarget: string;\n\ttitle: string;\n}): Promise<{\n\tresolvedTitle: string;\n\tresources: Array<{ originalUri: vscode.Uri; modifiedUri: vscode.Uri }>;\n}> {\n\tlet changedFiles = await listChangedFiles(args);\n\tlet originalRevset = args.base;\n\tlet modifiedRevset = args.target;\n\tlet resolvedTitle = args.title;\n\n\tif (!changedFiles.length && args.target === '@' && args.base !== args.target) {\n\t\tconst revisionFiles = await listRevisionFiles({\n\t\t\trunner: args.runner,\n\t\t\tworkspacePath: args.workspacePath,\n\t\t\trevision: args.base,\n\t\t});\n\t\tif (revisionFiles.length) {\n\t\t\tchangedFiles = revisionFiles;\n\t\t\toriginalRevset = `${args.base}-`;\n\t\t\tmodifiedRevset = args.base;\n\t\t\tif (args.title === `${args.base}..${args.target}`) {\n\t\t\t\tresolvedTitle = args.base;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tresolvedTitle,\n\t\tresources: await Promise.all(\n\t\t\tchangedFiles.map(async (relativePath) => ({\n\t\t\t\toriginalUri: createSnapshotUri({\n\t\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\t\trevset: originalRevset,\n\t\t\t\t\trelativePath,\n\t\t\t\t}),\n\t\t\t\tmodifiedUri: await createTargetUri({\n\t\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\t\trevset: modifiedRevset,\n\t\t\t\t\trelativePath,\n\t\t\t\t}),\n\t\t\t})),\n\t\t),\n\t};\n}\n\nasync function listChangedFiles(args: {\n\trunner: ReturnType<typeof createCommandRunner>;\n\tworkspacePath: string;\n\tbase: string;\n\ttarget: string;\n}): Promise<string[]> {\n\tconst { stdout } = await args.runner.runJj({\n\t\tworkspacePath: args.workspacePath,\n\t\targs: ['diff', '--name-only', '--from', args.base, '--to', args.target],\n\t});\n\n\treturn stdout\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\nasync function listRevisionFiles(args: {\n\trunner: ReturnType<typeof createCommandRunner>;\n\tworkspacePath: string;\n\trevision: string;\n}): Promise<string[]> {\n\tconst { stdout } = await args.runner.runJj({\n\t\tworkspacePath: args.workspacePath,\n\t\targs: ['diff', '--name-only', '-r', args.revision],\n\t});\n\n\treturn stdout\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\nasync function openRevisionMultiDiff(args: {\n\tworkspacePath: string;\n\trevision: string;\n\trunner: ReturnType<typeof createCommandRunner>;\n}): Promise<void> {\n\tconst adapter = await resolveHistoryAdapter({ workspacePath: args.workspacePath, runner: args.runner });\n\tconst files = await adapter.listRevisionFiles({ workspacePath: args.workspacePath, revision: args.revision });\n\tif (!files.length) {\n\t\tvoid vscode.window.showInformationMessage(`No files changed in ${args.revision.slice(0, 12)}`);\n\t\treturn;\n\t}\n\n\tlet parentRevision = `${args.revision}-`;\n\tif (adapter.backend === 'git') {\n\t\ttry {\n\t\t\tconst { stdout } = await args.runner.runGit({\n\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\targs: ['rev-parse', `${args.revision}^`],\n\t\t\t});\n\t\t\tparentRevision = stdout.trim() || 'EMPTY';\n\t\t} catch {\n\t\t\tparentRevision = 'EMPTY';\n\t\t}\n\t}\n\n\tawait vscode.commands.executeCommand(OPEN_MULTI_DIFF_COMMAND, {\n\t\ttitle: `JJ Plus: ${args.revision.slice(0, 12)} · revision diff`,\n\t\tresources: files.map((relativePath) => ({\n\t\t\toriginalUri: createSnapshotUri({\n\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\trevset: parentRevision,\n\t\t\t\trelativePath,\n\t\t\t\tbackend: adapter.backend,\n\t\t\t}),\n\t\t\tmodifiedUri: createSnapshotUri({\n\t\t\t\tworkspacePath: args.workspacePath,\n\t\t\t\trevset: args.revision,\n\t\t\t\trelativePath,\n\t\t\t\tbackend: adapter.backend,\n\t\t\t}),\n\t\t})),\n\t});\n}\n\nasync function createTargetUri(args: {\n\tworkspacePath: string;\n\trevset: string;\n\trelativePath: string;\n}): Promise<vscode.Uri> {\n\tif (args.revset === '@') {\n\t\tconst fileUri = vscode.Uri.file(path.join(args.workspacePath, args.relativePath));\n\t\tif (\n\t\t\tawait vscode.workspace.fs.stat(fileUri).then(\n\t\t\t\t() => true,\n\t\t\t\t() => false,\n\t\t\t)\n\t\t) {\n\t\t\treturn fileUri;\n\t\t}\n\t}\n\n\treturn createSnapshotUri({\n\t\tworkspacePath: args.workspacePath,\n\t\trevset: args.revset,\n\t\trelativePath: args.relativePath,\n\t});\n}\n\nfunction toHistoryRelativePath(args: { historyWorkspacePath: string; absolutePath: string }): string | undefined {\n\tconst relativePath = path.relative(args.historyWorkspacePath, args.absolutePath).replace(/\\\\/g, '/');\n\tif (!relativePath || relativePath.startsWith('..')) {\n\t\treturn undefined;\n\t}\n\n\treturn relativePath;\n}\n\nasync function resolveJjFileFallback(args: {\n\terror: unknown;\n\tadapter: Awaited<ReturnType<typeof resolveHistoryAdapter>>;\n\trunner: ReturnType<typeof createCommandRunner>;\n\tabsolutePath: string;\n\tbase: string;\n\ttarget: string;\n}): Promise<\n\t| {\n\t\t\tadapter: Awaited<ReturnType<typeof resolveHistoryAdapter>>;\n\t\t\tworkspacePath: string;\n\t\t\trelativePath: string;\n\t }\n\t| undefined\n> {\n\tif (args.adapter.backend !== 'git') {\n\t\treturn undefined;\n\t}\n\n\tif (!looksLikeGitRejectedJjRevset({ error: args.error, base: args.base, target: args.target })) {\n\t\treturn undefined;\n\t}\n\n\tconst preferredWorkspacePath = path.dirname(args.absolutePath);\n\tconst { stdout } = await args.runner.runJj({\n\t\tworkspacePath: preferredWorkspacePath,\n\t\targs: ['root'],\n\t});\n\tconst jjRoot = stdout.trim();\n\tif (!jjRoot) {\n\t\treturn undefined;\n\t}\n\n\tconst relativePath = toHistoryRelativePath({\n\t\thistoryWorkspacePath: jjRoot,\n\t\tabsolutePath: args.absolutePath,\n\t});\n\tif (!relativePath) {\n\t\treturn undefined;\n\t}\n\n\tconst adapter = await resolveHistoryAdapter({\n\t\tworkspacePath: jjRoot,\n\t\trunner: args.runner,\n\t});\n\tif (adapter.backend !== 'jj') {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tadapter,\n\t\tworkspacePath: jjRoot,\n\t\trelativePath,\n\t};\n}\n\nfunction looksLikeGitRejectedJjRevset(args: { error: unknown; base: string; target: string }): boolean {\n\tconst errorMessage = args.error instanceof Error ? args.error.message : String(args.error || '');\n\tconst gitRejectedRevision = /invalid\\s+object\\s+name|unknown\\s+revision|ambiguous\\s+argument/iu.test(errorMessage);\n\tif (!gitRejectedRevision) {\n\t\treturn false;\n\t}\n\n\treturn [args.base, args.target].some((candidate) => isLikelyJjRevset(candidate));\n}\n\nfunction isLikelyJjRevset(value: string): boolean {\n\tconst revset = value.trim();\n\tif (!revset) {\n\t\treturn false;\n\t}\n\n\tif (revset.includes('closest_bookmark(') || revset.includes('latest(') || revset.includes('::')) {\n\t\treturn true;\n\t}\n\n\tif (revset === '@' || revset.startsWith('@-') || revset.startsWith('@+')) {\n\t\treturn true;\n\t}\n\n\treturn /^@[0-9]+$/u.test(revset);\n}\n\nasync function resolveFileDiffTarget(args: {\n\tworkspaceUri: vscode.Uri;\n\tabsolutePath?: string;\n}): Promise<WorkspaceFileTarget | undefined> {\n\tconst explicitTarget = getWorkspaceFileTargetFromAbsolutePath(args);\n\tif (explicitTarget) {\n\t\treturn explicitTarget;\n\t}\n\n\tconst activeEditorTarget = getActiveWorkspaceFileTarget(args.workspaceUri);\n\tif (activeEditorTarget) {\n\t\treturn activeEditorTarget;\n\t}\n\n\treturn pickOpenWorkspaceFileTarget(args.workspaceUri);\n}\n\nfunction getWorkspaceFileTargetFromAbsolutePath(args: {\n\tworkspaceUri: vscode.Uri;\n\tabsolutePath?: string;\n}): WorkspaceFileTarget | undefined {\n\tconst trimmedPath = args.absolutePath?.trim();\n\tif (!trimmedPath) {\n\t\treturn undefined;\n\t}\n\n\treturn toWorkspaceFileTarget({\n\t\tworkspaceUri: args.workspaceUri,\n\t\tfileUri: vscode.Uri.file(trimmedPath),\n\t});\n}\n\nfunction getActiveWorkspaceFileTarget(workspaceUri: vscode.Uri): WorkspaceFileTarget | undefined {\n\tconst activeEditor = vscode.window.activeTextEditor;\n\tif (!activeEditor) {\n\t\treturn undefined;\n\t}\n\n\treturn toWorkspaceFileTarget({\n\t\tworkspaceUri,\n\t\tfileUri: activeEditor.document.uri,\n\t});\n}\n\nasync function pickOpenWorkspaceFileTarget(workspaceUri: vscode.Uri): Promise<WorkspaceFileTarget | undefined> {\n\tconst candidates = getOpenWorkspaceFileTargets(workspaceUri);\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.fileName,\n\t\t\tdescription: candidate.relativePath,\n\t\t\tdetail: path.dirname(candidate.relativePath) === '.' ? undefined : path.dirname(candidate.relativePath),\n\t\t\ttarget: candidate,\n\t\t})),\n\t\t{\n\t\t\tplaceHolder: 'Select a workspace file to diff between revisions',\n\t\t},\n\t);\n\n\treturn selection?.target;\n}\n\nfunction getOpenWorkspaceFileTargets(workspaceUri: vscode.Uri): WorkspaceFileTarget[] {\n\tconst candidates: WorkspaceFileTarget[] = [];\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 absolutePath = uri.fsPath;\n\t\t\tif (seenPaths.has(absolutePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst target = toWorkspaceFileTarget({ workspaceUri, fileUri: uri });\n\t\t\tif (!target) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tseenPaths.add(absolutePath);\n\t\t\tcandidates.push(target);\n\t\t}\n\t}\n\n\treturn candidates;\n}\n\nfunction toWorkspaceFileTarget(args: {\n\tworkspaceUri: vscode.Uri;\n\tfileUri: vscode.Uri;\n}): WorkspaceFileTarget | undefined {\n\tif (args.fileUri.scheme !== 'file') {\n\t\treturn undefined;\n\t}\n\n\tconst workspaceFolder = vscode.workspace.getWorkspaceFolder(args.fileUri);\n\tif (!workspaceFolder || !areSamePath({ left: workspaceFolder.uri.fsPath, right: args.workspaceUri.fsPath })) {\n\t\treturn undefined;\n\t}\n\n\tconst relativePath = path.relative(args.workspaceUri.fsPath, args.fileUri.fsPath).replace(/\\\\/g, '/');\n\tif (!relativePath || relativePath.startsWith('..')) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tabsolutePath: args.fileUri.fsPath,\n\t\trelativePath,\n\t\tfileName: path.basename(args.fileUri.fsPath),\n\t};\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\nasync function resolveWorkspaceUri(args: {\n\tcontext: vscode.ExtensionContext;\n\targs?: RangeDiffArgs;\n}): Promise<vscode.Uri | 'redirected' | undefined> {\n\tconst explicitUri = getExplicitWorkspaceUri(args.args?.workspacePath);\n\tif (explicitUri) {\n\t\tconst openWorkspaceUri = getOpenWorkspaceUri(explicitUri);\n\t\tif (openWorkspaceUri) {\n\t\t\treturn openWorkspaceUri;\n\t\t}\n\n\t\tawait args.context.globalState.update(PENDING_RANGE_DIFF_KEY, sanitizeRangeDiffArgs(args.args));\n\t\tawait vscode.commands.executeCommand('vscode.openFolder', explicitUri, {\n\t\t\tforceReuseWindow: true,\n\t\t\tnoRecentEntry: true,\n\t\t});\n\n\t\treturn 'redirected';\n\t}\n\n\tconst activeEditorFolder = vscode.window.activeTextEditor\n\t\t? vscode.workspace.getWorkspaceFolder(vscode.window.activeTextEditor.document.uri)\n\t\t: undefined;\n\tif (activeEditorFolder) {\n\t\treturn activeEditorFolder.uri;\n\t}\n\n\tif (vscode.workspace.workspaceFolders?.length === 1) {\n\t\treturn vscode.workspace.workspaceFolders[0].uri;\n\t}\n\n\tif (!vscode.workspace.workspaceFolders?.length) {\n\t\treturn undefined;\n\t}\n\n\tconst selected = await vscode.window.showWorkspaceFolderPick({\n\t\tplaceHolder: 'Select the workspace to open the JJ Plus range diff in',\n\t});\n\treturn selected?.uri;\n}\n\nasync function resumePendingRangeDiff(args: {\n\tcontext: vscode.ExtensionContext;\n\topenRangeMultiDiff: (rangeDiffArgs?: RangeDiffArgs) => Promise<void>;\n}): Promise<void> {\n\tconst pendingArgs = args.context.globalState.get(PENDING_RANGE_DIFF_KEY) as RangeDiffArgs | undefined;\n\tif (!pendingArgs) {\n\t\treturn;\n\t}\n\n\tconst explicitUri = getExplicitWorkspaceUri(pendingArgs.workspacePath);\n\tif (!explicitUri) {\n\t\tawait args.context.globalState.update(PENDING_RANGE_DIFF_KEY, undefined);\n\t\treturn;\n\t}\n\n\tif (!getOpenWorkspaceUri(explicitUri)) {\n\t\treturn;\n\t}\n\n\tawait args.context.globalState.update(PENDING_RANGE_DIFF_KEY, undefined);\n\tawait args.openRangeMultiDiff(pendingArgs);\n}\n\nfunction getExplicitWorkspaceUri(workspacePath: string | undefined): vscode.Uri | undefined {\n\tconst trimmed = workspacePath?.trim();\n\treturn trimmed ? vscode.Uri.file(trimmed) : undefined;\n}\n\nfunction getOpenWorkspaceUri(explicitUri: vscode.Uri): vscode.Uri | undefined {\n\tconst matchingFolder = vscode.workspace.workspaceFolders?.find((folder) =>\n\t\tareSamePath({ left: folder.uri.fsPath, right: explicitUri.fsPath }),\n\t);\n\treturn matchingFolder?.uri;\n}\n\nfunction getFromValue(args?: RangeDiffArgs): string {\n\treturn args?.from?.trim() || args?.base?.trim() || DEFAULT_FROM_REVSET;\n}\n\nfunction getToValue(args?: RangeDiffArgs): string {\n\treturn args?.to?.trim() || args?.target?.trim() || DEFAULT_TO_REVSET;\n}\n\nfunction shouldPromptForInputs(args?: RangeDiffArgs): boolean {\n\treturn args?.source !== CLI_SOURCE || args?.confirm === true;\n}\n\nasync function resolveInput(args: {\n\tvalue?: string;\n\tprompt: string;\n\tplaceHolder: string;\n}): Promise<string | undefined> {\n\tconst input = await vscode.window.showInputBox({\n\t\tprompt: args.prompt,\n\t\tplaceHolder: args.placeHolder,\n\t\tvalue: args.value?.trim() || args.placeHolder,\n\t\tignoreFocusOut: true,\n\t\tvalidateInput(value) {\n\t\t\treturn value.trim() ? undefined : 'Value is required';\n\t\t},\n\t});\n\n\treturn input?.trim() || undefined;\n}\n"],"mappings":"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"}
@@ -0,0 +1,402 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_history_adapters = require("./history-adapters.cjs");
3
+ const require_timeline_template = require("../webview/timeline-template.cjs");
4
+ let node_fs = require("node:fs");
5
+ node_fs = require_runtime.__toESM(node_fs, 1);
6
+ let node_path = require("node:path");
7
+ node_path = require_runtime.__toESM(node_path, 1);
8
+ let vscode = require("vscode");
9
+ vscode = require_runtime.__toESM(vscode, 1);
10
+ //#region src/extension/repo-timeline-panel.ts
11
+ function post(panel, message) {
12
+ return panel.webview.postMessage(message);
13
+ }
14
+ function shortDate(timestamp) {
15
+ if (!timestamp) return "";
16
+ return new Intl.DateTimeFormat(void 0, {
17
+ month: "short",
18
+ day: "numeric"
19
+ }).format(timestamp * 1e3);
20
+ }
21
+ function relativeDate(timestamp) {
22
+ if (!timestamp) return "";
23
+ const seconds = Math.max(0, Date.now() / 1e3 - timestamp);
24
+ if (seconds < 60) return "just now";
25
+ const units = [
26
+ [60, "minute"],
27
+ [3600, "hour"],
28
+ [86400, "day"],
29
+ [604800, "week"],
30
+ [2592e3, "month"],
31
+ [31536e3, "year"]
32
+ ];
33
+ let selected = units[0];
34
+ for (const unit of units) {
35
+ if (seconds < unit[0]) break;
36
+ selected = unit;
37
+ }
38
+ const count = Math.floor(seconds / selected[0]);
39
+ return `${count} ${selected[1]}${count === 1 ? "" : "s"} ago`;
40
+ }
41
+ function mapEntry(entry, index, remoteBaseUrl) {
42
+ return {
43
+ ...entry,
44
+ index,
45
+ shortDate: shortDate(entry.timestamp),
46
+ relativeDate: relativeDate(entry.timestamp),
47
+ remoteUrl: remoteBaseUrl && !entry.isWorkingTree ? `${remoteBaseUrl}/commit/${entry.revision}` : void 0
48
+ };
49
+ }
50
+ function parseDiffFiles(patch) {
51
+ const files = /* @__PURE__ */ new Set();
52
+ for (const line of patch.split(/\r?\n/u)) {
53
+ const match = /^diff --git a\/(.+) b\/(.+)$/u.exec(line);
54
+ if (match) files.add(match[2]);
55
+ }
56
+ return [...files];
57
+ }
58
+ function matchesText(value, query, mode) {
59
+ if (!query) return true;
60
+ if (mode === "regex") try {
61
+ return new RegExp(query, "iu").test(value);
62
+ } catch {
63
+ return false;
64
+ }
65
+ if (mode === "fuzzy") {
66
+ let cursor = 0;
67
+ const loweredValue = value.toLocaleLowerCase();
68
+ for (const character of query.toLocaleLowerCase()) {
69
+ cursor = loweredValue.indexOf(character, cursor);
70
+ if (cursor < 0) return false;
71
+ cursor += 1;
72
+ }
73
+ return true;
74
+ }
75
+ return value.toLocaleLowerCase().includes(query.toLocaleLowerCase());
76
+ }
77
+ function timestampInRange(timestamp, request) {
78
+ const after = request.after ? Date.parse(request.after) / 1e3 : Number.NEGATIVE_INFINITY;
79
+ const until = request.until ? Date.parse(request.until) / 1e3 + 86399 : Number.POSITIVE_INFINITY;
80
+ return (!Number.isFinite(after) || timestamp >= after) && (!Number.isFinite(until) || timestamp <= until);
81
+ }
82
+ function metadataMatches(entry, request) {
83
+ if (!timestampInRange(entry.timestamp, request)) return false;
84
+ if (request.path && entry.filePath && !entry.filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) return false;
85
+ return matchesText([
86
+ entry.revision,
87
+ entry.changeId,
88
+ entry.description,
89
+ entry.authorName,
90
+ ...entry.bookmarkNames ?? [],
91
+ ...entry.branchNames ?? []
92
+ ].filter(Boolean).join("\n"), request.query.trim(), request.matchMode);
93
+ }
94
+ function addedLineMatches(patch, request) {
95
+ const results = [];
96
+ let filePath = "";
97
+ let line = 0;
98
+ for (const rawLine of patch.split(/\r?\n/u)) {
99
+ const fileHeader = /^\+\+\+ b\/(.+)$/u.exec(rawLine);
100
+ if (fileHeader) {
101
+ filePath = fileHeader[1] ?? "";
102
+ continue;
103
+ }
104
+ if (rawLine.startsWith("@@")) {
105
+ const match = /\+(\d+)/u.exec(rawLine);
106
+ line = match ? Number(match[1]) : 0;
107
+ continue;
108
+ }
109
+ if (rawLine.startsWith("+") && !rawLine.startsWith("+++")) {
110
+ const detail = rawLine.slice(1);
111
+ if ((!request.path || filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) && matchesText(detail, request.query.trim(), request.matchMode)) results.push({
112
+ filePath,
113
+ line,
114
+ detail
115
+ });
116
+ line += 1;
117
+ continue;
118
+ }
119
+ if (rawLine.startsWith(" ")) line += 1;
120
+ }
121
+ return results;
122
+ }
123
+ function revisionParent(adapterBackend, revision) {
124
+ return adapterBackend === "jj" ? `${revision}-` : `${revision}^`;
125
+ }
126
+ function getRepoWebviewHtml(args) {
127
+ const stylePath = vscode.Uri.joinPath(args.context.extensionUri, "webview-dist", "timeline-app.css");
128
+ const scriptPath = vscode.Uri.joinPath(args.context.extensionUri, "webview-dist", "repo-timeline-app.js");
129
+ const workerPath = vscode.Uri.joinPath(args.context.extensionUri, "webview-dist", "pierre-worker-portable.js");
130
+ if (!node_fs.default.existsSync(stylePath.fsPath) || !node_fs.default.existsSync(scriptPath.fsPath)) return "<!doctype html><html lang=\"en\"><body><p>Repo Timeline bundle is missing. Run pnpm build:webview and reopen it.</p></body></html>";
131
+ return require_timeline_template.renderTimelineDocumentHtml({
132
+ title: "Repo Timeline",
133
+ cspSource: args.webview.cspSource,
134
+ styleHref: String(args.webview.asWebviewUri(stylePath)),
135
+ appSrc: String(args.webview.asWebviewUri(scriptPath)),
136
+ workerSrc: String(args.webview.asWebviewUri(workerPath))
137
+ });
138
+ }
139
+ function createRepoTimelinePanelController(args) {
140
+ const panels = /* @__PURE__ */ new Map();
141
+ return {
142
+ dispose() {
143
+ for (const panel of panels.keys()) panel.dispose();
144
+ panels.clear();
145
+ },
146
+ async open() {
147
+ const workspaceFolder = resolveWorkspaceFolder();
148
+ if (!workspaceFolder) {
149
+ vscode.window.showErrorMessage("Open a workspace folder to browse its repository timeline");
150
+ return;
151
+ }
152
+ const preferredRoot = await require_history_adapters.resolveHistoryWorkspacePath({
153
+ workspacePath: workspaceFolder.uri.fsPath,
154
+ runner: args.runner
155
+ });
156
+ const adapter = await require_history_adapters.resolveHistoryAdapter({
157
+ workspacePath: preferredRoot,
158
+ runner: args.runner
159
+ });
160
+ const panel = vscode.window.createWebviewPanel("jjPlusRepoTimeline", `Repo Timeline: ${node_path.default.basename(preferredRoot)}`, vscode.ViewColumn.Active, {
161
+ enableScripts: true,
162
+ retainContextWhenHidden: true,
163
+ enableFindWidget: true,
164
+ localResourceRoots: [vscode.Uri.joinPath(args.context.extensionUri, "webview-dist")]
165
+ });
166
+ panel.webview.html = getRepoWebviewHtml({
167
+ context: args.context,
168
+ webview: panel.webview
169
+ });
170
+ panels.set(panel, {
171
+ workspacePath: preferredRoot,
172
+ adapter,
173
+ entries: []
174
+ });
175
+ panel.onDidDispose(() => panels.delete(panel), void 0, args.context.subscriptions);
176
+ panel.webview.onDidReceiveMessage((message) => void handleCommand(panel, message).catch((error) => sendError(panel, error)), void 0, args.context.subscriptions);
177
+ }
178
+ };
179
+ async function handleCommand(panel, rawMessage) {
180
+ const state = panels.get(panel);
181
+ if (!state || !rawMessage || typeof rawMessage !== "object") return;
182
+ const command = Reflect.get(rawMessage, "command");
183
+ if (command === "ready" || command === "refresh") {
184
+ await load(panel, state, command === "refresh" ? String(Reflect.get(rawMessage, "revset") || "ancestors(@)") : "ancestors(@)");
185
+ return;
186
+ }
187
+ if (command === "select-revision") {
188
+ const index = Number(Reflect.get(rawMessage, "index"));
189
+ const entry = state.entries[index];
190
+ if (!entry) return;
191
+ await post(panel, {
192
+ type: "repo-timeline-diff",
193
+ payload: await buildDiff(state, entry)
194
+ });
195
+ return;
196
+ }
197
+ if (command === "search") {
198
+ await post(panel, {
199
+ type: "repo-timeline-search",
200
+ payload: await search(state, Reflect.get(rawMessage, "request"))
201
+ });
202
+ return;
203
+ }
204
+ if (command === "open-revision-remote") {
205
+ const index = Number(Reflect.get(rawMessage, "index"));
206
+ const url = state.entries[index]?.remoteUrl;
207
+ if (url) await vscode.env.openExternal(vscode.Uri.parse(url));
208
+ return;
209
+ }
210
+ if (command === "open-file-result") {
211
+ const entryIndex = Number(Reflect.get(rawMessage, "entryIndex"));
212
+ const filePath = String(Reflect.get(rawMessage, "filePath") || "").replaceAll("\\", "/");
213
+ const line = Math.max(1, Number(Reflect.get(rawMessage, "line")) || 1);
214
+ const entry = state.entries[entryIndex];
215
+ if (!entry || !filePath || node_path.default.isAbsolute(filePath) || filePath.split("/").includes("..")) return;
216
+ const uri = vscode.Uri.from({
217
+ scheme: "jj-plus",
218
+ path: `/${filePath}`,
219
+ query: JSON.stringify({
220
+ workspacePath: state.workspacePath,
221
+ filePath,
222
+ revset: entry.revision
223
+ })
224
+ });
225
+ const document = await vscode.workspace.openTextDocument(uri);
226
+ const editor = await vscode.window.showTextDocument(document, { preview: true });
227
+ const position = new vscode.Position(Math.min(line - 1, Math.max(0, document.lineCount - 1)), 0);
228
+ editor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.InCenter);
229
+ }
230
+ }
231
+ async function load(panel, state, revset) {
232
+ const entries = await state.adapter.getRepositoryRevisionHistory({
233
+ workspacePath: state.workspacePath,
234
+ limit: 200,
235
+ customRevset: revset
236
+ });
237
+ const remoteBaseUrl = await state.adapter.getRemoteBaseUrl({ workspacePath: state.workspacePath });
238
+ state.entries = entries.map((entry, index) => mapEntry(entry, index, remoteBaseUrl));
239
+ await post(panel, {
240
+ type: "repo-timeline-data",
241
+ payload: {
242
+ backend: state.adapter.backend,
243
+ workspacePath: state.workspacePath,
244
+ repositoryName: node_path.default.basename(state.workspacePath),
245
+ version: args.version,
246
+ entries: state.entries,
247
+ bookmarks: [...new Set(state.entries.flatMap((entry) => [...entry.bookmarkNames ?? [], ...entry.branchNames ?? []]))].toSorted(),
248
+ truncated: state.entries.length >= 200
249
+ }
250
+ });
251
+ const first = state.entries.at(-1);
252
+ if (first) await post(panel, {
253
+ type: "repo-timeline-diff",
254
+ payload: await buildDiff(state, first)
255
+ });
256
+ }
257
+ async function buildDiff(state, entry) {
258
+ const patch = await state.adapter.getRevisionDiff({
259
+ workspacePath: state.workspacePath,
260
+ revision: entry.revision
261
+ });
262
+ const paths = await state.adapter.listRevisionFiles({
263
+ workspacePath: state.workspacePath,
264
+ revision: entry.revision
265
+ });
266
+ const files = paths.length ? paths : parseDiffFiles(patch);
267
+ const parent = revisionParent(state.adapter.backend, entry.revision);
268
+ const fileDiffs = [];
269
+ for (const filePath of files) {
270
+ const [before, after] = await Promise.all([readFileAtRevision(state, parent, filePath), readFileAtRevision(state, entry.revision, filePath)]);
271
+ fileDiffs.push({
272
+ path: filePath,
273
+ before,
274
+ after
275
+ });
276
+ }
277
+ return {
278
+ revision: entry.revision,
279
+ patch,
280
+ files: fileDiffs
281
+ };
282
+ }
283
+ async function search(state, request) {
284
+ const query = request.query.trim();
285
+ if (request.mode === "all") {
286
+ const [metadata, changes, snapshot] = await Promise.all([
287
+ search(state, {
288
+ ...request,
289
+ mode: "metadata"
290
+ }),
291
+ search(state, {
292
+ ...request,
293
+ mode: "changes"
294
+ }),
295
+ search(state, {
296
+ ...request,
297
+ mode: "snapshot"
298
+ })
299
+ ]);
300
+ const results = [
301
+ ...metadata.results,
302
+ ...changes.results,
303
+ ...snapshot.results
304
+ ].slice(0, 500);
305
+ return {
306
+ requestId: request.requestId,
307
+ mode: request.mode,
308
+ results,
309
+ truncated: metadata.truncated || changes.truncated || snapshot.truncated || results.length < metadata.results.length + changes.results.length + snapshot.results.length
310
+ };
311
+ }
312
+ if (request.mode === "metadata") return {
313
+ requestId: request.requestId,
314
+ mode: request.mode,
315
+ results: state.entries.flatMap((entry, entryIndex) => metadataMatches(entry, {
316
+ ...request,
317
+ query
318
+ }) ? [{
319
+ entryIndex,
320
+ lane: "metadata"
321
+ }] : []),
322
+ truncated: false
323
+ };
324
+ if (!query) return {
325
+ requestId: request.requestId,
326
+ mode: request.mode,
327
+ results: [],
328
+ truncated: false
329
+ };
330
+ const results = [];
331
+ const candidates = state.entries.filter((entry) => timestampInRange(entry.timestamp, request));
332
+ if (request.mode === "changes") for (const entry of candidates) {
333
+ const patch = await state.adapter.getRevisionDiff({
334
+ workspacePath: state.workspacePath,
335
+ revision: entry.revision
336
+ });
337
+ for (const match of addedLineMatches(patch, request)) results.push({
338
+ entryIndex: entry.index,
339
+ lane: "changes",
340
+ filePath: match.filePath,
341
+ line: match.line,
342
+ detail: match.detail
343
+ });
344
+ }
345
+ else {
346
+ const entry = state.entries[request.selectedIndex ?? state.entries.length - 1];
347
+ if (entry) {
348
+ const files = await state.adapter.listRevisionTreeFiles({
349
+ workspacePath: state.workspacePath,
350
+ revision: entry.revision
351
+ });
352
+ for (const filePath of files) {
353
+ if (request.path && !filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) continue;
354
+ const content = await readFileAtRevision(state, entry.revision, filePath);
355
+ for (const [lineIndex, detail] of content.split(/\r?\n/u).entries()) if (matchesText(detail, query, request.matchMode)) results.push({
356
+ entryIndex: entry.index,
357
+ lane: "snapshot",
358
+ filePath,
359
+ line: lineIndex + 1,
360
+ detail
361
+ });
362
+ }
363
+ }
364
+ }
365
+ const limit = 500;
366
+ return {
367
+ requestId: request.requestId,
368
+ mode: request.mode,
369
+ results: results.slice(0, limit),
370
+ truncated: results.length > limit
371
+ };
372
+ }
373
+ async function readFileAtRevision(state, revset, filePath) {
374
+ try {
375
+ return await state.adapter.showFileAtRevision({
376
+ workspacePath: state.workspacePath,
377
+ revset,
378
+ filePath
379
+ });
380
+ } catch {
381
+ return "";
382
+ }
383
+ }
384
+ }
385
+ function resolveWorkspaceFolder() {
386
+ const editor = vscode.window.activeTextEditor;
387
+ if (editor?.document.uri.scheme === "file") {
388
+ const folder = vscode.workspace.getWorkspaceFolder(editor.document.uri);
389
+ if (folder) return folder;
390
+ }
391
+ return vscode.workspace.workspaceFolders?.[0];
392
+ }
393
+ function sendError(panel, error) {
394
+ post(panel, {
395
+ type: "repo-timeline-error",
396
+ payload: { message: error instanceof Error ? error.message : String(error) }
397
+ });
398
+ }
399
+ //#endregion
400
+ exports.createRepoTimelinePanelController = createRepoTimelinePanelController;
401
+
402
+ //# sourceMappingURL=repo-timeline-panel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-timeline-panel.cjs","names":["fsSync","renderTimelineDocumentHtml","resolveHistoryWorkspacePath","resolveHistoryAdapter","path"],"sources":["../../src/extension/repo-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\tRepoRevisionEntry,\n\tRepoTimelineCommand,\n\tRepoTimelineData,\n\tRepoTimelineDiff,\n\tRepoTimelineDiffFile,\n\tRepoTimelineInboundMessage,\n\tRepoTimelineSearchPayload,\n\tRepoTimelineSearchRequest,\n\tRepoTimelineSearchResult,\n} from '../shared/repo-timeline-types.ts';\nimport type { FileRevisionEntry } from '../shared/timeline-types.ts';\nimport { resolveHistoryAdapter, resolveHistoryWorkspacePath } from './history-adapters.ts';\nimport type { CommandRunner } from './types.ts';\n\ntype RepoPanelState = {\n\tworkspacePath: string;\n\tadapter: Awaited<ReturnType<typeof resolveHistoryAdapter>>;\n\tentries: Array<RepoRevisionEntry>;\n};\n\nfunction post(panel: vscode.WebviewPanel, message: RepoTimelineInboundMessage): Thenable<boolean> {\n\treturn panel.webview.postMessage(message);\n}\n\nfunction shortDate(timestamp: number): string {\n\tif (!timestamp) {\n\t\treturn '';\n\t}\n\treturn new Intl.DateTimeFormat(undefined, { month: 'short', day: 'numeric' }).format(timestamp * 1000);\n}\n\nfunction relativeDate(timestamp: number): string {\n\tif (!timestamp) {\n\t\treturn '';\n\t}\n\tconst seconds = Math.max(0, Date.now() / 1000 - timestamp);\n\tif (seconds < 60) return 'just now';\n\tconst units: Array<[number, string]> = [\n\t\t[60, 'minute'],\n\t\t[3600, 'hour'],\n\t\t[86400, 'day'],\n\t\t[604800, 'week'],\n\t\t[2592000, 'month'],\n\t\t[31536000, 'year'],\n\t];\n\tlet selected = units[0];\n\tfor (const unit of units) {\n\t\tif (seconds < unit[0]) break;\n\t\tselected = unit;\n\t}\n\tconst count = Math.floor(seconds / selected[0]);\n\treturn `${count} ${selected[1]}${count === 1 ? '' : 's'} ago`;\n}\n\nfunction mapEntry(entry: FileRevisionEntry, index: number, remoteBaseUrl?: string): RepoRevisionEntry {\n\treturn {\n\t\t...entry,\n\t\tindex,\n\t\tshortDate: shortDate(entry.timestamp),\n\t\trelativeDate: relativeDate(entry.timestamp),\n\t\tremoteUrl: remoteBaseUrl && !entry.isWorkingTree ? `${remoteBaseUrl}/commit/${entry.revision}` : undefined,\n\t};\n}\n\nfunction parseDiffFiles(patch: string): Array<string> {\n\tconst files = new Set<string>();\n\tfor (const line of patch.split(/\\r?\\n/u)) {\n\t\tconst match = /^diff --git a\\/(.+) b\\/(.+)$/u.exec(line);\n\t\tif (match) {\n\t\t\tfiles.add(match[2]);\n\t\t}\n\t}\n\treturn [...files];\n}\n\nfunction matchesText(value: string, query: string, mode: RepoTimelineSearchRequest['matchMode']): boolean {\n\tif (!query) return true;\n\tif (mode === 'regex') {\n\t\ttry {\n\t\t\treturn new RegExp(query, 'iu').test(value);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (mode === 'fuzzy') {\n\t\tlet cursor = 0;\n\t\tconst loweredValue = value.toLocaleLowerCase();\n\t\tfor (const character of query.toLocaleLowerCase()) {\n\t\t\tcursor = loweredValue.indexOf(character, cursor);\n\t\t\tif (cursor < 0) return false;\n\t\t\tcursor += 1;\n\t\t}\n\t\treturn true;\n\t}\n\treturn value.toLocaleLowerCase().includes(query.toLocaleLowerCase());\n}\n\nfunction timestampInRange(timestamp: number, request: RepoTimelineSearchRequest): boolean {\n\tconst after = request.after ? Date.parse(request.after) / 1000 : Number.NEGATIVE_INFINITY;\n\tconst until = request.until ? Date.parse(request.until) / 1000 + 86_399 : Number.POSITIVE_INFINITY;\n\treturn (!Number.isFinite(after) || timestamp >= after) && (!Number.isFinite(until) || timestamp <= until);\n}\n\nfunction metadataMatches(entry: RepoRevisionEntry, request: RepoTimelineSearchRequest): boolean {\n\tif (!timestampInRange(entry.timestamp, request)) return false;\n\t// Repository entries are not file-scoped. Keep the path filter meaningful for\n\t// any adapter-provided file entry, but do not make metadata searches silently\n\t// return nothing just because the entry has no filePath.\n\tif (request.path && entry.filePath && !entry.filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) return false;\n\tconst haystack = [\n\t\tentry.revision,\n\t\tentry.changeId,\n\t\tentry.description,\n\t\tentry.authorName,\n\t\t...(entry.bookmarkNames ?? []),\n\t\t...(entry.branchNames ?? []),\n\t].filter(Boolean).join('\\n');\n\treturn matchesText(haystack, request.query.trim(), request.matchMode);\n}\n\nfunction addedLineMatches(patch: string, request: RepoTimelineSearchRequest): Array<{ filePath: string; line: number; detail: string }> {\n\tconst results: Array<{ filePath: string; line: number; detail: string }> = [];\n\tlet filePath = '';\n\tlet line = 0;\n\tfor (const rawLine of patch.split(/\\r?\\n/u)) {\n\t\tconst fileHeader = /^\\+\\+\\+ b\\/(.+)$/u.exec(rawLine);\n\t\tif (fileHeader) {\n\t\t\tfilePath = fileHeader[1] ?? '';\n\t\t\tcontinue;\n\t\t}\n\t\tif (rawLine.startsWith('@@')) {\n\t\t\tconst match = /\\+(\\d+)/u.exec(rawLine);\n\t\t\tline = match ? Number(match[1]) : 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (rawLine.startsWith('+') && !rawLine.startsWith('+++')) {\n\t\t\tconst detail = rawLine.slice(1);\n\t\t\tif ((!request.path || filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) && matchesText(detail, request.query.trim(), request.matchMode)) {\n\t\t\t\tresults.push({ filePath, line, detail });\n\t\t\t}\n\t\t\tline += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (rawLine.startsWith(' ')) line += 1;\n\t}\n\treturn results;\n}\n\nfunction revisionParent(adapterBackend: string, revision: string): string {\n\treturn adapterBackend === 'jj' ? `${revision}-` : `${revision}^`;\n}\n\nfunction getRepoWebviewHtml(args: { context: vscode.ExtensionContext; webview: vscode.Webview }): string {\n\t// Vite currently emits one shared stylesheet because cssCodeSplit is disabled\n\t// for the Pierre timeline. The repo view's styles are included in it too.\n\tconst stylePath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'timeline-app.css');\n\tconst scriptPath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'repo-timeline-app.js');\n\tconst workerPath = vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist', 'pierre-worker-portable.js');\n\tif (!fsSync.existsSync(stylePath.fsPath) || !fsSync.existsSync(scriptPath.fsPath)) {\n\t\treturn '<!doctype html><html lang=\"en\"><body><p>Repo Timeline bundle is missing. Run pnpm build:webview and reopen it.</p></body></html>';\n\t}\n\treturn renderTimelineDocumentHtml({\n\t\ttitle: 'Repo Timeline',\n\t\tcspSource: args.webview.cspSource,\n\t\tstyleHref: String(args.webview.asWebviewUri(stylePath)),\n\t\tappSrc: String(args.webview.asWebviewUri(scriptPath)),\n\t\tworkerSrc: String(args.webview.asWebviewUri(workerPath)),\n\t});\n}\n\nexport function createRepoTimelinePanelController(args: {\n\tcontext: vscode.ExtensionContext;\n\trunner: CommandRunner;\n\tversion: string;\n}) {\n\tconst panels = new Map<vscode.WebviewPanel, RepoPanelState>();\n\n\treturn {\n\t\tdispose() {\n\t\t\tfor (const panel of panels.keys()) panel.dispose();\n\t\t\tpanels.clear();\n\t\t},\n\t\tasync open() {\n\t\t\tconst workspaceFolder = resolveWorkspaceFolder();\n\t\t\tif (!workspaceFolder) {\n\t\t\t\tvoid vscode.window.showErrorMessage('Open a workspace folder to browse its repository timeline');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst preferredRoot = await resolveHistoryWorkspacePath({\n\t\t\t\tworkspacePath: workspaceFolder.uri.fsPath,\n\t\t\t\trunner: args.runner,\n\t\t\t});\n\t\t\tconst adapter = await resolveHistoryAdapter({ workspacePath: preferredRoot, runner: args.runner });\n\t\t\tconst panel = vscode.window.createWebviewPanel(\n\t\t\t\t'jjPlusRepoTimeline',\n\t\t\t\t`Repo Timeline: ${path.basename(preferredRoot)}`,\n\t\t\t\tvscode.ViewColumn.Active,\n\t\t\t\t{\n\t\t\t\t\tenableScripts: true,\n\t\t\t\t\tretainContextWhenHidden: true,\n\t\t\t\t\tenableFindWidget: true,\n\t\t\t\t\tlocalResourceRoots: [vscode.Uri.joinPath(args.context.extensionUri, 'webview-dist')],\n\t\t\t\t},\n\t\t\t);\n\t\t\tpanel.webview.html = getRepoWebviewHtml({ context: args.context, webview: panel.webview });\n\t\t\tpanels.set(panel, { workspacePath: preferredRoot, adapter, entries: [] });\n\t\t\tpanel.onDidDispose(() => panels.delete(panel), undefined, args.context.subscriptions);\n\t\t\tpanel.webview.onDidReceiveMessage(\n\t\t\t\t(message: RepoTimelineCommand | unknown) => void handleCommand(panel, message).catch((error) => sendError(panel, error)),\n\t\t\t\tundefined,\n\t\t\t\targs.context.subscriptions,\n\t\t\t);\n\t\t},\n\t};\n\n\tasync function handleCommand(panel: vscode.WebviewPanel, rawMessage: RepoTimelineCommand | unknown): Promise<void> {\n\t\tconst state = panels.get(panel);\n\t\tif (!state || !rawMessage || typeof rawMessage !== 'object') return;\n\t\tconst command = Reflect.get(rawMessage, 'command');\n\t\tif (command === 'ready' || command === 'refresh') {\n\t\t\tconst revset = command === 'refresh' ? String(Reflect.get(rawMessage, 'revset') || 'ancestors(@)') : 'ancestors(@)';\n\t\t\tawait load(panel, state, revset);\n\t\t\treturn;\n\t\t}\n\t\tif (command === 'select-revision') {\n\t\t\tconst index = Number(Reflect.get(rawMessage, 'index'));\n\t\t\tconst entry = state.entries[index];\n\t\t\tif (!entry) return;\n\t\t\tawait post(panel, { type: 'repo-timeline-diff', payload: await buildDiff(state, entry) });\n\t\t\treturn;\n\t\t}\n\t\tif (command === 'search') {\n\t\t\tconst request = Reflect.get(rawMessage, 'request') as RepoTimelineSearchRequest;\n\t\t\tawait post(panel, { type: 'repo-timeline-search', payload: await search(state, request) });\n\t\t\treturn;\n\t\t}\n\t\tif (command === 'open-revision-remote') {\n\t\t\tconst index = Number(Reflect.get(rawMessage, 'index'));\n\t\t\tconst url = state.entries[index]?.remoteUrl;\n\t\t\tif (url) await vscode.env.openExternal(vscode.Uri.parse(url));\n\t\t\treturn;\n\t\t}\n\t\tif (command === 'open-file-result') {\n\t\t\tconst entryIndex = Number(Reflect.get(rawMessage, 'entryIndex'));\n\t\t\tconst filePath = String(Reflect.get(rawMessage, 'filePath') || '').replaceAll('\\\\', '/');\n\t\t\tconst line = Math.max(1, Number(Reflect.get(rawMessage, 'line')) || 1);\n\t\t\tconst entry = state.entries[entryIndex];\n\t\t\tif (!entry || !filePath || path.isAbsolute(filePath) || filePath.split('/').includes('..')) return;\n\t\t\tconst uri = vscode.Uri.from({\n\t\t\t\tscheme: 'jj-plus',\n\t\t\t\tpath: `/${filePath}`,\n\t\t\t\tquery: JSON.stringify({ workspacePath: state.workspacePath, filePath, revset: entry.revision }),\n\t\t\t});\n\t\t\tconst document = await vscode.workspace.openTextDocument(uri);\n\t\t\tconst editor = await vscode.window.showTextDocument(document, { preview: true });\n\t\t\tconst position = new vscode.Position(Math.min(line - 1, Math.max(0, document.lineCount - 1)), 0);\n\t\t\teditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.InCenter);\n\t\t}\n\t}\n\n\tasync function load(panel: vscode.WebviewPanel, state: RepoPanelState, revset: string): Promise<void> {\n\t\tconst entries = await state.adapter.getRepositoryRevisionHistory({ workspacePath: state.workspacePath, limit: 200, customRevset: revset });\n\t\tconst remoteBaseUrl = await state.adapter.getRemoteBaseUrl({ workspacePath: state.workspacePath });\n\t\tstate.entries = entries.map((entry, index) => mapEntry(entry, index, remoteBaseUrl));\n\t\tconst payload: RepoTimelineData = {\n\t\t\tbackend: state.adapter.backend,\n\t\t\tworkspacePath: state.workspacePath,\n\t\t\trepositoryName: path.basename(state.workspacePath),\n\t\t\tversion: args.version,\n\t\t\tentries: state.entries,\n\t\t\tbookmarks: [\n\t\t\t\t...new Set(\n\t\t\t\t\tstate.entries.flatMap((entry) => [\n\t\t\t\t\t\t...(entry.bookmarkNames ?? []),\n\t\t\t\t\t\t...(entry.branchNames ?? []),\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t].toSorted(),\n\t\t\ttruncated: state.entries.length >= 200,\n\t\t};\n\t\tawait post(panel, { type: 'repo-timeline-data', payload });\n\t\tconst first = state.entries.at(-1);\n\t\tif (first) {\n\t\t\tawait post(panel, { type: 'repo-timeline-diff', payload: await buildDiff(state, first) });\n\t\t}\n\t}\n\n\tasync function buildDiff(state: RepoPanelState, entry: RepoRevisionEntry): Promise<RepoTimelineDiff> {\n\t\tconst patch = await state.adapter.getRevisionDiff({ workspacePath: state.workspacePath, revision: entry.revision });\n\t\tconst paths = await state.adapter.listRevisionFiles({ workspacePath: state.workspacePath, revision: entry.revision });\n\t\tconst files = paths.length ? paths : parseDiffFiles(patch);\n\t\tconst parent = revisionParent(state.adapter.backend, entry.revision);\n\t\tconst fileDiffs: Array<RepoTimelineDiffFile> = [];\n\t\tfor (const filePath of files) {\n\t\t\tconst [before, after] = await Promise.all([\n\t\t\t\treadFileAtRevision(state, parent, filePath),\n\t\t\t\treadFileAtRevision(state, entry.revision, filePath),\n\t\t\t]);\n\t\t\tfileDiffs.push({ path: filePath, before, after });\n\t\t}\n\t\treturn { revision: entry.revision, patch, files: fileDiffs };\n\t}\n\n\tasync function search(state: RepoPanelState, request: RepoTimelineSearchRequest): Promise<RepoTimelineSearchPayload> {\n\t\tconst query = request.query.trim();\n\t\tif (request.mode === 'all') {\n\t\t\tconst [metadata, changes, snapshot] = await Promise.all([\n\t\t\t\tsearch(state, { ...request, mode: 'metadata' }),\n\t\t\t\tsearch(state, { ...request, mode: 'changes' }),\n\t\t\t\tsearch(state, { ...request, mode: 'snapshot' }),\n\t\t\t]);\n\t\t\tconst results = [...metadata.results, ...changes.results, ...snapshot.results].slice(0, 500);\n\t\t\treturn { requestId: request.requestId, mode: request.mode, results, truncated: metadata.truncated || changes.truncated || snapshot.truncated || results.length < metadata.results.length + changes.results.length + snapshot.results.length };\n\t\t}\n\t\tif (request.mode === 'metadata') {\n\t\t\treturn {\n\t\t\t\trequestId: request.requestId,\n\t\t\t\tmode: request.mode,\n\t\t\t\tresults: state.entries.flatMap((entry, entryIndex) => metadataMatches(entry, { ...request, query }) ? [{ entryIndex, lane: 'metadata' as const }] : []),\n\t\t\t\ttruncated: false,\n\t\t\t};\n\t\t}\n\n\t\tif (!query) return { requestId: request.requestId, mode: request.mode, results: [], truncated: false };\n\t\tconst results: Array<RepoTimelineSearchResult> = [];\n\t\tconst candidates = state.entries.filter((entry) => timestampInRange(entry.timestamp, request));\n\t\tif (request.mode === 'changes') {\n\t\t\tfor (const entry of candidates) {\n\t\t\t\tconst patch = await state.adapter.getRevisionDiff({ workspacePath: state.workspacePath, revision: entry.revision });\n\t\t\t\tfor (const match of addedLineMatches(patch, request)) {\n\t\t\t\t\tresults.push({ entryIndex: entry.index, lane: 'changes', filePath: match.filePath, line: match.line, detail: match.detail });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst entry = state.entries[request.selectedIndex ?? state.entries.length - 1];\n\t\t\tif (entry) {\n\t\t\t\tconst files = await state.adapter.listRevisionTreeFiles({ workspacePath: state.workspacePath, revision: entry.revision });\n\t\t\t\tfor (const filePath of files) {\n\t\t\t\t\tif (request.path && !filePath.toLocaleLowerCase().includes(request.path.toLocaleLowerCase())) continue;\n\t\t\t\t\tconst content = await readFileAtRevision(state, entry.revision, filePath);\n\t\t\t\t\tfor (const [lineIndex, detail] of content.split(/\\r?\\n/u).entries()) {\n\t\t\t\t\t\tif (matchesText(detail, query, request.matchMode)) {\n\t\t\t\t\t\t\tresults.push({ entryIndex: entry.index, lane: 'snapshot', filePath, line: lineIndex + 1, detail });\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}\n\t\tconst limit = 500;\n\t\treturn { requestId: request.requestId, mode: request.mode, results: results.slice(0, limit), truncated: results.length > limit };\n\t}\n\n\tasync function readFileAtRevision(state: RepoPanelState, revset: string, filePath: string): Promise<string> {\n\t\ttry {\n\t\t\treturn await state.adapter.showFileAtRevision({ workspacePath: state.workspacePath, revset, filePath });\n\t\t} catch {\n\t\t\t// A root revision has no parent, and deleted files do not exist in the\n\t\t\t// selected snapshot. Pierre can still render those sides as empty.\n\t\t\treturn '';\n\t\t}\n\t}\n}\n\nfunction resolveWorkspaceFolder(): vscode.WorkspaceFolder | undefined {\n\tconst editor = vscode.window.activeTextEditor;\n\tif (editor?.document.uri.scheme === 'file') {\n\t\tconst folder = vscode.workspace.getWorkspaceFolder(editor.document.uri);\n\t\tif (folder) return folder;\n\t}\n\treturn vscode.workspace.workspaceFolders?.[0];\n}\n\nfunction sendError(panel: vscode.WebviewPanel, error: unknown): void {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tvoid post(panel, { type: 'repo-timeline-error', payload: { message } });\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_resolve_file_path = require("../shared/resolve-file-path.cjs");
3
+ let vscode = require("vscode");
4
+ vscode = require_runtime.__toESM(vscode, 1);
5
+ //#region src/extension/resolve-file-path.ts
6
+ function resolveCommandFilePath(arg) {
7
+ const fromArg = require_resolve_file_path.coerceFsPath(arg);
8
+ if (fromArg) return fromArg;
9
+ const active = vscode.window.activeTextEditor?.document.uri;
10
+ if (active?.scheme === "file") return active.fsPath;
11
+ }
12
+ //#endregion
13
+ exports.coerceFsPath = require_resolve_file_path.coerceFsPath;
14
+ exports.resolveCommandFilePath = resolveCommandFilePath;
15
+
16
+ //# sourceMappingURL=resolve-file-path.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-file-path.cjs","names":["coerceFsPath"],"sources":["../../src/extension/resolve-file-path.ts"],"sourcesContent":["import * as vscode from 'vscode';\nimport { coerceFsPath } from '../shared/resolve-file-path.ts';\n\nexport { coerceFsPath };\n\nexport function resolveCommandFilePath(arg?: unknown): string | undefined {\n\tconst fromArg = coerceFsPath(arg);\n\tif (fromArg) {\n\t\treturn fromArg;\n\t}\n\tconst active = vscode.window.activeTextEditor?.document.uri;\n\tif (active?.scheme === 'file') {\n\t\treturn active.fsPath;\n\t}\n\treturn undefined;\n}\n"],"mappings":";;;;;AAKA,SAAgB,uBAAuB,KAAmC;CACzE,MAAM,UAAUA,0BAAAA,aAAa,GAAG;CAChC,IAAI,SACH,OAAO;CAER,MAAM,SAAS,OAAO,OAAO,kBAAkB,SAAS;CACxD,IAAI,QAAQ,WAAW,QACtB,OAAO,OAAO;AAGhB"}