@pi-chamber/web 0.1.8

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 (1152) hide show
  1. package/README.md +43 -0
  2. package/bin/cli-entry.js +55 -0
  3. package/bin/cli-output.js +140 -0
  4. package/bin/cli-output.test.js +36 -0
  5. package/bin/cli.js +383 -0
  6. package/bin/cli.test.js +1065 -0
  7. package/bin/lib/DOCUMENTATION.md +31 -0
  8. package/bin/lib/cli-api-target.js +74 -0
  9. package/bin/lib/cli-args.js +846 -0
  10. package/bin/lib/cli-errors.js +18 -0
  11. package/bin/lib/cli-http.js +252 -0
  12. package/bin/lib/cli-lifecycle.js +421 -0
  13. package/bin/lib/cli-log-files.js +93 -0
  14. package/bin/lib/cli-network.js +186 -0
  15. package/bin/lib/cli-paths.js +128 -0
  16. package/bin/lib/cli-ports.js +51 -0
  17. package/bin/lib/cli-process.js +342 -0
  18. package/bin/lib/cli-startup.js +371 -0
  19. package/bin/lib/cli-tunnel-capabilities.js +9 -0
  20. package/bin/lib/cli-tunnel-profiles.js +366 -0
  21. package/bin/lib/cli-tunnel-utils.js +300 -0
  22. package/bin/lib/commands-connect-url.js +329 -0
  23. package/bin/lib/commands-lifecycle.js +396 -0
  24. package/bin/lib/commands-logs.js +110 -0
  25. package/bin/lib/commands-serve.js +419 -0
  26. package/bin/lib/commands-startup.js +64 -0
  27. package/bin/lib/commands-status.js +114 -0
  28. package/bin/lib/commands-tunnel.js +1761 -0
  29. package/bin/lib/commands-update.js +184 -0
  30. package/bin/lib/commands-update.test.js +98 -0
  31. package/dist/apple-touch-icon-120x120.png +0 -0
  32. package/dist/apple-touch-icon-152x152.png +0 -0
  33. package/dist/apple-touch-icon-167x167.png +0 -0
  34. package/dist/apple-touch-icon-180x180.png +0 -0
  35. package/dist/apple-touch-icon.png +0 -0
  36. package/dist/apple-touch-icon.svg +13 -0
  37. package/dist/assets/CommitSection-DGGArAb2.js +1 -0
  38. package/dist/assets/DiagramEditor-ig5nYV6t.js +1 -0
  39. package/dist/assets/DiagramView-8Qr6pwwI.js +1 -0
  40. package/dist/assets/DiffView-BHS4m_K7.js +18 -0
  41. package/dist/assets/FilesView-DmZcdwl-.js +14 -0
  42. package/dist/assets/GitView-gfHxmc66.js +6 -0
  43. package/dist/assets/JsonTreeView-DbFqka3P.js +1 -0
  44. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  45. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  46. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  47. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  48. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  49. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  50. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  51. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  52. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  53. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  54. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  55. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  56. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  57. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  58. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  59. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  60. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  61. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  62. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  63. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  64. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  65. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  66. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  67. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  68. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  69. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  70. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  71. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  72. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  73. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  74. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  75. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  76. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  77. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  78. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  79. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  80. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  81. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  82. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  83. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  84. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  85. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  86. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  87. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  88. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  89. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  90. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  91. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  92. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  93. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  94. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  95. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  96. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  97. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  98. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  99. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  100. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  101. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  102. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  103. package/dist/assets/MarkdownRendererImpl-B07lHhBl.js +12 -0
  104. package/dist/assets/PatchDiff-DD9pAs47.js +1 -0
  105. package/dist/assets/PierreDiffViewer-Bo0_BCT7.js +136 -0
  106. package/dist/assets/SessionSwitcherDropdown-t7WZX24f.js +1 -0
  107. package/dist/assets/SettingsView-CtsS4oDI.js +3 -0
  108. package/dist/assets/SettingsWindow-DIRGn3eQ.js +1 -0
  109. package/dist/assets/TerminalView-BV3KOtdA.css +1 -0
  110. package/dist/assets/TerminalView-DUwO1CCY.js +46 -0
  111. package/dist/assets/ToolOutputDialog-iZG2ey4T.js +15 -0
  112. package/dist/assets/ToolPartDiffPreview-FTexlZSz.js +8 -0
  113. package/dist/assets/VirtualizedFileDiff-DD5IznIe.js +10 -0
  114. package/dist/assets/Virtualizer-BxW2CJGB.js +1 -0
  115. package/dist/assets/abap-BdImnpbu.js +1 -0
  116. package/dist/assets/abap-Dg923wIy.js +1 -0
  117. package/dist/assets/actionscript-3-8WTK4YD2.js +1 -0
  118. package/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  119. package/dist/assets/ada-CTi7YQtL.js +1 -0
  120. package/dist/assets/ada-bCR0ucgS.js +1 -0
  121. package/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  122. package/dist/assets/andromeeda-CT0vplkN.js +1 -0
  123. package/dist/assets/angular-html-CU67Zn6k.js +1 -0
  124. package/dist/assets/angular-html-D2R1pe45.js +1 -0
  125. package/dist/assets/angular-ts-BDmYQnhm.js +1 -0
  126. package/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  127. package/dist/assets/apache-PcO-DBxQ.js +1 -0
  128. package/dist/assets/apache-Pmp26Uib.js +1 -0
  129. package/dist/assets/apex-CnCu5_gb.js +1 -0
  130. package/dist/assets/apex-D8_7TLub.js +1 -0
  131. package/dist/assets/apl-B4CMkyY2.js +1 -0
  132. package/dist/assets/apl-DkfyvC6M.js +1 -0
  133. package/dist/assets/apl-dKokRX4l.js +1 -0
  134. package/dist/assets/appThemeRegistry-BK0dHKa6.js +1 -0
  135. package/dist/assets/applescript-Co6uUVPk.js +1 -0
  136. package/dist/assets/applescript-Ds_W2jPS.js +1 -0
  137. package/dist/assets/ara-BRHolxvo.js +1 -0
  138. package/dist/assets/ara-C1--7J61.js +1 -0
  139. package/dist/assets/asciiarmor-Df11BRmG.js +1 -0
  140. package/dist/assets/asciidoc-Ve4PFQV2.js +1 -0
  141. package/dist/assets/asciidoc-nTfEFGxb.js +1 -0
  142. package/dist/assets/asm-CTFRnVOM.js +1 -0
  143. package/dist/assets/asm-D_Q5rh1f.js +1 -0
  144. package/dist/assets/asn1-EdZsLKOL.js +1 -0
  145. package/dist/assets/asterisk-B-8jnY81.js +1 -0
  146. package/dist/assets/astro-CbQHKStN.js +1 -0
  147. package/dist/assets/astro-DtPAdMss.js +1 -0
  148. package/dist/assets/aurora-x-C0VKFdlO.js +1 -0
  149. package/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  150. package/dist/assets/awk-CrWgQKhV.js +1 -0
  151. package/dist/assets/awk-DMzUqQB5.js +1 -0
  152. package/dist/assets/ayu-dark-DYE7WIF3.js +1 -0
  153. package/dist/assets/ayu-dark-wZ6ORhBL.js +1 -0
  154. package/dist/assets/ayu-light-BA47KaF1.js +1 -0
  155. package/dist/assets/ayu-light-xXLJ_Ch1.js +1 -0
  156. package/dist/assets/ayu-mirage-32ctXXKs.js +1 -0
  157. package/dist/assets/ayu-mirage-CQckA_sP.js +1 -0
  158. package/dist/assets/ballerina-BFfxhgS-.js +1 -0
  159. package/dist/assets/ballerina-a0yOSyc5.js +1 -0
  160. package/dist/assets/bat-B0cHNp6s.js +1 -0
  161. package/dist/assets/bat-BkioyH1T.js +1 -0
  162. package/dist/assets/beancount-dPJi_gci.js +1 -0
  163. package/dist/assets/beancount-k_qm7-4y.js +1 -0
  164. package/dist/assets/berry-CVKoklHx.js +1 -0
  165. package/dist/assets/berry-uYugtg8r.js +1 -0
  166. package/dist/assets/bibtex-CHM0blh-.js +1 -0
  167. package/dist/assets/bibtex-DRcCXNgM.js +1 -0
  168. package/dist/assets/bicep-Bmn6On1c.js +1 -0
  169. package/dist/assets/bicep-jWz-hQ8I.js +1 -0
  170. package/dist/assets/bird2-DPOp833l.js +1 -0
  171. package/dist/assets/bird2-DaGXIRGu.js +1 -0
  172. package/dist/assets/blade-D4QpJJKB.js +1 -0
  173. package/dist/assets/blade-QlWdzBxO.js +1 -0
  174. package/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  175. package/dist/assets/bsl-BO_Y6i37.js +1 -0
  176. package/dist/assets/bsl-jNujDQK2.js +1 -0
  177. package/dist/assets/c-BG-tZi7o.js +1 -0
  178. package/dist/assets/c-BIGW1oBm.js +1 -0
  179. package/dist/assets/c3-Fcb8_HKm.js +1 -0
  180. package/dist/assets/c3-eo99z4R2.js +1 -0
  181. package/dist/assets/cadence-BuaeHeSu.js +1 -0
  182. package/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  183. package/dist/assets/cairo-BYiDgOF2.js +1 -0
  184. package/dist/assets/cairo-KRGpt6FW.js +1 -0
  185. package/dist/assets/catppuccin-frappe-CfssSZMA.js +1 -0
  186. package/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  187. package/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  188. package/dist/assets/catppuccin-latte-DoBaWTGn.js +1 -0
  189. package/dist/assets/catppuccin-macchiato-BkAuvdZC.js +1 -0
  190. package/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  191. package/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  192. package/dist/assets/catppuccin-mocha-D9fcC0iT.js +1 -0
  193. package/dist/assets/clarity-CC_0IFDj.js +1 -0
  194. package/dist/assets/clarity-D53aC0YG.js +1 -0
  195. package/dist/assets/clike-B9uivgTg.js +1 -0
  196. package/dist/assets/clojure-BMjYHr_A.js +1 -0
  197. package/dist/assets/clojure-KnfDkB_V.js +1 -0
  198. package/dist/assets/clojure-P80f7IUj.js +1 -0
  199. package/dist/assets/cmake-BQqOBYOt.js +1 -0
  200. package/dist/assets/cmake-D1j8_8rp.js +1 -0
  201. package/dist/assets/cmake-bh2MLnkv.js +1 -0
  202. package/dist/assets/cobol-CWcv1MsR.js +1 -0
  203. package/dist/assets/cobol-dIXRVV9Y.js +1 -0
  204. package/dist/assets/cobol-nwyudZeR.js +1 -0
  205. package/dist/assets/codeowners-Bp6g37R7.js +1 -0
  206. package/dist/assets/codeowners-CtwIM3TN.js +1 -0
  207. package/dist/assets/codeql-D164juXQ.js +1 -0
  208. package/dist/assets/codeql-DsOJ9woJ.js +1 -0
  209. package/dist/assets/coffee-Bk-z6oI_.js +1 -0
  210. package/dist/assets/coffee-Ch7k5sss.js +1 -0
  211. package/dist/assets/coffeescript-S37ZYGWr.js +1 -0
  212. package/dist/assets/collapsible-ODWWxk4f.js +1 -0
  213. package/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  214. package/dist/assets/common-lisp-DXc9XcIM.js +1 -0
  215. package/dist/assets/commonlisp-DBKNyK5s.js +1 -0
  216. package/dist/assets/computeVirtualFileMetrics-DdXkLFAD.js +3 -0
  217. package/dist/assets/contextFileOpenGuard-uC4OerzL.js +1 -0
  218. package/dist/assets/coq-BBL5-mG4.js +1 -0
  219. package/dist/assets/coq-DkFqJrB1.js +1 -0
  220. package/dist/assets/cpp-C0lzDePx.js +1 -0
  221. package/dist/assets/cpp-CofmeUqb.js +1 -0
  222. package/dist/assets/crystal-Bhade0k2.js +1 -0
  223. package/dist/assets/crystal-SjHAIU92.js +1 -0
  224. package/dist/assets/crystal-tKQVLTB8.js +1 -0
  225. package/dist/assets/csharp-B7nLXyi8.js +1 -0
  226. package/dist/assets/csharp-COcwbKMJ.js +1 -0
  227. package/dist/assets/css-BnMrqG3P.js +1 -0
  228. package/dist/assets/css-DPfMkruS.js +1 -0
  229. package/dist/assets/css-PZBBrkI0.js +1 -0
  230. package/dist/assets/csv-D5aBhKLr.js +1 -0
  231. package/dist/assets/csv-fuZLfV_i.js +1 -0
  232. package/dist/assets/cue-D82EKSYY.js +1 -0
  233. package/dist/assets/cue-WCin6O4e.js +1 -0
  234. package/dist/assets/cypher-COkxafJQ.js +1 -0
  235. package/dist/assets/cypher-C_CwsFkJ.js +1 -0
  236. package/dist/assets/cypher-DYQk2G82.js +1 -0
  237. package/dist/assets/d-85-TOEBH.js +1 -0
  238. package/dist/assets/d-DVc-yF-l.js +1 -0
  239. package/dist/assets/d-pRatUO7H.js +1 -0
  240. package/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  241. package/dist/assets/dark-plus-DLU5INA3.js +1 -0
  242. package/dist/assets/dart-CF10PKvl.js +1 -0
  243. package/dist/assets/dart-YLd5yyRs.js +1 -0
  244. package/dist/assets/dax-CEL-wOlO.js +1 -0
  245. package/dist/assets/dax-oldcCaJg.js +1 -0
  246. package/dist/assets/desktop-BmXAJ9_W.js +1 -0
  247. package/dist/assets/desktop-DZfyBMgF.js +1 -0
  248. package/dist/assets/diff-D97Zzqfu.js +1 -0
  249. package/dist/assets/diff-DbItnlRl.js +1 -0
  250. package/dist/assets/diff-jW5kmiru.js +1 -0
  251. package/dist/assets/docker-BcOcwvcX.js +1 -0
  252. package/dist/assets/docker-DG9neUKd.js +1 -0
  253. package/dist/assets/dockerfile-BKs6k2Af.js +1 -0
  254. package/dist/assets/document-attachments-BslE4Ns7.js +30 -0
  255. package/dist/assets/dotenv-Bea-FkXq.js +1 -0
  256. package/dist/assets/dotenv-Da5cRb03.js +1 -0
  257. package/dist/assets/dracula-BzJJZx-M.js +1 -0
  258. package/dist/assets/dracula-XcYHBZy6.js +1 -0
  259. package/dist/assets/dracula-soft-BPeX9gxW.js +1 -0
  260. package/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  261. package/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  262. package/dist/assets/dream-maker-DAHQwpwp.js +1 -0
  263. package/dist/assets/dtd-DF_7sFjM.js +1 -0
  264. package/dist/assets/dylan-DwRh75JA.js +1 -0
  265. package/dist/assets/ebnf-CDyGwa7X.js +1 -0
  266. package/dist/assets/ecl-Cabwm37j.js +1 -0
  267. package/dist/assets/edge-BkV0erSs.js +1 -0
  268. package/dist/assets/edge-zt3dU95k.js +1 -0
  269. package/dist/assets/eiffel-CnydiIhH.js +1 -0
  270. package/dist/assets/elixir-CDX3lj18.js +1 -0
  271. package/dist/assets/elixir-JolcG37e.js +1 -0
  272. package/dist/assets/elm-BjIDgKzz.js +1 -0
  273. package/dist/assets/elm-DbKCFpqz.js +1 -0
  274. package/dist/assets/elm-vLlmbW-K.js +1 -0
  275. package/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  276. package/dist/assets/emacs-lisp-DMBh55R4.js +1 -0
  277. package/dist/assets/erb-B12qg9BL.js +1 -0
  278. package/dist/assets/erb-rsjdL4fB.js +1 -0
  279. package/dist/assets/erlang-BNw1qcRV.js +1 -0
  280. package/dist/assets/erlang-DNeY46SW.js +1 -0
  281. package/dist/assets/erlang-DsQrWhSR.js +1 -0
  282. package/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  283. package/dist/assets/everforest-dark-WOub3wle.js +1 -0
  284. package/dist/assets/everforest-light-C8M2exoo.js +1 -0
  285. package/dist/assets/everforest-light-DCUg8VH8.js +1 -0
  286. package/dist/assets/factor-kuTfRLto.js +1 -0
  287. package/dist/assets/fcl-Kvtd6kyn.js +1 -0
  288. package/dist/assets/fennel-BYunw83y.js +1 -0
  289. package/dist/assets/fennel-DBMsxtrh.js +1 -0
  290. package/dist/assets/fish-BvzEVeQv.js +1 -0
  291. package/dist/assets/fish-BxskpYPN.js +1 -0
  292. package/dist/assets/fluent-Bwo2XpEt.js +1 -0
  293. package/dist/assets/fluent-C4IJs8-o.js +1 -0
  294. package/dist/assets/forth-Ffai-XNe.js +1 -0
  295. package/dist/assets/fortran-DYz_wnZ1.js +1 -0
  296. package/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  297. package/dist/assets/fortran-fixed-form-DFFnVrrY.js +1 -0
  298. package/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  299. package/dist/assets/fortran-free-form-DB5N_DgY.js +1 -0
  300. package/dist/assets/fsharp-CXgrBDvD.js +1 -0
  301. package/dist/assets/fsharp-DRAF1jsN.js +1 -0
  302. package/dist/assets/gas-Bneqetm1.js +1 -0
  303. package/dist/assets/gdresource-BD-1uzY7.js +1 -0
  304. package/dist/assets/gdresource-BOOCDP_w.js +1 -0
  305. package/dist/assets/gdscript-C3mT4Uym.js +1 -0
  306. package/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  307. package/dist/assets/gdshader-DkwncUOv.js +1 -0
  308. package/dist/assets/gdshader-G7X6ysY3.js +1 -0
  309. package/dist/assets/genie-D0YGMca9.js +1 -0
  310. package/dist/assets/genie-DSsjfZMX.js +1 -0
  311. package/dist/assets/gherkin-Cl2Fw-_0.js +1 -0
  312. package/dist/assets/gherkin-DyxjwDmM.js +1 -0
  313. package/dist/assets/gherkin-heZmZLOM.js +1 -0
  314. package/dist/assets/git-commit-CJPsQObV.js +1 -0
  315. package/dist/assets/git-commit-F4YmCXRG.js +1 -0
  316. package/dist/assets/git-rebase-DeZqv4fp.js +1 -0
  317. package/dist/assets/git-rebase-r7XF79zn.js +1 -0
  318. package/dist/assets/github-dark-BQV5ugrc.js +1 -0
  319. package/dist/assets/github-dark-DHJKELXO.js +1 -0
  320. package/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  321. package/dist/assets/github-dark-default-DLWDM7FH.js +1 -0
  322. package/dist/assets/github-dark-dimmed-D1FmiR_p.js +1 -0
  323. package/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  324. package/dist/assets/github-dark-high-contrast-BilLoi0o.js +1 -0
  325. package/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  326. package/dist/assets/github-light-DAi9KRSo.js +1 -0
  327. package/dist/assets/github-light-Rcb2q3L5.js +1 -0
  328. package/dist/assets/github-light-default-CQ75esMw.js +1 -0
  329. package/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  330. package/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  331. package/dist/assets/github-light-high-contrast-CRF1wyLy.js +1 -0
  332. package/dist/assets/gleam-BeBqoPwE.js +1 -0
  333. package/dist/assets/gleam-BspZqrRM.js +1 -0
  334. package/dist/assets/glimmer-js-BuyKUjfV.js +1 -0
  335. package/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  336. package/dist/assets/glimmer-ts-D9iniPFN.js +1 -0
  337. package/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  338. package/dist/assets/glsl-BOG9l2nV.js +1 -0
  339. package/dist/assets/glsl-DplSGwfg.js +1 -0
  340. package/dist/assets/gn-Dxr0sSUf.js +1 -0
  341. package/dist/assets/gn-n2N0HUVH.js +1 -0
  342. package/dist/assets/gnuplot-CtW3R_Hz.js +1 -0
  343. package/dist/assets/gnuplot-DdkO51Og.js +1 -0
  344. package/dist/assets/go-BBr2UQCn.js +1 -0
  345. package/dist/assets/go-CxLEBnE3.js +1 -0
  346. package/dist/assets/graphql-B6XHM4uj.js +1 -0
  347. package/dist/assets/graphql-ChdNCCLP.js +1 -0
  348. package/dist/assets/groovy-D9Dt4D0W.js +1 -0
  349. package/dist/assets/groovy-DFxE31Qs.js +1 -0
  350. package/dist/assets/groovy-gcz8RCvz.js +1 -0
  351. package/dist/assets/gruvbox-dark-hard-C37G1gbc.js +1 -0
  352. package/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  353. package/dist/assets/gruvbox-dark-medium-C3G9m3TV.js +1 -0
  354. package/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  355. package/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  356. package/dist/assets/gruvbox-dark-soft-eZmcmZ9I.js +1 -0
  357. package/dist/assets/gruvbox-light-hard-BYj-vz_3.js +1 -0
  358. package/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  359. package/dist/assets/gruvbox-light-medium-BdQlDiiF.js +1 -0
  360. package/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  361. package/dist/assets/gruvbox-light-soft-BGNwjiRh.js +1 -0
  362. package/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  363. package/dist/assets/hack-CaT9iCJl.js +1 -0
  364. package/dist/assets/hack-Cxa-FaZ4.js +1 -0
  365. package/dist/assets/haml-2e0EI6Is.js +1 -0
  366. package/dist/assets/haml-B8DHNrY2.js +1 -0
  367. package/dist/assets/handlebars-BL8al0AC.js +1 -0
  368. package/dist/assets/handlebars-CojHdNmS.js +1 -0
  369. package/dist/assets/haskell-BfdhR_WN.js +1 -0
  370. package/dist/assets/haskell-Cw1EW3IL.js +1 -0
  371. package/dist/assets/haskell-Df6bDoY_.js +1 -0
  372. package/dist/assets/haxe-CzTSHFRz.js +1 -0
  373. package/dist/assets/haxe-DVIybFAS.js +1 -0
  374. package/dist/assets/haxe-H-WmDvRZ.js +1 -0
  375. package/dist/assets/hcl-B6OePqme.js +1 -0
  376. package/dist/assets/hcl-BWvSN4gD.js +1 -0
  377. package/dist/assets/hjson-D2jn7IRw.js +1 -0
  378. package/dist/assets/hjson-D5-asLiD.js +1 -0
  379. package/dist/assets/hlsl-D3lLCCz7.js +1 -0
  380. package/dist/assets/hlsl-MKeth5V9.js +1 -0
  381. package/dist/assets/horizon-BUw7H-hv.js +1 -0
  382. package/dist/assets/horizon-bright-Cn-bp-IR.js +1 -0
  383. package/dist/assets/horizon-bright-CoQRYDvy.js +1 -0
  384. package/dist/assets/horizon-cslQss18.js +1 -0
  385. package/dist/assets/houston-DnULxvSX.js +1 -0
  386. package/dist/assets/houston-RHIKkNfR.js +1 -0
  387. package/dist/assets/html-DOf0XnR2.js +1 -0
  388. package/dist/assets/html-GMplVEZG.js +1 -0
  389. package/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  390. package/dist/assets/html-derivative-DfCZ6Hio.js +1 -0
  391. package/dist/assets/http-CG3jvXcS.js +1 -0
  392. package/dist/assets/http-DBlCnlav.js +1 -0
  393. package/dist/assets/http-jrhK8wxY.js +1 -0
  394. package/dist/assets/hurl-CxQrh4RI.js +1 -0
  395. package/dist/assets/hurl-irOxFIW8.js +1 -0
  396. package/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  397. package/dist/assets/hxml-CkS3Eie7.js +1 -0
  398. package/dist/assets/hy-DFXneXwc.js +1 -0
  399. package/dist/assets/hy-DI6mCUnw.js +1 -0
  400. package/dist/assets/idl-BEugSyMb.js +1 -0
  401. package/dist/assets/imba-D-Pk5S0X.js +1 -0
  402. package/dist/assets/imba-DGztddWO.js +1 -0
  403. package/dist/assets/index-CRB7i1S2.js +8 -0
  404. package/dist/assets/index-C_Mo87uS.css +1 -0
  405. package/dist/assets/index-MSKFS67y.js +1 -0
  406. package/dist/assets/ini-BEwlwnbL.js +1 -0
  407. package/dist/assets/ini-Dix3pTmg.js +1 -0
  408. package/dist/assets/isDiffPlainText-CeCQwHA2.js +1 -0
  409. package/dist/assets/isFilePlainText-BcfhE9FH.js +1 -0
  410. package/dist/assets/java-BTDmaRNO.js +1 -0
  411. package/dist/assets/java-CylS5w8V.js +1 -0
  412. package/dist/assets/javascript-BO_2ioGC.js +1 -0
  413. package/dist/assets/javascript-WyGyM1wV.js +1 -0
  414. package/dist/assets/javascript-wDzz0qaB.js +1 -0
  415. package/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  416. package/dist/assets/jinja-D0mZ3q2r.js +1 -0
  417. package/dist/assets/jison-B9XHrcYJ.js +1 -0
  418. package/dist/assets/jison-wvAkD_A8.js +1 -0
  419. package/dist/assets/json-B8JryHcM.js +1 -0
  420. package/dist/assets/json-Cp-IABpG.js +1 -0
  421. package/dist/assets/json5-C9tS-k6U.js +1 -0
  422. package/dist/assets/json5-Cdatmj9n.js +1 -0
  423. package/dist/assets/jsonc-CvUCa1o5.js +1 -0
  424. package/dist/assets/jsonc-Des-eS-w.js +1 -0
  425. package/dist/assets/jsonl-9I_GBd5L.js +1 -0
  426. package/dist/assets/jsonl-DcaNXYhu.js +1 -0
  427. package/dist/assets/jsonnet-DFQXde-d.js +1 -0
  428. package/dist/assets/jsonnet-XoenQ2oc.js +1 -0
  429. package/dist/assets/jssm-C2t-YnRu.js +1 -0
  430. package/dist/assets/jssm-CWE2S0Z5.js +1 -0
  431. package/dist/assets/jsx-8cLv2Six.js +1 -0
  432. package/dist/assets/jsx-g9-lgVsj.js +1 -0
  433. package/dist/assets/julia-C1oINnwa.js +1 -0
  434. package/dist/assets/julia-CxzCAyBv.js +1 -0
  435. package/dist/assets/julia-DuME0IfC.js +1 -0
  436. package/dist/assets/just-Bo3fV9RY.js +1 -0
  437. package/dist/assets/just-Cw27pwNe.js +1 -0
  438. package/dist/assets/kanagawa-dragon-BOvIHJVT.js +1 -0
  439. package/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  440. package/dist/assets/kanagawa-lotus-Bwcd7Bvx.js +1 -0
  441. package/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  442. package/dist/assets/kanagawa-wave-0SAlpf0s.js +1 -0
  443. package/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  444. package/dist/assets/kdl-CMbyIXjQ.js +1 -0
  445. package/dist/assets/kdl-DV7GczEv.js +1 -0
  446. package/dist/assets/kimi-for-coding-eVEHug_h.svg +3 -0
  447. package/dist/assets/kotlin-BQy537ds.js +1 -0
  448. package/dist/assets/kotlin-BdnUsdx6.js +1 -0
  449. package/dist/assets/kusto-B_y0uMaZ.js +1 -0
  450. package/dist/assets/kusto-DZf3V79B.js +1 -0
  451. package/dist/assets/laserwave-DUszq2jm.js +1 -0
  452. package/dist/assets/laserwave-si7wuSrt.js +1 -0
  453. package/dist/assets/latex-CWtU0Tv5.js +1 -0
  454. package/dist/assets/latex-CZAhoKip.js +1 -0
  455. package/dist/assets/lean-BZvkOJ9d.js +1 -0
  456. package/dist/assets/lean-C4RHkN41.js +1 -0
  457. package/dist/assets/less-B1dDrJ26.js +1 -0
  458. package/dist/assets/less-XNfgnZC7.js +1 -0
  459. package/dist/assets/light-plus-B7mTdjB0.js +1 -0
  460. package/dist/assets/light-plus-g_Fi9vkG.js +1 -0
  461. package/dist/assets/liquid-DFlqVvG0.js +1 -0
  462. package/dist/assets/liquid-DYVedYrR.js +1 -0
  463. package/dist/assets/livescript-BwQOo05w.js +1 -0
  464. package/dist/assets/llmapi-detailed-Pup_107f.svg +28 -0
  465. package/dist/assets/llvm-BJRUtCev.js +1 -0
  466. package/dist/assets/llvm-DjAJT7YJ.js +1 -0
  467. package/dist/assets/log-2UxHyX5q.js +1 -0
  468. package/dist/assets/log-CcaF_xNv.js +1 -0
  469. package/dist/assets/logo-BtOb2qkB.js +1 -0
  470. package/dist/assets/logo-D9WQLoKQ.js +1 -0
  471. package/dist/assets/lua-8Av-h-ns.js +1 -0
  472. package/dist/assets/lua-BaeVxFsk.js +1 -0
  473. package/dist/assets/lua-BgMRiT3U.js +1 -0
  474. package/dist/assets/luau-BTSFCcFb.js +1 -0
  475. package/dist/assets/luau-C-HG3fhB.js +1 -0
  476. package/dist/assets/main-CPygRDd9.js +134 -0
  477. package/dist/assets/main-DZg4qzOe.js +2 -0
  478. package/dist/assets/make-CHLpvVh8.js +1 -0
  479. package/dist/assets/make-DXVx14cr.js +1 -0
  480. package/dist/assets/markdown-Cvjx9yec.js +1 -0
  481. package/dist/assets/markdown-DX-TNHnc.js +1 -0
  482. package/dist/assets/markdown-shiki.worker-DnvH1S1x.js +12 -0
  483. package/dist/assets/markdownCore-BULtt6Xa.js +2 -0
  484. package/dist/assets/marko-CnJfTvn9.js +1 -0
  485. package/dist/assets/marko-DiIoNBFw.js +1 -0
  486. package/dist/assets/material-theme-CIJ3cGaW.js +1 -0
  487. package/dist/assets/material-theme-D5KoaKCx.js +1 -0
  488. package/dist/assets/material-theme-darker-BWg3m1GB.js +1 -0
  489. package/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  490. package/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  491. package/dist/assets/material-theme-lighter-DR8HWMN7.js +1 -0
  492. package/dist/assets/material-theme-ocean-CZf9pk28.js +1 -0
  493. package/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  494. package/dist/assets/material-theme-palenight-BF01YeZy.js +1 -0
  495. package/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  496. package/dist/assets/mathematica-DTrFuWx2.js +1 -0
  497. package/dist/assets/matlab-D7o27uSR.js +1 -0
  498. package/dist/assets/matlab-DzreyMvm.js +1 -0
  499. package/dist/assets/mbox-CNhZ1qSd.js +1 -0
  500. package/dist/assets/mdc-BMNejdWA.js +1 -0
  501. package/dist/assets/mdc-D_DpLax5.js +1 -0
  502. package/dist/assets/mdx-C2fqO2XY.js +1 -0
  503. package/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  504. package/dist/assets/mermaid-Cwy4Up_p.js +1 -0
  505. package/dist/assets/mermaid-mWjccvbQ.js +1 -0
  506. package/dist/assets/min-dark-CafNBF8u.js +1 -0
  507. package/dist/assets/min-dark-DhfaepVE.js +1 -0
  508. package/dist/assets/min-light-6xx0uMgm.js +1 -0
  509. package/dist/assets/min-light-CTRr51gU.js +1 -0
  510. package/dist/assets/miniChat-BFotDgpO.js +2 -0
  511. package/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  512. package/dist/assets/mipsasm-yE_Aqo9y.js +1 -0
  513. package/dist/assets/mirc-CjQqDB4T.js +1 -0
  514. package/dist/assets/mllike-BO34x3tv.js +1 -0
  515. package/dist/assets/mobile-3LLzhN5Q.js +2 -0
  516. package/dist/assets/modelica-Dc1JOy9r.js +1 -0
  517. package/dist/assets/mojo-M6pJPbMk.js +1 -0
  518. package/dist/assets/mojo-rZm6bMo-.js +1 -0
  519. package/dist/assets/monokai-BodnsaDQ.js +1 -0
  520. package/dist/assets/monokai-D4h5O-jR.js +1 -0
  521. package/dist/assets/moonbit-CR8uFLGd.js +1 -0
  522. package/dist/assets/moonbit-_H4v1dQx.js +1 -0
  523. package/dist/assets/move-CyYMWVy5.js +1 -0
  524. package/dist/assets/move-IF9eRakj.js +1 -0
  525. package/dist/assets/mscgen-BA5vi2Kp.js +1 -0
  526. package/dist/assets/mumps-BT43cFF4.js +1 -0
  527. package/dist/assets/narrat-DRg8JJMk.js +1 -0
  528. package/dist/assets/narrat-DXUZ_ZkW.js +1 -0
  529. package/dist/assets/nextflow-BPolriEg.js +1 -0
  530. package/dist/assets/nextflow-Zz6hmt5N.js +1 -0
  531. package/dist/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  532. package/dist/assets/nextflow-groovy-pQRwk_Jg.js +1 -0
  533. package/dist/assets/nginx-BpAMiNFr.js +1 -0
  534. package/dist/assets/nginx-DSXkacNc.js +1 -0
  535. package/dist/assets/nginx-DdIZxoE0.js +1 -0
  536. package/dist/assets/night-owl-C39BiMTA.js +1 -0
  537. package/dist/assets/night-owl-EdP2Hztp.js +1 -0
  538. package/dist/assets/night-owl-light-Bk-lYVyk.js +1 -0
  539. package/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  540. package/dist/assets/nim-CVrawwO9.js +1 -0
  541. package/dist/assets/nim-e2z2kCcq.js +1 -0
  542. package/dist/assets/nix-Ckjrpg0r.js +1 -0
  543. package/dist/assets/nix-CwoSXNpI.js +1 -0
  544. package/dist/assets/nord-BAu0wM6c.js +1 -0
  545. package/dist/assets/nord-Ddv68eIx.js +1 -0
  546. package/dist/assets/nsis-LdVXkNf5.js +1 -0
  547. package/dist/assets/ntriples-BfvgReVJ.js +1 -0
  548. package/dist/assets/nushell-Cz2AlsmD.js +1 -0
  549. package/dist/assets/nushell-DtHLcZf1.js +1 -0
  550. package/dist/assets/objective-c-BoaBTdtz.js +1 -0
  551. package/dist/assets/objective-c-DXmwc3jG.js +1 -0
  552. package/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  553. package/dist/assets/objective-cpp-DstR8hNy.js +1 -0
  554. package/dist/assets/ocaml-C0hk2d4L.js +1 -0
  555. package/dist/assets/ocaml-DTbn2Hv7.js +1 -0
  556. package/dist/assets/octave-CWZ4xMHY.js +1 -0
  557. package/dist/assets/odin-BBf5iR-q.js +1 -0
  558. package/dist/assets/odin-Bxc4S6Xn.js +1 -0
  559. package/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  560. package/dist/assets/one-dark-pro-utPxbBbJ.js +1 -0
  561. package/dist/assets/one-light-BuCQ22aO.js +1 -0
  562. package/dist/assets/one-light-C3Wv6jpd.js +1 -0
  563. package/dist/assets/openscad-C4EeE6gA.js +1 -0
  564. package/dist/assets/openscad-CXHpNBsb.js +1 -0
  565. package/dist/assets/oz-BzwKVEFT.js +1 -0
  566. package/dist/assets/pascal--L3eBynH.js +1 -0
  567. package/dist/assets/pascal-D93ZcfNL.js +1 -0
  568. package/dist/assets/pascal-Sr-XLSE6.js +1 -0
  569. package/dist/assets/perl-C0TMdlhV.js +1 -0
  570. package/dist/assets/perl-C95KruZl.js +1 -0
  571. package/dist/assets/perl-CdXCOZ3F.js +1 -0
  572. package/dist/assets/permissionStore-BRcQ9Jgt.js +1 -0
  573. package/dist/assets/php-B4Kqya17.js +1 -0
  574. package/dist/assets/php-Dhbhpdrm.js +1 -0
  575. package/dist/assets/pig-CevX1Tat.js +1 -0
  576. package/dist/assets/pkl-CRusufhw.js +1 -0
  577. package/dist/assets/pkl-u5AG7uiY.js +1 -0
  578. package/dist/assets/plastic-3e1v2bzS.js +1 -0
  579. package/dist/assets/plastic-CXnNNlFZ.js +1 -0
  580. package/dist/assets/plsql-ChMvpjG-.js +1 -0
  581. package/dist/assets/plsql-Dbm3tV2N.js +1 -0
  582. package/dist/assets/po-BTJTHyun.js +1 -0
  583. package/dist/assets/po-LG0lFwH4.js +1 -0
  584. package/dist/assets/poimandres-BrOVMvuE.js +1 -0
  585. package/dist/assets/poimandres-CS3Unz2-.js +1 -0
  586. package/dist/assets/polar-C0HS_06l.js +1 -0
  587. package/dist/assets/polar-DjOs3GWb.js +1 -0
  588. package/dist/assets/postcss-CXtECtnM.js +1 -0
  589. package/dist/assets/postcss-GRRkWn2F.js +1 -0
  590. package/dist/assets/powerquery-CEu0bR-o.js +1 -0
  591. package/dist/assets/powerquery-DHf-dtTS.js +1 -0
  592. package/dist/assets/powershell-CFHJl5sT.js +1 -0
  593. package/dist/assets/powershell-DXrKVo3G.js +1 -0
  594. package/dist/assets/powershell-Dpen1YoG.js +1 -0
  595. package/dist/assets/prisma-Dd19v3D-.js +1 -0
  596. package/dist/assets/prisma-Dgf8IN_C.js +1 -0
  597. package/dist/assets/prolog-9JcfiY6I.js +1 -0
  598. package/dist/assets/prolog-CbFg5uaA.js +1 -0
  599. package/dist/assets/properties-C78fOPTZ.js +1 -0
  600. package/dist/assets/proto-C7zT0LnQ.js +1 -0
  601. package/dist/assets/proto-dqx_Sj2i.js +1 -0
  602. package/dist/assets/protobuf-ChK-085T.js +1 -0
  603. package/dist/assets/pug-CGlum2m_.js +1 -0
  604. package/dist/assets/pug-CIGw5rlb.js +1 -0
  605. package/dist/assets/pug-CoOVtr4u.js +1 -0
  606. package/dist/assets/puppet-BMWR74SV.js +1 -0
  607. package/dist/assets/puppet-DMA9R1ak.js +1 -0
  608. package/dist/assets/puppet-Di57VbSS.js +1 -0
  609. package/dist/assets/purescript-BgpM7rDH.js +1 -0
  610. package/dist/assets/purescript-CklMAg4u.js +1 -0
  611. package/dist/assets/python-B6Ihcp-E.js +1 -0
  612. package/dist/assets/python-B6aJPvgy.js +1 -0
  613. package/dist/assets/python-Cso5vRIg.js +1 -0
  614. package/dist/assets/q-pXgVlZs6.js +1 -0
  615. package/dist/assets/qml-3beO22l8.js +1 -0
  616. package/dist/assets/qml-DmGQGbca.js +1 -0
  617. package/dist/assets/qmldir-C8lEn-DE.js +1 -0
  618. package/dist/assets/qmldir-DXd9s5XC.js +1 -0
  619. package/dist/assets/qss-B7NnhfIi.js +1 -0
  620. package/dist/assets/qss-IeuSbFQv.js +1 -0
  621. package/dist/assets/r-1ts4xG1r.js +1 -0
  622. package/dist/assets/r-B6wPVr8A.js +1 -0
  623. package/dist/assets/r-Dspwwk_N.js +1 -0
  624. package/dist/assets/racket-BqYA7rlc.js +1 -0
  625. package/dist/assets/racket-CeDx7KO2.js +1 -0
  626. package/dist/assets/raku-BMJwmrCS.js +1 -0
  627. package/dist/assets/raku-DXvB9xmW.js +1 -0
  628. package/dist/assets/razor-BaMsy-R7.js +1 -0
  629. package/dist/assets/razor-Uh8Bk_45.js +1 -0
  630. package/dist/assets/red-DR6ZwibK.js +1 -0
  631. package/dist/assets/red-bN70gL4F.js +1 -0
  632. package/dist/assets/reg-C-SQnVFl.js +1 -0
  633. package/dist/assets/reg-Cvyu2Gnx.js +1 -0
  634. package/dist/assets/regexp-CDVJQ6XC.js +1 -0
  635. package/dist/assets/regexp-DK-WlHNu.js +1 -0
  636. package/dist/assets/registerCustomTheme-BBXUCRnG.js +1 -0
  637. package/dist/assets/rel-BlqNHz8k.js +1 -0
  638. package/dist/assets/rel-C3B-1QV4.js +1 -0
  639. package/dist/assets/renderElectronMiniChatApp-DGmmT9Wf.js +1 -0
  640. package/dist/assets/renderMobileApp-Dd8P9hvM.js +23 -0
  641. package/dist/assets/riscv-BM1_JUlF.js +1 -0
  642. package/dist/assets/riscv-C5dpdlr7.js +1 -0
  643. package/dist/assets/ron-D8l8udqQ.js +1 -0
  644. package/dist/assets/ron-j5NfrB3z.js +1 -0
  645. package/dist/assets/rose-pine-CN2F2lJl.js +1 -0
  646. package/dist/assets/rose-pine-dawn-0S8NEhsA.js +1 -0
  647. package/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  648. package/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  649. package/dist/assets/rose-pine-moon-DzBDT4rc.js +1 -0
  650. package/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  651. package/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  652. package/dist/assets/rosmsg-ZkSIzPhc.js +1 -0
  653. package/dist/assets/rpm-CTu-6PCP.js +1 -0
  654. package/dist/assets/rst-BrH8l1NY.js +1 -0
  655. package/dist/assets/rst-C371KPjr.js +1 -0
  656. package/dist/assets/ruby-B2Rjki9n.js +1 -0
  657. package/dist/assets/ruby-DusoydGj.js +1 -0
  658. package/dist/assets/ruby-Dw2BHqvy.js +1 -0
  659. package/dist/assets/runtimeSurface-Cnqjhb6Y.js +1 -0
  660. package/dist/assets/rust-B1yitclQ.js +1 -0
  661. package/dist/assets/rust-CxuBE0J8.js +1 -0
  662. package/dist/assets/sas-B4kiWyti.js +1 -0
  663. package/dist/assets/sas-DtSHuIwI.js +1 -0
  664. package/dist/assets/sas-cz2c8ADy.js +1 -0
  665. package/dist/assets/sass-Cj5Yp3dK.js +1 -0
  666. package/dist/assets/sass-bfEVHPJ8.js +1 -0
  667. package/dist/assets/scala-C151Ov-r.js +1 -0
  668. package/dist/assets/scala-Dtw19ca_.js +1 -0
  669. package/dist/assets/scheme-C41bIUwD.js +1 -0
  670. package/dist/assets/scheme-C98Dy4si.js +1 -0
  671. package/dist/assets/scheme-OJppFQF3.js +1 -0
  672. package/dist/assets/scss-DxBkwadj.js +1 -0
  673. package/dist/assets/scss-OYdSNvt2.js +1 -0
  674. package/dist/assets/sdbl-CvZs3G9c.js +1 -0
  675. package/dist/assets/sdbl-DVxCFoDh.js +1 -0
  676. package/dist/assets/shaderlab-CEJedz68.js +1 -0
  677. package/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  678. package/dist/assets/shellscript-DgJyDXW6.js +1 -0
  679. package/dist/assets/shellscript-Yzrsuije.js +1 -0
  680. package/dist/assets/shellsession-BADoaaVG.js +1 -0
  681. package/dist/assets/shellsession-DSlzxnCM.js +1 -0
  682. package/dist/assets/sieve-C3Gn_uJK.js +1 -0
  683. package/dist/assets/simple-mode-GW_nhZxv.js +1 -0
  684. package/dist/assets/slack-dark-BthQWCQV.js +1 -0
  685. package/dist/assets/slack-dark-CWRQmTmo.js +1 -0
  686. package/dist/assets/slack-ochin-DO_ok7XK.js +1 -0
  687. package/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  688. package/dist/assets/smalltalk-B9IHbYt7.js +1 -0
  689. package/dist/assets/smalltalk-BERRCDM3.js +1 -0
  690. package/dist/assets/smalltalk-CnHTOXQT.js +1 -0
  691. package/dist/assets/snazzy-light-B5llO_gK.js +1 -0
  692. package/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  693. package/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  694. package/dist/assets/solarized-dark-G9yBjKj_.js +1 -0
  695. package/dist/assets/solarized-light-DeSzljQz.js +1 -0
  696. package/dist/assets/solarized-light-L9t79GZl.js +1 -0
  697. package/dist/assets/solidity-B3CjIuAd.js +1 -0
  698. package/dist/assets/solidity-rGO070M0.js +1 -0
  699. package/dist/assets/solr-DehyRSwq.js +1 -0
  700. package/dist/assets/soy-BSb8SaP0.js +1 -0
  701. package/dist/assets/soy-Brmx7dQM.js +1 -0
  702. package/dist/assets/sparql-BJh4JEw-.js +1 -0
  703. package/dist/assets/sparql-DkYu6x3z.js +1 -0
  704. package/dist/assets/sparql-rVzFXLq3.js +1 -0
  705. package/dist/assets/splunk-BtCnVYZw.js +1 -0
  706. package/dist/assets/splunk-h-bNAnbk.js +1 -0
  707. package/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  708. package/dist/assets/sql-BLtJtn59.js +1 -0
  709. package/dist/assets/sql-BbONfI8K.js +1 -0
  710. package/dist/assets/sql-D0XecflT.js +1 -0
  711. package/dist/assets/ssh-config-CywOjoXH.js +1 -0
  712. package/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  713. package/dist/assets/stata-BH5u7GGu.js +1 -0
  714. package/dist/assets/stata-BKjsT8qe.js +1 -0
  715. package/dist/assets/stex-C3f8Ysf7.js +1 -0
  716. package/dist/assets/stylus-B533Al4x.js +1 -0
  717. package/dist/assets/stylus-BEDo0Tqx.js +1 -0
  718. package/dist/assets/stylus-CIg617SB.js +1 -0
  719. package/dist/assets/surrealql-2KNEnAt7.js +1 -0
  720. package/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  721. package/dist/assets/svelte-C_ipcX3V.js +1 -0
  722. package/dist/assets/svelte-xaxjcSSP.js +1 -0
  723. package/dist/assets/swift-BzpIVaGY.js +1 -0
  724. package/dist/assets/swift-D82vCrfD.js +1 -0
  725. package/dist/assets/swift-tEesUtni.js +1 -0
  726. package/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  727. package/dist/assets/synthwave-84-DRVv-_m_.js +1 -0
  728. package/dist/assets/system-verilog-CnnmHF94.js +1 -0
  729. package/dist/assets/system-verilog-Qdm_1g2q.js +1 -0
  730. package/dist/assets/systemd-4A_iFExJ.js +1 -0
  731. package/dist/assets/systemd-DKMPPZjB.js +1 -0
  732. package/dist/assets/talonscript-CkByrt1z.js +1 -0
  733. package/dist/assets/talonscript-eRuyeYHl.js +1 -0
  734. package/dist/assets/tasl-B9CVvjfG.js +1 -0
  735. package/dist/assets/tasl-QIJgUcNo.js +1 -0
  736. package/dist/assets/tcl-Bq9dbVAF.js +1 -0
  737. package/dist/assets/tcl-DVfN8rqt.js +1 -0
  738. package/dist/assets/tcl-dwOrl1Do.js +1 -0
  739. package/dist/assets/templ-BVTOctZ7.js +1 -0
  740. package/dist/assets/templ-P3uqSqPl.js +1 -0
  741. package/dist/assets/terraform-BETggiCN.js +1 -0
  742. package/dist/assets/terraform-CAp711iT.js +1 -0
  743. package/dist/assets/tex-BHxF5DMe.js +1 -0
  744. package/dist/assets/tex-idrVyKtj.js +1 -0
  745. package/dist/assets/textile-CnDTJFAw.js +1 -0
  746. package/dist/assets/themeResolver-BmJyTmjJ.js +1 -0
  747. package/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  748. package/dist/assets/tiki-DGYXhP31.js +1 -0
  749. package/dist/assets/tokyo-night-BvwC8l2v.js +1 -0
  750. package/dist/assets/tokyo-night-hegEt444.js +1 -0
  751. package/dist/assets/toml-Bm5Em-hy.js +1 -0
  752. package/dist/assets/toml-Ms459DBw.js +1 -0
  753. package/dist/assets/toml-vGWfd6FD.js +1 -0
  754. package/dist/assets/troff-wAsdV37c.js +1 -0
  755. package/dist/assets/ts-tags-C-gylFal.js +1 -0
  756. package/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  757. package/dist/assets/tsv-BFtm7NXx.js +1 -0
  758. package/dist/assets/tsv-B_m7g4N7.js +1 -0
  759. package/dist/assets/tsx-COt5Ahok.js +1 -0
  760. package/dist/assets/tsx-D6116Ycy.js +1 -0
  761. package/dist/assets/ttcn-CfJYG6tj.js +1 -0
  762. package/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  763. package/dist/assets/turtle-B1tBg_DP.js +1 -0
  764. package/dist/assets/turtle-BsS91CYL.js +1 -0
  765. package/dist/assets/turtle-DpRhbQZY.js +1 -0
  766. package/dist/assets/twig-DNn4PbVi.js +1 -0
  767. package/dist/assets/twig-DuP5mDZ4.js +1 -0
  768. package/dist/assets/typescript-BPQ3VLAy.js +1 -0
  769. package/dist/assets/typescript-BqvgUolh.js +1 -0
  770. package/dist/assets/typespec-BGHnOYBU.js +1 -0
  771. package/dist/assets/typespec-DhK7u29_.js +1 -0
  772. package/dist/assets/typst-DHCkPAjA.js +1 -0
  773. package/dist/assets/typst-Dfd71gQj.js +1 -0
  774. package/dist/assets/useAppFontEffects-DXASDavv.js +7043 -0
  775. package/dist/assets/useInlineCommentController-KJFe98HG.js +2 -0
  776. package/dist/assets/useOpenInAppsStore-DHAeT9zx.js +1 -0
  777. package/dist/assets/useWindowTitle-BcwmWC0M.js +10 -0
  778. package/dist/assets/v-BH76v7br.js +1 -0
  779. package/dist/assets/v-BcVCzyr7.js +1 -0
  780. package/dist/assets/vala-CsfeWuGM.js +1 -0
  781. package/dist/assets/vala-z59IxkFd.js +1 -0
  782. package/dist/assets/vb-4AxSLKIU.js +1 -0
  783. package/dist/assets/vb-CmGdzxic.js +1 -0
  784. package/dist/assets/vb-D17OF-Vu.js +1 -0
  785. package/dist/assets/vbscript-BuJXcnF6.js +1 -0
  786. package/dist/assets/velocity-D8B20fx6.js +1 -0
  787. package/dist/assets/vendor-aparajita-capacitor-secure-storage-5IShChL0.js +1 -0
  788. package/dist/assets/vendor-aria-hidden-DvXkyWUv.js +1 -0
  789. package/dist/assets/vendor-base-ui-DwfTg5wD.js +1 -0
  790. package/dist/assets/vendor-beautiful-mermaid-r4GK_usS.js +119 -0
  791. package/dist/assets/vendor-capacitor-app-BrDJj9I_.js +1 -0
  792. package/dist/assets/vendor-capacitor-core-B4EWRrHz.js +1 -0
  793. package/dist/assets/vendor-capacitor-keyboard-CYccoJjr.js +1 -0
  794. package/dist/assets/vendor-capacitor-push-notifications-KNe1zSBF.js +1 -0
  795. package/dist/assets/vendor-capacitor-status-bar-B-N0EOVk.js +1 -0
  796. package/dist/assets/vendor-ccount-c2V3InAJ.js +1 -0
  797. package/dist/assets/vendor-character-entities-html4-D7taRCQ7.js +1 -0
  798. package/dist/assets/vendor-character-entities-legacy-BpoLgcEt.js +1 -0
  799. package/dist/assets/vendor-class-variance-authority-5VPnzWs2.js +1 -0
  800. package/dist/assets/vendor-clsx-B-dksMZM.js +1 -0
  801. package/dist/assets/vendor-cmdk-BCEUzcHE.js +1 -0
  802. package/dist/assets/vendor-codemirror-autocomplete-3xMyV7a2.js +1 -0
  803. package/dist/assets/vendor-codemirror-commands-Bzf12ODH.js +1 -0
  804. package/dist/assets/vendor-codemirror-lang-angular-0K6s6cvb.js +1 -0
  805. package/dist/assets/vendor-codemirror-lang-cpp-B0aL03z-.js +1 -0
  806. package/dist/assets/vendor-codemirror-lang-css-C4jEScp7.js +1 -0
  807. package/dist/assets/vendor-codemirror-lang-go-CgrfVBPr.js +7 -0
  808. package/dist/assets/vendor-codemirror-lang-html-C1Svvdey.js +1 -0
  809. package/dist/assets/vendor-codemirror-lang-java-DNPz7_Bx.js +1 -0
  810. package/dist/assets/vendor-codemirror-lang-javascript-CrbeaEAU.js +13 -0
  811. package/dist/assets/vendor-codemirror-lang-jinja-DL8BR_RG.js +1 -0
  812. package/dist/assets/vendor-codemirror-lang-json-BTvAjwkJ.js +1 -0
  813. package/dist/assets/vendor-codemirror-lang-less-CPABt6NZ.js +1 -0
  814. package/dist/assets/vendor-codemirror-lang-liquid-BLOLOBMg.js +1 -0
  815. package/dist/assets/vendor-codemirror-lang-markdown-BloD9GN-.js +1 -0
  816. package/dist/assets/vendor-codemirror-lang-php-FIZMTuWM.js +1 -0
  817. package/dist/assets/vendor-codemirror-lang-python-CR2g6ukK.js +3 -0
  818. package/dist/assets/vendor-codemirror-lang-rust-lsPqn4k4.js +1 -0
  819. package/dist/assets/vendor-codemirror-lang-sass-CtECMwzH.js +1 -0
  820. package/dist/assets/vendor-codemirror-lang-sql-BtmZrrZH.js +2 -0
  821. package/dist/assets/vendor-codemirror-lang-vue-Br6DrntY.js +1 -0
  822. package/dist/assets/vendor-codemirror-lang-wast-DT7IlCnb.js +1 -0
  823. package/dist/assets/vendor-codemirror-lang-xml-wNr-LZOf.js +1 -0
  824. package/dist/assets/vendor-codemirror-lang-yaml-BTKFwfc2.js +1 -0
  825. package/dist/assets/vendor-codemirror-language-BuDklWi8.js +3 -0
  826. package/dist/assets/vendor-codemirror-language-data-CFVH0pe8.js +2 -0
  827. package/dist/assets/vendor-codemirror-search-BzyfPoRb.js +2 -0
  828. package/dist/assets/vendor-codemirror-state-Wdz6Qsow.js +5 -0
  829. package/dist/assets/vendor-codemirror-view-pXtfpqbT.js +4 -0
  830. package/dist/assets/vendor-comma-separated-tokens-D8TqSuIK.js +1 -0
  831. package/dist/assets/vendor-crelt-C8TCjufn.js +1 -0
  832. package/dist/assets/vendor-detect-node-es-l0sNRNKZ.js +1 -0
  833. package/dist/assets/vendor-diff-C3JhlQdm.js +13 -0
  834. package/dist/assets/vendor-dijkstrajs-COg3n3zL.js +1 -0
  835. package/dist/assets/vendor-dnd-kit-accessibility-Cv52zwWT.js +1 -0
  836. package/dist/assets/vendor-dnd-kit-core-GipZW2tY.js +5 -0
  837. package/dist/assets/vendor-dnd-kit-sortable-Ct2QxIHb.js +1 -0
  838. package/dist/assets/vendor-dnd-kit-utilities-CrOcp0Bp.js +1 -0
  839. package/dist/assets/vendor-dompurify-r8glNMJW.js +2 -0
  840. package/dist/assets/vendor-elkjs-CRCLNXjf.js +24 -0
  841. package/dist/assets/vendor-entities-C3BA0AJP.js +1 -0
  842. package/dist/assets/vendor-fflate-C7GOKjkv.js +1 -0
  843. package/dist/assets/vendor-floating-ui-core-CXmKXOXc.js +1 -0
  844. package/dist/assets/vendor-floating-ui-dom-Bkw82kL9.js +1 -0
  845. package/dist/assets/vendor-floating-ui-react-dom-sVFnuruh.js +1 -0
  846. package/dist/assets/vendor-floating-ui-utils-BzXdqYpP.js +1 -0
  847. package/dist/assets/vendor-framer-motion-DJASDzNt.js +1 -0
  848. package/dist/assets/vendor-fuse.js-Dw8P0qyA.js +1 -0
  849. package/dist/assets/vendor-get-nonce-C-Z93AgS.js +1 -0
  850. package/dist/assets/vendor-ghostty-web-CrxinGGH.js +13 -0
  851. package/dist/assets/vendor-hast-util-to-html-BKBhbTDb.js +9 -0
  852. package/dist/assets/vendor-hast-util-whitespace-D4Wp6AEg.js +1 -0
  853. package/dist/assets/vendor-heic2any-L8hyfc24.js +66 -0
  854. package/dist/assets/vendor-html-to-image-BeoRn2gJ.js +2 -0
  855. package/dist/assets/vendor-html-void-elements-CkdplsNl.js +1 -0
  856. package/dist/assets/vendor-katex-CHD9BdDO.js +257 -0
  857. package/dist/assets/vendor-katex-Cp579UoJ.css +1 -0
  858. package/dist/assets/vendor-lezer-common-B3-cUCR_.js +1 -0
  859. package/dist/assets/vendor-lezer-cpp-BleAU9o-.js +1 -0
  860. package/dist/assets/vendor-lezer-css-C5xB6jxd.js +1 -0
  861. package/dist/assets/vendor-lezer-go-CXK1UKk8.js +1 -0
  862. package/dist/assets/vendor-lezer-highlight-CDMHUZ74.js +1 -0
  863. package/dist/assets/vendor-lezer-html-C0I1p52t.js +1 -0
  864. package/dist/assets/vendor-lezer-java-D_zzj-NV.js +1 -0
  865. package/dist/assets/vendor-lezer-javascript-D7Tj24ot.js +1 -0
  866. package/dist/assets/vendor-lezer-json-Iaex0UN-.js +1 -0
  867. package/dist/assets/vendor-lezer-lr-bhwg1HMg.js +1 -0
  868. package/dist/assets/vendor-lezer-markdown-C6g-d6P3.js +6 -0
  869. package/dist/assets/vendor-lezer-php-_DHrbsZG.js +1 -0
  870. package/dist/assets/vendor-lezer-python-CvuFxeZl.js +1 -0
  871. package/dist/assets/vendor-lezer-rust-Lqgd5SAo.js +1 -0
  872. package/dist/assets/vendor-lezer-sass-Dnm2lY4t.js +1 -0
  873. package/dist/assets/vendor-lezer-xml-hUDuAyS5.js +1 -0
  874. package/dist/assets/vendor-lezer-yaml-BNIl6S_O.js +1 -0
  875. package/dist/assets/vendor-lru_map-B-cPXHXW.js +1 -0
  876. package/dist/assets/vendor-marijn-find-cluster-break-DXwl3gUT.js +1 -0
  877. package/dist/assets/vendor-marked-i_gIkIP3.js +59 -0
  878. package/dist/assets/vendor-morphdom-B7dS_VPB.js +1 -0
  879. package/dist/assets/vendor-motion-dom-DJLgZh4Q.js +1 -0
  880. package/dist/assets/vendor-motion-l0sNRNKZ.js +1 -0
  881. package/dist/assets/vendor-motion-utils-BGh8QBgx.js +1 -0
  882. package/dist/assets/vendor-oniguruma-parser-C0D4_9rT.js +33 -0
  883. package/dist/assets/vendor-oniguruma-to-es-DLBnFDCE.js +94 -0
  884. package/dist/assets/vendor-pierre-theme-Bp7SdUL6.js +1 -0
  885. package/dist/assets/vendor-pierre-theming-C6Z4M5_u.js +1 -0
  886. package/dist/assets/vendor-property-information-rJCbAzvX.js +1 -0
  887. package/dist/assets/vendor-qrcode-COsmt6jn.js +8 -0
  888. package/dist/assets/vendor-radix-ui-primitive-Dc_FVRD7.js +1 -0
  889. package/dist/assets/vendor-radix-ui-react-compose-refs-D1GnwnP9.js +1 -0
  890. package/dist/assets/vendor-radix-ui-react-context-CM4yFQ2I.js +1 -0
  891. package/dist/assets/vendor-radix-ui-react-dialog-jX3Dld8c.js +5 -0
  892. package/dist/assets/vendor-radix-ui-react-dismissable-layer-M7LsH3yL.js +1 -0
  893. package/dist/assets/vendor-radix-ui-react-focus-guards-D5MZ0nQs.js +1 -0
  894. package/dist/assets/vendor-radix-ui-react-focus-scope-C2K7lNPv.js +1 -0
  895. package/dist/assets/vendor-radix-ui-react-id-BcxRjnbX.js +1 -0
  896. package/dist/assets/vendor-radix-ui-react-portal-xlJWBfDg.js +1 -0
  897. package/dist/assets/vendor-radix-ui-react-presence-Btn-Dp7L.js +1 -0
  898. package/dist/assets/vendor-radix-ui-react-primitive-CfpW6_IT.js +1 -0
  899. package/dist/assets/vendor-radix-ui-react-slot-BxUc3Pvz.js +1 -0
  900. package/dist/assets/vendor-radix-ui-react-use-callback-ref-UKEWHtoP.js +1 -0
  901. package/dist/assets/vendor-radix-ui-react-use-controllable-state-C_ecoh35.js +1 -0
  902. package/dist/assets/vendor-radix-ui-react-use-effect-event-DkJl_Rn_.js +1 -0
  903. package/dist/assets/vendor-radix-ui-react-use-escape-keydown-Co13lHGj.js +1 -0
  904. package/dist/assets/vendor-radix-ui-react-use-layout-effect-0fyGwS2_.js +1 -0
  905. package/dist/assets/vendor-react-DYyjh7Q0.js +9 -0
  906. package/dist/assets/vendor-react-drawio-Boqanm0j.js +1 -0
  907. package/dist/assets/vendor-react-remove-scroll-CfeMe0DL.js +4 -0
  908. package/dist/assets/vendor-react-remove-scroll-bar-C9YRs2nU.js +38 -0
  909. package/dist/assets/vendor-react-style-singleton-B1H4bWSG.js +1 -0
  910. package/dist/assets/vendor-regex-BBWcyTkg.js +16 -0
  911. package/dist/assets/vendor-regex-recursion-JU4mF-dD.js +1 -0
  912. package/dist/assets/vendor-regex-utilities-2BQyy0xI.js +1 -0
  913. package/dist/assets/vendor-remend-BWYYytN3.js +22 -0
  914. package/dist/assets/vendor-remixicon-react-CzPq62YO.js +1 -0
  915. package/dist/assets/vendor-replit-codemirror-vim-BUqe2Slv.js +39 -0
  916. package/dist/assets/vendor-reselect-l0sNRNKZ.js +1 -0
  917. package/dist/assets/vendor-scheduler-7OC5HNn7.js +1 -0
  918. package/dist/assets/vendor-shiki-Bbf2GEcE.js +2 -0
  919. package/dist/assets/vendor-shikijs-core-CGM_jqPK.js +2 -0
  920. package/dist/assets/vendor-shikijs-engine-javascript-Cme4830A.js +1 -0
  921. package/dist/assets/vendor-shikijs-engine-oniguruma-DPWuIF1G.js +1 -0
  922. package/dist/assets/vendor-shikijs-transformers-CZWsLLKm.js +1 -0
  923. package/dist/assets/vendor-shikijs-types-CPSbSeK6.js +1 -0
  924. package/dist/assets/vendor-shikijs-vscode-textmate-BgLrS_2D.js +3 -0
  925. package/dist/assets/vendor-simplewebauthn-browser-VDA66rT_.js +2 -0
  926. package/dist/assets/vendor-sonner-dWA7qvjr.js +1 -0
  927. package/dist/assets/vendor-space-separated-tokens-DD3iYX1K.js +1 -0
  928. package/dist/assets/vendor-stringify-entities-CsH1VEn9.js +1 -0
  929. package/dist/assets/vendor-style-mod-NZ5MEPvj.js +3 -0
  930. package/dist/assets/vendor-tailwind-merge-CPcsbTWB.js +1 -0
  931. package/dist/assets/vendor-tanstack-react-virtual-IrbCBGJ4.js +1 -0
  932. package/dist/assets/vendor-tanstack-virtual-core-Dubg10g5.js +1 -0
  933. package/dist/assets/vendor-tslib-De9GV7Vy.js +1 -0
  934. package/dist/assets/vendor-use-callback-ref-CJB0R85I.js +1 -0
  935. package/dist/assets/vendor-use-sidecar-C-AuTczP.js +1 -0
  936. package/dist/assets/vendor-use-sync-external-store-B7OScDIw.js +1 -0
  937. package/dist/assets/vendor-vite-runtime-DD1OZmLC.js +1 -0
  938. package/dist/assets/vendor-w3c-keyname-Vcq4gwWv.js +1 -0
  939. package/dist/assets/vendor-workbox-window-BIl4cyR9.js +2 -0
  940. package/dist/assets/vendor-zumer-snapdom-Btyu_Xi2.js +8 -0
  941. package/dist/assets/vendor-zustand-CnsBKjP5.js +6 -0
  942. package/dist/assets/vendor-zwitch-C2o2j-tx.js +1 -0
  943. package/dist/assets/verilog-BQ8w6xss.js +1 -0
  944. package/dist/assets/verilog-C6RDOZhf.js +1 -0
  945. package/dist/assets/verilog-LfQUkHDc.js +1 -0
  946. package/dist/assets/vesper--t9w6MWz.js +1 -0
  947. package/dist/assets/vesper-DU1UobuO.js +1 -0
  948. package/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  949. package/dist/assets/vhdl-DJCsFYgn.js +1 -0
  950. package/dist/assets/vhdl-lSbBsy5d.js +1 -0
  951. package/dist/assets/viml-CJc9bBzg.js +1 -0
  952. package/dist/assets/viml-pbKHW3Ia.js +1 -0
  953. package/dist/assets/vitesse-black-B_BYPdvp.js +1 -0
  954. package/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  955. package/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  956. package/dist/assets/vitesse-dark-DOSOf2Sz.js +1 -0
  957. package/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  958. package/dist/assets/vitesse-light-gUX51GpB.js +1 -0
  959. package/dist/assets/vue-D2k0BAl5.js +1 -0
  960. package/dist/assets/vue-DN_0RTcg.js +1 -0
  961. package/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  962. package/dist/assets/vue-html-zEfNEgpj.js +1 -0
  963. package/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  964. package/dist/assets/vue-vine-D9eCaTqi.js +1 -0
  965. package/dist/assets/vyper-CDx5xZoG.js +1 -0
  966. package/dist/assets/vyper-DpazWNpx.js +1 -0
  967. package/dist/assets/wasm-CFi-k9--.js +1 -0
  968. package/dist/assets/wasm-CG6Dc4jp.js +1 -0
  969. package/dist/assets/wasm-MzD3tlZU.js +1 -0
  970. package/dist/assets/web-components-CNPQSzpa.js +1390 -0
  971. package/dist/assets/webidl-ZXfAyPTL.js +1 -0
  972. package/dist/assets/wenyan-BV7otONQ.js +1 -0
  973. package/dist/assets/wenyan-CYFFG9DK.js +1 -0
  974. package/dist/assets/wgsl-CxjTZs-b.js +1 -0
  975. package/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  976. package/dist/assets/wikitext-BhOHFoWU.js +1 -0
  977. package/dist/assets/wikitext-Bx2qct8O.js +1 -0
  978. package/dist/assets/wit-5i3qLPDT.js +1 -0
  979. package/dist/assets/wit-DDW3hD69.js +1 -0
  980. package/dist/assets/wolfram-lXgVvXCa.js +1 -0
  981. package/dist/assets/wolfram-pu21K997.js +1 -0
  982. package/dist/assets/worker-BBk7yuNN.js +153 -0
  983. package/dist/assets/workerFactory-tw7cIdmV.js +1 -0
  984. package/dist/assets/xml-BkAJuBCc.js +1 -0
  985. package/dist/assets/xml-sdJ4AIDG.js +1 -0
  986. package/dist/assets/xquery-DzFWVndE.js +1 -0
  987. package/dist/assets/xsl-C6UUWSil.js +1 -0
  988. package/dist/assets/xsl-CtQFsRM5.js +1 -0
  989. package/dist/assets/yacas-BJ4BC0dw.js +1 -0
  990. package/dist/assets/yaml-Bopit2L3.js +1 -0
  991. package/dist/assets/yaml-Buea-lGh.js +1 -0
  992. package/dist/assets/z80-Hz9HOZM7.js +1 -0
  993. package/dist/assets/zenscript-BIAKq-aR.js +1 -0
  994. package/dist/assets/zenscript-DVFEvuxE.js +1 -0
  995. package/dist/assets/zig-VOosw3JB.js +1 -0
  996. package/dist/assets/zig-bSFrHQ7n.js +1 -0
  997. package/dist/favicon-16.png +0 -0
  998. package/dist/favicon-32.png +0 -0
  999. package/dist/favicon.png +0 -0
  1000. package/dist/favicon.svg +13 -0
  1001. package/dist/index.html +658 -0
  1002. package/dist/logo-dark-192x192.png +0 -0
  1003. package/dist/logo-dark-512x512.svg +13 -0
  1004. package/dist/logo-light-192x192.png +0 -0
  1005. package/dist/logo-light-512x512.svg +13 -0
  1006. package/dist/mini-chat.html +121 -0
  1007. package/dist/mobile.html +79 -0
  1008. package/dist/pwa-192.png +0 -0
  1009. package/dist/pwa-512.png +0 -0
  1010. package/dist/pwa-maskable-192.png +0 -0
  1011. package/dist/pwa-maskable-512.png +0 -0
  1012. package/dist/site.webmanifest +21 -0
  1013. package/dist/sw.js +1 -0
  1014. package/package.json +115 -0
  1015. package/public/apple-touch-icon-120x120.png +0 -0
  1016. package/public/apple-touch-icon-152x152.png +0 -0
  1017. package/public/apple-touch-icon-167x167.png +0 -0
  1018. package/public/apple-touch-icon-180x180.png +0 -0
  1019. package/public/apple-touch-icon.png +0 -0
  1020. package/public/apple-touch-icon.svg +13 -0
  1021. package/public/favicon-16.png +0 -0
  1022. package/public/favicon-32.png +0 -0
  1023. package/public/favicon.png +0 -0
  1024. package/public/favicon.svg +13 -0
  1025. package/public/logo-dark-192x192.png +0 -0
  1026. package/public/logo-dark-512x512.svg +13 -0
  1027. package/public/logo-light-192x192.png +0 -0
  1028. package/public/logo-light-512x512.svg +13 -0
  1029. package/public/pwa-192.png +0 -0
  1030. package/public/pwa-512.png +0 -0
  1031. package/public/pwa-maskable-192.png +0 -0
  1032. package/public/pwa-maskable-512.png +0 -0
  1033. package/public/site.webmanifest +21 -0
  1034. package/server/index.d.ts +35 -0
  1035. package/server/index.js +206 -0
  1036. package/server/lib/client-auth/pairing.js +308 -0
  1037. package/server/lib/client-auth/pairing.test.js +142 -0
  1038. package/server/lib/client-auth/remote-clients.js +280 -0
  1039. package/server/lib/client-auth/remote-clients.test.js +158 -0
  1040. package/server/lib/cloudflare-tunnel.js +606 -0
  1041. package/server/lib/fs/DOCUMENTATION.md +39 -0
  1042. package/server/lib/fs/pick-directory.js +236 -0
  1043. package/server/lib/fs/pick-directory.test.js +134 -0
  1044. package/server/lib/fs/routes.js +1543 -0
  1045. package/server/lib/fs/routes.test.js +920 -0
  1046. package/server/lib/fs/search.js +238 -0
  1047. package/server/lib/git/DOCUMENTATION.md +180 -0
  1048. package/server/lib/git/credentials.js +41 -0
  1049. package/server/lib/git/identity-storage.js +113 -0
  1050. package/server/lib/git/index.js +6 -0
  1051. package/server/lib/git/issue-2746-longpaths.test.js +206 -0
  1052. package/server/lib/git/routes.js +1089 -0
  1053. package/server/lib/git/routes.test.js +210 -0
  1054. package/server/lib/git/service.js +4927 -0
  1055. package/server/lib/git/service.test.js +1216 -0
  1056. package/server/lib/inherited-env.js +74 -0
  1057. package/server/lib/inherited-env.test.js +65 -0
  1058. package/server/lib/ngrok-tunnel.js +343 -0
  1059. package/server/lib/ngrok-tunnel.test.js +50 -0
  1060. package/server/lib/package-manager.js +850 -0
  1061. package/server/lib/package-manager.test.js +370 -0
  1062. package/server/lib/path-realpath-cache.js +85 -0
  1063. package/server/lib/path-realpath-cache.test.js +75 -0
  1064. package/server/lib/pi/archive-store.js +52 -0
  1065. package/server/lib/pi/archive-store.test.js +32 -0
  1066. package/server/lib/pi/attachment-store.js +98 -0
  1067. package/server/lib/pi/attachment-store.test.js +40 -0
  1068. package/server/lib/pi/custom-themes.js +33 -0
  1069. package/server/lib/pi/custom-themes.test.js +21 -0
  1070. package/server/lib/pi/legacy-ui-model-defaults.js +57 -0
  1071. package/server/lib/pi/legacy-ui-model-defaults.test.js +65 -0
  1072. package/server/lib/pi/model-config-store.js +173 -0
  1073. package/server/lib/pi/model-config-store.test.js +42 -0
  1074. package/server/lib/pi/routes.js +956 -0
  1075. package/server/lib/pi/routes.test.js +733 -0
  1076. package/server/lib/pi/session-daemon/DOCUMENTATION.md +41 -0
  1077. package/server/lib/pi/session-daemon/daemon-process.js +113 -0
  1078. package/server/lib/pi/session-daemon/ipc-client.js +144 -0
  1079. package/server/lib/pi/session-daemon/runtime-registry.js +149 -0
  1080. package/server/lib/pi/session-daemon/runtime-registry.test.js +109 -0
  1081. package/server/lib/pi/session-daemon/session-daemon.js +1903 -0
  1082. package/server/lib/pi/session-daemon/session-daemon.test.js +1306 -0
  1083. package/server/lib/pi/session-daemon/session-jsonl.js +94 -0
  1084. package/server/lib/pi/session-daemon/session-jsonl.test.js +73 -0
  1085. package/server/lib/pi/session-daemon/supervisor.js +458 -0
  1086. package/server/lib/pi/session-daemon/supervisor.test.js +212 -0
  1087. package/server/lib/pi/session-folders-store.js +74 -0
  1088. package/server/lib/pi/session-folders-store.test.js +45 -0
  1089. package/server/lib/pi/session-lifecycle.integration.test.js +197 -0
  1090. package/server/lib/pi/settings-store.js +133 -0
  1091. package/server/lib/pi/settings-store.test.js +113 -0
  1092. package/server/lib/pi/thinking-levels.js +39 -0
  1093. package/server/lib/pi/thinking-levels.test.js +34 -0
  1094. package/server/lib/pi/ui-settings-store.js +68 -0
  1095. package/server/lib/pi/ui-settings-store.test.js +40 -0
  1096. package/server/lib/pichamber-data-dir.js +78 -0
  1097. package/server/lib/pichamber-data-dir.test.js +105 -0
  1098. package/server/lib/pichamber-data-root-authority.test.js +81 -0
  1099. package/server/lib/preview/proxy-runtime.js +1604 -0
  1100. package/server/lib/preview/proxy-runtime.test.js +528 -0
  1101. package/server/lib/pwa-keys-contract.test.ts +62 -0
  1102. package/server/lib/relay/DOCUMENTATION.md +106 -0
  1103. package/server/lib/relay/cross-compat.test.js +135 -0
  1104. package/server/lib/relay/e2ee.js +341 -0
  1105. package/server/lib/relay/e2ee.test.js +124 -0
  1106. package/server/lib/relay/host-client.js +389 -0
  1107. package/server/lib/relay/host-client.test.js +292 -0
  1108. package/server/lib/relay/identity.js +93 -0
  1109. package/server/lib/relay/identity.test.js +78 -0
  1110. package/server/lib/relay/service.js +9 -0
  1111. package/server/lib/relay/signing-key.js +73 -0
  1112. package/server/lib/relay/tunnel-codec.js +373 -0
  1113. package/server/lib/relay/tunnel-codec.test.js +58 -0
  1114. package/server/lib/relay/tunnel-host.js +465 -0
  1115. package/server/lib/security/bind-host.js +40 -0
  1116. package/server/lib/security/bind-host.test.js +36 -0
  1117. package/server/lib/security/packaged-client-origins.js +11 -0
  1118. package/server/lib/security/request-security.js +122 -0
  1119. package/server/lib/security/request-security.test.js +57 -0
  1120. package/server/lib/server/cli-entry-runtime.js +44 -0
  1121. package/server/lib/server/cli-options.js +132 -0
  1122. package/server/lib/server/core-routes.js +1041 -0
  1123. package/server/lib/server/cors.js +51 -0
  1124. package/server/lib/server/cors.test.js +37 -0
  1125. package/server/lib/server/lan-addresses.js +41 -0
  1126. package/server/lib/server/lan-addresses.test.js +42 -0
  1127. package/server/lib/server/path-utils.js +27 -0
  1128. package/server/lib/server/tunnel-auth.js +586 -0
  1129. package/server/lib/terminal/DOCUMENTATION.md +48 -0
  1130. package/server/lib/terminal/history.js +83 -0
  1131. package/server/lib/terminal/history.test.js +19 -0
  1132. package/server/lib/terminal/runtime.js +391 -0
  1133. package/server/lib/terminal/runtime.test.js +566 -0
  1134. package/server/lib/terminal/shells.js +100 -0
  1135. package/server/lib/terminal/shells.test.js +73 -0
  1136. package/server/lib/terminal/terminal-ws-protocol.js +68 -0
  1137. package/server/lib/terminal/terminal-ws-protocol.test.js +145 -0
  1138. package/server/lib/terminal/theme-response.js +98 -0
  1139. package/server/lib/terminal/theme-response.test.js +70 -0
  1140. package/server/lib/tunnels/DOCUMENTATION.md +33 -0
  1141. package/server/lib/tunnels/executable-search.js +140 -0
  1142. package/server/lib/tunnels/executable-search.test.js +96 -0
  1143. package/server/lib/tunnels/install-help.js +56 -0
  1144. package/server/lib/tunnels/install-help.test.js +31 -0
  1145. package/server/lib/tunnels/providers/cloudflare.js +54 -0
  1146. package/server/lib/tunnels/providers/ngrok.js +32 -0
  1147. package/server/lib/tunnels/types.js +16 -0
  1148. package/server/lib/ui-auth/DOCUMENTATION.md +44 -0
  1149. package/server/lib/ui-auth/ui-auth.js +972 -0
  1150. package/server/lib/ui-auth/ui-auth.test.js +250 -0
  1151. package/server/lib/ui-auth/ui-passkeys.js +543 -0
  1152. package/server/lib/workspace/host.js +91 -0
