kaizenai 0.7.2 → 0.8.1

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-Cbp5uhtA.js → FeatureOverviewPage-CFYLJ3BM.js} +2 -2
  2. package/dist/client/assets/FeatureOverviewPage-CFYLJ3BM.js.br +0 -0
  3. package/dist/client/assets/FeatureOverviewPage-CFYLJ3BM.js.gz +0 -0
  4. package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js +21 -0
  5. package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js.br +0 -0
  6. package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js.gz +0 -0
  7. package/dist/client/assets/SettingsPage-DQ7vlMU3.js +51 -0
  8. package/dist/client/assets/SettingsPage-DQ7vlMU3.js.br +0 -0
  9. package/dist/client/assets/SettingsPage-DQ7vlMU3.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-BoB-RrDz.js +6 -0
  224. package/dist/client/assets/eye-BoB-RrDz.js.br +0 -0
  225. package/dist/client/assets/eye-BoB-RrDz.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-C6T6qDr6.js +2500 -0
  389. package/dist/client/assets/index-C6T6qDr6.js.br +0 -0
  390. package/dist/client/assets/index-C6T6qDr6.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 -1
  931. package/dist/server/cli.js +1297 -155
  932. package/package.json +2 -1
  933. package/dist/client/assets/FeatureOverviewPage-Cbp5uhtA.js.br +0 -0
  934. package/dist/client/assets/FeatureOverviewPage-Cbp5uhtA.js.gz +0 -0
  935. package/dist/client/assets/LocalProjectsPage-CihqlQOs.js +0 -21
  936. package/dist/client/assets/LocalProjectsPage-CihqlQOs.js.br +0 -0
  937. package/dist/client/assets/LocalProjectsPage-CihqlQOs.js.gz +0 -0
  938. package/dist/client/assets/SettingsPage-jZce-i3Z.js +0 -51
  939. package/dist/client/assets/SettingsPage-jZce-i3Z.js.br +0 -0
  940. package/dist/client/assets/SettingsPage-jZce-i3Z.js.gz +0 -0
  941. package/dist/client/assets/eye-BkdZGixK.js +0 -11
  942. package/dist/client/assets/eye-BkdZGixK.js.br +0 -0
  943. package/dist/client/assets/eye-BkdZGixK.js.gz +0 -0
  944. package/dist/client/assets/index-B7C7C1FY.js +0 -608
  945. package/dist/client/assets/index-B7C7C1FY.js.br +0 -0
  946. package/dist/client/assets/index-B7C7C1FY.js.gz +0 -0
  947. package/dist/client/assets/index-D-HIK4uM.css +0 -32
  948. package/dist/client/assets/index-D-HIK4uM.css.br +0 -0
  949. package/dist/client/assets/index-D-HIK4uM.css.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.2",
25
+ version: "0.8.1",
26
26
  description: "Local web UI for coding agents",
