kaizenai 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{FeatureOverviewPage-Cbp5uhtA.js → FeatureOverviewPage-CFYLJ3BM.js} +2 -2
- package/dist/client/assets/FeatureOverviewPage-CFYLJ3BM.js.br +0 -0
- package/dist/client/assets/FeatureOverviewPage-CFYLJ3BM.js.gz +0 -0
- package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js +21 -0
- package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js.br +0 -0
- package/dist/client/assets/LocalProjectsPage-rVcfQqeI.js.gz +0 -0
- package/dist/client/assets/SettingsPage-DQ7vlMU3.js +51 -0
- package/dist/client/assets/SettingsPage-DQ7vlMU3.js.br +0 -0
- package/dist/client/assets/SettingsPage-DQ7vlMU3.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-BoB-RrDz.js +6 -0
- package/dist/client/assets/eye-BoB-RrDz.js.br +0 -0
- package/dist/client/assets/eye-BoB-RrDz.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-C6T6qDr6.js +2500 -0
- package/dist/client/assets/index-C6T6qDr6.js.br +0 -0
- package/dist/client/assets/index-C6T6qDr6.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 -1
- package/dist/server/cli.js +1297 -155
- package/package.json +2 -1
- package/dist/client/assets/FeatureOverviewPage-Cbp5uhtA.js.br +0 -0
- package/dist/client/assets/FeatureOverviewPage-Cbp5uhtA.js.gz +0 -0
- package/dist/client/assets/LocalProjectsPage-CihqlQOs.js +0 -21
- package/dist/client/assets/LocalProjectsPage-CihqlQOs.js.br +0 -0
- package/dist/client/assets/LocalProjectsPage-CihqlQOs.js.gz +0 -0
- package/dist/client/assets/SettingsPage-jZce-i3Z.js +0 -51
- package/dist/client/assets/SettingsPage-jZce-i3Z.js.br +0 -0
- package/dist/client/assets/SettingsPage-jZce-i3Z.js.gz +0 -0
- package/dist/client/assets/eye-BkdZGixK.js +0 -11
- package/dist/client/assets/eye-BkdZGixK.js.br +0 -0
- package/dist/client/assets/eye-BkdZGixK.js.gz +0 -0
- package/dist/client/assets/index-B7C7C1FY.js +0 -608
- package/dist/client/assets/index-B7C7C1FY.js.br +0 -0
- package/dist/client/assets/index-B7C7C1FY.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/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.1",
|
|
26
26
|
description: "Local web UI for coding agents",
|
|
27
27
|
keywords: [
|
|
28
28
|
"claude",
|
|
@@ -79,6 +79,7 @@ var package_default = {
|
|
|
79
79
|
},
|
|
80
80
|
dependencies: {
|
|
81
81
|
"@anthropic-ai/claude-agent-sdk": "^0.2.39",
|
|
82
|
+
"@pierre/diffs": "^1.1.12",
|
|
82
83
|
"@radix-ui/react-context-menu": "^2.2.16",
|
|
83
84
|
"@radix-ui/react-select": "^2.2.6",
|
|
84
85
|
"@xterm/addon-fit": "^0.11.0",
|
|
@@ -183,6 +184,9 @@ function getManagedBackgroundsDirPath(homeDir, env = getRuntimeEnv()) {
|
|
|
183
184
|
function getProviderSettingsFilePath(homeDir, env = getRuntimeEnv()) {
|
|
184
185
|
return `${getDataRootDir(homeDir, env)}/providers.json`;
|
|
185
186
|
}
|
|
187
|
+
function getGeneralSettingsFilePath(homeDir, env = getRuntimeEnv()) {
|
|
188
|
+
return `${getDataRootDir(homeDir, env)}/general.json`;
|
|
189
|
+
}
|
|
186
190
|
function getRemoteAuthFilePath(homeDir, env = getRuntimeEnv()) {
|
|
187
191
|
return `${getDataRootDir(homeDir, env)}/remote-auth.json`;
|
|
188
192
|
}
|
|
@@ -829,7 +833,7 @@ ${stderr}`);
|
|
|
829
833
|
}
|
|
830
834
|
|
|
831
835
|
// src/server/server.ts
|
|
832
|
-
import
|
|
836
|
+
import path29 from "path";
|
|
833
837
|
import QRCode2 from "qrcode";
|
|
834
838
|
|
|
835
839
|
// src/server/event-store.ts
|
|
@@ -1033,6 +1037,12 @@ var OPENROUTER_ATTACHMENT_CAPABILITIES = {
|
|
|
1033
1037
|
markdown: true,
|
|
1034
1038
|
document: true
|
|
1035
1039
|
};
|
|
1040
|
+
var MIN_SEND_CHUNK_SIZE_BYTES = 16 * 1024;
|
|
1041
|
+
var MAX_SEND_CHUNK_SIZE_BYTES = 1024 * 1024;
|
|
1042
|
+
var DEFAULT_SENT_CHUNK_SIZE_BYTES = 200 * 1024;
|
|
1043
|
+
var DEFAULT_GENERAL_SETTINGS = {
|
|
1044
|
+
sendChunkSizeBytes: DEFAULT_SENT_CHUNK_SIZE_BYTES
|
|
1045
|
+
};
|
|
1036
1046
|
var FEATURE_ACCESS_REQUIREMENTS = {
|
|
1037
1047
|
openrouter: "account",
|
|
1038
1048
|
providerUsage: "account",
|
|
@@ -4202,7 +4212,7 @@ function normalizeToolCall(args) {
|
|
|
4202
4212
|
|
|
4203
4213
|
// src/server/attachments.ts
|
|
4204
4214
|
import path5 from "path";
|
|
4205
|
-
import { mkdir as mkdir3, writeFile as writeFile2 } from "fs/promises";
|
|
4215
|
+
import { mkdir as mkdir3, unlink, writeFile as writeFile2 } from "fs/promises";
|
|
4206
4216
|
var ATTACHMENTS_ROUTE_PREFIX = "/attachments";
|
|
4207
4217
|
var MAX_CHAT_IMAGE_DATA_URL_CHARS = 14000000;
|
|
4208
4218
|
var MAX_CHAT_DOCUMENT_DATA_URL_CHARS = 30000000;
|
|
@@ -4312,6 +4322,23 @@ async function persistChatAttachments(input) {
|
|
|
4312
4322
|
}
|
|
4313
4323
|
return persisted;
|
|
4314
4324
|
}
|
|
4325
|
+
async function deleteStagedAttachmentsForUserPrompt(input) {
|
|
4326
|
+
const attachments = input.userPrompt.attachments;
|
|
4327
|
+
if (!attachments?.length)
|
|
4328
|
+
return;
|
|
4329
|
+
for (const attachment of attachments) {
|
|
4330
|
+
const filePath = resolveAttachmentPath(input.attachmentsDir, attachment.relativePath);
|
|
4331
|
+
if (!filePath)
|
|
4332
|
+
continue;
|
|
4333
|
+
try {
|
|
4334
|
+
await unlink(filePath);
|
|
4335
|
+
} catch (error) {
|
|
4336
|
+
if (error.code !== "ENOENT") {
|
|
4337
|
+
throw error;
|
|
4338
|
+
}
|
|
4339
|
+
}
|
|
4340
|
+
}
|
|
4341
|
+
}
|
|
4315
4342
|
|
|
4316
4343
|
// src/server/codex-app-server.ts
|
|
4317
4344
|
import { spawn as spawn2 } from "child_process";
|
|
@@ -7954,6 +7981,33 @@ function normalizeOpenCodeToolResult(args) {
|
|
|
7954
7981
|
isError: args.status === "failed"
|
|
7955
7982
|
};
|
|
7956
7983
|
}
|
|
7984
|
+
function looksLikeDeliveredPlan(assistantText) {
|
|
7985
|
+
const trimmed = assistantText.trim();
|
|
7986
|
+
if (trimmed.length < 160)
|
|
7987
|
+
return false;
|
|
7988
|
+
const markdownHeadings = trimmed.match(/(^|\n)#{1,6}\s+/g)?.length ?? 0;
|
|
7989
|
+
const listItems = trimmed.match(/(^|\n)(?:\d+\.\s+|[-*]\s+)/g)?.length ?? 0;
|
|
7990
|
+
const hasTable = /\|[^\n]+\|/.test(trimmed);
|
|
7991
|
+
const hasPlanHeading = /(^|\n)#{1,6}\s+.*\bplan\b/m.test(trimmed);
|
|
7992
|
+
const hasApprovalPrompt = /do you want me to proceed|would you like any changes to this plan|should i proceed with implementation|ready to proceed with implementation|does this plan look good/i.test(trimmed);
|
|
7993
|
+
return hasPlanHeading && (markdownHeadings >= 2 || listItems >= 3 || hasTable) || hasApprovalPrompt && (markdownHeadings >= 1 || listItems >= 3 || hasTable);
|
|
7994
|
+
}
|
|
7995
|
+
function createSyntheticOpenCodeExitPlanTool(context, turn) {
|
|
7996
|
+
const observedExitPlanTool = [...turn.toolCalls.values()].find((tool) => tool.toolKind === "exit_plan_mode");
|
|
7997
|
+
if (observedExitPlanTool && turn.interactiveToolRequestIds.has(observedExitPlanTool.toolId)) {
|
|
7998
|
+
return null;
|
|
7999
|
+
}
|
|
8000
|
+
if (turn.sawExitPlanModeCall && !observedExitPlanTool)
|
|
8001
|
+
return null;
|
|
8002
|
+
if (!looksLikeDeliveredPlan(turn.assistantText))
|
|
8003
|
+
return null;
|
|
8004
|
+
const hydrated = populateExitPlanFromAssistantText(observedExitPlanTool ?? normalizeToolCall({
|
|
8005
|
+
toolName: "ExitPlanMode",
|
|
8006
|
+
toolId: `${context.sessionId ?? "opencode"}:${randomUUID5()}:synthetic-exit-plan`,
|
|
8007
|
+
input: {}
|
|
8008
|
+
}), turn.assistantText);
|
|
8009
|
+
return hydrated.toolKind === "exit_plan_mode" && hydrated.input.plan ? hydrated : null;
|
|
8010
|
+
}
|
|
7957
8011
|
function extractOpenCodeStderrTurnError(line) {
|
|
7958
8012
|
const jsonMatch = line.match(/error=(\{.*\})\s+stream error$/);
|
|
7959
8013
|
if (jsonMatch) {
|
|
@@ -8728,6 +8782,14 @@ class OpenCodeAcpManager {
|
|
|
8728
8782
|
return;
|
|
8729
8783
|
if (turn.pendingInteractiveToolIds.size > 0)
|
|
8730
8784
|
return;
|
|
8785
|
+
if (context.currentPlanMode && !turn.completedExitPlanMode) {
|
|
8786
|
+
const syntheticExitPlan = createSyntheticOpenCodeExitPlanTool(context, turn);
|
|
8787
|
+
if (syntheticExitPlan) {
|
|
8788
|
+
turn.toolCalls.set(syntheticExitPlan.toolId, syntheticExitPlan);
|
|
8789
|
+
await this.requestInteractiveTool(context, turn, syntheticExitPlan);
|
|
8790
|
+
return;
|
|
8791
|
+
}
|
|
8792
|
+
}
|
|
8731
8793
|
if (context.currentPlanMode && !turn.completedExitPlanMode) {
|
|
8732
8794
|
const failureMessage = turn.sawExitPlanModeCall ? `OpenCode ended the plan turn with stop reason "${turn.promptStopReason}" before exit_plan_mode was confirmed. No plan was delivered for approval.` : `OpenCode ended the plan turn with stop reason "${turn.promptStopReason}" without calling exit_plan_mode. No plan was delivered for approval.`;
|
|
8733
8795
|
this.failPendingTurn(context, turn, failureMessage);
|
|
@@ -11704,7 +11766,7 @@ function deriveSuggestedProjectFolders(state, discoveredProjects) {
|
|
|
11704
11766
|
}
|
|
11705
11767
|
return [...candidates.entries()].map(([localPath, label]) => ({ localPath, label })).slice(0, 12);
|
|
11706
11768
|
}
|
|
11707
|
-
function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, getLastModel, pendingTool = null, usage = null, providerSettings, availableProviders) {
|
|
11769
|
+
function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, getLastModel, pendingTool = null, usage = null, diffs = null, providerSettings, availableProviders, queuedOutbound) {
|
|
11708
11770
|
const chat = state.chatsById.get(chatId);
|
|
11709
11771
|
if (!chat || chat.deletedAt)
|
|
11710
11772
|
return null;
|
|
@@ -11724,6 +11786,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
|
|
|
11724
11786
|
sessionToken: chat.sessionToken,
|
|
11725
11787
|
updatedAt: chat.updatedAt,
|
|
11726
11788
|
pendingTool,
|
|
11789
|
+
queuedOutbound: queuedOutbound && queuedOutbound.length > 0 ? queuedOutbound : undefined,
|
|
11727
11790
|
hydrationState: chat.hydrationState ?? "local",
|
|
11728
11791
|
inactiveProviderMessage: provider ? getProviderInactiveMessage(provider, providerSettings) : null
|
|
11729
11792
|
};
|
|
@@ -11733,6 +11796,7 @@ function deriveChatSnapshot(state, activeStatus, chatId, getTranscriptWindow, ge
|
|
|
11733
11796
|
runtime,
|
|
11734
11797
|
messages: transcript.entries,
|
|
11735
11798
|
transcript,
|
|
11799
|
+
diffs,
|
|
11736
11800
|
usage,
|
|
11737
11801
|
availableProviders: availableProviders ?? getSelectableProviders(providerSettings),
|
|
11738
11802
|
providerSettings
|
|
@@ -11759,6 +11823,25 @@ var CLAUDE_TOOLSET = [
|
|
|
11759
11823
|
"ExitPlanMode"
|
|
11760
11824
|
];
|
|
11761
11825
|
var CHAT_RESOURCE_IDLE_TTL_MS = 2 * 60 * 1000;
|
|
11826
|
+
function previewForOutboundQueue(text, attachmentCount = 0) {
|
|
11827
|
+
const singleLine = text.trim().replace(/\s+/g, " ");
|
|
11828
|
+
if (!singleLine) {
|
|
11829
|
+
return attachmentCount > 1 ? `${attachmentCount} attachments` : "Attachment";
|
|
11830
|
+
}
|
|
11831
|
+
if (singleLine.length <= 120)
|
|
11832
|
+
return singleLine;
|
|
11833
|
+
return `${singleLine.slice(0, 117)}...`;
|
|
11834
|
+
}
|
|
11835
|
+
function restampTranscriptEntryAfterLatest(latestCreatedAt, entry) {
|
|
11836
|
+
const createdAt = Math.max(Date.now(), latestCreatedAt + 1);
|
|
11837
|
+
if (entry.createdAt >= createdAt) {
|
|
11838
|
+
return entry;
|
|
11839
|
+
}
|
|
11840
|
+
return {
|
|
11841
|
+
...entry,
|
|
11842
|
+
createdAt
|
|
11843
|
+
};
|
|
11844
|
+
}
|
|
11762
11845
|
var noopRealtime = {
|
|
11763
11846
|
publishChatMessageAppended: () => {},
|
|
11764
11847
|
publishChatMessagesAppended: () => {},
|
|
@@ -11771,6 +11854,7 @@ var noopRealtime = {
|
|
|
11771
11854
|
publishChatUsageSet: () => {},
|
|
11772
11855
|
publishChatAvailableProvidersSet: () => {},
|
|
11773
11856
|
publishChatTranscriptWindowMetaSet: () => {},
|
|
11857
|
+
publishChatOutboundQueueSet: () => {},
|
|
11774
11858
|
publishChatDeleted: () => {},
|
|
11775
11859
|
publishSidebarChatFieldsSet: () => {},
|
|
11776
11860
|
publishSidebarChatAdded: () => {},
|
|
@@ -12217,6 +12301,10 @@ class AgentCoordinator {
|
|
|
12217
12301
|
providerCatalogManager;
|
|
12218
12302
|
generateTitle;
|
|
12219
12303
|
activeTurns = new Map;
|
|
12304
|
+
outboundQueues = new Map;
|
|
12305
|
+
drainingOutboundQueues = new Set;
|
|
12306
|
+
outboundQueueRetryTimers = new Map;
|
|
12307
|
+
latestTranscriptCreatedAt = new Map;
|
|
12220
12308
|
liveUsage = new Map;
|
|
12221
12309
|
disposeTimers = new Map;
|
|
12222
12310
|
realtime = noopRealtime;
|
|
@@ -12298,7 +12386,10 @@ class AgentCoordinator {
|
|
|
12298
12386
|
return state?.projectsById ? this.store.state : null;
|
|
12299
12387
|
}
|
|
12300
12388
|
async prewarmEnabledProviders(providers, localPath = process.cwd()) {
|
|
12301
|
-
const orderedProviders = providers.includes("codex") ? [
|
|
12389
|
+
const orderedProviders = providers.includes("codex") ? [
|
|
12390
|
+
"codex",
|
|
12391
|
+
...providers.filter((provider) => provider !== "codex")
|
|
12392
|
+
] : providers;
|
|
12302
12393
|
for (const provider of orderedProviders) {
|
|
12303
12394
|
try {
|
|
12304
12395
|
await this.providerRuntimeSupervisor.prewarmPrimary(provider, localPath);
|
|
@@ -12408,6 +12499,169 @@ class AgentCoordinator {
|
|
|
12408
12499
|
this.realtime.publishChatUsageSet(chatId, this.getLiveUsage(chatId));
|
|
12409
12500
|
this.realtime.publishSidebarProviderUsageSet(this.getProviderUsage());
|
|
12410
12501
|
}
|
|
12502
|
+
publishOutboundQueueSet(chatId) {
|
|
12503
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12504
|
+
const queuedMessages = queue?.map((item) => ({
|
|
12505
|
+
id: item.id,
|
|
12506
|
+
preview: item.preview,
|
|
12507
|
+
text: item.content,
|
|
12508
|
+
attachmentCount: item.attachmentCount
|
|
12509
|
+
})) ?? [];
|
|
12510
|
+
this.realtime.publishChatOutboundQueueSet(chatId, queuedMessages);
|
|
12511
|
+
}
|
|
12512
|
+
getQueuedOutboundPreview(chatId) {
|
|
12513
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12514
|
+
return queue?.map((item) => ({
|
|
12515
|
+
id: item.id,
|
|
12516
|
+
preview: item.preview,
|
|
12517
|
+
text: item.content,
|
|
12518
|
+
attachmentCount: item.attachmentCount
|
|
12519
|
+
})) ?? [];
|
|
12520
|
+
}
|
|
12521
|
+
getLatestTranscriptCreatedAt(chatId) {
|
|
12522
|
+
const cached = this.latestTranscriptCreatedAt.get(chatId);
|
|
12523
|
+
if (cached !== undefined) {
|
|
12524
|
+
return cached;
|
|
12525
|
+
}
|
|
12526
|
+
const latest = this.store.getMessages(chatId).reduce((max, entry) => Math.max(max, entry.createdAt), 0);
|
|
12527
|
+
this.latestTranscriptCreatedAt.set(chatId, latest);
|
|
12528
|
+
return latest;
|
|
12529
|
+
}
|
|
12530
|
+
restampTranscriptEntryAfterLatest(chatId, entry) {
|
|
12531
|
+
const latestCreatedAt = this.getLatestTranscriptCreatedAt(chatId);
|
|
12532
|
+
const restamped = restampTranscriptEntryAfterLatest(latestCreatedAt, entry);
|
|
12533
|
+
this.latestTranscriptCreatedAt.set(chatId, Math.max(latestCreatedAt, restamped.createdAt));
|
|
12534
|
+
return restamped;
|
|
12535
|
+
}
|
|
12536
|
+
async clearOutboundQueueForChat(chatId) {
|
|
12537
|
+
const retryTimer = this.outboundQueueRetryTimers.get(chatId);
|
|
12538
|
+
if (retryTimer) {
|
|
12539
|
+
clearTimeout(retryTimer);
|
|
12540
|
+
this.outboundQueueRetryTimers.delete(chatId);
|
|
12541
|
+
}
|
|
12542
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12543
|
+
if (!queue?.length) {
|
|
12544
|
+
this.outboundQueues.delete(chatId);
|
|
12545
|
+
this.publishOutboundQueueSet(chatId);
|
|
12546
|
+
return;
|
|
12547
|
+
}
|
|
12548
|
+
for (const item of queue) {
|
|
12549
|
+
await this.safeDeleteQueuedPromptAttachments(chatId, item.userPrompt);
|
|
12550
|
+
}
|
|
12551
|
+
this.outboundQueues.delete(chatId);
|
|
12552
|
+
this.publishOutboundQueueSet(chatId);
|
|
12553
|
+
}
|
|
12554
|
+
async safeDeleteQueuedPromptAttachments(chatId, userPrompt) {
|
|
12555
|
+
try {
|
|
12556
|
+
await deleteStagedAttachmentsForUserPrompt({
|
|
12557
|
+
attachmentsDir: this.attachmentsDir,
|
|
12558
|
+
userPrompt
|
|
12559
|
+
});
|
|
12560
|
+
} catch (error) {
|
|
12561
|
+
console.error("Failed to delete staged queued attachments:", {
|
|
12562
|
+
chatId,
|
|
12563
|
+
userPromptId: userPrompt._id,
|
|
12564
|
+
error
|
|
12565
|
+
});
|
|
12566
|
+
}
|
|
12567
|
+
}
|
|
12568
|
+
async maybeDrainOutboundQueueHead(chatId) {
|
|
12569
|
+
if (this.activeTurns.has(chatId))
|
|
12570
|
+
return;
|
|
12571
|
+
if (this.drainingOutboundQueues.has(chatId))
|
|
12572
|
+
return;
|
|
12573
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12574
|
+
if (!queue?.length)
|
|
12575
|
+
return;
|
|
12576
|
+
const retryTimer = this.outboundQueueRetryTimers.get(chatId);
|
|
12577
|
+
if (retryTimer) {
|
|
12578
|
+
clearTimeout(retryTimer);
|
|
12579
|
+
this.outboundQueueRetryTimers.delete(chatId);
|
|
12580
|
+
}
|
|
12581
|
+
this.drainingOutboundQueues.add(chatId);
|
|
12582
|
+
const item = queue.shift();
|
|
12583
|
+
if (queue.length === 0) {
|
|
12584
|
+
this.outboundQueues.delete(chatId);
|
|
12585
|
+
}
|
|
12586
|
+
this.publishOutboundQueueSet(chatId);
|
|
12587
|
+
try {
|
|
12588
|
+
const userPrompt = this.restampTranscriptEntryAfterLatest(chatId, item.userPrompt);
|
|
12589
|
+
await this.startTurnForChat({
|
|
12590
|
+
chatId,
|
|
12591
|
+
provider: item.provider,
|
|
12592
|
+
content: item.content,
|
|
12593
|
+
attachments: userPrompt.attachments,
|
|
12594
|
+
model: item.model,
|
|
12595
|
+
effort: item.effort,
|
|
12596
|
+
serviceTier: item.serviceTier,
|
|
12597
|
+
fastMode: item.fastMode,
|
|
12598
|
+
planMode: item.planMode,
|
|
12599
|
+
appendUserPrompt: userPrompt,
|
|
12600
|
+
pushChatSnapshotRefresh: true
|
|
12601
|
+
});
|
|
12602
|
+
} catch (error) {
|
|
12603
|
+
const restored = this.outboundQueues.get(chatId) ?? [];
|
|
12604
|
+
this.outboundQueues.set(chatId, [item, ...restored]);
|
|
12605
|
+
this.publishOutboundQueueSet(chatId);
|
|
12606
|
+
console.error("Outbound queue drain failed:", error);
|
|
12607
|
+
const retryHandle = setTimeout(() => {
|
|
12608
|
+
this.outboundQueueRetryTimers.delete(chatId);
|
|
12609
|
+
const retryQueue = this.outboundQueues.get(chatId);
|
|
12610
|
+
if (!retryQueue?.length)
|
|
12611
|
+
return;
|
|
12612
|
+
if (retryQueue[0]?.id !== item.id)
|
|
12613
|
+
return;
|
|
12614
|
+
if (this.activeTurns.has(chatId))
|
|
12615
|
+
return;
|
|
12616
|
+
this.maybeDrainOutboundQueueHead(chatId);
|
|
12617
|
+
}, 1000);
|
|
12618
|
+
this.outboundQueueRetryTimers.set(chatId, retryHandle);
|
|
12619
|
+
} finally {
|
|
12620
|
+
this.drainingOutboundQueues.delete(chatId);
|
|
12621
|
+
}
|
|
12622
|
+
}
|
|
12623
|
+
async removeOutboundQueueMessage(chatId, messageId) {
|
|
12624
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12625
|
+
if (!queue) {
|
|
12626
|
+
throw new Error("Queued message not found");
|
|
12627
|
+
}
|
|
12628
|
+
const index = queue.findIndex((item) => item.id === messageId);
|
|
12629
|
+
if (index < 0) {
|
|
12630
|
+
throw new Error("Queued message not found");
|
|
12631
|
+
}
|
|
12632
|
+
const [removed] = queue.splice(index, 1);
|
|
12633
|
+
if (queue.length === 0) {
|
|
12634
|
+
this.outboundQueues.delete(chatId);
|
|
12635
|
+
}
|
|
12636
|
+
await this.safeDeleteQueuedPromptAttachments(chatId, removed.userPrompt);
|
|
12637
|
+
this.publishOutboundQueueSet(chatId);
|
|
12638
|
+
if (!this.activeTurns.has(chatId)) {
|
|
12639
|
+
await this.maybeDrainOutboundQueueHead(chatId);
|
|
12640
|
+
}
|
|
12641
|
+
}
|
|
12642
|
+
async updateOutboundQueueMessage(chatId, messageId, text) {
|
|
12643
|
+
const queue = this.outboundQueues.get(chatId);
|
|
12644
|
+
if (!queue) {
|
|
12645
|
+
throw new Error("Queued message not found");
|
|
12646
|
+
}
|
|
12647
|
+
const item = queue.find((entry) => entry.id === messageId);
|
|
12648
|
+
if (!item) {
|
|
12649
|
+
throw new Error("Queued message not found");
|
|
12650
|
+
}
|
|
12651
|
+
const trimmed = text.trim();
|
|
12652
|
+
const attachmentCount = item.userPrompt.attachments?.length ?? 0;
|
|
12653
|
+
const hasAttachments = attachmentCount > 0;
|
|
12654
|
+
if (!trimmed && !hasAttachments) {
|
|
12655
|
+
throw new Error("Message must include text or attachments");
|
|
12656
|
+
}
|
|
12657
|
+
item.content = trimmed;
|
|
12658
|
+
item.preview = previewForOutboundQueue(trimmed, attachmentCount);
|
|
12659
|
+
item.userPrompt = {
|
|
12660
|
+
...item.userPrompt,
|
|
12661
|
+
content: trimmed
|
|
12662
|
+
};
|
|
12663
|
+
this.publishOutboundQueueSet(chatId);
|
|
12664
|
+
}
|
|
12411
12665
|
async failTurnResumeAccessDenied(active, message) {
|
|
12412
12666
|
const errorEntry = timestamped3({
|
|
12413
12667
|
kind: "result",
|
|
@@ -12437,6 +12691,7 @@ class AgentCoordinator {
|
|
|
12437
12691
|
this.publishPendingTool(active.chatId);
|
|
12438
12692
|
this.publishChatStatus(active.chatId);
|
|
12439
12693
|
this.publishSidebarChatState(active.chatId);
|
|
12694
|
+
await this.maybeDrainOutboundQueueHead(active.chatId);
|
|
12440
12695
|
}
|
|
12441
12696
|
publishAvailableProviders(chatId) {
|
|
12442
12697
|
const providerSettings = this.providerSettingsManager?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS;
|
|
@@ -12571,10 +12826,14 @@ class AgentCoordinator {
|
|
|
12571
12826
|
const sidebarStoreState = this.getSidebarStoreState();
|
|
12572
12827
|
const previousSidebarIndex = args.appendUserPrompt && sidebarStoreState ? deriveSidebarChatIndex(this.store, chat.projectId, previousFeatureId, args.chatId) : -1;
|
|
12573
12828
|
if (args.appendUserPrompt) {
|
|
12574
|
-
|
|
12575
|
-
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);
|
|
12576
12832
|
this.publishTranscriptMeta(args.chatId);
|
|
12577
12833
|
this.publishPendingTool(args.chatId);
|
|
12834
|
+
if (args.pushChatSnapshotRefresh) {
|
|
12835
|
+
this.realtime.refreshChatSnapshot?.(args.chatId);
|
|
12836
|
+
}
|
|
12578
12837
|
}
|
|
12579
12838
|
await this.store.recordTurnStarted(args.chatId);
|
|
12580
12839
|
const project = this.store.getProject(chat.projectId);
|
|
@@ -12814,6 +13073,7 @@ class AgentCoordinator {
|
|
|
12814
13073
|
this.publishPendingTool(args.chatId);
|
|
12815
13074
|
this.publishChatStatus(args.chatId);
|
|
12816
13075
|
this.publishSidebarChatState(args.chatId);
|
|
13076
|
+
this.maybeDrainOutboundQueueHead(args.chatId);
|
|
12817
13077
|
}
|
|
12818
13078
|
}
|
|
12819
13079
|
assertProviderAccess(provider) {
|
|
@@ -12844,6 +13104,19 @@ class AgentCoordinator {
|
|
|
12844
13104
|
const settings = this.getProviderSettings(provider, command);
|
|
12845
13105
|
validateProviderAttachmentSupport(provider, settings.model, command.message.attachments, this.providerCatalogManager?.getSnapshot());
|
|
12846
13106
|
const text = command.message.text.trim();
|
|
13107
|
+
const requestedAttachmentCount = command.message.attachments?.length ?? 0;
|
|
13108
|
+
if (!text && requestedAttachmentCount === 0) {
|
|
13109
|
+
throw new Error("Message must include text or attachments");
|
|
13110
|
+
}
|
|
13111
|
+
const active = this.activeTurns.get(chatId);
|
|
13112
|
+
if (active?.status === "waiting_for_user") {
|
|
13113
|
+
throw new Error("Chat is waiting for a tool response");
|
|
13114
|
+
}
|
|
13115
|
+
const queue = this.outboundQueues.get(chatId);
|
|
13116
|
+
const shouldEnqueue = Boolean(queue?.length) || Boolean(active && (active.status === "starting" || active.status === "running"));
|
|
13117
|
+
if (shouldEnqueue && chat.planMode) {
|
|
13118
|
+
throw new Error("Cannot queue messages while plan mode is active");
|
|
13119
|
+
}
|
|
12847
13120
|
const userPrompt = timestamped3({
|
|
12848
13121
|
kind: "user_prompt",
|
|
12849
13122
|
content: text
|
|
@@ -12855,8 +13128,28 @@ class AgentCoordinator {
|
|
|
12855
13128
|
uploads: command.message.attachments
|
|
12856
13129
|
});
|
|
12857
13130
|
userPrompt.attachments = attachments;
|
|
12858
|
-
if (
|
|
12859
|
-
|
|
13131
|
+
if (shouldEnqueue) {
|
|
13132
|
+
const id = crypto.randomUUID();
|
|
13133
|
+
const attachmentCount = attachments?.length ?? 0;
|
|
13134
|
+
const preview = previewForOutboundQueue(text, attachmentCount);
|
|
13135
|
+
const queued = {
|
|
13136
|
+
id,
|
|
13137
|
+
preview,
|
|
13138
|
+
attachmentCount,
|
|
13139
|
+
provider,
|
|
13140
|
+
model: settings.model,
|
|
13141
|
+
effort: settings.effort,
|
|
13142
|
+
serviceTier: settings.serviceTier,
|
|
13143
|
+
fastMode: settings.fastMode,
|
|
13144
|
+
planMode: settings.planMode,
|
|
13145
|
+
content: text,
|
|
13146
|
+
userPrompt
|
|
13147
|
+
};
|
|
13148
|
+
const list = queue ?? [];
|
|
13149
|
+
list.push(queued);
|
|
13150
|
+
this.outboundQueues.set(chatId, list);
|
|
13151
|
+
this.publishOutboundQueueSet(chatId);
|
|
13152
|
+
return { chatId, queued: true, queuedMessageId: id };
|
|
12860
13153
|
}
|
|
12861
13154
|
await this.startTurnForChat({
|
|
12862
13155
|
chatId,
|
|
@@ -12922,19 +13215,20 @@ class AgentCoordinator {
|
|
|
12922
13215
|
if (event.entry.kind === "tool_call" && active.syntheticToolCallIds.delete(event.entry.tool.toolId)) {
|
|
12923
13216
|
continue;
|
|
12924
13217
|
}
|
|
12925
|
-
|
|
12926
|
-
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);
|
|
12927
13221
|
this.publishTranscriptMeta(active.chatId);
|
|
12928
13222
|
this.publishPendingTool(active.chatId);
|
|
12929
13223
|
this.publishSidebarChatState(active.chatId);
|
|
12930
|
-
if (
|
|
13224
|
+
if (entry.kind === "system_init") {
|
|
12931
13225
|
active.status = "running";
|
|
12932
13226
|
this.publishChatStatus(active.chatId);
|
|
12933
13227
|
}
|
|
12934
|
-
if (
|
|
13228
|
+
if (entry.kind === "result") {
|
|
12935
13229
|
active.hasFinalResult = true;
|
|
12936
|
-
if (
|
|
12937
|
-
await this.store.recordTurnFailed(active.chatId,
|
|
13230
|
+
if (entry.isError) {
|
|
13231
|
+
await this.store.recordTurnFailed(active.chatId, entry.result || "Turn failed");
|
|
12938
13232
|
active.status = "failed";
|
|
12939
13233
|
} else if (!active.cancelRequested) {
|
|
12940
13234
|
await this.store.recordTurnFinished(active.chatId);
|
|
@@ -13016,9 +13310,11 @@ class AgentCoordinator {
|
|
|
13016
13310
|
this.publishSidebarChatState(active.chatId);
|
|
13017
13311
|
}
|
|
13018
13312
|
}
|
|
13313
|
+
await this.maybeDrainOutboundQueueHead(active.chatId);
|
|
13019
13314
|
}
|
|
13020
13315
|
}
|
|
13021
13316
|
async cancel(chatId) {
|
|
13317
|
+
await this.clearOutboundQueueForChat(chatId);
|
|
13022
13318
|
const active = this.activeTurns.get(chatId);
|
|
13023
13319
|
if (!active)
|
|
13024
13320
|
return;
|
|
@@ -13069,6 +13365,7 @@ class AgentCoordinator {
|
|
|
13069
13365
|
await this.cancel(chatId);
|
|
13070
13366
|
return;
|
|
13071
13367
|
}
|
|
13368
|
+
await this.clearOutboundQueueForChat(chatId);
|
|
13072
13369
|
active.cancelRequested = true;
|
|
13073
13370
|
active.cancelRecorded = true;
|
|
13074
13371
|
active.hasFinalResult = true;
|
|
@@ -13543,7 +13840,83 @@ function discoverProjects(homeDir = homedir9(), adapters = DEFAULT_PROJECT_DISCO
|
|
|
13543
13840
|
|
|
13544
13841
|
// src/server/git-manager.ts
|
|
13545
13842
|
import path14 from "path";
|
|
13546
|
-
import { readFile as readFile3, writeFile as writeFile3 } from "fs/promises";
|
|
13843
|
+
import { readFile as readFile3, stat as stat4, writeFile as writeFile3 } from "fs/promises";
|
|
13844
|
+
function normalizeDiffPath(value) {
|
|
13845
|
+
return value.replaceAll("\\", "/");
|
|
13846
|
+
}
|
|
13847
|
+
function countContentLines(value) {
|
|
13848
|
+
if (value.length === 0)
|
|
13849
|
+
return 0;
|
|
13850
|
+
const normalized = value.replaceAll(`\r
|
|
13851
|
+
`, `
|
|
13852
|
+
`);
|
|
13853
|
+
return normalized.endsWith(`
|
|
13854
|
+
`) ? normalized.slice(0, -1).split(`
|
|
13855
|
+
`).length : normalized.split(`
|
|
13856
|
+
`).length;
|
|
13857
|
+
}
|
|
13858
|
+
var MAX_UNTRACKED_PREVIEW_BYTES = 128 * 1024;
|
|
13859
|
+
function buildUntrackedFilePatch(filePath, content) {
|
|
13860
|
+
const normalizedPath = normalizeDiffPath(filePath);
|
|
13861
|
+
const normalizedContent = content.replaceAll(`\r
|
|
13862
|
+
`, `
|
|
13863
|
+
`);
|
|
13864
|
+
const hasTrailingNewline = normalizedContent.endsWith(`
|
|
13865
|
+
`);
|
|
13866
|
+
const bodyLines = normalizedContent.length === 0 ? [] : normalizedContent.split(`
|
|
13867
|
+
`).slice(0, hasTrailingNewline ? -1 : undefined).map((line) => `+${line}`);
|
|
13868
|
+
const lineCount = countContentLines(normalizedContent);
|
|
13869
|
+
const patchLines = [
|
|
13870
|
+
`diff --git a/${normalizedPath} b/${normalizedPath}`,
|
|
13871
|
+
"new file mode 100644",
|
|
13872
|
+
"--- /dev/null",
|
|
13873
|
+
`+++ b/${normalizedPath}`,
|
|
13874
|
+
`@@ -0,0 +1,${lineCount} @@`,
|
|
13875
|
+
...bodyLines
|
|
13876
|
+
];
|
|
13877
|
+
if (lineCount > 0 && !hasTrailingNewline) {
|
|
13878
|
+
patchLines.push("\");
|
|
13879
|
+
}
|
|
13880
|
+
return `${patchLines.join(`
|
|
13881
|
+
`)}
|
|
13882
|
+
`;
|
|
13883
|
+
}
|
|
13884
|
+
function isBinaryBuffer(buffer) {
|
|
13885
|
+
const sample = buffer.subarray(0, Math.min(buffer.length, 8192));
|
|
13886
|
+
if (sample.includes(0))
|
|
13887
|
+
return true;
|
|
13888
|
+
try {
|
|
13889
|
+
new TextDecoder("utf-8", { fatal: true }).decode(sample);
|
|
13890
|
+
return false;
|
|
13891
|
+
} catch {}
|
|
13892
|
+
let suspiciousBytes = 0;
|
|
13893
|
+
for (const value of sample) {
|
|
13894
|
+
if (value === 9 || value === 10 || value === 13 || value >= 32 && value <= 126) {
|
|
13895
|
+
continue;
|
|
13896
|
+
}
|
|
13897
|
+
suspiciousBytes += 1;
|
|
13898
|
+
}
|
|
13899
|
+
return sample.length > 0 && suspiciousBytes / sample.length > 0.3;
|
|
13900
|
+
}
|
|
13901
|
+
function splitPatchByFile(patch) {
|
|
13902
|
+
const patchesByPath = new Map;
|
|
13903
|
+
const blocks = patch.split(/(?=^diff --git )/m).filter(Boolean);
|
|
13904
|
+
for (const block of blocks) {
|
|
13905
|
+
const lines = block.split(`
|
|
13906
|
+
`);
|
|
13907
|
+
const plusLine = lines.find((line) => line.startsWith("+++ "));
|
|
13908
|
+
const minusLine = lines.find((line) => line.startsWith("--- "));
|
|
13909
|
+
const renameToLine = lines.find((line) => line.startsWith("rename to "));
|
|
13910
|
+
const renameFromLine = lines.find((line) => line.startsWith("rename from "));
|
|
13911
|
+
const candidate = plusLine && !plusLine.includes("/dev/null") ? plusLine.replace(/^\+\+\+ b\//, "") : minusLine && !minusLine.includes("/dev/null") ? minusLine.replace(/^--- a\//, "") : renameToLine ? renameToLine.replace(/^rename to /, "") : renameFromLine ? renameFromLine.replace(/^rename from /, "") : null;
|
|
13912
|
+
if (!candidate)
|
|
13913
|
+
continue;
|
|
13914
|
+
patchesByPath.set(normalizeDiffPath(candidate), `${block}
|
|
13915
|
+
`);
|
|
13916
|
+
}
|
|
13917
|
+
return patchesByPath;
|
|
13918
|
+
}
|
|
13919
|
+
|
|
13547
13920
|
class GitManager {
|
|
13548
13921
|
async runGit(cwd, args) {
|
|
13549
13922
|
const proc = Bun.spawn(["git", "-C", cwd, ...args], {
|
|
@@ -13557,6 +13930,210 @@ class GitManager {
|
|
|
13557
13930
|
]);
|
|
13558
13931
|
return { exitCode, stdout: stdout.trim(), stderr: stderr.trim() };
|
|
13559
13932
|
}
|
|
13933
|
+
async runGitRaw(cwd, args) {
|
|
13934
|
+
const proc = Bun.spawn(["git", "-C", cwd, ...args], {
|
|
13935
|
+
stdout: "pipe",
|
|
13936
|
+
stderr: "pipe"
|
|
13937
|
+
});
|
|
13938
|
+
const [exitCode, stdout, stderr] = await Promise.all([
|
|
13939
|
+
proc.exited,
|
|
13940
|
+
new Response(proc.stdout).text(),
|
|
13941
|
+
new Response(proc.stderr).text()
|
|
13942
|
+
]);
|
|
13943
|
+
return { exitCode, stdout, stderr: stderr.trim() };
|
|
13944
|
+
}
|
|
13945
|
+
async getStatusEntries(localPath) {
|
|
13946
|
+
const result = await this.runGitRaw(localPath, [
|
|
13947
|
+
"status",
|
|
13948
|
+
"--porcelain=v1",
|
|
13949
|
+
"--untracked-files=all",
|
|
13950
|
+
"-z"
|
|
13951
|
+
]);
|
|
13952
|
+
if (result.exitCode !== 0) {
|
|
13953
|
+
throw new Error(result.stderr || "git status failed");
|
|
13954
|
+
}
|
|
13955
|
+
const parts = result.stdout.split("\x00").filter(Boolean);
|
|
13956
|
+
const entries = [];
|
|
13957
|
+
for (let index = 0;index < parts.length; index += 1) {
|
|
13958
|
+
const part = parts[index];
|
|
13959
|
+
if (part.length < 4)
|
|
13960
|
+
continue;
|
|
13961
|
+
const indexStatus = part[0] ?? " ";
|
|
13962
|
+
const worktreeStatus = part[1] ?? " ";
|
|
13963
|
+
const filePath = part.slice(3);
|
|
13964
|
+
if (!filePath)
|
|
13965
|
+
continue;
|
|
13966
|
+
if (indexStatus === "R" || indexStatus === "C" || worktreeStatus === "R" || worktreeStatus === "C") {
|
|
13967
|
+
const originalPath = parts[index + 1];
|
|
13968
|
+
if (!originalPath)
|
|
13969
|
+
continue;
|
|
13970
|
+
entries.push({
|
|
13971
|
+
indexStatus,
|
|
13972
|
+
worktreeStatus,
|
|
13973
|
+
path: filePath,
|
|
13974
|
+
originalPath
|
|
13975
|
+
});
|
|
13976
|
+
index += 1;
|
|
13977
|
+
continue;
|
|
13978
|
+
}
|
|
13979
|
+
entries.push({ indexStatus, worktreeStatus, path: filePath });
|
|
13980
|
+
}
|
|
13981
|
+
return entries;
|
|
13982
|
+
}
|
|
13983
|
+
async getBranchState(localPath) {
|
|
13984
|
+
const repoResult = await this.runGit(localPath, ["rev-parse", "--show-toplevel"]);
|
|
13985
|
+
if (repoResult.exitCode !== 0) {
|
|
13986
|
+
return {
|
|
13987
|
+
isRepo: false,
|
|
13988
|
+
branchName: null,
|
|
13989
|
+
hasUpstream: false,
|
|
13990
|
+
hasHead: false
|
|
13991
|
+
};
|
|
13992
|
+
}
|
|
13993
|
+
const branchResult = await this.runGit(localPath, [
|
|
13994
|
+
"symbolic-ref",
|
|
13995
|
+
"--quiet",
|
|
13996
|
+
"--short",
|
|
13997
|
+
"HEAD"
|
|
13998
|
+
]);
|
|
13999
|
+
const headResult = await this.runGit(localPath, ["rev-parse", "--verify", "HEAD"]);
|
|
14000
|
+
const hasHead = headResult.exitCode === 0;
|
|
14001
|
+
const detachedHeadResult = hasHead && branchResult.exitCode !== 0 ? await this.runGit(localPath, ["rev-parse", "--abbrev-ref", "HEAD"]) : null;
|
|
14002
|
+
const upstreamResult = await this.runGit(localPath, [
|
|
14003
|
+
"rev-parse",
|
|
14004
|
+
"--abbrev-ref",
|
|
14005
|
+
"--symbolic-full-name",
|
|
14006
|
+
"@{upstream}"
|
|
14007
|
+
]);
|
|
14008
|
+
return {
|
|
14009
|
+
isRepo: true,
|
|
14010
|
+
branchName: branchResult.exitCode === 0 ? branchResult.stdout : detachedHeadResult && detachedHeadResult.stdout !== "HEAD" ? detachedHeadResult.stdout : null,
|
|
14011
|
+
hasUpstream: upstreamResult.exitCode === 0 && upstreamResult.stdout.length > 0,
|
|
14012
|
+
hasHead
|
|
14013
|
+
};
|
|
14014
|
+
}
|
|
14015
|
+
async getDiffSnapshot(localPath) {
|
|
14016
|
+
const branchState = await this.getBranchState(localPath);
|
|
14017
|
+
if (!branchState.isRepo) {
|
|
14018
|
+
return {
|
|
14019
|
+
status: "not_repo",
|
|
14020
|
+
branchName: branchState.branchName,
|
|
14021
|
+
hasUpstream: false,
|
|
14022
|
+
files: [],
|
|
14023
|
+
error: null,
|
|
14024
|
+
refreshedAt: Date.now()
|
|
14025
|
+
};
|
|
14026
|
+
}
|
|
14027
|
+
const statuses = await this.getStatusEntries(localPath);
|
|
14028
|
+
const trackedDiff = await this.runGitRaw(localPath, branchState.hasHead ? ["diff", "--no-ext-diff", "--find-renames", "--patch", "HEAD", "--"] : ["diff", "--no-ext-diff", "--find-renames", "--cached", "--patch", "--"]);
|
|
14029
|
+
if (trackedDiff.exitCode !== 0) {
|
|
14030
|
+
throw new Error(trackedDiff.stderr || "git diff failed");
|
|
14031
|
+
}
|
|
14032
|
+
const trackedPatches = splitPatchByFile(trackedDiff.stdout);
|
|
14033
|
+
const files = (await Promise.all(statuses.map(async (entry) => this.getDiffFile(localPath, entry, trackedPatches)))).filter((value) => value !== null);
|
|
14034
|
+
return {
|
|
14035
|
+
status: "ready",
|
|
14036
|
+
branchName: branchState.branchName,
|
|
14037
|
+
hasUpstream: branchState.hasUpstream,
|
|
14038
|
+
files,
|
|
14039
|
+
error: null,
|
|
14040
|
+
refreshedAt: Date.now()
|
|
14041
|
+
};
|
|
14042
|
+
}
|
|
14043
|
+
async getDiffFile(localPath, entry, trackedPatches) {
|
|
14044
|
+
const absolutePath = path14.join(localPath, entry.path);
|
|
14045
|
+
const isUntracked = entry.indexStatus === "?" && entry.worktreeStatus === "?";
|
|
14046
|
+
let patch = "";
|
|
14047
|
+
let patchAvailable = true;
|
|
14048
|
+
let patchSummary = null;
|
|
14049
|
+
if (isUntracked) {
|
|
14050
|
+
try {
|
|
14051
|
+
const fileStat = await stat4(absolutePath);
|
|
14052
|
+
if (fileStat.size > MAX_UNTRACKED_PREVIEW_BYTES) {
|
|
14053
|
+
patchAvailable = false;
|
|
14054
|
+
patchSummary = "File too large to preview.";
|
|
14055
|
+
} else {
|
|
14056
|
+
const content = await readFile3(absolutePath);
|
|
14057
|
+
if (isBinaryBuffer(content)) {
|
|
14058
|
+
patchAvailable = false;
|
|
14059
|
+
patchSummary = "Binary file.";
|
|
14060
|
+
} else {
|
|
14061
|
+
patch = buildUntrackedFilePatch(entry.path, new TextDecoder("utf-8").decode(content));
|
|
14062
|
+
}
|
|
14063
|
+
}
|
|
14064
|
+
} catch {
|
|
14065
|
+
patchAvailable = false;
|
|
14066
|
+
patchSummary = "File is no longer available for preview.";
|
|
14067
|
+
}
|
|
14068
|
+
} else {
|
|
14069
|
+
patch = trackedPatches.get(normalizeDiffPath(entry.path)) ?? "";
|
|
14070
|
+
}
|
|
14071
|
+
if (patchAvailable && !patch.trim()) {
|
|
14072
|
+
return null;
|
|
14073
|
+
}
|
|
14074
|
+
return {
|
|
14075
|
+
path: entry.path,
|
|
14076
|
+
previousPath: entry.originalPath ?? null,
|
|
14077
|
+
patch,
|
|
14078
|
+
patchAvailable,
|
|
14079
|
+
patchSummary,
|
|
14080
|
+
changeType: this.getChangeType(entry)
|
|
14081
|
+
};
|
|
14082
|
+
}
|
|
14083
|
+
getChangeType(entry) {
|
|
14084
|
+
if (entry.indexStatus === "?" && entry.worktreeStatus === "?") {
|
|
14085
|
+
return "untracked";
|
|
14086
|
+
}
|
|
14087
|
+
if (entry.indexStatus === "R" || entry.worktreeStatus === "R") {
|
|
14088
|
+
return "renamed";
|
|
14089
|
+
}
|
|
14090
|
+
if (entry.indexStatus === "C" || entry.worktreeStatus === "C") {
|
|
14091
|
+
return "added";
|
|
14092
|
+
}
|
|
14093
|
+
if (entry.indexStatus === "D" || entry.worktreeStatus === "D") {
|
|
14094
|
+
return "deleted";
|
|
14095
|
+
}
|
|
14096
|
+
if (entry.indexStatus === "A" || entry.worktreeStatus === "A") {
|
|
14097
|
+
return "added";
|
|
14098
|
+
}
|
|
14099
|
+
return "modified";
|
|
14100
|
+
}
|
|
14101
|
+
async commitPaths(localPath, paths, summary, description) {
|
|
14102
|
+
const selectedPaths = [
|
|
14103
|
+
...new Set(paths.filter((value) => value.length > 0))
|
|
14104
|
+
];
|
|
14105
|
+
if (selectedPaths.length === 0) {
|
|
14106
|
+
throw new Error("No file paths were provided.");
|
|
14107
|
+
}
|
|
14108
|
+
const addResult = await this.runGit(localPath, [
|
|
14109
|
+
"add",
|
|
14110
|
+
"--",
|
|
14111
|
+
...selectedPaths
|
|
14112
|
+
]);
|
|
14113
|
+
if (addResult.exitCode !== 0) {
|
|
14114
|
+
throw new Error(addResult.stderr || "Failed to stage selected files.");
|
|
14115
|
+
}
|
|
14116
|
+
const message = description.trim() ? `${summary.trim()}
|
|
14117
|
+
|
|
14118
|
+
${description.trim()}` : summary.trim();
|
|
14119
|
+
const commitResult = await this.runGit(localPath, [
|
|
14120
|
+
"commit",
|
|
14121
|
+
"--only",
|
|
14122
|
+
"-m",
|
|
14123
|
+
message,
|
|
14124
|
+
"--",
|
|
14125
|
+
...selectedPaths
|
|
14126
|
+
]);
|
|
14127
|
+
if (commitResult.exitCode !== 0) {
|
|
14128
|
+
throw new Error(commitResult.stderr || "Failed to create commit.");
|
|
14129
|
+
}
|
|
14130
|
+
}
|
|
14131
|
+
async pushCurrentBranch(localPath) {
|
|
14132
|
+
const result = await this.runGit(localPath, ["push"]);
|
|
14133
|
+
if (result.exitCode !== 0) {
|
|
14134
|
+
throw new Error(result.stderr || "Failed to push current branch.");
|
|
14135
|
+
}
|
|
14136
|
+
}
|
|
13560
14137
|
async getBranches(localPath) {
|
|
13561
14138
|
const [branchResult, headResult] = await Promise.all([
|
|
13562
14139
|
this.runGit(localPath, ["branch"]),
|
|
@@ -13575,7 +14152,11 @@ class GitManager {
|
|
|
13575
14152
|
if (result.exitCode !== 0) {
|
|
13576
14153
|
throw new Error(result.stderr || `Failed to switch to branch "${branchName}"`);
|
|
13577
14154
|
}
|
|
13578
|
-
const head = await this.runGit(localPath, [
|
|
14155
|
+
const head = await this.runGit(localPath, [
|
|
14156
|
+
"rev-parse",
|
|
14157
|
+
"--abbrev-ref",
|
|
14158
|
+
"HEAD"
|
|
14159
|
+
]);
|
|
13579
14160
|
return { currentBranch: head.stdout };
|
|
13580
14161
|
}
|
|
13581
14162
|
async createBranch(localPath, branchName, checkout) {
|
|
@@ -13584,7 +14165,11 @@ class GitManager {
|
|
|
13584
14165
|
if (result.exitCode !== 0) {
|
|
13585
14166
|
throw new Error(result.stderr || `Failed to create branch "${branchName}"`);
|
|
13586
14167
|
}
|
|
13587
|
-
const head = await this.runGit(localPath, [
|
|
14168
|
+
const head = await this.runGit(localPath, [
|
|
14169
|
+
"rev-parse",
|
|
14170
|
+
"--abbrev-ref",
|
|
14171
|
+
"HEAD"
|
|
14172
|
+
]);
|
|
13588
14173
|
return { currentBranch: head.stdout };
|
|
13589
14174
|
}
|
|
13590
14175
|
async setProjectMetadataDirectoryCommitMode(localPath, commitProjectMetadata) {
|
|
@@ -13607,11 +14192,240 @@ class GitManager {
|
|
|
13607
14192
|
}
|
|
13608
14193
|
}
|
|
13609
14194
|
|
|
14195
|
+
// src/server/generate-commit-message.ts
|
|
14196
|
+
import path15 from "path";
|
|
14197
|
+
function toSentenceCase(value) {
|
|
14198
|
+
if (!value)
|
|
14199
|
+
return value;
|
|
14200
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
14201
|
+
}
|
|
14202
|
+
function summarizePath(path16) {
|
|
14203
|
+
const segments = path16.split(/[\\/]/u).filter(Boolean);
|
|
14204
|
+
return segments.at(-1) ?? path16;
|
|
14205
|
+
}
|
|
14206
|
+
function describeChange(file) {
|
|
14207
|
+
switch (file.changeType) {
|
|
14208
|
+
case "added":
|
|
14209
|
+
case "untracked":
|
|
14210
|
+
return `add ${summarizePath(file.path)}`;
|
|
14211
|
+
case "deleted":
|
|
14212
|
+
return `remove ${summarizePath(file.path)}`;
|
|
14213
|
+
case "renamed": {
|
|
14214
|
+
const previousPath = file.previousPath ?? file.path;
|
|
14215
|
+
const from = summarizePath(previousPath);
|
|
14216
|
+
const to = summarizePath(file.path);
|
|
14217
|
+
return path15.basename(previousPath) === path15.basename(file.path) ? `rename ${previousPath} to ${file.path}` : `rename ${from} to ${to}`;
|
|
14218
|
+
}
|
|
14219
|
+
default:
|
|
14220
|
+
return `update ${summarizePath(file.path)}`;
|
|
14221
|
+
}
|
|
14222
|
+
}
|
|
14223
|
+
function generateCommitMessage(files) {
|
|
14224
|
+
if (files.length === 0) {
|
|
14225
|
+
return {
|
|
14226
|
+
subject: "Update project files",
|
|
14227
|
+
body: ""
|
|
14228
|
+
};
|
|
14229
|
+
}
|
|
14230
|
+
const primarySummary = describeChange(files[0]);
|
|
14231
|
+
const remainingCount = files.length - 1;
|
|
14232
|
+
const subject = remainingCount > 0 ? `${toSentenceCase(primarySummary)} and ${remainingCount} more change${remainingCount === 1 ? "" : "s"}` : toSentenceCase(primarySummary);
|
|
14233
|
+
const body = files.map((file) => {
|
|
14234
|
+
const pathText = file.changeType === "renamed" && file.previousPath ? `${file.previousPath} -> ${file.path}` : file.path;
|
|
14235
|
+
return `- ${file.changeType}: ${pathText}`;
|
|
14236
|
+
}).join(`
|
|
14237
|
+
`);
|
|
14238
|
+
return { subject, body };
|
|
14239
|
+
}
|
|
14240
|
+
|
|
14241
|
+
// src/server/diff-store.ts
|
|
14242
|
+
function normalizePathForMatch(value) {
|
|
14243
|
+
return value.replaceAll("\\", "/");
|
|
14244
|
+
}
|
|
14245
|
+
function uniquePaths(paths) {
|
|
14246
|
+
return [...new Set(paths.filter((value) => value.length > 0))];
|
|
14247
|
+
}
|
|
14248
|
+
|
|
14249
|
+
class DiffStore {
|
|
14250
|
+
git;
|
|
14251
|
+
snapshots = new Map;
|
|
14252
|
+
refreshStateByProjectId = new Map;
|
|
14253
|
+
constructor(git = new GitManager) {
|
|
14254
|
+
this.git = git;
|
|
14255
|
+
}
|
|
14256
|
+
getSnapshot(projectId) {
|
|
14257
|
+
return this.snapshots.get(projectId) ?? null;
|
|
14258
|
+
}
|
|
14259
|
+
clearSnapshot(projectId) {
|
|
14260
|
+
this.snapshots.delete(projectId);
|
|
14261
|
+
this.refreshStateByProjectId.delete(projectId);
|
|
14262
|
+
}
|
|
14263
|
+
async refreshProjectDiffSnapshot({
|
|
14264
|
+
projectId,
|
|
14265
|
+
localPath,
|
|
14266
|
+
force = false
|
|
14267
|
+
}) {
|
|
14268
|
+
const currentState = this.refreshStateByProjectId.get(projectId);
|
|
14269
|
+
if (currentState?.inFlight) {
|
|
14270
|
+
if (force || currentState.localPath !== localPath) {
|
|
14271
|
+
currentState.localPath = localPath;
|
|
14272
|
+
currentState.needsRefresh = true;
|
|
14273
|
+
}
|
|
14274
|
+
return currentState.inFlight;
|
|
14275
|
+
}
|
|
14276
|
+
const refreshState = currentState ?? {
|
|
14277
|
+
inFlight: null,
|
|
14278
|
+
localPath,
|
|
14279
|
+
needsRefresh: false
|
|
14280
|
+
};
|
|
14281
|
+
refreshState.localPath = localPath;
|
|
14282
|
+
const refreshPromise = this.runRefresh(projectId, refreshState);
|
|
14283
|
+
refreshState.inFlight = refreshPromise;
|
|
14284
|
+
this.refreshStateByProjectId.set(projectId, refreshState);
|
|
14285
|
+
return refreshPromise;
|
|
14286
|
+
}
|
|
14287
|
+
async getSnapshotForPath({
|
|
14288
|
+
projectId,
|
|
14289
|
+
localPath
|
|
14290
|
+
}) {
|
|
14291
|
+
const snapshot = this.getSnapshot(projectId);
|
|
14292
|
+
const refreshState = this.refreshStateByProjectId.get(projectId);
|
|
14293
|
+
if (snapshot && refreshState?.localPath === localPath && refreshState.inFlight === null) {
|
|
14294
|
+
return snapshot;
|
|
14295
|
+
}
|
|
14296
|
+
return this.refreshProjectDiffSnapshot({ projectId, localPath });
|
|
14297
|
+
}
|
|
14298
|
+
async generateCommitMessage(args) {
|
|
14299
|
+
const snapshot = await this.getSnapshotForPath({
|
|
14300
|
+
projectId: args.projectId,
|
|
14301
|
+
localPath: args.localPath
|
|
14302
|
+
});
|
|
14303
|
+
const selected = this.getSelectedFiles(snapshot.files, args.paths);
|
|
14304
|
+
return generateCommitMessage(selected);
|
|
14305
|
+
}
|
|
14306
|
+
async commitDiffs({
|
|
14307
|
+
projectId,
|
|
14308
|
+
localPath,
|
|
14309
|
+
paths,
|
|
14310
|
+
summary,
|
|
14311
|
+
description,
|
|
14312
|
+
mode
|
|
14313
|
+
}) {
|
|
14314
|
+
const snapshot = await this.getSnapshotForPath({ projectId, localPath });
|
|
14315
|
+
const selectedFiles = this.getSelectedFiles(snapshot.files, paths);
|
|
14316
|
+
if (selectedFiles.length === 0) {
|
|
14317
|
+
return {
|
|
14318
|
+
ok: false,
|
|
14319
|
+
mode,
|
|
14320
|
+
title: "No changes selected",
|
|
14321
|
+
message: "Select at least one changed file before creating a commit.",
|
|
14322
|
+
detail: null,
|
|
14323
|
+
localCommitCreated: false,
|
|
14324
|
+
snapshotChanged: false
|
|
14325
|
+
};
|
|
14326
|
+
}
|
|
14327
|
+
try {
|
|
14328
|
+
await this.git.commitPaths(localPath, uniquePaths(selectedFiles.flatMap((file) => file.changeType === "renamed" && file.previousPath ? [file.path, file.previousPath] : [file.path])), summary, description);
|
|
14329
|
+
} catch (error) {
|
|
14330
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
14331
|
+
const nextSnapshot = await this.refreshProjectDiffSnapshot({
|
|
14332
|
+
projectId,
|
|
14333
|
+
localPath,
|
|
14334
|
+
force: true
|
|
14335
|
+
});
|
|
14336
|
+
return {
|
|
14337
|
+
ok: false,
|
|
14338
|
+
mode,
|
|
14339
|
+
title: "Commit failed",
|
|
14340
|
+
message: "Kaizen could not create a commit from the selected changes.",
|
|
14341
|
+
detail,
|
|
14342
|
+
localCommitCreated: false,
|
|
14343
|
+
snapshotChanged: !areDiffSnapshotsEquivalent(snapshot, nextSnapshot)
|
|
14344
|
+
};
|
|
14345
|
+
}
|
|
14346
|
+
let pushError = null;
|
|
14347
|
+
if (mode === "commit_and_push") {
|
|
14348
|
+
const branchState = await this.git.getBranchState(localPath);
|
|
14349
|
+
if (!branchState.hasUpstream) {
|
|
14350
|
+
pushError = new Error("No upstream branch is configured for the current branch.");
|
|
14351
|
+
} else {
|
|
14352
|
+
try {
|
|
14353
|
+
await this.git.pushCurrentBranch(localPath);
|
|
14354
|
+
} catch (error) {
|
|
14355
|
+
pushError = error instanceof Error ? error : new Error(String(error));
|
|
14356
|
+
}
|
|
14357
|
+
}
|
|
14358
|
+
}
|
|
14359
|
+
await this.refreshProjectDiffSnapshot({
|
|
14360
|
+
projectId,
|
|
14361
|
+
localPath,
|
|
14362
|
+
force: true
|
|
14363
|
+
});
|
|
14364
|
+
if (pushError) {
|
|
14365
|
+
return {
|
|
14366
|
+
ok: false,
|
|
14367
|
+
mode,
|
|
14368
|
+
title: mode === "commit_and_push" ? "Commit created, push failed" : "Commit failed",
|
|
14369
|
+
message: mode === "commit_and_push" ? "The selected changes were committed locally, but Kaizen could not push them." : pushError.message,
|
|
14370
|
+
detail: pushError.message,
|
|
14371
|
+
localCommitCreated: true,
|
|
14372
|
+
snapshotChanged: true
|
|
14373
|
+
};
|
|
14374
|
+
}
|
|
14375
|
+
return {
|
|
14376
|
+
ok: true,
|
|
14377
|
+
mode,
|
|
14378
|
+
title: mode === "commit_and_push" ? "Committed and pushed" : "Commit created",
|
|
14379
|
+
message: mode === "commit_and_push" ? "The selected changes were committed and pushed." : "The selected changes were committed.",
|
|
14380
|
+
detail: null,
|
|
14381
|
+
localCommitCreated: true,
|
|
14382
|
+
snapshotChanged: true
|
|
14383
|
+
};
|
|
14384
|
+
}
|
|
14385
|
+
getSelectedFiles(files, paths) {
|
|
14386
|
+
const selected = new Set(uniquePaths(paths).map(normalizePathForMatch));
|
|
14387
|
+
return files.filter((file) => selected.has(normalizePathForMatch(file.path)));
|
|
14388
|
+
}
|
|
14389
|
+
async runRefresh(projectId, refreshState) {
|
|
14390
|
+
let snapshot = null;
|
|
14391
|
+
while (true) {
|
|
14392
|
+
refreshState.needsRefresh = false;
|
|
14393
|
+
snapshot = await this.git.getDiffSnapshot(refreshState.localPath).catch((error) => ({
|
|
14394
|
+
status: "error",
|
|
14395
|
+
branchName: null,
|
|
14396
|
+
hasUpstream: false,
|
|
14397
|
+
files: [],
|
|
14398
|
+
error: error instanceof Error ? error.message : String(error),
|
|
14399
|
+
refreshedAt: Date.now()
|
|
14400
|
+
}));
|
|
14401
|
+
this.snapshots.set(projectId, snapshot);
|
|
14402
|
+
if (!refreshState.needsRefresh) {
|
|
14403
|
+
break;
|
|
14404
|
+
}
|
|
14405
|
+
}
|
|
14406
|
+
refreshState.inFlight = null;
|
|
14407
|
+
return snapshot;
|
|
14408
|
+
}
|
|
14409
|
+
}
|
|
14410
|
+
function areDiffSnapshotsEquivalent(left, right) {
|
|
14411
|
+
if (left === right)
|
|
14412
|
+
return true;
|
|
14413
|
+
if (!left || !right)
|
|
14414
|
+
return false;
|
|
14415
|
+
if (left.status !== right.status || left.branchName !== right.branchName || left.hasUpstream !== right.hasUpstream || (left.error ?? null) !== (right.error ?? null) || left.files.length !== right.files.length) {
|
|
14416
|
+
return false;
|
|
14417
|
+
}
|
|
14418
|
+
return left.files.every((file, index) => {
|
|
14419
|
+
const other = right.files[index];
|
|
14420
|
+
return other && file.path === other.path && (file.previousPath ?? null) === (other.previousPath ?? null) && file.changeType === other.changeType && file.patch === other.patch && file.patchAvailable === other.patchAvailable && (file.patchSummary ?? null) === (other.patchSummary ?? null);
|
|
14421
|
+
});
|
|
14422
|
+
}
|
|
14423
|
+
|
|
13610
14424
|
// src/server/keybindings.ts
|
|
13611
14425
|
import { watch } from "fs";
|
|
13612
14426
|
import { mkdir as mkdir4, readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
|
|
13613
14427
|
import { homedir as homedir10 } from "os";
|
|
13614
|
-
import
|
|
14428
|
+
import path16 from "path";
|
|
13615
14429
|
var KEYBINDING_ACTIONS = Object.keys(DEFAULT_KEYBINDINGS);
|
|
13616
14430
|
var SELF_WRITE_WATCH_DEBOUNCE_MS = 250;
|
|
13617
14431
|
|
|
@@ -13626,7 +14440,7 @@ class KeybindingsManager {
|
|
|
13626
14440
|
this.snapshot = createDefaultSnapshot(this.filePath);
|
|
13627
14441
|
}
|
|
13628
14442
|
async initialize() {
|
|
13629
|
-
await mkdir4(
|
|
14443
|
+
await mkdir4(path16.dirname(this.filePath), { recursive: true });
|
|
13630
14444
|
const file = Bun.file(this.filePath);
|
|
13631
14445
|
if (!await file.exists()) {
|
|
13632
14446
|
await writeFile4(this.filePath, `${JSON.stringify(DEFAULT_KEYBINDINGS, null, 2)}
|
|
@@ -13655,7 +14469,7 @@ class KeybindingsManager {
|
|
|
13655
14469
|
}
|
|
13656
14470
|
async write(bindings) {
|
|
13657
14471
|
const nextSnapshot = normalizeKeybindings(bindings, this.filePath);
|
|
13658
|
-
await mkdir4(
|
|
14472
|
+
await mkdir4(path16.dirname(this.filePath), { recursive: true });
|
|
13659
14473
|
this.ignoreWatchEventsUntil = Date.now() + SELF_WRITE_WATCH_DEBOUNCE_MS;
|
|
13660
14474
|
await writeFile4(this.filePath, `${JSON.stringify(nextSnapshot.bindings, null, 2)}
|
|
13661
14475
|
`, "utf8");
|
|
@@ -13671,8 +14485,8 @@ class KeybindingsManager {
|
|
|
13671
14485
|
startWatching() {
|
|
13672
14486
|
this.watcher?.close();
|
|
13673
14487
|
try {
|
|
13674
|
-
this.watcher = watch(
|
|
13675
|
-
if (filename && filename !==
|
|
14488
|
+
this.watcher = watch(path16.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
|
|
14489
|
+
if (filename && filename !== path16.basename(this.filePath)) {
|
|
13676
14490
|
return;
|
|
13677
14491
|
}
|
|
13678
14492
|
if (Date.now() <= this.ignoreWatchEventsUntil) {
|
|
@@ -13758,7 +14572,7 @@ function formatDisplayPath(filePath) {
|
|
|
13758
14572
|
const homePath = homedir10();
|
|
13759
14573
|
if (filePath === homePath)
|
|
13760
14574
|
return "~";
|
|
13761
|
-
if (filePath.startsWith(`${homePath}${
|
|
14575
|
+
if (filePath.startsWith(`${homePath}${path16.sep}`)) {
|
|
13762
14576
|
return `~${filePath.slice(homePath.length)}`;
|
|
13763
14577
|
}
|
|
13764
14578
|
return filePath;
|
|
@@ -13768,7 +14582,7 @@ function formatDisplayPath(filePath) {
|
|
|
13768
14582
|
import { watch as watch2 } from "fs";
|
|
13769
14583
|
import { mkdir as mkdir5, readFile as readFile5, writeFile as writeFile5 } from "fs/promises";
|
|
13770
14584
|
import { homedir as homedir11 } from "os";
|
|
13771
|
-
import
|
|
14585
|
+
import path17 from "path";
|
|
13772
14586
|
var PROVIDER_IDS = Object.keys(DEFAULT_PROVIDER_SETTINGS);
|
|
13773
14587
|
|
|
13774
14588
|
class ProviderSettingsManager {
|
|
@@ -13781,7 +14595,7 @@ class ProviderSettingsManager {
|
|
|
13781
14595
|
this.snapshot = createDefaultSnapshot2(this.filePath);
|
|
13782
14596
|
}
|
|
13783
14597
|
async initialize() {
|
|
13784
|
-
await mkdir5(
|
|
14598
|
+
await mkdir5(path17.dirname(this.filePath), { recursive: true });
|
|
13785
14599
|
const file = Bun.file(this.filePath);
|
|
13786
14600
|
if (!await file.exists()) {
|
|
13787
14601
|
await writeFile5(this.filePath, `${JSON.stringify(DEFAULT_PROVIDER_SETTINGS, null, 2)}
|
|
@@ -13810,7 +14624,7 @@ class ProviderSettingsManager {
|
|
|
13810
14624
|
}
|
|
13811
14625
|
async write(settings) {
|
|
13812
14626
|
const nextSnapshot = normalizeProviderSettings(settings, this.filePath);
|
|
13813
|
-
await mkdir5(
|
|
14627
|
+
await mkdir5(path17.dirname(this.filePath), { recursive: true });
|
|
13814
14628
|
await writeFile5(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
|
|
13815
14629
|
`, "utf8");
|
|
13816
14630
|
this.setSnapshot(nextSnapshot);
|
|
@@ -13825,8 +14639,8 @@ class ProviderSettingsManager {
|
|
|
13825
14639
|
startWatching() {
|
|
13826
14640
|
this.watcher?.close();
|
|
13827
14641
|
try {
|
|
13828
|
-
this.watcher = watch2(
|
|
13829
|
-
if (filename && filename !==
|
|
14642
|
+
this.watcher = watch2(path17.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
|
|
14643
|
+
if (filename && filename !== path17.basename(this.filePath)) {
|
|
13830
14644
|
return;
|
|
13831
14645
|
}
|
|
13832
14646
|
this.reload().catch((error) => {
|
|
@@ -13890,7 +14704,7 @@ function formatDisplayPath2(filePath) {
|
|
|
13890
14704
|
const homePath = homedir11();
|
|
13891
14705
|
if (filePath === homePath)
|
|
13892
14706
|
return "~";
|
|
13893
|
-
if (filePath.startsWith(`${homePath}${
|
|
14707
|
+
if (filePath.startsWith(`${homePath}${path17.sep}`)) {
|
|
13894
14708
|
return `~${filePath.slice(homePath.length)}`;
|
|
13895
14709
|
}
|
|
13896
14710
|
return filePath;
|
|
@@ -13900,7 +14714,7 @@ function formatDisplayPath2(filePath) {
|
|
|
13900
14714
|
import { watch as watch3 } from "fs";
|
|
13901
14715
|
import { mkdir as mkdir7, readdir as readdir3, readFile as readFile7, writeFile as writeFile7 } from "fs/promises";
|
|
13902
14716
|
import { homedir as homedir13 } from "os";
|
|
13903
|
-
import
|
|
14717
|
+
import path20 from "path";
|
|
13904
14718
|
// ../../packages/themes/src/builtins/catppuccin.json
|
|
13905
14719
|
var catppuccin_default = {
|
|
13906
14720
|
id: "catppuccin",
|
|
@@ -14581,21 +15395,21 @@ function serializeCssVariables(variables) {
|
|
|
14581
15395
|
// src/server/managed-backgrounds.ts
|
|
14582
15396
|
import { createHash } from "crypto";
|
|
14583
15397
|
import { lookup } from "dns/promises";
|
|
14584
|
-
import { mkdir as mkdir6, readFile as readFile6, rm as rm2, stat as
|
|
15398
|
+
import { mkdir as mkdir6, readFile as readFile6, rm as rm2, stat as stat5, writeFile as writeFile6 } from "fs/promises";
|
|
14585
15399
|
import { isIP as isIP2 } from "net";
|
|
14586
15400
|
import { homedir as homedir12 } from "os";
|
|
14587
|
-
import
|
|
15401
|
+
import path19 from "path";
|
|
14588
15402
|
import sharp from "sharp";
|
|
14589
15403
|
|
|
14590
15404
|
// src/server/backgrounds.ts
|
|
14591
15405
|
import fs3 from "fs/promises";
|
|
14592
|
-
import
|
|
15406
|
+
import path18 from "path";
|
|
14593
15407
|
import os from "os";
|
|
14594
15408
|
var BACKGROUND_DIRS = [
|
|
14595
|
-
|
|
15409
|
+
path18.join(os.homedir(), ".local/share/backgrounds"),
|
|
14596
15410
|
"/usr/share/backgrounds",
|
|
14597
15411
|
"/Library/Desktop Pictures",
|
|
14598
|
-
|
|
15412
|
+
path18.join(os.homedir(), "Pictures"),
|
|
14599
15413
|
process.platform === "win32" ? "C:\\Windows\\Web\\Wallpaper" : ""
|
|
14600
15414
|
].filter(Boolean);
|
|
14601
15415
|
async function getSystemBackgrounds() {
|
|
@@ -14608,11 +15422,11 @@ async function getSystemBackgrounds() {
|
|
|
14608
15422
|
const entries = await fs3.readdir(dir, { withFileTypes: true });
|
|
14609
15423
|
for (const entry of entries) {
|
|
14610
15424
|
if (entry.isDirectory()) {
|
|
14611
|
-
await scanDir(
|
|
15425
|
+
await scanDir(path18.join(dir, entry.name), depth + 1);
|
|
14612
15426
|
} else if (entry.isFile()) {
|
|
14613
|
-
const ext =
|
|
15427
|
+
const ext = path18.extname(entry.name).toLowerCase();
|
|
14614
15428
|
if (ext === ".jpg" || ext === ".jpeg" || ext === ".png" || ext === ".webp") {
|
|
14615
|
-
const fullPath =
|
|
15429
|
+
const fullPath = path18.join(dir, entry.name);
|
|
14616
15430
|
if (seen.has(fullPath))
|
|
14617
15431
|
continue;
|
|
14618
15432
|
seen.add(fullPath);
|
|
@@ -14658,8 +15472,8 @@ var MAX_REMOTE_BACKGROUND_BYTES = 20 * 1024 * 1024;
|
|
|
14658
15472
|
function getManagedBackgroundPathsForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
|
|
14659
15473
|
const sourceKey = createHash("sha256").update(source).digest("hex");
|
|
14660
15474
|
return {
|
|
14661
|
-
assetFilePath:
|
|
14662
|
-
metadataFilePath:
|
|
15475
|
+
assetFilePath: path19.join(backgroundsDirectory, `${sourceKey}.webp`),
|
|
15476
|
+
metadataFilePath: path19.join(backgroundsDirectory, `${sourceKey}.json`)
|
|
14663
15477
|
};
|
|
14664
15478
|
}
|
|
14665
15479
|
async function deleteManagedBackgroundForSource(source, backgroundsDirectory = getManagedBackgroundsDirPath(homedir12())) {
|
|
@@ -14707,7 +15521,7 @@ async function cacheManagedBackgroundForSource(source, backgroundsDirectory = ge
|
|
|
14707
15521
|
const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
|
|
14708
15522
|
const resolvedSource = await resolveSource(source, options);
|
|
14709
15523
|
const previousMetadata = await readManagedBackgroundMetadata(metadataFilePath);
|
|
14710
|
-
const existingAsset = await
|
|
15524
|
+
const existingAsset = await stat5(assetFilePath).catch(() => null);
|
|
14711
15525
|
if (existingAsset?.isFile() && previousMetadata?.fingerprint === resolvedSource.fingerprint) {
|
|
14712
15526
|
return {
|
|
14713
15527
|
assetFilePath,
|
|
@@ -14752,7 +15566,7 @@ async function readManagedBackgroundCache(source, backgroundsDirectory) {
|
|
|
14752
15566
|
const { assetFilePath, metadataFilePath } = getManagedBackgroundPathsForSource(source, backgroundsDirectory);
|
|
14753
15567
|
const [metadata, existingAsset] = await Promise.all([
|
|
14754
15568
|
readManagedBackgroundMetadata(metadataFilePath),
|
|
14755
|
-
|
|
15569
|
+
stat5(assetFilePath).catch(() => null)
|
|
14756
15570
|
]);
|
|
14757
15571
|
if (!existingAsset?.isFile() || !metadata?.fingerprint) {
|
|
14758
15572
|
return null;
|
|
@@ -14769,7 +15583,7 @@ async function resolveSource(source, options) {
|
|
|
14769
15583
|
if (!filePath) {
|
|
14770
15584
|
throw new Error("Background image not found.");
|
|
14771
15585
|
}
|
|
14772
|
-
const info = await
|
|
15586
|
+
const info = await stat5(filePath);
|
|
14773
15587
|
return {
|
|
14774
15588
|
input: filePath,
|
|
14775
15589
|
fingerprint: JSON.stringify({
|
|
@@ -15033,7 +15847,7 @@ class ThemeSettingsManager {
|
|
|
15033
15847
|
});
|
|
15034
15848
|
}
|
|
15035
15849
|
async initialize() {
|
|
15036
|
-
await mkdir7(
|
|
15850
|
+
await mkdir7(path20.dirname(this.filePath), { recursive: true });
|
|
15037
15851
|
await mkdir7(this.themesDirectory, { recursive: true });
|
|
15038
15852
|
await mkdir7(this.managedBackgroundsDirectory, { recursive: true });
|
|
15039
15853
|
const file = Bun.file(this.filePath);
|
|
@@ -15083,7 +15897,7 @@ class ThemeSettingsManager {
|
|
|
15083
15897
|
console.warn(`${LOG_PREFIX} Failed to warm managed background cache:`, error);
|
|
15084
15898
|
}
|
|
15085
15899
|
}
|
|
15086
|
-
await mkdir7(
|
|
15900
|
+
await mkdir7(path20.dirname(this.filePath), { recursive: true });
|
|
15087
15901
|
await writeFile7(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
|
|
15088
15902
|
`, "utf8");
|
|
15089
15903
|
if (previousBackgroundImage !== nextSnapshot.settings.backgroundImage) {
|
|
@@ -15115,8 +15929,8 @@ class ThemeSettingsManager {
|
|
|
15115
15929
|
this.settingsWatcher?.close();
|
|
15116
15930
|
this.themesWatcher?.close();
|
|
15117
15931
|
try {
|
|
15118
|
-
this.settingsWatcher = watch3(
|
|
15119
|
-
if (filename && filename !==
|
|
15932
|
+
this.settingsWatcher = watch3(path20.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
|
|
15933
|
+
if (filename && filename !== path20.basename(this.filePath))
|
|
15120
15934
|
return;
|
|
15121
15935
|
this.reload().catch((error) => {
|
|
15122
15936
|
console.warn(`${LOG_PREFIX} Failed to reload theme settings:`, error);
|
|
@@ -15217,7 +16031,7 @@ async function loadThemeRegistry(themesDirectory) {
|
|
|
15217
16031
|
}
|
|
15218
16032
|
const customThemeFiles = entries.filter((entry) => entry.endsWith(".json") && !entry.endsWith(".example.json")).sort((left, right) => left.localeCompare(right));
|
|
15219
16033
|
for (const fileName of customThemeFiles) {
|
|
15220
|
-
const absolutePath =
|
|
16034
|
+
const absolutePath = path20.join(themesDirectory, fileName);
|
|
15221
16035
|
try {
|
|
15222
16036
|
const text = await readFile7(absolutePath, "utf8");
|
|
15223
16037
|
const parsed = parseThemeDefinition(JSON.parse(text));
|
|
@@ -15281,7 +16095,168 @@ function formatDisplayPath3(filePath) {
|
|
|
15281
16095
|
const homePath = homedir13();
|
|
15282
16096
|
if (filePath === homePath)
|
|
15283
16097
|
return "~";
|
|
15284
|
-
if (filePath.startsWith(`${homePath}${
|
|
16098
|
+
if (filePath.startsWith(`${homePath}${path20.sep}`)) {
|
|
16099
|
+
return `~${filePath.slice(homePath.length)}`;
|
|
16100
|
+
}
|
|
16101
|
+
return filePath;
|
|
16102
|
+
}
|
|
16103
|
+
|
|
16104
|
+
// src/server/general-settings.ts
|
|
16105
|
+
import { watch as watch4 } from "fs";
|
|
16106
|
+
import { mkdir as mkdir8, readFile as readFile8, writeFile as writeFile8 } from "fs/promises";
|
|
16107
|
+
import { homedir as homedir14 } from "os";
|
|
16108
|
+
import path21 from "path";
|
|
16109
|
+
var SELF_WRITE_WATCH_DEBOUNCE_MS2 = 250;
|
|
16110
|
+
|
|
16111
|
+
class GeneralSettingsManager {
|
|
16112
|
+
filePath;
|
|
16113
|
+
watcher = null;
|
|
16114
|
+
snapshot;
|
|
16115
|
+
ignoreWatchEventsUntil = 0;
|
|
16116
|
+
updateQueue = Promise.resolve();
|
|
16117
|
+
listeners = new Set;
|
|
16118
|
+
constructor(filePath = getGeneralSettingsFilePath(homedir14())) {
|
|
16119
|
+
this.filePath = filePath;
|
|
16120
|
+
this.snapshot = createDefaultSnapshot4(this.filePath);
|
|
16121
|
+
}
|
|
16122
|
+
async initialize() {
|
|
16123
|
+
await mkdir8(path21.dirname(this.filePath), { recursive: true });
|
|
16124
|
+
const file = Bun.file(this.filePath);
|
|
16125
|
+
if (!await file.exists()) {
|
|
16126
|
+
await writeFile8(this.filePath, `${JSON.stringify(DEFAULT_GENERAL_SETTINGS, null, 2)}
|
|
16127
|
+
`, "utf8");
|
|
16128
|
+
}
|
|
16129
|
+
await this.reload();
|
|
16130
|
+
this.startWatching();
|
|
16131
|
+
}
|
|
16132
|
+
dispose() {
|
|
16133
|
+
this.watcher?.close();
|
|
16134
|
+
this.watcher = null;
|
|
16135
|
+
this.listeners.clear();
|
|
16136
|
+
}
|
|
16137
|
+
getSnapshot() {
|
|
16138
|
+
return this.snapshot;
|
|
16139
|
+
}
|
|
16140
|
+
onChange(listener) {
|
|
16141
|
+
this.listeners.add(listener);
|
|
16142
|
+
return () => {
|
|
16143
|
+
this.listeners.delete(listener);
|
|
16144
|
+
};
|
|
16145
|
+
}
|
|
16146
|
+
async reload() {
|
|
16147
|
+
return this.enqueueUpdate(async () => {
|
|
16148
|
+
const nextSnapshot = await readGeneralSettingsSnapshot(this.filePath);
|
|
16149
|
+
this.setSnapshot(nextSnapshot);
|
|
16150
|
+
return nextSnapshot;
|
|
16151
|
+
});
|
|
16152
|
+
}
|
|
16153
|
+
async write(settings) {
|
|
16154
|
+
return this.enqueueUpdate(async () => {
|
|
16155
|
+
const nextSnapshot = normalizeGeneralSettings(settings, this.filePath);
|
|
16156
|
+
await mkdir8(path21.dirname(this.filePath), { recursive: true });
|
|
16157
|
+
this.ignoreWatchEventsUntil = Date.now() + SELF_WRITE_WATCH_DEBOUNCE_MS2;
|
|
16158
|
+
await writeFile8(this.filePath, `${JSON.stringify(nextSnapshot.settings, null, 2)}
|
|
16159
|
+
`, "utf8");
|
|
16160
|
+
this.setSnapshot(nextSnapshot);
|
|
16161
|
+
return nextSnapshot;
|
|
16162
|
+
});
|
|
16163
|
+
}
|
|
16164
|
+
setSnapshot(snapshot) {
|
|
16165
|
+
this.snapshot = snapshot;
|
|
16166
|
+
for (const listener of this.listeners) {
|
|
16167
|
+
listener(snapshot);
|
|
16168
|
+
}
|
|
16169
|
+
}
|
|
16170
|
+
enqueueUpdate(update) {
|
|
16171
|
+
const result = this.updateQueue.then(update);
|
|
16172
|
+
this.updateQueue = result.then(() => {
|
|
16173
|
+
return;
|
|
16174
|
+
}, () => {
|
|
16175
|
+
return;
|
|
16176
|
+
});
|
|
16177
|
+
return result;
|
|
16178
|
+
}
|
|
16179
|
+
startWatching() {
|
|
16180
|
+
this.watcher?.close();
|
|
16181
|
+
try {
|
|
16182
|
+
this.watcher = watch4(path21.dirname(this.filePath), { persistent: false }, (_eventType, filename) => {
|
|
16183
|
+
if (filename && filename !== path21.basename(this.filePath)) {
|
|
16184
|
+
return;
|
|
16185
|
+
}
|
|
16186
|
+
if (Date.now() <= this.ignoreWatchEventsUntil) {
|
|
16187
|
+
return;
|
|
16188
|
+
}
|
|
16189
|
+
this.reload().catch((error) => {
|
|
16190
|
+
console.warn(`${LOG_PREFIX} Failed to reload general settings:`, error);
|
|
16191
|
+
});
|
|
16192
|
+
});
|
|
16193
|
+
this.watcher.on("error", (error) => {
|
|
16194
|
+
console.warn(`${LOG_PREFIX} Failed to watch general settings file:`, error);
|
|
16195
|
+
this.watcher?.close();
|
|
16196
|
+
this.watcher = null;
|
|
16197
|
+
});
|
|
16198
|
+
} catch (error) {
|
|
16199
|
+
console.warn(`${LOG_PREFIX} Failed to watch general settings file:`, error);
|
|
16200
|
+
this.watcher = null;
|
|
16201
|
+
}
|
|
16202
|
+
}
|
|
16203
|
+
}
|
|
16204
|
+
async function readGeneralSettingsSnapshot(filePath) {
|
|
16205
|
+
try {
|
|
16206
|
+
const text = await readFile8(filePath, "utf8");
|
|
16207
|
+
if (!text.trim()) {
|
|
16208
|
+
return createDefaultSnapshot4(filePath, "General settings file was empty. Using defaults.");
|
|
16209
|
+
}
|
|
16210
|
+
const parsed = JSON.parse(text);
|
|
16211
|
+
return normalizeGeneralSettings(parsed, filePath);
|
|
16212
|
+
} catch (error) {
|
|
16213
|
+
if (error?.code === "ENOENT") {
|
|
16214
|
+
return createDefaultSnapshot4(filePath);
|
|
16215
|
+
}
|
|
16216
|
+
if (error instanceof SyntaxError) {
|
|
16217
|
+
return createDefaultSnapshot4(filePath, "General settings file is invalid JSON. Using defaults.");
|
|
16218
|
+
}
|
|
16219
|
+
throw error;
|
|
16220
|
+
}
|
|
16221
|
+
}
|
|
16222
|
+
function normalizeGeneralSettings(value, filePath = getGeneralSettingsFilePath(homedir14())) {
|
|
16223
|
+
const source = value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
16224
|
+
if (!source) {
|
|
16225
|
+
return createDefaultSnapshot4(filePath, "General settings file must contain a JSON object. Using defaults.");
|
|
16226
|
+
}
|
|
16227
|
+
const warnings = [];
|
|
16228
|
+
let sendChunkSizeBytes = DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
|
|
16229
|
+
const rawSendChunkSize = source.sendChunkSizeBytes;
|
|
16230
|
+
if (rawSendChunkSize !== undefined) {
|
|
16231
|
+
if (typeof rawSendChunkSize === "number" && Number.isFinite(rawSendChunkSize)) {
|
|
16232
|
+
const normalizedValue = Math.round(rawSendChunkSize);
|
|
16233
|
+
if (normalizedValue >= MIN_SEND_CHUNK_SIZE_BYTES && normalizedValue <= MAX_SEND_CHUNK_SIZE_BYTES) {
|
|
16234
|
+
sendChunkSizeBytes = normalizedValue;
|
|
16235
|
+
} else {
|
|
16236
|
+
warnings.push(`sendChunkSizeBytes must be between ${MIN_SEND_CHUNK_SIZE_BYTES} and ${MAX_SEND_CHUNK_SIZE_BYTES}`);
|
|
16237
|
+
}
|
|
16238
|
+
} else {
|
|
16239
|
+
warnings.push("sendChunkSizeBytes must be a number");
|
|
16240
|
+
}
|
|
16241
|
+
}
|
|
16242
|
+
return {
|
|
16243
|
+
settings: { sendChunkSizeBytes },
|
|
16244
|
+
warning: warnings.length > 0 ? `Some general settings were reset to defaults: ${warnings.join("; ")}` : null,
|
|
16245
|
+
filePathDisplay: formatDisplayPath4(filePath)
|
|
16246
|
+
};
|
|
16247
|
+
}
|
|
16248
|
+
function createDefaultSnapshot4(filePath, warning = null) {
|
|
16249
|
+
return {
|
|
16250
|
+
settings: { ...DEFAULT_GENERAL_SETTINGS },
|
|
16251
|
+
warning,
|
|
16252
|
+
filePathDisplay: formatDisplayPath4(filePath)
|
|
16253
|
+
};
|
|
16254
|
+
}
|
|
16255
|
+
function formatDisplayPath4(filePath) {
|
|
16256
|
+
const homePath = homedir14();
|
|
16257
|
+
if (filePath === homePath)
|
|
16258
|
+
return "~";
|
|
16259
|
+
if (filePath.startsWith(`${homePath}${path21.sep}`)) {
|
|
15285
16260
|
return `~${filePath.slice(homePath.length)}`;
|
|
15286
16261
|
}
|
|
15287
16262
|
return filePath;
|
|
@@ -15514,7 +16489,7 @@ function getMachineDisplayName() {
|
|
|
15514
16489
|
}
|
|
15515
16490
|
|
|
15516
16491
|
// src/server/terminal-manager.ts
|
|
15517
|
-
import
|
|
16492
|
+
import path22 from "path";
|
|
15518
16493
|
import process8 from "process";
|
|
15519
16494
|
import defaultShell, { detectDefaultShell } from "default-shell";
|
|
15520
16495
|
import { Terminal } from "@xterm/headless";
|
|
@@ -15553,7 +16528,7 @@ function resolveShellArgs(shellPath) {
|
|
|
15553
16528
|
if (process8.platform === "win32") {
|
|
15554
16529
|
return [];
|
|
15555
16530
|
}
|
|
15556
|
-
const shellName =
|
|
16531
|
+
const shellName = path22.basename(shellPath);
|
|
15557
16532
|
if (["bash", "zsh", "fish", "sh", "ksh"].includes(shellName)) {
|
|
15558
16533
|
return ["-l"];
|
|
15559
16534
|
}
|
|
@@ -15647,7 +16622,7 @@ class TerminalManager {
|
|
|
15647
16622
|
const cols = normalizeTerminalDimension(args.cols, DEFAULT_COLS);
|
|
15648
16623
|
const rows = normalizeTerminalDimension(args.rows, DEFAULT_ROWS);
|
|
15649
16624
|
const scrollback = clampScrollback(args.scrollback);
|
|
15650
|
-
const title =
|
|
16625
|
+
const title = path22.basename(shell) || "shell";
|
|
15651
16626
|
const headless = new Terminal({
|
|
15652
16627
|
cols,
|
|
15653
16628
|
rows,
|
|
@@ -16011,13 +16986,13 @@ class UpdateManager {
|
|
|
16011
16986
|
|
|
16012
16987
|
// src/server/recovery.ts
|
|
16013
16988
|
import { existsSync as existsSync10, readFileSync as readFileSync7, readdirSync as readdirSync8, statSync as statSync7 } from "fs";
|
|
16014
|
-
import { homedir as
|
|
16015
|
-
import
|
|
16989
|
+
import { homedir as homedir15 } from "os";
|
|
16990
|
+
import path24 from "path";
|
|
16016
16991
|
|
|
16017
16992
|
// src/server/cursor-chat-store.ts
|
|
16018
16993
|
import { Database as Database2 } from "bun:sqlite";
|
|
16019
16994
|
import { existsSync as existsSync9, readdirSync as readdirSync7, statSync as statSync6 } from "fs";
|
|
16020
|
-
import
|
|
16995
|
+
import path23 from "path";
|
|
16021
16996
|
function decodeMetaValue(value) {
|
|
16022
16997
|
try {
|
|
16023
16998
|
const decoded = Buffer.from(value, "hex").toString("utf8");
|
|
@@ -16072,7 +17047,7 @@ function extractWorkspacePath(value) {
|
|
|
16072
17047
|
if (!match) {
|
|
16073
17048
|
return null;
|
|
16074
17049
|
}
|
|
16075
|
-
return
|
|
17050
|
+
return path23.normalize(match[1].trim());
|
|
16076
17051
|
}
|
|
16077
17052
|
function unwrapCursorTaggedText(value) {
|
|
16078
17053
|
const trimmed = value.trim();
|
|
@@ -16148,7 +17123,7 @@ function readBlobRows(database) {
|
|
|
16148
17123
|
return database.query("select id, data from blobs").all();
|
|
16149
17124
|
}
|
|
16150
17125
|
function collectCursorChatStorePaths(homeDir) {
|
|
16151
|
-
const chatsRoot =
|
|
17126
|
+
const chatsRoot = path23.join(homeDir, ".cursor", "chats");
|
|
16152
17127
|
if (!existsSync9(chatsRoot)) {
|
|
16153
17128
|
return [];
|
|
16154
17129
|
}
|
|
@@ -16156,11 +17131,11 @@ function collectCursorChatStorePaths(homeDir) {
|
|
|
16156
17131
|
for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
|
|
16157
17132
|
if (!parent.isDirectory())
|
|
16158
17133
|
continue;
|
|
16159
|
-
const parentPath =
|
|
17134
|
+
const parentPath = path23.join(chatsRoot, parent.name);
|
|
16160
17135
|
for (const child of readdirSync7(parentPath, { withFileTypes: true })) {
|
|
16161
17136
|
if (!child.isDirectory())
|
|
16162
17137
|
continue;
|
|
16163
|
-
const storePath =
|
|
17138
|
+
const storePath = path23.join(parentPath, child.name, "store.db");
|
|
16164
17139
|
if (existsSync9(storePath)) {
|
|
16165
17140
|
storePaths.push(storePath);
|
|
16166
17141
|
}
|
|
@@ -16169,14 +17144,14 @@ function collectCursorChatStorePaths(homeDir) {
|
|
|
16169
17144
|
return storePaths;
|
|
16170
17145
|
}
|
|
16171
17146
|
function findCursorChatStorePath(homeDir, sessionToken) {
|
|
16172
|
-
const chatsRoot =
|
|
17147
|
+
const chatsRoot = path23.join(homeDir, ".cursor", "chats");
|
|
16173
17148
|
if (!existsSync9(chatsRoot)) {
|
|
16174
17149
|
return null;
|
|
16175
17150
|
}
|
|
16176
17151
|
for (const parent of readdirSync7(chatsRoot, { withFileTypes: true })) {
|
|
16177
17152
|
if (!parent.isDirectory())
|
|
16178
17153
|
continue;
|
|
16179
|
-
const candidate =
|
|
17154
|
+
const candidate = path23.join(chatsRoot, parent.name, sessionToken, "store.db");
|
|
16180
17155
|
if (existsSync9(candidate)) {
|
|
16181
17156
|
return candidate;
|
|
16182
17157
|
}
|
|
@@ -16350,7 +17325,7 @@ function collectFiles(directory, extension) {
|
|
|
16350
17325
|
}
|
|
16351
17326
|
const files = [];
|
|
16352
17327
|
for (const entry of readdirSync8(directory, { withFileTypes: true })) {
|
|
16353
|
-
const fullPath =
|
|
17328
|
+
const fullPath = path24.join(directory, entry.name);
|
|
16354
17329
|
if (entry.isDirectory()) {
|
|
16355
17330
|
files.push(...collectFiles(fullPath, extension));
|
|
16356
17331
|
continue;
|
|
@@ -16488,7 +17463,7 @@ function markSkippedSession(skippedSessionKeys, provider, sessionToken) {
|
|
|
16488
17463
|
}
|
|
16489
17464
|
}
|
|
16490
17465
|
function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
|
|
16491
|
-
const projectsDir =
|
|
17466
|
+
const projectsDir = path24.join(homeDir, ".claude", "projects");
|
|
16492
17467
|
const chats = [];
|
|
16493
17468
|
for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
|
|
16494
17469
|
const head = peekFileHead(sessionFile, 2048);
|
|
@@ -16505,8 +17480,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
|
|
|
16505
17480
|
if (!peekedSessionToken && typeof record.sessionId === "string") {
|
|
16506
17481
|
peekedSessionToken = record.sessionId;
|
|
16507
17482
|
}
|
|
16508
|
-
if (!peekedSessionLocalPath && typeof record.cwd === "string" &&
|
|
16509
|
-
peekedSessionLocalPath =
|
|
17483
|
+
if (!peekedSessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
|
|
17484
|
+
peekedSessionLocalPath = path24.normalize(record.cwd);
|
|
16510
17485
|
}
|
|
16511
17486
|
peekedEntries.push(...claudeEntriesFromRecord(record));
|
|
16512
17487
|
}
|
|
@@ -16536,8 +17511,8 @@ function readClaudeProjectChats(homeDir, trackedWorktreePaths, skippedSessionKey
|
|
|
16536
17511
|
if (!sessionToken && typeof record.sessionId === "string") {
|
|
16537
17512
|
sessionToken = record.sessionId;
|
|
16538
17513
|
}
|
|
16539
|
-
if (!sessionLocalPath && typeof record.cwd === "string" &&
|
|
16540
|
-
sessionLocalPath =
|
|
17514
|
+
if (!sessionLocalPath && typeof record.cwd === "string" && path24.isAbsolute(record.cwd)) {
|
|
17515
|
+
sessionLocalPath = path24.normalize(record.cwd);
|
|
16541
17516
|
}
|
|
16542
17517
|
const timestamp = typeof record.timestamp === "string" ? Date.parse(record.timestamp) : Number.NaN;
|
|
16543
17518
|
if (!Number.isNaN(timestamp)) {
|
|
@@ -16721,12 +17696,12 @@ function cursorEntriesFromRecord(record, index, sessionToken, fallbackBaseTimest
|
|
|
16721
17696
|
];
|
|
16722
17697
|
}
|
|
16723
17698
|
function findCursorTranscriptPath(args) {
|
|
16724
|
-
const transcriptRoot =
|
|
16725
|
-
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`);
|
|
16726
17701
|
if (existsSync10(directPath)) {
|
|
16727
17702
|
return directPath;
|
|
16728
17703
|
}
|
|
16729
|
-
return collectFiles(transcriptRoot, ".jsonl").find((sourcePath) =>
|
|
17704
|
+
return collectFiles(transcriptRoot, ".jsonl").find((sourcePath) => path24.basename(sourcePath, ".jsonl") === args.sessionToken) ?? null;
|
|
16730
17705
|
}
|
|
16731
17706
|
function isCodexSubagentSession(payload) {
|
|
16732
17707
|
if (typeof payload.forked_from_id === "string" && payload.forked_from_id.trim()) {
|
|
@@ -16740,7 +17715,7 @@ function isCodexSubagentSession(payload) {
|
|
|
16740
17715
|
return Boolean(sourceRecord.subagent);
|
|
16741
17716
|
}
|
|
16742
17717
|
function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys, existingSessionKeys) {
|
|
16743
|
-
const sessionsDir =
|
|
17718
|
+
const sessionsDir = path24.join(homeDir, ".codex", "sessions");
|
|
16744
17719
|
const chats = [];
|
|
16745
17720
|
for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
|
|
16746
17721
|
const head = peekFileHead(sessionFile, 2048);
|
|
@@ -16754,7 +17729,7 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
|
|
|
16754
17729
|
if (payload && typeof payload === "object" && !Array.isArray(payload)) {
|
|
16755
17730
|
const payloadRecord = payload;
|
|
16756
17731
|
const peekedSessionToken = typeof payloadRecord.id === "string" ? payloadRecord.id : null;
|
|
16757
|
-
const peekedSessionLocalPath = typeof payloadRecord.cwd === "string" &&
|
|
17732
|
+
const peekedSessionLocalPath = typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd) ? path24.normalize(payloadRecord.cwd) : null;
|
|
16758
17733
|
if (isCodexSubagentSession(payloadRecord)) {
|
|
16759
17734
|
markSkippedSession(skippedSessionKeys, "codex", peekedSessionToken);
|
|
16760
17735
|
continue;
|
|
@@ -16803,8 +17778,8 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
|
|
|
16803
17778
|
if (!sessionToken && typeof payloadRecord.id === "string") {
|
|
16804
17779
|
sessionToken = payloadRecord.id;
|
|
16805
17780
|
}
|
|
16806
|
-
if (!sessionLocalPath && typeof payloadRecord.cwd === "string" &&
|
|
16807
|
-
sessionLocalPath =
|
|
17781
|
+
if (!sessionLocalPath && typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
|
|
17782
|
+
sessionLocalPath = path24.normalize(payloadRecord.cwd);
|
|
16808
17783
|
}
|
|
16809
17784
|
}
|
|
16810
17785
|
}
|
|
@@ -16840,13 +17815,13 @@ function readCodexProjectChats(homeDir, trackedWorktreePaths, skippedSessionKeys
|
|
|
16840
17815
|
function collectProjectChats(homeDir, trackedWorktreePaths, existingSessionKeys) {
|
|
16841
17816
|
const skippedSessionKeys = new Set;
|
|
16842
17817
|
const cursorTranscriptChats = [...trackedWorktreePaths].flatMap((localPath) => {
|
|
16843
|
-
const transcriptsDir =
|
|
17818
|
+
const transcriptsDir = path24.join(homeDir, ".cursor", "projects", encodeCursorProjectPath(localPath), "agent-transcripts");
|
|
16844
17819
|
const chats = [];
|
|
16845
17820
|
for (const sessionFile of collectFiles(transcriptsDir, ".jsonl")) {
|
|
16846
17821
|
const lines = readFileSync7(sessionFile, "utf8").split(`
|
|
16847
17822
|
`);
|
|
16848
17823
|
const entries = [];
|
|
16849
|
-
const sessionToken =
|
|
17824
|
+
const sessionToken = path24.basename(sessionFile, ".jsonl");
|
|
16850
17825
|
const sourceMtimeMs = statSync7(sessionFile).mtimeMs;
|
|
16851
17826
|
const modifiedAt = sourceMtimeMs;
|
|
16852
17827
|
lines.forEach((line, index) => {
|
|
@@ -16915,7 +17890,7 @@ function loadClaudeSessionEntries(args) {
|
|
|
16915
17890
|
return [];
|
|
16916
17891
|
}
|
|
16917
17892
|
function loadClaudeSessionEntriesFromFilesystem(args) {
|
|
16918
|
-
const projectsDir =
|
|
17893
|
+
const projectsDir = path24.join(args.homeDir, ".claude", "projects", encodeClaudeProjectPath(path24.normalize(args.localPath)));
|
|
16919
17894
|
for (const sessionFile of collectFiles(projectsDir, ".jsonl")) {
|
|
16920
17895
|
const lines = readFileSync7(sessionFile, "utf8").split(`
|
|
16921
17896
|
`);
|
|
@@ -16957,8 +17932,8 @@ function loadCodexSessionEntries(args) {
|
|
|
16957
17932
|
if (payloadRecord.id === args.session.sessionToken) {
|
|
16958
17933
|
matched = true;
|
|
16959
17934
|
}
|
|
16960
|
-
if (typeof payloadRecord.cwd === "string" &&
|
|
16961
|
-
sessionLocalPath =
|
|
17935
|
+
if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
|
|
17936
|
+
sessionLocalPath = path24.normalize(payloadRecord.cwd);
|
|
16962
17937
|
}
|
|
16963
17938
|
}
|
|
16964
17939
|
}
|
|
@@ -16966,13 +17941,13 @@ function loadCodexSessionEntries(args) {
|
|
|
16966
17941
|
entries.push(...codexEntriesFromRecord(record, index));
|
|
16967
17942
|
}
|
|
16968
17943
|
});
|
|
16969
|
-
if (matched && sessionLocalPath ===
|
|
17944
|
+
if (matched && sessionLocalPath === path24.normalize(args.session.localPath)) {
|
|
16970
17945
|
return entries;
|
|
16971
17946
|
}
|
|
16972
17947
|
return [];
|
|
16973
17948
|
}
|
|
16974
17949
|
function loadCodexSessionEntriesFromFilesystem(args) {
|
|
16975
|
-
const sessionsDir =
|
|
17950
|
+
const sessionsDir = path24.join(args.homeDir, ".codex", "sessions");
|
|
16976
17951
|
for (const sessionFile of collectFiles(sessionsDir, ".jsonl")) {
|
|
16977
17952
|
const lines = readFileSync7(sessionFile, "utf8").split(`
|
|
16978
17953
|
`);
|
|
@@ -16992,8 +17967,8 @@ function loadCodexSessionEntriesFromFilesystem(args) {
|
|
|
16992
17967
|
if (payloadRecord.id === args.sessionToken) {
|
|
16993
17968
|
matched = true;
|
|
16994
17969
|
}
|
|
16995
|
-
if (typeof payloadRecord.cwd === "string" &&
|
|
16996
|
-
sessionLocalPath =
|
|
17970
|
+
if (typeof payloadRecord.cwd === "string" && path24.isAbsolute(payloadRecord.cwd)) {
|
|
17971
|
+
sessionLocalPath = path24.normalize(payloadRecord.cwd);
|
|
16997
17972
|
}
|
|
16998
17973
|
}
|
|
16999
17974
|
}
|
|
@@ -17001,7 +17976,7 @@ function loadCodexSessionEntriesFromFilesystem(args) {
|
|
|
17001
17976
|
entries.push(...codexEntriesFromRecord(record, index));
|
|
17002
17977
|
}
|
|
17003
17978
|
});
|
|
17004
|
-
if (matched && sessionLocalPath ===
|
|
17979
|
+
if (matched && sessionLocalPath === path24.normalize(args.localPath)) {
|
|
17005
17980
|
return entries;
|
|
17006
17981
|
}
|
|
17007
17982
|
}
|
|
@@ -17049,14 +18024,14 @@ function loadCursorSessionEntriesFromFilesystem(args) {
|
|
|
17049
18024
|
return [];
|
|
17050
18025
|
}
|
|
17051
18026
|
const metadata = readCursorChatStoreMetadata(chatStorePath);
|
|
17052
|
-
if (metadata?.localPath !==
|
|
18027
|
+
if (metadata?.localPath !== path24.normalize(args.localPath)) {
|
|
17053
18028
|
return [];
|
|
17054
18029
|
}
|
|
17055
18030
|
return loadCursorChatStoreEntries(chatStorePath);
|
|
17056
18031
|
}
|
|
17057
18032
|
function loadProviderSessionEntries(args) {
|
|
17058
18033
|
const startedAt = performance.now();
|
|
17059
|
-
const root = args.homeDir ??
|
|
18034
|
+
const root = args.homeDir ?? homedir15();
|
|
17060
18035
|
const indexedSession = args.provider === "claude" || args.provider === "codex" || args.provider === "cursor" ? args.providerSessionIndex?.getSession(args.provider, args.sessionToken) : null;
|
|
17061
18036
|
const entries = args.provider === "claude" && indexedSession ? loadClaudeSessionEntries({
|
|
17062
18037
|
session: indexedSession
|
|
@@ -17094,8 +18069,8 @@ function hydrateProviderSessionWindow(args) {
|
|
|
17094
18069
|
});
|
|
17095
18070
|
}
|
|
17096
18071
|
async function importProjectHistory(args) {
|
|
17097
|
-
const normalizedPaths = new Set(args.worktreePaths.map((worktreePath) =>
|
|
17098
|
-
normalizedPaths.add(
|
|
18072
|
+
const normalizedPaths = new Set(args.worktreePaths.map((worktreePath) => path24.normalize(worktreePath)));
|
|
18073
|
+
normalizedPaths.add(path24.normalize(args.localPath));
|
|
17099
18074
|
if (args.store.isProjectHidden(args.repoKey)) {
|
|
17100
18075
|
return {
|
|
17101
18076
|
importedChatIds: [],
|
|
@@ -17117,7 +18092,7 @@ async function importProjectHistory(args) {
|
|
|
17117
18092
|
entries: []
|
|
17118
18093
|
})),
|
|
17119
18094
|
skippedSessionKeys: new Set
|
|
17120
|
-
} : collectProjectChats(args.homeDir ??
|
|
18095
|
+
} : collectProjectChats(args.homeDir ?? homedir15(), normalizedPaths, existingSessionKeys);
|
|
17121
18096
|
for (const chat of existingChats.filter((candidate) => {
|
|
17122
18097
|
if (!candidate.provider || !candidate.sessionToken)
|
|
17123
18098
|
return false;
|
|
@@ -17212,8 +18187,8 @@ function isClientEnvelope(value) {
|
|
|
17212
18187
|
}
|
|
17213
18188
|
|
|
17214
18189
|
// src/server/external-open.ts
|
|
17215
|
-
import { stat as
|
|
17216
|
-
import
|
|
18190
|
+
import { stat as stat6 } from "fs/promises";
|
|
18191
|
+
import path25 from "path";
|
|
17217
18192
|
import process9 from "process";
|
|
17218
18193
|
var DEFAULT_EDITOR_SETTINGS = {
|
|
17219
18194
|
preset: "cursor",
|
|
@@ -17222,7 +18197,7 @@ var DEFAULT_EDITOR_SETTINGS = {
|
|
|
17222
18197
|
async function openExternal(command) {
|
|
17223
18198
|
const resolvedPath = resolveLocalPath(command.localPath);
|
|
17224
18199
|
const platform = process9.platform;
|
|
17225
|
-
const info = command.action === "open_editor" || command.action === "open_finder" ? await
|
|
18200
|
+
const info = command.action === "open_editor" || command.action === "open_finder" ? await stat6(resolvedPath).catch(() => null) : null;
|
|
17226
18201
|
if (command.action === "open_editor") {
|
|
17227
18202
|
if (!info) {
|
|
17228
18203
|
throw new Error(`Path not found: ${resolvedPath}`);
|
|
@@ -17271,7 +18246,7 @@ async function openExternal(command) {
|
|
|
17271
18246
|
}
|
|
17272
18247
|
}
|
|
17273
18248
|
if (command.action === "open_finder") {
|
|
17274
|
-
spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath :
|
|
18249
|
+
spawnDetached("xdg-open", [info?.isDirectory() ? resolvedPath : path25.dirname(resolvedPath)]);
|
|
17275
18250
|
return;
|
|
17276
18251
|
}
|
|
17277
18252
|
if (command.action === "open_terminal") {
|
|
@@ -17468,9 +18443,19 @@ function createRealtimeDeltaPublisher({
|
|
|
17468
18443
|
function publishSidebarEvent(event) {
|
|
17469
18444
|
publishToSubscriptions((topic) => topic.type === "sidebar", event);
|
|
17470
18445
|
}
|
|
18446
|
+
function refreshChatSnapshot(chatId) {
|
|
18447
|
+
for (const ws of sockets) {
|
|
18448
|
+
for (const [id, topic] of ws.data.subscriptions.entries()) {
|
|
18449
|
+
if (topic.type === "chat" && topic.chatId === chatId) {
|
|
18450
|
+
sendSnapshot(ws, id, topic);
|
|
18451
|
+
}
|
|
18452
|
+
}
|
|
18453
|
+
}
|
|
18454
|
+
}
|
|
17471
18455
|
return {
|
|
17472
18456
|
sendInitialSnapshot: sendSnapshot,
|
|
17473
18457
|
sendRefreshSnapshot: sendSnapshot,
|
|
18458
|
+
refreshChatSnapshot,
|
|
17474
18459
|
publishChatMessageAppended(chatId, entry) {
|
|
17475
18460
|
publishChatEvent(chatId, { type: "chat.message-appended", chatId, entry });
|
|
17476
18461
|
},
|
|
@@ -17492,6 +18477,13 @@ function createRealtimeDeltaPublisher({
|
|
|
17492
18477
|
publishChatPendingToolSet(chatId, pendingTool) {
|
|
17493
18478
|
publishChatEvent(chatId, { type: "chat.pending-tool-set", chatId, pendingTool });
|
|
17494
18479
|
},
|
|
18480
|
+
publishChatOutboundQueueSet(chatId, queuedMessages) {
|
|
18481
|
+
publishChatEvent(chatId, {
|
|
18482
|
+
type: "chat.outbound-queue-set",
|
|
18483
|
+
chatId,
|
|
18484
|
+
queuedMessages
|
|
18485
|
+
});
|
|
18486
|
+
},
|
|
17495
18487
|
publishChatSessionTokenSet(chatId, sessionToken, hydrationState) {
|
|
17496
18488
|
publishChatEvent(chatId, {
|
|
17497
18489
|
type: "chat.session-token-set",
|
|
@@ -17666,9 +18658,7 @@ function resolveChatUsage({
|
|
|
17666
18658
|
// src/server/ws-router.ts
|
|
17667
18659
|
var PROVIDER_USAGE_POLL_INTERVAL_MS = 30 * 60 * 1000;
|
|
17668
18660
|
var PROVIDER_USAGE_POLL_MAX_INTERVAL_MS = 31 * 60 * 1000;
|
|
17669
|
-
var INITIAL_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
|
|
17670
18661
|
var INITIAL_CHAT_WINDOW_MIN_ENTRIES = 240;
|
|
17671
|
-
var LOAD_MORE_CHAT_WINDOW_TARGET_BYTES = 384 * 1024;
|
|
17672
18662
|
var LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES = 200;
|
|
17673
18663
|
function send(ws, message) {
|
|
17674
18664
|
const payload = JSON.stringify(message);
|
|
@@ -17680,7 +18670,7 @@ function send(ws, message) {
|
|
|
17680
18670
|
function hasSidebarSnapshotState(store) {
|
|
17681
18671
|
return Boolean(store && typeof store === "object" && "state" in store && store.state && typeof store.state === "object");
|
|
17682
18672
|
}
|
|
17683
|
-
function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
|
|
18673
|
+
function getChatTranscriptWindow(store, providerSessionIndex, chatId, targetBytes, warmHydratedTranscriptCache, pruneEmptyProviderShell) {
|
|
17684
18674
|
const startedAt = performance.now();
|
|
17685
18675
|
const chat = store.getChat(chatId);
|
|
17686
18676
|
const hasLocalPayload = typeof store.hasLocalChatPayload === "function" ? store.hasLocalChatPayload(chatId) : true;
|
|
@@ -17690,7 +18680,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
|
|
|
17690
18680
|
provider: chat.provider,
|
|
17691
18681
|
sessionToken: chat.sessionToken,
|
|
17692
18682
|
localPath: store.getProject(chat.projectId)?.localPath ?? "",
|
|
17693
|
-
targetBytes
|
|
18683
|
+
targetBytes,
|
|
17694
18684
|
minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES,
|
|
17695
18685
|
providerSessionIndex
|
|
17696
18686
|
});
|
|
@@ -17713,7 +18703,7 @@ function getChatTranscriptWindow(store, providerSessionIndex, chatId, warmHydrat
|
|
|
17713
18703
|
}
|
|
17714
18704
|
if (typeof store.getMessageWindow === "function") {
|
|
17715
18705
|
const transcript = store.getMessageWindow(chatId, {
|
|
17716
|
-
targetBytes
|
|
18706
|
+
targetBytes,
|
|
17717
18707
|
minEntries: INITIAL_CHAT_WINDOW_MIN_ENTRIES
|
|
17718
18708
|
});
|
|
17719
18709
|
performanceDiagnostics.recordTiming("chat_open_snapshot_latency_ms", Math.round(performance.now() - startedAt), { chatId, source: "local" });
|
|
@@ -17741,6 +18731,8 @@ function topicKey(topic) {
|
|
|
17741
18731
|
return `feature-overview:${topic.featureId}`;
|
|
17742
18732
|
case "chat":
|
|
17743
18733
|
return `chat:${topic.chatId}`;
|
|
18734
|
+
case "project-diffs":
|
|
18735
|
+
return `project-diffs:${topic.projectId}`;
|
|
17744
18736
|
default:
|
|
17745
18737
|
return topic.type;
|
|
17746
18738
|
}
|
|
@@ -17751,7 +18743,9 @@ function createWsRouter({
|
|
|
17751
18743
|
providerSessionIndex,
|
|
17752
18744
|
terminals,
|
|
17753
18745
|
git,
|
|
18746
|
+
diffs: providedDiffs,
|
|
17754
18747
|
keybindings,
|
|
18748
|
+
generalSettings,
|
|
17755
18749
|
providerSettings,
|
|
17756
18750
|
providerCatalogManager,
|
|
17757
18751
|
remoteAuth,
|
|
@@ -17774,7 +18768,9 @@ function createWsRouter({
|
|
|
17774
18768
|
openUrlCommand = openUrl2,
|
|
17775
18769
|
resolveChatUsageForSnapshot = resolveChatUsage
|
|
17776
18770
|
}) {
|
|
18771
|
+
const diffs = providedDiffs ?? new DiffStore(git);
|
|
17777
18772
|
const sockets = new Set;
|
|
18773
|
+
const getSendChunkSizeBytes = () => generalSettings?.getSnapshot().settings.sendChunkSizeBytes ?? DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
|
|
17778
18774
|
const realtime = createRealtimeDeltaPublisher({
|
|
17779
18775
|
sockets,
|
|
17780
18776
|
send,
|
|
@@ -17851,6 +18847,16 @@ function createWsRouter({
|
|
|
17851
18847
|
data: keybindings.getSnapshot()
|
|
17852
18848
|
};
|
|
17853
18849
|
}
|
|
18850
|
+
if (topic.type === "general-settings") {
|
|
18851
|
+
return {
|
|
18852
|
+
type: "general-settings",
|
|
18853
|
+
data: generalSettings?.getSnapshot() ?? {
|
|
18854
|
+
settings: DEFAULT_GENERAL_SETTINGS,
|
|
18855
|
+
warning: null,
|
|
18856
|
+
filePathDisplay: ""
|
|
18857
|
+
}
|
|
18858
|
+
};
|
|
18859
|
+
}
|
|
17854
18860
|
if (topic.type === "theme-settings") {
|
|
17855
18861
|
return {
|
|
17856
18862
|
type: "theme-settings",
|
|
@@ -17911,17 +18917,23 @@ function createWsRouter({
|
|
|
17911
18917
|
data: store.getFeatureOverviewSnapshot(topic.featureId)
|
|
17912
18918
|
};
|
|
17913
18919
|
}
|
|
18920
|
+
if (topic.type === "project-diffs") {
|
|
18921
|
+
return {
|
|
18922
|
+
type: "project-diffs",
|
|
18923
|
+
data: diffs.getSnapshot(topic.projectId)
|
|
18924
|
+
};
|
|
18925
|
+
}
|
|
17914
18926
|
return {
|
|
17915
18927
|
type: "chat",
|
|
17916
18928
|
data: (() => {
|
|
17917
18929
|
const chat = store.getChat(topic.chatId);
|
|
17918
|
-
const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
|
|
18930
|
+
const transcript = getChatTranscriptWindow(store, providerSessionIndex, topic.chatId, getSendChunkSizeBytes(), warmHydratedTranscriptCache, (chatId) => pruneOrphanProviderShells([chatId]));
|
|
17919
18931
|
const messages = transcript.entries;
|
|
17920
18932
|
return deriveChatSnapshot(store.state, agent.getChatStatus(topic.chatId), topic.chatId, () => transcript, () => getLastChatModel(store, topic.chatId), agent.getChatPendingTool(topic.chatId), resolveChatUsageForSnapshot({
|
|
17921
18933
|
chat,
|
|
17922
18934
|
messages,
|
|
17923
18935
|
liveUsage: agent.getLiveUsage(topic.chatId)
|
|
17924
|
-
}), providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS, providerCatalogManager?.getSelectableProviders(providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS));
|
|
18936
|
+
}), null, providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS, providerCatalogManager?.getSelectableProviders(providerSettings?.getSnapshot().settings ?? DEFAULT_PROVIDER_SETTINGS), agent.getQueuedOutboundPreview(topic.chatId));
|
|
17925
18937
|
})()
|
|
17926
18938
|
};
|
|
17927
18939
|
}
|
|
@@ -17975,6 +18987,24 @@ function createWsRouter({
|
|
|
17975
18987
|
}
|
|
17976
18988
|
}
|
|
17977
18989
|
}
|
|
18990
|
+
function pushProjectDiffSnapshot(projectId) {
|
|
18991
|
+
const snapshot = deriveSnapshotForTopic({ type: "project-diffs", projectId });
|
|
18992
|
+
for (const ws of sockets) {
|
|
18993
|
+
for (const [id, topic] of ws.data.subscriptions.entries()) {
|
|
18994
|
+
if (topic.type !== "project-diffs" || topic.projectId !== projectId) {
|
|
18995
|
+
continue;
|
|
18996
|
+
}
|
|
18997
|
+
send(ws, {
|
|
18998
|
+
v: PROTOCOL_VERSION,
|
|
18999
|
+
type: "snapshot",
|
|
19000
|
+
id,
|
|
19001
|
+
seq: (ws.data.seqBySubscriptionId.get(id) ?? 0) + 1,
|
|
19002
|
+
snapshot
|
|
19003
|
+
});
|
|
19004
|
+
ws.data.seqBySubscriptionId.set(id, (ws.data.seqBySubscriptionId.get(id) ?? 0) + 1);
|
|
19005
|
+
}
|
|
19006
|
+
}
|
|
19007
|
+
}
|
|
17978
19008
|
function pushFeatureOverviewSnapshot(featureId) {
|
|
17979
19009
|
for (const ws of sockets) {
|
|
17980
19010
|
for (const [id, topic] of ws.data.subscriptions.entries()) {
|
|
@@ -18012,6 +19042,22 @@ function createWsRouter({
|
|
|
18012
19042
|
}
|
|
18013
19043
|
}
|
|
18014
19044
|
});
|
|
19045
|
+
let lastSendChunkSizeBytes = generalSettings?.getSnapshot().settings.sendChunkSizeBytes ?? DEFAULT_GENERAL_SETTINGS.sendChunkSizeBytes;
|
|
19046
|
+
const disposeGeneralSettingsEvents = generalSettings?.onChange((snapshot) => {
|
|
19047
|
+
const previousSendChunkSizeBytes = lastSendChunkSizeBytes;
|
|
19048
|
+
lastSendChunkSizeBytes = snapshot.settings.sendChunkSizeBytes;
|
|
19049
|
+
for (const ws of sockets) {
|
|
19050
|
+
for (const [id, topic] of ws.data.subscriptions.entries()) {
|
|
19051
|
+
if (topic.type === "general-settings") {
|
|
19052
|
+
realtime.sendRefreshSnapshot(ws, id, topic);
|
|
19053
|
+
continue;
|
|
19054
|
+
}
|
|
19055
|
+
if (topic.type === "chat" && previousSendChunkSizeBytes !== lastSendChunkSizeBytes) {
|
|
19056
|
+
realtime.sendRefreshSnapshot(ws, id, topic);
|
|
19057
|
+
}
|
|
19058
|
+
}
|
|
19059
|
+
}
|
|
19060
|
+
}) ?? (() => {});
|
|
18015
19061
|
const disposeThemeSettingsEvents = themeSettings.onChange(() => {
|
|
18016
19062
|
for (const ws of sockets) {
|
|
18017
19063
|
for (const [id, topic] of ws.data.subscriptions.entries()) {
|
|
@@ -18140,6 +19186,14 @@ function createWsRouter({
|
|
|
18140
19186
|
});
|
|
18141
19187
|
return;
|
|
18142
19188
|
}
|
|
19189
|
+
case "settings.writeGeneralSettings": {
|
|
19190
|
+
if (!generalSettings) {
|
|
19191
|
+
throw new Error("General settings unavailable.");
|
|
19192
|
+
}
|
|
19193
|
+
const snapshot = await generalSettings.write(command.settings);
|
|
19194
|
+
send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result: snapshot });
|
|
19195
|
+
return;
|
|
19196
|
+
}
|
|
18143
19197
|
case "settings.readKeybindings": {
|
|
18144
19198
|
send(ws, {
|
|
18145
19199
|
v: PROTOCOL_VERSION,
|
|
@@ -18302,6 +19356,7 @@ function createWsRouter({
|
|
|
18302
19356
|
}
|
|
18303
19357
|
await store.hideProject(project.localPath);
|
|
18304
19358
|
realtime.publishSidebarProjectRemoved(project.id);
|
|
19359
|
+
diffs.clearSnapshot(project.id);
|
|
18305
19360
|
}
|
|
18306
19361
|
await refreshDiscovery();
|
|
18307
19362
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
@@ -18336,6 +19391,7 @@ function createWsRouter({
|
|
|
18336
19391
|
await store.hideProject(command.localPath);
|
|
18337
19392
|
if (existingProject) {
|
|
18338
19393
|
realtime.publishSidebarProjectRemoved(existingProject.id);
|
|
19394
|
+
diffs.clearSnapshot(existingProject.id);
|
|
18339
19395
|
}
|
|
18340
19396
|
await refreshDiscovery();
|
|
18341
19397
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
@@ -18530,11 +19586,35 @@ function createWsRouter({
|
|
|
18530
19586
|
await agent.cancel(command.chatId);
|
|
18531
19587
|
agent.disposeChatResources(command.chatId);
|
|
18532
19588
|
await store.deleteChat(command.chatId);
|
|
19589
|
+
if (store.listChatsByProject(chat.projectId).length === 0) {
|
|
19590
|
+
diffs.clearSnapshot(chat.projectId);
|
|
19591
|
+
}
|
|
18533
19592
|
realtime.publishChatDeleted(command.chatId);
|
|
18534
19593
|
realtime.publishSidebarChatRemoved(chat.projectId, chat.featureId ?? null, command.chatId);
|
|
18535
19594
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
18536
19595
|
break;
|
|
18537
19596
|
}
|
|
19597
|
+
case "project.refreshDiffs": {
|
|
19598
|
+
const project = store.getProject(command.projectId);
|
|
19599
|
+
if (!project)
|
|
19600
|
+
throw new Error("Project not found");
|
|
19601
|
+
const previousSnapshot = diffs.getSnapshot(command.projectId);
|
|
19602
|
+
const snapshot = await diffs.refreshProjectDiffSnapshot({
|
|
19603
|
+
projectId: command.projectId,
|
|
19604
|
+
localPath: project.localPath
|
|
19605
|
+
});
|
|
19606
|
+
const changed = !areDiffSnapshotsEquivalent(previousSnapshot, snapshot);
|
|
19607
|
+
send(ws, {
|
|
19608
|
+
v: PROTOCOL_VERSION,
|
|
19609
|
+
type: "ack",
|
|
19610
|
+
id,
|
|
19611
|
+
result: { changed }
|
|
19612
|
+
});
|
|
19613
|
+
if (changed) {
|
|
19614
|
+
pushProjectDiffSnapshot(command.projectId);
|
|
19615
|
+
}
|
|
19616
|
+
break;
|
|
19617
|
+
}
|
|
18538
19618
|
case "chat.loadMore": {
|
|
18539
19619
|
const chat = store.getChat(command.chatId);
|
|
18540
19620
|
const transcript = chat && !store.hasLocalChatPayload(command.chatId) && chat.provider && chat.sessionToken && (chat.provider === "claude" || chat.provider === "codex" || chat.provider === "cursor") ? hydrateProviderSessionWindow({
|
|
@@ -18542,12 +19622,12 @@ function createWsRouter({
|
|
|
18542
19622
|
sessionToken: chat.sessionToken,
|
|
18543
19623
|
localPath: store.getProject(chat.projectId)?.localPath ?? "",
|
|
18544
19624
|
beforeEntryId: command.beforeEntryId,
|
|
18545
|
-
targetBytes: command.targetBytes ??
|
|
19625
|
+
targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
|
|
18546
19626
|
minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES,
|
|
18547
19627
|
providerSessionIndex
|
|
18548
19628
|
}) : store.getMessageWindow(command.chatId, {
|
|
18549
19629
|
beforeEntryId: command.beforeEntryId,
|
|
18550
|
-
targetBytes: command.targetBytes ??
|
|
19630
|
+
targetBytes: command.targetBytes ?? getSendChunkSizeBytes(),
|
|
18551
19631
|
minEntries: LOAD_MORE_CHAT_WINDOW_MIN_ENTRIES
|
|
18552
19632
|
});
|
|
18553
19633
|
const result = {
|
|
@@ -18593,6 +19673,16 @@ function createWsRouter({
|
|
|
18593
19673
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
|
|
18594
19674
|
break;
|
|
18595
19675
|
}
|
|
19676
|
+
case "chat.outboundQueue.remove": {
|
|
19677
|
+
await agent.removeOutboundQueueMessage(command.chatId, command.messageId);
|
|
19678
|
+
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
19679
|
+
break;
|
|
19680
|
+
}
|
|
19681
|
+
case "chat.outboundQueue.update": {
|
|
19682
|
+
await agent.updateOutboundQueueMessage(command.chatId, command.messageId, command.text);
|
|
19683
|
+
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
19684
|
+
break;
|
|
19685
|
+
}
|
|
18596
19686
|
case "chat.cancel": {
|
|
18597
19687
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
18598
19688
|
agent.cancel(command.chatId).catch((error) => {
|
|
@@ -18600,6 +19690,44 @@ function createWsRouter({
|
|
|
18600
19690
|
});
|
|
18601
19691
|
break;
|
|
18602
19692
|
}
|
|
19693
|
+
case "chat.generateCommitMessage": {
|
|
19694
|
+
const chat = store.getChat(command.chatId);
|
|
19695
|
+
if (!chat)
|
|
19696
|
+
throw new Error("Chat not found");
|
|
19697
|
+
const project = store.getProject(chat.projectId);
|
|
19698
|
+
if (!project)
|
|
19699
|
+
throw new Error("Project not found");
|
|
19700
|
+
const result = await diffs.generateCommitMessage({
|
|
19701
|
+
projectId: project.id,
|
|
19702
|
+
localPath: project.localPath,
|
|
19703
|
+
paths: command.paths
|
|
19704
|
+
});
|
|
19705
|
+
send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
|
|
19706
|
+
break;
|
|
19707
|
+
}
|
|
19708
|
+
case "chat.commitDiffs": {
|
|
19709
|
+
const chat = store.getChat(command.chatId);
|
|
19710
|
+
if (!chat)
|
|
19711
|
+
throw new Error("Chat not found");
|
|
19712
|
+
const project = store.getProject(chat.projectId);
|
|
19713
|
+
if (!project)
|
|
19714
|
+
throw new Error("Project not found");
|
|
19715
|
+
const previousSnapshot = diffs.getSnapshot(project.id);
|
|
19716
|
+
const result = await diffs.commitDiffs({
|
|
19717
|
+
projectId: project.id,
|
|
19718
|
+
localPath: project.localPath,
|
|
19719
|
+
paths: command.paths,
|
|
19720
|
+
summary: command.summary,
|
|
19721
|
+
description: command.description,
|
|
19722
|
+
mode: command.mode
|
|
19723
|
+
});
|
|
19724
|
+
send(ws, { v: PROTOCOL_VERSION, type: "ack", id, result });
|
|
19725
|
+
const nextSnapshot = diffs.getSnapshot(project.id);
|
|
19726
|
+
if (result.snapshotChanged && !areDiffSnapshotsEquivalent(previousSnapshot, nextSnapshot)) {
|
|
19727
|
+
pushProjectDiffSnapshot(project.id);
|
|
19728
|
+
}
|
|
19729
|
+
break;
|
|
19730
|
+
}
|
|
18603
19731
|
case "chat.respondTool": {
|
|
18604
19732
|
await agent.respondTool(command);
|
|
18605
19733
|
send(ws, { v: PROTOCOL_VERSION, type: "ack", id });
|
|
@@ -18749,6 +19877,7 @@ function createWsRouter({
|
|
|
18749
19877
|
}
|
|
18750
19878
|
disposeTerminalEvents();
|
|
18751
19879
|
disposeKeybindingEvents();
|
|
19880
|
+
disposeGeneralSettingsEvents();
|
|
18752
19881
|
disposeProviderSettingsEvents();
|
|
18753
19882
|
disposeProviderCatalogEvents();
|
|
18754
19883
|
disposeRemoteAuthEvents();
|
|
@@ -18786,10 +19915,10 @@ var remoteRelaySnapshotFallback = {
|
|
|
18786
19915
|
};
|
|
18787
19916
|
|
|
18788
19917
|
// src/server/remote-auth.ts
|
|
18789
|
-
import { watch as
|
|
18790
|
-
import { chmod, mkdir as
|
|
18791
|
-
import { homedir as
|
|
18792
|
-
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";
|
|
18793
19922
|
|
|
18794
19923
|
// ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.js
|
|
18795
19924
|
var exports_external = {};
|
|
@@ -19266,8 +20395,8 @@ function getErrorMap() {
|
|
|
19266
20395
|
}
|
|
19267
20396
|
// ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js
|
|
19268
20397
|
var makeIssue = (params) => {
|
|
19269
|
-
const { data, path:
|
|
19270
|
-
const fullPath = [...
|
|
20398
|
+
const { data, path: path26, errorMaps, issueData } = params;
|
|
20399
|
+
const fullPath = [...path26, ...issueData.path || []];
|
|
19271
20400
|
const fullIssue = {
|
|
19272
20401
|
...issueData,
|
|
19273
20402
|
path: fullPath
|
|
@@ -19379,11 +20508,11 @@ var errorUtil;
|
|
|
19379
20508
|
|
|
19380
20509
|
// ../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/types.js
|
|
19381
20510
|
class ParseInputLazyPath {
|
|
19382
|
-
constructor(parent, value,
|
|
20511
|
+
constructor(parent, value, path26, key) {
|
|
19383
20512
|
this._cachedPath = [];
|
|
19384
20513
|
this.parent = parent;
|
|
19385
20514
|
this.data = value;
|
|
19386
|
-
this._path =
|
|
20515
|
+
this._path = path26;
|
|
19387
20516
|
this._key = key;
|
|
19388
20517
|
}
|
|
19389
20518
|
get path() {
|
|
@@ -23070,8 +24199,8 @@ function dedupeCallbackUrls(values) {
|
|
|
23070
24199
|
return [...new Set(values)];
|
|
23071
24200
|
}
|
|
23072
24201
|
function getRemoteAuthTokenFilePath(stateFilePath) {
|
|
23073
|
-
const parsedPath =
|
|
23074
|
-
return
|
|
24202
|
+
const parsedPath = path26.parse(stateFilePath);
|
|
24203
|
+
return path26.join(parsedPath.dir, `${parsedPath.name}.tokens${parsedPath.ext}`);
|
|
23075
24204
|
}
|
|
23076
24205
|
function buildAllowedRemoteAuthCallbackUrls(localBaseUrl) {
|
|
23077
24206
|
const currentUrl = new URL(localBaseUrl);
|
|
@@ -23236,7 +24365,7 @@ function formatJwksErrorBodyPreview(bodyText) {
|
|
|
23236
24365
|
}
|
|
23237
24366
|
async function writeFileAtomically(filePath, contents, options) {
|
|
23238
24367
|
const tempFilePath = `${filePath}.${crypto.randomUUID()}.tmp`;
|
|
23239
|
-
await
|
|
24368
|
+
await writeFile9(tempFilePath, contents, {
|
|
23240
24369
|
encoding: "utf8",
|
|
23241
24370
|
mode: options?.mode
|
|
23242
24371
|
});
|
|
@@ -23260,14 +24389,14 @@ class RemoteAuthManager {
|
|
|
23260
24389
|
state;
|
|
23261
24390
|
snapshot;
|
|
23262
24391
|
listeners = new Set;
|
|
23263
|
-
constructor(filePath = getRemoteAuthFilePath(
|
|
24392
|
+
constructor(filePath = getRemoteAuthFilePath(homedir16())) {
|
|
23264
24393
|
this.filePath = filePath;
|
|
23265
24394
|
this.tokenFilePath = getRemoteAuthTokenFilePath(filePath);
|
|
23266
24395
|
this.state = normalizeStoredRemoteAuthState(null);
|
|
23267
24396
|
this.snapshot = createSnapshot2(this.state, getRemoteAuthFilePathDisplay());
|
|
23268
24397
|
}
|
|
23269
24398
|
async initialize() {
|
|
23270
|
-
await
|
|
24399
|
+
await mkdir9(path26.dirname(this.filePath), { recursive: true });
|
|
23271
24400
|
const file = Bun.file(this.filePath);
|
|
23272
24401
|
if (!await file.exists()) {
|
|
23273
24402
|
await this.persistState(normalizeStoredRemoteAuthState(null));
|
|
@@ -23602,7 +24731,7 @@ class RemoteAuthManager {
|
|
|
23602
24731
|
throw lastError ?? new Error("Failed to fetch Kaizen JWKS");
|
|
23603
24732
|
}
|
|
23604
24733
|
async persistState(state) {
|
|
23605
|
-
await
|
|
24734
|
+
await mkdir9(path26.dirname(this.filePath), { recursive: true });
|
|
23606
24735
|
const { metadata, tokens } = splitStoredState(state);
|
|
23607
24736
|
await writeFileAtomically(this.tokenFilePath, `${JSON.stringify(tokens, null, 2)}
|
|
23608
24737
|
`, {
|
|
@@ -23663,10 +24792,10 @@ class RemoteAuthManager {
|
|
|
23663
24792
|
startWatching() {
|
|
23664
24793
|
this.watcher?.close();
|
|
23665
24794
|
try {
|
|
23666
|
-
this.watcher =
|
|
24795
|
+
this.watcher = watch5(path26.dirname(this.filePath), { persistent: false }, (eventType, filename) => {
|
|
23667
24796
|
if (eventType !== "change" && eventType !== "rename")
|
|
23668
24797
|
return;
|
|
23669
|
-
if (filename && filename !==
|
|
24798
|
+
if (filename && filename !== path26.basename(this.filePath) && filename !== path26.basename(this.tokenFilePath)) {
|
|
23670
24799
|
return;
|
|
23671
24800
|
}
|
|
23672
24801
|
this.reloadFromDisk().catch((error) => {
|
|
@@ -23681,7 +24810,7 @@ class RemoteAuthManager {
|
|
|
23681
24810
|
}
|
|
23682
24811
|
async function readRemoteAuthState(filePath, tokenFilePath) {
|
|
23683
24812
|
try {
|
|
23684
|
-
const metadataText = await
|
|
24813
|
+
const metadataText = await readFile9(filePath, "utf8");
|
|
23685
24814
|
const metadataValue = metadataText.trim() ? JSON.parse(metadataText) : null;
|
|
23686
24815
|
const tokenValue = await readRemoteAuthTokens(tokenFilePath);
|
|
23687
24816
|
const needsMigration = containsLegacyTokenFields(metadataValue) || tokenValue === null;
|
|
@@ -23705,7 +24834,7 @@ async function readRemoteAuthState(filePath, tokenFilePath) {
|
|
|
23705
24834
|
}
|
|
23706
24835
|
async function readRemoteAuthTokens(filePath) {
|
|
23707
24836
|
try {
|
|
23708
|
-
const text = await
|
|
24837
|
+
const text = await readFile9(filePath, "utf8");
|
|
23709
24838
|
if (!text.trim()) {
|
|
23710
24839
|
return null;
|
|
23711
24840
|
}
|
|
@@ -23719,9 +24848,9 @@ async function readRemoteAuthTokens(filePath) {
|
|
|
23719
24848
|
}
|
|
23720
24849
|
|
|
23721
24850
|
// src/server/remote-relay.ts
|
|
23722
|
-
import { mkdir as
|
|
23723
|
-
import { homedir as
|
|
23724
|
-
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";
|
|
23725
24854
|
var OFFLINE_POLL_INTERVAL_MS = 15000;
|
|
23726
24855
|
var HOP_BY_HOP_HEADER_NAMES = new Set([
|
|
23727
24856
|
"accept-encoding",
|
|
@@ -23838,7 +24967,7 @@ class RemoteRelayManager {
|
|
|
23838
24967
|
reconnectAttempt = 0;
|
|
23839
24968
|
isIdleDisconnected = false;
|
|
23840
24969
|
proxiedSockets = new Map;
|
|
23841
|
-
constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(
|
|
24970
|
+
constructor(remoteAuth, machineDisplayName, filePath = getRemoteRelayFilePath(homedir17())) {
|
|
23842
24971
|
this.remoteAuth = remoteAuth;
|
|
23843
24972
|
this.machineDisplayName = machineDisplayName;
|
|
23844
24973
|
this.filePath = filePath;
|
|
@@ -23848,7 +24977,7 @@ class RemoteRelayManager {
|
|
|
23848
24977
|
async initialize(localPort, localHost) {
|
|
23849
24978
|
this.localPort = localPort;
|
|
23850
24979
|
this.localHost = resolveUpstreamHost(localHost);
|
|
23851
|
-
await
|
|
24980
|
+
await mkdir10(path27.dirname(this.filePath), { recursive: true });
|
|
23852
24981
|
this.state = await this.readState();
|
|
23853
24982
|
this.setSnapshot(createSnapshot3(this.state));
|
|
23854
24983
|
this.remoteAuth.onChange(() => {
|
|
@@ -23879,7 +25008,7 @@ class RemoteRelayManager {
|
|
|
23879
25008
|
}
|
|
23880
25009
|
async readState() {
|
|
23881
25010
|
try {
|
|
23882
|
-
const text = await
|
|
25011
|
+
const text = await readFile10(this.filePath, "utf8");
|
|
23883
25012
|
return normalizeState(JSON.parse(text));
|
|
23884
25013
|
} catch {
|
|
23885
25014
|
return normalizeState(null);
|
|
@@ -23887,7 +25016,7 @@ class RemoteRelayManager {
|
|
|
23887
25016
|
}
|
|
23888
25017
|
async persistState(state) {
|
|
23889
25018
|
this.state = state;
|
|
23890
|
-
await
|
|
25019
|
+
await writeFile10(this.filePath, `${JSON.stringify(state, null, 2)}
|
|
23891
25020
|
`, "utf8");
|
|
23892
25021
|
}
|
|
23893
25022
|
setSnapshot(snapshot) {
|
|
@@ -24029,10 +25158,6 @@ class RemoteRelayManager {
|
|
|
24029
25158
|
this.disconnect("disabled");
|
|
24030
25159
|
return;
|
|
24031
25160
|
}
|
|
24032
|
-
if (!authSnapshot.entitlements?.["remote.relay"]) {
|
|
24033
|
-
this.disconnect("unauthorized");
|
|
24034
|
-
return;
|
|
24035
|
-
}
|
|
24036
25161
|
if (this.isIdleDisconnected) {
|
|
24037
25162
|
this.setSnapshot(createSnapshot3(this.state, { status: "idle_disconnected" }));
|
|
24038
25163
|
this.startOfflinePoll();
|
|
@@ -24043,7 +25168,16 @@ class RemoteRelayManager {
|
|
|
24043
25168
|
}
|
|
24044
25169
|
this.setSnapshot(createSnapshot3(this.state, { status: "registering" }));
|
|
24045
25170
|
this.stopOfflinePoll();
|
|
24046
|
-
|
|
25171
|
+
let registration;
|
|
25172
|
+
try {
|
|
25173
|
+
registration = await this.registerMachine(authSnapshot.baseUrl, accessToken);
|
|
25174
|
+
} catch (error) {
|
|
25175
|
+
if (error instanceof Error && "status" in error && error.status === 403) {
|
|
25176
|
+
this.disconnect("unauthorized");
|
|
25177
|
+
return;
|
|
25178
|
+
}
|
|
25179
|
+
throw error;
|
|
25180
|
+
}
|
|
24047
25181
|
await this.persistState({
|
|
24048
25182
|
relayEnabled: this.state.relayEnabled,
|
|
24049
25183
|
ownerUserId: authSnapshot.userId,
|
|
@@ -24067,7 +25201,9 @@ class RemoteRelayManager {
|
|
|
24067
25201
|
});
|
|
24068
25202
|
const payload = await response.json();
|
|
24069
25203
|
if (!response.ok || !payload.data) {
|
|
24070
|
-
|
|
25204
|
+
const error = new Error(payload.error ?? "Failed to register relay machine");
|
|
25205
|
+
Object.assign(error, { status: response.status });
|
|
25206
|
+
throw error;
|
|
24071
25207
|
}
|
|
24072
25208
|
return payload.data;
|
|
24073
25209
|
}
|
|
@@ -24370,9 +25506,9 @@ class RemoteRelayManager {
|
|
|
24370
25506
|
|
|
24371
25507
|
// src/server/provider-session-index.ts
|
|
24372
25508
|
import { existsSync as existsSync11, readFileSync as readFileSync8, readdirSync as readdirSync9, statSync as statSync8 } from "fs";
|
|
24373
|
-
import { mkdir as
|
|
24374
|
-
import { homedir as
|
|
24375
|
-
import
|
|
25509
|
+
import { mkdir as mkdir11, readFile as readFile11, rename as rename3, writeFile as writeFile11 } from "fs/promises";
|
|
25510
|
+
import { homedir as homedir18 } from "os";
|
|
25511
|
+
import path28 from "path";
|
|
24376
25512
|
var PROVIDER_SESSION_INDEX_VERSION = 1;
|
|
24377
25513
|
var REFRESH_INTERVAL_MS = 60000;
|
|
24378
25514
|
var CODEX_SESSION_METADATA_PEEK_BYTES = 128 * 1024;
|
|
@@ -24393,7 +25529,7 @@ function collectFiles2(directory, extension) {
|
|
|
24393
25529
|
}
|
|
24394
25530
|
const files = [];
|
|
24395
25531
|
for (const entry of readdirSync9(directory, { withFileTypes: true })) {
|
|
24396
|
-
const fullPath =
|
|
25532
|
+
const fullPath = path28.join(directory, entry.name);
|
|
24397
25533
|
if (entry.isDirectory()) {
|
|
24398
25534
|
files.push(...collectFiles2(fullPath, extension));
|
|
24399
25535
|
continue;
|
|
@@ -24405,7 +25541,7 @@ function collectFiles2(directory, extension) {
|
|
|
24405
25541
|
return files;
|
|
24406
25542
|
}
|
|
24407
25543
|
function normalizePath(localPath) {
|
|
24408
|
-
return
|
|
25544
|
+
return path28.normalize(localPath);
|
|
24409
25545
|
}
|
|
24410
25546
|
function firstLine3(value, fallback) {
|
|
24411
25547
|
const line = value.split(`
|
|
@@ -24439,7 +25575,7 @@ function readClaudeSessionMetadata(sourcePath) {
|
|
|
24439
25575
|
if (!sessionToken && typeof record.sessionId === "string") {
|
|
24440
25576
|
sessionToken = record.sessionId;
|
|
24441
25577
|
}
|
|
24442
|
-
if (!localPath && typeof record.cwd === "string" &&
|
|
25578
|
+
if (!localPath && typeof record.cwd === "string" && path28.isAbsolute(record.cwd)) {
|
|
24443
25579
|
localPath = normalizePath(record.cwd);
|
|
24444
25580
|
}
|
|
24445
25581
|
if (typeof record.timestamp === "string") {
|
|
@@ -24527,7 +25663,7 @@ function readCodexSessionMetadata2(sourcePath) {
|
|
|
24527
25663
|
if (!sessionToken && typeof payloadRecord2.id === "string") {
|
|
24528
25664
|
sessionToken = payloadRecord2.id;
|
|
24529
25665
|
}
|
|
24530
|
-
if (!localPath && typeof payloadRecord2.cwd === "string" &&
|
|
25666
|
+
if (!localPath && typeof payloadRecord2.cwd === "string" && path28.isAbsolute(payloadRecord2.cwd)) {
|
|
24531
25667
|
localPath = normalizePath(payloadRecord2.cwd);
|
|
24532
25668
|
}
|
|
24533
25669
|
}
|
|
@@ -24578,7 +25714,7 @@ function readCursorSessionMetadata(sourcePath, localPath) {
|
|
|
24578
25714
|
const stats = statSync8(sourcePath);
|
|
24579
25715
|
const lines = readFileSync8(sourcePath, "utf8").split(`
|
|
24580
25716
|
`);
|
|
24581
|
-
const sessionToken =
|
|
25717
|
+
const sessionToken = path28.basename(sourcePath, ".jsonl");
|
|
24582
25718
|
let title = null;
|
|
24583
25719
|
for (const line of lines) {
|
|
24584
25720
|
if (!line.trim())
|
|
@@ -24637,8 +25773,8 @@ class ProviderSessionIndex {
|
|
|
24637
25773
|
sessionsByKey = new Map;
|
|
24638
25774
|
refreshTimer = null;
|
|
24639
25775
|
refreshInFlight = null;
|
|
24640
|
-
constructor(dataDir, homeDir =
|
|
24641
|
-
this.indexPath =
|
|
25776
|
+
constructor(dataDir, homeDir = homedir18()) {
|
|
25777
|
+
this.indexPath = path28.join(dataDir, "provider-session-index.json");
|
|
24642
25778
|
this.homeDir = homeDir;
|
|
24643
25779
|
}
|
|
24644
25780
|
async initialize() {
|
|
@@ -24685,7 +25821,7 @@ class ProviderSessionIndex {
|
|
|
24685
25821
|
visiblePaths.add(normalizePath(worktreePath));
|
|
24686
25822
|
}
|
|
24687
25823
|
}
|
|
24688
|
-
for (const sourcePath of collectFiles2(
|
|
25824
|
+
for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".claude", "projects"), ".jsonl")) {
|
|
24689
25825
|
const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readClaudeSessionMetadata(sourcePath);
|
|
24690
25826
|
if (!metadata || !visiblePaths.has(metadata.localPath))
|
|
24691
25827
|
continue;
|
|
@@ -24696,7 +25832,7 @@ class ProviderSessionIndex {
|
|
|
24696
25832
|
indexedPaths.add(sourcePath);
|
|
24697
25833
|
}
|
|
24698
25834
|
}
|
|
24699
|
-
for (const sourcePath of collectFiles2(
|
|
25835
|
+
for (const sourcePath of collectFiles2(path28.join(this.homeDir, ".codex", "sessions"), ".jsonl")) {
|
|
24700
25836
|
const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCodexSessionMetadata2(sourcePath);
|
|
24701
25837
|
if (!metadata || !visiblePaths.has(metadata.localPath))
|
|
24702
25838
|
continue;
|
|
@@ -24708,7 +25844,7 @@ class ProviderSessionIndex {
|
|
|
24708
25844
|
}
|
|
24709
25845
|
}
|
|
24710
25846
|
for (const localPath of visiblePaths) {
|
|
24711
|
-
const transcriptRoot =
|
|
25847
|
+
const transcriptRoot = path28.join(this.homeDir, ".cursor", "projects", encodeCursorProjectPath2(localPath), "agent-transcripts");
|
|
24712
25848
|
for (const sourcePath of collectFiles2(transcriptRoot, ".jsonl")) {
|
|
24713
25849
|
const metadata = reuseUnchangedMetadata(previousBySourcePath, sourcePath) ?? readCursorSessionMetadata(sourcePath, localPath);
|
|
24714
25850
|
if (!metadata)
|
|
@@ -24782,7 +25918,7 @@ class ProviderSessionIndex {
|
|
|
24782
25918
|
async loadPersistedIndex() {
|
|
24783
25919
|
if (!existsSync11(this.indexPath))
|
|
24784
25920
|
return;
|
|
24785
|
-
const raw = await
|
|
25921
|
+
const raw = await readFile11(this.indexPath, "utf8").catch(() => "");
|
|
24786
25922
|
if (!raw.trim())
|
|
24787
25923
|
return;
|
|
24788
25924
|
try {
|
|
@@ -24814,8 +25950,8 @@ class ProviderSessionIndex {
|
|
|
24814
25950
|
sessions: [...this.sessionsByKey.values()].sort(sessionSort)
|
|
24815
25951
|
};
|
|
24816
25952
|
const tempPath = `${this.indexPath}.tmp`;
|
|
24817
|
-
await
|
|
24818
|
-
await
|
|
25953
|
+
await mkdir11(path28.dirname(this.indexPath), { recursive: true });
|
|
25954
|
+
await writeFile11(tempPath, JSON.stringify(payload, null, 2), "utf8");
|
|
24819
25955
|
await rename3(tempPath, this.indexPath);
|
|
24820
25956
|
}
|
|
24821
25957
|
}
|
|
@@ -24855,10 +25991,13 @@ async function startKaizenServer(options = {}) {
|
|
|
24855
25991
|
let router = null;
|
|
24856
25992
|
const terminals = new TerminalManager;
|
|
24857
25993
|
const git = new GitManager;
|
|
25994
|
+
const diffs = new DiffStore(git);
|
|
24858
25995
|
const keybindings = new KeybindingsManager;
|
|
24859
25996
|
await keybindings.initialize();
|
|
24860
25997
|
const providerSettings = new ProviderSettingsManager;
|
|
24861
25998
|
await providerSettings.initialize();
|
|
25999
|
+
const generalSettings = new GeneralSettingsManager;
|
|
26000
|
+
await generalSettings.initialize();
|
|
24862
26001
|
const providerCatalogManager = new ProviderCatalogManager;
|
|
24863
26002
|
await providerCatalogManager.initialize();
|
|
24864
26003
|
const remoteAuth = new RemoteAuthManager;
|
|
@@ -24875,7 +26014,7 @@ async function startKaizenServer(options = {}) {
|
|
|
24875
26014
|
}) : null;
|
|
24876
26015
|
const agent = new AgentCoordinator({
|
|
24877
26016
|
store,
|
|
24878
|
-
attachmentsDir:
|
|
26017
|
+
attachmentsDir: path29.join(store.dataDir, "attachments"),
|
|
24879
26018
|
providerSettingsManager: providerSettings,
|
|
24880
26019
|
providerCatalogManager,
|
|
24881
26020
|
remoteAuthManager: remoteAuth,
|
|
@@ -24900,7 +26039,9 @@ async function startKaizenServer(options = {}) {
|
|
|
24900
26039
|
providerSessionIndex,
|
|
24901
26040
|
terminals,
|
|
24902
26041
|
git,
|
|
26042
|
+
diffs,
|
|
24903
26043
|
keybindings,
|
|
26044
|
+
generalSettings,
|
|
24904
26045
|
providerSettings,
|
|
24905
26046
|
providerCatalogManager,
|
|
24906
26047
|
remoteAuth,
|
|
@@ -24915,7 +26056,7 @@ async function startKaizenServer(options = {}) {
|
|
|
24915
26056
|
agent.setRealtime(router.realtime);
|
|
24916
26057
|
}
|
|
24917
26058
|
providerSessionIndex.start(() => store.listProjects());
|
|
24918
|
-
const distDir =
|
|
26059
|
+
const distDir = path29.join(import.meta.dir, "..", "..", "dist", "client");
|
|
24919
26060
|
const MAX_PORT_ATTEMPTS = 20;
|
|
24920
26061
|
let actualPort = port;
|
|
24921
26062
|
for (let attempt = 0;attempt < MAX_PORT_ATTEMPTS; attempt++) {
|
|
@@ -24966,7 +26107,7 @@ async function startKaizenServer(options = {}) {
|
|
|
24966
26107
|
});
|
|
24967
26108
|
}
|
|
24968
26109
|
if (url.pathname.startsWith(`${ATTACHMENTS_ROUTE_PREFIX}/`)) {
|
|
24969
|
-
return serveAttachment(
|
|
26110
|
+
return serveAttachment(path29.join(store.dataDir, "attachments"), url.pathname);
|
|
24970
26111
|
}
|
|
24971
26112
|
return serveStatic(distDir, req, url.pathname);
|
|
24972
26113
|
},
|
|
@@ -25027,6 +26168,7 @@ async function startKaizenServer(options = {}) {
|
|
|
25027
26168
|
providerSessionIndex.dispose();
|
|
25028
26169
|
keybindings.dispose();
|
|
25029
26170
|
providerSettings.dispose();
|
|
26171
|
+
generalSettings.dispose();
|
|
25030
26172
|
remoteAuth.dispose();
|
|
25031
26173
|
remoteRelay.dispose();
|
|
25032
26174
|
themeSettings.dispose();
|
|
@@ -25162,8 +26304,8 @@ async function serveCompressed(originalFilePath, request, cacheControl) {
|
|
|
25162
26304
|
}
|
|
25163
26305
|
async function serveStatic(distDir, request, pathname) {
|
|
25164
26306
|
const requestedPath = pathname === "/" ? "/index.html" : pathname;
|
|
25165
|
-
const filePath =
|
|
25166
|
-
const indexPath =
|
|
26307
|
+
const filePath = path29.join(distDir, requestedPath);
|
|
26308
|
+
const indexPath = path29.join(distDir, "index.html");
|
|
25167
26309
|
const cacheControl = getCacheControlHeader(requestedPath);
|
|
25168
26310
|
const file = Bun.file(filePath);
|
|
25169
26311
|
if (await file.exists()) {
|