@@ -0,0 +1,1216 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterEach, describe, expect, it } from 'vitest';
6
+ import simpleGit from 'simple-git';
7
+
8
+ import {
9
+ checkoutCommit,
10
+ cherryPick,
11
+ createWorktree,
12
+ getWorktreeBootstrapStatus,
13
+ getBranches,
14
+ getRangeDiff,
15
+ getRemotes,
16
+ getStatus,
17
+ isGitRepository,
18
+ populateWorktreeWithLockRecovery,
19
+ removeWorktree,
20
+ resolvePrimaryWorktreeRoot,
21
+ resolveWorktreeTopLevel,
22
+ resetToCommit,
23
+ resolveBaseRefForLog,
24
+ revertCommit,
25
+ setLocalIdentity,
26
+ stageFiles,
27
+ unstageFiles,
28
+ applyHunk,
29
+ getDiff,
30
+ getFileDiff,
31
+ } from './service.js';
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Shared test infrastructure
35
+ // ---------------------------------------------------------------------------
36
+
37
+ const tempDirs = [];
38
+
39
+ /** Create a temp dir and register it for afterEach cleanup. */
40
+ const createTempDir = () => {
41
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pichamber-git-service-'));
42
+ tempDirs.push(dir);
43
+ return dir;
44
+ };
45
+
46
+ const runGit = (cwd, args) =>
47
+ execFileSync('git', args, {
48
+ cwd,
49
+ encoding: 'utf8',
50
+ stdio: ['ignore', 'pipe', 'pipe'],
51
+ });
52
+
53
+ /**
54
+ * A repository on `next` whose only remote publishes `defaultBranch` and has it
55
+ * recorded as that remote's HEAD — the shape of every repository whose default
56
+ * branch is not one of the conventional names.
57
+ */
58
+ const createRepositoryWithRemote = ({ remoteName = 'origin', defaultBranch = 'react' } = {}) => {
59
+ const remote = createTempDir();
60
+ const repository = createTempDir();
61
+ runGit(remote, ['init', '--bare', `--initial-branch=${defaultBranch}`]);
62
+ runGit(repository, ['init', '-b', 'next']);
63
+ runGit(repository, ['config', 'user.email', 'test@example.com']);
64
+ runGit(repository, ['config', 'user.name', 'Test']);
65
+ fs.writeFileSync(path.join(repository, 'README.md'), '# Test\n');
66
+ runGit(repository, ['add', 'README.md']);
67
+ runGit(repository, ['commit', '-m', 'init']);
68
+ runGit(repository, ['remote', 'add', remoteName, remote]);
69
+ runGit(repository, ['push', remoteName, `HEAD:${defaultBranch}`]);
70
+ runGit(repository, ['fetch', remoteName]);
71
+ runGit(repository, ['remote', 'set-head', remoteName, '--auto']);
72
+ return { remote, repository };
73
+ };
74
+
75
+ const canRunGit = () => {
76
+ try {
77
+ execFileSync('git', ['--version'], { stdio: 'ignore' });
78
+ return true;
79
+ } catch {
80
+ return false;
81
+ }
82
+ };
83
+
84
+ afterEach(() => {
85
+ for (const dir of tempDirs.splice(0)) {
86
+ fs.rmSync(dir, { recursive: true, force: true });
87
+ }
88
+ });
89
+
90
+ /**
91
+ * Create a temp repo using simple-git (for tests that need its assertion API).
92
+ * The dir is registered in tempDirs so afterEach handles cleanup automatically.
93
+ */
94
+ async function createTempRepo() {
95
+ const tmpDir = createTempDir();
96
+ const git = simpleGit(tmpDir);
97
+ await git.init();
98
+ await git.addConfig('user.name', 'Test User', false, 'local');
99
+ await git.addConfig('user.email', 'test@example.com', false, 'local');
100
+ await git.raw(['symbolic-ref', 'HEAD', 'refs/heads/main']);
101
+ return { tmpDir, git };
102
+ }
103
+
104
+ // ---------------------------------------------------------------------------
105
+ // resolveBaseRefForLog
106
+ // ---------------------------------------------------------------------------
107
+
108
+ describe('resolveBaseRefForLog', () => {
109
+ it('returns the local ref unchanged when it exists, even if origin also exists', async () => {
110
+ const checkRef = async (ref) => ref === 'main' || ref === 'refs/remotes/origin/main';
111
+ expect(await resolveBaseRefForLog('main', checkRef)).toBe('main');
112
+ });
113
+
114
+ it('falls back to origin/<from> when local ref cannot be resolved but origin can', async () => {
115
+ const checkRef = async (ref) => ref === 'refs/remotes/origin/main';
116
+ expect(await resolveBaseRefForLog('main', checkRef)).toBe('origin/main');
117
+ });
118
+
119
+ it('returns the original ref when neither local nor origin ref can be resolved', async () => {
120
+ const checkRef = async () => false;
121
+ expect(await resolveBaseRefForLog('nonexistent-branch', checkRef)).toBe('nonexistent-branch');
122
+ });
123
+
124
+ it('returns undefined when from is undefined', async () => {
125
+ const checkRef = async () => true;
126
+ expect(await resolveBaseRefForLog(undefined, checkRef)).toBeUndefined();
127
+ });
128
+
129
+ it('returns undefined when from is an empty string', async () => {
130
+ const checkRef = async () => true;
131
+ expect(await resolveBaseRefForLog('', checkRef)).toBeUndefined();
132
+ });
133
+
134
+ it('returns undefined when from is a whitespace-only string', async () => {
135
+ const checkRef = async () => true;
136
+ expect(await resolveBaseRefForLog(' ', checkRef)).toBeUndefined();
137
+ });
138
+ });
139
+
140
+ // ---------------------------------------------------------------------------
141
+ // git index path validation
142
+ // ---------------------------------------------------------------------------
143
+
144
+ describe('git index path validation', () => {
145
+ it('rejects stage paths outside the repository before invoking git', async () => {
146
+ await expect(stageFiles('/repo', ['../secret.txt'])).rejects.toThrow(
147
+ 'Path is outside repository: ../secret.txt'
148
+ );
149
+ });
150
+
151
+ it('rejects unstage paths outside the repository before invoking git', async () => {
152
+ await expect(unstageFiles('/repo', ['../secret.txt'])).rejects.toThrow(
153
+ 'Path is outside repository: ../secret.txt'
154
+ );
155
+ });
156
+ });
157
+
158
+ describe.runIf(canRunGit())('setLocalIdentity', () => {
159
+ it('configures the local SSH command with the targeted simple-git opt-in', async () => {
160
+ const { tmpDir } = await createTempRepo();
161
+
162
+ await setLocalIdentity(tmpDir, {
163
+ userName: 'SSH User',
164
+ userEmail: 'ssh@example.com',
165
+ authType: 'ssh',
166
+ sshKey: '/tmp/test key',
167
+ });
168
+
169
+ expect(runGit(tmpDir, ['config', '--local', '--get', 'core.sshCommand']).trim()).toBe(
170
+ "ssh -i '/tmp/test key' -o IdentitiesOnly=yes"
171
+ );
172
+ });
173
+ });
174
+
175
+ // ---------------------------------------------------------------------------
176
+ // applyHunk (per-hunk stage / unstage / discard)
177
+ // ---------------------------------------------------------------------------
178
+
179
+ /** Minimal unified-diff splitter: returns standalone per-hunk patches. */
180
+ const splitHunks = (patch) => {
181
+ const lines = patch.split(/\r?\n/);
182
+ const headerEnd = lines.findIndex((line) => /^@@\s/.test(line));
183
+ if (headerEnd === -1) return [];
184
+ const header = lines.slice(0, headerEnd);
185
+ const hunks = [];
186
+ for (let i = headerEnd; i < lines.length; i += 1) {
187
+ const line = lines[i];
188
+ if (/^@@\s/.test(line)) hunks.push([...header, line]);
189
+ else if (hunks.length > 0) hunks[hunks.length - 1].push(line);
190
+ }
191
+ return hunks.map((hunk) => hunk.join('\n'))
192
+ .filter((hunk) => hunk.trim().length > 0)
193
+ .map((hunk) => (hunk.endsWith('\n') ? hunk : `${hunk}\n`));
194
+ };
195
+
196
+ const writeFile = (repo, name, contents) =>
197
+ fs.promises.writeFile(path.join(repo, name), contents, 'utf8');
198
+
199
+ // Build a 20-line file so changes on line 1 and line 20 stay in separate hunks
200
+ // (default 3-line diff context would merge closer edits into one hunk).
201
+ const makeFile = (first, last) =>
202
+ [first, ...Array.from({ length: 18 }, (_, i) => `line${i + 2}`), last].join('\n') + '\n';
203
+ const ORIGINAL_FILE = makeFile('line1', 'line20');
204
+ const EDITED_FILE = makeFile('TOP', 'BOTTOM');
205
+
206
+ const readWorking = (repo) => fs.promises.readFile(path.join(repo, 'file.txt'), 'utf8').then((c) => c.replace(/\r\n/g, '\n'));
207
+ const readStaged = async (git) => (await git.raw(['show', ':file.txt'])).replace(/\r\n/g, '\n');
208
+
209
+ describe('applyHunk', () => {
210
+ it('rejects an invalid action or a patch without a hunk header', async () => {
211
+ const { tmpDir } = await createTempRepo();
212
+ await expect(applyHunk(tmpDir, 'file.txt', { patch: '@@ -1 +1 @@\n a\n', action: 'bogus' })).rejects.toThrow(
213
+ 'Invalid hunk action'
214
+ );
215
+ await expect(applyHunk(tmpDir, 'file.txt', { patch: 'no hunk here', action: 'stage' })).rejects.toThrow(
216
+ 'hunk header'
217
+ );
218
+ });
219
+
220
+ it('stages a single hunk while leaving the rest unstaged', async () => {
221
+ if (!canRunGit()) return;
222
+ const { tmpDir, git } = await createTempRepo();
223
+ await writeFile(tmpDir, 'file.txt', ORIGINAL_FILE);
224
+ await git.add('file.txt');
225
+ await git.commit('Initial');
226
+
227
+ await writeFile(tmpDir, 'file.txt', EDITED_FILE);
228
+ const diff = await getDiff(tmpDir, { path: 'file.txt' });
229
+ const hunks = splitHunks(diff);
230
+ expect(hunks.length).toBe(2);
231
+
232
+ await applyHunk(tmpDir, 'file.txt', { patch: hunks[0], action: 'stage' });
233
+
234
+ expect(await readStaged(git)).toBe(makeFile('TOP', 'line20'));
235
+ expect(await readWorking(tmpDir)).toBe(EDITED_FILE);
236
+ });
237
+
238
+ it('discards a single hunk from the working tree', async () => {
239
+ if (!canRunGit()) return;
240
+ const { tmpDir, git } = await createTempRepo();
241
+ await writeFile(tmpDir, 'file.txt', ORIGINAL_FILE);
242
+ await git.add('file.txt');
243
+ await git.commit('Initial');
244
+
245
+ await writeFile(tmpDir, 'file.txt', EDITED_FILE);
246
+ const diff = await getDiff(tmpDir, { path: 'file.txt' });
247
+ const hunks = splitHunks(diff);
248
+ expect(hunks.length).toBe(2);
249
+
250
+ await applyHunk(tmpDir, 'file.txt', { patch: hunks[1], action: 'discard' });
251
+
252
+ expect(await readWorking(tmpDir)).toBe(makeFile('TOP', 'line20'));
253
+ });
254
+
255
+ it('unstages a single hunk from the index', async () => {
256
+ if (!canRunGit()) return;
257
+ const { tmpDir, git } = await createTempRepo();
258
+ await writeFile(tmpDir, 'file.txt', ORIGINAL_FILE);
259
+ await git.add('file.txt');
260
+ await git.commit('Initial');
261
+
262
+ await writeFile(tmpDir, 'file.txt', EDITED_FILE);
263
+ await git.add('file.txt');
264
+
265
+ const stagedDiff = await getDiff(tmpDir, { path: 'file.txt', staged: true });
266
+ const hunks = splitHunks(stagedDiff);
267
+ expect(hunks.length).toBe(2);
268
+
269
+ await applyHunk(tmpDir, 'file.txt', { patch: hunks[0], action: 'unstage' });
270
+
271
+ // Only the first hunk (line1 -> TOP) was reverted in the index;
272
+ // the second hunk (BOTTOM) stays staged.
273
+ expect(await readStaged(git)).toBe(makeFile('line1', 'BOTTOM'));
274
+ });
275
+
276
+ it('rejects a patch whose target path does not match the requested file', async () => {
277
+ if (!canRunGit()) return;
278
+ const { tmpDir, git } = await createTempRepo();
279
+ await writeFile(tmpDir, 'file.txt', ORIGINAL_FILE);
280
+ await git.add('file.txt');
281
+ await git.commit('Initial');
282
+ await writeFile(tmpDir, 'file.txt', makeFile('CHANGED', 'line20'));
283
+
284
+ const diff = await getDiff(tmpDir, { path: 'file.txt' });
285
+ const [hunk] = splitHunks(diff);
286
+ const retargeted = hunk.replace(/file\.txt/g, 'other.txt');
287
+ await expect(applyHunk(tmpDir, 'file.txt', { patch: retargeted, action: 'stage' })).rejects.toThrow(
288
+ 'patch target path does not match'
289
+ );
290
+ });
291
+
292
+ it('accepts hunk patches for files with spaces in their path', async () => {
293
+ if (!canRunGit()) return;
294
+ const { tmpDir, git } = await createTempRepo();
295
+ const filePath = 'file name.txt';
296
+ await writeFile(tmpDir, filePath, ORIGINAL_FILE);
297
+ await git.add(filePath);
298
+ await git.commit('Initial');
299
+
300
+ await writeFile(tmpDir, filePath, EDITED_FILE);
301
+ const diff = await getDiff(tmpDir, { path: filePath });
302
+ const hunks = splitHunks(diff);
303
+ expect(hunks.length).toBe(2);
304
+
305
+ await applyHunk(tmpDir, filePath, { patch: hunks[0], action: 'stage' });
306
+
307
+ const staged = (await git.raw(['show', `:${filePath}`])).replace(/\r\n/g, '\n');
308
+ expect(staged).toBe(makeFile('TOP', 'line20'));
309
+ });
310
+ });
311
+
312
+ describe('symlink diffs', () => {
313
+ it('treats an untracked directory symlink as a link in patch and split diffs', async () => {
314
+ if (!canRunGit() || process.platform === 'win32') return;
315
+ const { tmpDir } = await createTempRepo();
316
+ fs.mkdirSync(path.join(tmpDir, 'source'));
317
+ fs.symlinkSync('source', path.join(tmpDir, 'linked-source'));
318
+
319
+ const patch = await getDiff(tmpDir, { path: 'linked-source' });
320
+ const split = await getFileDiff(tmpDir, { path: 'linked-source' });
321
+
322
+ expect(patch).toContain('new file mode 120000');
323
+ expect(patch).toContain('+source');
324
+ expect(split).toMatchObject({
325
+ original: '',
326
+ modified: 'source',
327
+ isBinary: false,
328
+ });
329
+ });
330
+ });
331
+
332
+ // ---------------------------------------------------------------------------
333
+ // getStatus
334
+ // ---------------------------------------------------------------------------
335
+
336
+ describe('getStatus', () => {
337
+ it('handles repositories without upstream tracking', async () => {
338
+ if (!canRunGit()) return;
339
+
340
+ const repo = createTempDir();
341
+ runGit(repo, ['init', '-b', 'main']);
342
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
343
+ runGit(repo, ['config', 'user.name', 'Test User']);
344
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
345
+ runGit(repo, ['add', 'README.md']);
346
+ runGit(repo, ['commit', '-m', 'Initial commit']);
347
+
348
+ await expect(getStatus(repo)).resolves.toMatchObject({ current: 'main' });
349
+ });
350
+
351
+ it('rejects a non-git folder without using process.cwd()', async () => {
352
+ if (!canRunGit()) return;
353
+
354
+ const nonGit = createTempDir();
355
+ const previousCwd = process.cwd();
356
+ process.chdir(nonGit);
357
+ try {
358
+ await expect(getStatus(nonGit)).rejects.toThrow(/not a git repository/i);
359
+ } finally {
360
+ process.chdir(previousCwd);
361
+ }
362
+ });
363
+
364
+ it('returns an empty remote list for a non-git folder', async () => {
365
+ if (!canRunGit()) return;
366
+
367
+ await expect(getRemotes(createTempDir())).resolves.toEqual([]);
368
+ });
369
+
370
+ it('reads status for a git repo when process.cwd() is elsewhere', async () => {
371
+ if (!canRunGit()) return;
372
+
373
+ const repo = createTempDir();
374
+ const neutralCwd = createTempDir();
375
+ runGit(repo, ['init', '-b', 'main']);
376
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
377
+ runGit(repo, ['config', 'user.name', 'Test User']);
378
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
379
+ runGit(repo, ['add', 'README.md']);
380
+ runGit(repo, ['commit', '-m', 'Initial commit']);
381
+
382
+ const previousCwd = process.cwd();
383
+ process.chdir(neutralCwd);
384
+ try {
385
+ await expect(getStatus(repo)).resolves.toMatchObject({ current: 'main', isClean: true });
386
+ await expect(isGitRepository(repo)).resolves.toBe(true);
387
+ await expect(isGitRepository(neutralCwd)).resolves.toBe(false);
388
+ } finally {
389
+ process.chdir(previousCwd);
390
+ }
391
+ });
392
+
393
+ it('supports a folder with nested git repositories from a foreign cwd', async () => {
394
+ if (!canRunGit()) return;
395
+
396
+ const parent = createTempDir();
397
+ const nested = path.join(parent, 'nested');
398
+ const neutralCwd = createTempDir();
399
+ fs.mkdirSync(nested, { recursive: true });
400
+
401
+ runGit(parent, ['init', '-b', 'main']);
402
+ runGit(parent, ['config', 'user.email', 'test@example.com']);
403
+ runGit(parent, ['config', 'user.name', 'Test User']);
404
+ fs.writeFileSync(path.join(parent, 'README.md'), '# Parent\n');
405
+ runGit(parent, ['add', 'README.md']);
406
+ runGit(parent, ['commit', '-m', 'Parent commit']);
407
+
408
+ runGit(nested, ['init', '-b', 'feature']);
409
+ runGit(nested, ['config', 'user.email', 'test@example.com']);
410
+ runGit(nested, ['config', 'user.name', 'Test User']);
411
+ fs.writeFileSync(path.join(nested, 'nested.txt'), 'nested\n');
412
+ runGit(nested, ['add', 'nested.txt']);
413
+ runGit(nested, ['commit', '-m', 'Nested commit']);
414
+
415
+ const previousCwd = process.cwd();
416
+ process.chdir(neutralCwd);
417
+ try {
418
+ await expect(getStatus(parent)).resolves.toMatchObject({ current: 'main' });
419
+ await expect(getStatus(nested)).resolves.toMatchObject({ current: 'feature' });
420
+ // Enumeration must continue when one path is not a repo.
421
+ const results = await Promise.allSettled([
422
+ getStatus(parent),
423
+ getStatus(neutralCwd),
424
+ getStatus(nested),
425
+ ]);
426
+ expect(results[0].status).toBe('fulfilled');
427
+ expect(results[1].status).toBe('rejected');
428
+ expect(results[1].reason?.message || String(results[1].reason)).toMatch(/not a git repository/i);
429
+ expect(results[2].status).toBe('fulfilled');
430
+ } finally {
431
+ process.chdir(previousCwd);
432
+ }
433
+ });
434
+ });
435
+
436
+ // ---------------------------------------------------------------------------
437
+ // worktree root resolution
438
+ // ---------------------------------------------------------------------------
439
+
440
+ describe('worktree root resolution', () => {
441
+ it('resolves the git toplevel for a repository subdirectory', async () => {
442
+ if (!canRunGit()) return;
443
+
444
+ const repo = createTempDir();
445
+ const subdirectory = path.join(repo, 'packages', 'app');
446
+ runGit(repo, ['init', '-b', 'main']);
447
+ fs.mkdirSync(subdirectory, { recursive: true });
448
+
449
+ await expect(resolveWorktreeTopLevel(subdirectory)).resolves.toEqual({ root: fs.realpathSync(repo) });
450
+ });
451
+
452
+ it('resolves the primary worktree root from a linked worktree', async () => {
453
+ if (!canRunGit()) return;
454
+
455
+ const repo = createTempDir();
456
+ const worktree = createTempDir();
457
+ runGit(repo, ['init', '-b', 'main']);
458
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
459
+ runGit(repo, ['config', 'user.name', 'Test User']);
460
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
461
+ runGit(repo, ['add', 'README.md']);
462
+ runGit(repo, ['commit', '-m', 'Initial commit']);
463
+ fs.rmSync(worktree, { recursive: true, force: true });
464
+ runGit(repo, ['worktree', 'add', '-b', 'feature/test', worktree, 'HEAD']);
465
+
466
+ await expect(resolvePrimaryWorktreeRoot(worktree)).resolves.toEqual({ root: fs.realpathSync(repo) });
467
+ });
468
+ });
469
+
470
+ // ---------------------------------------------------------------------------
471
+ // createWorktree
472
+ // ---------------------------------------------------------------------------
473
+
474
+ describe('createWorktree', () => {
475
+ it('returns ready/setup-ready when no bootstrap state is recorded', async () => {
476
+ const directory = path.join(createTempDir(), 'missing-worktree');
477
+
478
+ await expect(getWorktreeBootstrapStatus(directory)).resolves.toMatchObject({
479
+ status: 'ready',
480
+ phase: 'setup-ready',
481
+ error: null,
482
+ });
483
+ });
484
+
485
+ it('reports directory, Git, and setup bootstrap phases while preserving legacy status', async () => {
486
+ if (!canRunGit()) return;
487
+
488
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
489
+ const dataHome = createTempDir();
490
+ const setupMarker = path.join(dataHome, 'setup-started');
491
+ const setupScript = path.join(dataHome, 'setup-phase.cjs');
492
+ process.env.XDG_DATA_HOME = dataHome;
493
+
494
+ fs.writeFileSync(
495
+ setupScript,
496
+ `require('node:fs').writeFileSync(${JSON.stringify(setupMarker)}, 'started'); setTimeout(() => {}, 1000);\n`,
497
+ );
498
+
499
+ try {
500
+ const repo = createTempDir();
501
+ runGit(repo, ['init', '-b', 'main']);
502
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
503
+ runGit(repo, ['config', 'user.name', 'Test User']);
504
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
505
+ runGit(repo, ['add', 'README.md']);
506
+ runGit(repo, ['commit', '-m', 'Initial commit']);
507
+
508
+ const created = await createWorktree(repo, {
509
+ mode: 'new',
510
+ branchName: 'feature/bootstrap-phases',
511
+ worktreeName: 'bootstrap-phases',
512
+ returnAfterDirectoryCreated: true,
513
+ startCommand: `${JSON.stringify(process.execPath)} ${JSON.stringify(setupScript)}`,
514
+ });
515
+
516
+ expect(created.bootstrapStatus).toMatchObject({
517
+ status: 'pending',
518
+ phase: 'directory-created',
519
+ error: null,
520
+ });
521
+
522
+ await expect.poll(() => fs.existsSync(setupMarker), { timeout: 5_000 }).toBe(true);
523
+ await expect(getWorktreeBootstrapStatus(created.path)).resolves.toMatchObject({
524
+ status: 'pending',
525
+ phase: 'git-ready',
526
+ error: null,
527
+ });
528
+
529
+ await expect.poll(
530
+ async () => (await getWorktreeBootstrapStatus(created.path)).phase,
531
+ { timeout: 5_000 },
532
+ ).toBe('setup-ready');
533
+ await expect(getWorktreeBootstrapStatus(created.path)).resolves.toMatchObject({
534
+ status: 'ready',
535
+ phase: 'setup-ready',
536
+ error: null,
537
+ });
538
+ } finally {
539
+ if (previousXdgDataHome === undefined) {
540
+ delete process.env.XDG_DATA_HOME;
541
+ } else {
542
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
543
+ }
544
+ }
545
+ });
546
+
547
+ const installPostCheckoutHook = (repo, script, executable = true) => {
548
+ const hookPath = path.join(repo, '.git', 'hooks', 'post-checkout');
549
+ fs.writeFileSync(hookPath, script);
550
+ if (executable) {
551
+ fs.chmodSync(hookPath, 0o755);
552
+ }
553
+ return hookPath;
554
+ };
555
+
556
+ it('runs the post-checkout hook after populating a created worktree', async () => {
557
+ if (!canRunGit()) return;
558
+
559
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
560
+ const dataHome = createTempDir();
561
+ process.env.XDG_DATA_HOME = dataHome;
562
+
563
+ try {
564
+ const repo = createTempDir();
565
+ runGit(repo, ['init', '-b', 'main']);
566
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
567
+ runGit(repo, ['config', 'user.name', 'Test User']);
568
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
569
+ runGit(repo, ['add', 'README.md']);
570
+ runGit(repo, ['commit', '-m', 'Initial commit']);
571
+ const head = runGit(repo, ['rev-parse', 'HEAD']).trim();
572
+
573
+ const hookLog = path.join(dataHome, 'post-checkout.log');
574
+ installPostCheckoutHook(
575
+ repo,
576
+ `#!/bin/sh\nprintf '%s|%s|%s|%s' "$1" "$2" "$3" "$(pwd -P)" > ${JSON.stringify(hookLog)}\n`,
577
+ );
578
+
579
+ const created = await createWorktree(repo, {
580
+ mode: 'new',
581
+ worktreeName: 'hook-test',
582
+ branchName: 'pichamber/hook-test',
583
+ returnAfterDirectoryCreated: true,
584
+ });
585
+
586
+ await expect.poll(() => {
587
+ try {
588
+ return fs.readFileSync(hookLog, 'utf8');
589
+ } catch {
590
+ return '';
591
+ }
592
+ }, { timeout: 5_000 }).not.toBe('');
593
+
594
+ const [previousHead, newHead, flag, cwd] = fs.readFileSync(hookLog, 'utf8').split('|');
595
+ expect(previousHead).toBe('0000000000000000000000000000000000000000');
596
+ expect(newHead).toBe(head);
597
+ expect(flag).toBe('1');
598
+ expect(cwd).toBe(fs.realpathSync(created.path));
599
+ } finally {
600
+ if (previousXdgDataHome === undefined) {
601
+ delete process.env.XDG_DATA_HOME;
602
+ } else {
603
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
604
+ }
605
+ }
606
+ });
607
+
608
+ it('skips a non-executable post-checkout hook', async () => {
609
+ if (!canRunGit()) return;
610
+
611
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
612
+ const dataHome = createTempDir();
613
+ process.env.XDG_DATA_HOME = dataHome;
614
+
615
+ try {
616
+ const repo = createTempDir();
617
+ runGit(repo, ['init', '-b', 'main']);
618
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
619
+ runGit(repo, ['config', 'user.name', 'Test User']);
620
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
621
+ runGit(repo, ['add', 'README.md']);
622
+ runGit(repo, ['commit', '-m', 'Initial commit']);
623
+
624
+ const hookLog = path.join(dataHome, 'post-checkout-skipped.log');
625
+ installPostCheckoutHook(
626
+ repo,
627
+ `#!/bin/sh\nprintf 'ran' > ${JSON.stringify(hookLog)}\n`,
628
+ false,
629
+ );
630
+
631
+ const created = await createWorktree(repo, {
632
+ mode: 'new',
633
+ worktreeName: 'hook-skip-test',
634
+ branchName: 'pichamber/hook-skip-test',
635
+ returnAfterDirectoryCreated: true,
636
+ });
637
+
638
+ await expect.poll(
639
+ async () => (await getWorktreeBootstrapStatus(created.path)).status,
640
+ { timeout: 5_000 },
641
+ ).toBe('ready');
642
+ expect(fs.existsSync(hookLog)).toBe(false);
643
+ } finally {
644
+ if (previousXdgDataHome === undefined) {
645
+ delete process.env.XDG_DATA_HOME;
646
+ } else {
647
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
648
+ }
649
+ }
650
+ });
651
+
652
+ it('does not fail worktree bootstrap when the post-checkout hook fails', async () => {
653
+ if (!canRunGit()) return;
654
+
655
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
656
+ const dataHome = createTempDir();
657
+ process.env.XDG_DATA_HOME = dataHome;
658
+
659
+ try {
660
+ const repo = createTempDir();
661
+ runGit(repo, ['init', '-b', 'main']);
662
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
663
+ runGit(repo, ['config', 'user.name', 'Test User']);
664
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
665
+ runGit(repo, ['add', 'README.md']);
666
+ runGit(repo, ['commit', '-m', 'Initial commit']);
667
+
668
+ const hookLog = path.join(dataHome, 'post-checkout-failed.log');
669
+ installPostCheckoutHook(
670
+ repo,
671
+ `#!/bin/sh\nprintf 'ran' > ${JSON.stringify(hookLog)}\nexit 1\n`,
672
+ );
673
+
674
+ const created = await createWorktree(repo, {
675
+ mode: 'new',
676
+ worktreeName: 'hook-fail-test',
677
+ branchName: 'pichamber/hook-fail-test',
678
+ returnAfterDirectoryCreated: true,
679
+ });
680
+
681
+ await expect.poll(
682
+ async () => (await getWorktreeBootstrapStatus(created.path)).status,
683
+ { timeout: 5_000 },
684
+ ).toBe('ready');
685
+ expect(fs.readFileSync(hookLog, 'utf8')).toBe('ran');
686
+ } finally {
687
+ if (previousXdgDataHome === undefined) {
688
+ delete process.env.XDG_DATA_HOME;
689
+ } else {
690
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
691
+ }
692
+ }
693
+ });
694
+
695
+ it('waits for active bootstrap work before removing a worktree', async () => {
696
+ if (!canRunGit()) return;
697
+
698
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
699
+ const dataHome = createTempDir();
700
+ const setupStarted = path.join(dataHome, 'remove-race-started');
701
+ const setupCompleted = path.join(dataHome, 'remove-race-completed');
702
+ const setupScript = path.join(dataHome, 'remove-race.cjs');
703
+ process.env.XDG_DATA_HOME = dataHome;
704
+
705
+ fs.writeFileSync(
706
+ setupScript,
707
+ `const fs = require('node:fs'); fs.writeFileSync(${JSON.stringify(setupStarted)}, 'started'); setTimeout(() => fs.writeFileSync(${JSON.stringify(setupCompleted)}, 'completed'), 300);\n`,
708
+ );
709
+
710
+ try {
711
+ const repo = createTempDir();
712
+ runGit(repo, ['init', '-b', 'main']);
713
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
714
+ runGit(repo, ['config', 'user.name', 'Test User']);
715
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
716
+ runGit(repo, ['add', 'README.md']);
717
+ runGit(repo, ['commit', '-m', 'Initial commit']);
718
+
719
+ const created = await createWorktree(repo, {
720
+ mode: 'new',
721
+ branchName: 'feature/remove-bootstrap-race',
722
+ worktreeName: 'remove-bootstrap-race',
723
+ returnAfterDirectoryCreated: true,
724
+ startCommand: `${JSON.stringify(process.execPath)} ${JSON.stringify(setupScript)}`,
725
+ });
726
+
727
+ await expect.poll(() => fs.existsSync(setupStarted), { timeout: 5_000 }).toBe(true);
728
+ let removalCompleted = false;
729
+ const removal = removeWorktree(repo, { directory: created.path }).then(() => {
730
+ removalCompleted = true;
731
+ });
732
+
733
+ await new Promise((resolve) => setTimeout(resolve, 25));
734
+ expect(removalCompleted).toBe(false);
735
+ await removal;
736
+
737
+ expect(fs.existsSync(setupCompleted)).toBe(true);
738
+ expect(fs.existsSync(created.path)).toBe(false);
739
+ await expect(getWorktreeBootstrapStatus(created.path)).resolves.toMatchObject({
740
+ status: 'ready',
741
+ phase: 'setup-ready',
742
+ });
743
+ } finally {
744
+ if (previousXdgDataHome === undefined) {
745
+ delete process.env.XDG_DATA_HOME;
746
+ } else {
747
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
748
+ }
749
+ }
750
+ });
751
+
752
+ it('recovers from an unchanged stale index lock while populating a worktree', async () => {
753
+ if (!canRunGit()) return;
754
+
755
+ const repo = createTempDir();
756
+ const worktree = createTempDir();
757
+ runGit(repo, ['init', '-b', 'main']);
758
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
759
+ runGit(repo, ['config', 'user.name', 'Test User']);
760
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
761
+ runGit(repo, ['add', 'README.md']);
762
+ runGit(repo, ['commit', '-m', 'Initial commit']);
763
+ fs.rmSync(worktree, { recursive: true, force: true });
764
+ runGit(repo, ['worktree', 'add', '--no-checkout', '-b', 'feature/stale-lock', worktree, 'HEAD']);
765
+
766
+ const lockPath = runGit(worktree, ['rev-parse', '--git-path', 'index.lock']).trim();
767
+ fs.writeFileSync(lockPath, 'stale');
768
+
769
+ await expect(populateWorktreeWithLockRecovery(worktree)).resolves.toBeUndefined();
770
+ expect(fs.existsSync(lockPath)).toBe(false);
771
+ expect(fs.readFileSync(path.join(worktree, 'README.md'), 'utf8')).toBe('# Test\n');
772
+ });
773
+
774
+ it('preflights fast create branch-in-use failures before creating the candidate directory', async () => {
775
+ if (!canRunGit()) return;
776
+
777
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
778
+ const dataHome = createTempDir();
779
+ process.env.XDG_DATA_HOME = dataHome;
780
+
781
+ try {
782
+ const repo = createTempDir();
783
+ const worktree = createTempDir();
784
+ runGit(repo, ['init', '-b', 'main']);
785
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
786
+ runGit(repo, ['config', 'user.name', 'Test User']);
787
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
788
+ runGit(repo, ['add', 'README.md']);
789
+ runGit(repo, ['commit', '-m', 'Initial commit']);
790
+ const projectID = runGit(repo, ['rev-list', '--max-parents=0', '--all']).trim();
791
+
792
+ fs.rmSync(worktree, { recursive: true, force: true });
793
+ runGit(repo, ['worktree', 'add', '-b', 'feature/in-use', worktree, 'HEAD']);
794
+ const canonicalWorktree = fs.realpathSync(worktree);
795
+
796
+ await expect(createWorktree(repo, {
797
+ mode: 'existing',
798
+ existingBranch: 'feature/in-use',
799
+ branchName: 'feature/in-use',
800
+ worktreeName: 'feature-in-use',
801
+ returnAfterDirectoryCreated: true,
802
+ })).rejects.toThrow(`Branch is already checked out in ${canonicalWorktree}`);
803
+
804
+ const candidateDirectory = path.join(dataHome, 'opencode', 'worktree', projectID, 'feature-in-use');
805
+ expect(fs.existsSync(candidateDirectory)).toBe(false);
806
+ } finally {
807
+ if (previousXdgDataHome === undefined) {
808
+ delete process.env.XDG_DATA_HOME;
809
+ } else {
810
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
811
+ }
812
+ }
813
+ });
814
+ });
815
+
816
+ // ---------------------------------------------------------------------------
817
+ // removeWorktree
818
+ // ---------------------------------------------------------------------------
819
+
820
+ describe('removeWorktree', () => {
821
+ it('forgets unmanaged orphan worktree entries without deleting files', async () => {
822
+ if (!canRunGit()) return;
823
+
824
+ const previousXdgDataHome = process.env.XDG_DATA_HOME;
825
+ const dataHome = createTempDir();
826
+ process.env.XDG_DATA_HOME = dataHome;
827
+
828
+ try {
829
+ const repo = createTempDir();
830
+ const sentinel = createTempDir();
831
+ const canary = path.join(sentinel, 'canary.txt');
832
+
833
+ runGit(repo, ['init', '-b', 'main']);
834
+ runGit(repo, ['config', 'user.email', 'test@example.com']);
835
+ runGit(repo, ['config', 'user.name', 'Test User']);
836
+ fs.writeFileSync(path.join(repo, 'README.md'), '# Test\n');
837
+ runGit(repo, ['add', 'README.md']);
838
+ runGit(repo, ['commit', '-m', 'Initial commit']);
839
+ fs.writeFileSync(canary, 'sentinel');
840
+
841
+ await expect(removeWorktree(repo, {
842
+ directory: sentinel,
843
+ deleteLocalBranch: false,
844
+ })).resolves.toBe(true);
845
+ expect(fs.existsSync(canary)).toBe(true);
846
+ } finally {
847
+ if (previousXdgDataHome === undefined) {
848
+ delete process.env.XDG_DATA_HOME;
849
+ } else {
850
+ process.env.XDG_DATA_HOME = previousXdgDataHome;
851
+ }
852
+ }
853
+ });
854
+ });
855
+
856
+ // ---------------------------------------------------------------------------
857
+ // checkoutCommit
858
+ // ---------------------------------------------------------------------------
859
+
860
+ describe('checkoutCommit', () => {
861
+ it('checks out a valid commit and puts the repo in detached HEAD state', async () => {
862
+ const { tmpDir, git } = await createTempRepo();
863
+ const filePath = path.join(tmpDir, 'file.txt');
864
+ await fs.promises.writeFile(filePath, 'first', 'utf8');
865
+ await git.add('file.txt');
866
+ const firstCommit = await git.commit('First commit');
867
+
868
+ await fs.promises.writeFile(filePath, 'second', 'utf8');
869
+ await git.add('file.txt');
870
+ await git.commit('Second commit');
871
+
872
+ const result = await checkoutCommit(tmpDir, firstCommit.commit);
873
+ expect(result).toEqual({ success: true });
874
+
875
+ const status = await git.status();
876
+ expect(status.detached).toBe(true);
877
+ });
878
+
879
+ it('throws an error for an invalid/nonexistent hash', async () => {
880
+ const { tmpDir } = await createTempRepo();
881
+ await expect(checkoutCommit(tmpDir, 'invalidhash123')).rejects.toThrow();
882
+ });
883
+ });
884
+
885
+ // ---------------------------------------------------------------------------
886
+ // cherryPick
887
+ // ---------------------------------------------------------------------------
888
+
889
+ describe('cherryPick', () => {
890
+ it('cherry-picks a commit that applies cleanly', async () => {
891
+ const { tmpDir, git } = await createTempRepo();
892
+ const filePath = path.join(tmpDir, 'file.txt');
893
+ await fs.promises.writeFile(filePath, 'line1\nline2\n', 'utf8');
894
+ await git.add('file.txt');
895
+ await git.commit('Initial commit');
896
+
897
+ await git.checkoutBranch('feature', 'HEAD');
898
+ await fs.promises.writeFile(filePath, 'line1\nline2\nline3\n', 'utf8');
899
+ await git.add('file.txt');
900
+ const featureCommit = await git.commit('Add line3');
901
+
902
+ await git.checkout('main');
903
+ const result = await cherryPick(tmpDir, featureCommit.commit);
904
+ expect(result).toEqual({ success: true, conflict: false });
905
+
906
+ const content = await fs.promises.readFile(filePath, 'utf8');
907
+ expect(content).toBe('line1\nline2\nline3\n');
908
+ });
909
+
910
+ it('returns conflict info when cherry-picking a conflicting commit', async () => {
911
+ const { tmpDir, git } = await createTempRepo();
912
+ const filePath = path.join(tmpDir, 'file.txt');
913
+ await fs.promises.writeFile(filePath, 'line1\nline2\n', 'utf8');
914
+ await git.add('file.txt');
915
+ await git.commit('Initial commit');
916
+
917
+ await git.checkoutBranch('feature', 'HEAD');
918
+ await fs.promises.writeFile(filePath, 'line1\nfeature-line2\n', 'utf8');
919
+ await git.add('file.txt');
920
+ const featureCommit = await git.commit('Change line2 in feature');
921
+
922
+ await git.checkout('main');
923
+ await fs.promises.writeFile(filePath, 'line1\nmain-line2\n', 'utf8');
924
+ await git.add('file.txt');
925
+ await git.commit('Change line2 in main');
926
+
927
+ const result = await cherryPick(tmpDir, featureCommit.commit);
928
+ expect(result.success).toBe(false);
929
+ expect(result.conflict).toBe(true);
930
+ expect(Array.isArray(result.conflictFiles)).toBe(true);
931
+ expect(result.conflictFiles.length).toBeGreaterThan(0);
932
+ });
933
+
934
+ it('throws for an invalid/nonexistent hash', async () => {
935
+ const { tmpDir } = await createTempRepo();
936
+ await expect(cherryPick(tmpDir, 'deadbeef00000000')).rejects.toThrow();
937
+ });
938
+ });
939
+
940
+ // ---------------------------------------------------------------------------
941
+ // revertCommit
942
+ // ---------------------------------------------------------------------------
943
+
944
+ describe('revertCommit', () => {
945
+ it('reverts a commit and stages the revert changes', async () => {
946
+ const { tmpDir, git } = await createTempRepo();
947
+ const filePath = path.join(tmpDir, 'file.txt');
948
+ await fs.promises.writeFile(filePath, 'line1\nline2\n', 'utf8');
949
+ await git.add('file.txt');
950
+ await git.commit('Initial commit');
951
+
952
+ await fs.promises.writeFile(filePath, 'line1\nline2\nline3\n', 'utf8');
953
+ await git.add('file.txt');
954
+ const changeCommit = await git.commit('Add line3');
955
+
956
+ const result = await revertCommit(tmpDir, changeCommit.commit);
957
+ expect(result).toEqual({ success: true, conflict: false });
958
+
959
+ const status = await git.status();
960
+ expect(status.staged.length).toBeGreaterThan(0);
961
+ const content = await fs.promises.readFile(filePath, 'utf8');
962
+ expect(content).toBe('line1\nline2\n');
963
+ });
964
+
965
+ it('returns conflict info when reverting causes a conflict', async () => {
966
+ const { tmpDir, git } = await createTempRepo();
967
+ const filePath = path.join(tmpDir, 'file.txt');
968
+ await fs.promises.writeFile(filePath, 'line1\nline2\nline3\n', 'utf8');
969
+ await git.add('file.txt');
970
+ await git.commit('Initial commit');
971
+
972
+ await fs.promises.writeFile(filePath, 'line1\nchanged-a\nline3\n', 'utf8');
973
+ await git.add('file.txt');
974
+ const commitA = await git.commit('Change line2 to changed-a');
975
+
976
+ await fs.promises.writeFile(filePath, 'line1\nchanged-b\nline3\n', 'utf8');
977
+ await git.add('file.txt');
978
+ await git.commit('Change line2 to changed-b');
979
+
980
+ const result = await revertCommit(tmpDir, commitA.commit);
981
+ expect(result.success).toBe(false);
982
+ expect(result.conflict).toBe(true);
983
+ expect(Array.isArray(result.conflictFiles)).toBe(true);
984
+ expect(result.conflictFiles.length).toBeGreaterThan(0);
985
+ });
986
+
987
+ it('throws for an invalid/nonexistent hash', async () => {
988
+ const { tmpDir } = await createTempRepo();
989
+ await expect(revertCommit(tmpDir, 'deadbeef00000000')).rejects.toThrow();
990
+ });
991
+ });
992
+
993
+ // ---------------------------------------------------------------------------
994
+ // resetToCommit
995
+ // ---------------------------------------------------------------------------
996
+
997
+ describe('resetToCommit', () => {
998
+ it('soft reset moves HEAD without touching the working tree', async () => {
999
+ const { tmpDir, git } = await createTempRepo();
1000
+ const filePath = path.join(tmpDir, 'file.txt');
1001
+ await fs.promises.writeFile(filePath, 'first\n', 'utf8');
1002
+ await git.add('file.txt');
1003
+ const firstCommit = await git.commit('First commit');
1004
+
1005
+ await fs.promises.writeFile(filePath, 'second\n', 'utf8');
1006
+ await git.add('file.txt');
1007
+ await git.commit('Second commit');
1008
+
1009
+ const result = await resetToCommit(tmpDir, firstCommit.commit, 'soft');
1010
+ expect(result).toEqual({ success: true });
1011
+
1012
+ const log = await git.log();
1013
+ expect(log.latest.hash).toBe(firstCommit.commit);
1014
+ const content = await fs.promises.readFile(filePath, 'utf8');
1015
+ expect(content).toBe('second\n');
1016
+
1017
+ const status = await git.status();
1018
+ expect(status.staged.length).toBeGreaterThan(0);
1019
+ });
1020
+
1021
+ it('mixed reset moves HEAD and unstages changes', async () => {
1022
+ const { tmpDir, git } = await createTempRepo();
1023
+ const filePath = path.join(tmpDir, 'file.txt');
1024
+ await fs.promises.writeFile(filePath, 'first\n', 'utf8');
1025
+ await git.add('file.txt');
1026
+ const firstCommit = await git.commit('First commit');
1027
+
1028
+ await fs.promises.writeFile(filePath, 'second\n', 'utf8');
1029
+ await git.add('file.txt');
1030
+ await git.commit('Second commit');
1031
+
1032
+ const result = await resetToCommit(tmpDir, firstCommit.commit, 'mixed');
1033
+ expect(result).toEqual({ success: true });
1034
+
1035
+ const log = await git.log();
1036
+ expect(log.latest.hash).toBe(firstCommit.commit);
1037
+ const content = await fs.promises.readFile(filePath, 'utf8');
1038
+ expect(content).toBe('second\n');
1039
+
1040
+ const status = await git.status();
1041
+ expect(status.staged.length).toBe(0);
1042
+ expect(status.modified.length).toBeGreaterThan(0);
1043
+ });
1044
+
1045
+ it('hard reset with clean working tree succeeds', async () => {
1046
+ const { tmpDir, git } = await createTempRepo();
1047
+ const filePath = path.join(tmpDir, 'file.txt');
1048
+ await fs.promises.writeFile(filePath, 'first\n', 'utf8');
1049
+ await git.add('file.txt');
1050
+ const firstCommit = await git.commit('First commit');
1051
+
1052
+ await fs.promises.writeFile(filePath, 'second\n', 'utf8');
1053
+ await git.add('file.txt');
1054
+ await git.commit('Second commit');
1055
+
1056
+ const result = await resetToCommit(tmpDir, firstCommit.commit, 'hard');
1057
+ expect(result).toEqual({ success: true });
1058
+
1059
+ const log = await git.log();
1060
+ expect(log.latest.hash).toBe(firstCommit.commit);
1061
+ const content = await fs.promises.readFile(filePath, 'utf8');
1062
+ expect(content).toBe('first\n');
1063
+
1064
+ const status = await git.status();
1065
+ expect(status.isClean()).toBe(true);
1066
+ });
1067
+
1068
+ it('hard reset with dirty working tree without force throws', async () => {
1069
+ const { tmpDir, git } = await createTempRepo();
1070
+ const filePath = path.join(tmpDir, 'file.txt');
1071
+ await fs.promises.writeFile(filePath, 'first\n', 'utf8');
1072
+ await git.add('file.txt');
1073
+ const firstCommit = await git.commit('First commit');
1074
+
1075
+ await fs.promises.writeFile(filePath, 'second\n', 'utf8');
1076
+ await git.add('file.txt');
1077
+ await git.commit('Second commit');
1078
+
1079
+ await fs.promises.writeFile(filePath, 'dirty\n', 'utf8');
1080
+
1081
+ await expect(resetToCommit(tmpDir, firstCommit.commit, 'hard')).rejects.toThrow(
1082
+ 'Cannot hard reset: uncommitted changes in working tree'
1083
+ );
1084
+ });
1085
+
1086
+ it('hard reset with dirty working tree with force succeeds', async () => {
1087
+ const { tmpDir, git } = await createTempRepo();
1088
+ const filePath = path.join(tmpDir, 'file.txt');
1089
+ await fs.promises.writeFile(filePath, 'first\n', 'utf8');
1090
+ await git.add('file.txt');
1091
+ const firstCommit = await git.commit('First commit');
1092
+
1093
+ await fs.promises.writeFile(filePath, 'second\n', 'utf8');
1094
+ await git.add('file.txt');
1095
+ await git.commit('Second commit');
1096
+
1097
+ await fs.promises.writeFile(filePath, 'dirty\n', 'utf8');
1098
+
1099
+ const result = await resetToCommit(tmpDir, firstCommit.commit, 'hard', true);
1100
+ expect(result).toEqual({ success: true });
1101
+
1102
+ const log = await git.log();
1103
+ expect(log.latest.hash).toBe(firstCommit.commit);
1104
+ const content = await fs.promises.readFile(filePath, 'utf8');
1105
+ expect(content).toBe('first\n');
1106
+ });
1107
+ });
1108
+
1109
+ // ---------------------------------------------------------------------------
1110
+ // hash validation
1111
+ // ---------------------------------------------------------------------------
1112
+
1113
+ describe('hash validation', () => {
1114
+ it('checkoutCommit rejects non-hex hash', async () => {
1115
+ await expect(checkoutCommit('/tmp', '--hard')).rejects.toThrow('Invalid commit hash');
1116
+ });
1117
+
1118
+ it('checkoutCommit rejects ref name', async () => {
1119
+ await expect(checkoutCommit('/tmp', 'HEAD')).rejects.toThrow('Invalid commit hash');
1120
+ });
1121
+
1122
+ it('checkoutCommit accepts valid 40-char hex format', async () => {
1123
+ await expect(
1124
+ checkoutCommit('/tmp', '1234567890abcdef1234567890abcdef12345678')
1125
+ ).rejects.not.toThrow('Invalid commit hash');
1126
+ });
1127
+
1128
+ it('cherryPick rejects non-hex hash', async () => {
1129
+ await expect(cherryPick('/tmp', '--hard')).rejects.toThrow('Invalid commit hash');
1130
+ });
1131
+
1132
+ it('cherryPick rejects ref name', async () => {
1133
+ await expect(cherryPick('/tmp', 'HEAD')).rejects.toThrow('Invalid commit hash');
1134
+ });
1135
+
1136
+ it('cherryPick accepts valid 40-char hex format', async () => {
1137
+ await expect(
1138
+ cherryPick('/tmp', '1234567890abcdef1234567890abcdef12345678')
1139
+ ).rejects.not.toThrow('Invalid commit hash');
1140
+ });
1141
+
1142
+ it('revertCommit rejects non-hex hash', async () => {
1143
+ await expect(revertCommit('/tmp', '--hard')).rejects.toThrow('Invalid commit hash');
1144
+ });
1145
+
1146
+ it('revertCommit rejects ref name', async () => {
1147
+ await expect(revertCommit('/tmp', 'HEAD')).rejects.toThrow('Invalid commit hash');
1148
+ });
1149
+
1150
+ it('revertCommit accepts valid 40-char hex format', async () => {
1151
+ await expect(
1152
+ revertCommit('/tmp', '1234567890abcdef1234567890abcdef12345678')
1153
+ ).rejects.not.toThrow('Invalid commit hash');
1154
+ });
1155
+
1156
+ it('resetToCommit rejects non-hex hash', async () => {
1157
+ await expect(resetToCommit('/tmp', '--hard', 'soft')).rejects.toThrow('Invalid commit hash');
1158
+ });
1159
+
1160
+ it('resetToCommit rejects ref name', async () => {
1161
+ await expect(resetToCommit('/tmp', 'HEAD', 'soft')).rejects.toThrow('Invalid commit hash');
1162
+ });
1163
+
1164
+ it('resetToCommit accepts valid 40-char hex format', async () => {
1165
+ await expect(
1166
+ resetToCommit('/tmp', '1234567890abcdef1234567890abcdef12345678', 'soft')
1167
+ ).rejects.not.toThrow('Invalid commit hash');
1168
+ });
1169
+ });
1170
+
1171
+ describe.runIf(canRunGit())('getBranches', () => {
1172
+ it('returns a remote default branch whose name is not a conventional fallback', async () => {
1173
+ const { repository } = createRepositoryWithRemote({ remoteName: 'origin', defaultBranch: 'react' });
1174
+
1175
+ await expect(getBranches(repository)).resolves.toMatchObject({
1176
+ defaultBranches: { origin: 'react' },
1177
+ });
1178
+ });
1179
+
1180
+ it('asks the remote when no local remote/HEAD exists', async () => {
1181
+ const { repository } = createRepositoryWithRemote({ remoteName: 'origin', defaultBranch: 'react' });
1182
+ // A hand-added remote can end up without this ref; the branch it points at
1183
+ // is still knowable, and guessing instead is the bug this data replaces.
1184
+ runGit(repository, ['remote', 'set-head', 'origin', '--delete']);
1185
+
1186
+ await expect(getBranches(repository)).resolves.toMatchObject({
1187
+ defaultBranches: { origin: 'react' },
1188
+ });
1189
+ });
1190
+
1191
+ it('keeps the branches of a remote that cannot be reached', async () => {
1192
+ const { repository, remote } = createRepositoryWithRemote({ remoteName: 'origin', defaultBranch: 'react' });
1193
+ fs.rmSync(remote, { recursive: true, force: true });
1194
+
1195
+ const branches = await getBranches(repository);
1196
+
1197
+ // "We could not ask" is not "the branch is gone": callers read this list to
1198
+ // decide whether a base branch exists at all.
1199
+ expect(branches.all).toContain('remotes/origin/react');
1200
+ });
1201
+ });
1202
+
1203
+ describe.runIf(canRunGit())('getRangeDiff', () => {
1204
+ it('resolves a base that exists only on a remote other than origin', async () => {
1205
+ const { repository } = createRepositoryWithRemote({ remoteName: 'upstream', defaultBranch: 'react' });
1206
+ // Only refs/remotes/upstream/react carries the base — git cannot resolve the
1207
+ // bare name, so an unqualified `react...next` fails with "ambiguous argument".
1208
+ fs.writeFileSync(path.join(repository, 'feature.txt'), 'work\n');
1209
+ runGit(repository, ['add', 'feature.txt']);
1210
+ runGit(repository, ['commit', '-m', 'feature']);
1211
+
1212
+ const diff = await getRangeDiff(repository, { base: 'react', head: 'next' });
1213
+
1214
+ expect(diff).toContain('feature.txt');
1215
+ });
1216
+ });