27
27
  keywords: [
28
28
  "claude",
@@ -79,6 +79,7 @@ var package_default = {
79
79
  },
80
80
  dependencies: {
81
81
  "@anthropic-ai/claude-agent-sdk": "^0.2.39",
82
+ "@pierre/diffs": "^1.1.12",
82
83
  "@radix-ui/react-context-menu": "^2.2.16",
83
84
  "@radix-ui/react-select": "^2.2.6",
84
85
  "@xterm/addon-fit": "^0.11.0",
@@ -183,6 +184,9 @@ function getManagedBackgroundsDirPath(homeDir, env = getRuntimeEnv()) {
183
184
  function getProviderSettingsFilePath(homeDir, env = getRuntimeEnv()) {
184
185
  return `${getDataRootDir(homeDir, env)}/providers.json`;
185
186
  }
187
+ function getGeneralSettingsFilePath(homeDir, env = getRuntimeEnv()) {
188
+ return `${getDataRootDir(homeDir, env)}/general.json`;
189
+ }
186
190
  function getRemoteAuthFilePath(homeDir, env = getRuntimeEnv()) {
187
191
  return `${getDataRootDir(homeDir, env)}/remote-auth.json`;
188
192
  }
@@ -829,7 +833,7 @@ ${stderr}`);
829
833
  }
830
834
 
831
835
  // src/server/server.ts
832
- import path27 from "path";
836
+ import path29 from "path";
833
837
  import QRCode2 from "qrcode";
834
838
 
835
839
  // src/server/event-store.ts
@@ -1033,6 +1037,12 @@ var OPENROUTER_ATTACHMENT_CAPABILITIES = {
1033
1037
  markdown: true,
1034
1038
  document: true
1035
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
+ };
1036
1046
  var FEATURE_ACCESS_REQUIREMENTS = {
1037
1047
  openrouter: "account",
1038
1048
  providerUsage: "account",
@@ -4202,7 +4212,7 @@ function normalizeToolCall(args) {
4202
4212
 
4203
4213
  // src/server/attachments.ts
4204
4214
  import path5 from "path";
4205
- import { mkdir as mkdir3, writeFile as writeFile2 } from "fs/promises";
4215
+ import { mkdir as mkdir3, unlink, writeFile as writeFile2 } from "fs/promises";
4206
4216
  var ATTACHMENTS_ROUTE_PREFIX = "/attachments";
4207
4217
  var MAX_CHAT_IMAGE_DATA_URL_CHARS = 14000000;
4208
4218
  var MAX_CHAT_DOCUMENT_DATA_URL_CHARS = 30000000;
@@ -4312,6 +4322,23 @@ async function persistChatAttachments(input) {
4312
4322
  }
4313
4323
  return persisted;
4314
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
+ }
4315
4342
 
4316
4343
  // src/server/codex-app-server.ts
4317
4344
  import { spawn as spawn2 } from "child_process";
@@ -7954,6 +7981,33 @@ function normalizeOpenCodeToolResult(args) {
7954
7981
  isError: args.status === "failed"
7955
7982
  };
7956
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
+ }
7957
8011
  function extractOpenCodeStderrTurnError(line) {
7958
8012
  const jsonMatch = line.match(/error=(\{.*\})\s+stream error$/);
7959
8013
  if (jsonMatch) {
@@ -8728,6 +8782,14 @@ class OpenCodeAcpManager {
8728
8782
  return;
8729
8783
  if (turn.pendingInteractiveToolIds.size > 0)
8730
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
+ }
8731
8793
  if (context.currentPlanMode && !turn.completedExitPlanMode) {
8732
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.`;
8733
8795
  this.failPendingTurn(context, turn, failureMessage);
@@ -11704,7 +11766,7 @@ function deriveSuggestedProjectFolders(state, discoveredProjects) {
11704
11766
  }
11705
11767
  return [...candidates.entries()].map(([localPath, label]) => ({ localPath, label })).slice(0, 12);
11706
11768
  }
11707
- 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) {
11708
11770
  const chat = state.chatsById.get(chatId);
11709
11771
  if (!chat || chat.deletedAt)
11710
11772
  return null;
@@ -11724,6 +11786,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
11724
11786
  sessionToken: chat.sessionToken,
11725
11787
  updatedAt: chat.updatedAt,
11726
11788
  pendingTool,
11789
+ queuedOutbound: queuedOutbound && queuedOutbound.length > 0 ? queuedOutbound : undefined,
11727
11790
  hydrationState: chat.hydrationState ?? "local",
11728
11791
  inactiveProviderMessage: provider ? getProviderInactiveMessage(provider, providerSettings) : null
11729
11792
  };
@@ -11733,6 +11796,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
11733
11796
  runtime,
11734
11797
  messages: transcript.entries,
11735
11798
  transcript,
11799
+ diffs,
11736
11800
  usage,
11737
11801
  availableProviders: availableProviders ?? getSelectableProviders(providerSettings),
11738
11802
  providerSettings
@@ -11759,6 +11823,25 @@ var CLAUDE_TOOLSET = [
11759
11823
  "ExitPlanMode"
11760
11824
  ];
11761
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
+ }
11762
11845
  var noopRealtime = {
11763
11846
  publishChatMessageAppended: () => {},
11764
11847
  publishChatMessagesAppended: () => {},
@@ -11771,6 +11854,7 @@ var noopRealtime = {
11771
11854
  publishChatUsageSet: () => {},
11772
11855
  publishChatAvailableProvidersSet: () => {},
11773
11856
  publishChatTranscriptWindowMetaSet: () => {},
11857
+ publishChatOutboundQueueSet: () => {},
11774
11858
  publishChatDeleted: () => {},
11775
11859
  publishSidebarChatFieldsSet: () => {},
11776
11860
  publishSidebarChatAdded: () => {},
@@ -12217,6 +12301,10 @@ class AgentCoordinator {
12217
12301
  providerCatalogManager;
12218
12302
  generateTitle;
12219
12303
  activeTurns = new Map;
12304
+ outboundQueues = new Map;
12305
+ drainingOutboundQueues = new Set;
12306
+ outboundQueueRetryTimers = new Map;
12307
+ latestTranscriptCreatedAt = new Map;
12220
12308
  liveUsage = new Map;
12221
12309
  disposeTimers = new Map;
12222
12310
  realtime = noopRealtime;
@@ -12298,7 +12386,10 @@ class AgentCoordinator {
12298
12386
  return state?.projectsById ? this.store.state : null;
12299
12387
  }
12300
12388
  async prewarmEnabledProviders(providers, localPath = process.cwd()) {
12301
- 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;
12302
12393
  for (const provider of orderedProviders) {
12303
12394
  try {
12304
12395
  await this.providerRuntimeSupervisor.prewarmPrimary(provider, localPath);
@@ -12408,6 +12499,169 @@ class AgentCoordinator {
12408
12499
  this.realtime.publishChatUsageSet(chatId, this.getLiveUsage(chatId));
12409
12500
  this.realtime.publishSidebarProviderUsageSet(this.getProviderUsage());
12410
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
+ }
12411
12665
  async failTurnResumeAccessDenied(active, message) {
12412
12666
  const errorEntry = timestamped3({
12413
12667
  kind: "result",
@@ -12437,6 +12691,7 @@ class AgentCoordinator {
12437
12691
  this.publishPendingTool(active.chatId);
12438
12692
  this.publishChatStatus(active.chatId);
12439
12693
  this.publishSidebarChatState(active.chatId);
12694
+ await this.maybeDrainOutboundQueueHead(active.chatId);
12440
12695
  }
12441
12696
  publishAvailableProviders(chatId) {
12442
12697
  const providerSettings = this.providerSettingsManager?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS;
@@ -12571,10 +12826,14 @@ class AgentCoordinator {
12571
12826
  const sidebarStoreState = this.getSidebarStoreState();
12572
12827
  const previousSidebarIndex = args.appendUserPrompt && sidebarStoreState ? deriveSidebarChatIndex(this.store, chat.projectId, previousFeatureId, args.chatId) : -1;
12573
12828
  if (args.appendUserPrompt) {
12574
- await this.store.appendMessage(args.chatId, args.appendUserPrompt);
12575
- 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);
12576
12832
  this.publishTranscriptMeta(args.chatId);
12577
12833
  this.publishPendingTool(args.chatId);
12834
+ if (args.pushChatSnapshotRefresh) {
12835
+ this.realtime.refreshChatSnapshot?.(args.chatId);
12836
+ }
12578
12837
  }
12579
12838
  await this.store.recordTurnStarted(args.chatId);
12580
12839
  const project = this.store.getProject(chat.projectId);
@@ -12814,6 +13073,7 @@ class AgentCoordinator {
12814
13073
  this.publishPendingTool(args.chatId);
12815
13074
  this.publishChatStatus(args.chatId);
12816
13075
  this.publishSidebarChatState(args.chatId);
13076
+ this.maybeDrainOutboundQueueHead(args.chatId);
12817
13077
  }
12818
13078
  }
12819
13079
  assertProviderAccess(provider) {
@@ -12844,6 +13104,19 @@ class AgentCoordinator {
12844
13104
  const settings = this.getProviderSettings(provider, command);
12845
13105
  validateProviderAttachmentSupport(provider, settings.model, command.message.attachments, this.providerCatalogManager?.getSnapshot());
12846
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
+ }
12847
13120
  const userPrompt = timestamped3({
12848
13121
  kind: "user_prompt",
12849
13122
  content: text
@@ -12855,8 +13128,28 @@ class AgentCoordinator {
12855
13128
  uploads: command.message.attachments
12856
13129
  });
12857
13130
  userPrompt.attachments = attachments;
12858
- if (!text && !attachments?.length) {
12859
- 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 };
12860
13153
  }
12861
13154
  await this.startTurnForChat({
12862
13155
  chatId,
@@ -12922,19 +13215,20 @@ class AgentCoordinator {
12922
13215
  if (event.entry.kind === "tool_call" && active.syntheticToolCallIds.delete(event.entry.tool.toolId)) {
12923
13216
  continue;
12924
13217
  }
12925
- await this.store.appendMessage(active.chatId, event.entry);
12926
- 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);
12927
13221
  this.publishTranscriptMeta(active.chatId);
12928
13222
  this.publishPendingTool(active.chatId);
12929
13223
  this.publishSidebarChatState(active.chatId);
12930
- if (event.entry.kind === "system_init") {
13224
+ if (entry.kind === "system_init") {
12931
13225
  active.status = "running";
12932
13226
  this.publishChatStatus(active.chatId);
12933
13227
  }
12934
- if (event.entry.kind === "result") {
13228
+ if (entry.kind === "result") {
12935
13229
  active.hasFinalResult = true;
12936
- if (event.entry.isError) {
12937
- 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");
12938
13232
  active.status = "failed";
12939
13233
  } else if (!active.cancelRequested) {
12940
13234
  await this.store.recordTurnFinished(active.chatId);
@@ -13016,9 +13310,11 @@ class AgentCoordinator {
13016
13310
  this.publishSidebarChatState(active.chatId);
13017
13311
  }
13018
13312
  }
13313
+ await this.maybeDrainOutboundQueueHead(active.chatId);
13019
13314
  }
13020
13315
  }
13021
13316
  async cancel(chatId) {
13317
+ await this.clearOutboundQueueForChat(chatId);
13022
13318
  const active = this.activeTurns.get(chatId);
13023
13319
  if (!active)
13024
13320
  return;
@@ -13069,6 +13365,7 @@ class AgentCoordinator {
13069
13365
  await this.cancel(chatId);
13070
13366
  return;
13071
13367
  }
13368
+ await this.clearOutboundQueueForChat(chatId);
13072
13369
  active.cancelRequested = true;
13073
13370
  active.cancelRecorded = true;
13074
13371
  active.hasFinalResult = true;
@@ -13543,7 +13840,83 @@ function discoverProjects(homeDir = homedir9(), adapters = DEFAULT_PROJECT_DISCO
13543
13840
 
13544
13841
  // src/server/git-manager.ts
13545
13842
  import path14 from "path";
13546
- 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
+
13547
13920
  class GitManager {
13548
13921
  async runGit(cwd, args) {
13549
13922
  const proc = Bun.spawn(["git", "-C", cwd, ...args], {
@@ -13557,6 +13930,210 @@ class GitManager {
13557
13930
  ]);
13558
13931
  return { exitCode, stdout: stdout.trim(), stderr: stderr.trim() };
13559
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
+ }
13560
14137
  async getBranches(localPath) {
13561
14138
  const [branchResult, headResult] = await Promise.all([
13562
14139
  this.runGit(localPath, ["branch"]),
@@ -13575,7 +14152,11 @@ class GitManager {
13575
14152
  if (result.exitCode !== 0) {
13576
14153
  throw new Error(result.stderr || `Failed to switch to branch "${branchName}"`);
13577
14154
  }
13578
- 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
+ ]);
13579
14160
  return { currentBranch: head.stdout };
13580
14161
  }
13581
14162
  async createBranch(localPath, branchName, checkout) {
@@ -13584,7 +14165,11 @@ class GitManager {
13584
14165
  if (result.exitCode !== 0) {
13585
14166
  throw new Error(result.stderr || `Failed to create branch "${branchName}"`);
13586
14167
  }
13587
- 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
+ ]);
13588
14173
  return { currentBranch: head.stdout };
13589
14174
  }
13590
14175
  async setProjectMetadataDirectoryCommitMode(localPath, commitProjectMetadata) {
@@ -13607,11 +14192,240 @@ class GitManager {
13607
14192
  }
13608
14193
  }
13609
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
+
13610
14424
  // src/server/keybindings.ts
13611
14425
  import { watch } from "fs";
13612
14426
  import { mkdir as mkdir4, readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
13613
14427
  import { homedir as homedir10 } from "os";
13614
- import path15 from "path";
14428
+ import path16 from "path";
13615
14429
  var KEYBINDING_ACTIONS = Object.keys(DEFAULT_KEYBINDINGS);
13616
14430
  var SELF_WRITE_WATCH_DEBOUNCE_MS = 250;
13617
14431
 
@@ -13626,7 +14440,7 @@ class KeybindingsManager {
13626
14440
  this.snapshot = createDefaultSnapshot(this.filePath);
13627
14441
  }
13628
14442
  async initialize() {
13629
- await mkdir4(path15.dirname(this.filePath), { recursive: true });
14443
+ await mkdir4(path16.dirname(this.filePath), { recursive: true });
13630
14444
  const file = Bun.file(this.filePath);
13631
14445
  if (!await file.exists()) {
13632
14446
  await writeFile4(this.filePath, `${JSON.stringify(DEFAULT_KEYBINDINGS, null, 2)}
@@ -13655,7 +14469,7 @@ class KeybindingsManager {
13655
14469
  }
13656
14470
  async write(bindings) {
13657
14471
  const nextSnapshot = normalizeKeybindings(bindings, this.filePath);
13658
- await mkdir4(path15.dirname(this.filePath), { recursive: true });
14472
+ await mkdir4(path16.dirname(this.filePath), { recursive: true });
13659
14473
  this.ignoreWatchEventsUntil = Date.now() + SELF_WRITE_WATCH_DEBOUNCE_MS;
13660
14474
  await writeFile4(this.filePath, `${JSON.stringify(nextSnapshot.bindings, null, 2)}
13661
14475
  `, "utf8");
@@ -13671,8 +14485,8 @@ class KeybindingsManager {
13671
14485
  startWatching() {
13672
14486
  this.watcher?.close();
13673
14487
  try {
13674
- this.watcher = watch(path15.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
13675
- 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)) {
13676
14490
  return;
13677
14491
  }
13678
14492
  if (Date.now() <= this.ignoreWatchEventsUntil) {
@@ -13758,7 +14572,7 @@ function formatDisplayPath(filePath) {
13758
14572
  const homePath = homedir10();
13759
14573
  if (filePath === homePath)
13760
14574
  return "~";
13761
- if (filePath.startsWith(`${homePath}${path15.sep}`)) {
14575
+ if (filePath.startsWith(`${homePath}${path16.sep}`)) {
13762
14576
  return `~${filePath.slice(homePath.length)}`;
13763
14577
  }
13764
14578
  return filePath;
@@ -13768,7 +14582,7 @@ function formatDisplayPath(filePath) {
13768
14582
  import { watch as watch2 } from "fs";
13769
14583
  import { mkdir as mkdir5, readFile as readFile5, writeFile as writeFile5 } from "fs/promises";
13770
14584
  import { homedir as homedir11 } from "os";
13771
- import path16 from "path";
14585
+ import path17 from "path";
13772
14586
  var PROVIDER_IDS = Object.keys(DEFAULT_PROVIDER_SETTINGS);
13773
14587
 
13774
14588
  class ProviderSettingsManager {
@@ -13781,7 +14595,7 @@ class ProviderSettingsManager {
13781
14595
  this.snapshot = createDefaultSnapshot2(this.filePath);
13782
14596
  }
13783
14597
  async initialize() {
13784
- await mkdir5(path16.dirname(this.filePath), { recursive: true });
14598
+ await mkdir5(path17.dirname(this.filePath), { recursive: true });
13785
14599
  const file = Bun.file(this.filePath);
13786
14600
  if (!await file.exists()) {
13787
14601
  await writeFile5(this.filePath, `${JSON.stringify(DEFAULT_PROVIDER_SETTINGS, null, 2)}
@@ -13810,7 +14624,7 @@ class ProviderSettingsManager {
13810
14624
  }
13811
14625
  async write(settings) {
13812
14626
  const nextSnapshot = normalizeProviderSettings(settings, this.filePath);
13813
- await mkdir5(path16.dirname(this.filePath), { recursive: true });
14627
+ await mkdir5(path17.dirname(this.filePath), { recursive: true });
13814
14628
  await writeFile5(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
13815
14629
  `, "utf8");
13816
14630
  this.setSnapshot(nextSnapshot);
@@ -13825,8 +14639,8 @@ class ProviderSettingsManager {
13825
14639
  startWatching() {
13826
14640
  this.watcher?.close();
13827
14641
  try {
13828
- this.watcher = watch2(path16.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
13829
- 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)) {
13830
14644
  return;
13831
14645
  }
13832
14646
  this.reload().catch((error) => {
@@ -13890,7 +14704,7 @@ function formatDisplayPath2(filePath) {
13890
14704
  const homePath = homedir11();
13891
14705
  if (filePath === homePath)
13892
14706
  return "~";
13893
- if (filePath.startsWith(`${homePath}${path16.sep}`)) {
14707
+ if (filePath.startsWith(`${homePath}${path17.sep}`)) {
13894
14708
  return `~${filePath.slice(homePath.length)}`;
13895
14709
  }
13896
14710
  return filePath;
@@ -13900,7 +14714,7 @@ function formatDisplayPath2(filePath) {
13900
14714
  import { watch as watch3 } from "fs";
13901
14715
  import { mkdir as mkdir7, readdir as readdir3, readFile as readFile7, writeFile as writeFile7 } from "fs/promises";
13902
14716
  import { homedir as homedir13 } from "os";
13903
- import path19 from "path";
14717
+ import path20 from "path";
13904
14718
  // ../../packages/themes/src/builtins/catppuccin.json
13905
14719
  var catppuccin_default = {
13906
14720
  id: "catppuccin",
@@ -14581,21 +15395,21 @@ function serializeCssVariables(variables) {
14581
15395
  // src/server/managed-backgrounds.ts
14582
15396
  import { createHash } from "crypto";
14583
15397
  import { lookup } from "dns/promises";
14584
- 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";
14585
15399
  import { isIP as isIP2 } from "net";
14586
15400
  import { homedir as homedir12 } from "os";
14587
- import path18 from "path";
15401
+ import path19 from "path";
14588
15402
  import sharp from "sharp";
14589
15403
 
14590
15404
  // src/server/backgrounds.ts
14591
15405
  import fs3 from "fs/promises";
14592
- import path17 from "path";
15406
+ import path18 from "path";
14593
15407
  import os from "os";
14594
15408
  var BACKGROUND_DIRS = [
14595
- path17.join(os.homedir(), ".local/share/backgrounds"),
15409
+ path18.join(os.homedir(), ".local/share/backgrounds"),
14596
15410
  "/usr/share/backgrounds",
14597
15411
  "/Library/Desktop Pictures",
14598
- path17.join(os.homedir(), "Pictures"),
15412
+ path18.join(os.homedir(), "Pictures"),
14599
15413
  process.platform === "win32" ? "C:\\Windows\\Web\\Wallpaper" : ""
14600
15414
  ].filter(Boolean);
14601
15415
  async function getSystemBackgrounds() {
@@ -14608,11 +15422,11 @@ async function getSystemBackgrounds() {
14608
15422
  const entries = await fs3.readdir(dir, { withFileTypes: true });
14609
15423
  for (const entry of entries) {
14610
15424
  if (entry.isDirectory()) {
14611
- await scanDir(path17.join(dir, entry.name), depth + 1);
15425
+ await scanDir(path18.join(dir, entry.name), depth + 1);
14612
15426
  } else if (entry.isFile()) {
14613
- const ext = path17.extname(entry.name).toLowerCase();
15427
+ const ext = path18.extname(entry.name).toLowerCase();
14614
15428
  if (ext === ".jpg" || ext === ".jpeg" || ext === ".png" || ext === ".webp") {
14615
- const fullPath = path17.join(dir, entry.name);
15429
+ const fullPath = path18.join(dir, entry.name);
14616
15430
  if (seen.has(fullPath))
14617
15431
  continue;
14618
15432
  seen.add(fullPath);
@@ -14658,8 +15472,8 @@ var MAX_REMOTE_BACKGROUND_BYTES = 20 * 1024 * 1024;
14658
15472
  function getManagedBackgroundPathsForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
14659
15473
  const sourceKey = createHash("sha256").update(source).digest("hex");
14660
15474
  return {
14661
- assetFilePath: path18.join(backgroundsDirectory, `${sourceKey}.webp`),
14662
- metadataFilePath: path18.join(backgroundsDirectory, `${sourceKey}.json`)
15475
+ assetFilePath: path19.join(backgroundsDirectory, `${sourceKey}.webp`),
15476
+ metadataFilePath: path19.join(backgroundsDirectory, `${sourceKey}.json`)
14663
15477
  };
14664
15478
  }
14665
15479
  async function deleteManagedBackgroundForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
@@ -14707,7 +15521,7 @@ async function cacheManagedBackgroundForSource(source, backgroundsDirectory = ge
14707
15521
  const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
14708
15522
  const resolvedSource = await resolveSource(source, options);
14709
15523
  const previousMetadata = await readManagedBackgroundMetadata(metadataFilePath);
14710
- const existingAsset = await stat4(assetFilePath).catch(() => null);
15524
+ const existingAsset = await stat5(assetFilePath).catch(() => null);
14711
15525
  if (existingAsset?.isFile() && previousMetadata?.fingerprint === resolvedSource.fingerprint) {
14712
15526
  return {
14713
15527
  assetFilePath,
@@ -14752,7 +15566,7 @@ async function readManagedBackgroundCache(source, backgroundsDirectory) {
14752
15566
  const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
14753
15567
  const [metadata, existingAsset] = await Promise.all([
14754
15568
  readManagedBackgroundMetadata(metadataFilePath),
14755
- stat4(assetFilePath).catch(() => null)
15569
+ stat5(assetFilePath).catch(() => null)
14756
15570
  ]);
14757
15571
  if (!existingAsset?.isFile() || !metadata?.fingerprint) {
14758
15572
  return null;
@@ -14769,7 +15583,7 @@ async function resolveSource(source, options) {
14769
15583
  if (!filePath) {
14770
15584
  throw new Error("Background image not found.");
14771
15585
  }
14772
- const info = await stat4(filePath);
15586
+ const info = await stat5(filePath);
14773
15587
  return {
14774
15588
  input: filePath,
14775
15589
  fingerprint: JSON.stringify({
@@ -15033,7 +15847,7 @@ class ThemeSettingsManager {
15033
15847
  });
15034
15848
  }
15035
15849
  async initialize() {
15036
- await mkdir7(path19.dirname(this.filePath), { recursive: true });
15850
+ await mkdir7(path20.dirname(this.filePath), { recursive: true });
15037
15851
  await mkdir7(this.themesDirectory, { recursive: true });
15038
15852
  await mkdir7(this.managedBackgroundsDirectory, { recursive: true });
15039
15853
  const file = Bun.file(this.filePath);
@@ -15083,7 +15897,7 @@ class ThemeSettingsManager {
15083
15897
  console.warn(`${LOG_PREFIX} Failed to warm managed background cache:`, error);
15084
15898
  }
15085
15899
  }
15086
- await mkdir7(path19.dirname(this.filePath), { recursive: true });
15900
+ await mkdir7(path20.dirname(this.filePath), { recursive: true });
15087
15901
  await writeFile7(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
15088
15902
  `, "utf8");
15089
15903
  if (previousBackgroundImage !== nextSnapshot.settings.backgroundImage) {
@@ -15115,8 +15929,8 @@ class ThemeSettingsManager {
15115
15929
  this.settingsWatcher?.close();
15116
15930
  this.themesWatcher?.close();
15117
15931
  try {
15118
- this.settingsWatcher = watch3(path19.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
15119
- 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))
15120
15934
  return;
15121
15935
  this.reload().catch((error) => {
15122
15936
  console.warn(`${LOG_PREFIX} Failed to reload theme settings:`, error);
@@ -15217,7 +16031,7 @@ async function loadThemeRegistry(themesDirectory) {
15217
16031
  }
15218
16032
  const customThemeFiles = entries.filter((entry) => entry.endsWith(".json") && !entry.endsWith(".example.json")).sort((left, right) => left.localeCompare(right));
15219
16033
  for (const fileName of customThemeFiles) {
15220
- const absolutePath = path19.join(themesDirectory, fileName);
16034
+ const absolutePath = path20.join(themesDirectory, fileName);
15221
16035
  try {
15222
16036
  const text = await readFile7(absolutePath, "utf8");
15223
16037
  const parsed = parseThemeDefinition(JSON.parse(text));
@@ -15281,7 +16095,168 @@ function formatDisplayPath3(filePath) {
15281
16095
  const homePath = homedir13();
15282
16096
  if (filePath === homePath)
15283
16097
  return "~";
15284
- 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}`)) {
15285
16260
  return `~${filePath.slice(homePath.length)}`;
15286
16261
  }
15287
16262
  return filePath;
@@ -15514,7 +16489,7 @@ function getMachineDisplayName() {
15514
16489
  }
15515
16490
 
15516
16491
  // src/server/terminal-manager.ts
15517
- import path20 from "path";
16492
+ import path22 from "path";
15518
16493
  import process8 from "process";
15519
16494
  import defaultShell, { detectDefaultShell } from "default-shell";
15520
16495
  import { Terminal } from "@xterm/headless";
@@ -15553,7 +16528,7 @@ function resolveShellArgs(shellPath) {
15553
16528
  if (process8.platform === "win32") {
15554
16529
  return [];
15555
16530
  }
15556
- const shellName = path20.basename(shellPath);
16531
+ const shellName = path22.basename(shellPath);
15557
16532
  if (["bash", "zsh", "fish", "sh", "ksh"].includes(shellName)) {
15558
16533
  return ["-l"];
15559
16534
  }
@@ -15647,7 +16622,7 @@ class TerminalManager {
15647
16622
  const cols = normalizeTerminalDimension(args.cols, DEFAULT_COLS);
15648
16623
  const rows = normalizeTerminalDimension(args.rows, DEFAULT_ROWS);
15649
16624
  const scrollback = clampScrollback(args.scrollback);
15650
- const title = path20.basename(shell) || "shell";
16625
+ const title = path22.basename(shell) || "shell";
15651
16626
  const headless = new Terminal({
15652
16627
  cols,
15653
16628
  rows,
@@ -16011,13 +16986,13 @@ class UpdateManager {
16011
16986
 
16012
16987
  // src/server/recovery.ts
16013
16988
  import { existsSync as existsSync10, readFileSync as readFileSync7, readdirSync as readdirSync8, statSync as statSync7 } from "fs";
16014
- import { homedir as homedir14 } from "os";
16015
- import path22 from "path";
16989
+ import { homedir as homedir15 } from "os";
16990
+ import path24 from "path";
16016
16991
 
16017
16992
  // src/server/cursor-chat-store.ts
16018
16993
  import { Database as Database2 } from "bun:sqlite";
16019
16994
  import { existsSync as existsSync9, readdirSync as readdirSync7, statSync as statSync6 } from "fs";
16020
- import path21 from "path";
16995
+ import path23 from "path";
16021
16996
  function decodeMetaValue(value) {
16022
16997
  try {
16023
16998
  const decoded = Buffer.from(value, "hex").toString("utf8");
@@ -16072,7 +17047,7 @@ function extractWorkspacePath(value) {
16072
17047
  if (!match) {
16073
17048
  return null;
16074
17049
  }
16075
- return path21.normalize(match[1].trim());
17050
+ return path23.normalize(match[1].trim());
16076
17051
  }
16077
17052
  function unwrapCursorTaggedText(value) {
16078
17053
  const trimmed = value.trim();
@@ -16148,7 +17123,7 @@ function readBlobRows(database) {
16148
17123
  return database.query("select id, data from blobs").all();
16149
17124
  }
16150
17125
  function collectCursorChatStorePaths(homeDir) {
16151
- const chatsRoot = path21.join(homeDir, ".cursor", "chats");
17126
+ const chatsRoot = path23.join(homeDir, ".cursor", "chats");
16152
17127
  if (!existsSync9(chatsRoot)) {
16153
17128
  return [];
16154
17129
  }
@@ -16156,11 +17131,11 @@ function collectCursorChatStorePaths(homeDir) {
16156
17131
  for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
16157
17132
  if (!parent.isDirectory())
16158
17133
  continue;
16159
- const parentPath = path21.join(chatsRoot, parent.name);
17134
+ const parentPath = path23.join(chatsRoot, parent.name);
16160
17135
  for (const child of readdirSync7(parentPath, { withFileTypes: true })) {
16161
17136
  if (!child.isDirectory())
16162
17137
  continue;
16163
- const storePath = path21.join(parentPath, child.name, "store.db");
17138
+ const storePath = path23.join(parentPath, child.name, "store.db");
16164
17139
  if (existsSync9(storePath)) {
16165
17140
  storePaths.push(storePath);
16166
17141
  }
@@ -16169,14 +17144,14 @@ function collectCursorChatStorePaths(homeDir) {
16169
17144
  return storePaths;
16170
17145
  }
16171
17146
  function findCursorChatStorePath(homeDir, sessionToken) {
16172
- const chatsRoot = path21.join(homeDir, ".cursor", "chats");
17147
+ const chatsRoot = path23.join(homeDir, ".cursor", "chats");
16173
17148
  if (!existsSync9(chatsRoot)) {
16174
17149
  return null;
16175
17150
  }
16176
17151
  for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
16177
17152
  if (!parent.isDirectory())
16178
17153
  continue;
16179
- const candidate = path21.join(chatsRoot, parent.name, sessionToken, "store.db");
17154
+ const candidate = path23.join(chatsRoot, parent.name, sessionToken, "store.db");
16180
17155
  if (existsSync9(candidate)) {
16181
17156
  return candidate;
16182
17157
  }
@@ -16350,7 +17325,7 @@ function collectFiles(directory, extension) {
16350
17325
  }
16351
17326
  const files = [];
16352
17327
  for (const entry of readdirSync8(directory, { withFileTypes: true })) {
16353
- const fullPath = path22.join(directory, entry.name);
17328
+ const fullPath = path24.join(directory, entry.name);
16354
17329
  if (entry.isDirectory()) {
16355
17330
  files.push(...collectFiles(fullPath, extension));
16356
17331
  continue;
@@ -16488,7 +17463,7 @@ function markSkippedSession(skippedSessionKeys, provider, sessionToken) {
16488
17463
  }
16489
17464
  }
16490
17465
  function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
16491
- const projectsDir = path22.join(homeDir, ".claude", "projects");
17466
+ const projectsDir = path24.join(homeDir, ".claude", "projects");
16492
17467
  const chats = [];
16493
17468
  for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
16494
17469
  const head = peekFileHead(sessionFile, 2048);
@@ -16505,8 +17480,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
16505
17480
  if (!peekedSessionToken && typeof record.sessionId === "string") {
16506
17481
  peekedSessionToken = record.sessionId;
16507
17482
  }
16508
- if (!peekedSessionLocalPath && typeof record.cwd === "string" && path22.isAbsolute(record.cwd)) {
16509
- peekedSessionLocalPath = path22.normalize(record.cwd);
17483
+ if (!peekedSessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
17484
+ peekedSessionLocalPath = path24.normalize(record.cwd);
16510
17485
  }
16511
17486
  peekedEntries.push(...claudeEntriesFromRecord(record));
16512
17487
  }
@@ -16536,8 +17511,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
16536
17511
  if (!sessionToken && typeof record.sessionId === "string") {
16537
17512
  sessionToken = record.sessionId;
16538
17513
  }
16539
- if (!sessionLocalPath && typeof record.cwd === "string" && path22.isAbsolute(record.cwd)) {
16540
- sessionLocalPath = path22.normalize(record.cwd);
17514
+ if (!sessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
17515
+ sessionLocalPath = path24.normalize(record.cwd);
16541
17516
  }
16542
17517
  const timestamp = typeof record.timestamp === "string" ? Date.parse(record.timestamp) : Number.NaN;
16543
17518
  if (!Number.isNaN(timestamp)) {
@@ -16721,12 +17696,12 @@ function cursorEntriesFromRecord(record, index, sessionToken, fallbackBaseTimest
16721
17696
  ];
16722
17697
  }
16723
17698
  function findCursorTranscriptPath(args) {
16724
- const transcriptRoot = path22.join(args.homeDir, ".cursor", "projects", encodeCursorProjectPath(path22.normalize(args.localPath)), "agent-transcripts");
16725
- 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`);
16726
17701
  if (existsSync10(directPath)) {
16727
17702
  return directPath;
16728
17703
  }
16729
- 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;
16730
17705
  }
16731
17706
  function isCodexSubagentSession(payload) {
16732
17707
  if (typeof payload.forked_from_id === "string" && payload.forked_from_id.trim()) {
@@ -16740,7 +17715,7 @@ function isCodexSubagentSession(payload) {
16740
17715
  return Boolean(sourceRecord.subagent);
16741
17716
  }
16742
17717
  function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
16743
- const sessionsDir = path22.join(homeDir, ".codex", "sessions");
17718
+ const sessionsDir = path24.join(homeDir, ".codex", "sessions");
16744
17719
  const chats = [];
16745
17720
  for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
16746
17721
  const head = peekFileHead(sessionFile, 2048);
@@ -16754,7 +17729,7 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16754
17729
  if (payload && typeof payload === "object" && !Array.isArray(payload)) {
16755
17730
  const payloadRecord = payload;
16756
17731
  const peekedSessionToken = typeof payloadRecord.id === "string" ? payloadRecord.id : null;
16757
- 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;
16758
17733
  if (isCodexSubagentSession(payloadRecord)) {
16759
17734
  markSkippedSession(skippedSessionKeys, "codex", peekedSessionToken);
16760
17735
  continue;
@@ -16803,8 +17778,8 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16803
17778
  if (!sessionToken && typeof payloadRecord.id === "string") {
16804
17779
  sessionToken = payloadRecord.id;
16805
17780
  }
16806
- if (!sessionLocalPath && typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16807
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17781
+ if (!sessionLocalPath && typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17782
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16808
17783
  }
16809
17784
  }
16810
17785
  }
@@ -16840,13 +17815,13 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
16840
17815
  function collectProjectChats(homeDir, trackedWorktreePaths, existingSessionKeys) {
16841
17816
  const skippedSessionKeys = new Set;
16842
17817
  const cursorTranscriptChats = [...trackedWorktreePaths].flatMap((localPath) => {
16843
- const transcriptsDir = path22.join(homeDir, ".cursor", "projects", encodeCursorProjectPath(localPath), "agent-transcripts");
17818
+ const transcriptsDir = path24.join(homeDir, ".cursor", "projects", encodeCursorProjectPath(localPath), "agent-transcripts");
16844
17819
  const chats = [];
16845
17820
  for (const sessionFile of collectFiles(transcriptsDir, ".jsonl")) {
16846
17821
  const lines = readFileSync7(sessionFile, "utf8").split(`
16847
17822
  `);
16848
17823
  const entries = [];
16849
- const sessionToken = path22.basename(sessionFile, ".jsonl");
17824
+ const sessionToken = path24.basename(sessionFile, ".jsonl");
16850
17825
  const sourceMtimeMs = statSync7(sessionFile).mtimeMs;
16851
17826
  const modifiedAt = sourceMtimeMs;
16852
17827
  lines.forEach((line, index) => {
@@ -16915,7 +17890,7 @@ function loadClaudeSessionEntries(args) {
16915
17890
  return [];
16916
17891
  }
16917
17892
  function loadClaudeSessionEntriesFromFilesystem(args) {
16918
- 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)));
16919
17894
  for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
16920
17895
  const lines = readFileSync7(sessionFile, "utf8").split(`
16921
17896
  `);
@@ -16957,8 +17932,8 @@ function loadCodexSessionEntries(args) {
16957
17932
  if (payloadRecord.id === args.session.sessionToken) {
16958
17933
  matched = true;
16959
17934
  }
16960
- if (typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16961
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17935
+ if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17936
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16962
17937
  }
16963
17938
  }
16964
17939
  }
@@ -16966,13 +17941,13 @@ function loadCodexSessionEntries(args) {
16966
17941
  entries.push(...codexEntriesFromRecord(record, index));
16967
17942
  }
16968
17943
  });
16969
- if (matched && sessionLocalPath === path22.normalize(args.session.localPath)) {
17944
+ if (matched && sessionLocalPath === path24.normalize(args.session.localPath)) {
16970
17945
  return entries;
16971
17946
  }
16972
17947
  return [];
16973
17948
  }
16974
17949
  function loadCodexSessionEntriesFromFilesystem(args) {
16975
- const sessionsDir = path22.join(args.homeDir, ".codex", "sessions");
17950
+ const sessionsDir = path24.join(args.homeDir, ".codex", "sessions");
16976
17951
  for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
16977
17952
  const lines = readFileSync7(sessionFile, "utf8").split(`
16978
17953
  `);
@@ -16992,8 +17967,8 @@ function loadCodexSessionEntriesFromFilesystem(args) {
16992
17967
  if (payloadRecord.id === args.sessionToken) {
16993
17968
  matched = true;
16994
17969
  }
16995
- if (typeof payloadRecord.cwd === "string" && path22.isAbsolute(payloadRecord.cwd)) {
16996
- sessionLocalPath = path22.normalize(payloadRecord.cwd);
17970
+ if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
17971
+ sessionLocalPath = path24.normalize(payloadRecord.cwd);
16997
17972
  }
16998
17973
  }
16999
17974
  }
@@ -17001,7 +17976,7 @@ function loadCodexSessionEntriesFromFilesystem(args) {
17001
17976
  entries.push(...codexEntriesFromRecord(record, index));
17002
17977
  }
17003
17978
  });
17004
- if (matched && sessionLocalPath === path22.normalize(args.localPath)) {
17979
+ if (matched && sessionLocalPath === path24.normalize(args.localPath)) {
17005
17980
  return entries;
17006
17981
  }
17007
17982
  }
@@ -17049,14 +18024,14 @@ function loadCursorSessionEntriesFromFilesystem(args) {
17049
18024
  return [];
17050
18025
  }
17051
18026
  const metadata = readCursorChatStoreMetadata(chatStorePath);
17052
- if (metadata?.localPath !== path22.normalize(args.localPath)) {
18027
+ if (metadata?.localPath !== path24.normalize(args.localPath)) {
17053
18028
  return [];
17054
18029
  }
17055
18030
  return loadCursorChatStoreEntries(chatStorePath);
17056
18031
  }
17057
18032
  function loadProviderSessionEntries(args) {
17058
18033
  const startedAt = performance.now();
17059
- const root = args.homeDir ?? homedir14();
18034
+ const root = args.homeDir ?? homedir15();
17060
18035
  const indexedSession = args.provider === "claude" || args.provider === "codex" || args.provider === "cursor" ? args.providerSessionIndex?.getSession(args.provider, args.sessionToken) : null;
17061
18036
  const entries = args.provider === "claude" && indexedSession ? loadClaudeSessionEntries({
17062
18037
  session: indexedSession
@@ -17094,8 +18069,8 @@ function hydrateProviderSessionWindow(args) {
17094
18069
  });
17095
18070
  }
17096
18071
  async function importProjectHistory(args) {
17097
- const normalizedPaths = new Set(args.worktreePaths.map((worktreePath) => path22.normalize(worktreePath)));
17098
- 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));
17099
18074
  if (args.store.isProjectHidden(args.repoKey)) {
17100
18075
  return {
17101
18076
  importedChatIds: [],
@@ -17117,7 +18092,7 @@ async function importProjectHistory(args) {
17117
18092
  entries: []
17118
18093
  })),
17119
18094
  skippedSessionKeys: new Set
17120
- } : collectProjectChats(args.homeDir ?? homedir14(), normalizedPaths, existingSessionKeys);
18095
+ } : collectProjectChats(args.homeDir ?? homedir15(), normalizedPaths, existingSessionKeys);
17121
18096
  for (const chat of existingChats.filter((candidate) => {
17122
18097
  if (!candidate.provider || !candidate.sessionToken)
17123
18098
  return false;
@@ -17212,8 +18187,8 @@ function isClientEnvelope(value) {
17212
18187
  }
17213
18188
 
17214
18189
  // src/server/external-open.ts
17215
- import { stat as stat5 } from "fs/promises";
17216
- import path23 from "path";
18190
+ import { stat as stat6 } from "fs/promises";
18191
+ import path25 from "path";
17217
18192
  import process9 from "process";
17218
18193
  var DEFAULT_EDITOR_SETTINGS = {
17219
18194
  preset: "cursor",
@@ -17222,7 +18197,7 @@ var DEFAULT_EDITOR_SETTINGS = {
17222
18197
  async function openExternal(command) {
17223
18198
  const resolvedPath = resolveLocalPath(command.localPath);
17224
18199
  const platform = process9.platform;
17225
- 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;
17226
18201
  if (command.action === "open_editor") {
17227
18202
  if (!info) {
17228
18203
  throw new Error(`Path not found: ${resolvedPath}`);
@@ -17271,7 +18246,7 @@ async function openExternal(command) {
17271
18246
  }
17272
18247
  }
17273
18248
  if (command.action === "open_finder") {
17274
- spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath : path23.dirname(resolvedPath)]);
18249
+ spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath : path25.dirname(resolvedPath)]);
17275
18250
  return;
17276
18251
  }
17277
18252
  if (command.action === "open_terminal") {
@@ -17468,9 +18443,19 @@ function createRealtimeDeltaPublisher({
17468
18443
  function publishSidebarEvent(event) {
17469
18444
  publishToSubscriptions((topic) => topic.type === "sidebar", event);
17470
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
+ }
17471
18455
  return {
17472
18456
  sendInitialSnapshot: sendSnapshot,
17473
18457
  sendRefreshSnapshot: sendSnapshot,
18458
+ refreshChatSnapshot,
17474
18459
  publishChatMessageAppended(chatId, entry) {
17475
18460
  publishChatEvent(chatId, { type: "chat.message-appended", chatId, entry });
17476
18461
  },
@@ -17492,6 +18477,13 @@ function createRealtimeDeltaPublisher({
17492
18477
  publishChatPendingToolSet(chatId, pendingTool) {
17493
18478
  publishChatEvent(chatId, { type: "chat.pending-tool-set", chatId, pendingTool });
17494
18479
  },
18480
+ publishChatOutboundQueueSet(chatId, queuedMessages) {
18481
+ publishChatEvent(chatId, {
18482
+ type: "chat.outbound-queue-set",
18483
+ chatId,
18484
+ queuedMessages
18485
+ });
18486
+ },
17495
18487
  publishChatSessionTokenSet(chatId, sessionToken, hydrationState) {
17496
18488
  publishChatEvent(chatId, {
17497
18489
  type: "chat.session-token-set",
@@ -17666,9 +18658,7 @@ function resolveChatUsage({
17666
18658
  // src/server/ws-router.ts
17667
18659
  var PROVIDER_USAGE_POLL_INTERVAL_MS = 30 * 60 * 1000;
17668
18660
  var PROVIDER_USAGE_POLL_MAX_INTERVAL_MS = 31 * 60 * 1000;
17669
- var INITIAL_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
17670
18661
  var INITIAL_CHAT_WINDOW_MIN_ENTRIES = 240;
17671
- var LOAD_MORE_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
17672
18662
  var LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES = 200;
17673
18663
  function send(ws, message) {
17674
18664
  const payload = JSON.stringify(message);
@@ -17680,7 +18670,7 @@ function send(ws, message) {
17680
18670
  function hasSidebarSnapshotState(store) {
17681
18671
  return Boolean(store && typeof store === "object" && "state" in store && store.state && typeof store.state === "object");
17682
18672
  }
17683
- function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
18673
+ function getChatTranscriptWindow(store, providerSessionIndex, chatId, targetBytes, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
17684
18674
  const startedAt = performance.now();
17685
18675
  const chat = store.getChat(chatId);
17686
18676
  const hasLocalPayload = typeof store.hasLocalChatPayload === "function" ? store.hasLocalChatPayload(chatId) : true;
@@ -17690,7 +18680,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
17690
18680
  provider: chat.provider,
17691
18681
  sessionToken: chat.sessionToken,
17692
18682
  localPath: store.getProject(chat.projectId)?.localPath ?? "",
17693
- targetBytes: INITIAL_CHAT_WINDOW_TARGET_BYTES,
18683
+ targetBytes,
17694
18684
  minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES,
17695
18685
  providerSessionIndex
17696
18686
  });
@@ -17713,7 +18703,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
17713
18703
  }
17714
18704
  if (typeof store.getMessageWindow === "function") {
17715
18705
  const transcript = store.getMessageWindow(chatId, {
17716
- targetBytes: INITIAL_CHAT_WINDOW_TARGET_BYTES,
18706
+ targetBytes,
17717
18707
  minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES
17718
18708
  });
17719
18709
  performanceDiagnostics.recordTiming("chat_open_snapshot_latency_ms", Math.round(performance.now() - startedAt), { chatId, source: "local" });
@@ -17741,6 +18731,8 @@ function topicKey(topic) {
17741
18731
  return `feature-overview:${topic.featureId}`;
17742
18732
  case "chat":
17743
18733
  return `chat:${topic.chatId}`;
18734
+ case "project-diffs":
18735
+ return `project-diffs:${topic.projectId}`;
17744
18736
  default:
17745
18737
  return topic.type;
17746
18738
  }
@@ -17751,7 +18743,9 @@ function createWsRouter({
17751
18743
  providerSessionIndex,
17752
18744
  terminals,
17753
18745
  git,
18746
+ diffs: providedDiffs,
17754
18747
  keybindings,
18748
+ generalSettings,
17755
18749
  providerSettings,
17756
18750
  providerCatalogManager,
17757
18751
  remoteAuth,
@@ -17774,7 +18768,9 @@ function createWsRouter({
17774
18768
  openUrlCommand = openUrl2,
17775
18769
  resolveChatUsageForSnapshot = resolveChatUsage
17776
18770
  }) {
18771
+ const diffs = providedDiffs ?? new DiffStore(git);
17777
18772
  const sockets = new Set;
18773
+ const getSendChunkSizeBytes = () => generalSettings?.getSnapshot().settings.sendChunkSizeBytes ?? DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
17778
18774
  const realtime = createRealtimeDeltaPublisher({
17779
18775
  sockets,
17780
18776
  send,
@@ -17851,6 +18847,16 @@ function createWsRouter({
17851
18847
  data: keybindings.getSnapshot()
17852
18848
  };
17853
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
+ }
17854
18860
  if (topic.type === "theme-settings") {
17855
18861
  return {
17856
18862
  type: "theme-settings",
@@ -17911,17 +18917,23 @@ function createWsRouter({
17911
18917
  data: store.getFeatureOverviewSnapshot(topic.featureId)
17912
18918
  };
17913
18919
  }
18920
+ if (topic.type === "project-diffs") {
18921
+ return {
18922
+ type: "project-diffs",
18923
+ data: diffs.getSnapshot(topic.projectId)
18924
+ };
18925
+ }
17914
18926
  return {
17915
18927
  type: "chat",
17916
18928
  data: (() => {
17917
18929
  const chat = store.getChat(topic.chatId);
17918
- const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
18930
+ const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, getSendChunkSizeBytes(), warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
17919
18931
  const messages = transcript.entries;
17920
18932
  return deriveChatSnapshot(store.state, agent.getChatStatus(topic.chatId), topic.chatId, () => transcript, () => getLastChatModel(store, topic.chatId), agent.getChatPendingTool(topic.chatId), resolveChatUsageForSnapshot({
17921
18933
  chat,
17922
18934
  messages,
17923
18935
  liveUsage: agent.getLiveUsage(topic.chatId)
17924
- }), 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));
17925
18937
  })()
17926
18938
  };
17927
18939
  }
@@ -17975,6 +18987,24 @@ function createWsRouter({
17975
18987
  }
17976
18988
  }
17977
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
+ }
17978
19008
  function pushFeatureOverviewSnapshot(featureId) {
17979
19009
  for (const ws of sockets) {
17980
19010
  for (const [id, topic] of ws.data.subscriptions.entries()) {
@@ -18012,6 +19042,22 @@ function createWsRouter({
18012
19042
  }
18013
19043
  }
18014
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
+ }) ?? (() => {});
18015
19061
  const disposeThemeSettingsEvents = themeSettings.onChange(() => {
18016
19062
  for (const ws of sockets) {
18017
19063
  for (const [id, topic] of ws.data.subscriptions.entries()) {
@@ -18140,6 +19186,14 @@ function createWsRouter({
18140
19186
  });
18141
19187
  return;
18142
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
+ }
18143
19197
  case "settings.readKeybindings": {
18144
19198
  send(ws, {
18145
19199
  v: PROTOCOL_VERSION,
@@ -18302,6 +19356,7 @@ function createWsRouter({
18302
19356
  }
18303
19357
  await store.hideProject(project.localPath);
18304
19358
  realtime.publishSidebarProjectRemoved(project.id);
19359
+ diffs.clearSnapshot(project.id);
18305
19360
  }
18306
19361
  await refreshDiscovery();
18307
19362
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18336,6 +19391,7 @@ function createWsRouter({
18336
19391
  await store.hideProject(command.localPath);
18337
19392
  if (existingProject) {
18338
19393
  realtime.publishSidebarProjectRemoved(existingProject.id);
19394
+ diffs.clearSnapshot(existingProject.id);
18339
19395
  }
18340
19396
  await refreshDiscovery();
18341
19397
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18530,11 +19586,35 @@ function createWsRouter({
18530
19586
  await agent.cancel(command.chatId);
18531
19587
  agent.disposeChatResources(command.chatId);
18532
19588
  await store.deleteChat(command.chatId);
19589
+ if (store.listChatsByProject(chat.projectId).length === 0) {
19590
+ diffs.clearSnapshot(chat.projectId);
19591
+ }
18533
19592
  realtime.publishChatDeleted(command.chatId);
18534
19593
  realtime.publishSidebarChatRemoved(chat.projectId, chat.featureId ?? null, command.chatId);
18535
19594
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
18536
19595
  break;
18537
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
+ }
18538
19618
  case "chat.loadMore": {
18539
19619
  const chat = store.getChat(command.chatId);
18540
19620
  const transcript = chat && !store.hasLocalChatPayload(command.chatId) && chat.provider && chat.sessionToken && (chat.provider === "claude" || chat.provider === "codex" || chat.provider === "cursor") ? hydrateProviderSessionWindow({
@@ -18542,12 +19622,12 @@ function createWsRouter({
18542
19622
  sessionToken: chat.sessionToken,
18543
19623
  localPath: store.getProject(chat.projectId)?.localPath ?? "",
18544
19624
  beforeEntryId: command.beforeEntryId,
18545
- targetBytes: command.targetBytes ?? LOAD_MORE_CHAT_WINDOW_TARGET_BYTES,
19625
+ targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
18546
19626
  minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES,
18547
19627
  providerSessionIndex
18548
19628
  }) : store.getMessageWindow(command.chatId, {
18549
19629
  beforeEntryId: command.beforeEntryId,
18550
- targetBytes: command.targetBytes ?? LOAD_MORE_CHAT_WINDOW_TARGET_BYTES,
19630
+ targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
18551
19631
  minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES
18552
19632
  });
18553
19633
  const result = {
@@ -18593,6 +19673,16 @@ function createWsRouter({
18593
19673
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
18594
19674
  break;
18595
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
+ }
18596
19686
  case "chat.cancel": {
18597
19687
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
18598
19688
  agent.cancel(command.chatId).catch((error) => {
@@ -18600,6 +19690,44 @@ function createWsRouter({
18600
19690
  });
18601
19691
  break;
18602
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
+ }
18603
19731
  case "chat.respondTool": {
18604
19732
  await agent.respondTool(command);
18605
19733
  send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
@@ -18749,6 +19877,7 @@ function createWsRouter({
18749
19877
  }
18750
19878
  disposeTerminalEvents();
18751
19879
  disposeKeybindingEvents();
19880
+ disposeGeneralSettingsEvents();
18752
19881
  disposeProviderSettingsEvents();
18753
19882
  disposeProviderCatalogEvents();
18754
19883
  disposeRemoteAuthEvents();
@@ -18786,10 +19915,10 @@ var remoteRelaySnapshotFallback = {
18786
19915
  };
18787
19916
 
18788
19917
  // src/server/remote-auth.ts
18789
- import { watch as watch4 } from "fs";
18790
- import { chmod, mkdir as mkdir8, readFile as readFile8, rename as rename2, writeFile as writeFile8 } from "fs/promises";
18791
- import { homedir as homedir15 } from "os";
18792
- 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";
18793
19922
 
18794
19923
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.js
18795
19924
  var exports_external = {};
@@ -19266,8 +20395,8 @@ function getErrorMap() {
19266
20395
  }
19267
20396
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js
19268
20397
  var makeIssue = (params) => {
19269
- const { data, path: path24, errorMaps, issueData } = params;
19270
- const fullPath = [...path24, ...issueData.path || []];
20398
+ const { data, path: path26, errorMaps, issueData } = params;
20399
+ const fullPath = [...path26, ...issueData.path || []];
19271
20400
  const fullIssue = {
19272
20401
  ...issueData,
19273
20402
  path: fullPath
@@ -19379,11 +20508,11 @@ var errorUtil;
19379
20508
 
19380
20509
  // ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/types.js
19381
20510
  class ParseInputLazyPath {
19382
- constructor(parent, value, path24, key) {
20511
+ constructor(parent, value, path26, key) {
19383
20512
  this._cachedPath = [];
19384
20513
  this.parent = parent;
19385
20514
  this.data = value;
19386
- this._path = path24;
20515
+ this._path = path26;
19387
20516
  this._key = key;
19388
20517
  }
19389
20518
  get path() {
@@ -23070,8 +24199,8 @@ function dedupeCallbackUrls(values) {
23070
24199
  return [...new Set(values)];
23071
24200
  }
23072
24201
  function getRemoteAuthTokenFilePath(stateFilePath) {
23073
- const parsedPath = path24.parse(stateFilePath);
23074
- 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}`);
23075
24204
  }
23076
24205
  function buildAllowedRemoteAuthCallbackUrls(localBaseUrl) {
23077
24206
  const currentUrl = new URL(localBaseUrl);
@@ -23236,7 +24365,7 @@ function formatJwksErrorBodyPreview(bodyText) {
23236
24365
  }
23237
24366
  async function writeFileAtomically(filePath, contents, options) {
23238
24367
  const tempFilePath = `${filePath}.${crypto.randomUUID()}.tmp`;
23239
- await writeFile8(tempFilePath, contents, {
24368
+ await writeFile9(tempFilePath, contents, {
23240
24369
  encoding: "utf8",
23241
24370
  mode: options?.mode
23242
24371
  });
@@ -23260,14 +24389,14 @@ class RemoteAuthManager {
23260
24389
  state;
23261
24390
  snapshot;
23262
24391
  listeners = new Set;
23263
- constructor(filePath = getRemoteAuthFilePath(homedir15())) {
24392
+ constructor(filePath = getRemoteAuthFilePath(homedir16())) {
23264
24393
  this.filePath = filePath;
23265
24394
  this.tokenFilePath = getRemoteAuthTokenFilePath(filePath);
23266
24395
  this.state = normalizeStoredRemoteAuthState(null);
23267
24396
  this.snapshot = createSnapshot2(this.state, getRemoteAuthFilePathDisplay());
23268
24397
  }
23269
24398
  async initialize() {
23270
- await mkdir8(path24.dirname(this.filePath), { recursive: true });
24399
+ await mkdir9(path26.dirname(this.filePath), { recursive: true });
23271
24400
  const file = Bun.file(this.filePath);
23272
24401
  if (!await file.exists()) {
23273
24402
  await this.persistState(normalizeStoredRemoteAuthState(null));
@@ -23602,7 +24731,7 @@ class RemoteAuthManager {
23602
24731
  throw lastError ?? new Error("Failed to fetch Kaizen JWKS");
23603
24732
  }
23604
24733
  async persistState(state) {
23605
- await mkdir8(path24.dirname(this.filePath), { recursive: true });
24734
+ await mkdir9(path26.dirname(this.filePath), { recursive: true });
23606
24735
  const { metadata, tokens } = splitStoredState(state);
23607
24736
  await writeFileAtomically(this.tokenFilePath, `${JSON.stringify(tokens, null, 2)}
23608
24737
  `, {
@@ -23663,10 +24792,10 @@ class RemoteAuthManager {
23663
24792
  startWatching() {
23664
24793
  this.watcher?.close();
23665
24794
  try {
23666
- this.watcher = watch4(path24.dirname(this.filePath), { persistent: false }, (eventType, filename) => {
24795
+ this.watcher = watch5(path26.dirname(this.filePath), { persistent: false }, (eventType, filename) => {
23667
24796
  if (eventType !== "change" && eventType !== "rename")
23668
24797
  return;
23669
- 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)) {
23670
24799
  return;
23671
24800
  }
23672
24801
  this.reloadFromDisk().catch((error) => {
@@ -23681,7 +24810,7 @@ class RemoteAuthManager {
23681
24810
  }
23682
24811
  async function readRemoteAuthState(filePath, tokenFilePath) {
23683
24812
  try {
23684
- const metadataText = await readFile8(filePath, "utf8");
24813
+ const metadataText = await readFile9(filePath, "utf8");
23685
24814
  const metadataValue = metadataText.trim() ? JSON.parse(metadataText) : null;
23686
24815
  const tokenValue = await readRemoteAuthTokens(tokenFilePath);
23687
24816
  const needsMigration = containsLegacyTokenFields(metadataValue) || tokenValue === null;
@@ -23705,7 +24834,7 @@ async function readRemoteAuthState(filePath, tokenFilePath) {
23705
24834
  }
23706
24835
  async function readRemoteAuthTokens(filePath) {
23707
24836
  try {
23708
- const text = await readFile8(filePath, "utf8");
24837
+ const text = await readFile9(filePath, "utf8");
23709
24838
  if (!text.trim()) {
23710
24839
  return null;
23711
24840
  }
@@ -23719,9 +24848,9 @@ async function readRemoteAuthTokens(filePath) {
23719
24848
  }
23720
24849
 
23721
24850
  // src/server/remote-relay.ts
23722
- import { mkdir as mkdir9, readFile as readFile9, writeFile as writeFile9 } from "fs/promises";
23723
- import { homedir as homedir16 } from "os";
23724
- 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";
23725
24854
  var OFFLINE_POLL_INTERVAL_MS = 15000;
23726
24855
  var HOP_BY_HOP_HEADER_NAMES = new Set([
23727
24856
  "accept-encoding",
@@ -23838,7 +24967,7 @@ class RemoteRelayManager {
23838
24967
  reconnectAttempt = 0;
23839
24968
  isIdleDisconnected = false;
23840
24969
  proxiedSockets = new Map;
23841
- constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(homedir16())) {
24970
+ constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(homedir17())) {
23842
24971
  this.remoteAuth = remoteAuth;
23843
24972
  this.machineDisplayName = machineDisplayName;
23844
24973
  this.filePath = filePath;
@@ -23848,7 +24977,7 @@ class RemoteRelayManager {
23848
24977
  async initialize(localPort, localHost) {
23849
24978
  this.localPort = localPort;
23850
24979
  this.localHost = resolveUpstreamHost(localHost);
23851
- await mkdir9(path25.dirname(this.filePath), { recursive: true });
24980
+ await mkdir10(path27.dirname(this.filePath), { recursive: true });
23852
24981
  this.state = await this.readState();
23853
24982
  this.setSnapshot(createSnapshot3(this.state));
23854
24983
  this.remoteAuth.onChange(() => {
@@ -23879,7 +25008,7 @@ class RemoteRelayManager {
23879
25008
  }
23880
25009
  async readState() {
23881
25010
  try {
23882
- const text = await readFile9(this.filePath, "utf8");
25011
+ const text = await readFile10(this.filePath, "utf8");
23883
25012
  return normalizeState(JSON.parse(text));
23884
25013
  } catch {
23885
25014
  return normalizeState(null);
@@ -23887,7 +25016,7 @@ class RemoteRelayManager {
23887
25016
  }
23888
25017
  async persistState(state) {
23889
25018
  this.state = state;
23890
- await writeFile9(this.filePath, `${JSON.stringify(state, null, 2)}
25019
+ await writeFile10(this.filePath, `${JSON.stringify(state, null, 2)}
23891
25020
  `, "utf8");
23892
25021
  }
23893
25022
  setSnapshot(snapshot) {
@@ -24029,10 +25158,6 @@ class RemoteRelayManager {
24029
25158
  this.disconnect("disabled");
24030
25159
  return;
24031
25160
  }
24032
- if (!authSnapshot.entitlements?.["remote.relay"]) {
24033
- this.disconnect("unauthorized");
24034
- return;
24035
- }
24036
25161
  if (this.isIdleDisconnected) {
24037
25162
  this.setSnapshot(createSnapshot3(this.state, { status: "idle_disconnected" }));
24038
25163
  this.startOfflinePoll();
@@ -24043,7 +25168,16 @@ class RemoteRelayManager {
24043
25168
  }
24044
25169
  this.setSnapshot(createSnapshot3(this.state, { status: "registering" }));
24045
25170
  this.stopOfflinePoll();
24046
- const registration = await this.registerMachine(authSnapshot.baseUrl, accessToken);
25171
+ let registration;
25172
+ try {
25173
+ registration = await this.registerMachine(authSnapshot.baseUrl, accessToken);
25174
+ } catch (error) {
25175
+ if (error instanceof Error && "status" in error && error.status === 403) {
25176
+ this.disconnect("unauthorized");
25177
+ return;
25178
+ }
25179
+ throw error;
25180
+ }
24047
25181
  await this.persistState({
24048
25182
  relayEnabled: this.state.relayEnabled,
24049
25183
  ownerUserId: authSnapshot.userId,
@@ -24067,7 +25201,9 @@ class RemoteRelayManager {
24067
25201
  });
24068
25202
  const payload = await response.json();
24069
25203
  if (!response.ok || !payload.data) {
24070
- throw new Error(payload.error ?? "Failed to register relay machine");
25204
+ const error = new Error(payload.error ?? "Failed to register relay machine");
25205
+ Object.assign(error, { status: response.status });
25206
+ throw error;
24071
25207
  }
24072
25208
  return payload.data;
24073
25209
  }
@@ -24370,9 +25506,9 @@ class RemoteRelayManager {
24370
25506
 
24371
25507
  // src/server/provider-session-index.ts
24372
25508
  import { existsSync as existsSync11, readFileSync as readFileSync8, readdirSync as readdirSync9, statSync as statSync8 } from "fs";
24373
- import { mkdir as mkdir10, readFile as readFile10, rename as rename3, writeFile as writeFile10 } from "fs/promises";
24374
- import { homedir as homedir17 } from "os";
24375
- import path26 from "path";
25509
+ import { mkdir as mkdir11, readFile as readFile11, rename as rename3, writeFile as writeFile11 } from "fs/promises";
25510
+ import { homedir as homedir18 } from "os";
25511
+ import path28 from "path";
24376
25512
  var PROVIDER_SESSION_INDEX_VERSION = 1;
24377
25513
  var REFRESH_INTERVAL_MS = 60000;
24378
25514
  var CODEX_SESSION_METADATA_PEEK_BYTES = 128 * 1024;
@@ -24393,7 +25529,7 @@ function collectFiles2(directory, extension) {
24393
25529
  }
24394
25530
  const files = [];
24395
25531
  for (const entry of readdirSync9(directory, { withFileTypes: true })) {
24396
- const fullPath = path26.join(directory, entry.name);
25532
+ const fullPath = path28.join(directory, entry.name);
24397
25533
  if (entry.isDirectory()) {
24398
25534
  files.push(...collectFiles2(fullPath, extension));
24399
25535
  continue;
@@ -24405,7 +25541,7 @@ function collectFiles2(directory, extension) {
24405
25541
  return files;
24406
25542
  }
24407
25543
  function normalizePath(localPath) {
24408
- return path26.normalize(localPath);
25544
+ return path28.normalize(localPath);
24409
25545
  }
24410
25546
  function firstLine3(value, fallback) {
24411
25547
  const line = value.split(`
@@ -24439,7 +25575,7 @@ function readClaudeSessionMetadata(sourcePath) {
24439
25575
  if (!sessionToken && typeof record.sessionId === "string") {
24440
25576
  sessionToken = record.sessionId;
24441
25577
  }
24442
- if (!localPath && typeof record.cwd === "string" && path26.isAbsolute(record.cwd)) {
25578
+ if (!localPath && typeof record.cwd === "string" && path28.isAbsolute(record.cwd)) {
24443
25579
  localPath = normalizePath(record.cwd);
24444
25580
  }
24445
25581
  if (typeof record.timestamp === "string") {
@@ -24527,7 +25663,7 @@ function readCodexSessionMetadata2(sourcePath) {
24527
25663
  if (!sessionToken && typeof payloadRecord2.id === "string") {
24528
25664
  sessionToken = payloadRecord2.id;
24529
25665
  }
24530
- if (!localPath && typeof payloadRecord2.cwd === "string" && path26.isAbsolute(payloadRecord2.cwd)) {
25666
+ if (!localPath && typeof payloadRecord2.cwd === "string" && path28.isAbsolute(payloadRecord2.cwd)) {
24531
25667
  localPath = normalizePath(payloadRecord2.cwd);
24532
25668
  }
24533
25669
  }
@@ -24578,7 +25714,7 @@ function readCursorSessionMetadata(sourcePath, localPath) {
24578
25714
  const stats = statSync8(sourcePath);
24579
25715
  const lines = readFileSync8(sourcePath, "utf8").split(`
24580
25716
  `);
24581
- const sessionToken = path26.basename(sourcePath, ".jsonl");
25717
+ const sessionToken = path28.basename(sourcePath, ".jsonl");
24582
25718
  let title = null;
24583
25719
  for (const line of lines) {
24584
25720
  if (!line.trim())
@@ -24637,8 +25773,8 @@ class ProviderSessionIndex {
24637
25773
  sessionsByKey = new Map;
24638
25774
  refreshTimer = null;
24639
25775
  refreshInFlight = null;
24640
- constructor(dataDir, homeDir = homedir17()) {
24641
- this.indexPath = path26.join(dataDir, "provider-session-index.json");
25776
+ constructor(dataDir, homeDir = homedir18()) {
25777
+ this.indexPath = path28.join(dataDir, "provider-session-index.json");
24642
25778
  this.homeDir = homeDir;
24643
25779
  }
24644
25780
  async initialize() {
@@ -24685,7 +25821,7 @@ class ProviderSessionIndex {
24685
25821
  visiblePaths.add(normalizePath(worktreePath));
24686
25822
  }
24687
25823
  }
24688
- for (const sourcePath of collectFiles2(path26.join(this.homeDir, ".claude", "projects"), ".jsonl")) {
25824
+ for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".claude", "projects"), ".jsonl")) {
24689
25825
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readClaudeSessionMetadata(sourcePath);
24690
25826
  if (!metadata || !visiblePaths.has(metadata.localPath))
24691
25827
  continue;
@@ -24696,7 +25832,7 @@ class ProviderSessionIndex {
24696
25832
  indexedPaths.add(sourcePath);
24697
25833
  }
24698
25834
  }
24699
- for (const sourcePath of collectFiles2(path26.join(this.homeDir, ".codex", "sessions"), ".jsonl")) {
25835
+ for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".codex", "sessions"), ".jsonl")) {
24700
25836
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCodexSessionMetadata2(sourcePath);
24701
25837
  if (!metadata || !visiblePaths.has(metadata.localPath))
24702
25838
  continue;
@@ -24708,7 +25844,7 @@ class ProviderSessionIndex {
24708
25844
  }
24709
25845
  }
24710
25846
  for (const localPath of visiblePaths) {
24711
- const transcriptRoot = path26.join(this.homeDir, ".cursor", "projects", encodeCursorProjectPath2(localPath), "agent-transcripts");
25847
+ const transcriptRoot = path28.join(this.homeDir, ".cursor", "projects", encodeCursorProjectPath2(localPath), "agent-transcripts");
24712
25848
  for (const sourcePath of collectFiles2(transcriptRoot, ".jsonl")) {
24713
25849
  const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCursorSessionMetadata(sourcePath, localPath);
24714
25850
  if (!metadata)
@@ -24782,7 +25918,7 @@ class ProviderSessionIndex {
24782
25918
  async loadPersistedIndex() {
24783
25919
  if (!existsSync11(this.indexPath))
24784
25920
  return;
24785
- const raw = await readFile10(this.indexPath, "utf8").catch(() => "");
25921
+ const raw = await readFile11(this.indexPath, "utf8").catch(() => "");
24786
25922
  if (!raw.trim())
24787
25923
  return;
24788
25924
  try {
@@ -24814,8 +25950,8 @@ class ProviderSessionIndex {
24814
25950
  sessions: [...this.sessionsByKey.values()].sort(sessionSort)
24815
25951
  };
24816
25952
  const tempPath = `${this.indexPath}.tmp`;
24817
- await mkdir10(path26.dirname(this.indexPath), { recursive: true });
24818
- await writeFile10(tempPath, JSON.stringify(payload, null, 2), "utf8");
25953
+ await mkdir11(path28.dirname(this.indexPath), { recursive: true });
25954
+ await writeFile11(tempPath, JSON.stringify(payload, null, 2), "utf8");
24819
25955
  await rename3(tempPath, this.indexPath);
24820
25956
  }
24821
25957
  }
@@ -24855,10 +25991,13 @@ async function startKaizenServer(options = {}) {
24855
25991
  let router = null;
24856
25992
  const terminals = new TerminalManager;
24857
25993
  const git = new GitManager;
25994
+ const diffs = new DiffStore(git);
24858
25995
  const keybindings = new KeybindingsManager;
24859
25996
  await keybindings.initialize();
24860
25997
  const providerSettings = new ProviderSettingsManager;
24861
25998
  await providerSettings.initialize();
25999
+ const generalSettings = new GeneralSettingsManager;
26000
+ await generalSettings.initialize();
24862
26001
  const providerCatalogManager = new ProviderCatalogManager;
24863
26002
  await providerCatalogManager.initialize();
24864
26003
  const remoteAuth = new RemoteAuthManager;
@@ -24875,7 +26014,7 @@ async function startKaizenServer(options = {}) {
24875
26014
  }) : null;
24876
26015
  const agent = new AgentCoordinator({
24877
26016
  store,
24878
- attachmentsDir: path27.join(store.dataDir, "attachments"),
26017
+ attachmentsDir: path29.join(store.dataDir, "attachments"),
24879
26018
  providerSettingsManager: providerSettings,
24880
26019
  providerCatalogManager,
24881
26020
  remoteAuthManager: remoteAuth,
@@ -24900,7 +26039,9 @@ async function startKaizenServer(options = {}) {
24900
26039
  providerSessionIndex,
24901
26040
  terminals,
24902
26041
  git,
26042
+ diffs,
24903
26043
  keybindings,
26044
+ generalSettings,
24904
26045
  providerSettings,
24905
26046
  providerCatalogManager,
24906
26047
  remoteAuth,
@@ -24915,7 +26056,7 @@ async function startKaizenServer(options = {}) {
24915
26056
  agent.setRealtime(router.realtime);
24916
26057
  }
24917
26058
  providerSessionIndex.start(() => store.listProjects());
24918
- const distDir = path27.join(import.meta.dir, "..", "..", "dist", "client");
26059
+ const distDir = path29.join(import.meta.dir, "..", "..", "dist", "client");
24919
26060
  const MAX_PORT_ATTEMPTS = 20;
24920
26061
  let actualPort = port;
24921
26062
  for (let attempt = 0;attempt < MAX_PORT_ATTEMPTS; attempt++) {
@@ -24966,7 +26107,7 @@ async function startKaizenServer(options = {}) {
24966
26107
  });
24967
26108
  }
24968
26109
  if (url.pathname.startsWith(`${ATTACHMENTS_ROUTE_PREFIX}/`)) {
24969
- return serveAttachment(path27.join(store.dataDir, "attachments"), url.pathname);
26110
+ return serveAttachment(path29.join(store.dataDir, "attachments"), url.pathname);
24970
26111
  }
24971
26112
  return serveStatic(distDir, req, url.pathname);
24972
26113
  },
@@ -25027,6 +26168,7 @@ async function startKaizenServer(options = {}) {
25027
26168
  providerSessionIndex.dispose();
25028
26169
  keybindings.dispose();
25029
26170
  providerSettings.dispose();
26171
+ generalSettings.dispose();
25030
26172
  remoteAuth.dispose();
25031
26173
  remoteRelay.dispose();
25032
26174
  themeSettings.dispose();
@@ -25162,8 +26304,8 @@ async function serveCompressed(originalFilePath, request, cacheControl) {
25162
26304
  }
25163
26305
  async function serveStatic(distDir, request, pathname) {
25164
26306
  const requestedPath = pathname === "/" ? "/index.html" : pathname;
25165
- const filePath = path27.join(distDir, requestedPath);
25166
- const indexPath = path27.join(distDir, "index.html");
26307
+ const filePath = path29.join(distDir, requestedPath);
26308
+ const indexPath = path29.join(distDir, "index.html");
25167
26309
  const cacheControl = getCacheControlHeader(requestedPath);
25168
26310
  const file = Bun.file(filePath);
25169
26311
  if (await file.exists()) {