kaizenai 0.7.1 → 0.8.0

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 (949) hide show
  1. package/dist/client/assets/{FeatureOverviewPage-DGosnNE0.js → FeatureOverviewPage-BirqNTQI.js} +2 -2
  2. package/dist/client/assets/FeatureOverviewPage-BirqNTQI.js.br +0 -0
  3. package/dist/client/assets/FeatureOverviewPage-BirqNTQI.js.gz +0 -0
  4. package/dist/client/assets/LocalProjectsPage-CUrz_W-H.js +21 -0
  5. package/dist/client/assets/LocalProjectsPage-CUrz_W-H.js.br +0 -0
  6. package/dist/client/assets/LocalProjectsPage-CUrz_W-H.js.gz +0 -0
  7. package/dist/client/assets/SettingsPage-CyQ5qYJC.js +51 -0
  8. package/dist/client/assets/SettingsPage-CyQ5qYJC.js.br +0 -0
  9. package/dist/client/assets/SettingsPage-CyQ5qYJC.js.gz +0 -0
  10. package/dist/client/assets/abap-BdImnpbu.js +1 -0
  11. package/dist/client/assets/abap-BdImnpbu.js.br +0 -0
  12. package/dist/client/assets/abap-BdImnpbu.js.gz +0 -0
  13. package/dist/client/assets/actionscript-3-CoDkCxhg.js +1 -0
  14. package/dist/client/assets/actionscript-3-CoDkCxhg.js.br +0 -0
  15. package/dist/client/assets/actionscript-3-CoDkCxhg.js.gz +0 -0
  16. package/dist/client/assets/ada-bCR0ucgS.js +1 -0
  17. package/dist/client/assets/ada-bCR0ucgS.js.br +0 -0
  18. package/dist/client/assets/ada-bCR0ucgS.js.gz +0 -0
  19. package/dist/client/assets/andromeeda-C4gqWexZ.js +1 -0
  20. package/dist/client/assets/andromeeda-C4gqWexZ.js.br +0 -0
  21. package/dist/client/assets/andromeeda-C4gqWexZ.js.gz +0 -0
  22. package/dist/client/assets/angular-html-CU67Zn6k.js +1 -0
  23. package/dist/client/assets/angular-html-CU67Zn6k.js.br +0 -0
  24. package/dist/client/assets/angular-html-CU67Zn6k.js.gz +0 -0
  25. package/dist/client/assets/angular-ts-BwZT4LLn.js +1 -0
  26. package/dist/client/assets/angular-ts-BwZT4LLn.js.br +0 -0
  27. package/dist/client/assets/angular-ts-BwZT4LLn.js.gz +0 -0
  28. package/dist/client/assets/apache-Pmp26Uib.js +1 -0
  29. package/dist/client/assets/apache-Pmp26Uib.js.br +0 -0
  30. package/dist/client/assets/apache-Pmp26Uib.js.gz +0 -0
  31. package/dist/client/assets/apex-D8_7TLub.js +1 -0
  32. package/dist/client/assets/apex-D8_7TLub.js.br +0 -0
  33. package/dist/client/assets/apex-D8_7TLub.js.gz +0 -0
  34. package/dist/client/assets/apl-dKokRX4l.js +1 -0
  35. package/dist/client/assets/apl-dKokRX4l.js.br +0 -0
  36. package/dist/client/assets/apl-dKokRX4l.js.gz +0 -0
  37. package/dist/client/assets/applescript-Co6uUVPk.js +1 -0
  38. package/dist/client/assets/applescript-Co6uUVPk.js.br +0 -0
  39. package/dist/client/assets/applescript-Co6uUVPk.js.gz +0 -0
  40. package/dist/client/assets/ara-BRHolxvo.js +1 -0
  41. package/dist/client/assets/ara-BRHolxvo.js.br +0 -0
  42. package/dist/client/assets/ara-BRHolxvo.js.gz +0 -0
  43. package/dist/client/assets/asciidoc-Ve4PFQV2.js +1 -0
  44. package/dist/client/assets/asciidoc-Ve4PFQV2.js.br +0 -0
  45. package/dist/client/assets/asciidoc-Ve4PFQV2.js.gz +0 -0
  46. package/dist/client/assets/asm-D_Q5rh1f.js +1 -0
  47. package/dist/client/assets/asm-D_Q5rh1f.js.br +0 -0
  48. package/dist/client/assets/asm-D_Q5rh1f.js.gz +0 -0
  49. package/dist/client/assets/astro-CbQHKStN.js +1 -0
  50. package/dist/client/assets/astro-CbQHKStN.js.br +0 -0
  51. package/dist/client/assets/astro-CbQHKStN.js.gz +0 -0
  52. package/dist/client/assets/aurora-x-D-2ljcwZ.js +1 -0
  53. package/dist/client/assets/aurora-x-D-2ljcwZ.js.br +0 -0
  54. package/dist/client/assets/aurora-x-D-2ljcwZ.js.gz +0 -0
  55. package/dist/client/assets/awk-DMzUqQB5.js +1 -0
  56. package/dist/client/assets/awk-DMzUqQB5.js.br +0 -0
  57. package/dist/client/assets/awk-DMzUqQB5.js.gz +0 -0
  58. package/dist/client/assets/ayu-dark-DYE7WIF3.js +1 -0
  59. package/dist/client/assets/ayu-dark-DYE7WIF3.js.br +0 -0
  60. package/dist/client/assets/ayu-dark-DYE7WIF3.js.gz +0 -0
  61. package/dist/client/assets/ayu-light-BA47KaF1.js +1 -0
  62. package/dist/client/assets/ayu-light-BA47KaF1.js.br +0 -0
  63. package/dist/client/assets/ayu-light-BA47KaF1.js.gz +0 -0
  64. package/dist/client/assets/ayu-mirage-32ctXXKs.js +1 -0
  65. package/dist/client/assets/ayu-mirage-32ctXXKs.js.br +0 -0
  66. package/dist/client/assets/ayu-mirage-32ctXXKs.js.gz +0 -0
  67. package/dist/client/assets/ballerina-BFfxhgS-.js +1 -0
  68. package/dist/client/assets/ballerina-BFfxhgS-.js.br +0 -0
  69. package/dist/client/assets/ballerina-BFfxhgS-.js.gz +0 -0
  70. package/dist/client/assets/bat-BkioyH1T.js +1 -0
  71. package/dist/client/assets/bat-BkioyH1T.js.br +0 -0
  72. package/dist/client/assets/bat-BkioyH1T.js.gz +0 -0
  73. package/dist/client/assets/beancount-k_qm7-4y.js +1 -0
  74. package/dist/client/assets/beancount-k_qm7-4y.js.br +0 -0
  75. package/dist/client/assets/beancount-k_qm7-4y.js.gz +0 -0
  76. package/dist/client/assets/berry-uYugtg8r.js +1 -0
  77. package/dist/client/assets/berry-uYugtg8r.js.br +0 -0
  78. package/dist/client/assets/berry-uYugtg8r.js.gz +0 -0
  79. package/dist/client/assets/bibtex-CHM0blh-.js +1 -0
  80. package/dist/client/assets/bibtex-CHM0blh-.js.br +0 -0
  81. package/dist/client/assets/bibtex-CHM0blh-.js.gz +0 -0
  82. package/dist/client/assets/bicep-Bmn6On1c.js +1 -0
  83. package/dist/client/assets/bicep-Bmn6On1c.js.br +0 -0
  84. package/dist/client/assets/bicep-Bmn6On1c.js.gz +0 -0
  85. package/dist/client/assets/bird2-DPOp833l.js +1 -0
  86. package/dist/client/assets/bird2-DPOp833l.js.br +0 -0
  87. package/dist/client/assets/bird2-DPOp833l.js.gz +0 -0
  88. package/dist/client/assets/blade-D4QpJJKB.js +1 -0
  89. package/dist/client/assets/blade-D4QpJJKB.js.br +0 -0
  90. package/dist/client/assets/blade-D4QpJJKB.js.gz +0 -0
  91. package/dist/client/assets/bsl-BO_Y6i37.js +1 -0
  92. package/dist/client/assets/bsl-BO_Y6i37.js.br +0 -0
  93. package/dist/client/assets/bsl-BO_Y6i37.js.gz +0 -0
  94. package/dist/client/assets/c-BIGW1oBm.js +1 -0
  95. package/dist/client/assets/c-BIGW1oBm.js.br +0 -0
  96. package/dist/client/assets/c-BIGW1oBm.js.gz +0 -0
  97. package/dist/client/assets/c3-eo99z4R2.js +1 -0
  98. package/dist/client/assets/c3-eo99z4R2.js.br +0 -0
  99. package/dist/client/assets/c3-eo99z4R2.js.gz +0 -0
  100. package/dist/client/assets/cadence-Bv_4Rxtq.js +1 -0
  101. package/dist/client/assets/cadence-Bv_4Rxtq.js.br +0 -0
  102. package/dist/client/assets/cadence-Bv_4Rxtq.js.gz +0 -0
  103. package/dist/client/assets/cairo-KRGpt6FW.js +1 -0
  104. package/dist/client/assets/cairo-KRGpt6FW.js.br +0 -0
  105. package/dist/client/assets/cairo-KRGpt6FW.js.gz +0 -0
  106. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  107. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js.br +0 -0
  108. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js.gz +0 -0
  109. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  110. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js.br +0 -0
  111. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js.gz +0 -0
  112. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  113. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js.br +0 -0
  114. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js.gz +0 -0
  115. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  116. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js.br +0 -0
  117. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js.gz +0 -0
  118. package/dist/client/assets/clarity-D53aC0YG.js +1 -0
  119. package/dist/client/assets/clarity-D53aC0YG.js.br +0 -0
  120. package/dist/client/assets/clarity-D53aC0YG.js.gz +0 -0
  121. package/dist/client/assets/clojure-P80f7IUj.js +1 -0
  122. package/dist/client/assets/clojure-P80f7IUj.js.br +0 -0
  123. package/dist/client/assets/clojure-P80f7IUj.js.gz +0 -0
  124. package/dist/client/assets/cmake-D1j8_8rp.js +1 -0
  125. package/dist/client/assets/cmake-D1j8_8rp.js.br +0 -0
  126. package/dist/client/assets/cmake-D1j8_8rp.js.gz +0 -0
  127. package/dist/client/assets/cobol-nwyudZeR.js +1 -0
  128. package/dist/client/assets/cobol-nwyudZeR.js.br +0 -0
  129. package/dist/client/assets/cobol-nwyudZeR.js.gz +0 -0
  130. package/dist/client/assets/codeowners-Bp6g37R7.js +1 -0
  131. package/dist/client/assets/codeowners-Bp6g37R7.js.br +0 -0
  132. package/dist/client/assets/codeowners-Bp6g37R7.js.gz +0 -0
  133. package/dist/client/assets/codeql-DsOJ9woJ.js +1 -0
  134. package/dist/client/assets/codeql-DsOJ9woJ.js.br +0 -0
  135. package/dist/client/assets/codeql-DsOJ9woJ.js.gz +0 -0
  136. package/dist/client/assets/coffee-Ch7k5sss.js +1 -0
  137. package/dist/client/assets/coffee-Ch7k5sss.js.br +0 -0
  138. package/dist/client/assets/coffee-Ch7k5sss.js.gz +0 -0
  139. package/dist/client/assets/common-lisp-Cg-RD9OK.js +1 -0
  140. package/dist/client/assets/common-lisp-Cg-RD9OK.js.br +0 -0
  141. package/dist/client/assets/common-lisp-Cg-RD9OK.js.gz +0 -0
  142. package/dist/client/assets/coq-DkFqJrB1.js +1 -0
  143. package/dist/client/assets/coq-DkFqJrB1.js.br +0 -0
  144. package/dist/client/assets/coq-DkFqJrB1.js.gz +0 -0
  145. package/dist/client/assets/cpp-CofmeUqb.js +1 -0
  146. package/dist/client/assets/cpp-CofmeUqb.js.br +0 -0
  147. package/dist/client/assets/cpp-CofmeUqb.js.gz +0 -0
  148. package/dist/client/assets/crystal-tKQVLTB8.js +1 -0
  149. package/dist/client/assets/crystal-tKQVLTB8.js.br +0 -0
  150. package/dist/client/assets/crystal-tKQVLTB8.js.gz +0 -0
  151. package/dist/client/assets/csharp-COcwbKMJ.js +1 -0
  152. package/dist/client/assets/csharp-COcwbKMJ.js.br +0 -0
  153. package/dist/client/assets/csharp-COcwbKMJ.js.gz +0 -0
  154. package/dist/client/assets/css-DPfMkruS.js +1 -0
  155. package/dist/client/assets/css-DPfMkruS.js.br +0 -0
  156. package/dist/client/assets/css-DPfMkruS.js.gz +0 -0
  157. package/dist/client/assets/csv-fuZLfV_i.js +1 -0
  158. package/dist/client/assets/csv-fuZLfV_i.js.br +0 -0
  159. package/dist/client/assets/csv-fuZLfV_i.js.gz +0 -0
  160. package/dist/client/assets/cue-D82EKSYY.js +1 -0
  161. package/dist/client/assets/cue-D82EKSYY.js.br +0 -0
  162. package/dist/client/assets/cue-D82EKSYY.js.gz +0 -0
  163. package/dist/client/assets/cypher-COkxafJQ.js +1 -0
  164. package/dist/client/assets/cypher-COkxafJQ.js.br +0 -0
  165. package/dist/client/assets/cypher-COkxafJQ.js.gz +0 -0
  166. package/dist/client/assets/d-85-TOEBH.js +1 -0
  167. package/dist/client/assets/d-85-TOEBH.js.br +0 -0
  168. package/dist/client/assets/d-85-TOEBH.js.gz +0 -0
  169. package/dist/client/assets/dark-plus-C3mMm8J8.js +1 -0
  170. package/dist/client/assets/dark-plus-C3mMm8J8.js.br +0 -0
  171. package/dist/client/assets/dark-plus-C3mMm8J8.js.gz +0 -0
  172. package/dist/client/assets/dart-CF10PKvl.js +1 -0
  173. package/dist/client/assets/dart-CF10PKvl.js.br +0 -0
  174. package/dist/client/assets/dart-CF10PKvl.js.gz +0 -0
  175. package/dist/client/assets/dax-CEL-wOlO.js +1 -0
  176. package/dist/client/assets/dax-CEL-wOlO.js.br +0 -0
  177. package/dist/client/assets/dax-CEL-wOlO.js.gz +0 -0
  178. package/dist/client/assets/desktop-BmXAJ9_W.js +1 -0
  179. package/dist/client/assets/desktop-BmXAJ9_W.js.br +0 -0
  180. package/dist/client/assets/desktop-BmXAJ9_W.js.gz +0 -0
  181. package/dist/client/assets/diff-D97Zzqfu.js +1 -0
  182. package/dist/client/assets/diff-D97Zzqfu.js.br +0 -0
  183. package/dist/client/assets/diff-D97Zzqfu.js.gz +0 -0
  184. package/dist/client/assets/docker-BcOcwvcX.js +1 -0
  185. package/dist/client/assets/docker-BcOcwvcX.js.br +0 -0
  186. package/dist/client/assets/docker-BcOcwvcX.js.gz +0 -0
  187. package/dist/client/assets/dotenv-Da5cRb03.js +1 -0
  188. package/dist/client/assets/dotenv-Da5cRb03.js.br +5 -0
  189. package/dist/client/assets/dotenv-Da5cRb03.js.gz +0 -0
  190. package/dist/client/assets/dracula-BzJJZx-M.js +1 -0
  191. package/dist/client/assets/dracula-BzJJZx-M.js.br +0 -0
  192. package/dist/client/assets/dracula-BzJJZx-M.js.gz +0 -0
  193. package/dist/client/assets/dracula-soft-BXkSAIEj.js +1 -0
  194. package/dist/client/assets/dracula-soft-BXkSAIEj.js.br +0 -0
  195. package/dist/client/assets/dracula-soft-BXkSAIEj.js.gz +0 -0
  196. package/dist/client/assets/dream-maker-BtqSS_iP.js +1 -0
  197. package/dist/client/assets/dream-maker-BtqSS_iP.js.br +0 -0
  198. package/dist/client/assets/dream-maker-BtqSS_iP.js.gz +0 -0
  199. package/dist/client/assets/edge-BkV0erSs.js +1 -0
  200. package/dist/client/assets/edge-BkV0erSs.js.br +0 -0
  201. package/dist/client/assets/edge-BkV0erSs.js.gz +0 -0
  202. package/dist/client/assets/elixir-CDX3lj18.js +1 -0
  203. package/dist/client/assets/elixir-CDX3lj18.js.br +0 -0
  204. package/dist/client/assets/elixir-CDX3lj18.js.gz +0 -0
  205. package/dist/client/assets/elm-DbKCFpqz.js +1 -0
  206. package/dist/client/assets/elm-DbKCFpqz.js.br +0 -0
  207. package/dist/client/assets/elm-DbKCFpqz.js.gz +0 -0
  208. package/dist/client/assets/emacs-lisp-C9XAeP06.js +1 -0
  209. package/dist/client/assets/emacs-lisp-C9XAeP06.js.br +0 -0
  210. package/dist/client/assets/emacs-lisp-C9XAeP06.js.gz +0 -0
  211. package/dist/client/assets/erb-B12qg9BL.js +1 -0
  212. package/dist/client/assets/erb-B12qg9BL.js.br +0 -0
  213. package/dist/client/assets/erb-B12qg9BL.js.gz +0 -0
  214. package/dist/client/assets/erlang-DsQrWhSR.js +1 -0
  215. package/dist/client/assets/erlang-DsQrWhSR.js.br +0 -0
  216. package/dist/client/assets/erlang-DsQrWhSR.js.gz +0 -0
  217. package/dist/client/assets/everforest-dark-BgDCqdQA.js +1 -0
  218. package/dist/client/assets/everforest-dark-BgDCqdQA.js.br +0 -0
  219. package/dist/client/assets/everforest-dark-BgDCqdQA.js.gz +0 -0
  220. package/dist/client/assets/everforest-light-C8M2exoo.js +1 -0
  221. package/dist/client/assets/everforest-light-C8M2exoo.js.br +0 -0
  222. package/dist/client/assets/everforest-light-C8M2exoo.js.gz +0 -0
  223. package/dist/client/assets/eye-DDtWGlwo.js +6 -0
  224. package/dist/client/assets/eye-DDtWGlwo.js.br +0 -0
  225. package/dist/client/assets/eye-DDtWGlwo.js.gz +0 -0
  226. package/dist/client/assets/fennel-BYunw83y.js +1 -0
  227. package/dist/client/assets/fennel-BYunw83y.js.br +0 -0
  228. package/dist/client/assets/fennel-BYunw83y.js.gz +0 -0
  229. package/dist/client/assets/fish-BvzEVeQv.js +1 -0
  230. package/dist/client/assets/fish-BvzEVeQv.js.br +0 -0
  231. package/dist/client/assets/fish-BvzEVeQv.js.gz +0 -0
  232. package/dist/client/assets/fluent-C4IJs8-o.js +1 -0
  233. package/dist/client/assets/fluent-C4IJs8-o.js.br +0 -0
  234. package/dist/client/assets/fluent-C4IJs8-o.js.gz +0 -0
  235. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  236. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js.br +0 -0
  237. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js.gz +0 -0
  238. package/dist/client/assets/fortran-free-form-BxgE0vQu.js +1 -0
  239. package/dist/client/assets/fortran-free-form-BxgE0vQu.js.br +0 -0
  240. package/dist/client/assets/fortran-free-form-BxgE0vQu.js.gz +0 -0
  241. package/dist/client/assets/fsharp-CXgrBDvD.js +1 -0
  242. package/dist/client/assets/fsharp-CXgrBDvD.js.br +0 -0
  243. package/dist/client/assets/fsharp-CXgrBDvD.js.gz +0 -0
  244. package/dist/client/assets/gdresource-BOOCDP_w.js +1 -0
  245. package/dist/client/assets/gdresource-BOOCDP_w.js.br +0 -0
  246. package/dist/client/assets/gdresource-BOOCDP_w.js.gz +0 -0
  247. package/dist/client/assets/gdscript-C5YyOfLZ.js +1 -0
  248. package/dist/client/assets/gdscript-C5YyOfLZ.js.br +0 -0
  249. package/dist/client/assets/gdscript-C5YyOfLZ.js.gz +0 -0
  250. package/dist/client/assets/gdshader-DkwncUOv.js +1 -0
  251. package/dist/client/assets/gdshader-DkwncUOv.js.br +0 -0
  252. package/dist/client/assets/gdshader-DkwncUOv.js.gz +0 -0
  253. package/dist/client/assets/genie-D0YGMca9.js +1 -0
  254. package/dist/client/assets/genie-D0YGMca9.js.br +0 -0
  255. package/dist/client/assets/genie-D0YGMca9.js.gz +0 -0
  256. package/dist/client/assets/gherkin-DyxjwDmM.js +1 -0
  257. package/dist/client/assets/gherkin-DyxjwDmM.js.br +0 -0
  258. package/dist/client/assets/gherkin-DyxjwDmM.js.gz +0 -0
  259. package/dist/client/assets/git-commit-F4YmCXRG.js +1 -0
  260. package/dist/client/assets/git-commit-F4YmCXRG.js.br +0 -0
  261. package/dist/client/assets/git-commit-F4YmCXRG.js.gz +0 -0
  262. package/dist/client/assets/git-rebase-r7XF79zn.js +1 -0
  263. package/dist/client/assets/git-rebase-r7XF79zn.js.br +0 -0
  264. package/dist/client/assets/git-rebase-r7XF79zn.js.gz +0 -0
  265. package/dist/client/assets/github-dark-DHJKELXO.js +1 -0
  266. package/dist/client/assets/github-dark-DHJKELXO.js.br +0 -0
  267. package/dist/client/assets/github-dark-DHJKELXO.js.gz +0 -0
  268. package/dist/client/assets/github-dark-default-Cuk6v7N8.js +1 -0
  269. package/dist/client/assets/github-dark-default-Cuk6v7N8.js.br +0 -0
  270. package/dist/client/assets/github-dark-default-Cuk6v7N8.js.gz +0 -0
  271. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  272. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js.br +0 -0
  273. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js.gz +0 -0
  274. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  275. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js.br +0 -0
  276. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js.gz +0 -0
  277. package/dist/client/assets/github-light-DAi9KRSo.js +1 -0
  278. package/dist/client/assets/github-light-DAi9KRSo.js.br +0 -0
  279. package/dist/client/assets/github-light-DAi9KRSo.js.gz +0 -0
  280. package/dist/client/assets/github-light-default-D7oLnXFd.js +1 -0
  281. package/dist/client/assets/github-light-default-D7oLnXFd.js.br +0 -0
  282. package/dist/client/assets/github-light-default-D7oLnXFd.js.gz +0 -0
  283. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  284. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js.br +0 -0
  285. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js.gz +0 -0
  286. package/dist/client/assets/gleam-BspZqrRM.js +1 -0
  287. package/dist/client/assets/gleam-BspZqrRM.js.br +0 -0
  288. package/dist/client/assets/gleam-BspZqrRM.js.gz +0 -0
  289. package/dist/client/assets/glimmer-js-Rg0-pVw9.js +1 -0
  290. package/dist/client/assets/glimmer-js-Rg0-pVw9.js.br +0 -0
  291. package/dist/client/assets/glimmer-js-Rg0-pVw9.js.gz +0 -0
  292. package/dist/client/assets/glimmer-ts-U6CK756n.js +1 -0
  293. package/dist/client/assets/glimmer-ts-U6CK756n.js.br +0 -0
  294. package/dist/client/assets/glimmer-ts-U6CK756n.js.gz +0 -0
  295. package/dist/client/assets/glsl-DplSGwfg.js +1 -0
  296. package/dist/client/assets/glsl-DplSGwfg.js.br +0 -0
  297. package/dist/client/assets/glsl-DplSGwfg.js.gz +0 -0
  298. package/dist/client/assets/gn-n2N0HUVH.js +1 -0
  299. package/dist/client/assets/gn-n2N0HUVH.js.br +0 -0
  300. package/dist/client/assets/gn-n2N0HUVH.js.gz +0 -0
  301. package/dist/client/assets/gnuplot-DdkO51Og.js +1 -0
  302. package/dist/client/assets/gnuplot-DdkO51Og.js.br +0 -0
  303. package/dist/client/assets/gnuplot-DdkO51Og.js.gz +0 -0
  304. package/dist/client/assets/go-CxLEBnE3.js +1 -0
  305. package/dist/client/assets/go-CxLEBnE3.js.br +0 -0
  306. package/dist/client/assets/go-CxLEBnE3.js.gz +0 -0
  307. package/dist/client/assets/graphql-ChdNCCLP.js +1 -0
  308. package/dist/client/assets/graphql-ChdNCCLP.js.br +0 -0
  309. package/dist/client/assets/graphql-ChdNCCLP.js.gz +0 -0
  310. package/dist/client/assets/groovy-gcz8RCvz.js +1 -0
  311. package/dist/client/assets/groovy-gcz8RCvz.js.br +0 -0
  312. package/dist/client/assets/groovy-gcz8RCvz.js.gz +0 -0
  313. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  314. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js.br +0 -0
  315. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js.gz +0 -0
  316. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  317. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js.br +0 -0
  318. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js.gz +0 -0
  319. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  320. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js.br +0 -0
  321. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js.gz +0 -0
  322. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  323. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js.br +0 -0
  324. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js.gz +0 -0
  325. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  326. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js.br +0 -0
  327. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js.gz +0 -0
  328. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  329. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js.br +0 -0
  330. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js.gz +0 -0
  331. package/dist/client/assets/hack-CaT9iCJl.js +1 -0
  332. package/dist/client/assets/hack-CaT9iCJl.js.br +0 -0
  333. package/dist/client/assets/hack-CaT9iCJl.js.gz +0 -0
  334. package/dist/client/assets/haml-B8DHNrY2.js +1 -0
  335. package/dist/client/assets/haml-B8DHNrY2.js.br +0 -0
  336. package/dist/client/assets/haml-B8DHNrY2.js.gz +0 -0
  337. package/dist/client/assets/handlebars-BL8al0AC.js +1 -0
  338. package/dist/client/assets/handlebars-BL8al0AC.js.br +0 -0
  339. package/dist/client/assets/handlebars-BL8al0AC.js.gz +0 -0
  340. package/dist/client/assets/haskell-Df6bDoY_.js +1 -0
  341. package/dist/client/assets/haskell-Df6bDoY_.js.br +0 -0
  342. package/dist/client/assets/haskell-Df6bDoY_.js.gz +0 -0
  343. package/dist/client/assets/haxe-CzTSHFRz.js +1 -0
  344. package/dist/client/assets/haxe-CzTSHFRz.js.br +0 -0
  345. package/dist/client/assets/haxe-CzTSHFRz.js.gz +0 -0
  346. package/dist/client/assets/hcl-BWvSN4gD.js +1 -0
  347. package/dist/client/assets/hcl-BWvSN4gD.js.br +0 -0
  348. package/dist/client/assets/hcl-BWvSN4gD.js.gz +0 -0
  349. package/dist/client/assets/hjson-D5-asLiD.js +1 -0
  350. package/dist/client/assets/hjson-D5-asLiD.js.br +0 -0
  351. package/dist/client/assets/hjson-D5-asLiD.js.gz +0 -0
  352. package/dist/client/assets/hlsl-D3lLCCz7.js +1 -0
  353. package/dist/client/assets/hlsl-D3lLCCz7.js.br +0 -0
  354. package/dist/client/assets/hlsl-D3lLCCz7.js.gz +0 -0
  355. package/dist/client/assets/horizon-BUw7H-hv.js +1 -0
  356. package/dist/client/assets/horizon-BUw7H-hv.js.br +0 -0
  357. package/dist/client/assets/horizon-BUw7H-hv.js.gz +0 -0
  358. package/dist/client/assets/horizon-bright-Cn-bp-IR.js +1 -0
  359. package/dist/client/assets/horizon-bright-Cn-bp-IR.js.br +0 -0
  360. package/dist/client/assets/horizon-bright-Cn-bp-IR.js.gz +0 -0
  361. package/dist/client/assets/houston-DnULxvSX.js +1 -0
  362. package/dist/client/assets/houston-DnULxvSX.js.br +0 -0
  363. package/dist/client/assets/houston-DnULxvSX.js.gz +0 -0
  364. package/dist/client/assets/html-GMplVEZG.js +1 -0
  365. package/dist/client/assets/html-GMplVEZG.js.br +0 -0
  366. package/dist/client/assets/html-GMplVEZG.js.gz +0 -0
  367. package/dist/client/assets/html-derivative-BFtXZ54Q.js +1 -0
  368. package/dist/client/assets/html-derivative-BFtXZ54Q.js.br +0 -0
  369. package/dist/client/assets/html-derivative-BFtXZ54Q.js.gz +0 -0
  370. package/dist/client/assets/http-jrhK8wxY.js +1 -0
  371. package/dist/client/assets/http-jrhK8wxY.js.br +0 -0
  372. package/dist/client/assets/http-jrhK8wxY.js.gz +0 -0
  373. package/dist/client/assets/hurl-irOxFIW8.js +1 -0
  374. package/dist/client/assets/hurl-irOxFIW8.js.br +0 -0
  375. package/dist/client/assets/hurl-irOxFIW8.js.gz +0 -0
  376. package/dist/client/assets/hxml-Bvhsp5Yf.js +1 -0
  377. package/dist/client/assets/hxml-Bvhsp5Yf.js.br +0 -0
  378. package/dist/client/assets/hxml-Bvhsp5Yf.js.gz +0 -0
  379. package/dist/client/assets/hy-DFXneXwc.js +1 -0
  380. package/dist/client/assets/hy-DFXneXwc.js.br +0 -0
  381. package/dist/client/assets/hy-DFXneXwc.js.gz +0 -0
  382. package/dist/client/assets/imba-DGztddWO.js +1 -0
  383. package/dist/client/assets/imba-DGztddWO.js.br +0 -0
  384. package/dist/client/assets/imba-DGztddWO.js.gz +0 -0
  385. package/dist/client/assets/index-69d3sQK6.css +32 -0
  386. package/dist/client/assets/index-69d3sQK6.css.br +0 -0
  387. package/dist/client/assets/index-69d3sQK6.css.gz +0 -0
  388. package/dist/client/assets/index-BAzvPbMu.js +2500 -0
  389. package/dist/client/assets/index-BAzvPbMu.js.br +0 -0
  390. package/dist/client/assets/index-BAzvPbMu.js.gz +0 -0
  391. package/dist/client/assets/ini-BEwlwnbL.js +1 -0
  392. package/dist/client/assets/ini-BEwlwnbL.js.br +0 -0
  393. package/dist/client/assets/ini-BEwlwnbL.js.gz +0 -0
  394. package/dist/client/assets/java-CylS5w8V.js +1 -0
  395. package/dist/client/assets/java-CylS5w8V.js.br +0 -0
  396. package/dist/client/assets/java-CylS5w8V.js.gz +0 -0
  397. package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
  398. package/dist/client/assets/javascript-wDzz0qaB.js.br +0 -0
  399. package/dist/client/assets/javascript-wDzz0qaB.js.gz +0 -0
  400. package/dist/client/assets/jinja-4LBKfQ-Z.js +1 -0
  401. package/dist/client/assets/jinja-4LBKfQ-Z.js.br +0 -0
  402. package/dist/client/assets/jinja-4LBKfQ-Z.js.gz +0 -0
  403. package/dist/client/assets/jison-wvAkD_A8.js +1 -0
  404. package/dist/client/assets/jison-wvAkD_A8.js.br +0 -0
  405. package/dist/client/assets/jison-wvAkD_A8.js.gz +0 -0
  406. package/dist/client/assets/json-Cp-IABpG.js +1 -0
  407. package/dist/client/assets/json-Cp-IABpG.js.br +0 -0
  408. package/dist/client/assets/json-Cp-IABpG.js.gz +0 -0
  409. package/dist/client/assets/json5-C9tS-k6U.js +1 -0
  410. package/dist/client/assets/json5-C9tS-k6U.js.br +0 -0
  411. package/dist/client/assets/json5-C9tS-k6U.js.gz +0 -0
  412. package/dist/client/assets/jsonc-Des-eS-w.js +1 -0
  413. package/dist/client/assets/jsonc-Des-eS-w.js.br +0 -0
  414. package/dist/client/assets/jsonc-Des-eS-w.js.gz +0 -0
  415. package/dist/client/assets/jsonl-DcaNXYhu.js +1 -0
  416. package/dist/client/assets/jsonl-DcaNXYhu.js.br +0 -0
  417. package/dist/client/assets/jsonl-DcaNXYhu.js.gz +0 -0
  418. package/dist/client/assets/jsonnet-DFQXde-d.js +1 -0
  419. package/dist/client/assets/jsonnet-DFQXde-d.js.br +0 -0
  420. package/dist/client/assets/jsonnet-DFQXde-d.js.gz +0 -0
  421. package/dist/client/assets/jssm-C2t-YnRu.js +1 -0
  422. package/dist/client/assets/jssm-C2t-YnRu.js.br +0 -0
  423. package/dist/client/assets/jssm-C2t-YnRu.js.gz +0 -0
  424. package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
  425. package/dist/client/assets/jsx-g9-lgVsj.js.br +0 -0
  426. package/dist/client/assets/jsx-g9-lgVsj.js.gz +0 -0
  427. package/dist/client/assets/julia-CxzCAyBv.js +1 -0
  428. package/dist/client/assets/julia-CxzCAyBv.js.br +0 -0
  429. package/dist/client/assets/julia-CxzCAyBv.js.gz +0 -0
  430. package/dist/client/assets/just-Cw27pwNe.js +1 -0
  431. package/dist/client/assets/just-Cw27pwNe.js.br +0 -0
  432. package/dist/client/assets/just-Cw27pwNe.js.gz +0 -0
  433. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  434. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js.br +0 -0
  435. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js.gz +0 -0
  436. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  437. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js.br +0 -0
  438. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js.gz +0 -0
  439. package/dist/client/assets/kanagawa-wave-DWedfzmr.js +1 -0
  440. package/dist/client/assets/kanagawa-wave-DWedfzmr.js.br +0 -0
  441. package/dist/client/assets/kanagawa-wave-DWedfzmr.js.gz +0 -0
  442. package/dist/client/assets/kdl-DV7GczEv.js +1 -0
  443. package/dist/client/assets/kdl-DV7GczEv.js.br +0 -0
  444. package/dist/client/assets/kdl-DV7GczEv.js.gz +0 -0
  445. package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
  446. package/dist/client/assets/kotlin-BdnUsdx6.js.br +0 -0
  447. package/dist/client/assets/kotlin-BdnUsdx6.js.gz +0 -0
  448. package/dist/client/assets/kusto-DZf3V79B.js +1 -0
  449. package/dist/client/assets/kusto-DZf3V79B.js.br +0 -0
  450. package/dist/client/assets/kusto-DZf3V79B.js.gz +0 -0
  451. package/dist/client/assets/laserwave-DUszq2jm.js +1 -0
  452. package/dist/client/assets/laserwave-DUszq2jm.js.br +0 -0
  453. package/dist/client/assets/laserwave-DUszq2jm.js.gz +0 -0
  454. package/dist/client/assets/latex-CWtU0Tv5.js +1 -0
  455. package/dist/client/assets/latex-CWtU0Tv5.js.br +0 -0
  456. package/dist/client/assets/latex-CWtU0Tv5.js.gz +0 -0
  457. package/dist/client/assets/lean-BZvkOJ9d.js +1 -0
  458. package/dist/client/assets/lean-BZvkOJ9d.js.br +0 -0
  459. package/dist/client/assets/lean-BZvkOJ9d.js.gz +0 -0
  460. package/dist/client/assets/less-B1dDrJ26.js +1 -0
  461. package/dist/client/assets/less-B1dDrJ26.js.br +0 -0
  462. package/dist/client/assets/less-B1dDrJ26.js.gz +0 -0
  463. package/dist/client/assets/light-plus-B7mTdjB0.js +1 -0
  464. package/dist/client/assets/light-plus-B7mTdjB0.js.br +0 -0
  465. package/dist/client/assets/light-plus-B7mTdjB0.js.gz +0 -0
  466. package/dist/client/assets/liquid-DYVedYrR.js +1 -0
  467. package/dist/client/assets/liquid-DYVedYrR.js.br +0 -0
  468. package/dist/client/assets/liquid-DYVedYrR.js.gz +0 -0
  469. package/dist/client/assets/llvm-DjAJT7YJ.js +1 -0
  470. package/dist/client/assets/llvm-DjAJT7YJ.js.br +0 -0
  471. package/dist/client/assets/llvm-DjAJT7YJ.js.gz +0 -0
  472. package/dist/client/assets/log-2UxHyX5q.js +1 -0
  473. package/dist/client/assets/log-2UxHyX5q.js.br +0 -0
  474. package/dist/client/assets/log-2UxHyX5q.js.gz +0 -0
  475. package/dist/client/assets/logo-BtOb2qkB.js +1 -0
  476. package/dist/client/assets/logo-BtOb2qkB.js.br +0 -0
  477. package/dist/client/assets/logo-BtOb2qkB.js.gz +0 -0
  478. package/dist/client/assets/lua-BaeVxFsk.js +1 -0
  479. package/dist/client/assets/lua-BaeVxFsk.js.br +0 -0
  480. package/dist/client/assets/lua-BaeVxFsk.js.gz +0 -0
  481. package/dist/client/assets/luau-C-HG3fhB.js +1 -0
  482. package/dist/client/assets/luau-C-HG3fhB.js.br +0 -0
  483. package/dist/client/assets/luau-C-HG3fhB.js.gz +0 -0
  484. package/dist/client/assets/make-CHLpvVh8.js +1 -0
  485. package/dist/client/assets/make-CHLpvVh8.js.br +0 -0
  486. package/dist/client/assets/make-CHLpvVh8.js.gz +0 -0
  487. package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
  488. package/dist/client/assets/markdown-Cvjx9yec.js.br +0 -0
  489. package/dist/client/assets/markdown-Cvjx9yec.js.gz +0 -0
  490. package/dist/client/assets/marko-CnJfTvn9.js +1 -0
  491. package/dist/client/assets/marko-CnJfTvn9.js.br +0 -0
  492. package/dist/client/assets/marko-CnJfTvn9.js.gz +0 -0
  493. package/dist/client/assets/material-theme-D5KoaKCx.js +1 -0
  494. package/dist/client/assets/material-theme-D5KoaKCx.js.br +0 -0
  495. package/dist/client/assets/material-theme-D5KoaKCx.js.gz +0 -0
  496. package/dist/client/assets/material-theme-darker-BfHTSMKl.js +1 -0
  497. package/dist/client/assets/material-theme-darker-BfHTSMKl.js.br +0 -0
  498. package/dist/client/assets/material-theme-darker-BfHTSMKl.js.gz +0 -0
  499. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  500. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js.br +0 -0
  501. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js.gz +0 -0
  502. package/dist/client/assets/material-theme-ocean-CyktbL80.js +1 -0
  503. package/dist/client/assets/material-theme-ocean-CyktbL80.js.br +0 -0
  504. package/dist/client/assets/material-theme-ocean-CyktbL80.js.gz +0 -0
  505. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  506. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js.br +0 -0
  507. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js.gz +0 -0
  508. package/dist/client/assets/matlab-D7o27uSR.js +1 -0
  509. package/dist/client/assets/matlab-D7o27uSR.js.br +0 -0
  510. package/dist/client/assets/matlab-D7o27uSR.js.gz +0 -0
  511. package/dist/client/assets/mdc-BMNejdWA.js +1 -0
  512. package/dist/client/assets/mdc-BMNejdWA.js.br +0 -0
  513. package/dist/client/assets/mdc-BMNejdWA.js.gz +0 -0
  514. package/dist/client/assets/mdx-Cmh6b_Ma.js +1 -0
  515. package/dist/client/assets/mdx-Cmh6b_Ma.js.br +0 -0
  516. package/dist/client/assets/mdx-Cmh6b_Ma.js.gz +0 -0
  517. package/dist/client/assets/mermaid-mWjccvbQ.js +1 -0
  518. package/dist/client/assets/mermaid-mWjccvbQ.js.br +0 -0
  519. package/dist/client/assets/mermaid-mWjccvbQ.js.gz +0 -0
  520. package/dist/client/assets/min-dark-CafNBF8u.js +1 -0
  521. package/dist/client/assets/min-dark-CafNBF8u.js.br +0 -0
  522. package/dist/client/assets/min-dark-CafNBF8u.js.gz +0 -0
  523. package/dist/client/assets/min-light-CTRr51gU.js +1 -0
  524. package/dist/client/assets/min-light-CTRr51gU.js.br +0 -0
  525. package/dist/client/assets/min-light-CTRr51gU.js.gz +0 -0
  526. package/dist/client/assets/mipsasm-CKIfxQSi.js +1 -0
  527. package/dist/client/assets/mipsasm-CKIfxQSi.js.br +0 -0
  528. package/dist/client/assets/mipsasm-CKIfxQSi.js.gz +0 -0
  529. package/dist/client/assets/mojo-rZm6bMo-.js +1 -0
  530. package/dist/client/assets/mojo-rZm6bMo-.js.br +0 -0
  531. package/dist/client/assets/mojo-rZm6bMo-.js.gz +0 -0
  532. package/dist/client/assets/monokai-D4h5O-jR.js +1 -0
  533. package/dist/client/assets/monokai-D4h5O-jR.js.br +0 -0
  534. package/dist/client/assets/monokai-D4h5O-jR.js.gz +0 -0
  535. package/dist/client/assets/moonbit-_H4v1dQx.js +1 -0
  536. package/dist/client/assets/moonbit-_H4v1dQx.js.br +0 -0
  537. package/dist/client/assets/moonbit-_H4v1dQx.js.gz +0 -0
  538. package/dist/client/assets/move-IF9eRakj.js +1 -0
  539. package/dist/client/assets/move-IF9eRakj.js.br +0 -0
  540. package/dist/client/assets/move-IF9eRakj.js.gz +0 -0
  541. package/dist/client/assets/narrat-DRg8JJMk.js +1 -0
  542. package/dist/client/assets/narrat-DRg8JJMk.js.br +0 -0
  543. package/dist/client/assets/narrat-DRg8JJMk.js.gz +0 -0
  544. package/dist/client/assets/nextflow-Zz6hmt5N.js +1 -0
  545. package/dist/client/assets/nextflow-Zz6hmt5N.js.br +0 -0
  546. package/dist/client/assets/nextflow-Zz6hmt5N.js.gz +0 -0
  547. package/dist/client/assets/nextflow-groovy-BeH2EWoN.js +1 -0
  548. package/dist/client/assets/nextflow-groovy-BeH2EWoN.js.br +0 -0
  549. package/dist/client/assets/nextflow-groovy-BeH2EWoN.js.gz +0 -0
  550. package/dist/client/assets/nginx-BpAMiNFr.js +1 -0
  551. package/dist/client/assets/nginx-BpAMiNFr.js.br +0 -0
  552. package/dist/client/assets/nginx-BpAMiNFr.js.gz +0 -0
  553. package/dist/client/assets/night-owl-C39BiMTA.js +1 -0
  554. package/dist/client/assets/night-owl-C39BiMTA.js.br +0 -0
  555. package/dist/client/assets/night-owl-C39BiMTA.js.gz +0 -0
  556. package/dist/client/assets/night-owl-light-CMTm3GFP.js +1 -0
  557. package/dist/client/assets/night-owl-light-CMTm3GFP.js.br +0 -0
  558. package/dist/client/assets/night-owl-light-CMTm3GFP.js.gz +0 -0
  559. package/dist/client/assets/nim-CVrawwO9.js +1 -0
  560. package/dist/client/assets/nim-CVrawwO9.js.br +0 -0
  561. package/dist/client/assets/nim-CVrawwO9.js.gz +0 -0
  562. package/dist/client/assets/nix-CwoSXNpI.js +1 -0
  563. package/dist/client/assets/nix-CwoSXNpI.js.br +0 -0
  564. package/dist/client/assets/nix-CwoSXNpI.js.gz +0 -0
  565. package/dist/client/assets/nord-Ddv68eIx.js +1 -0
  566. package/dist/client/assets/nord-Ddv68eIx.js.br +0 -0
  567. package/dist/client/assets/nord-Ddv68eIx.js.gz +0 -0
  568. package/dist/client/assets/nushell-Cz2AlsmD.js +1 -0
  569. package/dist/client/assets/nushell-Cz2AlsmD.js.br +0 -0
  570. package/dist/client/assets/nushell-Cz2AlsmD.js.gz +0 -0
  571. package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
  572. package/dist/client/assets/objective-c-DXmwc3jG.js.br +0 -0
  573. package/dist/client/assets/objective-c-DXmwc3jG.js.gz +0 -0
  574. package/dist/client/assets/objective-cpp-CLxacb5B.js +1 -0
  575. package/dist/client/assets/objective-cpp-CLxacb5B.js.br +0 -0
  576. package/dist/client/assets/objective-cpp-CLxacb5B.js.gz +0 -0
  577. package/dist/client/assets/ocaml-C0hk2d4L.js +1 -0
  578. package/dist/client/assets/ocaml-C0hk2d4L.js.br +0 -0
  579. package/dist/client/assets/ocaml-C0hk2d4L.js.gz +0 -0
  580. package/dist/client/assets/odin-BBf5iR-q.js +1 -0
  581. package/dist/client/assets/odin-BBf5iR-q.js.br +0 -0
  582. package/dist/client/assets/odin-BBf5iR-q.js.gz +0 -0
  583. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  584. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js.br +0 -0
  585. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js.gz +0 -0
  586. package/dist/client/assets/one-light-C3Wv6jpd.js +1 -0
  587. package/dist/client/assets/one-light-C3Wv6jpd.js.br +0 -0
  588. package/dist/client/assets/one-light-C3Wv6jpd.js.gz +0 -0
  589. package/dist/client/assets/openscad-C4EeE6gA.js +1 -0
  590. package/dist/client/assets/openscad-C4EeE6gA.js.br +0 -0
  591. package/dist/client/assets/openscad-C4EeE6gA.js.gz +0 -0
  592. package/dist/client/assets/pascal-D93ZcfNL.js +1 -0
  593. package/dist/client/assets/pascal-D93ZcfNL.js.br +0 -0
  594. package/dist/client/assets/pascal-D93ZcfNL.js.gz +0 -0
  595. package/dist/client/assets/perl-C0TMdlhV.js +1 -0
  596. package/dist/client/assets/perl-C0TMdlhV.js.br +0 -0
  597. package/dist/client/assets/perl-C0TMdlhV.js.gz +0 -0
  598. package/dist/client/assets/php-Dhbhpdrm.js +1 -0
  599. package/dist/client/assets/php-Dhbhpdrm.js.br +0 -0
  600. package/dist/client/assets/php-Dhbhpdrm.js.gz +0 -0
  601. package/dist/client/assets/pierre-dark-DF2SEV7i.js +1 -0
  602. package/dist/client/assets/pierre-dark-DF2SEV7i.js.br +0 -0
  603. package/dist/client/assets/pierre-dark-DF2SEV7i.js.gz +0 -0
  604. package/dist/client/assets/pierre-light-DOlZxES8.js +1 -0
  605. package/dist/client/assets/pierre-light-DOlZxES8.js.br +0 -0
  606. package/dist/client/assets/pierre-light-DOlZxES8.js.gz +0 -0
  607. package/dist/client/assets/pkl-u5AG7uiY.js +1 -0
  608. package/dist/client/assets/pkl-u5AG7uiY.js.br +0 -0
  609. package/dist/client/assets/pkl-u5AG7uiY.js.gz +0 -0
  610. package/dist/client/assets/plastic-3e1v2bzS.js +1 -0
  611. package/dist/client/assets/plastic-3e1v2bzS.js.br +0 -0
  612. package/dist/client/assets/plastic-3e1v2bzS.js.gz +0 -0
  613. package/dist/client/assets/plsql-ChMvpjG-.js +1 -0
  614. package/dist/client/assets/plsql-ChMvpjG-.js.br +0 -0
  615. package/dist/client/assets/plsql-ChMvpjG-.js.gz +0 -0
  616. package/dist/client/assets/po-BTJTHyun.js +1 -0
  617. package/dist/client/assets/po-BTJTHyun.js.br +0 -0
  618. package/dist/client/assets/po-BTJTHyun.js.gz +0 -0
  619. package/dist/client/assets/poimandres-CS3Unz2-.js +1 -0
  620. package/dist/client/assets/poimandres-CS3Unz2-.js.br +0 -0
  621. package/dist/client/assets/poimandres-CS3Unz2-.js.gz +0 -0
  622. package/dist/client/assets/polar-C0HS_06l.js +1 -0
  623. package/dist/client/assets/polar-C0HS_06l.js.br +0 -0
  624. package/dist/client/assets/polar-C0HS_06l.js.gz +0 -0
  625. package/dist/client/assets/postcss-CXtECtnM.js +1 -0
  626. package/dist/client/assets/postcss-CXtECtnM.js.br +0 -0
  627. package/dist/client/assets/postcss-CXtECtnM.js.gz +0 -0
  628. package/dist/client/assets/powerquery-CEu0bR-o.js +1 -0
  629. package/dist/client/assets/powerquery-CEu0bR-o.js.br +0 -0
  630. package/dist/client/assets/powerquery-CEu0bR-o.js.gz +0 -0
  631. package/dist/client/assets/powershell-Dpen1YoG.js +1 -0
  632. package/dist/client/assets/powershell-Dpen1YoG.js.br +0 -0
  633. package/dist/client/assets/powershell-Dpen1YoG.js.gz +0 -0
  634. package/dist/client/assets/prisma-Dd19v3D-.js +1 -0
  635. package/dist/client/assets/prisma-Dd19v3D-.js.br +0 -0
  636. package/dist/client/assets/prisma-Dd19v3D-.js.gz +0 -0
  637. package/dist/client/assets/prolog-CbFg5uaA.js +1 -0
  638. package/dist/client/assets/prolog-CbFg5uaA.js.br +0 -0
  639. package/dist/client/assets/prolog-CbFg5uaA.js.gz +0 -0
  640. package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
  641. package/dist/client/assets/proto-C7zT0LnQ.js.br +0 -0
  642. package/dist/client/assets/proto-C7zT0LnQ.js.gz +0 -0
  643. package/dist/client/assets/pug-CGlum2m_.js +1 -0
  644. package/dist/client/assets/pug-CGlum2m_.js.br +0 -0
  645. package/dist/client/assets/pug-CGlum2m_.js.gz +0 -0
  646. package/dist/client/assets/puppet-BMWR74SV.js +1 -0
  647. package/dist/client/assets/puppet-BMWR74SV.js.br +0 -0
  648. package/dist/client/assets/puppet-BMWR74SV.js.gz +0 -0
  649. package/dist/client/assets/purescript-CklMAg4u.js +1 -0
  650. package/dist/client/assets/purescript-CklMAg4u.js.br +0 -0
  651. package/dist/client/assets/purescript-CklMAg4u.js.gz +0 -0
  652. package/dist/client/assets/python-B6aJPvgy.js +1 -0
  653. package/dist/client/assets/python-B6aJPvgy.js.br +0 -0
  654. package/dist/client/assets/python-B6aJPvgy.js.gz +0 -0
  655. package/dist/client/assets/qml-3beO22l8.js +1 -0
  656. package/dist/client/assets/qml-3beO22l8.js.br +0 -0
  657. package/dist/client/assets/qml-3beO22l8.js.gz +0 -0
  658. package/dist/client/assets/qmldir-C8lEn-DE.js +1 -0
  659. package/dist/client/assets/qmldir-C8lEn-DE.js.br +0 -0
  660. package/dist/client/assets/qmldir-C8lEn-DE.js.gz +0 -0
  661. package/dist/client/assets/qss-IeuSbFQv.js +1 -0
  662. package/dist/client/assets/qss-IeuSbFQv.js.br +0 -0
  663. package/dist/client/assets/qss-IeuSbFQv.js.gz +0 -0
  664. package/dist/client/assets/r-Dspwwk_N.js +1 -0
  665. package/dist/client/assets/r-Dspwwk_N.js.br +0 -0
  666. package/dist/client/assets/r-Dspwwk_N.js.gz +0 -0
  667. package/dist/client/assets/racket-BqYA7rlc.js +1 -0
  668. package/dist/client/assets/racket-BqYA7rlc.js.br +0 -0
  669. package/dist/client/assets/racket-BqYA7rlc.js.gz +0 -0
  670. package/dist/client/assets/raku-DXvB9xmW.js +1 -0
  671. package/dist/client/assets/raku-DXvB9xmW.js.br +0 -0
  672. package/dist/client/assets/raku-DXvB9xmW.js.gz +0 -0
  673. package/dist/client/assets/razor-Uh8Bk_45.js +1 -0
  674. package/dist/client/assets/razor-Uh8Bk_45.js.br +0 -0
  675. package/dist/client/assets/razor-Uh8Bk_45.js.gz +0 -0
  676. package/dist/client/assets/red-bN70gL4F.js +1 -0
  677. package/dist/client/assets/red-bN70gL4F.js.br +0 -0
  678. package/dist/client/assets/red-bN70gL4F.js.gz +0 -0
  679. package/dist/client/assets/reg-C-SQnVFl.js +1 -0
  680. package/dist/client/assets/reg-C-SQnVFl.js.br +0 -0
  681. package/dist/client/assets/reg-C-SQnVFl.js.gz +0 -0
  682. package/dist/client/assets/regexp-CDVJQ6XC.js +1 -0
  683. package/dist/client/assets/regexp-CDVJQ6XC.js.br +0 -0
  684. package/dist/client/assets/regexp-CDVJQ6XC.js.gz +0 -0
  685. package/dist/client/assets/rel-C3B-1QV4.js +1 -0
  686. package/dist/client/assets/rel-C3B-1QV4.js.br +0 -0
  687. package/dist/client/assets/rel-C3B-1QV4.js.gz +0 -0
  688. package/dist/client/assets/riscv-BM1_JUlF.js +1 -0
  689. package/dist/client/assets/riscv-BM1_JUlF.js.br +0 -0
  690. package/dist/client/assets/riscv-BM1_JUlF.js.gz +0 -0
  691. package/dist/client/assets/ron-D8l8udqQ.js +1 -0
  692. package/dist/client/assets/ron-D8l8udqQ.js.br +0 -0
  693. package/dist/client/assets/ron-D8l8udqQ.js.gz +0 -0
  694. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  695. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js.br +0 -0
  696. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js.gz +0 -0
  697. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  698. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js.br +0 -0
  699. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js.gz +0 -0
  700. package/dist/client/assets/rose-pine-qdsjHGoJ.js +1 -0
  701. package/dist/client/assets/rose-pine-qdsjHGoJ.js.br +0 -0
  702. package/dist/client/assets/rose-pine-qdsjHGoJ.js.gz +0 -0
  703. package/dist/client/assets/rosmsg-BJDFO7_C.js +1 -0
  704. package/dist/client/assets/rosmsg-BJDFO7_C.js.br +0 -0
  705. package/dist/client/assets/rosmsg-BJDFO7_C.js.gz +0 -0
  706. package/dist/client/assets/rst-BrH8l1NY.js +1 -0
  707. package/dist/client/assets/rst-BrH8l1NY.js.br +0 -0
  708. package/dist/client/assets/rst-BrH8l1NY.js.gz +0 -0
  709. package/dist/client/assets/ruby-Dw2BHqvy.js +1 -0
  710. package/dist/client/assets/ruby-Dw2BHqvy.js.br +0 -0
  711. package/dist/client/assets/ruby-Dw2BHqvy.js.gz +0 -0
  712. package/dist/client/assets/rust-B1yitclQ.js +1 -0
  713. package/dist/client/assets/rust-B1yitclQ.js.br +0 -0
  714. package/dist/client/assets/rust-B1yitclQ.js.gz +0 -0
  715. package/dist/client/assets/sas-cz2c8ADy.js +1 -0
  716. package/dist/client/assets/sas-cz2c8ADy.js.br +0 -0
  717. package/dist/client/assets/sas-cz2c8ADy.js.gz +0 -0
  718. package/dist/client/assets/sass-Cj5Yp3dK.js +1 -0
  719. package/dist/client/assets/sass-Cj5Yp3dK.js.br +0 -0
  720. package/dist/client/assets/sass-Cj5Yp3dK.js.gz +0 -0
  721. package/dist/client/assets/scala-C151Ov-r.js +1 -0
  722. package/dist/client/assets/scala-C151Ov-r.js.br +0 -0
  723. package/dist/client/assets/scala-C151Ov-r.js.gz +0 -0
  724. package/dist/client/assets/scheme-C98Dy4si.js +1 -0
  725. package/dist/client/assets/scheme-C98Dy4si.js.br +0 -0
  726. package/dist/client/assets/scheme-C98Dy4si.js.gz +0 -0
  727. package/dist/client/assets/scss-OYdSNvt2.js +1 -0
  728. package/dist/client/assets/scss-OYdSNvt2.js.br +0 -0
  729. package/dist/client/assets/scss-OYdSNvt2.js.gz +0 -0
  730. package/dist/client/assets/sdbl-DVxCFoDh.js +1 -0
  731. package/dist/client/assets/sdbl-DVxCFoDh.js.br +0 -0
  732. package/dist/client/assets/sdbl-DVxCFoDh.js.gz +0 -0
  733. package/dist/client/assets/shaderlab-Dg9Lc6iA.js +1 -0
  734. package/dist/client/assets/shaderlab-Dg9Lc6iA.js.br +0 -0
  735. package/dist/client/assets/shaderlab-Dg9Lc6iA.js.gz +0 -0
  736. package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
  737. package/dist/client/assets/shellscript-Yzrsuije.js.br +0 -0
  738. package/dist/client/assets/shellscript-Yzrsuije.js.gz +0 -0
  739. package/dist/client/assets/shellsession-BADoaaVG.js +1 -0
  740. package/dist/client/assets/shellsession-BADoaaVG.js.br +0 -0
  741. package/dist/client/assets/shellsession-BADoaaVG.js.gz +0 -0
  742. package/dist/client/assets/slack-dark-BthQWCQV.js +1 -0
  743. package/dist/client/assets/slack-dark-BthQWCQV.js.br +0 -0
  744. package/dist/client/assets/slack-dark-BthQWCQV.js.gz +0 -0
  745. package/dist/client/assets/slack-ochin-DqwNpetd.js +1 -0
  746. package/dist/client/assets/slack-ochin-DqwNpetd.js.br +0 -0
  747. package/dist/client/assets/slack-ochin-DqwNpetd.js.gz +0 -0
  748. package/dist/client/assets/smalltalk-BERRCDM3.js +1 -0
  749. package/dist/client/assets/smalltalk-BERRCDM3.js.br +0 -0
  750. package/dist/client/assets/smalltalk-BERRCDM3.js.gz +0 -0
  751. package/dist/client/assets/snazzy-light-Bw305WKR.js +1 -0
  752. package/dist/client/assets/snazzy-light-Bw305WKR.js.br +0 -0
  753. package/dist/client/assets/snazzy-light-Bw305WKR.js.gz +0 -0
  754. package/dist/client/assets/solarized-dark-DXbdFlpD.js +1 -0
  755. package/dist/client/assets/solarized-dark-DXbdFlpD.js.br +0 -0
  756. package/dist/client/assets/solarized-dark-DXbdFlpD.js.gz +0 -0
  757. package/dist/client/assets/solarized-light-L9t79GZl.js +1 -0
  758. package/dist/client/assets/solarized-light-L9t79GZl.js.br +0 -0
  759. package/dist/client/assets/solarized-light-L9t79GZl.js.gz +0 -0
  760. package/dist/client/assets/solidity-rGO070M0.js +1 -0
  761. package/dist/client/assets/solidity-rGO070M0.js.br +0 -0
  762. package/dist/client/assets/solidity-rGO070M0.js.gz +0 -0
  763. package/dist/client/assets/soy-Brmx7dQM.js +1 -0
  764. package/dist/client/assets/soy-Brmx7dQM.js.br +0 -0
  765. package/dist/client/assets/soy-Brmx7dQM.js.gz +0 -0
  766. package/dist/client/assets/sparql-rVzFXLq3.js +1 -0
  767. package/dist/client/assets/sparql-rVzFXLq3.js.br +0 -0
  768. package/dist/client/assets/sparql-rVzFXLq3.js.gz +0 -0
  769. package/dist/client/assets/splunk-BtCnVYZw.js +1 -0
  770. package/dist/client/assets/splunk-BtCnVYZw.js.br +0 -0
  771. package/dist/client/assets/splunk-BtCnVYZw.js.gz +0 -0
  772. package/dist/client/assets/sql-BLtJtn59.js +1 -0
  773. package/dist/client/assets/sql-BLtJtn59.js.br +0 -0
  774. package/dist/client/assets/sql-BLtJtn59.js.gz +0 -0
  775. package/dist/client/assets/ssh-config-_ykCGR6B.js +1 -0
  776. package/dist/client/assets/ssh-config-_ykCGR6B.js.br +0 -0
  777. package/dist/client/assets/ssh-config-_ykCGR6B.js.gz +0 -0
  778. package/dist/client/assets/stata-BH5u7GGu.js +1 -0
  779. package/dist/client/assets/stata-BH5u7GGu.js.br +0 -0
  780. package/dist/client/assets/stata-BH5u7GGu.js.gz +0 -0
  781. package/dist/client/assets/stylus-BEDo0Tqx.js +1 -0
  782. package/dist/client/assets/stylus-BEDo0Tqx.js.br +0 -0
  783. package/dist/client/assets/stylus-BEDo0Tqx.js.gz +0 -0
  784. package/dist/client/assets/surrealql-Bq5Q-fJD.js +1 -0
  785. package/dist/client/assets/surrealql-Bq5Q-fJD.js.br +0 -0
  786. package/dist/client/assets/surrealql-Bq5Q-fJD.js.gz +0 -0
  787. package/dist/client/assets/svelte-C_ipcX3V.js +1 -0
  788. package/dist/client/assets/svelte-C_ipcX3V.js.br +0 -0
  789. package/dist/client/assets/svelte-C_ipcX3V.js.gz +0 -0
  790. package/dist/client/assets/swift-D82vCrfD.js +1 -0
  791. package/dist/client/assets/swift-D82vCrfD.js.br +0 -0
  792. package/dist/client/assets/swift-D82vCrfD.js.gz +0 -0
  793. package/dist/client/assets/synthwave-84-CbfX1IO0.js +1 -0
  794. package/dist/client/assets/synthwave-84-CbfX1IO0.js.br +0 -0
  795. package/dist/client/assets/synthwave-84-CbfX1IO0.js.gz +0 -0
  796. package/dist/client/assets/system-verilog-CnnmHF94.js +1 -0
  797. package/dist/client/assets/system-verilog-CnnmHF94.js.br +0 -0
  798. package/dist/client/assets/system-verilog-CnnmHF94.js.gz +0 -0
  799. package/dist/client/assets/systemd-4A_iFExJ.js +1 -0
  800. package/dist/client/assets/systemd-4A_iFExJ.js.br +0 -0
  801. package/dist/client/assets/systemd-4A_iFExJ.js.gz +0 -0
  802. package/dist/client/assets/talonscript-CkByrt1z.js +1 -0
  803. package/dist/client/assets/talonscript-CkByrt1z.js.br +0 -0
  804. package/dist/client/assets/talonscript-CkByrt1z.js.gz +0 -0
  805. package/dist/client/assets/tasl-QIJgUcNo.js +1 -0
  806. package/dist/client/assets/tasl-QIJgUcNo.js.br +0 -0
  807. package/dist/client/assets/tasl-QIJgUcNo.js.gz +0 -0
  808. package/dist/client/assets/tcl-dwOrl1Do.js +1 -0
  809. package/dist/client/assets/tcl-dwOrl1Do.js.br +0 -0
  810. package/dist/client/assets/tcl-dwOrl1Do.js.gz +0 -0
  811. package/dist/client/assets/templ-P3uqSqPl.js +1 -0
  812. package/dist/client/assets/templ-P3uqSqPl.js.br +0 -0
  813. package/dist/client/assets/templ-P3uqSqPl.js.gz +0 -0
  814. package/dist/client/assets/terraform-BETggiCN.js +1 -0
  815. package/dist/client/assets/terraform-BETggiCN.js.br +0 -0
  816. package/dist/client/assets/terraform-BETggiCN.js.gz +0 -0
  817. package/dist/client/assets/tex-idrVyKtj.js +1 -0
  818. package/dist/client/assets/tex-idrVyKtj.js.br +0 -0
  819. package/dist/client/assets/tex-idrVyKtj.js.gz +0 -0
  820. package/dist/client/assets/tokyo-night-hegEt444.js +1 -0
  821. package/dist/client/assets/tokyo-night-hegEt444.js.br +0 -0
  822. package/dist/client/assets/tokyo-night-hegEt444.js.gz +0 -0
  823. package/dist/client/assets/toml-vGWfd6FD.js +1 -0
  824. package/dist/client/assets/toml-vGWfd6FD.js.br +0 -0
  825. package/dist/client/assets/toml-vGWfd6FD.js.gz +0 -0
  826. package/dist/client/assets/ts-tags-zn1MmPIZ.js +1 -0
  827. package/dist/client/assets/ts-tags-zn1MmPIZ.js.br +0 -0
  828. package/dist/client/assets/ts-tags-zn1MmPIZ.js.gz +0 -0
  829. package/dist/client/assets/tsv-B_m7g4N7.js +1 -0
  830. package/dist/client/assets/tsv-B_m7g4N7.js.br +0 -0
  831. package/dist/client/assets/tsv-B_m7g4N7.js.gz +0 -0
  832. package/dist/client/assets/tsx-COt5Ahok.js +1 -0
  833. package/dist/client/assets/tsx-COt5Ahok.js.br +0 -0
  834. package/dist/client/assets/tsx-COt5Ahok.js.gz +0 -0
  835. package/dist/client/assets/turtle-BsS91CYL.js +1 -0
  836. package/dist/client/assets/turtle-BsS91CYL.js.br +0 -0
  837. package/dist/client/assets/turtle-BsS91CYL.js.gz +0 -0
  838. package/dist/client/assets/twig-DNn4PbVi.js +1 -0
  839. package/dist/client/assets/twig-DNn4PbVi.js.br +0 -0
  840. package/dist/client/assets/twig-DNn4PbVi.js.gz +0 -0
  841. package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
  842. package/dist/client/assets/typescript-BPQ3VLAy.js.br +0 -0
  843. package/dist/client/assets/typescript-BPQ3VLAy.js.gz +0 -0
  844. package/dist/client/assets/typespec-BGHnOYBU.js +1 -0
  845. package/dist/client/assets/typespec-BGHnOYBU.js.br +0 -0
  846. package/dist/client/assets/typespec-BGHnOYBU.js.gz +0 -0
  847. package/dist/client/assets/typst-DHCkPAjA.js +1 -0
  848. package/dist/client/assets/typst-DHCkPAjA.js.br +0 -0
  849. package/dist/client/assets/typst-DHCkPAjA.js.gz +0 -0
  850. package/dist/client/assets/v-BcVCzyr7.js +1 -0
  851. package/dist/client/assets/v-BcVCzyr7.js.br +0 -0
  852. package/dist/client/assets/v-BcVCzyr7.js.gz +0 -0
  853. package/dist/client/assets/vala-CsfeWuGM.js +1 -0
  854. package/dist/client/assets/vala-CsfeWuGM.js.br +0 -0
  855. package/dist/client/assets/vala-CsfeWuGM.js.gz +0 -0
  856. package/dist/client/assets/vb-D17OF-Vu.js +1 -0
  857. package/dist/client/assets/vb-D17OF-Vu.js.br +0 -0
  858. package/dist/client/assets/vb-D17OF-Vu.js.gz +0 -0
  859. package/dist/client/assets/verilog-BQ8w6xss.js +1 -0
  860. package/dist/client/assets/verilog-BQ8w6xss.js.br +0 -0
  861. package/dist/client/assets/verilog-BQ8w6xss.js.gz +0 -0
  862. package/dist/client/assets/vesper-DU1UobuO.js +1 -0
  863. package/dist/client/assets/vesper-DU1UobuO.js.br +0 -0
  864. package/dist/client/assets/vesper-DU1UobuO.js.gz +0 -0
  865. package/dist/client/assets/vhdl-CeAyd5Ju.js +1 -0
  866. package/dist/client/assets/vhdl-CeAyd5Ju.js.br +0 -0
  867. package/dist/client/assets/vhdl-CeAyd5Ju.js.gz +0 -0
  868. package/dist/client/assets/viml-CJc9bBzg.js +1 -0
  869. package/dist/client/assets/viml-CJc9bBzg.js.br +0 -0
  870. package/dist/client/assets/viml-CJc9bBzg.js.gz +0 -0
  871. package/dist/client/assets/vitesse-black-Bkuqu6BP.js +1 -0
  872. package/dist/client/assets/vitesse-black-Bkuqu6BP.js.br +0 -0
  873. package/dist/client/assets/vitesse-black-Bkuqu6BP.js.gz +0 -0
  874. package/dist/client/assets/vitesse-dark-D0r3Knsf.js +1 -0
  875. package/dist/client/assets/vitesse-dark-D0r3Knsf.js.br +0 -0
  876. package/dist/client/assets/vitesse-dark-D0r3Knsf.js.gz +0 -0
  877. package/dist/client/assets/vitesse-light-CVO1_9PV.js +1 -0
  878. package/dist/client/assets/vitesse-light-CVO1_9PV.js.br +0 -0
  879. package/dist/client/assets/vitesse-light-CVO1_9PV.js.gz +0 -0
  880. package/dist/client/assets/vue-DN_0RTcg.js +1 -0
  881. package/dist/client/assets/vue-DN_0RTcg.js.br +0 -0
  882. package/dist/client/assets/vue-DN_0RTcg.js.gz +0 -0
  883. package/dist/client/assets/vue-html-AaS7Mt5G.js +1 -0
  884. package/dist/client/assets/vue-html-AaS7Mt5G.js.br +0 -0
  885. package/dist/client/assets/vue-html-AaS7Mt5G.js.gz +0 -0
  886. package/dist/client/assets/vue-vine-CQOfvN7w.js +1 -0
  887. package/dist/client/assets/vue-vine-CQOfvN7w.js.br +0 -0
  888. package/dist/client/assets/vue-vine-CQOfvN7w.js.gz +0 -0
  889. package/dist/client/assets/vyper-CDx5xZoG.js +1 -0
  890. package/dist/client/assets/vyper-CDx5xZoG.js.br +0 -0
  891. package/dist/client/assets/vyper-CDx5xZoG.js.gz +0 -0
  892. package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
  893. package/dist/client/assets/wasm-CG6Dc4jp.js.br +0 -0
  894. package/dist/client/assets/wasm-CG6Dc4jp.js.gz +0 -0
  895. package/dist/client/assets/wasm-MzD3tlZU.js +1 -0
  896. package/dist/client/assets/wasm-MzD3tlZU.js.br +0 -0
  897. package/dist/client/assets/wasm-MzD3tlZU.js.gz +0 -0
  898. package/dist/client/assets/wenyan-BV7otONQ.js +1 -0
  899. package/dist/client/assets/wenyan-BV7otONQ.js.br +0 -0
  900. package/dist/client/assets/wenyan-BV7otONQ.js.gz +0 -0
  901. package/dist/client/assets/wgsl-Dx-B1_4e.js +1 -0
  902. package/dist/client/assets/wgsl-Dx-B1_4e.js.br +0 -0
  903. package/dist/client/assets/wgsl-Dx-B1_4e.js.gz +0 -0
  904. package/dist/client/assets/wikitext-BhOHFoWU.js +1 -0
  905. package/dist/client/assets/wikitext-BhOHFoWU.js.br +0 -0
  906. package/dist/client/assets/wikitext-BhOHFoWU.js.gz +0 -0
  907. package/dist/client/assets/wit-5i3qLPDT.js +1 -0
  908. package/dist/client/assets/wit-5i3qLPDT.js.br +0 -0
  909. package/dist/client/assets/wit-5i3qLPDT.js.gz +0 -0
  910. package/dist/client/assets/wolfram-lXgVvXCa.js +1 -0
  911. package/dist/client/assets/wolfram-lXgVvXCa.js.br +0 -0
  912. package/dist/client/assets/wolfram-lXgVvXCa.js.gz +0 -0
  913. package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
  914. package/dist/client/assets/xml-sdJ4AIDG.js.br +0 -0
  915. package/dist/client/assets/xml-sdJ4AIDG.js.gz +0 -0
  916. package/dist/client/assets/xsl-CtQFsRM5.js +1 -0
  917. package/dist/client/assets/xsl-CtQFsRM5.js.br +0 -0
  918. package/dist/client/assets/xsl-CtQFsRM5.js.gz +0 -0
  919. package/dist/client/assets/yaml-Buea-lGh.js +1 -0
  920. package/dist/client/assets/yaml-Buea-lGh.js.br +0 -0
  921. package/dist/client/assets/yaml-Buea-lGh.js.gz +0 -0
  922. package/dist/client/assets/zenscript-DVFEvuxE.js +1 -0
  923. package/dist/client/assets/zenscript-DVFEvuxE.js.br +0 -0
  924. package/dist/client/assets/zenscript-DVFEvuxE.js.gz +0 -0
  925. package/dist/client/assets/zig-VOosw3JB.js +1 -0
  926. package/dist/client/assets/zig-VOosw3JB.js.br +0 -0
  927. package/dist/client/assets/zig-VOosw3JB.js.gz +0 -0
  928. package/dist/client/index.html +2 -2
  929. package/dist/server/build-target.json +1 -1
  930. package/dist/server/cli-supervisor.js +5 -3
  931. package/dist/server/cli.js +1284 -151
  932. package/package.json +2 -3
  933. package/dist/client/assets/FeatureOverviewPage-DGosnNE0.js.br +0 -0
  934. package/dist/client/assets/FeatureOverviewPage-DGosnNE0.js.gz +0 -0
  935. package/dist/client/assets/LocalProjectsPage-gWrmUSs2.js +0 -21
  936. package/dist/client/assets/LocalProjectsPage-gWrmUSs2.js.br +0 -0
  937. package/dist/client/assets/LocalProjectsPage-gWrmUSs2.js.gz +0 -0
  938. package/dist/client/assets/SettingsPage-BPpmk_eT.js +0 -51
  939. package/dist/client/assets/SettingsPage-BPpmk_eT.js.br +0 -0
  940. package/dist/client/assets/SettingsPage-BPpmk_eT.js.gz +0 -0
  941. package/dist/client/assets/eye-BXpLGEx5.js +0 -11
  942. package/dist/client/assets/eye-BXpLGEx5.js.br +0 -0
  943. package/dist/client/assets/eye-BXpLGEx5.js.gz +0 -0
  944. package/dist/client/assets/index-D-HIK4uM.css +0 -32
  945. package/dist/client/assets/index-D-HIK4uM.css.br +0 -0
  946. package/dist/client/assets/index-D-HIK4uM.css.gz +0 -0
  947. package/dist/client/assets/index-SgSBQKg3.js +0 -608
  948. package/dist/client/assets/index-SgSBQKg3.js.br +0 -0
  949. package/dist/client/assets/index-SgSBQKg3.js.gz +0 -0
