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