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":"options.cjs","names":["EXTENSION_ID"],"sources":["../../src/cli/options.ts"],"sourcesContent":["import { EXTENSION_ID } from '../extension/constants.ts';\n\nconst URI_PATH = '/open-range-multi-diff';\nconst DEFAULT_IDE = 'code';\n\ntype RangeDiffCliOptions = {\n\thelp: boolean;\n\tconfirm: boolean;\n\tfrom?: string;\n\tide?: string;\n\tto?: string;\n\ttitle?: string;\n\tverbose: boolean;\n\tworkspacePath?: string;\n};\n\ntype TimelineCliOptions = {\n\thelp: boolean;\n\tfilePath?: string;\n\topen: boolean;\n\tjson: boolean;\n\tport: number;\n\tverbose: boolean;\n\tworkspacePath?: string;\n};\n\ntype CliInvocation = {\n\tcommand: 'range-diff' | 'timeline';\n\targv: string[];\n};\n\ntype IdePreset = {\n\tcommand: string;\n\tschemes: string[];\n};\n\nconst idePresets: Record<string, IdePreset> = {\n\tcode: { command: process.env.VSCODE_BIN || 'code', schemes: ['vscode', 'vscode-insiders'] },\n\tvscode: { command: process.env.VSCODE_BIN || 'code', schemes: ['vscode', 'vscode-insiders'] },\n\t'code-insiders': { command: 'code-insiders', schemes: ['vscode-insiders'] },\n\t'vscode-insiders': { command: 'code-insiders', schemes: ['vscode-insiders'] },\n\tcursor: { command: 'cursor', schemes: ['cursor'] },\n\t'cursor-insiders': { command: 'cursor-insiders', schemes: ['cursor-insiders', 'cursor'] },\n\tzed: { command: 'zed', schemes: ['zed'] },\n\twindsurf: { command: 'windsurf', schemes: ['windsurf'] },\n\tcodium: { command: 'codium', schemes: ['vscodium', 'vscode'] },\n};\n\nexport function resolveCliInvocation(argv: string[]): CliInvocation {\n\tconst [command, ...rest] = argv;\n\n\tif (command === 'timeline' || command === 'webview') {\n\t\treturn {\n\t\t\tcommand: 'timeline',\n\t\t\targv: rest,\n\t\t};\n\t}\n\n\tif (command === 'diff') {\n\t\treturn {\n\t\t\tcommand: 'range-diff',\n\t\t\targv: rest,\n\t\t};\n\t}\n\n\treturn {\n\t\tcommand: 'range-diff',\n\t\targv,\n\t};\n}\n\nexport function parseRangeDiffArgs(argv: string[]): RangeDiffCliOptions {\n\tconst options: RangeDiffCliOptions = {\n\t\thelp: false,\n\t\tconfirm: false,\n\t\tfrom: undefined,\n\t\tide: process.env.JJ_PLUS_IDE || undefined,\n\t\tto: undefined,\n\t\ttitle: undefined,\n\t\tverbose: false,\n\t\tworkspacePath: undefined,\n\t};\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\n\t\tif (arg === '-h' || arg === '--help') {\n\t\t\toptions.help = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--confirm') {\n\t\t\toptions.confirm = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-v' || arg === '--verbose') {\n\t\t\toptions.verbose = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-f' || arg === '--from' || arg === '-b' || arg === '--base') {\n\t\t\toptions.from = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--from=')) {\n\t\t\toptions.from = requireValue({ flag: '--from', value: arg.slice('--from='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--base=')) {\n\t\t\toptions.from = requireValue({ flag: '--base', value: arg.slice('--base='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-t' || arg === '--to' || arg === '--target') {\n\t\t\toptions.to = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--to=')) {\n\t\t\toptions.to = requireValue({ flag: '--to', value: arg.slice('--to='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--target=')) {\n\t\t\toptions.to = requireValue({ flag: '--target', value: arg.slice('--target='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--title') {\n\t\t\toptions.title = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--title=')) {\n\t\t\toptions.title = requireValue({ flag: '--title', value: arg.slice('--title='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--ide') {\n\t\t\toptions.ide = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--ide=')) {\n\t\t\toptions.ide = requireValue({ flag: '--ide', value: arg.slice('--ide='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-w' || arg === '--workspace' || arg === '--workspace-path') {\n\t\t\toptions.workspacePath = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--workspace=')) {\n\t\t\toptions.workspacePath = requireValue({ flag: '--workspace', value: arg.slice('--workspace='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--workspace-path=')) {\n\t\t\toptions.workspacePath = requireValue({ flag: '--workspace-path', value: arg.slice('--workspace-path='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(`Unknown argument: ${arg}\\n\\n${usage()}`);\n\t}\n\n\treturn options;\n}\n\nexport function parseTimelineArgs(argv: string[]): TimelineCliOptions {\n\tconst options: TimelineCliOptions = {\n\t\thelp: false,\n\t\tfilePath: undefined,\n\t\topen: true,\n\t\tjson: false,\n\t\tport: 0,\n\t\tverbose: false,\n\t\tworkspacePath: undefined,\n\t};\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\n\t\tif (arg === '-h' || arg === '--help') {\n\t\t\toptions.help = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--json') {\n\t\t\toptions.json = true;\n\t\t\toptions.open = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--no-open') {\n\t\t\toptions.open = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-v' || arg === '--verbose') {\n\t\t\toptions.verbose = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-f' || arg === '--file') {\n\t\t\toptions.filePath = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--file=')) {\n\t\t\toptions.filePath = requireValue({ flag: '--file', value: arg.slice('--file='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '--port') {\n\t\t\toptions.port = parsePort(requireValue({ flag: arg, value: argv[index + 1] }));\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--port=')) {\n\t\t\toptions.port = parsePort(requireValue({ flag: '--port', value: arg.slice('--port='.length) }));\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === '-w' || arg === '--workspace' || arg === '--workspace-path') {\n\t\t\toptions.workspacePath = requireValue({ flag: arg, value: argv[index + 1] });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--workspace=')) {\n\t\t\toptions.workspacePath = requireValue({ flag: '--workspace', value: arg.slice('--workspace='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--workspace-path=')) {\n\t\t\toptions.workspacePath = requireValue({ flag: '--workspace-path', value: arg.slice('--workspace-path='.length) });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('-')) {\n\t\t\tthrow new Error(`Unknown argument: ${arg}\\n\\n${usage()}`);\n\t\t}\n\n\t\tif (!options.filePath) {\n\t\t\toptions.filePath = arg;\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(`Unexpected positional argument: ${arg}\\n\\n${usage()}`);\n\t}\n\n\treturn options;\n}\n\nexport function resolveIde(rawIde?: string): IdePreset {\n\tconst trimmed = rawIde?.trim() || DEFAULT_IDE;\n\tconst preset = idePresets[trimmed.toLowerCase()];\n\tif (preset) {\n\t\treturn preset;\n\t}\n\n\treturn {\n\t\tcommand: trimmed,\n\t\tschemes: [trimmed],\n\t};\n}\n\nexport function getLaunchers(query: string, ide: IdePreset): Array<{ command: string; args: string[] }> {\n\tconst uris = ide.schemes.map((scheme) => buildUri({ scheme, query }));\n\n\tif (process.platform === 'darwin') {\n\t\treturn uris.map((uri) => ({ command: 'open', args: [uri] }));\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn uris.map((uri) => ({ command: 'cmd', args: ['/c', 'start', '', uri] }));\n\t}\n\n\treturn uris.map((uri) => ({ command: 'xdg-open', args: [uri] }));\n}\n\nexport function logVerbose(enabled: boolean, message: string): void {\n\tif (!enabled) {\n\t\treturn;\n\t}\n\n\tprocess.stderr.write(`${message}\\n`);\n}\n\nexport function formatCommand(command: string, args: string[]): string {\n\treturn [command, ...args].map(quoteShellArg).join(' ');\n}\n\nexport function usage(): string {\n\treturn [\n\t\t'Usage:',\n\t\t' jj-plus [options]',\n\t\t' jj-plus diff [options]',\n\t\t' jj-plus timeline [options] <file>',\n\t\t'',\n\t\t'Commands:',\n\t\t' diff Explicit alias for the default range diff deep-link flow',\n\t\t' timeline <file> Open the timeline webview in the default browser',\n\t\t' webview <file> Alias for timeline',\n\t\t'',\n\t\t'Range Diff Options:',\n\t\t' --confirm Prompt before opening when launched from the CLI',\n\t\t' -f, --from <revset> From change id or revset',\n\t\t' --ide <name> IDE preset or command (default: code)',\n\t\t' -t, --to <revset> To change id or revset',\n\t\t' --base <revset> Alias for --from',\n\t\t' --target <revset> Alias for --to',\n\t\t' --title <title> Override the tab title',\n\t\t' -v, --verbose Log launches and show extra diagnostics',\n\t\t' -w, --workspace <path> Workspace path to resolve in VS Code',\n\t\t' --workspace-path <path> Alias for --workspace',\n\t\t'',\n\t\t'Standalone Timeline Options:',\n\t\t' -f, --file <path> File path inside the workspace (or absolute path)',\n\t\t' --json Print timeline metadata JSON to stdout (implies --no-open)',\n\t\t' --no-open Start the local server without opening the browser',\n\t\t' --port <port> Preferred local port (default: random free port)',\n\t\t' -w, --workspace <path> Workspace path containing the file (default: cwd)',\n\t\t' --workspace-path <path> Alias for --workspace',\n\t\t' -h, --help Show this help message',\n\t\t'',\n\t\t'Environment:',\n\t\t' JJ_PLUS_IDE Default IDE preset or command for the VS Code deep-link flow',\n\t].join('\\n');\n}\n\nfunction parsePort(value: string): number {\n\tconst port = Number.parseInt(value, 10);\n\tif (!Number.isInteger(port) || port < 0 || port > 65535) {\n\t\tthrow new Error(`Invalid port: ${value}\\n\\n${usage()}`);\n\t}\n\n\treturn port;\n}\n\nfunction requireValue({ flag, value }: { flag: string; value?: string }): string {\n\tconst trimmed = value?.trim();\n\tif (trimmed) {\n\t\treturn trimmed;\n\t}\n\n\tthrow new Error(`Missing value for ${flag}\\n\\n${usage()}`);\n}\n\nfunction buildUri({ scheme, query }: { scheme: string; query: string }): string {\n\treturn `${scheme}://${EXTENSION_ID}${URI_PATH}?${query}`;\n}\n\nfunction quoteShellArg(value: string): string {\n\tif (/^[a-zA-Z0-9_@./:=+-]+$/u.test(value)) {\n\t\treturn value;\n\t}\n\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ //#region src/cli/timeline-json.ts
2
+ function compactTimelineJsonEntry(entry) {
3
+ const flags = {
4
+ ...entry.isEmpty ? { empty: true } : {},
5
+ ...entry.hasConflict ? { conflict: true } : {},
6
+ ...entry.isImmutable ? { immutable: true } : {}
7
+ };
8
+ return {
9
+ rev: entry.revision,
10
+ ...entry.changeId ? { changeId: entry.changeId } : {},
11
+ date: entry.authorDate,
12
+ desc: entry.description,
13
+ ...entry.filePath ? { path: entry.filePath } : {},
14
+ ...Object.keys(flags).length ? { flags } : {}
15
+ };
16
+ }
17
+ function buildTimelineJsonSummary(args) {
18
+ return {
19
+ backend: args.backend,
20
+ path: args.relativePath,
21
+ workspacePath: args.workspacePath,
22
+ entries: args.entries.filter((entry) => !entry.isWorkingTree).map(compactTimelineJsonEntry)
23
+ };
24
+ }
25
+ //#endregion
26
+ exports.buildTimelineJsonSummary = buildTimelineJsonSummary;
27
+ exports.compactTimelineJsonEntry = compactTimelineJsonEntry;
28
+
29
+ //# sourceMappingURL=timeline-json.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-json.cjs","names":[],"sources":["../../src/cli/timeline-json.ts"],"sourcesContent":["import type { FileRevisionEntry, HistoryBackend } from '../shared/timeline-types.ts';\n\nexport type TimelineJsonEntry = {\n\trev: string;\n\tchangeId?: string;\n\tdate: string;\n\tdesc: string;\n\tpath?: string;\n\tflags?: {\n\t\tempty?: boolean;\n\t\tconflict?: boolean;\n\t\timmutable?: boolean;\n\t};\n};\n\nexport type TimelineJsonSummary = {\n\tbackend: HistoryBackend;\n\tpath: string;\n\tworkspacePath: string;\n\tentries: TimelineJsonEntry[];\n};\n\nexport function compactTimelineJsonEntry(entry: FileRevisionEntry): TimelineJsonEntry {\n\tconst flags = {\n\t\t...(entry.isEmpty ? { empty: true as const } : {}),\n\t\t...(entry.hasConflict ? { conflict: true as const } : {}),\n\t\t...(entry.isImmutable ? { immutable: true as const } : {}),\n\t};\n\treturn {\n\t\trev: entry.revision,\n\t\t...(entry.changeId ? { changeId: entry.changeId } : {}),\n\t\tdate: entry.authorDate,\n\t\tdesc: entry.description,\n\t\t...(entry.filePath ? { path: entry.filePath } : {}),\n\t\t...(Object.keys(flags).length ? { flags } : {}),\n\t};\n}\n\nexport function buildTimelineJsonSummary(args: {\n\tbackend: HistoryBackend;\n\trelativePath: string;\n\tworkspacePath: string;\n\tentries: ReadonlyArray<FileRevisionEntry>;\n}): TimelineJsonSummary {\n\treturn {\n\t\tbackend: args.backend,\n\t\tpath: args.relativePath,\n\t\tworkspacePath: args.workspacePath,\n\t\tentries: args.entries.filter((entry) => !entry.isWorkingTree).map(compactTimelineJsonEntry),\n\t};\n}\n"],"mappings":";AAsBA,SAAgB,yBAAyB,OAA6C;CACrF,MAAM,QAAQ;EACb,GAAI,MAAM,UAAU,EAAE,OAAO,KAAc,IAAI,CAAC;EAChD,GAAI,MAAM,cAAc,EAAE,UAAU,KAAc,IAAI,CAAC;EACvD,GAAI,MAAM,cAAc,EAAE,WAAW,KAAc,IAAI,CAAC;CACzD;CACA,OAAO;EACN,KAAK,MAAM;EACX,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;EACrD,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,GAAI,MAAM,WAAW,EAAE,MAAM,MAAM,SAAS,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAC9C;AACD;AAEA,SAAgB,yBAAyB,MAKjB;CACvB,OAAO;EACN,SAAS,KAAK;EACd,MAAM,KAAK;EACX,eAAe,KAAK;EACpB,SAAS,KAAK,QAAQ,QAAQ,UAAU,CAAC,MAAM,aAAa,CAAC,CAAC,IAAI,wBAAwB;CAC3F;AACD"}
@@ -0,0 +1,228 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_constants = require("./constants.cjs");
3
+ const require_blame = require("../shared/blame.cjs");
4
+ const require_settings = require("./settings.cjs");
5
+ const require_timeline_at_line = require("./timeline-at-line.cjs");
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/blame-codelens.ts
11
+ const MAX_EDITOR_COLUMN = 1073741823;
12
+ function getSelectionLines(editor) {
13
+ return editor.selections.map((selection) => ({
14
+ active: selection.active.line,
15
+ anchor: selection.anchor.line
16
+ }));
17
+ }
18
+ function selectionLinesMatch(left, right) {
19
+ return left?.length === right.length && left.every((selection, index) => {
20
+ const other = right[index];
21
+ return other?.active === selection.active && other.anchor === selection.anchor;
22
+ });
23
+ }
24
+ /**
25
+ * Shared file-blame cache + GitLens-style decorations (current line + optional full gutter).
26
+ * Hover always carries author / relative time / short desc when blame is available.
27
+ */
28
+ function createEditorBlameDecorations(args) {
29
+ const currentLineType = vscode.window.createTextEditorDecorationType({ after: {
30
+ color: new vscode.ThemeColor("editorCodeLens.foreground"),
31
+ fontStyle: "italic",
32
+ margin: "0 0 0 3em",
33
+ textDecoration: "none"
34
+ } });
35
+ const inlineGutterType = vscode.window.createTextEditorDecorationType({ after: {
36
+ color: new vscode.ThemeColor("editorCodeLens.foreground"),
37
+ fontStyle: "italic",
38
+ margin: "0 0 0 1.2em",
39
+ fontWeight: "normal",
40
+ textDecoration: "none"
41
+ } });
42
+ const endOfLineRange = (document, line) => {
43
+ const end = document.validatePosition(new vscode.Position(line, MAX_EDITOR_COLUMN));
44
+ return new vscode.Range(end, end);
45
+ };
46
+ const clearDecorations = (editor) => {
47
+ editor.setDecorations(currentLineType, []);
48
+ editor.setDecorations(inlineGutterType, []);
49
+ };
50
+ const clearVisibleDecorations = () => {
51
+ for (const editor of vscode.window.visibleTextEditors) clearDecorations(editor);
52
+ };
53
+ const cache = /* @__PURE__ */ new Map();
54
+ let generation = 0;
55
+ let refreshTimer;
56
+ let editingDocument;
57
+ let editingSelectionLines;
58
+ const isEditing = (editor) => editor === vscode.window.activeTextEditor && editingDocument === editor.document && editingSelectionLines !== void 0;
59
+ const clearEditingState = () => {
60
+ editingDocument = void 0;
61
+ editingSelectionLines = void 0;
62
+ generation += 1;
63
+ };
64
+ const markEditing = (editor) => {
65
+ editingDocument = editor.document;
66
+ editingSelectionLines = getSelectionLines(editor);
67
+ generation += 1;
68
+ clearDecorations(editor);
69
+ };
70
+ const scheduleRefresh = (delayMs = 60) => {
71
+ if (refreshTimer) clearTimeout(refreshTimer);
72
+ refreshTimer = setTimeout(() => {
73
+ refresh(vscode.window.activeTextEditor);
74
+ }, delayMs);
75
+ };
76
+ const loadBlame = async (workspacePath, relativePath, backend) => {
77
+ if (backend === "git") {
78
+ const { stdout } = await args.runner.runGit({
79
+ workspacePath,
80
+ args: require_blame.buildGitBlameFileArgs({ relativePath })
81
+ });
82
+ return require_blame.parseGitBlamePorcelain(stdout);
83
+ }
84
+ const { stdout } = await args.runner.runJj({
85
+ workspacePath,
86
+ args: require_blame.buildJjAnnotateArgs({ relativePath })
87
+ });
88
+ return require_blame.parseJjFileAnnotate(stdout);
89
+ };
90
+ const getCachedLines = async (document) => {
91
+ const workspaceFolder = vscode.workspace.getWorkspaceFolder(document.uri);
92
+ if (!workspaceFolder || document.uri.scheme !== "file") return;
93
+ const workspacePath = workspaceFolder.uri.fsPath;
94
+ const relativePath = node_path.relative(workspacePath, document.uri.fsPath).replace(/\\/g, "/");
95
+ if (!relativePath || relativePath.startsWith("..")) return;
96
+ const cacheKey = `${document.uri.toString()}::${document.version}`;
97
+ let entry = cache.get(document.uri.toString());
98
+ if (!entry || entry.key !== cacheKey) {
99
+ const { backend } = await args.resolveBackend({ workspacePath });
100
+ entry = {
101
+ key: cacheKey,
102
+ lines: await loadBlame(workspacePath, relativePath, backend)
103
+ };
104
+ cache.set(document.uri.toString(), entry);
105
+ }
106
+ return entry.lines;
107
+ };
108
+ const refresh = async (editor) => {
109
+ const token = ++generation;
110
+ const settings = require_settings.readJjplusSettings();
111
+ if (!editor || editor.document.uri.scheme !== "file") {
112
+ clearVisibleDecorations();
113
+ return;
114
+ }
115
+ if (isEditing(editor)) {
116
+ clearDecorations(editor);
117
+ return;
118
+ }
119
+ if (!settings.currentLineBlame && !settings.inlineBlameGutter) {
120
+ clearVisibleDecorations();
121
+ return;
122
+ }
123
+ let lines;
124
+ try {
125
+ lines = await getCachedLines(editor.document);
126
+ } catch {
127
+ clearVisibleDecorations();
128
+ return;
129
+ }
130
+ if (token !== generation || vscode.window.activeTextEditor !== editor || !lines) return;
131
+ const document = editor.document;
132
+ const activeLine = editor.selection.active.line;
133
+ if (settings.currentLineBlame) {
134
+ const blame = require_blame.findBlameForLine(lines, activeLine + 1);
135
+ if (blame) editor.setDecorations(currentLineType, [{
136
+ range: endOfLineRange(document, activeLine),
137
+ renderOptions: { after: { contentText: require_timeline_at_line.formatCurrentLineBlameDecoration(blame) } },
138
+ hoverMessage: void 0
139
+ }]);
140
+ else editor.setDecorations(currentLineType, []);
141
+ } else editor.setDecorations(currentLineType, []);
142
+ if (settings.inlineBlameGutter) {
143
+ const annotated = settings.inlineBlameSparse ? require_blame.collapseBlameToHunkStarts(lines) : lines;
144
+ editor.setDecorations(inlineGutterType, annotated.filter((entry) => entry.line >= 1 && entry.line <= document.lineCount).map((entry) => {
145
+ const line = entry.line - 1;
146
+ return {
147
+ range: endOfLineRange(document, line),
148
+ renderOptions: { after: { contentText: require_timeline_at_line.formatCurrentLineBlameDecoration(entry) } },
149
+ hoverMessage: void 0
150
+ };
151
+ }));
152
+ } else editor.setDecorations(inlineGutterType, []);
153
+ for (const other of vscode.window.visibleTextEditors) if (other !== editor) clearDecorations(other);
154
+ };
155
+ const hoverProvider = { async provideHover(document, position) {
156
+ const settings = require_settings.readJjplusSettings();
157
+ if (settings.blameHoverMode === "never" || document.uri.scheme !== "file") return null;
158
+ const line = position.line + 1;
159
+ let blame;
160
+ const annotatedLines = /* @__PURE__ */ new Set();
161
+ try {
162
+ const lines = await getCachedLines(document);
163
+ blame = lines ? require_blame.findBlameForLine(lines, line) : void 0;
164
+ if (lines && settings.inlineBlameGutter) for (const entry of settings.inlineBlameSparse ? require_blame.collapseBlameToHunkStarts(lines) : lines) annotatedLines.add(entry.line);
165
+ const activeEditor = vscode.window.activeTextEditor;
166
+ if (settings.currentLineBlame && activeEditor?.document.uri.toString() === document.uri.toString()) annotatedLines.add(activeEditor.selection.active.line + 1);
167
+ } catch {
168
+ blame = void 0;
169
+ }
170
+ if (!require_timeline_at_line.shouldShowBlameHoverAtPosition({
171
+ mode: settings.blameHoverMode,
172
+ positionCharacter: position.character,
173
+ lineLength: document.lineAt(position.line).text.length,
174
+ line,
175
+ annotatedLines
176
+ })) return null;
177
+ const markdown = new vscode.MarkdownString(blame ? require_timeline_at_line.buildCurrentLineBlameHoverMarkdown({
178
+ entry: blame,
179
+ absolutePath: document.uri.fsPath,
180
+ line
181
+ }) : `[${require_timeline_at_line.formatTimelineAtLineHoverTitle({ line })}](command:${require_constants.OPEN_TIMELINE_AT_LINE_COMMAND}?${encodeURIComponent(JSON.stringify({
182
+ absolutePath: document.uri.fsPath,
183
+ line
184
+ }))})`);
185
+ markdown.isTrusted = true;
186
+ return new vscode.Hover(markdown);
187
+ } };
188
+ scheduleRefresh(0);
189
+ return vscode.Disposable.from(currentLineType, inlineGutterType, vscode.languages.registerHoverProvider({ scheme: "file" }, hoverProvider), vscode.window.onDidChangeActiveTextEditor(() => {
190
+ clearEditingState();
191
+ scheduleRefresh(0);
192
+ }), vscode.window.onDidChangeTextEditorSelection((event) => {
193
+ if (event.textEditor !== vscode.window.activeTextEditor) return;
194
+ if (isEditing(event.textEditor)) {
195
+ if (!selectionLinesMatch(editingSelectionLines, getSelectionLines(event.textEditor))) {
196
+ clearEditingState();
197
+ scheduleRefresh(0);
198
+ }
199
+ return;
200
+ }
201
+ scheduleRefresh(40);
202
+ }), vscode.workspace.onDidChangeTextDocument((event) => {
203
+ const editor = vscode.window.activeTextEditor;
204
+ if (event.document !== editor?.document) return;
205
+ cache.delete(event.document.uri.toString());
206
+ if (event.contentChanges.length > 0) {
207
+ markEditing(editor);
208
+ return;
209
+ }
210
+ scheduleRefresh(180);
211
+ }), vscode.workspace.onDidSaveTextDocument((document) => {
212
+ if (document.uri.toString() === vscode.window.activeTextEditor?.document.uri.toString()) {
213
+ clearEditingState();
214
+ scheduleRefresh(0);
215
+ }
216
+ }), require_settings.onJjplusSettingsChange(() => {
217
+ clearEditingState();
218
+ scheduleRefresh(0);
219
+ }), { dispose() {
220
+ if (refreshTimer) clearTimeout(refreshTimer);
221
+ clearEditingState();
222
+ cache.clear();
223
+ } });
224
+ }
225
+ //#endregion
226
+ exports.createEditorBlameDecorations = createEditorBlameDecorations;
227
+
228
+ //# sourceMappingURL=blame-codelens.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame-codelens.cjs","names":["buildGitBlameFileArgs","parseGitBlamePorcelain","buildJjAnnotateArgs","parseJjFileAnnotate","path","readJjplusSettings","findBlameForLine","formatCurrentLineBlameDecoration","collapseBlameToHunkStarts","shouldShowBlameHoverAtPosition","buildCurrentLineBlameHoverMarkdown","formatTimelineAtLineHoverTitle","OPEN_TIMELINE_AT_LINE_COMMAND","onJjplusSettingsChange"],"sources":["../../src/extension/blame-codelens.ts"],"sourcesContent":["import * as path from 'node:path';\nimport * as vscode from 'vscode';\nimport {\n\tbuildGitBlameFileArgs,\n\tbuildJjAnnotateArgs,\n\tcollapseBlameToHunkStarts,\n\tfindBlameForLine,\n\tparseGitBlamePorcelain,\n\tparseJjFileAnnotate,\n\ttype BlameLine,\n} from '../shared/blame.ts';\nimport { OPEN_TIMELINE_AT_LINE_COMMAND } from './constants.ts';\nimport { onJjplusSettingsChange, readJjplusSettings } from './settings.ts';\nimport {\n\tbuildCurrentLineBlameHoverMarkdown,\n\tformatCurrentLineBlameDecoration,\n\tformatTimelineAtLineHoverTitle,\n\tshouldShowBlameHoverAtPosition,\n} from './timeline-at-line.ts';\n\ntype BlameRunner = {\n\trunGit: (args: { workspacePath: string; args: string[] }) => Promise<{ stdout: string }>;\n\trunJj: (args: { workspacePath: string; args: string[] }) => Promise<{ stdout: string }>;\n};\n\ntype ResolveBackend = (args: { workspacePath: string }) => Promise<{ backend: 'git' | 'jj' }>;\n\ntype CacheEntry = {\n\tkey: string;\n\tlines: BlameLine[];\n};\n\ntype SelectionLines = ReadonlyArray<{ active: number; anchor: number }>;\n\nconst MAX_EDITOR_COLUMN = 0x3fffffff;\n\nfunction getSelectionLines(editor: vscode.TextEditor): SelectionLines {\n\treturn editor.selections.map((selection) => ({\n\t\tactive: selection.active.line,\n\t\tanchor: selection.anchor.line,\n\t}));\n}\n\nfunction selectionLinesMatch(left: SelectionLines | undefined, right: SelectionLines): boolean {\n\treturn (\n\t\tleft?.length === right.length &&\n\t\tleft.every((selection, index) => {\n\t\t\tconst other = right[index];\n\t\t\treturn other?.active === selection.active && other.anchor === selection.anchor;\n\t\t})\n\t);\n}\n\n/**\n * Shared file-blame cache + GitLens-style decorations (current line + optional full gutter).\n * Hover always carries author / relative time / short desc when blame is available.\n */\nexport function createEditorBlameDecorations(args: {\n\trunner: BlameRunner;\n\tresolveBackend: ResolveBackend;\n}): vscode.Disposable {\n\tconst currentLineType = vscode.window.createTextEditorDecorationType({\n\t\tafter: {\n\t\t\tcolor: new vscode.ThemeColor('editorCodeLens.foreground'),\n\t\t\tfontStyle: 'italic',\n\t\t\tmargin: '0 0 0 3em',\n\t\t\ttextDecoration: 'none',\n\t\t},\n\t});\n\tconst inlineGutterType = vscode.window.createTextEditorDecorationType({\n\t\tafter: {\n\t\t\tcolor: new vscode.ThemeColor('editorCodeLens.foreground'),\n\t\t\tfontStyle: 'italic',\n\t\t\tmargin: '0 0 0 1.2em',\n\t\t\tfontWeight: 'normal',\n\t\t\ttextDecoration: 'none',\n\t\t},\n\t});\n\tconst endOfLineRange = (document: vscode.TextDocument, line: number): vscode.Range => {\n\t\t// Match GitLens' far-right zero-width anchor. validateRange clamps it to\n\t\t// the actual line end without attaching the decoration to editable text.\n\t\tconst end = document.validatePosition(new vscode.Position(line, MAX_EDITOR_COLUMN));\n\t\treturn new vscode.Range(end, end);\n\t};\n\tconst clearDecorations = (editor: vscode.TextEditor) => {\n\t\teditor.setDecorations(currentLineType, []);\n\t\teditor.setDecorations(inlineGutterType, []);\n\t};\n\tconst clearVisibleDecorations = () => {\n\t\tfor (const editor of vscode.window.visibleTextEditors) {\n\t\t\tclearDecorations(editor);\n\t\t}\n\t};\n\n\tconst cache = new Map<string, CacheEntry>();\n\tlet generation = 0;\n\tlet refreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet editingDocument: vscode.TextDocument | undefined;\n\tlet editingSelectionLines: SelectionLines | undefined;\n\n\tconst isEditing = (editor: vscode.TextEditor): boolean =>\n\t\teditor === vscode.window.activeTextEditor &&\n\t\teditingDocument === editor.document &&\n\t\teditingSelectionLines !== undefined;\n\n\tconst clearEditingState = () => {\n\t\teditingDocument = undefined;\n\t\teditingSelectionLines = undefined;\n\t\tgeneration += 1;\n\t};\n\n\tconst markEditing = (editor: vscode.TextEditor) => {\n\t\teditingDocument = editor.document;\n\t\teditingSelectionLines = getSelectionLines(editor);\n\t\tgeneration += 1;\n\t\tclearDecorations(editor);\n\t};\n\n\tconst scheduleRefresh = (delayMs = 60) => {\n\t\tif (refreshTimer) {\n\t\t\tclearTimeout(refreshTimer);\n\t\t}\n\t\trefreshTimer = setTimeout(() => {\n\t\t\tvoid refresh(vscode.window.activeTextEditor);\n\t\t}, delayMs);\n\t};\n\n\tconst loadBlame = async (\n\t\tworkspacePath: string,\n\t\trelativePath: string,\n\t\tbackend: 'git' | 'jj',\n\t): Promise<BlameLine[]> => {\n\t\tif (backend === 'git') {\n\t\t\tconst { stdout } = await args.runner.runGit({\n\t\t\t\tworkspacePath,\n\t\t\t\targs: buildGitBlameFileArgs({ relativePath }),\n\t\t\t});\n\t\t\treturn parseGitBlamePorcelain(stdout);\n\t\t}\n\t\tconst { stdout } = await args.runner.runJj({\n\t\t\tworkspacePath,\n\t\t\targs: buildJjAnnotateArgs({ relativePath }),\n\t\t});\n\t\treturn parseJjFileAnnotate(stdout);\n\t};\n\n\tconst getCachedLines = async (document: vscode.TextDocument): Promise<BlameLine[] | undefined> => {\n\t\tconst workspaceFolder = vscode.workspace.getWorkspaceFolder(document.uri);\n\t\tif (!workspaceFolder || document.uri.scheme !== 'file') {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst workspacePath = workspaceFolder.uri.fsPath;\n\t\tconst relativePath = path.relative(workspacePath, document.uri.fsPath).replace(/\\\\/g, '/');\n\t\tif (!relativePath || relativePath.startsWith('..')) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst cacheKey = `${document.uri.toString()}::${document.version}`;\n\t\tlet entry = cache.get(document.uri.toString());\n\t\tif (!entry || entry.key !== cacheKey) {\n\t\t\tconst { backend } = await args.resolveBackend({ workspacePath });\n\t\t\tconst lines = await loadBlame(workspacePath, relativePath, backend);\n\t\t\tentry = { key: cacheKey, lines };\n\t\t\tcache.set(document.uri.toString(), entry);\n\t\t}\n\t\treturn entry.lines;\n\t};\n\n\tconst refresh = async (editor: vscode.TextEditor | undefined) => {\n\t\tconst token = ++generation;\n\t\tconst settings = readJjplusSettings();\n\t\tif (!editor || editor.document.uri.scheme !== 'file') {\n\t\t\tclearVisibleDecorations();\n\t\t\treturn;\n\t\t}\n\t\tif (isEditing(editor)) {\n\t\t\tclearDecorations(editor);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!settings.currentLineBlame && !settings.inlineBlameGutter) {\n\t\t\tclearVisibleDecorations();\n\t\t\treturn;\n\t\t}\n\n\t\tlet lines: BlameLine[] | undefined;\n\t\ttry {\n\t\t\tlines = await getCachedLines(editor.document);\n\t\t} catch {\n\t\t\tclearVisibleDecorations();\n\t\t\treturn;\n\t\t}\n\t\tif (token !== generation || vscode.window.activeTextEditor !== editor || !lines) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst document = editor.document;\n\t\tconst activeLine = editor.selection.active.line;\n\n\t\tif (settings.currentLineBlame) {\n\t\t\tconst blame = findBlameForLine(lines, activeLine + 1);\n\t\t\tif (blame) {\n\t\t\t\teditor.setDecorations(currentLineType, [\n\t\t\t\t\t{\n\t\t\t\t\t\t// Keep the annotation outside the editable text range, as GitLens does.\n\t\t\t\t\t\trange: endOfLineRange(document, activeLine),\n\t\t\t\t\t\trenderOptions: { after: { contentText: formatCurrentLineBlameDecoration(blame) } },\n\t\t\t\t\t\t// Keep hover ownership exclusively in the provider. VS Code can retain\n\t\t\t\t\t\t// decoration hovers across refreshes, which otherwise duplicates cards.\n\t\t\t\t\t\thoverMessage: undefined,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t} else {\n\t\t\t\teditor.setDecorations(currentLineType, []);\n\t\t\t}\n\t\t} else {\n\t\t\teditor.setDecorations(currentLineType, []);\n\t\t}\n\n\t\tif (settings.inlineBlameGutter) {\n\t\t\tconst annotated = settings.inlineBlameSparse ? collapseBlameToHunkStarts(lines) : lines;\n\t\t\teditor.setDecorations(\n\t\t\t\tinlineGutterType,\n\t\t\t\tannotated\n\t\t\t\t\t.filter((entry) => entry.line >= 1 && entry.line <= document.lineCount)\n\t\t\t\t\t.map((entry) => {\n\t\t\t\t\t\tconst line = entry.line - 1;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\trange: endOfLineRange(document, line),\n\t\t\t\t\t\t\trenderOptions: {\n\t\t\t\t\t\t\t\tafter: {\n\t\t\t\t\t\t\t\t\tcontentText: formatCurrentLineBlameDecoration(entry),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\thoverMessage: undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\teditor.setDecorations(inlineGutterType, []);\n\t\t}\n\n\t\tfor (const other of vscode.window.visibleTextEditors) {\n\t\t\tif (other !== editor) {\n\t\t\t\tclearDecorations(other);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst hoverProvider: vscode.HoverProvider = {\n\t\tasync provideHover(document, position) {\n\t\t\tconst settings = readJjplusSettings();\n\t\t\tif (settings.blameHoverMode === 'never' || document.uri.scheme !== 'file') {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst line = position.line + 1;\n\t\t\tlet blame: BlameLine | undefined;\n\t\t\tconst annotatedLines = new Set<number>();\n\t\t\ttry {\n\t\t\t\tconst lines = await getCachedLines(document);\n\t\t\t\tblame = lines ? findBlameForLine(lines, line) : undefined;\n\t\t\t\tif (lines && settings.inlineBlameGutter) {\n\t\t\t\t\tfor (const entry of settings.inlineBlameSparse ? collapseBlameToHunkStarts(lines) : lines) {\n\t\t\t\t\t\tannotatedLines.add(entry.line);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst activeEditor = vscode.window.activeTextEditor;\n\t\t\t\tif (settings.currentLineBlame && activeEditor?.document.uri.toString() === document.uri.toString()) {\n\t\t\t\t\tannotatedLines.add(activeEditor.selection.active.line + 1);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tblame = undefined;\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!shouldShowBlameHoverAtPosition({\n\t\t\t\t\tmode: settings.blameHoverMode,\n\t\t\t\t\tpositionCharacter: position.character,\n\t\t\t\t\tlineLength: document.lineAt(position.line).text.length,\n\t\t\t\t\tline,\n\t\t\t\t\tannotatedLines,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst markdown = new vscode.MarkdownString(\n\t\t\t\tblame\n\t\t\t\t\t? buildCurrentLineBlameHoverMarkdown({\n\t\t\t\t\t\t\tentry: blame,\n\t\t\t\t\t\t\tabsolutePath: document.uri.fsPath,\n\t\t\t\t\t\t\tline,\n\t\t\t\t\t\t})\n\t\t\t\t\t: `[${formatTimelineAtLineHoverTitle({ line })}](command:${OPEN_TIMELINE_AT_LINE_COMMAND}?${encodeURIComponent(\n\t\t\t\t\t\t\tJSON.stringify({ absolutePath: document.uri.fsPath, line }),\n\t\t\t\t\t\t)})`,\n\t\t\t);\n\t\t\tmarkdown.isTrusted = true;\n\t\t\treturn new vscode.Hover(markdown);\n\t\t},\n\t};\n\n\tscheduleRefresh(0);\n\n\treturn vscode.Disposable.from(\n\t\tcurrentLineType,\n\t\tinlineGutterType,\n\t\tvscode.languages.registerHoverProvider({ scheme: 'file' }, hoverProvider),\n\t\tvscode.window.onDidChangeActiveTextEditor(() => {\n\t\t\tclearEditingState();\n\t\t\tscheduleRefresh(0);\n\t\t}),\n\t\tvscode.window.onDidChangeTextEditorSelection((event) => {\n\t\t\tif (event.textEditor !== vscode.window.activeTextEditor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isEditing(event.textEditor)) {\n\t\t\t\t// GitLens keeps annotations hidden while editing the current line.\n\t\t\t\t// Moving to another line ends that editing session and restores them.\n\t\t\t\tif (!selectionLinesMatch(editingSelectionLines, getSelectionLines(event.textEditor))) {\n\t\t\t\t\tclearEditingState();\n\t\t\t\t\tscheduleRefresh(0);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tscheduleRefresh(40);\n\t\t}),\n\t\tvscode.workspace.onDidChangeTextDocument((event) => {\n\t\t\tconst editor = vscode.window.activeTextEditor;\n\t\t\tif (event.document !== editor?.document) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcache.delete(event.document.uri.toString());\n\t\t\tif (event.contentChanges.length > 0) {\n\t\t\t\t// GitLens clears its current-line annotation during an edit so\n\t\t\t\t// inline completions can use the editor's end-of-line slot.\n\t\t\t\tmarkEditing(editor);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tscheduleRefresh(180);\n\t\t}),\n\t\tvscode.workspace.onDidSaveTextDocument((document) => {\n\t\t\tif (document.uri.toString() === vscode.window.activeTextEditor?.document.uri.toString()) {\n\t\t\t\tclearEditingState();\n\t\t\t\tscheduleRefresh(0);\n\t\t\t}\n\t\t}),\n\t\tonJjplusSettingsChange(() => {\n\t\t\tclearEditingState();\n\t\t\tscheduleRefresh(0);\n\t\t}),\n\t\t{\n\t\t\tdispose() {\n\t\t\t\tif (refreshTimer) {\n\t\t\t\t\tclearTimeout(refreshTimer);\n\t\t\t\t}\n\t\t\t\tclearEditingState();\n\t\t\t\tcache.clear();\n\t\t\t},\n\t\t},\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ require("./constants.cjs");
2
+ let node_child_process = require("node:child_process");
3
+ let node_fs_promises = require("node:fs/promises");
4
+ //#region src/extension/command-runner.ts
5
+ function createCommandRunner(args) {
6
+ const { outputChannel } = args;
7
+ const runLimited = createConcurrencyLimiter(args.concurrencyLimit ?? 6);
8
+ const runTool = async (request) => {
9
+ logCommand({
10
+ outputChannel,
11
+ ...request
12
+ });
13
+ return runLimited(() => new Promise((resolve, reject) => {
14
+ const child = (0, node_child_process.execFile)(request.command, request.args, {
15
+ cwd: request.workspacePath,
16
+ encoding: "utf8",
17
+ maxBuffer: 10485760,
18
+ signal: request.options?.signal
19
+ }, (error, stdout, stderr) => {
20
+ if (error) {
21
+ reject(error);
22
+ return;
23
+ }
24
+ resolve({
25
+ stdout: stdout || "",
26
+ stderr: stderr || ""
27
+ });
28
+ });
29
+ const signal = request.options?.signal;
30
+ if (!signal) return;
31
+ const abort = () => {
32
+ child.kill();
33
+ };
34
+ if (signal.aborted) {
35
+ abort();
36
+ return;
37
+ }
38
+ signal.addEventListener("abort", abort, { once: true });
39
+ }));
40
+ };
41
+ return {
42
+ runGit({ workspacePath, args: commandArgs, options }) {
43
+ return runTool({
44
+ command: "git",
45
+ workspacePath,
46
+ args: commandArgs,
47
+ options
48
+ });
49
+ },
50
+ runJj({ workspacePath, args: commandArgs, options }) {
51
+ return runTool({
52
+ command: "jj",
53
+ workspacePath,
54
+ args: commandArgs,
55
+ options
56
+ });
57
+ },
58
+ async fileExists({ filePath }) {
59
+ try {
60
+ await (0, node_fs_promises.access)(filePath);
61
+ return true;
62
+ } catch {
63
+ return false;
64
+ }
65
+ },
66
+ quoteShellArg
67
+ };
68
+ }
69
+ function createConcurrencyLimiter(limit) {
70
+ const max = Math.max(1, Math.floor(limit));
71
+ let active = 0;
72
+ const queue = [];
73
+ return async function runLimited(task) {
74
+ if (active >= max) await new Promise((resolve) => {
75
+ queue.push(resolve);
76
+ });
77
+ active += 1;
78
+ try {
79
+ return await task();
80
+ } finally {
81
+ active -= 1;
82
+ queue.shift()?.();
83
+ }
84
+ };
85
+ }
86
+ function logCommand(args) {
87
+ if (!args.outputChannel) return;
88
+ args.outputChannel.appendLine(`[${(/* @__PURE__ */ new Date()).toISOString()}] cwd=${args.workspacePath}`);
89
+ args.outputChannel.appendLine(`${args.command} ${args.args.map(quoteShellArg).join(" ")}`);
90
+ }
91
+ function quoteShellArg(value) {
92
+ if (/^[a-zA-Z0-9_@./:-]+$/u.test(value)) return value;
93
+ return `'${value.replace(/'/g, `'\\''`)}'`;
94
+ }
95
+ //#endregion
96
+ exports.createCommandRunner = createCommandRunner;
97
+ exports.createConcurrencyLimiter = createConcurrencyLimiter;
98
+
99
+ //# sourceMappingURL=command-runner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.cjs","names":["execFile","access"],"sources":["../../src/extension/command-runner.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { access } from 'node:fs/promises';\nimport type * as vscode from 'vscode';\nimport { COMMAND_CONCURRENCY_LIMIT } from './constants.ts';\nimport type { CommandResult, CommandRunner, RunCommandOptions } from './types.ts';\n\nexport function createCommandRunner(args: {\n\toutputChannel?: vscode.OutputChannel;\n\tconcurrencyLimit?: number;\n}): CommandRunner {\n\tconst { outputChannel } = args;\n\tconst runLimited = createConcurrencyLimiter(args.concurrencyLimit ?? COMMAND_CONCURRENCY_LIMIT);\n\n\tconst runTool = async (request: {\n\t\tcommand: 'git' | 'jj';\n\t\tworkspacePath: string;\n\t\targs: string[];\n\t\toptions?: RunCommandOptions;\n\t}): Promise<CommandResult> => {\n\t\tlogCommand({ outputChannel, ...request });\n\n\t\treturn runLimited(\n\t\t\t() =>\n\t\t\t\tnew Promise<CommandResult>((resolve, reject) => {\n\t\t\t\t\tconst child = execFile(\n\t\t\t\t\t\trequest.command,\n\t\t\t\t\t\trequest.args,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcwd: request.workspacePath,\n\t\t\t\t\t\t\tencoding: 'utf8',\n\t\t\t\t\t\t\tmaxBuffer: 10 * 1024 * 1024,\n\t\t\t\t\t\t\tsignal: request.options?.signal,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\tstdout: stdout || '',\n\t\t\t\t\t\t\t\tstderr: stderr || '',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst signal = request.options?.signal;\n\t\t\t\t\tif (!signal) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst abort = () => {\n\t\t\t\t\t\tchild.kill();\n\t\t\t\t\t};\n\n\t\t\t\t\tif (signal.aborted) {\n\t\t\t\t\t\tabort();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsignal.addEventListener('abort', abort, { once: true });\n\t\t\t\t}),\n\t\t);\n\t};\n\n\treturn {\n\t\trunGit({ workspacePath, args: commandArgs, options }) {\n\t\t\treturn runTool({ command: 'git', workspacePath, args: commandArgs, options });\n\t\t},\n\t\trunJj({ workspacePath, args: commandArgs, options }) {\n\t\t\treturn runTool({ command: 'jj', workspacePath, args: commandArgs, options });\n\t\t},\n\t\tasync fileExists({ filePath }) {\n\t\t\ttry {\n\t\t\t\tawait access(filePath);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tquoteShellArg,\n\t};\n}\n\nexport function createConcurrencyLimiter(limit: number): <T>(task: () => Promise<T>) => Promise<T> {\n\tconst max = Math.max(1, Math.floor(limit));\n\tlet active = 0;\n\tconst queue: Array<() => void> = [];\n\n\treturn async function runLimited<T>(task: () => Promise<T>): Promise<T> {\n\t\tif (active >= max) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tqueue.push(resolve);\n\t\t\t});\n\t\t}\n\n\t\tactive += 1;\n\t\ttry {\n\t\t\treturn await task();\n\t\t} finally {\n\t\t\tactive -= 1;\n\t\t\tqueue.shift()?.();\n\t\t}\n\t};\n}\n\nfunction logCommand(args: {\n\toutputChannel?: vscode.OutputChannel;\n\tcommand: 'git' | 'jj';\n\tworkspacePath: string;\n\targs: string[];\n}): void {\n\tif (!args.outputChannel) {\n\t\treturn;\n\t}\n\n\targs.outputChannel.appendLine(`[${new Date().toISOString()}] cwd=${args.workspacePath}`);\n\targs.outputChannel.appendLine(`${args.command} ${args.args.map(quoteShellArg).join(' ')}`);\n}\n\nfunction quoteShellArg(value: string): string {\n\tif (/^[a-zA-Z0-9_@./:-]+$/u.test(value)) {\n\t\treturn value;\n\t}\n\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n"],"mappings":";;;;AAMA,SAAgB,oBAAoB,MAGlB;CACjB,MAAM,EAAE,kBAAkB;CAC1B,MAAM,aAAa,yBAAyB,KAAK,oBAAA,CAA6C;CAE9F,MAAM,UAAU,OAAO,YAKO;EAC7B,WAAW;GAAE;GAAe,GAAG;EAAQ,CAAC;EAExC,OAAO,iBAEL,IAAI,SAAwB,SAAS,WAAW;GAC/C,MAAM,SAAA,GAAQA,mBAAAA,SAAAA,CACb,QAAQ,SACR,QAAQ,MACR;IACC,KAAK,QAAQ;IACb,UAAU;IACV,WAAW;IACX,QAAQ,QAAQ,SAAS;GAC1B,IACC,OAAO,QAAQ,WAAW;IAC1B,IAAI,OAAO;KACV,OAAO,KAAK;KACZ;IACD;IAEA,QAAQ;KACP,QAAQ,UAAU;KAClB,QAAQ,UAAU;IACnB,CAAC;GACF,CACD;GAEA,MAAM,SAAS,QAAQ,SAAS;GAChC,IAAI,CAAC,QACJ;GAGD,MAAM,cAAc;IACnB,MAAM,KAAK;GACZ;GAEA,IAAI,OAAO,SAAS;IACnB,MAAM;IACN;GACD;GAEA,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;EACvD,CAAC,CACH;CACD;CAEA,OAAO;EACN,OAAO,EAAE,eAAe,MAAM,aAAa,WAAW;GACrD,OAAO,QAAQ;IAAE,SAAS;IAAO;IAAe,MAAM;IAAa;GAAQ,CAAC;EAC7E;EACA,MAAM,EAAE,eAAe,MAAM,aAAa,WAAW;GACpD,OAAO,QAAQ;IAAE,SAAS;IAAM;IAAe,MAAM;IAAa;GAAQ,CAAC;EAC5E;EACA,MAAM,WAAW,EAAE,YAAY;GAC9B,IAAI;IACH,OAAA,GAAMC,iBAAAA,OAAAA,CAAO,QAAQ;IACrB,OAAO;GACR,QAAQ;IACP,OAAO;GACR;EACD;EACA;CACD;AACD;AAEA,SAAgB,yBAAyB,OAA0D;CAClG,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;CACzC,IAAI,SAAS;CACb,MAAM,QAA2B,CAAC;CAElC,OAAO,eAAe,WAAc,MAAoC;EACvE,IAAI,UAAU,KACb,MAAM,IAAI,SAAe,YAAY;GACpC,MAAM,KAAK,OAAO;EACnB,CAAC;EAGF,UAAU;EACV,IAAI;GACH,OAAO,MAAM,KAAK;EACnB,UAAU;GACT,UAAU;GACV,MAAM,MAAM,CAAC,GAAG;EACjB;CACD;AACD;AAEA,SAAS,WAAW,MAKX;CACR,IAAI,CAAC,KAAK,eACT;CAGD,KAAK,cAAc,WAAW,qBAAI,IAAI,KAAK,EAAA,CAAE,YAAY,EAAE,QAAQ,KAAK,eAAe;CACvF,KAAK,cAAc,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,KAAK,IAAI,aAAa,CAAC,CAAC,KAAK,GAAG,GAAG;AAC1F;AAEA,SAAS,cAAc,OAAuB;CAC7C,IAAI,wBAAwB,KAAK,KAAK,GACrC,OAAO;CAGR,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,EAAE;AACzC"}
@@ -0,0 +1,56 @@
1
+ //#region src/extension/constants.ts
2
+ const EXTENSION_ID = "astahmer.jj-plus";
3
+ const HELPER_COMMAND = "jj-plus.openRangeMultiDiff";
4
+ const OPEN_FILE_RANGE_DIFF_COMMAND = "jj-plus.openFileRangeDiff";
5
+ const OPEN_FILE_TIMELINE_COMMAND = "jj-plus.openFileRevisionTimeline";
6
+ const OPEN_REPO_TIMELINE_COMMAND = "jj-plus.openRepoTimeline";
7
+ const OPEN_FILE_LINE_TIMELINE_COMMAND = "jj-plus.openFileLineTimeline";
8
+ const OPEN_TIMELINE_AT_LINE_COMMAND = "jj-plus.openTimelineAtLine";
9
+ const OPEN_CHANGES_WITH_PREVIOUS_COMMAND = "jj-plus.openChangesWithPrevious";
10
+ const OPEN_REVISION_DIFF_PREVIOUS_COMMAND = "jj-plus.openRevisionDiffPrevious";
11
+ const OPEN_REVISION_DIFF_NEXT_COMMAND = "jj-plus.openRevisionDiffNext";
12
+ const OPEN_REVISION_DIFF_TIMELINE_COMMAND = "jj-plus.openRevisionDiffTimeline";
13
+ const CLEAR_LINE_HISTORY_COMMAND = "jj-plus.clearLineHistory";
14
+ const GET_TIMELINE_DEBUG_STATE_COMMAND = "jj-plus._debug.getTimelineState";
15
+ const GET_DIFF_LAYOUT_METRICS_COMMAND = "jj-plus._debug.getDiffLayoutMetrics";
16
+ const DEBUG_SELECT_TIMELINE_RANGE_COMMAND = "jj-plus._debug.selectTimelineRange";
17
+ const DEBUG_SET_LAYOUT_MODE_COMMAND = "jj-plus._debug.setLayoutMode";
18
+ const OPEN_RANGE_DIFF_URI_PATH = "/open-range-multi-diff";
19
+ const OPEN_MULTI_DIFF_COMMAND = "_workbench.openMultiDiffEditor";
20
+ const SNAPSHOT_SCHEME = "jj-plus";
21
+ const PENDING_RANGE_DIFF_KEY = "pendingRangeDiffArgs";
22
+ const TIMELINE_PREFERENCES_KEY = "timelinePanelPreferences";
23
+ const DEFAULT_FROM_REVSET = "closest_bookmark(@)";
24
+ const TIMELINE_PRESET_DAYS = {
25
+ year: 365,
26
+ "7d": 7,
27
+ "30d": 30,
28
+ "90d": 90,
29
+ all: Number.POSITIVE_INFINITY
30
+ };
31
+ //#endregion
32
+ exports.CLEAR_LINE_HISTORY_COMMAND = CLEAR_LINE_HISTORY_COMMAND;
33
+ exports.DEBUG_SELECT_TIMELINE_RANGE_COMMAND = DEBUG_SELECT_TIMELINE_RANGE_COMMAND;
34
+ exports.DEBUG_SET_LAYOUT_MODE_COMMAND = DEBUG_SET_LAYOUT_MODE_COMMAND;
35
+ exports.DEFAULT_FROM_REVSET = DEFAULT_FROM_REVSET;
36
+ exports.EXTENSION_ID = EXTENSION_ID;
37
+ exports.GET_DIFF_LAYOUT_METRICS_COMMAND = GET_DIFF_LAYOUT_METRICS_COMMAND;
38
+ exports.GET_TIMELINE_DEBUG_STATE_COMMAND = GET_TIMELINE_DEBUG_STATE_COMMAND;
39
+ exports.HELPER_COMMAND = HELPER_COMMAND;
40
+ exports.OPEN_CHANGES_WITH_PREVIOUS_COMMAND = OPEN_CHANGES_WITH_PREVIOUS_COMMAND;
41
+ exports.OPEN_FILE_LINE_TIMELINE_COMMAND = OPEN_FILE_LINE_TIMELINE_COMMAND;
42
+ exports.OPEN_FILE_RANGE_DIFF_COMMAND = OPEN_FILE_RANGE_DIFF_COMMAND;
43
+ exports.OPEN_FILE_TIMELINE_COMMAND = OPEN_FILE_TIMELINE_COMMAND;
44
+ exports.OPEN_MULTI_DIFF_COMMAND = OPEN_MULTI_DIFF_COMMAND;
45
+ exports.OPEN_RANGE_DIFF_URI_PATH = OPEN_RANGE_DIFF_URI_PATH;
46
+ exports.OPEN_REPO_TIMELINE_COMMAND = OPEN_REPO_TIMELINE_COMMAND;
47
+ exports.OPEN_REVISION_DIFF_NEXT_COMMAND = OPEN_REVISION_DIFF_NEXT_COMMAND;
48
+ exports.OPEN_REVISION_DIFF_PREVIOUS_COMMAND = OPEN_REVISION_DIFF_PREVIOUS_COMMAND;
49
+ exports.OPEN_REVISION_DIFF_TIMELINE_COMMAND = OPEN_REVISION_DIFF_TIMELINE_COMMAND;
50
+ exports.OPEN_TIMELINE_AT_LINE_COMMAND = OPEN_TIMELINE_AT_LINE_COMMAND;
51
+ exports.PENDING_RANGE_DIFF_KEY = PENDING_RANGE_DIFF_KEY;
52
+ exports.SNAPSHOT_SCHEME = SNAPSHOT_SCHEME;
53
+ exports.TIMELINE_PREFERENCES_KEY = TIMELINE_PREFERENCES_KEY;
54
+ exports.TIMELINE_PRESET_DAYS = TIMELINE_PRESET_DAYS;
55
+
56
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","names":[],"sources":["../../src/extension/constants.ts"],"sourcesContent":["export const EXTENSION_ID = 'astahmer.jj-plus';\nexport const HELPER_COMMAND = 'jj-plus.openRangeMultiDiff';\nexport const OPEN_FILE_RANGE_DIFF_COMMAND = 'jj-plus.openFileRangeDiff';\nexport const OPEN_FILE_TIMELINE_COMMAND = 'jj-plus.openFileRevisionTimeline';\nexport const OPEN_REPO_TIMELINE_COMMAND = 'jj-plus.openRepoTimeline';\nexport const OPEN_FILE_LINE_TIMELINE_COMMAND = 'jj-plus.openFileLineTimeline';\nexport const OPEN_TIMELINE_AT_LINE_COMMAND = 'jj-plus.openTimelineAtLine';\nexport const OPEN_CHANGES_WITH_PREVIOUS_COMMAND = 'jj-plus.openChangesWithPrevious';\nexport const OPEN_REVISION_DIFF_PREVIOUS_COMMAND = 'jj-plus.openRevisionDiffPrevious';\nexport const OPEN_REVISION_DIFF_NEXT_COMMAND = 'jj-plus.openRevisionDiffNext';\nexport const OPEN_REVISION_DIFF_TIMELINE_COMMAND = 'jj-plus.openRevisionDiffTimeline';\nexport const CLEAR_LINE_HISTORY_COMMAND = 'jj-plus.clearLineHistory';\nexport const GET_TIMELINE_DEBUG_STATE_COMMAND = 'jj-plus._debug.getTimelineState';\nexport const GET_DIFF_LAYOUT_METRICS_COMMAND = 'jj-plus._debug.getDiffLayoutMetrics';\nexport const DEBUG_SELECT_TIMELINE_RANGE_COMMAND = 'jj-plus._debug.selectTimelineRange';\nexport const DEBUG_SET_LAYOUT_MODE_COMMAND = 'jj-plus._debug.setLayoutMode';\nexport const OPEN_RANGE_DIFF_URI_PATH = '/open-range-multi-diff';\nexport const OPEN_MULTI_DIFF_COMMAND = '_workbench.openMultiDiffEditor';\nexport const SNAPSHOT_SCHEME = 'jj-plus';\nexport const PENDING_RANGE_DIFF_KEY = 'pendingRangeDiffArgs';\nexport const TIMELINE_PREFERENCES_KEY = 'timelinePanelPreferences';\nexport const CLI_SOURCE = 'cli';\nexport const DEFAULT_FROM_REVSET = 'closest_bookmark(@)';\nexport const DEFAULT_TO_REVSET = '@';\n/** First-paint history depth — keep cold open snappy; expand later if truncated. */\nexport const INITIAL_TIMELINE_ENTRIES = 50;\n/** Cap for full history / intermediate-revision fetches. */\nexport const MAX_TIMELINE_ENTRIES = 200;\nexport const MAX_SNAPSHOT_HYDRATION_CHANGES = 8;\n/** Shared limit for concurrent `jj` / `git` spawns (avoids EAGAIN thrash). */\nexport const COMMAND_CONCURRENCY_LIMIT = 6;\n\nexport const TIMELINE_PRESET_DAYS = {\n\tyear: 365,\n\t'7d': 7,\n\t'30d': 30,\n\t'90d': 90,\n\tall: Number.POSITIVE_INFINITY,\n} as const;\n"],"mappings":";AAAA,MAAa,eAAe;AAC5B,MAAa,iBAAiB;AAC9B,MAAa,+BAA+B;AAC5C,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAC1C,MAAa,kCAAkC;AAC/C,MAAa,gCAAgC;AAC7C,MAAa,qCAAqC;AAClD,MAAa,sCAAsC;AACnD,MAAa,kCAAkC;AAC/C,MAAa,sCAAsC;AACnD,MAAa,6BAA6B;AAC1C,MAAa,mCAAmC;AAChD,MAAa,kCAAkC;AAC/C,MAAa,sCAAsC;AACnD,MAAa,gCAAgC;AAC7C,MAAa,2BAA2B;AACxC,MAAa,0BAA0B;AACvC,MAAa,kBAAkB;AAC/B,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AAExC,MAAa,sBAAsB;AAUnC,MAAa,uBAAuB;CACnC,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,KAAK,OAAO;AACb"}