@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,1604 @@
1
+ const DEFAULT_TARGET_TTL_MS = 30 * 60 * 1000;
2
+ const TOKEN_COOKIE_NAME = 'oc_preview_token';
3
+ const TOKEN_QUERY_PARAM = 'oc_preview_token';
4
+ const CLIENT_TOKEN_QUERY_PARAM = 'oc_client_token';
5
+ const URL_AUTH_TOKEN_QUERY_PARAM = 'oc_url_token';
6
+ const PREVIEW_PASSTHROUGH_REQUEST_HEADERS = ['x-inertia', 'x-inertia-version'];
7
+ const PREVIEW_PASSTHROUGH_RESPONSE_HEADERS = ['x-inertia', 'x-inertia-location'];
8
+ export const PREVIEW_TARGET_ERROR_HEADER = 'x-pichamber-preview-target-error';
9
+
10
+ const LOOPBACK_HOSTS = new Set([
11
+ 'localhost',
12
+ '127.0.0.1',
13
+ '::1',
14
+ '[::1]',
15
+ '0.0.0.0',
16
+ ]);
17
+
18
+ const PREVIEW_BRIDGE_SCRIPT_ID = 'pichamber-preview-bridge';
19
+
20
+ const parsePreviewResourcePath = (url) => {
21
+ try {
22
+ const parsed = new URL(String(url || ''), 'http://localhost');
23
+ const match = parsed.pathname.match(/^\/api\/preview\/proxy\/[a-f0-9]{16,64}(\/.*)?$/i);
24
+ const path = match ? (match[1] || '/') : parsed.pathname;
25
+ return path + parsed.search;
26
+ } catch {
27
+ return String(url || '');
28
+ }
29
+ };
30
+
31
+ const readHeader = (headers, name) => {
32
+ if (!headers || typeof headers !== 'object') return undefined;
33
+ const direct = headers[name];
34
+ if (direct !== undefined) return direct;
35
+ const lowerName = name.toLowerCase();
36
+ const key = Object.keys(headers).find((entry) => entry.toLowerCase() === lowerName);
37
+ return key ? headers[key] : undefined;
38
+ };
39
+
40
+ export const applyPreviewPassthroughRequestHeaders = (req, proxyReq) => {
41
+ for (const headerName of PREVIEW_PASSTHROUGH_REQUEST_HEADERS) {
42
+ const value = readHeader(req?.headers, headerName);
43
+ if (value !== undefined) {
44
+ proxyReq.setHeader(headerName, value);
45
+ }
46
+ }
47
+ };
48
+
49
+ export const applyPreviewPassthroughResponseHeaders = (proxyRes, res) => {
50
+ if (!res || res.headersSent || typeof res.setHeader !== 'function') return;
51
+ for (const headerName of PREVIEW_PASSTHROUGH_RESPONSE_HEADERS) {
52
+ const value = readHeader(proxyRes?.headers, headerName);
53
+ if (value !== undefined) {
54
+ res.setHeader(headerName, value);
55
+ }
56
+ }
57
+ };
58
+
59
+ const previewResourceNoiseRuleSets = [
60
+ {
61
+ name: 'vite',
62
+ suppress: ({ lower, path, tag }) => path === '/@vite/client'
63
+ || path === '/@react-refresh'
64
+ || path.startsWith('/@id/__x00__vite/')
65
+ || lower.includes('/node_modules/.vite/')
66
+ || lower.includes('/vite/dist/client/')
67
+ || (tag === 'script' && lower.includes('/@id/')),
68
+ },
69
+ {
70
+ name: 'astro',
71
+ suppress: ({ lower, path, tag }) => path.startsWith('/@id/astro:')
72
+ || lower.includes('/astro/dist/runtime/client/dev-toolbar/')
73
+ || (tag === 'script' && lower.includes('.astro?') && lower.includes('type=script'))
74
+ || (tag === 'script' && (
75
+ lower.endsWith('.css')
76
+ || lower.includes('.css?')
77
+ || lower.includes('type=style')
78
+ || lower.includes('lang.css')
79
+ )),
80
+ },
81
+ {
82
+ name: 'next',
83
+ suppress: ({ lower, path, tag }) => tag === 'script' && (
84
+ path === '/_next/webpack-hmr'
85
+ || lower.includes('/_next/static/webpack/')
86
+ || lower.includes('/_next/static/chunks/webpack')
87
+ || lower.includes('/_next/static/chunks/react-refresh')
88
+ || lower.includes('/_next/static/development/')
89
+ ),
90
+ },
91
+ {
92
+ name: 'sveltekit',
93
+ suppress: ({ lower, tag }) => tag === 'script' && (
94
+ lower.includes('/@id/__x00__virtual:')
95
+ || lower.includes('/@id/virtual:')
96
+ || lower.includes('/.svelte-kit/generated/')
97
+ || lower.includes('/node_modules/.vite/deps/')
98
+ ),
99
+ },
100
+ {
101
+ name: 'remix',
102
+ suppress: ({ lower, tag }) => tag === 'script' && (
103
+ lower.includes('/@remix-run/dev/')
104
+ || lower.includes('/__manifest')
105
+ || lower.includes('/__hmr')
106
+ ),
107
+ },
108
+ {
109
+ name: 'nuxt',
110
+ suppress: ({ lower, tag }) => tag === 'script' && (
111
+ lower.includes('/_nuxt/@vite/client')
112
+ || lower.includes('/_nuxt/@id/')
113
+ || lower.includes('/_nuxt/node_modules/.vite/')
114
+ || lower.includes('/__nuxt_error')
115
+ || lower.includes('/__nuxt_vite_node__')
116
+ ),
117
+ },
118
+ {
119
+ name: 'webpack',
120
+ suppress: ({ lower, path, tag }) => tag === 'script' && (
121
+ path === '/sockjs-node/info'
122
+ || lower.includes('/webpack-dev-server/')
123
+ || lower.includes('/webpack/hot/')
124
+ || lower.includes('/__webpack_hmr')
125
+ || lower.includes('/ws') && lower.includes('webpack')
126
+ ),
127
+ },
128
+ ];
129
+
130
+ export const classifyPreviewResourceError = ({ tagName, url }) => {
131
+ const tag = typeof tagName === 'string' ? tagName.toLowerCase() : '';
132
+ if (tag !== 'script' && tag !== 'link') return 'report';
133
+
134
+ const pathAndSearch = parsePreviewResourcePath(url);
135
+ const lower = pathAndSearch.toLowerCase();
136
+ const path = pathAndSearch.split('?', 1)[0] || '';
137
+ const context = { tag, path, pathAndSearch, lower };
138
+
139
+ if (previewResourceNoiseRuleSets.some((ruleSet) => ruleSet.suppress(context))) return 'suppress';
140
+
141
+ return 'report';
142
+ };
143
+
144
+ export const classifyPreviewNavigation = ({ url, currentUrl, targetOrigin }) => {
145
+ let parsed;
146
+ try {
147
+ parsed = new URL(String(url || ''), currentUrl || 'http://localhost/');
148
+ } catch {
149
+ return { action: 'allow', url: String(url || '') };
150
+ }
151
+
152
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
153
+ return { action: 'allow', url: parsed.toString() };
154
+ }
155
+
156
+ let current;
157
+ try {
158
+ current = new URL(currentUrl || 'http://localhost/');
159
+ } catch {
160
+ current = null;
161
+ }
162
+
163
+ if (current
164
+ && parsed.origin === current.origin
165
+ && parsed.pathname === current.pathname
166
+ && parsed.search === current.search
167
+ && parsed.hash
168
+ ) {
169
+ return { action: 'allow', url: parsed.toString() };
170
+ }
171
+
172
+ const path = parsed.pathname || '/';
173
+ const proxyMatch = current?.pathname?.match(/^(\/api\/preview\/proxy\/[a-f0-9]{16,64})(?:\/|$)/i);
174
+ if (parsed.origin === current?.origin && path.startsWith('/api/preview/proxy/')) {
175
+ return { action: 'allow', url: parsed.toString() };
176
+ }
177
+
178
+ if (proxyMatch && parsed.origin === current?.origin && path.startsWith('/') && !path.startsWith(proxyMatch[1])) {
179
+ try {
180
+ if (targetOrigin) {
181
+ const upstreamUrl = new URL(`${parsed.pathname}${parsed.search}${parsed.hash}`, targetOrigin);
182
+ return { action: 'proxy', url: upstreamUrl.toString() };
183
+ }
184
+ } catch {
185
+ // fall through to the default policy
186
+ }
187
+ }
188
+
189
+ const host = parsed.hostname;
190
+ const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0' || host === '::1' || host === '[::1]';
191
+ if (isLoopback || (parsed.origin === current?.origin && path.startsWith('/'))) {
192
+ return { action: 'proxy', url: parsed.toString() };
193
+ }
194
+
195
+ return { action: 'external', url: parsed.toString() };
196
+ };
197
+
198
+ const PREVIEW_BRIDGE_SCRIPT = String.raw`(() => {
199
+ if (window.__pichamberPreviewBridgeInstalled) return;
200
+ window.__pichamberPreviewBridgeInstalled = true;
201
+
202
+ const SOURCE = 'pichamber-preview-bridge';
203
+ const VERSION = 1;
204
+ const MAX_TEXT = 500;
205
+ const MAX_ARG = 1000;
206
+ const TARGET_ORIGIN = typeof window.__pichamberPreviewTargetOrigin === 'string' ? window.__pichamberPreviewTargetOrigin : '';
207
+ let inspectMode = false;
208
+ let lastHoverKey = '';
209
+ let pendingHover = null;
210
+ let previewColorScheme = null;
211
+ let nativeMatchMedia = null;
212
+ const colorSchemeListeners = new Set();
213
+
214
+ const parentOrigin = (() => {
215
+ try {
216
+ const ancestorOrigins = window.location && window.location.ancestorOrigins;
217
+ const ancestorOrigin = ancestorOrigins && ancestorOrigins.length > 0 ? ancestorOrigins[0] : '';
218
+ if (ancestorOrigin && ancestorOrigin !== 'null') return ancestorOrigin;
219
+ const origin = document.referrer ? new URL(document.referrer).origin : '';
220
+ return origin && origin !== 'null' ? origin : '';
221
+ } catch {
222
+ return '';
223
+ }
224
+ })();
225
+
226
+ const post = (payload) => {
227
+ try {
228
+ if (parentOrigin && window.parent && typeof window.parent.postMessage === 'function') {
229
+ const message = Object.assign({ source: SOURCE, version: VERSION }, payload || {});
230
+ window.parent.postMessage(message, parentOrigin);
231
+ }
232
+ } catch {}
233
+ };
234
+
235
+ const clip = (value, max = MAX_TEXT) => {
236
+ const text = String(value == null ? '' : value).replace(/\s+/g, ' ').trim();
237
+ return text.length > max ? text.slice(0, max) + '...' : text;
238
+ };
239
+
240
+ const stringifyArg = (value) => {
241
+ if (typeof value === 'string') return clip(value, MAX_ARG);
242
+ if (value instanceof Error) return clip(value.stack || value.message || String(value), MAX_ARG);
243
+ try {
244
+ return clip(JSON.stringify(value), MAX_ARG);
245
+ } catch {
246
+ return clip(String(value), MAX_ARG);
247
+ }
248
+ };
249
+
250
+ const normalizeColorScheme = (value) => value === 'dark' ? 'dark' : value === 'light' ? 'light' : null;
251
+
252
+ const mediaQueryColorScheme = (query) => {
253
+ const normalized = String(query || '').replace(/\s+/g, ' ').trim().toLowerCase();
254
+ if (normalized === '(prefers-color-scheme: dark)') return 'dark';
255
+ if (normalized === '(prefers-color-scheme: light)') return 'light';
256
+ return null;
257
+ };
258
+
259
+ const mediaQueryMatchesPreviewScheme = (query) => {
260
+ const scheme = mediaQueryColorScheme(query);
261
+ if (!scheme || !previewColorScheme) return null;
262
+ return previewColorScheme === scheme;
263
+ };
264
+
265
+ const notifyColorSchemeListeners = () => {
266
+ for (const listener of Array.from(colorSchemeListeners)) {
267
+ try {
268
+ const matches = mediaQueryMatchesPreviewScheme(listener.media);
269
+ if (matches === null) continue;
270
+ const event = { matches, media: listener.media, type: 'change', target: listener.mql, currentTarget: listener.mql };
271
+ listener.callback.call(listener.mql, event);
272
+ } catch {}
273
+ }
274
+ };
275
+
276
+ const installColorSchemeMatchMediaPatch = () => {
277
+ if (window.__pichamberPreviewColorSchemePatched || typeof window.matchMedia !== 'function') return;
278
+ window.__pichamberPreviewColorSchemePatched = true;
279
+ nativeMatchMedia = window.matchMedia.bind(window);
280
+ window.matchMedia = function(query) {
281
+ const nativeMql = nativeMatchMedia(query);
282
+ if (!mediaQueryColorScheme(query)) return nativeMql;
283
+ const listenersForMql = new Map();
284
+ const mql = Object.create(nativeMql);
285
+ Object.defineProperty(mql, 'matches', { get: () => mediaQueryMatchesPreviewScheme(query) ?? nativeMql.matches });
286
+ Object.defineProperty(mql, 'media', { get: () => nativeMql.media });
287
+ mql.addEventListener = function(type, callback, options) {
288
+ if (type !== 'change' || typeof callback !== 'function') return nativeMql.addEventListener?.(type, callback, options);
289
+ const entry = { media: query, mql, callback };
290
+ listenersForMql.set(callback, entry);
291
+ colorSchemeListeners.add(entry);
292
+ };
293
+ mql.removeEventListener = function(type, callback, options) {
294
+ if (type !== 'change' || typeof callback !== 'function') return nativeMql.removeEventListener?.(type, callback, options);
295
+ const entry = listenersForMql.get(callback);
296
+ if (entry) colorSchemeListeners.delete(entry);
297
+ listenersForMql.delete(callback);
298
+ };
299
+ mql.addListener = function(callback) { mql.addEventListener('change', callback); };
300
+ mql.removeListener = function(callback) { mql.removeEventListener('change', callback); };
301
+ return mql;
302
+ };
303
+ };
304
+
305
+ const shouldSyncDataTheme = () => {
306
+ try {
307
+ const root = document.documentElement;
308
+ if (!root) return false;
309
+ if (root.hasAttribute('data-theme')) return true;
310
+ if (document.querySelector('starlight-theme-select, starlight-menu-button')) return true;
311
+ const generator = document.querySelector('meta[name="generator"]');
312
+ const generatorContent = generator && typeof generator.getAttribute === 'function' ? generator.getAttribute('content') || '' : '';
313
+ if (generatorContent.toLowerCase().indexOf('starlight') >= 0) return true;
314
+ const styles = window.getComputedStyle(root);
315
+ return Boolean(styles.getPropertyValue('--sl-color-bg').trim()
316
+ || styles.getPropertyValue('--sl-color-text').trim()
317
+ || styles.getPropertyValue('--sl-color-accent').trim());
318
+ } catch {
319
+ return false;
320
+ }
321
+ };
322
+
323
+ const applyPreviewColorScheme = (scheme) => {
324
+ const next = normalizeColorScheme(scheme);
325
+ if (!next || previewColorScheme === next) return;
326
+ previewColorScheme = next;
327
+ try {
328
+ const root = document.documentElement;
329
+ root.style.colorScheme = next;
330
+ root.dataset.pichamberPreviewColorScheme = next;
331
+ if (shouldSyncDataTheme()) {
332
+ root.dataset.theme = next;
333
+ }
334
+ } catch {}
335
+ notifyColorSchemeListeners();
336
+ };
337
+
338
+ const readElementUrl = (element) => {
339
+ return element.currentSrc || element.src || element.href || element.action || '';
340
+ };
341
+
342
+ const upstreamPathForUrl = (value) => {
343
+ try {
344
+ const parsed = new URL(value, window.location.href);
345
+ const match = parsed.pathname.match(/^\/api\/preview\/proxy\/[a-f0-9]{16,64}(\/.*)?$/i);
346
+ return match ? (match[1] || '/') : parsed.pathname;
347
+ } catch {
348
+ return String(value || '');
349
+ }
350
+ };
351
+
352
+ const upstreamPathAndSearchForUrl = (value) => {
353
+ try {
354
+ const parsed = new URL(value, window.location.href);
355
+ const match = parsed.pathname.match(/^\/api\/preview\/proxy\/[a-f0-9]{16,64}(\/.*)?$/i);
356
+ const path = match ? (match[1] || '/') : parsed.pathname;
357
+ return path + parsed.search;
358
+ } catch {
359
+ return String(value || '');
360
+ }
361
+ };
362
+
363
+ const isInternalDevToolResource = (element, value) => {
364
+ const tag = element && element.tagName && typeof element.tagName.toLowerCase === 'function' ? element.tagName.toLowerCase() : '';
365
+ if (tag !== 'script' && tag !== 'link') return false;
366
+ if (tag === 'script' && typeof element.hasAttribute === 'function' && element.hasAttribute('data-cf-beacon')) return true;
367
+ const pathAndSearch = upstreamPathAndSearchForUrl(value);
368
+ const lower = pathAndSearch.toLowerCase();
369
+ const path = pathAndSearch.split('?', 1)[0] || '';
370
+
371
+ const viteNoise = path === '/@vite/client'
372
+ || path === '/@react-refresh'
373
+ || path.indexOf('/@id/__x00__vite/') === 0
374
+ || lower.indexOf('/node_modules/.vite/') >= 0
375
+ || lower.indexOf('/vite/dist/client/') >= 0
376
+ || (tag === 'script' && lower.indexOf('/@id/') >= 0);
377
+ const astroNoise = path.indexOf('/@id/astro:') === 0
378
+ || lower.indexOf('/astro/dist/runtime/client/dev-toolbar/') >= 0
379
+ || (tag === 'script' && lower.indexOf('.astro?') >= 0 && lower.indexOf('type=script') >= 0)
380
+ || (tag === 'script' && (
381
+ lower.endsWith('.css')
382
+ || lower.indexOf('.css?') >= 0
383
+ || lower.indexOf('type=style') >= 0
384
+ || lower.indexOf('lang.css') >= 0
385
+ ));
386
+ const nextNoise = tag === 'script' && (
387
+ path === '/_next/webpack-hmr'
388
+ || lower.indexOf('/_next/static/webpack/') >= 0
389
+ || lower.indexOf('/_next/static/chunks/webpack') >= 0
390
+ || lower.indexOf('/_next/static/chunks/react-refresh') >= 0
391
+ || lower.indexOf('/_next/static/development/') >= 0
392
+ );
393
+ const svelteKitNoise = tag === 'script' && (
394
+ lower.indexOf('/@id/__x00__virtual:') >= 0
395
+ || lower.indexOf('/@id/virtual:') >= 0
396
+ || lower.indexOf('/.svelte-kit/generated/') >= 0
397
+ || lower.indexOf('/node_modules/.vite/deps/') >= 0
398
+ );
399
+ const remixNoise = tag === 'script' && (
400
+ lower.indexOf('/@remix-run/dev/') >= 0
401
+ || lower.indexOf('/__manifest') >= 0
402
+ || lower.indexOf('/__hmr') >= 0
403
+ );
404
+ const nuxtNoise = tag === 'script' && (
405
+ lower.indexOf('/_nuxt/@vite/client') >= 0
406
+ || lower.indexOf('/_nuxt/@id/') >= 0
407
+ || lower.indexOf('/_nuxt/node_modules/.vite/') >= 0
408
+ || lower.indexOf('/__nuxt_error') >= 0
409
+ || lower.indexOf('/__nuxt_vite_node__') >= 0
410
+ );
411
+ const webpackNoise = tag === 'script' && (
412
+ path === '/sockjs-node/info'
413
+ || lower.indexOf('/webpack-dev-server/') >= 0
414
+ || lower.indexOf('/webpack/hot/') >= 0
415
+ || lower.indexOf('/__webpack_hmr') >= 0
416
+ || (lower.indexOf('/ws') >= 0 && lower.indexOf('webpack') >= 0)
417
+ );
418
+
419
+ if (viteNoise || astroNoise || nextNoise || svelteKitNoise || remixNoise || nuxtNoise || webpackNoise) return true;
420
+ return false;
421
+ };
422
+
423
+ installColorSchemeMatchMediaPatch();
424
+
425
+ const classifyNavigation = (value) => {
426
+ try {
427
+ const parsed = new URL(value, window.location.href);
428
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return { action: 'allow', url: parsed.toString() };
429
+ const current = new URL(window.location.href);
430
+ const proxyMatch = current.pathname.match(/^(\/api\/preview\/proxy\/[a-f0-9]{16,64})(?:\/|$)/i);
431
+ if (parsed.origin === current.origin && parsed.pathname === current.pathname && parsed.search === current.search && parsed.hash) {
432
+ return { action: 'allow', url: parsed.toString() };
433
+ }
434
+ if (parsed.origin === current.origin && parsed.pathname.startsWith('/api/preview/proxy/')) {
435
+ return { action: 'allow', url: parsed.toString() };
436
+ }
437
+ if (proxyMatch && parsed.origin === current.origin && parsed.pathname.startsWith('/') && parsed.pathname.indexOf(proxyMatch[1]) !== 0 && TARGET_ORIGIN) {
438
+ try {
439
+ const upstreamUrl = new URL(parsed.pathname + parsed.search + parsed.hash, TARGET_ORIGIN);
440
+ return { action: 'proxy', url: upstreamUrl.toString() };
441
+ } catch {}
442
+ }
443
+ const host = parsed.hostname;
444
+ const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0' || host === '::1' || host === '[::1]';
445
+ if (isLoopback || (parsed.origin === current.origin && parsed.pathname.startsWith('/'))) {
446
+ return { action: 'proxy', url: parsed.toString() };
447
+ }
448
+ return { action: 'external', url: parsed.toString() };
449
+ } catch {
450
+ return { action: 'allow', url: String(value || '') };
451
+ }
452
+ };
453
+
454
+ const isInternalDevToolRuntimeError = (filename) => {
455
+ const path = upstreamPathForUrl(filename || '');
456
+ const pathAndSearch = upstreamPathAndSearchForUrl(filename || '');
457
+ const lowerPathAndSearch = pathAndSearch.toLowerCase();
458
+ const isStyleRuntimeNoise = lowerPathAndSearch.endsWith('.css')
459
+ || lowerPathAndSearch.indexOf('.css?') >= 0
460
+ || lowerPathAndSearch.indexOf('type=style') >= 0
461
+ || lowerPathAndSearch.indexOf('lang.css') >= 0;
462
+ return path === '/@vite/client'
463
+ || path === '/@react-refresh'
464
+ || path.indexOf('/astro/dist/runtime/client/dev-toolbar/') >= 0
465
+ || path.indexOf('/node_modules/.vite/') >= 0
466
+ || isStyleRuntimeNoise;
467
+ };
468
+
469
+ const isInternalDevToolConsoleNoise = (level, args) => {
470
+ if (level !== 'error' || typeof args[0] !== 'string' || args[0].indexOf('[vite]') !== 0) return false;
471
+ const text = args.map((arg) => stringifyArg(arg)).join(' ');
472
+ return text.indexOf('failed to connect to websocket') >= 0
473
+ || text.indexOf("Cannot read properties of undefined (reading 'send')") >= 0
474
+ || text.indexOf('Cannot read properties of undefined (reading "send")') >= 0;
475
+ };
476
+
477
+ const installViteHmrProxyPatch = () => {
478
+ if (window.__pichamberViteHmrProxyPatched || typeof window.WebSocket !== 'function') return;
479
+ window.__pichamberViteHmrProxyPatched = true;
480
+ const NativeWebSocket = window.WebSocket;
481
+ const proxyMatch = window.location.pathname.match(/^(\/api\/preview\/proxy\/[a-f0-9]{16,64})(?:\/|$)/i);
482
+ if (!proxyMatch) return;
483
+ const proxyBase = proxyMatch[1] + '/';
484
+ const currentSearchParams = new URL(window.location.href).searchParams;
485
+ const previewToken = currentSearchParams.get('oc_preview_token') || '';
486
+ const urlAuthToken = currentSearchParams.get('oc_url_token') || '';
487
+ let reloadTimer = 0;
488
+
489
+ const schedulePreviewReload = () => {
490
+ if (reloadTimer) return;
491
+ reloadTimer = window.setTimeout(() => {
492
+ reloadTimer = 0;
493
+ try {
494
+ window.location.reload();
495
+ } catch {}
496
+ }, 80);
497
+ };
498
+
499
+ const rewriteUrl = (url, protocols) => {
500
+ const protocolList = Array.isArray(protocols) ? protocols : [protocols];
501
+ const isViteSocket = protocolList.indexOf('vite-hmr') >= 0 || protocolList.indexOf('vite-ping') >= 0;
502
+ if (!isViteSocket) return url;
503
+ try {
504
+ const parsed = new URL(String(url), window.location.href);
505
+ if (parsed.host !== window.location.host) return url;
506
+ if (parsed.pathname.indexOf(proxyBase) !== 0) {
507
+ parsed.pathname = proxyBase;
508
+ }
509
+ if (previewToken) parsed.searchParams.set('oc_preview_token', previewToken);
510
+ if (urlAuthToken) parsed.searchParams.set('oc_url_token', urlAuthToken);
511
+ return parsed.toString();
512
+ } catch {
513
+ return url;
514
+ }
515
+ };
516
+
517
+ function PiChamberPreviewWebSocket(url, protocols) {
518
+ const protocolList = Array.isArray(protocols) ? protocols : [protocols];
519
+ const isViteSocket = protocolList.indexOf('vite-hmr') >= 0;
520
+ const nextUrl = rewriteUrl(url, protocols);
521
+ const socket = arguments.length === 1
522
+ ? new NativeWebSocket(nextUrl)
523
+ : new NativeWebSocket(nextUrl, protocols);
524
+
525
+ if (isViteSocket) {
526
+ socket.addEventListener('message', (event) => {
527
+ try {
528
+ const payload = JSON.parse(String(event.data || ''));
529
+ if (payload && (payload.type === 'update' || payload.type === 'full-reload')) {
530
+ schedulePreviewReload();
531
+ }
532
+ } catch {}
533
+ });
534
+ }
535
+
536
+ return socket;
537
+ }
538
+
539
+ PiChamberPreviewWebSocket.prototype = NativeWebSocket.prototype;
540
+ Object.setPrototypeOf(PiChamberPreviewWebSocket, NativeWebSocket);
541
+ Object.defineProperty(PiChamberPreviewWebSocket, 'name', { value: 'WebSocket' });
542
+ window.WebSocket = PiChamberPreviewWebSocket;
543
+ };
544
+
545
+ const installAppRequestProxyPatch = () => {
546
+ if (window.__pichamberAppRequestProxyPatched) return;
547
+ window.__pichamberAppRequestProxyPatched = true;
548
+ const proxyMatch = window.location.pathname.match(/^(\/api\/preview\/proxy\/[a-f0-9]{16,64})(?:\/|$)/i);
549
+ if (!proxyMatch) return;
550
+ const proxyBase = proxyMatch[1];
551
+ const currentSearchParams = new URL(window.location.href).searchParams;
552
+ const previewToken = currentSearchParams.get('oc_preview_token') || '';
553
+ const urlAuthToken = currentSearchParams.get('oc_url_token') || '';
554
+
555
+ const withProxyAuth = (value) => {
556
+ if (typeof value !== 'string' || value.indexOf(proxyBase) !== 0) return value;
557
+ if (!previewToken && !urlAuthToken) return value;
558
+ try {
559
+ const parsed = new URL(value, window.location.origin);
560
+ parsed.searchParams.delete('oc_client_token');
561
+ if (previewToken) parsed.searchParams.set('oc_preview_token', previewToken);
562
+ if (urlAuthToken) parsed.searchParams.set('oc_url_token', urlAuthToken);
563
+ return parsed.pathname + parsed.search + parsed.hash;
564
+ } catch {
565
+ return value;
566
+ }
567
+ };
568
+
569
+ const shouldProxyPath = (pathname) => {
570
+ if (typeof pathname !== 'string' || !pathname.startsWith('/') || pathname.startsWith('//')) return false;
571
+ if (pathname.indexOf(proxyBase) === 0) return false;
572
+ return true;
573
+ };
574
+
575
+ const proxiedUrl = (value) => {
576
+ if (typeof value !== 'string') return value;
577
+ if (value.startsWith('/')) {
578
+ if (value.indexOf(proxyBase) === 0) return withProxyAuth(value);
579
+ if (!shouldProxyPath(value)) return value;
580
+ return withProxyAuth(proxyBase + value);
581
+ }
582
+
583
+ try {
584
+ const parsed = new URL(value, window.location.href);
585
+ if (parsed.origin === window.location.origin && shouldProxyPath(parsed.pathname)) {
586
+ return withProxyAuth(proxyBase + parsed.pathname + parsed.search + parsed.hash);
587
+ }
588
+ } catch {}
589
+
590
+ return value;
591
+ };
592
+
593
+ const proxiedWebSocketUrl = (value) => {
594
+ if (typeof value !== 'string') return value;
595
+ try {
596
+ const parsed = new URL(value, window.location.href);
597
+ const current = new URL(window.location.href);
598
+ const sameHost = parsed.host === current.host;
599
+ const isWebSocketProtocol = parsed.protocol === 'ws:' || parsed.protocol === 'wss:';
600
+ if (sameHost && isWebSocketProtocol && shouldProxyPath(parsed.pathname)) {
601
+ parsed.pathname = proxyBase + parsed.pathname;
602
+ parsed.searchParams.delete('oc_client_token');
603
+ if (previewToken) parsed.searchParams.set('oc_preview_token', previewToken);
604
+ if (urlAuthToken) parsed.searchParams.set('oc_url_token', urlAuthToken);
605
+ return parsed.toString();
606
+ }
607
+ } catch {}
608
+ return value;
609
+ };
610
+
611
+ const proxiedNavigationUrl = (value) => {
612
+ if (typeof value !== 'string') return value;
613
+ try {
614
+ const parsed = new URL(value, window.location.href);
615
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return value;
616
+ if (parsed.origin === window.location.origin && parsed.pathname.indexOf(proxyBase) === 0) {
617
+ return withProxyAuth(parsed.pathname + parsed.search + parsed.hash);
618
+ }
619
+ const host = parsed.hostname;
620
+ const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0' || host === '::1' || host === '[::1]';
621
+ if (!isLoopback && parsed.origin !== window.location.origin) return value;
622
+ if (!shouldProxyPath(parsed.pathname)) return value;
623
+ return withProxyAuth(proxyBase + parsed.pathname + parsed.search + parsed.hash);
624
+ } catch {
625
+ return proxiedUrl(value);
626
+ }
627
+ };
628
+
629
+ if (window.history && typeof window.history.pushState === 'function') {
630
+ const nativePushState = window.history.pushState.bind(window.history);
631
+ window.history.pushState = function(state, unused, url) {
632
+ return nativePushState(state, unused, url === undefined ? url : proxiedNavigationUrl(String(url)));
633
+ };
634
+ }
635
+
636
+ if (window.history && typeof window.history.replaceState === 'function') {
637
+ const nativeReplaceState = window.history.replaceState.bind(window.history);
638
+ window.history.replaceState = function(state, unused, url) {
639
+ return nativeReplaceState(state, unused, url === undefined ? url : proxiedNavigationUrl(String(url)));
640
+ };
641
+ }
642
+
643
+ if (typeof window.fetch === 'function') {
644
+ const nativeFetch = window.fetch.bind(window);
645
+ window.fetch = function(input, init) {
646
+ if (typeof input === 'string') {
647
+ return nativeFetch(proxiedUrl(input), init);
648
+ }
649
+ if (input instanceof Request) {
650
+ try {
651
+ const parsed = new URL(input.url);
652
+ if (parsed.origin === window.location.origin && shouldProxyPath(parsed.pathname)) {
653
+ const nextUrl = withProxyAuth(proxyBase + parsed.pathname + parsed.search + parsed.hash);
654
+ return nativeFetch(new Request(nextUrl, input), init);
655
+ }
656
+ } catch {}
657
+ }
658
+ return nativeFetch(input, init);
659
+ };
660
+ }
661
+
662
+ if (window.XMLHttpRequest && window.XMLHttpRequest.prototype) {
663
+ const nativeOpen = window.XMLHttpRequest.prototype.open;
664
+ window.XMLHttpRequest.prototype.open = function(method, url) {
665
+ const args = Array.prototype.slice.call(arguments);
666
+ if (typeof url === 'string') {
667
+ args[1] = proxiedUrl(url);
668
+ }
669
+ return nativeOpen.apply(this, args);
670
+ };
671
+ }
672
+
673
+ if (typeof window.EventSource === 'function') {
674
+ const NativeEventSource = window.EventSource;
675
+ function PiChamberPreviewEventSource(url, eventSourceInitDict) {
676
+ return new NativeEventSource(proxiedUrl(String(url)), eventSourceInitDict);
677
+ }
678
+ PiChamberPreviewEventSource.prototype = NativeEventSource.prototype;
679
+ Object.setPrototypeOf(PiChamberPreviewEventSource, NativeEventSource);
680
+ Object.defineProperty(PiChamberPreviewEventSource, 'name', { value: 'EventSource' });
681
+ window.EventSource = PiChamberPreviewEventSource;
682
+ }
683
+
684
+ if (typeof window.WebSocket === 'function') {
685
+ const NativeWebSocket = window.WebSocket;
686
+ function PiChamberPreviewAppWebSocket(url, protocols) {
687
+ const nextUrl = proxiedWebSocketUrl(String(url));
688
+ return arguments.length === 1
689
+ ? new NativeWebSocket(nextUrl)
690
+ : new NativeWebSocket(nextUrl, protocols);
691
+ }
692
+ PiChamberPreviewAppWebSocket.prototype = NativeWebSocket.prototype;
693
+ Object.setPrototypeOf(PiChamberPreviewAppWebSocket, NativeWebSocket);
694
+ Object.defineProperty(PiChamberPreviewAppWebSocket, 'name', { value: 'WebSocket' });
695
+ window.WebSocket = PiChamberPreviewAppWebSocket;
696
+ }
697
+ };
698
+
699
+ const selectorPart = (element) => {
700
+ const tag = element.tagName.toLowerCase();
701
+ if (element.id && /^[A-Za-z][\w:.-]*$/.test(element.id)) return tag + '#' + CSS.escape(element.id);
702
+ const testId = element.getAttribute('data-testid') || element.getAttribute('data-test') || element.getAttribute('data-cy');
703
+ if (testId) return tag + '[data-testid="' + CSS.escape(testId) + '"]';
704
+ const classes = Array.from(element.classList || []).slice(0, 3).map((entry) => '.' + CSS.escape(entry)).join('');
705
+ return tag + classes;
706
+ };
707
+
708
+ const buildSelector = (element) => {
709
+ const parts = [];
710
+ let current = element;
711
+ while (current && current.nodeType === Node.ELEMENT_NODE && current !== document.documentElement) {
712
+ let part = selectorPart(current);
713
+ const parent = current.parentElement;
714
+ if (parent) {
715
+ const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName);
716
+ if (siblings.length > 1 && !part.includes('#') && !part.includes('[data-testid=')) {
717
+ part += ':nth-of-type(' + (siblings.indexOf(current) + 1) + ')';
718
+ }
719
+ }
720
+ parts.unshift(part);
721
+ if (part.includes('#')) break;
722
+ current = parent;
723
+ }
724
+ return parts.join(' > ');
725
+ };
726
+
727
+ const metadataForElement = (element) => {
728
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) return null;
729
+ const rect = element.getBoundingClientRect();
730
+ const style = window.getComputedStyle(element);
731
+ const attributes = {};
732
+ for (const name of ['id', 'class', 'role', 'aria-label', 'href', 'src', 'data-testid', 'data-test', 'data-cy']) {
733
+ const value = typeof element.getAttribute === 'function' ? element.getAttribute(name) : null;
734
+ if (value) attributes[name] = clip(value, 300);
735
+ }
736
+ const ancestry = [];
737
+ let current = element;
738
+ while (current && current.nodeType === Node.ELEMENT_NODE && ancestry.length < 6) {
739
+ ancestry.unshift({
740
+ tag: current.tagName.toLowerCase(),
741
+ id: current.id || undefined,
742
+ className: clip(current.className || '', 200) || undefined,
743
+ selectorPart: selectorPart(current),
744
+ });
745
+ current = current.parentElement;
746
+ }
747
+ return {
748
+ frame: 'top',
749
+ tag: element.tagName.toLowerCase(),
750
+ text: clip(element.innerText || element.textContent || ''),
751
+ selector: buildSelector(element),
752
+ path: ancestry.map((entry) => entry.tag).join(' > '),
753
+ bounds: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },
754
+ center: { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 },
755
+ attributes,
756
+ computedStyle: {
757
+ display: style.display,
758
+ position: style.position,
759
+ color: style.color,
760
+ backgroundColor: style.backgroundColor,
761
+ fontFamily: style.fontFamily,
762
+ fontSize: style.fontSize,
763
+ fontWeight: style.fontWeight,
764
+ lineHeight: style.lineHeight,
765
+ zIndex: style.zIndex,
766
+ },
767
+ ancestry,
768
+ };
769
+ };
770
+
771
+ const hoverKeyForTarget = (target) => {
772
+ if (!target) return '';
773
+ const bounds = target.bounds || {};
774
+ return [target.selector, Math.round(bounds.x), Math.round(bounds.y), Math.round(bounds.width), Math.round(bounds.height)].join('|');
775
+ };
776
+
777
+ const sendHover = (event) => {
778
+ if (!inspectMode) return;
779
+ pendingHover = event;
780
+ if (window.__pichamberPreviewHoverFrame) return;
781
+ window.__pichamberPreviewHoverFrame = window.requestAnimationFrame(() => {
782
+ window.__pichamberPreviewHoverFrame = 0;
783
+ const currentEvent = pendingHover;
784
+ pendingHover = null;
785
+ if (!currentEvent || !inspectMode) return;
786
+ const element = document.elementFromPoint(currentEvent.clientX, currentEvent.clientY);
787
+ const target = metadataForElement(element);
788
+ const key = hoverKeyForTarget(target);
789
+ if (key === lastHoverKey) return;
790
+ lastHoverKey = key;
791
+ post({ type: 'hover', target, pointer: { x: currentEvent.clientX, y: currentEvent.clientY }, ts: Date.now() });
792
+ });
793
+ };
794
+
795
+ const setInspectMode = (enabled) => {
796
+ inspectMode = Boolean(enabled);
797
+ lastHoverKey = '';
798
+ document.documentElement.style.cursor = inspectMode ? 'crosshair' : '';
799
+ if (!inspectMode) {
800
+ post({ type: 'hover', target: null, pointer: { x: 0, y: 0 }, ts: Date.now() });
801
+ }
802
+ };
803
+
804
+ for (const level of ['log', 'info', 'warn', 'error', 'debug']) {
805
+ const original = console[level];
806
+ console[level] = function() {
807
+ const args = Array.prototype.slice.call(arguments);
808
+ if (level === 'debug' && typeof args[0] === 'string' && args[0].indexOf('[vite]') === 0) {
809
+ return original.apply(console, args);
810
+ }
811
+ if (isInternalDevToolConsoleNoise(level, args)) {
812
+ return original.apply(console, args);
813
+ }
814
+ post({ type: 'console', level, args: args.map(stringifyArg), ts: Date.now() });
815
+ return original.apply(console, args);
816
+ };
817
+ }
818
+
819
+ installViteHmrProxyPatch();
820
+ installAppRequestProxyPatch();
821
+
822
+ window.addEventListener('error', (event) => {
823
+ const target = event.target;
824
+ if (target && target !== window && target.nodeType === Node.ELEMENT_NODE) {
825
+ const url = readElementUrl(target);
826
+ if (isInternalDevToolResource(target, url)) {
827
+ return;
828
+ }
829
+ post({
830
+ type: 'resource-error',
831
+ tag: target.tagName.toLowerCase(),
832
+ url: clip(url, 1000),
833
+ outerHTML: clip(target.outerHTML || '', 1000),
834
+ ts: Date.now(),
835
+ });
836
+ return;
837
+ }
838
+ if (isInternalDevToolRuntimeError(event.filename)) {
839
+ return;
840
+ }
841
+ post({
842
+ type: 'runtime-error',
843
+ message: clip(event.message || 'Unknown error', 1000),
844
+ stack: clip(event.error && event.error.stack ? event.error.stack : '', 2000) || undefined,
845
+ filename: event.filename,
846
+ line: event.lineno,
847
+ column: event.colno,
848
+ ts: Date.now(),
849
+ });
850
+ }, true);
851
+
852
+ window.addEventListener('unhandledrejection', (event) => {
853
+ post({
854
+ type: 'runtime-error',
855
+ message: clip(event.reason && event.reason.message ? event.reason.message : event.reason || 'Unhandled promise rejection', 1000),
856
+ stack: clip(event.reason && event.reason.stack ? event.reason.stack : '', 2000) || undefined,
857
+ ts: Date.now(),
858
+ });
859
+ });
860
+
861
+ window.addEventListener('message', (event) => {
862
+ if (event.source !== window.parent) return;
863
+ const data = event.data;
864
+ if (!data || data.source !== 'pichamber-preview-parent' || data.version !== VERSION) return;
865
+ if (data.type === 'set-inspect-mode') {
866
+ setInspectMode(data.enabled === true);
867
+ }
868
+ if (data.type === 'set-color-scheme') {
869
+ applyPreviewColorScheme(data.scheme);
870
+ }
871
+ });
872
+
873
+ window.addEventListener('mousemove', sendHover, true);
874
+ window.addEventListener('mouseleave', () => {
875
+ if (!inspectMode) return;
876
+ lastHoverKey = '';
877
+ post({ type: 'hover', target: null, pointer: { x: 0, y: 0 }, ts: Date.now() });
878
+ }, true);
879
+ window.addEventListener('click', (event) => {
880
+ const anchor = event.target && typeof event.target.closest === 'function' ? event.target.closest('a[href]') : null;
881
+ if (anchor && !inspectMode) {
882
+ const navigation = classifyNavigation(anchor.href);
883
+ if (navigation.action === 'proxy' || navigation.action === 'external') {
884
+ event.preventDefault();
885
+ event.stopPropagation();
886
+ post({ type: 'navigate-preview', url: navigation.url, navigation: navigation.action, ts: Date.now() });
887
+ return;
888
+ }
889
+ }
890
+
891
+ if (!inspectMode) return;
892
+ event.preventDefault();
893
+ event.stopPropagation();
894
+ const element = document.elementFromPoint(event.clientX, event.clientY);
895
+ const target = metadataForElement(element);
896
+ if (target) {
897
+ post({ type: 'select', target, pointer: { x: event.clientX, y: event.clientY }, ts: Date.now() });
898
+ }
899
+ }, true);
900
+
901
+ window.addEventListener('DOMContentLoaded', () => {
902
+ post({ type: 'ready', url: window.location.href, title: document.title || '' });
903
+ });
904
+ post({ type: 'ready', url: window.location.href, title: document.title || '' });
905
+ })();`;
906
+
907
+ const parseCookieHeader = (cookieHeader) => {
908
+ const result = new Map();
909
+ if (typeof cookieHeader !== 'string' || cookieHeader.length === 0) {
910
+ return result;
911
+ }
912
+
913
+ const parts = cookieHeader.split(';');
914
+ for (const part of parts) {
915
+ const idx = part.indexOf('=');
916
+ if (idx <= 0) {
917
+ continue;
918
+ }
919
+ const key = part.slice(0, idx).trim();
920
+ const value = part.slice(idx + 1).trim();
921
+ if (!key) {
922
+ continue;
923
+ }
924
+ result.set(key, value);
925
+ }
926
+ return result;
927
+ };
928
+
929
+ const buildCookie = ({
930
+ name,
931
+ value,
932
+ path,
933
+ maxAgeSeconds,
934
+ secure,
935
+ }) => {
936
+ const chunks = [`${name}=${value}`];
937
+ if (path) chunks.push(`Path=${path}`);
938
+ if (typeof maxAgeSeconds === 'number' && Number.isFinite(maxAgeSeconds)) {
939
+ chunks.push(`Max-Age=${Math.max(0, Math.trunc(maxAgeSeconds))}`);
940
+ }
941
+ chunks.push('HttpOnly');
942
+ chunks.push('SameSite=Lax');
943
+ if (secure) chunks.push('Secure');
944
+ return chunks.join('; ');
945
+ };
946
+
947
+ // SSRF guard for the `allowExternal` path: refuse to proxy private, loopback and
948
+ // reserved addresses (incl. cloud-metadata 169.254.169.254). Operates on the
949
+ // WHATWG-normalized hostname, so decimal/hex/octal IPv4 forms are already canonical
950
+ // dotted-decimal here. NOTE: this blocks IP *literals* only — a hostname that
951
+ // resolves to a private IP (DNS rebinding) is not caught and would need
952
+ // resolve-time IP pinning. Loopback for local preview goes through the non-external
953
+ // path (allowExternal=false), which is unaffected.
954
+ const isBlockedExternalHost = (hostname) => {
955
+ if (!hostname) return true;
956
+ let host = hostname.toLowerCase();
957
+ if (host.startsWith('[') && host.endsWith(']')) host = host.slice(1, -1);
958
+
959
+ if (host === 'localhost' || host.endsWith('.localhost') || host.endsWith('.local')) return true;
960
+
961
+ const v4 = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
962
+ if (v4) {
963
+ const a = Number(v4[1]);
964
+ const b = Number(v4[2]);
965
+ if (a === 0 || a === 127 || a === 10) return true; // this-host / loopback / private
966
+ if (a === 169 && b === 254) return true; // link-local incl. cloud metadata
967
+ if (a === 172 && b >= 16 && b <= 31) return true; // private
968
+ if (a === 192 && b === 168) return true; // private
969
+ if (a === 100 && b >= 64 && b <= 127) return true; // carrier-grade NAT
970
+ return false;
971
+ }
972
+
973
+ if (host.includes(':')) {
974
+ if (host === '::1' || host === '::') return true; // loopback / unspecified
975
+ if (host.startsWith('fe80')) return true; // link-local
976
+ if (host.startsWith('fc') || host.startsWith('fd')) return true; // unique local fc00::/7
977
+ if (host.includes('::ffff:')) return true; // IPv4-mapped (dotted or hex form)
978
+ return false;
979
+ }
980
+
981
+ return false;
982
+ };
983
+
984
+ export const normalizeProxyTargetUrl = (rawUrl, { allowExternal = false } = {}) => {
985
+ let url;
986
+ try {
987
+ url = new URL(rawUrl);
988
+ } catch {
989
+ return { ok: false, error: 'Invalid URL' };
990
+ }
991
+
992
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
993
+ return { ok: false, error: 'Only http(s) URLs are supported' };
994
+ }
995
+
996
+ const hostname = url.hostname;
997
+ if (!allowExternal) {
998
+ if (!LOOPBACK_HOSTS.has(hostname)) {
999
+ return { ok: false, error: 'Only loopback hosts are supported' };
1000
+ }
1001
+ } else if (isBlockedExternalHost(hostname)) {
1002
+ return { ok: false, error: 'Refusing to proxy private or reserved addresses' };
1003
+ }
1004
+
1005
+ const port = url.port ? Number.parseInt(url.port, 10) : (url.protocol === 'https:' ? 443 : 80);
1006
+ if (!Number.isFinite(port) || port <= 0 || port > 65535) {
1007
+ return { ok: false, error: 'Invalid port' };
1008
+ }
1009
+
1010
+ // Normalize common loopback hostnames to IPv4 to avoid environments where
1011
+ // `localhost` resolves to ::1 but the dev server only binds IPv4.
1012
+ if (LOOPBACK_HOSTS.has(hostname) && (hostname === '0.0.0.0' || hostname === 'localhost' || hostname === '::1' || hostname === '[::1]')) {
1013
+ url.hostname = '127.0.0.1';
1014
+ }
1015
+
1016
+ // Only keep origin here; the proxy path is preserved on the PiChamber side.
1017
+ return { ok: true, origin: url.origin };
1018
+ };
1019
+
1020
+ const appendProxyAuthToProxyUrl = (value, { previewToken = '', urlAuthToken = '' } = {}) => {
1021
+ if (typeof value !== 'string' || !value) return value;
1022
+ const needsQueryRewrite = previewToken
1023
+ || urlAuthToken
1024
+ || value.includes(CLIENT_TOKEN_QUERY_PARAM)
1025
+ || value.includes(URL_AUTH_TOKEN_QUERY_PARAM);
1026
+ if (!needsQueryRewrite) return value;
1027
+ try {
1028
+ const parsed = new URL(value, 'http://pichamber-preview.local');
1029
+ parsed.searchParams.delete(CLIENT_TOKEN_QUERY_PARAM);
1030
+ parsed.searchParams.delete(URL_AUTH_TOKEN_QUERY_PARAM);
1031
+ if (previewToken) parsed.searchParams.set(TOKEN_QUERY_PARAM, previewToken);
1032
+ if (urlAuthToken) parsed.searchParams.set(URL_AUTH_TOKEN_QUERY_PARAM, urlAuthToken);
1033
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`;
1034
+ } catch {
1035
+ return value;
1036
+ }
1037
+ };
1038
+
1039
+ const normalizeLoopbackUrl = (rawUrl) => normalizeProxyTargetUrl(rawUrl, { allowExternal: false });
1040
+
1041
+ export const rewritePreviewBody = ({ bodyText, proxyBasePath, targetOrigin, kind, previewToken = '', urlAuthToken = '' }) => {
1042
+ if (typeof bodyText !== 'string' || bodyText.length === 0) {
1043
+ return bodyText;
1044
+ }
1045
+
1046
+ const prefix = proxyBasePath.endsWith('/') ? proxyBasePath.slice(0, -1) : proxyBasePath;
1047
+ const target = targetOrigin ? new URL(targetOrigin) : null;
1048
+ const isSameTargetOrigin = (url) => {
1049
+ if (!target) return false;
1050
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;
1051
+ if (url.origin === target.origin) return true;
1052
+
1053
+ const host = url.hostname;
1054
+ if (host !== 'localhost' && host !== '127.0.0.1' && host !== '0.0.0.0' && host !== '::1' && host !== '[::1]') {
1055
+ return false;
1056
+ }
1057
+ return url.port === target.port;
1058
+ };
1059
+ const rewriteResourceUrl = (value) => {
1060
+ if (typeof value !== 'string' || value.length === 0) return value;
1061
+ if (value.startsWith('/') && !value.startsWith('//')) {
1062
+ if (value.startsWith('/api/preview/proxy/')) return appendProxyAuthToProxyUrl(value, { previewToken, urlAuthToken });
1063
+ return appendProxyAuthToProxyUrl(`${prefix}${value}`, { previewToken, urlAuthToken });
1064
+ }
1065
+ try {
1066
+ const parsed = new URL(value);
1067
+ if (isSameTargetOrigin(parsed)) {
1068
+ return appendProxyAuthToProxyUrl(`${prefix}${parsed.pathname}${parsed.search}${parsed.hash}`, { previewToken, urlAuthToken });
1069
+ }
1070
+ } catch {
1071
+ return value;
1072
+ }
1073
+ return value;
1074
+ };
1075
+ const stripPreviewCspMeta = (text) => text
1076
+ .replace(/<meta\b(?=[^>]*\bhttp-equiv\s*=\s*(['"])content-security-policy\1)[^>]*>/gi, '')
1077
+ .replace(/<meta\b(?=[^>]*\bhttp-equiv\s*=\s*content-security-policy\b)[^>]*>/gi, '');
1078
+ const rewriteCss = (text) => text
1079
+ .replace(/url\((['"]?)([^)'"]*)\1\)/gi, (_match, quote, value) => {
1080
+ const q = quote || '';
1081
+ return `url(${q}${rewriteResourceUrl(value)}${q})`;
1082
+ })
1083
+ .replace(/@import\s+(['"])\/(?!\/)([^'"]*)\1/gi, (_match, quote, path) => {
1084
+ return `@import ${quote}${rewriteResourceUrl(`/${path}`)}${quote}`;
1085
+ });
1086
+ const rewriteJavaScript = (text) => text
1087
+ .replace(/\bfrom\s+(['"])\/(?!\/)([^'"]*)\1/gi, (_match, quote, path) => {
1088
+ return `from ${quote}${rewriteResourceUrl(`/${path}`)}${quote}`;
1089
+ })
1090
+ .replace(/\bimport\s+(['"])\/(?!\/)([^'"]*)\1/gi, (_match, quote, path) => {
1091
+ return `import ${quote}${rewriteResourceUrl(`/${path}`)}${quote}`;
1092
+ })
1093
+ .replace(/\bimport\(\s*(['"])\/(?!\/)([^'"]*)\1\s*\)/gi, (_match, quote, path) => {
1094
+ return `import(${quote}${rewriteResourceUrl(`/${path}`)}${quote})`;
1095
+ });
1096
+ const rewriteInlineModuleScripts = (text) => text.replace(
1097
+ /<script\b([^>]*)>([\s\S]*?)<\/script>/gi,
1098
+ (match, attrs, scriptBody) => {
1099
+ if (/\bsrc\s*=/i.test(attrs)) return match;
1100
+
1101
+ const typeMatch = String(attrs || '').match(/\btype\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/i);
1102
+ const type = String(typeMatch?.[1] ?? typeMatch?.[2] ?? typeMatch?.[3] ?? '').trim().toLowerCase();
1103
+ if (type !== 'module') return match;
1104
+
1105
+ const rewrittenScriptBody = rewriteJavaScript(scriptBody);
1106
+ if (rewrittenScriptBody === scriptBody) return match;
1107
+ return `<script${attrs}>${rewrittenScriptBody}</script>`;
1108
+ },
1109
+ );
1110
+ const rewriteHtml = (text) => rewriteInlineModuleScripts(text
1111
+ .replace(/\b(src|href|action)=(['"])([^'"]*)\2/gi, (_match, attr, quote, value) => {
1112
+ return `${attr}=${quote}${rewriteResourceUrl(value)}${quote}`;
1113
+ })
1114
+ .replace(/\bsrcset=(['"])([^'"]*)\1/gi, (_match, quote, value) => {
1115
+ const rewritten = String(value).split(',').map((part) => {
1116
+ const trimmed = part.trim();
1117
+ if (!trimmed) return trimmed;
1118
+ const segments = trimmed.split(/\s+/);
1119
+ const url = segments[0] || '';
1120
+ segments[0] = rewriteResourceUrl(url);
1121
+ return segments.join(' ');
1122
+ }).join(', ');
1123
+ return `srcset=${quote}${rewritten}${quote}`;
1124
+ }));
1125
+
1126
+ if (kind === 'html') return stripPreviewCspMeta(rewriteHtml(bodyText));
1127
+ if (kind === 'css') return rewriteCss(bodyText);
1128
+ if (kind === 'javascript') return rewriteJavaScript(bodyText);
1129
+ return bodyText;
1130
+ };
1131
+
1132
+ // Rewrite a dev server's CSP so the injected preview bridge can run via a
1133
+ // per-response nonce, while keeping the dev server's own script restrictions.
1134
+ // frame-ancestors is dropped (it blocks embedding) and require-trusted-types-for
1135
+ // is dropped (it can block the bridge's DOM use); everything else is preserved.
1136
+ export const rewritePreviewCspHeader = (cspValue, nonce) => {
1137
+ if (typeof cspValue !== 'string' || cspValue.length === 0) return cspValue;
1138
+ const nonceSource = nonce ? `'nonce-${nonce}'` : '';
1139
+ const directives = cspValue
1140
+ .split(';')
1141
+ .map((part) => part.trim())
1142
+ .filter(Boolean)
1143
+ .map((part) => {
1144
+ const tokens = part.split(/\s+/);
1145
+ return { name: (tokens[0] || '').toLowerCase(), tokens };
1146
+ })
1147
+ .filter((directive) => directive.name !== 'frame-ancestors' && directive.name !== 'require-trusted-types-for');
1148
+
1149
+ if (nonceSource) {
1150
+ const byName = new Map(directives.map((directive) => [directive.name, directive]));
1151
+ const allowNonce = (directive) => {
1152
+ // Drop a lone 'none' so the nonce takes effect, then add our nonce.
1153
+ directive.tokens = directive.tokens.filter((token) => token.toLowerCase() !== "'none'");
1154
+ if (!directive.tokens.includes(nonceSource)) directive.tokens.push(nonceSource);
1155
+ };
1156
+ const scriptElem = byName.get('script-src-elem');
1157
+ const scriptSrc = byName.get('script-src');
1158
+ if (scriptElem) allowNonce(scriptElem);
1159
+ if (scriptSrc) allowNonce(scriptSrc);
1160
+ if (!scriptElem && !scriptSrc && byName.has('default-src')) {
1161
+ const base = byName.get('default-src').tokens.slice(1).filter((token) => token.toLowerCase() !== "'none'");
1162
+ directives.push({ name: 'script-src', tokens: ['script-src', ...base, nonceSource] });
1163
+ }
1164
+ }
1165
+
1166
+ const rebuilt = directives.map((directive) => directive.tokens.join(' '));
1167
+ return rebuilt.length > 0 ? rebuilt.join('; ') : null;
1168
+ };
1169
+
1170
+ export const rewritePreviewRedirectLocation = ({ location, proxyBasePath, targetOrigin, previewToken = '', urlAuthToken = '' }) => {
1171
+ if (typeof location !== 'string' || !location) return location;
1172
+ const prefix = proxyBasePath.endsWith('/') ? proxyBasePath.slice(0, -1) : proxyBasePath;
1173
+ const target = targetOrigin ? new URL(targetOrigin) : null;
1174
+ if (!target) return location;
1175
+ try {
1176
+ const parsed = new URL(location, target);
1177
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return location;
1178
+ const host = parsed.hostname;
1179
+ const isLoopback = host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0' || host === '::1' || host === '[::1]';
1180
+ if (!isLoopback || parsed.port !== target.port) return location;
1181
+ return appendProxyAuthToProxyUrl(`${prefix}${parsed.pathname}${parsed.search}${parsed.hash}`, { previewToken, urlAuthToken });
1182
+ } catch {
1183
+ return location;
1184
+ }
1185
+ };
1186
+
1187
+ export const createPreviewProxyRuntime = ({
1188
+ crypto,
1189
+ URL,
1190
+ createProxyMiddleware,
1191
+ responseInterceptor,
1192
+ }) => {
1193
+ const targets = new Map();
1194
+ let sweepTimer = null;
1195
+
1196
+ const now = () => Date.now();
1197
+
1198
+ const sweepExpired = () => {
1199
+ const t = now();
1200
+ for (const [id, entry] of targets.entries()) {
1201
+ if (entry.expiresAt <= t) {
1202
+ targets.delete(id);
1203
+ }
1204
+ }
1205
+ };
1206
+
1207
+ const ensureSweeper = () => {
1208
+ if (sweepTimer) {
1209
+ return;
1210
+ }
1211
+ sweepTimer = setInterval(sweepExpired, 30_000);
1212
+ // Don't keep the process alive.
1213
+ sweepTimer.unref?.();
1214
+ };
1215
+
1216
+ const createTarget = (origin, ttlMs) => {
1217
+ const id = crypto.randomBytes(16).toString('hex');
1218
+ const token = crypto.randomBytes(16).toString('hex');
1219
+ const createdAt = now();
1220
+ const expiresAt = createdAt + (Number.isFinite(ttlMs) ? Math.max(15_000, Math.trunc(ttlMs)) : DEFAULT_TARGET_TTL_MS);
1221
+ targets.set(id, {
1222
+ id,
1223
+ origin,
1224
+ token,
1225
+ createdAt,
1226
+ expiresAt,
1227
+ });
1228
+ return { id, token, expiresAt };
1229
+ };
1230
+
1231
+ const resolveTargetFromRequest = (req) => {
1232
+ const rawUrl = req?.originalUrl || req?.url || '';
1233
+ const parsed = new URL(rawUrl, 'http://localhost');
1234
+ const pathname = parsed.pathname || '';
1235
+
1236
+ const match = pathname.match(/^\/api\/preview\/proxy\/([a-f0-9]{16,64})(?:\/|$)/i);
1237
+ const id = match?.[1] || '';
1238
+ if (!id) {
1239
+ return { ok: false, status: 404, code: 'missing', error: 'Preview target not found' };
1240
+ }
1241
+
1242
+ const entry = targets.get(id);
1243
+ if (!entry || entry.expiresAt <= now()) {
1244
+ targets.delete(id);
1245
+ return { ok: false, status: 404, code: 'expired', error: 'Preview target expired' };
1246
+ }
1247
+
1248
+ const cookies = parseCookieHeader(req.headers?.cookie);
1249
+ const token = parsed.searchParams.get(TOKEN_QUERY_PARAM) || cookies.get(TOKEN_COOKIE_NAME) || '';
1250
+ if (!token || token !== entry.token) {
1251
+ return { ok: false, status: 403, code: 'invalid-token', error: 'Preview token missing' };
1252
+ }
1253
+
1254
+ return { ok: true, id, entry, parsed };
1255
+ };
1256
+
1257
+ const stripProxyPrefix = (pathname, id) => {
1258
+ const prefix = `/api/preview/proxy/${id}`;
1259
+ if (!pathname.startsWith(prefix)) {
1260
+ return pathname;
1261
+ }
1262
+ const rest = pathname.slice(prefix.length);
1263
+ return rest.length === 0 ? '/' : rest;
1264
+ };
1265
+
1266
+ const removeRawQueryParam = (search, paramName) => {
1267
+ if (typeof search !== 'string' || search.length <= 1) {
1268
+ return '';
1269
+ }
1270
+ const query = search.startsWith('?') ? search.slice(1) : search;
1271
+ const parts = query.split('&').filter((part) => {
1272
+ const name = part.split('=', 1)[0] || '';
1273
+ return decodeURIComponent(name.replace(/\+/g, ' ')) !== paramName;
1274
+ });
1275
+ return parts.length > 0 ? `?${parts.join('&')}` : '';
1276
+ };
1277
+
1278
+ // Drop only CSP directives that prevent framing or the injected preview bridge.
1279
+ // Preview targets are restricted to loopback dev servers.
1280
+ const stripFrameBustingHeaders = (headers, bridgeNonce) => {
1281
+ if (!headers || typeof headers !== 'object') {
1282
+ return;
1283
+ }
1284
+
1285
+ const headerKeys = Object.keys(headers);
1286
+ for (const key of headerKeys) {
1287
+ const lowerKey = key.toLowerCase();
1288
+ if (lowerKey === 'x-frame-options') {
1289
+ delete headers[key];
1290
+ continue;
1291
+ }
1292
+ if (lowerKey === 'content-security-policy' || lowerKey === 'content-security-policy-report-only') {
1293
+ const original = headers[key];
1294
+ const values = Array.isArray(original) ? original : [original];
1295
+ const rewritten = values
1296
+ .map((value) => rewritePreviewCspHeader(value, bridgeNonce))
1297
+ .filter((value) => typeof value === 'string' && value.length > 0);
1298
+ if (rewritten.length === 0) {
1299
+ delete headers[key];
1300
+ } else {
1301
+ headers[key] = Array.isArray(original) ? rewritten : rewritten[0];
1302
+ }
1303
+ }
1304
+ }
1305
+ };
1306
+
1307
+ const attach = (app, {
1308
+ server,
1309
+ express,
1310
+ uiAuthController,
1311
+ isRequestOriginAllowed,
1312
+ rejectWebSocketUpgrade,
1313
+ }) => {
1314
+ ensureSweeper();
1315
+
1316
+ const injectPreviewBridge = (bodyText, targetOrigin, bridgeNonce) => {
1317
+ if (typeof bodyText !== 'string' || bodyText.includes(PREVIEW_BRIDGE_SCRIPT_ID)) {
1318
+ return bodyText;
1319
+ }
1320
+
1321
+ const nonceAttr = bridgeNonce ? ` nonce="${bridgeNonce}"` : '';
1322
+ const targetOriginScript = `<script${nonceAttr}>window.__pichamberPreviewTargetOrigin=${JSON.stringify(targetOrigin || '')};</script>`;
1323
+ const script = `${targetOriginScript}<script id="${PREVIEW_BRIDGE_SCRIPT_ID}"${nonceAttr}>${PREVIEW_BRIDGE_SCRIPT}</script>`;
1324
+ if (/<head(?:\s[^>]*)?>/i.test(bodyText)) {
1325
+ return bodyText.replace(/<head(\s[^>]*)?>/i, (match) => `${match}${script}`);
1326
+ }
1327
+ if (bodyText.includes('</body>')) {
1328
+ return bodyText.replace('</body>', `${script}</body>`);
1329
+ }
1330
+ return `${bodyText}${script}`;
1331
+ };
1332
+
1333
+ const rewriteViteClientHmr = (bodyText, proxyBasePath) => {
1334
+ if (typeof bodyText !== 'string' || !bodyText.includes('vite-hmr')) {
1335
+ return bodyText;
1336
+ }
1337
+
1338
+ const base = proxyBasePath.endsWith('/') ? proxyBasePath : `${proxyBasePath}/`;
1339
+ const escapedBase = JSON.stringify(base).slice(1, -1);
1340
+ return bodyText
1341
+ .replace(/const base\$1 = [^;]+;/, () => `const base$1 = ${JSON.stringify(base)};`)
1342
+ .replace(/const base = [^;]+;/, () => `const base = ${JSON.stringify(base)};`)
1343
+ .replace(/const hmrPort = [^;]+;/, () => 'const hmrPort = importMetaUrl.port;')
1344
+ .replace(/const socketHost = [^;]+;/, () => `const socketHost = \`\${importMetaUrl.hostname}\${importMetaUrl.port ? ':' + importMetaUrl.port : ''}${escapedBase}\`;`)
1345
+ .replace(/const directSocketHost = [^;]+;/, () => 'const directSocketHost = socketHost;')
1346
+ .replace(
1347
+ /const socketHost = `\$\{[^;]+?;\nconst directSocketHost = [^;]+;/s,
1348
+ () => `const socketHost = \`\${importMetaUrl.hostname}\${importMetaUrl.port ? ':' + importMetaUrl.port : ''}${escapedBase}\`;\nconst directSocketHost = socketHost;`,
1349
+ );
1350
+ };
1351
+
1352
+ app.post('/api/preview/targets', express.json(), async (req, res) => {
1353
+ try {
1354
+ if (uiAuthController?.enabled) {
1355
+ const sessionToken = await uiAuthController?.ensureSessionToken?.(req, res);
1356
+ if (!sessionToken) {
1357
+ return res.status(401).json({ error: 'UI authentication required' });
1358
+ }
1359
+
1360
+ const originAllowed = await isRequestOriginAllowed(req);
1361
+ if (!originAllowed) {
1362
+ return res.status(403).json({ error: 'Invalid origin' });
1363
+ }
1364
+ }
1365
+
1366
+ const rawUrl = typeof req.body?.url === 'string' ? req.body.url.trim() : '';
1367
+ if (!rawUrl) {
1368
+ return res.status(400).json({ error: 'url is required' });
1369
+ }
1370
+
1371
+ const ttlMs = typeof req.body?.ttlMs === 'number' ? req.body.ttlMs : DEFAULT_TARGET_TTL_MS;
1372
+ const allowExternal = req.body?.allowExternal === true;
1373
+ const normalized = allowExternal
1374
+ ? normalizeProxyTargetUrl(rawUrl, { allowExternal: true })
1375
+ : normalizeLoopbackUrl(rawUrl);
1376
+ if (!normalized.ok) {
1377
+ return res.status(400).json({ error: normalized.error });
1378
+ }
1379
+
1380
+ const target = createTarget(normalized.origin, ttlMs);
1381
+ const cookiePath = `/api/preview/proxy/${target.id}`;
1382
+ const secure = Boolean(req.secure);
1383
+ res.setHeader('Set-Cookie', buildCookie({
1384
+ name: TOKEN_COOKIE_NAME,
1385
+ value: target.token,
1386
+ path: cookiePath,
1387
+ maxAgeSeconds: Math.round((target.expiresAt - now()) / 1000),
1388
+ secure,
1389
+ }));
1390
+
1391
+ return res.json({
1392
+ id: target.id,
1393
+ proxyBasePath: cookiePath,
1394
+ previewToken: target.token,
1395
+ expiresAt: target.expiresAt,
1396
+ });
1397
+ } catch (error) {
1398
+ console.error('[preview-proxy] Failed to create target:', error);
1399
+ return res.status(500).json({ error: 'Failed to create preview target' });
1400
+ }
1401
+ });
1402
+
1403
+ const proxy = createProxyMiddleware({
1404
+ target: 'http://127.0.0.1',
1405
+ changeOrigin: true,
1406
+ ws: true,
1407
+ selfHandleResponse: true,
1408
+ // Restrict the proxy (especially its auto-attached `upgrade` listener,
1409
+ // which is registered globally on the underlying HTTP server when
1410
+ // `ws: true`) to preview paths. Without this, every WebSocket upgrade
1411
+ // on the server (e.g. `/api/terminal/ws`) gets proxied to
1412
+ // `http://127.0.0.1` and tears the socket down with ECONNREFUSED.
1413
+ //
1414
+ // We use a function so the same filter handles both cases:
1415
+ // - HTTP requests through Express, where `req.url` has been stripped
1416
+ // of the `/api/preview/proxy` mount-point, so we check `originalUrl`.
1417
+ // - Raw upgrade events from the HTTP server, where `req.url` still
1418
+ // contains the full path.
1419
+ pathFilter: (pathname, req) => {
1420
+ const target = req?.originalUrl || pathname || req?.url || '';
1421
+ return target.startsWith('/api/preview/proxy/');
1422
+ },
1423
+ router: (req) => {
1424
+ const resolved = resolveTargetFromRequest(req);
1425
+ if (!resolved.ok) {
1426
+ return 'http://127.0.0.1';
1427
+ }
1428
+ return resolved.entry.origin;
1429
+ },
1430
+ pathRewrite: (pathValue, req) => {
1431
+ const resolved = resolveTargetFromRequest(req);
1432
+ if (!resolved.ok) {
1433
+ return pathValue;
1434
+ }
1435
+
1436
+ const parsed = new URL(req.originalUrl || req.url || '', 'http://localhost');
1437
+ // Never forward our auth cookie token to the dev server.
1438
+ const strippedPath = stripProxyPrefix(parsed.pathname, resolved.id);
1439
+ const withoutReloadParam = removeRawQueryParam(parsed.search, 'ocPreview');
1440
+ const withoutPreviewToken = removeRawQueryParam(withoutReloadParam, TOKEN_QUERY_PARAM);
1441
+ const withoutClientToken = removeRawQueryParam(withoutPreviewToken, CLIENT_TOKEN_QUERY_PARAM);
1442
+ const withoutUrlAuthToken = removeRawQueryParam(withoutClientToken, URL_AUTH_TOKEN_QUERY_PARAM);
1443
+ return `${strippedPath}${withoutUrlAuthToken}`;
1444
+ },
1445
+ on: {
1446
+ proxyReq: (proxyReq, req) => {
1447
+ applyPreviewPassthroughRequestHeaders(req, proxyReq);
1448
+ // Keep local dev servers from receiving PiChamber credentials.
1449
+ proxyReq.removeHeader('cookie');
1450
+ proxyReq.removeHeader('authorization');
1451
+ proxyReq.removeHeader('x-pichamber-ui-session');
1452
+ proxyReq.setHeader('accept-encoding', 'identity');
1453
+ },
1454
+ proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
1455
+ // This header is reserved for failures produced before proxying. Do
1456
+ // not let an upstream application response impersonate that signal.
1457
+ res.removeHeader?.(PREVIEW_TARGET_ERROR_HEADER);
1458
+ applyPreviewPassthroughResponseHeaders(proxyRes, res);
1459
+ // Per-response nonce lets the injected bridge run under the dev
1460
+ // server's CSP without dropping its script restrictions wholesale.
1461
+ const bridgeNonce = crypto.randomBytes(16).toString('base64');
1462
+ // Allow the dev server response to be framed inside PiChamber even
1463
+ // if it normally sets X-Frame-Options or a CSP frame-ancestors rule.
1464
+ // The proxy is same-origin so embedding is otherwise safe.
1465
+ stripFrameBustingHeaders(proxyRes.headers, bridgeNonce);
1466
+
1467
+ const resolved = resolveTargetFromRequest(req);
1468
+ if (!resolved.ok) {
1469
+ return responseBuffer;
1470
+ }
1471
+
1472
+ const proxyBasePath = `/api/preview/proxy/${resolved.id}`;
1473
+ const urlAuthToken = resolved.parsed.searchParams.get(URL_AUTH_TOKEN_QUERY_PARAM) || '';
1474
+ if (typeof proxyRes.headers?.location === 'string') {
1475
+ proxyRes.headers.location = rewritePreviewRedirectLocation({
1476
+ location: proxyRes.headers.location,
1477
+ proxyBasePath,
1478
+ targetOrigin: resolved.entry.origin,
1479
+ previewToken: resolved.entry.token,
1480
+ urlAuthToken,
1481
+ });
1482
+ }
1483
+
1484
+ const contentType = String(proxyRes.headers?.['content-type'] || '').toLowerCase();
1485
+ const isHtml = contentType.includes('text/html');
1486
+ const isCss = contentType.includes('text/css');
1487
+ const isJavaScript = contentType.includes('javascript') || contentType.includes('ecmascript');
1488
+ if (!isHtml && !isCss && !isJavaScript) {
1489
+ return responseBuffer;
1490
+ }
1491
+
1492
+ proxyRes.headers['cache-control'] = 'no-store, no-cache, must-revalidate, proxy-revalidate';
1493
+ proxyRes.headers.pragma = 'no-cache';
1494
+ proxyRes.headers.expires = '0';
1495
+ delete proxyRes.headers.etag;
1496
+ delete proxyRes.headers['last-modified'];
1497
+
1498
+ const parsed = new URL(req.originalUrl || req.url || '', 'http://localhost');
1499
+ const upstreamPath = stripProxyPrefix(parsed.pathname, resolved.id);
1500
+ if (isJavaScript && upstreamPath === '/@vite/client') {
1501
+ return rewritePreviewBody({
1502
+ bodyText: rewriteViteClientHmr(responseBuffer.toString('utf8'), proxyBasePath),
1503
+ proxyBasePath,
1504
+ targetOrigin: resolved.entry.origin,
1505
+ kind: 'javascript',
1506
+ previewToken: resolved.entry.token,
1507
+ urlAuthToken,
1508
+ });
1509
+ }
1510
+
1511
+ const rewrittenBody = rewritePreviewBody({
1512
+ bodyText: responseBuffer.toString('utf8'),
1513
+ proxyBasePath,
1514
+ targetOrigin: resolved.entry.origin,
1515
+ kind: isHtml ? 'html' : isCss ? 'css' : 'javascript',
1516
+ previewToken: resolved.entry.token,
1517
+ urlAuthToken,
1518
+ });
1519
+ return isHtml ? injectPreviewBridge(rewrittenBody, resolved.entry.origin, bridgeNonce) : rewrittenBody;
1520
+ }),
1521
+ error: (err, _req, res) => {
1522
+ const isDev = typeof process !== 'undefined'
1523
+ && process
1524
+ && process.env
1525
+ && process.env.NODE_ENV !== 'production';
1526
+
1527
+ const message = err && typeof err === 'object' && typeof err.message === 'string'
1528
+ ? err.message
1529
+ : 'Unknown proxy error';
1530
+
1531
+ console.error('[preview-proxy] proxy error:', message);
1532
+
1533
+ if (res && !res.headersSent && typeof res.status === 'function') {
1534
+ const payload = { error: 'Preview proxy error' };
1535
+
1536
+ if (isDev) {
1537
+ try {
1538
+ const resolved = resolveTargetFromRequest(_req);
1539
+ payload.details = {
1540
+ message,
1541
+ code: err && typeof err === 'object' ? err.code : undefined,
1542
+ targetOrigin: resolved?.ok ? resolved.entry.origin : undefined,
1543
+ };
1544
+ } catch {
1545
+ payload.details = { message };
1546
+ }
1547
+ }
1548
+
1549
+ res.status(502).json(payload);
1550
+ }
1551
+ },
1552
+ },
1553
+ });
1554
+
1555
+ app.use('/api/preview/proxy', (req, res, next) => {
1556
+ const resolved = resolveTargetFromRequest(req);
1557
+ if (!resolved.ok) {
1558
+ res.setHeader(PREVIEW_TARGET_ERROR_HEADER, resolved.code);
1559
+ return res.status(resolved.status).json({ error: resolved.error });
1560
+ }
1561
+ next();
1562
+ }, proxy);
1563
+
1564
+ server.on('upgrade', (req, socket, head) => {
1565
+ const resolved = resolveTargetFromRequest(req);
1566
+ if (!resolved.ok) {
1567
+ return;
1568
+ }
1569
+
1570
+ const handleUpgrade = async () => {
1571
+ try {
1572
+ if (uiAuthController?.enabled) {
1573
+ const originAllowed = await isRequestOriginAllowed(req);
1574
+ if (!originAllowed) {
1575
+ rejectWebSocketUpgrade(socket, 403, 'Invalid origin');
1576
+ return;
1577
+ }
1578
+ }
1579
+
1580
+ // Rewrite req.url to what the dev server expects.
1581
+ const rawUrl = req.url || '';
1582
+ req.originalUrl = rawUrl;
1583
+ const parsed = new URL(rawUrl, 'http://localhost');
1584
+ const nextPath = stripProxyPrefix(parsed.pathname, resolved.id);
1585
+ parsed.searchParams.delete('ocPreview');
1586
+ parsed.searchParams.delete(TOKEN_QUERY_PARAM);
1587
+ parsed.searchParams.delete(CLIENT_TOKEN_QUERY_PARAM);
1588
+ parsed.searchParams.delete(URL_AUTH_TOKEN_QUERY_PARAM);
1589
+ const search = parsed.searchParams.toString();
1590
+ req.url = `${nextPath}${search ? `?${search}` : ''}`;
1591
+ proxy.upgrade(req, socket, head);
1592
+ } catch {
1593
+ rejectWebSocketUpgrade(socket, 500, 'Upgrade failed');
1594
+ }
1595
+ };
1596
+
1597
+ void handleUpgrade();
1598
+ });
1599
+ };
1600
+
1601
+ return {
1602
+ attach,
1603
+ };
1604
+ };