@@ -22,7 +22,7 @@ import { fileURLToPath } from "url";
22
22
  var package_default = {
23
23
  name: "kaizenai",
24
24
  type: "module",
25
- version: "0.7.1",
25
+ version: "0.8.0",
26
26
  description: "Local web UI for coding agents",
27
27
  keywords: [
28
28
  "claude",
@@ -78,8 +78,8 @@ var package_default = {
78
78
  prepublishOnly: "bun run build:prod && bun run validate:publish"
79
79
  },
80
80
  dependencies: {
81
- "@kaizenai/ui": "workspace:*",
82
81
  "@anthropic-ai/claude-agent-sdk": "^0.2.39",
82
+ "@pierre/diffs": "^1.1.12",
83
83
  "@radix-ui/react-context-menu": "^2.2.16",
84
84
  "@radix-ui/react-select": "^2.2.6",
85
85
  "@xterm/addon-fit": "^0.11.0",
@@ -99,7 +99,6 @@ var package_default = {
99
99
  "@dnd-kit/core": "^6.3.1",
100
100
  "@dnd-kit/sortable": "^10.0.0",
101
101
  "@dnd-kit/utilities": "^3.2.2",
102
- "@kaizenai/themes": "workspace:*",
103
102
  "@radix-ui/react-dialog": "^1.1.15",
104
103
  "@radix-ui/react-popover": "^1.1.15",
105
104
  "@radix-ui/react-tooltip": "^1.2.8",
@@ -185,6 +184,9 @@ function getManagedBackgroundsDirPath(homeDir, env = getRuntimeEnv()) {
185
184
  function getProviderSettingsFilePath(homeDir, env = getRuntimeEnv()) {
186
185
  return `${getDataRootDir(homeDir, env)}/providers.json`;
187
186
  }
187
+ function getGeneralSettingsFilePath(homeDir, env = getRuntimeEnv()) {
188
+ return `${getDataRootDir(homeDir, env)}/general.json`;
189
+ }
188
190
  function getRemoteAuthFilePath(homeDir, env = getRuntimeEnv()) {
189
191
  return `${getDataRootDir(homeDir, env)}/remote-auth.json`;
190
192
  }
@@ -831,7 +833,7 @@ ${stderr}`);
831
833
  }
832
834
 
833
835
  // src/server/server.ts
834
- import path27 from "path";
836
+ import path29 from "path";
835
837
  import QRCode2 from "qrcode";
836
838
 
837
839
  // src/server/event-store.ts
@@ -1035,6 +1037,12 @@ var OPENROUTER_ATTACHMENT_CAPABILITIES = {
1035
1037
  markdown: true,
1036
1038
  document: true
1037
1039
  };
1040
+ var MIN_SEND_CHUNK_SIZE_BYTES = 16 * 1024;
1041
+ var MAX_SEND_CHUNK_SIZE_BYTES = 1024 * 1024;
1042
+ var DEFAULT_SENT_CHUNK_SIZE_BYTES = 200 * 1024;
1043
+ var DEFAULT_GENERAL_SETTINGS = {
1044
+ sendChunkSizeBytes: DEFAULT_SENT_CHUNK_SIZE_BYTES
1045
+ };
1038
1046
  var FEATURE_ACCESS_REQUIREMENTS = {
1039
1047
  openrouter: "account",
1040
1048
  providerUsage: "account",
@@ -4204,7 +4212,7 @@ function normalizeToolCall(args) {
4204
4212
 
4205
4213
  // src/server/attachments.ts
4206
4214
  import path5 from "path";
4207
- import { mkdir as mkdir3, writeFile as writeFile2 } from "fs/promises";
4215
+ import { mkdir as mkdir3, unlink, writeFile as writeFile2 } from "fs/promises";
4208
4216
  var ATTACHMENTS_ROUTE_PREFIX = "/attachments";
4209
4217
  var MAX_CHAT_IMAGE_DATA_URL_CHARS = 14000000;
4210
4218
  var MAX_CHAT_DOCUMENT_DATA_URL_CHARS = 30000000;
@@ -4314,6 +4322,23 @@ async function persistChatAttachments(input) {
4314
4322
  }
4315
4323
  return persisted;
4316
4324
  }
4325
+ async function deleteStagedAttachmentsForUserPrompt(input) {
4326
+ const attachments = input.userPrompt.attachments;
4327
+ if (!attachments?.length)
4328
+ return;
4329
+ for (const attachment of attachments) {
4330
+ const filePath = resolveAttachmentPath(input.attachmentsDir, attachment.relativePath);
4331
+ if (!filePath)
4332
+ continue;
4333
+ try {
4334
+ await unlink(filePath);
4335
+ } catch (error) {
4336
+ if (error.code !== "ENOENT") {
4337
+ throw error;
4338
+ }
4339
+ }
4340
+ }
4341
+ }
4317
4342
 
4318
4343
  // src/server/codex-app-server.ts
4319
4344
  import { spawn as spawn2 } from "child_process";
@@ -7956,6 +7981,33 @@ function normalizeOpenCodeToolResult(args) {
7956
7981
  isError: args.status === "failed"
7957
7982
  };
7958
7983
  }
7984
+ function looksLikeDeliveredPlan(assistantText) {
7985
+ const trimmed = assistantText.trim();
7986
+ if (trimmed.length < 160)
7987
+ return false;
7988
+ const markdownHeadings = trimmed.match(/(^|\n)#{1,6}\s+/g)?.length ?? 0;
7989
+ const listItems = trimmed.match(/(^|\n)(?:\d+\.\s+|[-*]\s+)/g)?.length ?? 0;
7990
+ const hasTable = /\|[^\n]+\|/.test(trimmed);
7991
+ const hasPlanHeading = /(^|\n)#{1,6}\s+.*\bplan\b/m.test(trimmed);
7992
+ const hasApprovalPrompt = /do you want me to proceed|would you like any changes to this plan|should i proceed with implementation|ready to proceed with implementation|does this plan look good/i.test(trimmed);
7993
+ return hasPlanHeading && (markdownHeadings >= 2 || listItems >= 3 || hasTable) || hasApprovalPrompt && (markdownHeadings >= 1 || listItems >= 3 || hasTable);
7994
+ }
7995
+ function createSyntheticOpenCodeExitPlanTool(context, turn) {
7996
+ const observedExitPlanTool = [...turn.toolCalls.values()].find((tool) => tool.toolKind === "exit_plan_mode");
7997
+ if (observedExitPlanTool && turn.interactiveToolRequestIds.has(observedExitPlanTool.toolId)) {
7998
+ return null;
7999
+ }
8000
+ if (turn.sawExitPlanModeCall && !observedExitPlanTool)
8001
+ return null;
8002
+ if (!looksLikeDeliveredPlan(turn.assistantText))
8003
+ return null;
8004
+ const hydrated = populateExitPlanFromAssistantText(observedExitPlanTool ?? normalizeToolCall({
8005
+ toolName: "ExitPlanMode",
8006
+ toolId: `${context.sessionId ?? "opencode"}:${randomUUID5()}:synthetic-exit-plan`,
8007
+ input: {}
8008
+ }), turn.assistantText);
8009
+ return hydrated.toolKind === "exit_plan_mode" && hydrated.input.plan ? hydrated : null;
8010
+ }
7959
8011
  function extractOpenCodeStderrTurnError(line) {
7960
8012
  const jsonMatch = line.match(/error=(\{.*\})\s+stream error$/);
7961
8013
  if (jsonMatch) {
@@ -8730,6 +8782,14 @@ class OpenCodeAcpManager {
8730
8782
  return;
8731
8783
  if (turn.pendingInteractiveToolIds.size > 0)
8732
8784
  return;
8785
+ if (context.currentPlanMode && !turn.completedExitPlanMode) {
8786
+ const syntheticExitPlan = createSyntheticOpenCodeExitPlanTool(context, turn);
8787
+ if (syntheticExitPlan) {
8788
+ turn.toolCalls.set(syntheticExitPlan.toolId, syntheticExitPlan);
8789
+ await this.requestInteractiveTool(context, turn, syntheticExitPlan);
8790
+ return;
8791
+ }
8792
+ }
8733
8793
  if (context.currentPlanMode && !turn.completedExitPlanMode) {
8734
8794
  const failureMessage = turn.sawExitPlanModeCall ? `OpenCode ended the plan turn with stop reason "${turn.promptStopReason}" before exit_plan_mode was confirmed. No plan was delivered for approval.` : `OpenCode ended the plan turn with stop reason "${turn.promptStopReason}" without calling exit_plan_mode. No plan was delivered for approval.`;
8735
8795
  this.failPendingTurn(context, turn, failureMessage);
@@ -11706,7 +11766,7 @@ function deriveSuggestedProjectFolders(state, discoveredProjects) {
11706
11766
  }
11707
11767
  return [...candidates.entries()].map(([localPath, label]) => ({ localPath, label })).slice(0, 12);
11708
11768
  }
11709
- function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, getLastModel, pendingTool = null, usage = null, providerSettings, availableProviders) {
11769
+ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, getLastModel, pendingTool = null, usage = null, diffs = null, providerSettings, availableProviders, queuedOutbound) {
11710
11770
  const chat = state.chatsById.get(chatId);
11711
11771
  if (!chat || chat.deletedAt)
11712
11772
  return null;
@@ -11726,6 +11786,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
11726
11786
  sessionToken: chat.sessionToken,
11727
11787
  updatedAt: chat.updatedAt,
11728
11788
  pendingTool,
11789
+ queuedOutbound: queuedOutbound && queuedOutbound.length > 0 ? queuedOutbound : undefined,
11729
11790
  hydrationState: chat.hydrationState ?? "local",
11730
11791
  inactiveProviderMessage: provider ? getProviderInactiveMessage(provider, providerSettings) : null
11731
11792
  };
@@ -11735,6 +11796,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
11735
11796
  runtime,
11736
11797
  messages: transcript.entries,
11737
11798
  transcript,
11799
+ diffs,
11738
11800
  usage,
11739
11801
  availableProviders: availableProviders ?? getSelectableProviders(providerSettings),
11740
11802
  providerSettings
@@ -11761,6 +11823,25 @@ var CLAUDE_TOOLSET = [
11761
11823
  "ExitPlanMode"
11762
11824
  ];
11763
11825
  var CHAT_RESOURCE_IDLE_TTL_MS = 2 * 60 * 1000;
11826
+ function previewForOutboundQueue(text, attachmentCount = 0) {
11827
+ const singleLine = text.trim().replace(/\s+/g, " ");
11828
+ if (!singleLine) {
11829
+ return attachmentCount > 1 ? `${attachmentCount} attachments` : "Attachment";
11830
+ }
11831
+ if (singleLine.length <= 120)
11832
+ return singleLine;
11833
+ return `${singleLine.slice(0, 117)}...`;
11834
+ }
11835
+ function restampTranscriptEntryAfterLatest(latestCreatedAt, entry) {
11836
+ const createdAt = Math.max(Date.now(), latestCreatedAt + 1);
11837
+ if (entry.createdAt >= createdAt) {
11838
+ return entry;
11839
+ }
11840
+ return {
11841
+ ...entry,
11842
+ createdAt
11843
+ };
11844
+ }
11764
11845
  var noopRealtime = {
11765
11846
  publishChatMessageAppended: () => {},
11766
11847
  publishChatMessagesAppended: () => {},
@@ -11773,6 +11854,7 @@ var noopRealtime = {
11773
11854
  publishChatUsageSet: () => {},
11774
11855
  publishChatAvailableProvidersSet: () => {},
11775
11856
  publishChatTranscriptWindowMetaSet: () => {},
11857
+ publishChatOutboundQueueSet: () => {},
11776
11858
  publishChatDeleted: () => {},
11777
11859
  publishSidebarChatFieldsSet: () => {},
11778
11860
  publishSidebarChatAdded: () => {},
@@ -12219,6 +12301,10 @@ class AgentCoordinator {
12219
12301
  providerCatalogManager;
12220
12302
  generateTitle;
12221
12303
  activeTurns = new Map;
12304
+ outboundQueues = new Map;
12305
+ drainingOutboundQueues = new Set;
12306
+ outboundQueueRetryTimers = new Map;
12307
+ latestTranscriptCreatedAt = new Map;
12222
12308
  liveUsage = new Map;
12223
12309
  disposeTimers = new Map;
12224
12310
  realtime = noopRealtime;
@@ -12300,7 +12386,10 @@ class AgentCoordinator {
12300
12386
  return state?.projectsById ? this.store.state : null;
12301
12387
  }
12302
12388
  async prewarmEnabledProviders(providers, localPath = process.cwd()) {
12303
- const orderedProviders = providers.includes("codex") ? ["codex", ...providers.filter((provider) => provider !== "codex")] : providers;
12389
+ const orderedProviders = providers.includes("codex") ? [
12390
+ "codex",
12391
+ ...providers.filter((provider) => provider !== "codex")
12392
+ ] : providers;
12304
12393
  for (const provider of orderedProviders) {
12305
12394
  try {
12306
12395
  await this.providerRuntimeSupervisor.prewarmPrimary(provider, localPath);
@@ -12410,6 +12499,169 @@ class AgentCoordinator {
12410
12499
  this.realtime.publishChatUsageSet(chatId, this.getLiveUsage(chatId));
12411
12500
  this.realtime.publishSidebarProviderUsageSet(this.getProviderUsage());
12412
12501
  }
12502
+ publishOutboundQueueSet(chatId) {
12503
+ const queue = this.outboundQueues.get(chatId);
12504
+ const queuedMessages = queue?.map((item) => ({
12505
+ id: item.id,
12506
+ preview: item.preview,
12507
+ text: item.content,
12508
+ attachmentCount: item.attachmentCount
12509
+ })) ?? [];
12510
+ this.realtime.publishChatOutboundQueueSet(chatId, queuedMessages);
12511
+ }
12512
+ getQueuedOutboundPreview(chatId) {
12513
+ const queue = this.outboundQueues.get(chatId);
12514
+ return queue?.map((item) => ({
12515
+ id: item.id,
12516
+ preview: item.preview,
12517
+ text: item.content,
12518
+ attachmentCount: item.attachmentCount
12519
+ })) ?? [];
12520
+ }
12521
+ getLatestTranscriptCreatedAt(chatId) {
12522
+ const cached = this.latestTranscriptCreatedAt.get(chatId);
12523
+ if (cached !== undefined) {
12524
+ return cached;
12525
+ }
12526
+ const latest = this.store.getMessages(chatId).reduce((max, entry) => Math.max(max, entry.createdAt), 0);
12527
+ this.latestTranscriptCreatedAt.set(chatId, latest);
12528
+ return latest;
12529
+ }
12530
+ restampTranscriptEntryAfterLatest(chatId, entry) {
12531
+ const latestCreatedAt = this.getLatestTranscriptCreatedAt(chatId);
12532
+ const restamped = restampTranscriptEntryAfterLatest(latestCreatedAt, entry);
12533
+ this.latestTranscriptCreatedAt.set(chatId, Math.max(latestCreatedAt, restamped.createdAt));
12534
+ return restamped;
12535
+ }
12536
+ async clearOutboundQueueForChat(chatId) {
12537
+ const retryTimer = this.outboundQueueRetryTimers.get(chatId);
12538
+ if (retryTimer) {
12539
+ clearTimeout(retryTimer);
12540
+ this.outboundQueueRetryTimers.delete(chatId);
12541
+ }
12542
+ const queue = this.outboundQueues.get(chatId);
12543
+ if (!queue?.length) {
12544
+ this.outboundQueues.delete(chatId);
12545
+ this.publishOutboundQueueSet(chatId);
12546
+ return;
12547
+ }
12548
+ for (const item of queue) {
12549
+ await this.safeDeleteQueuedPromptAttachments(chatId, item.userPrompt);
12550
+ }
12551
+ this.outboundQueues.delete(chatId);
12552
+ this.publishOutboundQueueSet(chatId);
12553
+ }
12554
+ async safeDeleteQueuedPromptAttachments(chatId, userPrompt) {
12555
+ try {
12556
+ await deleteStagedAttachmentsForUserPrompt({
12557
+ attachmentsDir: this.attachmentsDir,
12558
+ userPrompt
12559
+ });
12560
+ } catch (error) {
12561
+ console.error("Failed to delete staged queued attachments:", {
12562
+ chatId,
12563
+ userPromptId: userPrompt._id,
12564
+ error
12565
+ });
12566
+ }
12567
+ }
12568
+ async maybeDrainOutboundQueueHead(chatId) {
12569
+ if (this.activeTurns.has(chatId))
12570
+ return;
12571
+ if (this.drainingOutboundQueues.has(chatId))
12572
+ return;
12573
+ const queue = this.outboundQueues.get(chatId);
12574
+ if (!queue?.length)
12575
+ return;
12576
+ const retryTimer = this.outboundQueueRetryTimers.get(chatId);
12577
+ if (retryTimer) {
12578
+ clearTimeout(retryTimer);
12579
+ this.outboundQueueRetryTimers.delete(chatId);
12580
+ }
12581
+ this.drainingOutboundQueues.add(chatId);
12582
+ const item = queue.shift();
12583
+ if (queue.length === 0) {
12584
+ this.outboundQueues.delete(chatId);
12585
+ }
12586
+ this.publishOutboundQueueSet(chatId);
12587
+ try {
12588
+ const userPrompt = this.restampTranscriptEntryAfterLatest(chatId, item.userPrompt);
12589
+ await this.startTurnForChat({
12590
+ chatId,
12591
+ provider: item.provider,
12592
+ content: item.content,
12593
+ attachments: userPrompt.attachments,
12594
+ model: item.model,
12595
+ effort: item.effort,
12596
+ serviceTier: item.serviceTier,
12597
+ fastMode: item.fastMode,
12598
+ planMode: item.planMode,
12599
+ appendUserPrompt: userPrompt,
12600
+ pushChatSnapshotRefresh: true
12601
+ });
12602
+ } catch (error) {
12603
+ const restored = this.outboundQueues.get(chatId) ?? [];
12604
+ this.outboundQueues.set(chatId, [item, ...restored]);
12605
+ this.publishOutboundQueueSet(chatId);
12606
+ console.error("Outbound queue drain failed:", error);
12607
+ const retryHandle = setTimeout(() => {
12608
+ this.outboundQueueRetryTimers.delete(chatId);
12609
+ const retryQueue = this.outboundQueues.get(chatId);
12610
+ if (!retryQueue?.length)
12611
+ return;
12612
+ if (retryQueue[0]?.id !== item.id)
12613
+ return;
12614
+ if (this.activeTurns.has(chatId))
12615
+ return;
12616
+ this.maybeDrainOutboundQueueHead(chatId);
12617
+ }, 1000);
12618
+ this.outboundQueueRetryTimers.set(chatId, retryHandle);
12619
+ } finally {
12620
+ this.drainingOutboundQueues.delete(chatId);
12621
+ }
12622
+ }
12623
+ async removeOutboundQueueMessage(chatId, messageId) {
12624
+ const queue = this.outboundQueues.get(chatId);
12625
+ if (!queue) {
12626
+ throw new Error("Queued message not found");
12627
+ }
12628
+ const index = queue.findIndex((item) => item.id === messageId);
12629
+ if (index < 0) {
12630
+ throw new Error("Queued message not found");
12631
+ }
12632
+ const [removed] = queue.splice(index, 1);
12633
+ if (queue.length === 0) {
12634
+ this.outboundQueues.delete(chatId);
12635
+ }
12636
+ await this.safeDeleteQueuedPromptAttachments(chatId, removed.userPrompt);
12637
+ this.publishOutboundQueueSet(chatId);
12638
+ if (!this.activeTurns.has(chatId)) {
12639
+ await this.maybeDrainOutboundQueueHead(chatId);
12640
+ }
12641
+ }
12642
+ async updateOutboundQueueMessage(chatId, messageId, text) {
12643
+ const queue = this.outboundQueues.get(chatId);
12644
+ if (!queue) {
12645
+ throw new Error("Queued message not found");
12646
+ }
12647
+ const item = queue.find((entry) => entry.id === messageId);
12648
+ if (!item) {
12649
+ throw new Error("Queued message not found");
12650
+ }
12651
+ const trimmed = text.trim();
12652
+ const attachmentCount = item.userPrompt.attachments?.length ?? 0;
12653
+ const hasAttachments = attachmentCount > 0;
12654
+ if (!trimmed && !hasAttachments) {
12655
+ throw new Error("Message must include text or attachments");
12656
+ }
12657
+ item.content = trimmed;
12658
+ item.preview = previewForOutboundQueue(trimmed, attachmentCount);
12659
+ item.userPrompt = {
12660
+ ...item.userPrompt,
12661
+ content: trimmed
12662
+ };
12663
+ this.publishOutboundQueueSet(chatId);
12664
+ }
12413
12665
  async failTurnResumeAccessDenied(active, message) {
12414
12666
  const errorEntry = timestamped3({
12415
12667
  kind: "result",
@@ -12439,6 +12691,7 @@ class AgentCoordinator {
12439
12691
  this.publishPendingTool(active.chatId);
12440
12692
  this.publishChatStatus(active.chatId);
12441
12693
  this.publishSidebarChatState(active.chatId);
12694
+ await this.maybeDrainOutboundQueueHead(active.chatId);
12442
12695
  }
12443
12696
  publishAvailableProviders(chatId) {
12444
12697
  const providerSettings = this.providerSettingsManager?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS;
@@ -12573,10 +12826,14 @@ class AgentCoordinator {
12573
12826
  const sidebarStoreState = this.getSidebarStoreState();
12574
12827
  const previousSidebarIndex = args.appendUserPrompt && sidebarStoreState ? deriveSidebarChatIndex(this.store, chat.projectId, previousFeatureId, args.chatId) : -1;
12575
12828
  if (args.appendUserPrompt) {
12576
- await this.store.appendMessage(args.chatId, args.appendUserPrompt);
12577
- this.realtime.publishChatMessageAppended(args.chatId, args.appendUserPrompt);
12829
+ const userPrompt = this.restampTranscriptEntryAfterLatest(args.chatId, args.appendUserPrompt);
12830
+ await this.store.appendMessage(args.chatId, userPrompt);
12831
+ this.realtime.publishChatMessageAppended(args.chatId, userPrompt);
12578
12832
  this.publishTranscriptMeta(args.chatId);
12579
12833
  this.publishPendingTool(args.chatId);
12834
+ if (args.pushChatSnapshotRefresh) {
12835
+ this.realtime.refreshChatSnapshot?.(args.chatId);
12836
+ }
12580
12837
  }
12581
12838
  await this.store.recordTurnStarted(args.chatId);
12582
12839
  const project = this.store.getProject(chat.projectId);
@@ -12816,6 +13073,7 @@ class AgentCoordinator {
12816
13073
  this.publishPendingTool(args.chatId);
12817
13074
  this.publishChatStatus(args.chatId);
12818
13075
  this.publishSidebarChatState(args.chatId);
13076
+ this.maybeDrainOutboundQueueHead(args.chatId);
12819
13077
  }
12820
13078
  }
12821
13079
  assertProviderAccess(provider) {
@@ -12846,6 +13104,19 @@ class AgentCoordinator {
12846
13104
  const settings = this.getProviderSettings(provider, command);
12847
13105
  validateProviderAttachmentSupport(provider, settings.model, command.message.attachments, this.providerCatalogManager?.getSnapshot());
12848
13106
  const text = command.message.text.trim();
13107
+ const requestedAttachmentCount = command.message.attachments?.length ?? 0;
13108
+ if (!text && requestedAttachmentCount === 0) {
13109
+ throw new Error("Message must include text or attachments");
13110
+ }
13111
+ const active = this.activeTurns.get(chatId);
13112
+ if (active?.status === "waiting_for_user") {
13113
+ throw new Error("Chat is waiting for a tool response");
13114
+ }
13115
+ const queue = this.outboundQueues.get(chatId);
13116
+ const shouldEnqueue = Boolean(queue?.length) || Boolean(active && (active.status === "starting" || active.status === "running"));
13117
+ if (shouldEnqueue && chat.planMode) {
13118
+ throw new Error("Cannot queue messages while plan mode is active");
13119
+ }
12849
13120
  const userPrompt = timestamped3({
12850
13121
  kind: "user_prompt",
12851
13122
  content: text
@@ -12857,8 +13128,28 @@ class AgentCoordinator {
12857
13128
  uploads: command.message.attachments
12858
13129
  });
12859
13130
  userPrompt.attachments = attachments;
12860
- if (!text && !attachments?.length) {
12861
- throw new Error("Message must include text or attachments");
13131
+ if (shouldEnqueue) {
13132
+ const id = crypto.randomUUID();
13133
+ const attachmentCount = attachments?.length ?? 0;
13134
+ const preview = previewForOutboundQueue(text, attachmentCount);
13135
+ const queued = {
13136
+ id,
13137
+ preview,
13138
+ attachmentCount,
13139
+ provider,
13140
+ model: settings.model,
13141
+ effort: settings.effort,
13142
+ serviceTier: settings.serviceTier,
13143
+ fastMode: settings.fastMode,
13144
+ planMode: settings.planMode,
13145
+ content: text,
13146
+ userPrompt
13147
+ };
13148
+ const list = queue ?? [];
13149
+ list.push(queued);
13150
+ this.outboundQueues.set(chatId, list);
13151
+ this.publishOutboundQueueSet(chatId);
13152
+ return { chatId, queued: true, queuedMessageId: id };
12862
13153
  }
12863
13154
  await this.startTurnForChat({
12864
13155
  chatId,
@@ -12924,19 +13215,20 @@ class AgentCoordinator {
12924
13215
  if (event.entry.kind === "tool_call" && active.syntheticToolCallIds.delete(event.entry.tool.toolId)) {
12925
13216
  continue;
12926
13217
  }
12927
- await this.store.appendMessage(active.chatId, event.entry);
12928
- this.realtime.publishChatMessageAppended(active.chatId, event.entry);
13218
+ const entry = this.restampTranscriptEntryAfterLatest(active.chatId, event.entry);
13219
+ await this.store.appendMessage(active.chatId, entry);
13220
+ this.realtime.publishChatMessageAppended(active.chatId, entry);
12929
13221
  this.publishTranscriptMeta(active.chatId);
12930
13222
  this.publishPendingTool(active.chatId);
12931
13223
  this.publishSidebarChatState(active.chatId);
12932
- if (event.entry.kind === "system_init") {
13224
+ if (entry.kind === "system_init") {
12933
13225
  active.status = "running";
12934
13226
  this.publishChatStatus(active.chatId);
12935
13227
  }
12936
- if (event.entry.kind === "result") {
13228
+ if (entry.kind === "result") {
12937
13229
  active.hasFinalResult = true;
12938
- if (event.entry.isError) {
12939
- await this.store.recordTurnFailed(active.chatId, event.entry.result || "Turn failed");
13230
+ if (entry.isError) {
13231
+ await this.store.recordTurnFailed(active.chatId, entry.result || "Turn failed");
12940
13232
  active.status = "failed";
12941
13233
  } else if (!active.cancelRequested) {
12942
13234
  await this.store.recordTurnFinished(active.chatId);
@@ -13018,9 +13310,11 @@ class AgentCoordinator {
13018
13310
  this.publishSidebarChatState(active.chatId);
13019
13311
  }
13020
13312
  }
13313
+ await this.maybeDrainOutboundQueueHead(active.chatId);
13021
13314
  }
13022
13315
  }
13023
13316
  async cancel(chatId) {
13317
+ await this.clearOutboundQueueForChat(chatId);
13024
13318
  const active = this.activeTurns.get(chatId);
13025
13319
  if (!active)
13026
13320
  return;
@@ -13071,6 +13365,7 @@ class AgentCoordinator {
13071
13365
  await this.cancel(chatId);
13072
13366
  return;
13073
13367
  }
13368
+ await this.clearOutboundQueueForChat(chatId);
13074
13369
  active.cancelRequested = true;
13075
13370
  active.cancelRecorded = true;
13076
13371
  active.hasFinalResult = true;
@@ -13545,7 +13840,83 @@ function discoverProjects(homeDir = homedir9(), adapters = DEFAULT_PROJECT_DISCO
13545
13840
 
13546
13841
  // src/server/git-manager.ts
13547
13842
  import path14 from "path";
13548
- import { readFile as readFile3, writeFile as writeFile3 } from "fs/promises";
13843
+ import { readFile as readFile3, stat as stat4, writeFile as writeFile3 } from "fs/promises";
13844
+ function normalizeDiffPath(value) {
13845
+ return value.replaceAll("\\", "/");
13846
+ }
13847
+ function countContentLines(value) {
13848
+ if (value.length === 0)
13849
+ return 0;
13850
+ const normalized = value.replaceAll(`\r
13851
+ `, `
13852
+ `);
13853
+ return normalized.endsWith(`
13854
+ `) ? normalized.slice(0, -1).split(`
13855
+ `).length : normalized.split(`
13856
+ `).length;
13857
+ }
13858
+ var MAX_UNTRACKED_PREVIEW_BYTES = 128 * 1024;
13859
+ function buildUntrackedFilePatch(filePath, content) {
13860
+ const normalizedPath = normalizeDiffPath(filePath);
13861
+ const normalizedContent = content.replaceAll(`\r
13862
+ `, `
13863
+ `);
13864
+ const hasTrailingNewline = normalizedContent.endsWith(`
13865
+ `);
13866
+ const bodyLines = normalizedContent.length === 0 ? [] : normalizedContent.split(`
13867
+ `).slice(0, hasTrailingNewline ? -1 : undefined).map((line) => `+${line}`);
13868
+ const lineCount = countContentLines(normalizedContent);
13869
+ const patchLines = [
13870
+ `diff --git a/${normalizedPath} b/${normalizedPath}`,
13871
+ "new file mode 100644",
13872
+ "--- /dev/null",
13873
+ `+++ b/${normalizedPath}`,
13874
+ `@@ -0,0 +1,${lineCount} @@`,
13875
+ ...bodyLines
13876
+ ];
13877
+ if (lineCount > 0 && !hasTrailingNewline) {
13878
+ patchLines.push("\");
13879
+ }
13880
+ return `${patchLines.join(`
13881
+ `)}
13882
+ `;
13883
+ }
13884
+ function isBinaryBuffer(buffer) {
13885
+ const sample = buffer.subarray(0, Math.min(buffer.length, 8192));
13886
+ if (sample.includes(0))
13887
+ return true;
13888
+ try {
13889
+ new TextDecoder("utf-8", { fatal: true }).decode(sample);
13890
+ return false;
13891
+ } catch {}
13892
+ let suspiciousBytes = 0;
13893
+ for (const value of sample) {
13894
+ if (value === 9 || value === 10 || value === 13 || value >= 32 && value <= 126) {
13895
+ continue;
13896
+ }
13897
+ suspiciousBytes += 1;
13898
+ }
13899
+ return sample.length > 0 && suspiciousBytes / sample.length > 0.3;
13900
+ }
13901
+ function splitPatchByFile(patch) {
13902
+ const patchesByPath = new Map;
13903
+ const blocks = patch.split(/(?=^diff --git )/m).filter(Boolean);
13904
+ for (const block of blocks) {
13905
+ const lines = block.split(`
13906
+ `);
13907
+ const plusLine = lines.find((line) => line.startsWith("+++ "));
13908
+ const minusLine = lines.find((line) => line.startsWith("--- "));
13909
+ const renameToLine = lines.find((line) => line.startsWith("rename to "));
13910
+ const renameFromLine = lines.find((line) => line.startsWith("rename from "));
13911
+ const candidate = plusLine && !plusLine.includes("/dev/null") ? plusLine.replace(/^\+\+\+ b\//, "") : minusLine && !minusLine.includes("/dev/null") ? minusLine.replace(/^--- a\//, "") : renameToLine ? renameToLine.replace(/^rename to /, "") : renameFromLine ? renameFromLine.replace(/^rename from /, "") : null;
13912
+ if (!candidate)
13913
+ continue;
13914
+ patchesByPath.set(normalizeDiffPath(candidate), `${block}
13915
+ `);
13916
+ }
13917
+ return patchesByPath;
13918
+ }
13919
+
13549
13920
  class GitManager {
13550
13921
  async runGit(cwd, args) {
13551
13922
  const proc = Bun.spawn(["git", "-C", cwd, ...args], {
@@ -13559,6 +13930,210 @@ class GitManager {
13559
13930
  ]);
13560
13931
  return { exitCode, stdout: stdout.trim(), stderr: stderr.trim() };
13561
13932
  }
13933
+ async runGitRaw(cwd, args) {
13934
+ const proc = Bun.spawn(["git", "-C", cwd, ...args], {
13935
+ stdout: "pipe",
13936
+ stderr: "pipe"
13937
+ });
13938
+ const [exitCode, stdout, stderr] = await Promise.all([
13939
+ proc.exited,
13940
+ new Response(proc.stdout).text(),
13941
+ new Response(proc.stderr).text()
13942
+ ]);
13943
+ return { exitCode, stdout, stderr: stderr.trim() };
13944
+ }
13945
+ async getStatusEntries(localPath) {
13946
+ const result = await this.runGitRaw(localPath, [
13947
+ "status",
13948
+ "--porcelain=v1",
13949
+ "--untracked-files=all",
13950
+ "-z"
13951
+ ]);
13952
+ if (result.exitCode !== 0) {
13953
+ throw new Error(result.stderr || "git status failed");
13954
+ }
13955
+ const parts = result.stdout.split("\x00").filter(Boolean);
13956
+ const entries = [];
13957
+ for (let index = 0;index < parts.length; index += 1) {
13958
+ const part = parts[index];
13959
+ if (part.length < 4)
13960
+ continue;
13961
+ const indexStatus = part[0] ?? " ";
13962
+ const worktreeStatus = part[1] ?? " ";
13963
+ const filePath = part.slice(3);
13964
+ if (!filePath)
13965
+ continue;
13966
+ if (indexStatus === "R" || indexStatus === "C" || worktreeStatus === "R" || worktreeStatus === "C") {
13967
+ const originalPath = parts[index + 1];
13968
+ if (!originalPath)
13969
+ continue;
13970
+ entries.push({
13971
+ indexStatus,
13972
+ worktreeStatus,
13973
+ path: filePath,
13974
+ originalPath
13975
+ });
13976
+ index += 1;
13977
+ continue;
13978
+ }
13979
+ entries.push({ indexStatus, worktreeStatus, path: filePath });
13980
+ }
13981
+ return entries;
13982
+ }
13983
+ async getBranchState(localPath) {
13984
+ const repoResult = await this.runGit(localPath, ["rev-parse", "--show-toplevel"]);
13985
+ if (repoResult.exitCode !== 0) {
13986
+ return {
13987
+ isRepo: false,
13988
+ branchName: null,
13989
+ hasUpstream: false,
13990
+ hasHead: false
13991
+ };
13992
+ }
13993
+ const branchResult = await this.runGit(localPath, [
13994
+ "symbolic-ref",
13995
+ "--quiet",
13996
+ "--short",
13997
+ "HEAD"
13998
+ ]);
13999
+ const headResult = await this.runGit(localPath, ["rev-parse", "--verify", "HEAD"]);
14000
+ const hasHead = headResult.exitCode === 0;
14001
+ const detachedHeadResult = hasHead && branchResult.exitCode !== 0 ? await this.runGit(localPath, ["rev-parse", "--abbrev-ref", "HEAD"]) : null;
14002
+ const upstreamResult = await this.runGit(localPath, [
14003
+ "rev-parse",
14004
+ "--abbrev-ref",
14005
+ "--symbolic-full-name",
14006
+ "@{upstream}"
14007
+ ]);
14008
+ return {
14009
+ isRepo: true,
14010
+ branchName: branchResult.exitCode === 0 ? branchResult.stdout : detachedHeadResult && detachedHeadResult.stdout !== "HEAD" ? detachedHeadResult.stdout : null,
14011
+ hasUpstream: upstreamResult.exitCode === 0 && upstreamResult.stdout.length > 0,
14012
+ hasHead
14013
+ };
14014
+ }
14015
+ async getDiffSnapshot(localPath) {
14016
+ const branchState = await this.getBranchState(localPath);
14017
+ if (!branchState.isRepo) {
14018
+ return {
14019
+ status: "not_repo",
14020
+ branchName: branchState.branchName,
14021
+ hasUpstream: false,
14022
+ files: [],
14023
+ error: null,
14024
+ refreshedAt: Date.now()
14025
+ };
14026
+ }
14027
+ const statuses = await this.getStatusEntries(localPath);
14028
+ const trackedDiff = await this.runGitRaw(localPath, branchState.hasHead ? ["diff", "--no-ext-diff", "--find-renames", "--patch", "HEAD", "--"] : ["diff", "--no-ext-diff", "--find-renames", "--cached", "--patch", "--"]);
14029
+ if (trackedDiff.exitCode !== 0) {
14030
+ throw new Error(trackedDiff.stderr || "git diff failed");
14031
+ }
14032
+ const trackedPatches = splitPatchByFile(trackedDiff.stdout);
14033
+ const files = (await Promise.all(statuses.map(async (entry) => this.getDiffFile(localPath, entry, trackedPatches)))).filter((value) => value !== null);
14034
+ return {
14035
+ status: "ready",
14036
+ branchName: branchState.branchName,
14037
+ hasUpstream: branchState.hasUpstream,
14038
+ files,
14039
+ error: null,
14040
+ refreshedAt: Date.now()
14041
+ };
14042
+ }
14043
+ async getDiffFile(localPath, entry, trackedPatches) {
14044
+ const absolutePath = path14.join(localPath, entry.path);
14045
+ const isUntracked = entry.indexStatus === "?" && entry.worktreeStatus === "?";
14046
+ let patch = "";
14047
+ let patchAvailable = true;
14048
+ let patchSummary = null;
14049
+ if (isUntracked) {
14050
+ try {
14051
+ const fileStat = await stat4(absolutePath);
14052
+ if (fileStat.size > MAX_UNTRACKED_PREVIEW_BYTES) {
14053
+ patchAvailable = false;
14054
+ patchSummary = "File too large to preview.";
14055
+ } else {
14056
+ const content = await readFile3(absolutePath);
14057
+ if (isBinaryBuffer(content)) {
14058
+ patchAvailable = false;
14059
+ patchSummary = "Binary file.";
14060
+ } else {
14061
+ patch = buildUntrackedFilePatch(entry.path, new TextDecoder("utf-8").decode(content));
14062
+ }
14063
+ }
14064
+ } catch {
14065
+ patchAvailable = false;
14066
+ patchSummary = "File is no longer available for preview.";
14067
+ }
14068
+ } else {
14069
+ patch = trackedPatches.get(normalizeDiffPath(entry.path)) ?? "";
14070
+ }
14071
+ if (patchAvailable && !patch.trim()) {
14072
+ return null;
14073
+ }
14074
+ return {
14075
+ path: entry.path,
14076
+ previousPath: entry.originalPath ?? null,
14077
+ patch,
14078
+ patchAvailable,
14079
+ patchSummary,
14080
+ changeType: this.getChangeType(entry)
14081
+ };
14082
+ }
14083
+ getChangeType(entry) {
14084
+ if (entry.indexStatus === "?" && entry.worktreeStatus === "?") {
14085
+ return "untracked";
14086
+ }
14087
+ if (entry.indexStatus === "R" || entry.worktreeStatus === "R") {
14088
+ return "renamed";
14089
+ }
14090
+ if (entry.indexStatus === "C" || entry.worktreeStatus === "C") {
14091
+ return "added";
14092
+ }
14093
+ if (entry.indexStatus === "D" || entry.worktreeStatus === "D") {
14094
+ return "deleted";
14095
+ }
14096
+ if (entry.indexStatus === "A" || entry.worktreeStatus === "A") {
14097
+ return "added";
14098
+ }
14099
+ return "modified";
14100
+ }
14101
+ async commitPaths(localPath, paths, summary, description) {
14102
+ const selectedPaths = [
14103
+ ...new Set(paths.filter((value) => value.length > 0))
14104
+ ];
14105
+ if (selectedPaths.length === 0) {
14106
+ throw new Error("No file paths were provided.");
14107
+ }
14108
+ const addResult = await this.runGit(localPath, [
14109
+ "add",
14110
+ "--",
14111
+ ...selectedPaths
14112
+ ]);
14113
+ if (addResult.exitCode !== 0) {
14114
+ throw new Error(addResult.stderr || "Failed to stage selected files.");
14115
+ }
14116
+ const message = description.trim() ? `${summary.trim()}
14117
+
14118
+ ${description.trim()}` : summary.trim();
14119
+ const commitResult = await this.runGit(localPath, [
14120
+ "commit",
14121
+ "--only",
14122
+ "-m",
14123
+ message,
14124
+ "--",
14125
+ ...selectedPaths
14126
+ ]);
14127
+ if (commitResult.exitCode !== 0) {
14128
+ throw new Error(commitResult.stderr || "Failed to create commit.");
14129
+ }
14130
+ }
14131
+ async pushCurrentBranch(localPath) {
14132
+ const result = await this.runGit(localPath, ["push"]);
14133
+ if (result.exitCode !== 0) {
14134
+ throw new Error(result.stderr || "Failed to push current branch.");
14135
+ }
14136
+ }
13562
14137
  async getBranches(localPath) {
13563
14138
  const [branchResult, headResult] = await Promise.all([
13564
14139
  this.runGit(localPath, ["branch"]),
@@ -13577,7 +14152,11 @@ class GitManager {
13577
14152
  if (result.exitCode !== 0) {
13578
14153
  throw new Error(result.stderr || `Failed to switch to branch "${branchName}"`);
13579
14154
  }
13580
- const head = await this.runGit(localPath, ["rev-parse", "--abbrev-ref", "HEAD"]);
14155
+ const head = await this.runGit(localPath, [
14156
+ "rev-parse",
14157
+ "--abbrev-ref",
14158
+ "HEAD"
14159
+ ]);
13581
14160
  return { currentBranch: head.stdout };
13582
14161
  }
13583
14162
  async createBranch(localPath, branchName, checkout) {
@@ -13586,7 +14165,11 @@ class GitManager {
13586
14165
  if (result.exitCode !== 0) {
13587
14166
  throw new Error(result.stderr || `Failed to create branch "${branchName}"`);
13588
14167
  }
13589
- const head = await this.runGit(localPath, ["rev-parse", "--abbrev-ref", "HEAD"]);
14168
+ const head = await this.runGit(localPath, [
14169
+ "rev-parse",
14170
+ "--abbrev-ref",
14171
+ "HEAD"
14172
+ ]);
13590
14173
  return { currentBranch: head.stdout };
13591
14174
  }
13592
14175
  async setProjectMetadataDirectoryCommitMode(localPath, commitProjectMetadata) {
@@ -13609,11 +14192,240 @@ class GitManager {
13609
14192
  }
13610
14193
  }
13611
14194
 
14195
+ // src/server/generate-commit-message.ts
14196
+ import path15 from "path";
14197
+ function toSentenceCase(value) {
14198
+ if (!value)
14199
+ return value;
14200
+ return value.charAt(0).toUpperCase() + value.slice(1);
14201
+ }
14202
+ function summarizePath(path16) {
14203
+ const segments = path16.split(/[\\/]/u).filter(Boolean);
14204
+ return segments.at(-1) ?? path16;
14205
+ }
14206
+ function describeChange(file) {
14207
+ switch (file.changeType) {
14208
+ case "added":
14209
+ case "untracked":
14210
+ return `add ${summarizePath(file.path)}`;
14211
+ case "deleted":
14212
+ return `remove ${summarizePath(file.path)}`;
14213
+ case "renamed": {
14214
+ const previousPath = file.previousPath ?? file.path;
14215
+ const from = summarizePath(previousPath);
14216
+ const to = summarizePath(file.path);
14217
+ return path15.basename(previousPath) === path15.basename(file.path) ? `rename ${previousPath} to ${file.path}` : `rename ${from} to ${to}`;
14218
+ }
14219
+ default:
14220
+ return `update ${summarizePath(file.path)}`;
14221
+ }
14222
+ }
14223
+ function generateCommitMessage(files) {
14224
+ if (files.length === 0) {
14225
+ return {
14226
+ subject: "Update project files",
14227
+ body: ""
14228
+ };
14229
+ }
14230
+ const primarySummary = describeChange(files[0]);
14231
+ const remainingCount = files.length - 1;
14232
+ const subject = remainingCount > 0 ? `${toSentenceCase(primarySummary)} and ${remainingCount} more change${remainingCount === 1 ? "" : "s"}` : toSentenceCase(primarySummary);
14233
+ const body = files.map((file) => {
14234
+ const pathText = file.changeType === "renamed" && file.previousPath ? `${file.previousPath} -> ${file.path}` : file.path;
14235
+ return `- ${file.changeType}: ${pathText}`;
14236
+ }).join(`
14237
+ `);
14238
+ return { subject, body };
14239
+ }
14240
+
14241
+ // src/server/diff-store.ts
14242
+ function normalizePathForMatch(value) {
14243
+ return value.replaceAll("\\", "/");
14244
+ }
14245
+ function uniquePaths(paths) {
14246
+ return [...new Set(paths.filter((value) => value.length > 0))];
14247
+ }
14248
+
14249
+ class DiffStore {
14250
+ git;
14251
+ snapshots = new Map;
14252
+ refreshStateByProjectId = new Map;
14253
+ constructor(git = new GitManager) {
14254
+ this.git = git;
14255
+ }
14256
+ getSnapshot(projectId) {
14257
+ return this.snapshots.get(projectId) ?? null;
14258
+ }
14259
+ clearSnapshot(projectId) {
14260
+ this.snapshots.delete(projectId);
14261
+ this.refreshStateByProjectId.delete(projectId);
14262
+ }
14263
+ async refreshProjectDiffSnapshot({
14264
+ projectId,
14265
+ localPath,
14266
+ force = false
14267
+ }) {
14268
+ const currentState = this.refreshStateByProjectId.get(projectId);
14269
+ if (currentState?.inFlight) {
14270
+ if (force || currentState.localPath !== localPath) {
14271
+ currentState.localPath = localPath;
14272
+ currentState.needsRefresh = true;
14273
+ }
14274
+ return currentState.inFlight;
14275
+ }
14276
+ const refreshState = currentState ?? {
14277
+ inFlight: null,
14278
+ localPath,
14279
+ needsRefresh: false
14280
+ };
14281
+ refreshState.localPath = localPath;
14282
+ const refreshPromise = this.runRefresh(projectId, refreshState);
14283
+ refreshState.inFlight = refreshPromise;
14284
+ this.refreshStateByProjectId.set(projectId, refreshState);
14285
+ return refreshPromise;
14286
+ }
14287
+ async getSnapshotForPath({
14288
+ projectId,
14289
+ localPath
14290
+ }) {
14291
+ const snapshot = this.getSnapshot(projectId);
14292
+ const refreshState = this.refreshStateByProjectId.get(projectId);
14293
+ if (snapshot && refreshState?.localPath === localPath && refreshState.inFlight === null) {
14294
+ return snapshot;
14295
+ }
14296
+ return this.refreshProjectDiffSnapshot({ projectId, localPath });
14297
+ }
14298
+ async generateCommitMessage(args) {
14299
+ const snapshot = await this.getSnapshotForPath({
14300
+ projectId: args.projectId,
14301
+ localPath: args.localPath
14302
+ });
14303
+ const selected = this.getSelectedFiles(snapshot.files, args.paths);
14304
+ return generateCommitMessage(selected);
14305
+ }
14306
+ async commitDiffs({
14307
+ projectId,
14308
+ localPath,
14309
+ paths,
14310
+ summary,
14311
+ description,
14312
+ mode
14313
+ }) {
14314
+ const snapshot = await this.getSnapshotForPath({ projectId, localPath });
14315
+ const selectedFiles = this.getSelectedFiles(snapshot.files, paths);
14316
+ if (selectedFiles.length === 0) {
14317
+ return {
14318
+ ok: false,
14319
+ mode,
14320
+ title: "No changes selected",
14321
+ message: "Select at least one changed file before creating a commit.",
14322
+ detail: null,
14323
+ localCommitCreated: false,
14324
+ snapshotChanged: false
14325
+ };
14326
+ }
14327
+ try {
14328
+ await this.git.commitPaths(localPath, uniquePaths(selectedFiles.flatMap((file) => file.changeType === "renamed" && file.previousPath ? [file.path, file.previousPath] : [file.path])), summary, description);
14329
+ } catch (error) {
14330
+ const detail = error instanceof Error ? error.message : String(error);
14331
+ const nextSnapshot = await this.refreshProjectDiffSnapshot({
14332
+ projectId,
14333
+ localPath,
14334
+ force: true
14335
+ });
14336
+ return {
14337
+ ok: false,
14338
+ mode,
14339
+ title: "Commit failed",
14340
+ message: "Kaizen could not create a commit from the selected changes.",
14341
+ detail,
14342
+ localCommitCreated: false,
14343
+ snapshotChanged: !areDiffSnapshotsEquivalent(snapshot, nextSnapshot)
14344
+ };
14345
+ }
14346
+ let pushError = null;
14347
+ if (mode === "commit_and_push") {
14348
+ const branchState = await this.git.getBranchState(localPath);
14349
+ if (!branchState.hasUpstream) {
14350
+ pushError = new Error("No upstream branch is configured for the current branch.");
14351
+ } else {
14352
+ try {
14353
+ await this.git.pushCurrentBranch(localPath);
14354
+ } catch (error) {
14355
+ pushError = error instanceof Error ? error : new Error(String(error));
14356
+ }
14357
+ }
14358
+ }
14359
+ await this.refreshProjectDiffSnapshot({
14360
+ projectId,
14361
+ localPath,
14362
+ force: true
14363
+ });
14364
+ if (pushError) {
14365
+ return {
14366
+ ok: false,
14367
+ mode,
14368
+ title: mode === "commit_and_push" ? "Commit created, push failed" : "Commit failed",
14369
+ message: mode === "commit_and_push" ? "The selected changes were committed locally, but Kaizen could not push them." : pushError.message,
14370
+ detail: pushError.message,
14371
+ localCommitCreated: true,
14372
+ snapshotChanged: true
14373
+ };
14374
+ }
14375
+ return {
14376
+ ok: true,
14377
+ mode,
14378
+ title: mode === "commit_and_push" ? "Committed and pushed" : "Commit created",
14379
+ message: mode === "commit_and_push" ? "The selected changes were committed and pushed." : "The selected changes were committed.",
14380
+ detail: null,
14381
+ localCommitCreated: true,
14382
+ snapshotChanged: true
14383
+ };
14384
+ }
14385
+ getSelectedFiles(files, paths) {
14386
+ const selected = new Set(uniquePaths(paths).map(normalizePathForMatch));
14387
+ return files.filter((file) => selected.has(normalizePathForMatch(file.path)));
14388
+ }
14389
+ async runRefresh(projectId, refreshState) {
14390
+ let snapshot = null;
14391
+ while (true) {
14392
+ refreshState.needsRefresh = false;
14393
+ snapshot = await this.git.getDiffSnapshot(refreshState.localPath).catch((error) => ({
14394
+ status: "error",
14395
+ branchName: null,
14396
+ hasUpstream: false,
14397
+ files: [],
14398
+ error: error instanceof Error ? error.message : String(error),
14399
+ refreshedAt: Date.now()
14400
+ }));
14401
+ this.snapshots.set(projectId, snapshot);
14402
+ if (!refreshState.needsRefresh) {
14403
+ break;
14404
+ }
14405
+ }
14406
+ refreshState.inFlight = null;
14407
+ return snapshot;
14408
+ }
14409
+ }
14410
+ function areDiffSnapshotsEquivalent(left, right) {
14411
+ if (left === right)
14412
+ return true;
14413
+ if (!left || !right)
14414
+ return false;
14415
+ if (left.status !== right.status || left.branchName !== right.branchName || left.hasUpstream !== right.hasUpstream || (left.error ?? null) !== (right.error ?? null) || left.files.length !== right.files.length) {
14416
+ return false;
14417
+ }
14418
+ return left.files.every((file, index) => {
14419
+ const other = right.files[index];
14420
+ return other && file.path === other.path && (file.previousPath ?? null) === (other.previousPath ?? null) && file.changeType === other.changeType && file.patch === other.patch && file.patchAvailable === other.patchAvailable && (file.patchSummary ?? null) === (other.patchSummary ?? null);
14421
+ });
14422
+ }
14423
+
13612
14424
  // src/server/keybindings.ts
13613
14425
  import { watch } from "fs";
13614
14426
  import { mkdir as mkdir4, readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
13615
14427
  import { homedir as homedir10 } from "os";
13616
- import path15 from "path";
14428
+ import path16 from "path";
13617
14429
  var KEYBINDING_ACTIONS = Object.keys(DEFAULT_KEYBINDINGS);
13618
14430
  var SELF_WRITE_WATCH_DEBOUNCE_MS = 250;
13619
14431
 
@@ -13628,7 +14440,7 @@ class KeybindingsManager {
13628
14440
  this.snapshot = createDefaultSnapshot(this.filePath);
13629
14441
  }
13630
14442
  async initialize() {
13631
- await mkdir4(path15.dirname(this.filePath), { recursive: true });
14443
+ await mkdir4(path16.dirname(this.filePath), { recursive: true });
13632
14444
  const file = Bun.file(this.filePath);
13633
14445
  if (!await file.exists()) {
13634
14446
  await writeFile4(this.filePath, `${JSON.stringify(DEFAULT_KEYBINDINGS, null, 2)}
@@ -13657,7 +14469,7 @@ class KeybindingsManager {
13657
14469
  }
13658
14470
  async write(bindings) {
13659
14471
  const nextSnapshot = normalizeKeybindings(bindings, this.filePath);
13660
- await mkdir4(path15.dirname(this.filePath), { recursive: true });
14472
+ await mkdir4(path16.dirname(this.filePath), { recursive: true });
13661
14473
  this.ignoreWatchEventsUntil = Date.now() + SELF_WRITE_WATCH_DEBOUNCE_MS;
13662
14474
  await writeFile4(this.filePath, `${JSON.stringify(nextSnapshot.bindings, null, 2)}
13663
14475
  `, "utf8");
@@ -13673,8 +14485,8 @@ class KeybindingsManager {
13673
14485
  startWatching() {
13674
14486
  this.watcher?.close();
13675
14487
  try {
13676
- this.watcher = watch(path15.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
13677
- if (filename && filename !== path15.basename(this.filePath)) {
14488
+ this.watcher = watch(path16.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
14489
+ if (filename && filename !== path16.basename(this.filePath)) {
13678
14490
  return;
13679
14491
  }
13680
14492
  if (Date.now() <= this.ignoreWatchEventsUntil) {
@@ -13760,7 +14572,7 @@ function formatDisplayPath(filePath) {
13760
14572
  const homePath = homedir10();
13761
14573
  if (filePath === homePath)
13762
14574
  return "~";
13763
- if (filePath.startsWith(`${homePath}${path15.sep}`)) {
14575
+ if (filePath.startsWith(`${homePath}${path16.sep}`)) {
13764
14576
  return `~${filePath.slice(homePath.length)}`;
13765
14577
  }
13766
14578
  return filePath;
@@ -13770,7 +14582,7 @@ function formatDisplayPath(filePath) {
13770
14582
  import { watch as watch2 } from "fs";
13771
14583
  import { mkdir as mkdir5, readFile as readFile5, writeFile as writeFile5 } from "fs/promises";
13772
14584
  import { homedir as homedir11 } from "os";
13773
- import path16 from "path";
14585
+ import path17 from "path";
13774
14586
  var PROVIDER_IDS = Object.keys(DEFAULT_PROVIDER_SETTINGS);
13775
14587
 
13776
14588
  class ProviderSettingsManager {
@@ -13783,7 +14595,7 @@ class ProviderSettingsManager {
13783
14595
  this.snapshot = createDefaultSnapshot2(this.filePath);
13784
14596
  }
13785
14597
  async initialize() {
13786
- await mkdir5(path16.dirname(this.filePath), { recursive: true });
14598
+ await mkdir5(path17.dirname(this.filePath), { recursive: true });
13787
14599
  const file = Bun.file(this.filePath);
13788
14600
  if (!await file.exists()) {
13789
14601
  await writeFile5(this.filePath, `${JSON.stringify(DEFAULT_PROVIDER_SETTINGS, null, 2)}
@@ -13812,7 +14624,7 @@ class ProviderSettingsManager {
13812
14624
  }
13813
14625
  async write(settings) {
13814
14626
  const nextSnapshot = normalizeProviderSettings(settings, this.filePath);
13815
- await mkdir5(path16.dirname(this.filePath), { recursive: true });
14627
+ await mkdir5(path17.dirname(this.filePath), { recursive: true });
13816
14628
  await writeFile5(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
13817
14629
  `, "utf8");
13818
14630
  this.setSnapshot(nextSnapshot);
@@ -13827,8 +14639,8 @@ class ProviderSettingsManager {
13827
14639
  startWatching() {
13828
14640
  this.watcher?.close();
13829
14641
  try {
13830
- this.watcher = watch2(path16.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
13831
- if (filename && filename !== path16.basename(this.filePath)) {
14642
+ this.watcher = watch2(path17.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
14643
+ if (filename && filename !== path17.basename(this.filePath)) {
13832
14644
  return;
13833
14645
  }
13834
14646
  this.reload().catch((error) => {
@@ -13892,7 +14704,7 @@ function formatDisplayPath2(filePath) {
13892
14704
  const homePath = homedir11();
13893
14705
  if (filePath === homePath)
13894
14706
  return "~";
13895
- if (filePath.startsWith(`${homePath}${path16.sep}`)) {
14707
+ if (filePath.startsWith(`${homePath}${path17.sep}`)) {
13896
14708
  return `~${filePath.slice(homePath.length)}`;
13897
14709
  }
13898
14710
  return filePath;
@@ -13902,7 +14714,7 @@ function formatDisplayPath2(filePath) {
13902
14714
  import { watch as watch3 } from "fs";
13903
14715
  import { mkdir as mkdir7, readdir as readdir3, readFile as readFile7, writeFile as writeFile7 } from "fs/promises";
13904
14716
  import { homedir as homedir13 } from "os";
13905
- import path19 from "path";
14717
+ import path20 from "path";
13906
14718
  // ../../packages/themes/src/builtins/catppuccin.json
13907
14719
  var catppuccin_default = {
13908
14720
  id: "catppuccin",
@@ -14583,21 +15395,21 @@ function serializeCssVariables(variables) {
14583
15395
  // src/server/managed-backgrounds.ts
14584
15396
  import { createHash } from "crypto";
14585
15397
  import { lookup } from "dns/promises";
14586
- import { mkdir as mkdir6, readFile as readFile6, rm as rm2, stat as stat4, writeFile as writeFile6 } from "fs/promises";
15398
+ import { mkdir as mkdir6, readFile as readFile6, rm as rm2, stat as stat5, writeFile as writeFile6 } from "fs/promises";
14587
15399
  import { isIP as isIP2 } from "net";
14588
15400
  import { homedir as homedir12 } from "os";
14589
- import path18 from "path";
15401
+ import path19 from "path";
14590
15402
  import sharp from "sharp";
14591
15403
 
14592
15404
  // src/server/backgrounds.ts
14593
15405
  import fs3 from "fs/promises";
14594
- import path17 from "path";
15406
+ import path18 from "path";
14595
15407
  import os from "os";
14596
15408
  var BACKGROUND_DIRS = [
14597
- path17.join(os.homedir(), ".local/share/backgrounds"),
15409
+ path18.join(os.homedir(), ".local/share/backgrounds"),
14598
15410
  "/usr/share/backgrounds",
14599
15411
  "/Library/Desktop Pictures",
14600
- path17.join(os.homedir(), "Pictures"),
15412
+ path18.join(os.homedir(), "Pictures"),
14601
15413
  process.platform === "win32" ? "C:\\Windows\\Web\\Wallpaper" : ""
14602
15414
  ].filter(Boolean);
14603
15415
  async function getSystemBackgrounds() {
@@ -14610,11 +15422,11 @@ async function getSystemBackgrounds() {
14610
15422
  const entries = await fs3.readdir(dir, { withFileTypes: true });
14611
15423
  for (const entry of entries) {
14612
15424
  if (entry.isDirectory()) {
14613
- await scanDir(path17.join(dir, entry.name), depth + 1);
15425
+ await scanDir(path18.join(dir, entry.name), depth + 1);
14614
15426
  } else if (entry.isFile()) {
14615
- const ext = path17.extname(entry.name).toLowerCase();
15427
+ const ext = path18.extname(entry.name).toLowerCase();
14616
15428
  if (ext === ".jpg" || ext === ".jpeg" || ext === ".png" || ext === ".webp") {
14617
- const fullPath = path17.join(dir, entry.name);
15429
+ const fullPath = path18.join(dir, entry.name);
14618
15430
  if (seen.has(fullPath))
14619
15431
  continue;
14620
15432
  seen.add(fullPath);
@@ -14660,8 +15472,8 @@ var MAX_REMOTE_BACKGROUND_BYTES = 20 * 1024 * 1024;
14660
15472
  function getManagedBackgroundPathsForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
14661
15473
  const sourceKey = createHash("sha256").update(source).digest("hex");
14662
15474
  return {
14663
- assetFilePath: path18.join(backgroundsDirectory, `${sourceKey}.webp`),
14664
- metadataFilePath: path18.join(backgroundsDirectory, `${sourceKey}.json`)
15475
+ assetFilePath: path19.join(backgroundsDirectory, `${sourceKey}.webp`),
15476
+ metadataFilePath: path19.join(backgroundsDirectory, `${sourceKey}.json`)
14665
15477
  };
14666
15478
  }
14667
15479
  async function deleteManagedBackgroundForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
@@ -14709,7 +15521,7 @@ async function cacheManagedBackgroundForSource(source, backgroundsDirectory = ge
14709
15521
  const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
14710
15522
  const resolvedSource = await resolveSource(source, options);
14711
15523
  const previousMetadata = await readManagedBackgroundMetadata(metadataFilePath);
14712
- const existingAsset = await stat4(assetFilePath).catch(() => null);
15524
+ const existingAsset = await stat5(assetFilePath).catch(() => null);
14713
15525
  if (existingAsset?.isFile() && previousMetadata?.fingerprint === resolvedSource.fingerprint) {
14714
15526
  return {
14715
15527
  assetFilePath,
@@ -14754,7 +15566,7 @@ async function readManagedBackgroundCache(source, backgroundsDirectory) {
14754
15566
  const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
14755
15567
  const [metadata, existingAsset] = await Promise.all([
14756
15568
  readManagedBackgroundMetadata(metadataFilePath),
14757
- stat4(assetFilePath).catch(() => null)
15569
+ stat5(assetFilePath).catch(() => null)
14758
15570
  ]);
14759
15571
  if (!existingAsset?.isFile() || !metadata?.fingerprint) {
14760
15572
  return null;
@@ -14771,7 +15583,7 @@ async function resolveSource(source, options) {
14771
15583
  if (!filePath) {
14772
15584
  throw new Error("Background image not found.");
14773
15585
  }
14774
- const info = await stat4(filePath);
15586
+ const info = await stat5(filePath);
14775
15587
  return {
14776
15588
  input: filePath,
14777
15589
  fingerprint: JSON.stringify({
@@ -15035,7 +15847,7 @@ class ThemeSettingsManager {
15035
15847
  });
15036
15848
  }
15037
15849
  async initialize() {
15038
- await mkdir7(path19.dirname(this.filePath), { recursive: true });
15850
+ await mkdir7(path20.dirname(this.filePath), { recursive: true });
15039
15851
  await mkdir7(this.themesDirectory, { recursive: true });
15040
15852
  await mkdir7(this.managedBackgroundsDirectory, { recursive: true });
15041
15853
  const file = Bun.file(this.filePath);
@@ -15085,7 +15897,7 @@ class ThemeSettingsManager {
15085
15897
  console.warn(`${LOG_PREFIX} Failed to warm managed background cache:`, error);
15086
15898
  }
15087
15899
  }
15088
- await mkdir7(path19.dirname(this.filePath), { recursive: true });
15900
+ await mkdir7(path20.dirname(this.filePath), { recursive: true });
15089
15901
  await writeFile7(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
15090
15902
  `, "utf8");
15091
15903
  if (previousBackgroundImage !== nextSnapshot.settings.backgroundImage) {
@@ -15117,8 +15929,8 @@ class ThemeSettingsManager {
15117
15929
  this.settingsWatcher?.close();
15118
15930
  this.themesWatcher?.close();
15119
15931
  try {
15120
- this.settingsWatcher = watch3(path19.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
15121
- if (filename && filename !== path19.basename(this.filePath))
15932
+ this.settingsWatcher = watch3(path20.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
15933
+ if (filename && filename !== path20.basename(this.filePath))
15122
15934
  return;
15123
15935
  this.reload().catch((error) => {
15124
15936
  console.warn(`${LOG_PREFIX} Failed to reload theme settings:`, error);
@@ -15219,7 +16031,7 @@ async function loadThemeRegistry(themesDirectory) {
15219
16031
  }
15220
16032
  const customThemeFiles = entries.filter((entry) => entry.endsWith(".json") && !entry.endsWith(".example.json")).sort((left, right) => left.localeCompare(right));
15221
16033
  for (const fileName of customThemeFiles) {
15222
- const absolutePath = path19.join(themesDirectory, fileName);
16034
+ const absolutePath = path20.join(themesDirectory, fileName);
15223
16035
  try {
15224
16036
  const text = await readFile7(absolutePath, "utf8");
15225
16037
  const parsed = parseThemeDefinition(JSON.parse(text));
@@ -15283,7 +16095,168 @@ function formatDisplayPath3(filePath) {
15283
16095
  const homePath = homedir13();
15284
16096
  if (filePath === homePath)
15285
16097
  return "~";
15286
- if (filePath.startsWith(`${homePath}${path19.sep}`)) {
16098
+ if (filePath.startsWith(`${homePath}${path20.sep}`)) {
16099
+ return `~${filePath.slice(homePath.length)}`;
16100
+ }
16101
+ return filePath;
16102
+ }
16103
+
16104
+ // src/server/general-settings.ts
16105
+ import { watch as watch4 } from "fs";
16106
+ import { mkdir as mkdir8, readFile as readFile8, writeFile as writeFile8 } from "fs/promises";
16107
+ import { homedir as homedir14 } from "os";
16108
+ import path21 from "path";
16109
+ var SELF_WRITE_WATCH_DEBOUNCE_MS2 = 250;
16110
+
16111
+ class GeneralSettingsManager {
16112
+ filePath;
16113
+ watcher = null;
16114
+ snapshot;
16115
+ ignoreWatchEventsUntil = 0;
16116
+ updateQueue = Promise.resolve();
16117
+ listeners = new Set;
16118
+ constructor(filePath = getGeneralSettingsFilePath(homedir14())) {
16119
+ this.filePath = filePath;
16120
+ this.snapshot = createDefaultSnapshot4(this.filePath);
16121
+ }
16122
+ async initialize() {
16123
+ await mkdir8(path21.dirname(this.filePath), { recursive: true });
16124
+ const file = Bun.file(this.filePath);
16125
+ if (!await file.exists()) {
16126
+ await writeFile8(this.filePath, `${JSON.stringify(DEFAULT_GENERAL_SETTINGS, null, 2)}
16127
+ `, "utf8");
16128
+ }
16129
+ await this.reload();
16130
+ this.startWatching();
16131
+ }
16132
+ dispose() {
16133
+ this.watcher?.close();
16134
+ this.watcher = null;
16135
+ this.listeners.clear();
16136
+ }
16137
+ getSnapshot() {
16138
+ return this.snapshot;
16139
+ }
16140
+ onChange(listener) {
16141
+ this.listeners.add(listener);
16142
+ return () => {
16143
+ this.listeners.delete(listener);
16144
+ };
16145
+ }
16146
+ async reload() {
16147
+ return this.enqueueUpdate(async () => {
16148
+ const nextSnapshot = await readGeneralSettingsSnapshot(this.filePath);
16149
+ this.setSnapshot(nextSnapshot);
16150
+ return nextSnapshot;
16151
+ });
16152
+ }
16153
+ async write(settings) {
16154
+ return this.enqueueUpdate(async () => {
16155
+ const nextSnapshot = normalizeGeneralSettings(settings, this.filePath);
16156
+ await mkdir8(path21.dirname(this.filePath), { recursive: true });
16157
+ this.ignoreWatchEventsUntil = Date.now() + SELF_WRITE_WATCH_DEBOUNCE_MS2;
16158
+ await writeFile8(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
16159
+ `, "utf8");
16160
+ this.setSnapshot(nextSnapshot);
16161
+ return nextSnapshot;
16162
+ });
16163
+ }
16164
+ setSnapshot(snapshot) {
16165
+ this.snapshot = snapshot;
16166
+ for (const listener of this.listeners) {
16167
+ listener(snapshot);
16168
+ }
16169
+ }
16170
+ enqueueUpdate(update) {
16171
+ const result = this.updateQueue.then(update);
16172
+ this.updateQueue = result.then(() => {
16173
+ return;
16174
+ }, () => {
16175
+ return;
16176
+ });
16177
+ return result;
16178
+ }
16179
+ startWatching() {
16180
+ this.watcher?.close();
16181
+ try {
16182
+ this.watcher = watch4(path21.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
16183
+ if (filename && filename !== path21.basename(this.filePath)) {
16184
+ return;
16185
+ }
16186
+ if (Date.now() <= this.ignoreWatchEventsUntil) {
16187
+ return;
16188
+ }
16189
+ this.reload().catch((error) => {
16190
+ console.warn(`${LOG_PREFIX} Failed to reload general settings:`, error);
16191
+ });
16192
+ });
16193
+ this.watcher.on("error", (error) => {
16194
+ console.warn(`${LOG_PREFIX} Failed to watch general settings file:`, error);
16195
+ this.watcher?.close();
16196
+ this.watcher = null;
16197
+ });
16198
+ } catch (error) {
16199
+ console.warn(`${LOG_PREFIX} Failed to watch general settings file:`, error);
16200
+ this.watcher = null;
16201
+ }
16202
+ }
16203
+ }
16204
+ async function readGeneralSettingsSnapshot(filePath) {
16205
+ try {
16206
+ const text = await readFile8(filePath, "utf8");
16207
+ if (!text.trim()) {
16208
+ return createDefaultSnapshot4(filePath, "General settings file was empty. Using defaults.");
16209
+ }
16210
+ const parsed = JSON.parse(text);
16211
+ return normalizeGeneralSettings(parsed, filePath);
16212
+ } catch (error) {
16213
+ if (error?.code === "ENOENT") {
16214
+ return createDefaultSnapshot4(filePath);
16215
+ }
16216
+ if (error instanceof SyntaxError) {
16217
+ return createDefaultSnapshot4(filePath, "General settings file is invalid JSON. Using defaults.");
16218
+ }
16219
+ throw error;
16220
+ }
16221
+ }
16222
+ function normalizeGeneralSettings(value, filePath = getGeneralSettingsFilePath(homedir14())) {
16223
+ const source = value && typeof value === "object" && !Array.isArray(value) ? value : null;
16224
+ if (!source) {
16225
+ return createDefaultSnapshot4(filePath, "General settings file must contain a JSON object. Using defaults.");
16226
+ }
16227
+ const warnings = [];
16228
+ let sendChunkSizeBytes = DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
16229
+ const rawSendChunkSize = source.sendChunkSizeBytes;
16230
+ if (rawSendChunkSize !== undefined) {
16231
+ if (typeof rawSendChunkSize === "number" && Number.isFinite(rawSendChunkSize)) {
16232
+ const normalizedValue = Math.round(rawSendChunkSize);
16233
+ if (normalizedValue >= MIN_SEND_CHUNK_SIZE_BYTES && normalizedValue <= MAX_SEND_CHUNK_SIZE_BYTES) {
16234
+ sendChunkSizeBytes = normalizedValue;
16235
+ } else {
16236
+ warnings.push(`sendChunkSizeBytes must be between ${MIN_SEND_CHUNK_SIZE_BYTES} and ${MAX_SEND_CHUNK_SIZE_BYTES}`);
16237
+ }
16238
+ } else {
16239
+ warnings.push("sendChunkSizeBytes must be a number");
16240
+ }
16241
+ }
16242
+ return {
16243
+ settings: { sendChunkSizeBytes },
16244
+ warning: warnings.length > 0 ? `Some general settings were reset to defaults: ${warnings.join("; ")}` : null,
16245
+ filePathDisplay: formatDisplayPath4(filePath)
16246
+ };
16247
+ }
16248
+ function createDefaultSnapshot4(filePath, warning = null) {
16249
+ return {
16250
+ settings: { ...DEFAULT_GENERAL_SETTINGS },
16251
+ warning,
16252
+ filePathDisplay: formatDisplayPath4(filePath)
16253
+ };
16254
+ }
16255
+ function formatDisplayPath4(filePath) {
16256
+ const homePath = homedir14();
16257
+ if (filePath === homePath)
16258
+ return "~";
16259
+ if (filePath.startsWith(`${homePath}${path21.sep}`)) {
15287
16260
  return `~${filePath.slice(homePath.length)}`;
15288
16261
  }
15289
16262
  return filePath;
@@ -15516,7 +16489,7 @@ function getMachineDisplayName() {
15516
16489
  }
15517
16490
 
15518
16491
  // src/server/terminal-manager.ts
15519
- import path20 from "path";
16492
+ import path22 from "path";
15520
16493
  import process8 from "process";
15521
16494
  import defaultShell, { detectDefaultShell } from "default-shell";
15522
16495
  import { Terminal } from "@xterm/headless";
@@ -15555,7 +16528,7 @@ function resolveShellArgs(shellPath) {
15555
16528
  if (process8.platform === "win32") {
15556
16529
  return [];
15557
16530
  }
15558
- const shellName = path20.basename(shellPath);
16531
+ const shellName = path22.basename(shellPath);
15559
16532
  if (["bash", "zsh", "fish", "sh", "ksh"].includes(shellName)) {
15560
16533
  return ["-l"];
15561
16534
  }
@@ -15649,7 +16622,7 @@ class TerminalManager {
15649
16622
  const cols = normalizeTerminalDimension(args.cols, DEFAULT_COLS);
15650
16623
  const rows = normalizeTerminalDimension(args.rows, DEFAULT_ROWS);
15651
16624
  const scrollback = clampScrollback(args.scrollback);
15652
- const title = path20.basename(shell) || "shell";
16625
+ const title = path22.basename(shell) || "shell";
15653
16626
  const headless = new Terminal({
15654
16627
  cols,
15655
16628
  rows,
@@ -16013,13 +16986,13 @@ class UpdateManager {
16013
16986
 
16014
16987
  // src/server/recovery.ts
16015
16988
  import { existsSync as existsSync10, readFileSync as readFileSync7, readdirSync as readdirSync8, statSync as statSync7 } from "fs";
16016
- import { homedir as homedir14 } from "os";
16017
- import path22 from "path";
16989
+ import { homedir as homedir15 } from "os";
16990
+ import path24 from "path";
16018
16991
 
16019
16992
  // src/server/cursor-chat-store.ts
16020
16993
  import { Database as Database2 } from "bun:sqlite";
16021
16994
  import { existsSync as existsSync9, readdirSync as readdirSync7, statSync as statSync6 } from "fs";
16022
- import path21 from "path";
16995
+ import path23 from "path";
16023
16996
  function decodeMetaValue(value) {
16024
16997
  try {
16025
16998
  const decoded = Buffer.from(value, "hex").toString("utf8");
@@ -16074,7 +17047,7 @@ function extractWorkspacePath(value) {
16074
17047
  if (!match) {
16075
17048
  return null;
16076
17049
  }
16077
- return path21.normalize(match[1].trim());
17050
+ return path23.normalize(match[1].trim());
16078
17051
  }
16079
17052
  function unwrapCursorTaggedText(value) {
16080
17053
  const trimmed = value.trim();
@@ -16150,7 +17123,7 @@ function readBlobRows(database) {
16150
17123
  return database.query("select id, data from blobs").all();
16151
17124
  }
16152
17125
  function collectCursorChatStorePaths(homeDir) {
16153
- const chatsRoot = path21.join(homeDir, ".cursor", "chats");
17126
+ const chatsRoot = path23.join(homeDir, ".cursor", "chats");
16154
17127
  if (!existsSync9(chatsRoot)) {
16155
17128
  return [];
16156
17129
  }
@@ -16158,11 +17131,11 @@ function collectCursorChatStorePaths(homeDir) {
16158
17131
  for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
16159
17132
  if (!parent.isDirectory())
16160
17133
  continue;
16161
- const parentPath = path21.join(chatsRoot, parent.name);
17134
+ const parentPath = path23.join(chatsRoot, parent.name);
16162
17135
  for (const child of readdirSync7(parentPath, { withFileTypes: true })) {
16163
17136
  if (!child.isDirectory())
16164
17137
  continue;
16165
- const storePath = path21.join(parentPath, child.name, "store.db");
17138
+ const storePath = path23.join(parentPath, child.name, "store.db");
16166
17139
  if (existsSync9(storePath)) {
16167
17140
  storePaths.push(storePath);
16168
17141
  }
@@ -16171,14 +17144,14 @@ function collectCursorChatStorePaths(homeDir) {
16171
17144
  return storePaths;
16172
17145
  }
16173
17146
  function findCursorChatStorePath(homeDir, sessionToken) {
16174
- const chatsRoot = path21.join(homeDir, ".cursor", "chats");
17147
+ const chatsRoot = path23.join(homeDir, ".cursor", "chats");
16175
17148
  if (!existsSync9(chatsRoot)) {
16176
17149
  return null;
16177
17150
  }
16178
17151
  for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
16179
17152
  if (!parent.isDirectory())
16180
17153
  continue;
16181
- const candidate = path21.join(chatsRoot, parent.name, sessionToken, "store.db");
17154
+ const candidate = path23.join(chatsRoot, parent.name, sessionToken, "store.db");
16182
17155
  if (existsSync9(candidate)) {
16183
17156
  return candidate;
16184
17157
  }
@@ -16352,7 +17325,7 @@ function collectFiles(directory, extension) {
16352
17325
  }
16353
17326
  const files = [];
16354
17327
  for (const entry of readdirSync8(directory, { withFileTypes: true })) {
16355
- const fullPath = path22.join(directory, entry.name);
17328
+ const fullPath = path24.join(directory, entry.name);
16356
17329
  if (entry.isDirectory()) {
16357
17330
  files.push(...collectFiles(fullPath, extension));
16358
17331
  continue;
@@ -16490,7 +17463,7 @@ function markSkippedSession(skippedSessionKeys, provider, sessionToken) {
16490
17463
  }
16491
17464
  }
16492
17465
  function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
16493
- const projectsDir = path22.join(homeDir, ".claude", "projects");
17466
+ const projectsDir = path24.join(homeDir, ".claude", "projects");
16494
17467
  const chats = [];
16495
17468
  for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
16496
17469
  const head = peekFileHead(sessionFile, 2048);
@@ -16507,8 +17480,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
16507
17480
  if (!peekedSessionToken && typeof record.sessionId === "string") {
16508
17481
  peekedSessionToken = record.sessionId;
16509
17482
  }
16510
- if (!peekedSessionLocalPath && typeof record.cwd === "string" && path22.isAbsolute(record.cwd)) {
16511
- peekedSessionLocalPath = path22.normalize(record.cwd);
17483
+ if (!peekedSessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
17484
+ peekedSessionLocalPath = path24.normalize(record.cwd);
16512
17485
  }
16513
17486
  peekedEntries.push(...claudeEntriesFromRecord(record));
16514
17487
  }
@@ -16538,8 +17511,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
16538
17511
  if (!sessionToken && typeof record.sessionId === "string") {
16539
17512
  sessionToken = record.sessionId;
16540
17513
  }
16541
- if (!sessionLocalPath && typeof record.cwd === "string" && path22.isAbsolute(record.cwd)) {
16542
- sessionLocalPath = path22.normalize(record.cwd);
17514
+ if (!sessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
17515
+ sessionLocalPath = path24.normalize(record.cwd);
16543
17516
  }
16544
17517
  const timestamp = typeof record.timestamp === "string" ? Date.parse(record.timestamp) : Number.NaN;
16545
17518
  if (!Number.isNaN(timestamp)) {
@@ -16723,12 +17696,12 @@ function cursorEntriesFromRecord(record, index, sessionToken, fallbackBaseTimest
16723
17696
  ];
16724
17697
  }
16725
17698
  function findCursorTranscriptPath(args) {
16726
- const transcriptRoot = path22.join(args.homeDir, ".cursor", "projects", encodeCursorProjectPath(path22.normalize(args.localPath)), "agent-transcripts");
16727
- const directPath = path22.join(transcriptRoot, args.sessionToken, `${args.sessionToken}.jsonl`);
17699
+ const transcriptRoot = path24.join(args.homeDir, ".cursor", "projects", encodeCursorProjectPath(path24.normalize(args.localPath)), "agent-transcripts");
17700
+ const directPath = path24.join(transcriptRoot, args.sessionToken, `${args.sessionToken}.jsonl`);
16728
17701
  if (existsSync10(directPath)) {
16729
17702
  return directPath;
16730
17703
  }
16731
- return collectFiles(transcriptRoot, ".jsonl").find((sourcePath) => path22.basename(sourcePath, ".jsonl") === args.sessionToken) ?? null;
17704
+ return collectFiles(transcriptRoot, ".jsonl").find((sourcePath) => path24.basename(sourcePath, ".jsonl") === args.sessionToken) ?? null;
16732
17705
  }
16733
17706
  function isCodexSubagentSession(payload) {
16734
17707
  if (typeof payload.forked_from_id === "string" && payload.forked_from_id.trim()) {
@@ -16742,7 +17715,7 @@ function isCodexSubagentSession(payload) {
16742
17715
  return Boolean(sourceRecord.subagent);
16743
17716
  }
16744
17717
  function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
16745
- const sessionsDir = path22.join(homeDir, ".codex", "sessions");
17718
+ const sessionsDir = path24.join(homeDir, ".codex", "sessions");
16746
17719
  const chats = [];
16747
17720
  for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
16748
17721
  const head = peekFileHead(sessionFile, 2048);
@@ -16756,7 +17729,7 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16756
17729
  if (payload && typeof payload === "object" && !Array.isArray(payload)) {
16757
17730
  const payloadRecord = payload;
16758
17731
  const peekedSessionToken = typeof payloadRecord.id === "string" ? payloadRecord.id : null;
16759
- const peekedSessionLocalPath = typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd) ? path22.normalize(payloadRecord.cwd) : null;
17732
+ const peekedSessionLocalPath = typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd) ? path24.normalize(payloadRecord.cwd) : null;
16760
17733
  if (isCodexSubagentSession(payloadRecord)) {
16761
17734
  markSkippedSession(skippedSessionKeys, "codex", peekedSessionToken);
16762
17735
  continue;
@@ -16805,8 +17778,8 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16805
17778
  if (!sessionToken && typeof payloadRecord.id === "string") {
16806
17779
  sessionToken = payloadRecord.id;
16807
17780
  }
16808
- if (!sessionLocalPath && typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16809
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17781
+ if (!sessionLocalPath && typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17782
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16810
17783
  }
16811
17784
  }
16812
17785
  }
@@ -16842,13 +17815,13 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16842
17815
  function collectProjectChats(homeDir, trackedWorktreePaths, existingSessionKeys) {
16843
17816
  const skippedSessionKeys = new Set;
16844
17817
  const cursorTranscriptChats = [...trackedWorktreePaths].flatMap((localPath) => {
16845
- const transcriptsDir = path22.join(homeDir, ".cursor", "projects", encodeCursorProjectPath(localPath), "agent-transcripts");
17818
+ const transcriptsDir = path24.join(homeDir, ".cursor", "projects", encodeCursorProjectPath(localPath), "agent-transcripts");
16846
17819
  const chats = [];
16847
17820
  for (const sessionFile of collectFiles(transcriptsDir, ".jsonl")) {
16848
17821
  const lines = readFileSync7(sessionFile, "utf8").split(`
16849
17822
  `);
16850
17823
  const entries = [];
16851
- const sessionToken = path22.basename(sessionFile, ".jsonl");
17824
+ const sessionToken = path24.basename(sessionFile, ".jsonl");
16852
17825
  const sourceMtimeMs = statSync7(sessionFile).mtimeMs;
16853
17826
  const modifiedAt = sourceMtimeMs;
16854
17827
  lines.forEach((line, index) => {
@@ -16917,7 +17890,7 @@ function loadClaudeSessionEntries(args) {
16917
17890
  return [];
16918
17891
  }
16919
17892
  function loadClaudeSessionEntriesFromFilesystem(args) {
16920
- const projectsDir = path22.join(args.homeDir, ".claude", "projects", encodeClaudeProjectPath(path22.normalize(args.localPath)));
17893
+ const projectsDir = path24.join(args.homeDir, ".claude", "projects", encodeClaudeProjectPath(path24.normalize(args.localPath)));
16921
17894
  for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
16922
17895
  const lines = readFileSync7(sessionFile, "utf8").split(`
16923
17896
  `);
@@ -16959,8 +17932,8 @@ function loadCodexSessionEntries(args) {
16959
17932
  if (payloadRecord.id === args.session.sessionToken) {
16960
17933
  matched = true;
16961
17934
  }
16962
- if (typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16963
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17935
+ if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17936
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16964
17937
  }
16965
17938
  }
16966
17939
  }
@@ -16968,13 +17941,13 @@ function loadCodexSessionEntries(args) {
16968
17941
  entries.push(...codexEntriesFromRecord(record, index));
16969
17942
  }
16970
17943
  });
16971
- if (matched && sessionLocalPath === path22.normalize(args.session.localPath)) {
17944
+ if (matched && sessionLocalPath === path24.normalize(args.session.localPath)) {
16972
17945
  return entries;
16973
17946
  }
16974
17947
  return [];
16975
17948
  }
16976
17949
  function loadCodexSessionEntriesFromFilesystem(args) {
16977
- const sessionsDir = path22.join(args.homeDir, ".codex", "sessions");
17950
+ const sessionsDir = path24.join(args.homeDir, ".codex", "sessions");
16978
17951
  for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
16979
17952
  const lines = readFileSync7(sessionFile, "utf8").split(`
16980
17953
  `);
@@ -16994,8 +17967,8 @@ function loadCodexSessionEntriesFromFilesystem(args) {
16994
17967
  if (payloadRecord.id === args.sessionToken) {
16995
17968
  matched = true;
16996
17969
  }
16997
- if (typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16998
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17970
+ if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17971
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16999
17972
  }
17000
17973
  }
17001
17974
  }
@@ -17003,7 +17976,7 @@ function loadCodexSessionEntriesFromFilesystem(args) {
17003
17976
  entries.push(...codexEntriesFromRecord(record, index));
17004
17977
  }
17005
17978
  });
17006
- if (matched && sessionLocalPath === path22.normalize(args.localPath)) {
17979
+ if (matched && sessionLocalPath === path24.normalize(args.localPath)) {
17007
17980
  return entries;
17008
17981
  }
17009
17982
  }
@@ -17051,14 +18024,14 @@ function loadCursorSessionEntriesFromFilesystem(args) {
17051
18024
  return [];
17052
18025
  }
17053
18026
  const metadata = readCursorChatStoreMetadata(chatStorePath);
17054
- if (metadata?.localPath !== path22.normalize(args.localPath)) {
18027
+ if (metadata?.localPath !== path24.normalize(args.localPath)) {
17055
18028
  return [];
17056
18029
  }
17057
18030
  return loadCursorChatStoreEntries(chatStorePath);
17058
18031
  }
17059
18032
  function loadProviderSessionEntries(args) {
17060
18033
  const startedAt = performance.now();
17061
- const root = args.homeDir ?? homedir14();
18034
+ const root = args.homeDir ?? homedir15();
17062
18035
  const indexedSession = args.provider === "claude" || args.provider === "codex" || args.provider === "cursor" ? args.providerSessionIndex?.getSession(args.provider, args.sessionToken) : null;
17063
18036
  const entries = args.provider === "claude" && indexedSession ? loadClaudeSessionEntries({
17064
18037
  session: indexedSession
@@ -17096,8 +18069,8 @@ function hydrateProviderSessionWindow(args) {
17096
18069
  });
17097
18070
  }
17098
18071
  async function importProjectHistory(args) {
17099
- const normalizedPaths = new Set(args.worktreePaths.map((worktreePath) => path22.normalize(worktreePath)));
17100
- normalizedPaths.add(path22.normalize(args.localPath));
18072
+ const normalizedPaths = new Set(args.worktreePaths.map((worktreePath) => path24.normalize(worktreePath)));
18073
+ normalizedPaths.add(path24.normalize(args.localPath));
17101
18074
  if (args.store.isProjectHidden(args.repoKey)) {
17102
18075
  return {
17103
18076
  importedChatIds: [],
@@ -17119,7 +18092,7 @@ async function importProjectHistory(args) {
17119
18092
  entries: []
17120
18093
  })),
17121
18094
  skippedSessionKeys: new Set
17122
- } : collectProjectChats(args.homeDir ?? homedir14(), normalizedPaths, existingSessionKeys);
18095
+ } : collectProjectChats(args.homeDir ?? homedir15(), normalizedPaths, existingSessionKeys);
17123
18096
  for (const chat of existingChats.filter((candidate) => {
17124
18097
  if (!candidate.provider || !candidate.sessionToken)
17125
18098
  return false;
@@ -17214,8 +18187,8 @@ function isClientEnvelope(value) {
17214
18187
  }
17215
18188
 
17216
18189
  // src/server/external-open.ts
17217
- import { stat as stat5 } from "fs/promises";
17218
- import path23 from "path";
18190
+ import { stat as stat6 } from "fs/promises";
18191
+ import path25 from "path";
17219
18192
  import process9 from "process";
17220
18193
  var DEFAULT_EDITOR_SETTINGS = {
17221
18194
  preset: "cursor",
@@ -17224,7 +18197,7 @@ var DEFAULT_EDITOR_SETTINGS = {
17224
18197
  async function openExternal(command) {
17225
18198
  const resolvedPath = resolveLocalPath(command.localPath);
17226
18199
  const platform = process9.platform;
17227
- const info = command.action === "open_editor" || command.action === "open_finder" ? await stat5(resolvedPath).catch(() => null) : null;
18200
+ const info = command.action === "open_editor" || command.action === "open_finder" ? await stat6(resolvedPath).catch(() => null) : null;
17228
18201
  if (command.action === "open_editor") {
17229
18202
  if (!info) {
17230
18203
  throw new Error(`Path not found: ${resolvedPath}`);
@@ -17273,7 +18246,7 @@ async function openExternal(command) {
17273
18246
  }
17274
18247
  }
17275
18248
  if (command.action === "open_finder") {
17276
- spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath : path23.dirname(resolvedPath)]);
18249
+ spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath : path25.dirname(resolvedPath)]);
17277
18250
  return;
17278
18251
  }
17279
18252
  if (command.action === "open_terminal") {
@@ -17470,9 +18443,19 @@ function createRealtimeDeltaPublisher({
17470
18443
  function publishSidebarEvent(event) {
17471
18444
  publishToSubscriptions((topic) => topic.type === "sidebar", event);
17472
18445
  }
18446
+ function refreshChatSnapshot(chatId) {
18447
+ for (const ws of sockets) {
18448
+ for (const [id, topic] of ws.data.subscriptions.entries()) {
18449
+ if (topic.type === "chat" && topic.chatId === chatId) {
18450
+ sendSnapshot(ws, id, topic);
18451
+ }
18452
+ }
18453
+ }
18454
+ }
17473
18455
  return {
17474
18456
  sendInitialSnapshot: sendSnapshot,
17475
18457
  sendRefreshSnapshot: sendSnapshot,
18458
+ refreshChatSnapshot,
17476
18459
  publishChatMessageAppended(chatId, entry) {
17477
18460
  publishChatEvent(chatId, { type: "chat.message-appended", chatId, entry });
17478
18461
  },
@@ -17494,6 +18477,13 @@ function createRealtimeDeltaPublisher({
17494
18477
  publishChatPendingToolSet(chatId, pendingTool) {
17495
18478
  publishChatEvent(chatId, { type: "chat.pending-tool-set", chatId, pendingTool });
17496
18479
  },
18480
+ publishChatOutboundQueueSet(chatId, queuedMessages) {
18481
+ publishChatEvent(chatId, {
18482
+ type: "chat.outbound-queue-set",
18483
+ chatId,
18484
+ queuedMessages
18485
+ });
18486
+ },
17497
18487
  publishChatSessionTokenSet(chatId, sessionToken, hydrationState) {
17498
18488
  publishChatEvent(chatId, {
17499
18489
  type: "chat.session-token-set",
@@ -17668,9 +18658,7 @@ function resolveChatUsage({
17668
18658
  // src/server/ws-router.ts
17669
18659
  var PROVIDER_USAGE_POLL_INTERVAL_MS = 30 * 60 * 1000;
17670
18660
  var PROVIDER_USAGE_POLL_MAX_INTERVAL_MS = 31 * 60 * 1000;
17671
- var INITIAL_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
17672
18661
  var INITIAL_CHAT_WINDOW_MIN_ENTRIES = 240;
17673
- var LOAD_MORE_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
17674
18662
  var LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES = 200;
17675
18663
  function send(ws, message) {
17676
18664
  const payload = JSON.stringify(message);
@@ -17682,7 +18670,7 @@ function send(ws, message) {
17682
18670
  function hasSidebarSnapshotState(store) {
17683
18671
  return Boolean(store && typeof store === "object" && "state" in store && store.state && typeof store.state === "object");
17684
18672
  }
17685
- function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
18673
+ function getChatTranscriptWindow(store, providerSessionIndex, chatId, targetBytes, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
17686
18674
  const startedAt = performance.now();
17687
18675
  const chat = store.getChat(chatId);
17688
18676
  const hasLocalPayload = typeof store.hasLocalChatPayload === "function" ? store.hasLocalChatPayload(chatId) : true;
@@ -17692,7 +18680,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
17692
18680
  provider: chat.provider,
17693
18681
  sessionToken: chat.sessionToken,
17694
18682
  localPath: store.getProject(chat.projectId)?.localPath ?? "",
17695
- targetBytes: INITIAL_CHAT_WINDOW_TARGET_BYTES,
18683
+ targetBytes,
17696
18684
  minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES,
17697
18685
  providerSessionIndex
17698
18686
  });
@@ -17715,7 +18703,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
17715
18703
  }
17716
18704
  if (typeof store.getMessageWindow === "function") {
17717
18705
  const transcript = store.getMessageWindow(chatId, {
17718
- targetBytes: INITIAL_CHAT_WINDOW_TARGET_BYTES,
18706
+ targetBytes,
17719
18707
  minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES
17720
18708
  });
17721
18709
  performanceDiagnostics.recordTiming("chat_open_snapshot_latency_ms", Math.round(performance.now() - startedAt), { chatId, source: "local" });
@@ -17743,6 +18731,8 @@ function topicKey(topic) {
17743
18731
  return `feature-overview:${topic.featureId}`;
17744
18732
  case "chat":
17745
18733
  return `chat:${topic.chatId}`;
18734
+ case "project-diffs":
18735
+ return `project-diffs:${topic.projectId}`;
17746
18736
  default:
17747
18737
  return topic.type;
17748
18738
  }
@@ -17753,7 +18743,9 @@ function createWsRouter({
17753
18743
  providerSessionIndex,
17754
18744
  terminals,
17755
18745
  git,
18746
+ diffs: providedDiffs,
17756
18747
  keybindings,
18748
+ generalSettings,
17757
18749
  providerSettings,
17758
18750
  providerCatalogManager,
17759
18751
  remoteAuth,
@@ -17776,7 +18768,9 @@ function createWsRouter({
17776
18768
  openUrlCommand = openUrl2,
17777
18769
  resolveChatUsageForSnapshot = resolveChatUsage
17778
18770
  }) {
18771
+ const diffs = providedDiffs ?? new DiffStore(git);
17779
18772
  const sockets = new Set;
18773
+ const getSendChunkSizeBytes = () => generalSettings?.getSnapshot().settings.sendChunkSizeBytes ?? DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
17780
18774
  const realtime = createRealtimeDeltaPublisher({
17781
18775
  sockets,
17782
18776
  send,
@@ -17853,6 +18847,16 @@ function createWsRouter({
17853
18847
  data: keybindings.getSnapshot()
17854
18848
  };
17855
18849
  }
18850
+ if (topic.type === "general-settings") {
18851
+ return {
18852
+ type: "general-settings",
18853
+ data: generalSettings?.getSnapshot() ?? {
18854
+ settings: DEFAULT_GENERAL_SETTINGS,
18855
+ warning: null,
18856
+ filePathDisplay: ""
18857
+ }
18858
+ };
18859
+ }
17856
18860
  if (topic.type === "theme-settings") {
17857
18861
  return {
17858
18862
  type: "theme-settings",
@@ -17913,17 +18917,23 @@ function createWsRouter({
17913
18917
  data: store.getFeatureOverviewSnapshot(topic.featureId)
17914
18918
  };
17915
18919
  }
18920
+ if (topic.type === "project-diffs") {
18921
+ return {
18922
+ type: "project-diffs",
18923
+ data: diffs.getSnapshot(topic.projectId)
18924
+ };
18925
+ }
17916
18926
  return {
17917
18927
  type: "chat",
17918
18928
  data: (() => {
17919
18929
  const chat = store.getChat(topic.chatId);
17920
- const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
18930
+ const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, getSendChunkSizeBytes(), warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
17921
18931
  const messages = transcript.entries;
17922
18932
  return deriveChatSnapshot(store.state, agent.getChatStatus(topic.chatId), topic.chatId, () => transcript, () => getLastChatModel(store, topic.chatId), agent.getChatPendingTool(topic.chatId), resolveChatUsageForSnapshot({
17923
18933
  chat,
17924
18934
  messages,
17925
18935
  liveUsage: agent.getLiveUsage(topic.chatId)
17926
- }), providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS, providerCatalogManager?.getSelectableProviders(providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS));
18936
+ }), null, providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS, providerCatalogManager?.getSelectableProviders(providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS), agent.getQueuedOutboundPreview(topic.chatId));
17927
18937
  })()
17928
18938
  };
17929
18939
  }
@@ -17977,6 +18987,24 @@ function createWsRouter({
17977
18987
  }
17978
18988
  }
17979
18989
  }
18990
+ function pushProjectDiffSnapshot(projectId) {
18991
+ const snapshot = deriveSnapshotForTopic({ type: "project-diffs", projectId });
18992
+ for (const ws of sockets) {
18993
+ for (const [id, topic] of ws.data.subscriptions.entries()) {
18994
+ if (topic.type !== "project-diffs" || topic.projectId !== projectId) {
18995
+ continue;
18996
+ }
18997
+ send(ws, {
18998
+ v: PROTOCOL_VERSION,
18999
+ type: "snapshot",
19000
+ id,
19001
+ seq: (ws.data.seqBySubscriptionId.get(id) ?? 0) + 1,
19002
+ snapshot
19003
+ });
19004
+ ws.data.seqBySubscriptionId.set(id, (ws.data.seqBySubscriptionId.get(id) ?? 0) + 1);
19005
+ }
19006
+ }
19007
+ }
17980
19008
  function pushFeatureOverviewSnapshot(featureId) {
17981
19009
  for (const ws of sockets) {
17982
19010
  for (const [id, topic] of ws.data.subscriptions.entries()) {
@@ -18014,6 +19042,22 @@ function createWsRouter({
18014
19042
  }
18015
19043
  }
18016
19044
  });
19045
+ let lastSendChunkSizeBytes = generalSettings?.getSnapshot().settings.sendChunkSizeBytes ?? DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
19046
+ const disposeGeneralSettingsEvents = generalSettings?.onChange((snapshot) => {
19047
+ const previousSendChunkSizeBytes = lastSendChunkSizeBytes;
19048
+ lastSendChunkSizeBytes = snapshot.settings.sendChunkSizeBytes;
19049
+ for (const ws of sockets) {
19050
+ for (const [id, topic] of ws.data.subscriptions.entries()) {
19051
+ if (topic.type === "general-settings") {
19052
+ realtime.sendRefreshSnapshot(ws, id, topic);
19053
+ continue;
19054
+ }
19055
+ if (topic.type === "chat" && previousSendChunkSizeBytes !== lastSendChunkSizeBytes) {
19056
+ realtime.sendRefreshSnapshot(ws, id, topic);
19057
+ }
19058
+ }
19059
+ }
19060
+ }) ?? (() => {});
18017
19061
  const disposeThemeSettingsEvents = themeSettings.onChange(() => {
18018
19062
  for (const ws of sockets) {
18019
19063
  for (const [id, topic] of ws.data.subscriptions.entries()) {
@@ -18142,6 +19186,14 @@ function createWsRouter({
18142
19186
  });
18143
19187
  return;
18144
19188
  }
19189
+ case "settings.writeGeneralSettings": {
19190
+ if (!generalSettings) {
19191
+ throw new Error("General settings unavailable.");
19192
+ }
19193
+ const snapshot = await generalSettings.write(command.settings);
19194
+ send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result: snapshot });
19195
+ return;
19196
+ }
18145
19197
  case "settings.readKeybindings": {
18146
19198
  send(ws, {
18147
19199
  v: PROTOCOL_VERSION,
@@ -18304,6 +19356,7 @@ function createWsRouter({
18304
19356
  }
18305
19357
  await store.hideProject(project.localPath);
18306
19358
  realtime.publishSidebarProjectRemoved(project.id);
19359
+ diffs.clearSnapshot(project.id);
18307
19360
  }
18308
19361
  await refreshDiscovery();
18309
19362
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18338,6 +19391,7 @@ function createWsRouter({
18338
19391
  await store.hideProject(command.localPath);
18339
19392
  if (existingProject) {
18340
19393
  realtime.publishSidebarProjectRemoved(existingProject.id);
19394
+ diffs.clearSnapshot(existingProject.id);
18341
19395
  }
18342
19396
  await refreshDiscovery();
18343
19397
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18532,11 +19586,35 @@ function createWsRouter({
18532
19586
  await agent.cancel(command.chatId);
18533
19587
  agent.disposeChatResources(command.chatId);
18534
19588
  await store.deleteChat(command.chatId);
19589
+ if (store.listChatsByProject(chat.projectId).length === 0) {
19590
+ diffs.clearSnapshot(chat.projectId);
19591
+ }
18535
19592
  realtime.publishChatDeleted(command.chatId);
18536
19593
  realtime.publishSidebarChatRemoved(chat.projectId, chat.featureId ?? null, command.chatId);
18537
19594
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
18538
19595
  break;
18539
19596
  }
19597
+ case "project.refreshDiffs": {
19598
+ const project = store.getProject(command.projectId);
19599
+ if (!project)
19600
+ throw new Error("Project not found");
19601
+ const previousSnapshot = diffs.getSnapshot(command.projectId);
19602
+ const snapshot = await diffs.refreshProjectDiffSnapshot({
19603
+ projectId: command.projectId,
19604
+ localPath: project.localPath
19605
+ });
19606
+ const changed = !areDiffSnapshotsEquivalent(previousSnapshot, snapshot);
19607
+ send(ws, {
19608
+ v: PROTOCOL_VERSION,
19609
+ type: "ack",
19610
+ id,
19611
+ result: { changed }
19612
+ });
19613
+ if (changed) {
19614
+ pushProjectDiffSnapshot(command.projectId);
19615
+ }
19616
+ break;
19617
+ }
18540
19618
  case "chat.loadMore": {
18541
19619
  const chat = store.getChat(command.chatId);
18542
19620
  const transcript = chat && !store.hasLocalChatPayload(command.chatId) && chat.provider && chat.sessionToken && (chat.provider === "claude" || chat.provider === "codex" || chat.provider === "cursor") ? hydrateProviderSessionWindow({
@@ -18544,12 +19622,12 @@ function createWsRouter({
18544
19622
  sessionToken: chat.sessionToken,
18545
19623
  localPath: store.getProject(chat.projectId)?.localPath ?? "",
18546
19624
  beforeEntryId: command.beforeEntryId,
18547
- targetBytes: command.targetBytes ?? LOAD_MORE_CHAT_WINDOW_TARGET_BYTES,
19625
+ targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
18548
19626
  minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES,
18549
19627
  providerSessionIndex
18550
19628
  }) : store.getMessageWindow(command.chatId, {
18551
19629
  beforeEntryId: command.beforeEntryId,
18552
- targetBytes: command.targetBytes ?? LOAD_MORE_CHAT_WINDOW_TARGET_BYTES,
19630
+ targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
18553
19631
  minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES
18554
19632
  });
18555
19633
  const result = {
@@ -18595,6 +19673,16 @@ function createWsRouter({
18595
19673
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
18596
19674
  break;
18597
19675
  }
19676
+ case "chat.outboundQueue.remove": {
19677
+ await agent.removeOutboundQueueMessage(command.chatId, command.messageId);
19678
+ send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
19679
+ break;
19680
+ }
19681
+ case "chat.outboundQueue.update": {
19682
+ await agent.updateOutboundQueueMessage(command.chatId, command.messageId, command.text);
19683
+ send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
19684
+ break;
19685
+ }
18598
19686
  case "chat.cancel": {
18599
19687
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
18600
19688
  agent.cancel(command.chatId).catch((error) => {
@@ -18602,6 +19690,44 @@ function createWsRouter({
18602
19690
  });
18603
19691
  break;
18604
19692
  }
19693
+ case "chat.generateCommitMessage": {
19694
+ const chat = store.getChat(command.chatId);
19695
+ if (!chat)
19696
+ throw new Error("Chat not found");
19697
+ const project = store.getProject(chat.projectId);
19698
+ if (!project)
19699
+ throw new Error("Project not found");
19700
+ const result = await diffs.generateCommitMessage({
19701
+ projectId: project.id,
19702
+ localPath: project.localPath,
19703
+ paths: command.paths
19704
+ });
19705
+ send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
19706
+ break;
19707
+ }
19708
+ case "chat.commitDiffs": {
19709
+ const chat = store.getChat(command.chatId);
19710
+ if (!chat)
19711
+ throw new Error("Chat not found");
19712
+ const project = store.getProject(chat.projectId);
19713
+ if (!project)
19714
+ throw new Error("Project not found");
19715
+ const previousSnapshot = diffs.getSnapshot(project.id);
19716
+ const result = await diffs.commitDiffs({
19717
+ projectId: project.id,
19718
+ localPath: project.localPath,
19719
+ paths: command.paths,
19720
+ summary: command.summary,
19721
+ description: command.description,
19722
+ mode: command.mode
19723
+ });
19724
+ send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
19725
+ const nextSnapshot = diffs.getSnapshot(project.id);
19726
+ if (result.snapshotChanged && !areDiffSnapshotsEquivalent(previousSnapshot, nextSnapshot)) {
19727
+ pushProjectDiffSnapshot(project.id);
19728
+ }
19729
+ break;
19730
+ }
18605
19731
  case "chat.respondTool": {
18606
19732
  await agent.respondTool(command);
18607
19733
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18751,6 +19877,7 @@ function createWsRouter({
18751
19877
  }
18752
19878
  disposeTerminalEvents();
18753
19879
  disposeKeybindingEvents();
19880
+ disposeGeneralSettingsEvents();
18754
19881
  disposeProviderSettingsEvents();
18755
19882
  disposeProviderCatalogEvents();
18756
19883
  disposeRemoteAuthEvents();
@@ -18788,10 +19915,10 @@ var remoteRelaySnapshotFallback = {
18788
19915
  };
18789
19916
 
18790
19917
  // src/server/remote-auth.ts
18791
- import { watch as watch4 } from "fs";
18792
- import { chmod, mkdir as mkdir8, readFile as readFile8, rename as rename2, writeFile as writeFile8 } from "fs/promises";
18793
- import { homedir as homedir15 } from "os";
18794
- import path24 from "path";
19918
+ import { watch as watch5 } from "fs";
19919
+ import { chmod, mkdir as mkdir9, readFile as readFile9, rename as rename2, writeFile as writeFile9 } from "fs/promises";
19920
+ import { homedir as homedir16 } from "os";
19921
+ import path26 from "path";
18795
19922
 
18796
19923
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.js
18797
19924
  var exports_external = {};
@@ -19268,8 +20395,8 @@ function getErrorMap() {
19268
20395
  }
19269
20396
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js
19270
20397
  var makeIssue = (params) => {
19271
- const { data, path: path24, errorMaps, issueData } = params;
19272
- const fullPath = [...path24, ...issueData.path || []];
20398
+ const { data, path: path26, errorMaps, issueData } = params;
20399
+ const fullPath = [...path26, ...issueData.path || []];
19273
20400
  const fullIssue = {
19274
20401
  ...issueData,
19275
20402
  path: fullPath
@@ -19381,11 +20508,11 @@ var errorUtil;
19381
20508
 
19382
20509
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/types.js
19383
20510
  class ParseInputLazyPath {
19384
- constructor(parent, value, path24, key) {
20511
+ constructor(parent, value, path26, key) {
19385
20512
  this._cachedPath = [];
19386
20513
  this.parent = parent;
19387
20514
  this.data = value;
19388
- this._path = path24;
20515
+ this._path = path26;
19389
20516
  this._key = key;
19390
20517
  }
19391
20518
  get path() {
@@ -23072,8 +24199,8 @@ function dedupeCallbackUrls(values) {
23072
24199
  return [...new Set(values)];
23073
24200
  }
23074
24201
  function getRemoteAuthTokenFilePath(stateFilePath) {
23075
- const parsedPath = path24.parse(stateFilePath);
23076
- return path24.join(parsedPath.dir, `${parsedPath.name}.tokens${parsedPath.ext}`);
24202
+ const parsedPath = path26.parse(stateFilePath);
24203
+ return path26.join(parsedPath.dir, `${parsedPath.name}.tokens${parsedPath.ext}`);
23077
24204
  }
23078
24205
  function buildAllowedRemoteAuthCallbackUrls(localBaseUrl) {
23079
24206
  const currentUrl = new URL(localBaseUrl);
@@ -23238,7 +24365,7 @@ function formatJwksErrorBodyPreview(bodyText) {
23238
24365
  }
23239
24366
  async function writeFileAtomically(filePath, contents, options) {
23240
24367
  const tempFilePath = `${filePath}.${crypto.randomUUID()}.tmp`;
23241
- await writeFile8(tempFilePath, contents, {
24368
+ await writeFile9(tempFilePath, contents, {
23242
24369
  encoding: "utf8",
23243
24370
  mode: options?.mode
23244
24371
  });
@@ -23262,14 +24389,14 @@ class RemoteAuthManager {
23262
24389
  state;
23263
24390
  snapshot;
23264
24391
  listeners = new Set;
23265
- constructor(filePath = getRemoteAuthFilePath(homedir15())) {
24392
+ constructor(filePath = getRemoteAuthFilePath(homedir16())) {
23266
24393
  this.filePath = filePath;
23267
24394
  this.tokenFilePath = getRemoteAuthTokenFilePath(filePath);
23268
24395
  this.state = normalizeStoredRemoteAuthState(null);
23269
24396
  this.snapshot = createSnapshot2(this.state, getRemoteAuthFilePathDisplay());
23270
24397
  }
23271
24398
  async initialize() {
23272
- await mkdir8(path24.dirname(this.filePath), { recursive: true });
24399
+ await mkdir9(path26.dirname(this.filePath), { recursive: true });
23273
24400
  const file = Bun.file(this.filePath);
23274
24401
  if (!await file.exists()) {
23275
24402
  await this.persistState(normalizeStoredRemoteAuthState(null));
@@ -23604,7 +24731,7 @@ class RemoteAuthManager {
23604
24731
  throw lastError ?? new Error("Failed to fetch Kaizen JWKS");
23605
24732
  }
23606
24733
  async persistState(state) {
23607
- await mkdir8(path24.dirname(this.filePath), { recursive: true });
24734
+ await mkdir9(path26.dirname(this.filePath), { recursive: true });
23608
24735
  const { metadata, tokens } = splitStoredState(state);
23609
24736
  await writeFileAtomically(this.tokenFilePath, `${JSON.stringify(tokens, null, 2)}
23610
24737
  `, {
@@ -23665,10 +24792,10 @@ class RemoteAuthManager {
23665
24792
  startWatching() {
23666
24793
  this.watcher?.close();
23667
24794
  try {
23668
- this.watcher = watch4(path24.dirname(this.filePath), { persistent: false }, (eventType, filename) => {
24795
+ this.watcher = watch5(path26.dirname(this.filePath), { persistent: false }, (eventType, filename) => {
23669
24796
  if (eventType !== "change" && eventType !== "rename")
23670
24797
  return;
23671
- if (filename && filename !== path24.basename(this.filePath) && filename !== path24.basename(this.tokenFilePath)) {
24798
+ if (filename && filename !== path26.basename(this.filePath) && filename !== path26.basename(this.tokenFilePath)) {
23672
24799
  return;
23673
24800
  }
23674
24801
  this.reloadFromDisk().catch((error) => {
@@ -23683,7 +24810,7 @@ class RemoteAuthManager {
23683
24810
  }
23684
24811
  async function readRemoteAuthState(filePath, tokenFilePath) {
23685
24812
  try {
23686
- const metadataText = await readFile8(filePath, "utf8");
24813
+ const metadataText = await readFile9(filePath, "utf8");
23687
24814
  const metadataValue = metadataText.trim() ? JSON.parse(metadataText) : null;
23688
24815
  const tokenValue = await readRemoteAuthTokens(tokenFilePath);
23689
24816
  const needsMigration = containsLegacyTokenFields(metadataValue) || tokenValue === null;
@@ -23707,7 +24834,7 @@ async function readRemoteAuthState(filePath, tokenFilePath) {
23707
24834
  }
23708
24835
  async function readRemoteAuthTokens(filePath) {
23709
24836
  try {
23710
- const text = await readFile8(filePath, "utf8");
24837
+ const text = await readFile9(filePath, "utf8");
23711
24838
  if (!text.trim()) {
23712
24839
  return null;
23713
24840
  }
@@ -23721,9 +24848,9 @@ async function readRemoteAuthTokens(filePath) {
23721
24848
  }
23722
24849
 
23723
24850
  // src/server/remote-relay.ts
23724
- import { mkdir as mkdir9, readFile as readFile9, writeFile as writeFile9 } from "fs/promises";
23725
- import { homedir as homedir16 } from "os";
23726
- import path25 from "path";
24851
+ import { mkdir as mkdir10, readFile as readFile10, writeFile as writeFile10 } from "fs/promises";
24852
+ import { homedir as homedir17 } from "os";
24853
+ import path27 from "path";
23727
24854
  var OFFLINE_POLL_INTERVAL_MS = 15000;
23728
24855
  var HOP_BY_HOP_HEADER_NAMES = new Set([
23729
24856
  "accept-encoding",
@@ -23840,7 +24967,7 @@ class RemoteRelayManager {
23840
24967
  reconnectAttempt = 0;
23841
24968
  isIdleDisconnected = false;
23842
24969
  proxiedSockets = new Map;
23843
- constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(homedir16())) {
24970
+ constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(homedir17())) {
23844
24971
  this.remoteAuth = remoteAuth;
23845
24972
  this.machineDisplayName = machineDisplayName;
23846
24973
  this.filePath = filePath;
@@ -23850,7 +24977,7 @@ class RemoteRelayManager {
23850
24977
  async initialize(localPort, localHost) {
23851
24978
  this.localPort = localPort;
23852
24979
  this.localHost = resolveUpstreamHost(localHost);
23853
- await mkdir9(path25.dirname(this.filePath), { recursive: true });
24980
+ await mkdir10(path27.dirname(this.filePath), { recursive: true });
23854
24981
  this.state = await this.readState();
23855
24982
  this.setSnapshot(createSnapshot3(this.state));
23856
24983
  this.remoteAuth.onChange(() => {
@@ -23881,7 +25008,7 @@ class RemoteRelayManager {
23881
25008
  }
23882
25009
  async readState() {
23883
25010
  try {
23884
- const text = await readFile9(this.filePath, "utf8");
25011
+ const text = await readFile10(this.filePath, "utf8");
23885
25012
  return normalizeState(JSON.parse(text));
23886
25013
  } catch {
23887
25014
  return normalizeState(null);
@@ -23889,7 +25016,7 @@ class RemoteRelayManager {
23889
25016
  }
23890
25017
  async persistState(state) {
23891
25018
  this.state = state;
23892
- await writeFile9(this.filePath, `${JSON.stringify(state, null, 2)}
25019
+ await writeFile10(this.filePath, `${JSON.stringify(state, null, 2)}
23893
25020
  `, "utf8");
23894
25021
  }
23895
25022
  setSnapshot(snapshot) {
@@ -24372,9 +25499,9 @@ class RemoteRelayManager {
24372
25499
 
24373
25500
  // src/server/provider-session-index.ts
24374
25501
  import { existsSync as existsSync11, readFileSync as readFileSync8, readdirSync as readdirSync9, statSync as statSync8 } from "fs";
24375
- import { mkdir as mkdir10, readFile as readFile10, rename as rename3, writeFile as writeFile10 } from "fs/promises";
24376
- import { homedir as homedir17 } from "os";
24377
- import path26 from "path";
25502
+ import { mkdir as mkdir11, readFile as readFile11, rename as rename3, writeFile as writeFile11 } from "fs/promises";
25503
+ import { homedir as homedir18 } from "os";
25504
+ import path28 from "path";
24378
25505
  var PROVIDER_SESSION_INDEX_VERSION = 1;
24379
25506
  var REFRESH_INTERVAL_MS = 60000;
24380
25507
  var CODEX_SESSION_METADATA_PEEK_BYTES = 128 * 1024;
@@ -24395,7 +25522,7 @@ function collectFiles2(directory, extension) {
24395
25522
  }
24396
25523
  const files = [];
24397
25524
  for (const entry of readdirSync9(directory, { withFileTypes: true })) {
24398
- const fullPath = path26.join(directory, entry.name);
25525
+ const fullPath = path28.join(directory, entry.name);
24399
25526
  if (entry.isDirectory()) {
24400
25527
  files.push(...collectFiles2(fullPath, extension));
24401
25528
  continue;
@@ -24407,7 +25534,7 @@ function collectFiles2(directory, extension) {
24407
25534
  return files;
24408
25535
  }
24409
25536
  function normalizePath(localPath) {
24410
- return path26.normalize(localPath);
25537
+ return path28.normalize(localPath);
24411
25538
  }
24412
25539
  function firstLine3(value, fallback) {
24413
25540
  const line = value.split(`
@@ -24441,7 +25568,7 @@ function readClaudeSessionMetadata(sourcePath) {
24441
25568
  if (!sessionToken && typeof record.sessionId === "string") {
24442
25569
  sessionToken = record.sessionId;
24443
25570
  }
24444
- if (!localPath && typeof record.cwd === "string" && path26.isAbsolute(record.cwd)) {
25571
+ if (!localPath && typeof record.cwd === "string" && path28.isAbsolute(record.cwd)) {
24445
25572
  localPath = normalizePath(record.cwd);
24446
25573
  }
24447
25574
  if (typeof record.timestamp === "string") {
@@ -24529,7 +25656,7 @@ function readCodexSessionMetadata2(sourcePath) {
24529
25656
  if (!sessionToken && typeof payloadRecord2.id === "string") {
24530
25657
  sessionToken = payloadRecord2.id;
24531
25658
  }
24532
- if (!localPath && typeof payloadRecord2.cwd === "string" && path26.isAbsolute(payloadRecord2.cwd)) {
25659
+ if (!localPath && typeof payloadRecord2.cwd === "string" && path28.isAbsolute(payloadRecord2.cwd)) {
24533
25660
  localPath = normalizePath(payloadRecord2.cwd);
24534
25661
  }
24535
25662
  }
@@ -24580,7 +25707,7 @@ function readCursorSessionMetadata(sourcePath, localPath) {
24580
25707
  const stats = statSync8(sourcePath);
24581
25708
  const lines = readFileSync8(sourcePath, "utf8").split(`
24582
25709
  `);
24583
- const sessionToken = path26.basename(sourcePath, ".jsonl");
25710
+ const sessionToken = path28.basename(sourcePath, ".jsonl");
24584
25711
  let title = null;
24585
25712
  for (const line of lines) {
24586
25713
  if (!line.trim())
@@ -24639,8 +25766,8 @@ class ProviderSessionIndex {
24639
25766
  sessionsByKey = new Map;
24640
25767
  refreshTimer = null;
24641
25768
  refreshInFlight = null;
24642
- constructor(dataDir, homeDir = homedir17()) {
24643
- this.indexPath = path26.join(dataDir, "provider-session-index.json");
25769
+ constructor(dataDir, homeDir = homedir18()) {
25770
+ this.indexPath = path28.join(dataDir, "provider-session-index.json");
24644
25771
  this.homeDir = homeDir;
24645
25772
  }
24646
25773
  async initialize() {
@@ -24687,7 +25814,7 @@ class ProviderSessionIndex {
24687
25814
  visiblePaths.add(normalizePath(worktreePath));
24688
25815
  }
24689
25816
  }
24690
- for (const sourcePath of collectFiles2(path26.join(this.homeDir, ".claude", "projects"), ".jsonl")) {
25817
+ for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".claude", "projects"), ".jsonl")) {
24691
25818
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readClaudeSessionMetadata(sourcePath);
24692
25819
  if (!metadata || !visiblePaths.has(metadata.localPath))
24693
25820
  continue;
@@ -24698,7 +25825,7 @@ class ProviderSessionIndex {
24698
25825
  indexedPaths.add(sourcePath);
24699
25826
  }
24700
25827
  }
24701
- for (const sourcePath of collectFiles2(path26.join(this.homeDir, ".codex", "sessions"), ".jsonl")) {
25828
+ for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".codex", "sessions"), ".jsonl")) {
24702
25829
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCodexSessionMetadata2(sourcePath);
24703
25830
  if (!metadata || !visiblePaths.has(metadata.localPath))
24704
25831
  continue;
@@ -24710,7 +25837,7 @@ class ProviderSessionIndex {
24710
25837
  }
24711
25838
  }
24712
25839
  for (const localPath of visiblePaths) {
24713
- const transcriptRoot = path26.join(this.homeDir, ".cursor", "projects", encodeCursorProjectPath2(localPath), "agent-transcripts");
25840
+ const transcriptRoot = path28.join(this.homeDir, ".cursor", "projects", encodeCursorProjectPath2(localPath), "agent-transcripts");
24714
25841
  for (const sourcePath of collectFiles2(transcriptRoot, ".jsonl")) {
24715
25842
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCursorSessionMetadata(sourcePath, localPath);
24716
25843
  if (!metadata)
@@ -24784,7 +25911,7 @@ class ProviderSessionIndex {
24784
25911
  async loadPersistedIndex() {
24785
25912
  if (!existsSync11(this.indexPath))
24786
25913
  return;
24787
- const raw = await readFile10(this.indexPath, "utf8").catch(() => "");
25914
+ const raw = await readFile11(this.indexPath, "utf8").catch(() => "");
24788
25915
  if (!raw.trim())
24789
25916
  return;
24790
25917
  try {
@@ -24816,8 +25943,8 @@ class ProviderSessionIndex {
24816
25943
  sessions: [...this.sessionsByKey.values()].sort(sessionSort)
24817
25944
  };
24818
25945
  const tempPath = `${this.indexPath}.tmp`;
24819
- await mkdir10(path26.dirname(this.indexPath), { recursive: true });
24820
- await writeFile10(tempPath, JSON.stringify(payload, null, 2), "utf8");
25946
+ await mkdir11(path28.dirname(this.indexPath), { recursive: true });
25947
+ await writeFile11(tempPath, JSON.stringify(payload, null, 2), "utf8");
24821
25948
  await rename3(tempPath, this.indexPath);
24822
25949
  }
24823
25950
  }
@@ -24857,10 +25984,13 @@ async function startKaizenServer(options = {}) {
24857
25984
  let router = null;
24858
25985
  const terminals = new TerminalManager;
24859
25986
  const git = new GitManager;
25987
+ const diffs = new DiffStore(git);
24860
25988
  const keybindings = new KeybindingsManager;
24861
25989
  await keybindings.initialize();
24862
25990
  const providerSettings = new ProviderSettingsManager;
24863
25991
  await providerSettings.initialize();
25992
+ const generalSettings = new GeneralSettingsManager;
25993
+ await generalSettings.initialize();
24864
25994
  const providerCatalogManager = new ProviderCatalogManager;
24865
25995
  await providerCatalogManager.initialize();
24866
25996
  const remoteAuth = new RemoteAuthManager;
@@ -24877,7 +26007,7 @@ async function startKaizenServer(options = {}) {
24877
26007
  }) : null;
24878
26008
  const agent = new AgentCoordinator({
24879
26009
  store,
24880
- attachmentsDir: path27.join(store.dataDir, "attachments"),
26010
+ attachmentsDir: path29.join(store.dataDir, "attachments"),
24881
26011
  providerSettingsManager: providerSettings,
24882
26012
  providerCatalogManager,
24883
26013
  remoteAuthManager: remoteAuth,
@@ -24902,7 +26032,9 @@ async function startKaizenServer(options = {}) {
24902
26032
  providerSessionIndex,
24903
26033
  terminals,
24904
26034
  git,
26035
+ diffs,
24905
26036
  keybindings,
26037
+ generalSettings,
24906
26038
  providerSettings,
24907
26039
  providerCatalogManager,
24908
26040
  remoteAuth,
@@ -24917,7 +26049,7 @@ async function startKaizenServer(options = {}) {
24917
26049
  agent.setRealtime(router.realtime);
24918
26050
  }
24919
26051
  providerSessionIndex.start(() => store.listProjects());
24920
- const distDir = path27.join(import.meta.dir, "..", "..", "dist", "client");
26052
+ const distDir = path29.join(import.meta.dir, "..", "..", "dist", "client");
24921
26053
  const MAX_PORT_ATTEMPTS = 20;
24922
26054
  let actualPort = port;
24923
26055
  for (let attempt = 0;attempt < MAX_PORT_ATTEMPTS; attempt++) {
@@ -24968,7 +26100,7 @@ async function startKaizenServer(options = {}) {
24968
26100
  });
24969
26101
  }
24970
26102
  if (url.pathname.startsWith(`${ATTACHMENTS_ROUTE_PREFIX}/`)) {
24971
- return serveAttachment(path27.join(store.dataDir, "attachments"), url.pathname);
26103
+ return serveAttachment(path29.join(store.dataDir, "attachments"), url.pathname);
24972
26104
  }
24973
26105
  return serveStatic(distDir, req, url.pathname);
24974
26106
  },
@@ -25029,6 +26161,7 @@ async function startKaizenServer(options = {}) {
25029
26161
  providerSessionIndex.dispose();
25030
26162
  keybindings.dispose();
25031
26163
  providerSettings.dispose();
26164
+ generalSettings.dispose();
25032
26165
  remoteAuth.dispose();
25033
26166
  remoteRelay.dispose();
25034
26167
  themeSettings.dispose();
@@ -25164,8 +26297,8 @@ async function serveCompressed(originalFilePath, request, cacheControl) {
25164
26297
  }
25165
26298
  async function serveStatic(distDir, request, pathname) {
25166
26299
  const requestedPath = pathname === "/" ? "/index.html" : pathname;
25167
- const filePath = path27.join(distDir, requestedPath);
25168
- const indexPath = path27.join(distDir, "index.html");
26300
+ const filePath = path29.join(distDir, requestedPath);
26301
+ const indexPath = path29.join(distDir, "index.html");
25169
26302
  const cacheControl = getCacheControlHeader(requestedPath);
25170
26303
  const file = Bun.file(filePath);
25171
26304
  if (await file.exists()) {