@hienlh/ppm 0.20.9 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +114 -0
- package/CLAUDE.md +42 -1
- package/LICENSE +5 -0
- package/THIRD-PARTY-NOTICES.md +83 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/bun.lock +38 -7
- package/dist/web/assets/KaTeX_Size3-Regular-gV2CO0n9.woff2 +0 -0
- package/dist/web/assets/accounts-settings-section-BuxD9zH3.js +1 -0
- package/dist/web/assets/ai-resource-editor-F09pf8Hd.js +1 -0
- package/dist/web/assets/ai-settings-section-Dd9tOUp0.js +1 -0
- package/dist/web/assets/ai-settings-section-FrU2X8Fu.js +1 -0
- package/dist/web/assets/{angular-html-CTx8qAkv.js → angular-html-DkR4iCth.js} +1 -1
- package/dist/web/assets/{angular-ts-BhBGUAnu.js → angular-ts-DcyL4Chx.js} +1 -1
- package/dist/web/assets/api-client-BUCo1lms.js +1 -0
- package/dist/web/assets/{api-settings-CqiVKFUX.js → api-settings-BcNjZIvG.js} +1 -1
- package/dist/web/assets/{api-themes-DtLXqXpC.js → api-themes-DBfyVUtX.js} +1 -1
- package/dist/web/assets/{apl-Dec3pSzF.js → apl-BVlrVtjt.js} +1 -1
- package/dist/web/assets/appearance-settings-section-whgnq3ss.js +1 -0
- package/dist/web/assets/architecture-PBZL5I3N-5K0wEkAn.js +1 -0
- package/dist/web/assets/{astro-Cb_3-S86.js → astro-MjJlozLj.js} +1 -1
- package/dist/web/assets/audio-preview-Bc54GCAV.js +1 -0
- package/dist/web/assets/{blade-1QMj5JxI.js → blade-DnJWi1fz.js} +1 -1
- package/dist/web/assets/{bsl-D0bT3Wjp.js → bsl-DCmJxSIz.js} +1 -1
- package/dist/web/assets/{button-DhnNoqpV.js → button-VW4QGKCn.js} +1 -1
- package/dist/web/assets/{cairo-DTuGb2w7.js → cairo-C8dDenub.js} +1 -1
- package/dist/web/assets/chat-tab-Cr6_KSGO.js +15 -0
- package/dist/web/assets/{cobol-DSx_Nb7T.js → cobol-DPx_nifl.js} +1 -1
- package/dist/web/assets/code-editor-DfmlGamv.js +7 -0
- package/dist/web/assets/codex-daily-guard-CfybHv_c.js +1 -0
- package/dist/web/assets/{coffee-DBcQ7DKB.js → coffee-DvFzqhgN.js} +1 -1
- package/dist/web/assets/conflict-editor-DenQUOT2.js +19 -0
- package/dist/web/assets/context-menu-DOODKZdF.js +1 -0
- package/dist/web/assets/{cpp-Bj1azGr-.js → cpp-BLJN0umi.js} +1 -1
- package/dist/web/assets/{crystal-CCgkDI0i.js → crystal-BXR-9fGw.js} +1 -1
- package/dist/web/assets/csv-preview-CClrJOuR.js +2 -0
- package/dist/web/assets/{data-grid-overlay-editor-C2NAQ-88.js → data-grid-overlay-editor-D4fhcMfT.js} +1 -1
- package/dist/web/assets/database-viewer-DItjm8wB.js +1 -0
- package/dist/web/assets/dialog-DQTn55Mt.js +1 -0
- package/dist/web/assets/diff-viewer-BpNj7pN9.js +4 -0
- package/dist/web/assets/docx-preview-DYBkiUaE.js +12 -0
- package/dist/web/assets/{edge-ClBfeO7z.js → edge-rWOlCmXT.js} +1 -1
- package/dist/web/assets/{edit-diff-preview-CRjufuw_.js → edit-diff-preview-COtmo54G.js} +1 -1
- package/dist/web/assets/editor-font-BDrdiGf1.js +1 -0
- package/dist/web/assets/editor-language-service-DxkZ51E5.js +1 -0
- package/dist/web/assets/{elixir-ir__-3kt.js → elixir-E7Y82okW.js} +1 -1
- package/dist/web/assets/{elm-CUv-xMuU.js → elm-DTPGbc-w.js} +1 -1
- package/dist/web/assets/{erb-DcRwHyUq.js → erb-DHqLHrE6.js} +1 -1
- package/dist/web/assets/{erlang-DW-GAdmv.js → erlang-Byg0nNiV.js} +1 -1
- package/dist/web/assets/{esm-DBm5LSCw.js → esm-D_DmOM7n.js} +1 -1
- package/dist/web/assets/explorer-body-D-5z464e.js +2 -0
- package/dist/web/assets/explorer-window-content-7-1wuRul.js +1 -0
- package/dist/web/assets/extension-manager-section-BhwB6nqr.js +1 -0
- package/dist/web/assets/extension-webview-DI4VL2tJ.js +12 -0
- package/dist/web/assets/file-icons-EzPL0q-k.js +1 -0
- package/dist/web/assets/file-icons.generated-CfaJuvZu.css +1 -0
- package/dist/web/assets/file-store-DMABxOkV.js +1 -0
- package/dist/web/assets/files-settings-section-CZzABuKz.js +1 -0
- package/dist/web/assets/format-file-meta-DOpzJJhS.js +1 -0
- package/dist/web/assets/{fortran-fixed-form-DrQbMSkt.js → fortran-fixed-form-CY1n0Xf6.js} +1 -1
- package/dist/web/assets/{fsharp-DvDj84Ys.js → fsharp-_vEDSCJz.js} +1 -1
- package/dist/web/assets/{gdresource-CPgY7R2s.js → gdresource-B6XT0wAC.js} +1 -1
- package/dist/web/assets/geist-cyrillic-ext-wght-italic-BYAq_K0C.woff2 +0 -0
- package/dist/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/web/assets/geist-cyrillic-wght-italic-Da0gXVk3.woff2 +0 -0
- package/dist/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/web/assets/geist-latin-ext-wght-italic-XgKbg5n7.woff2 +0 -0
- package/dist/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/web/assets/geist-latin-wght-italic-dTnRTFFJ.woff2 +0 -0
- package/dist/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/web/assets/geist-vietnamese-wght-italic-0fly6zkB.woff2 +0 -0
- package/dist/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/web/assets/general-settings-section-BcxwiZ0X.js +1 -0
- package/dist/web/assets/{git-commit-NJ9iGbTd.js → git-commit-Wk9ovq59.js} +1 -1
- package/dist/web/assets/git-log-panel-CRN4JVOx.js +1 -0
- package/dist/web/assets/{git-rebase-DBSy9OKE.js → git-rebase-DSarGPvK.js} +1 -1
- package/dist/web/assets/git-repo-store-Dy69YCHN.js +1 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-DkVT2MAM.js +1 -0
- package/dist/web/assets/glide-data-grid-BvgAqSUr.js +141 -0
- package/dist/web/assets/{glimmer-js-EGWSSdwJ.js → glimmer-js-CkYI35_P.js} +1 -1
- package/dist/web/assets/{glimmer-ts-BpfXRYRV.js → glimmer-ts-BqmIZcds.js} +1 -1
- package/dist/web/assets/{glsl-BtWQ4j8X.js → glsl-Be-yBCF5.js} +1 -1
- package/dist/web/assets/{graphql-DHR5AO2c.js → graphql-a5DrENHY.js} +1 -1
- package/dist/web/assets/group-chat-tab-DFa5mAx5.js +1 -0
- package/dist/web/assets/{hack-A3iOItmC.js → hack-BLAg20aD.js} +1 -1
- package/dist/web/assets/{haml-DXA8NXfZ.js → haml-Dj6bGOQH.js} +1 -1
- package/dist/web/assets/{handlebars-BdIFK4pP.js → handlebars-dmEa36Oh.js} +1 -1
- package/dist/web/assets/{html-derivative-Cd_vDV4L.js → html-derivative-lLi3-RNT.js} +1 -1
- package/dist/web/assets/{html-BTA4eRkb.js → html-yacZYzSE.js} +1 -1
- package/dist/web/assets/{http-CMY5fp9k.js → http-1KaxcE4e.js} +1 -1
- package/dist/web/assets/{hurl-DJZLRi6K.js → hurl-ST-dEEZR.js} +1 -1
- package/dist/web/assets/{hxml-C2EdtM37.js → hxml-CpDtuq__.js} +1 -1
- package/dist/web/assets/icons-DQjqk0lJ.js +1 -0
- package/dist/web/assets/image-preview-CJVxL0uH.js +1 -0
- package/dist/web/assets/index-D7DbXD3G.css +1 -0
- package/dist/web/assets/index-ZtfxZOyb.js +52 -0
- package/dist/web/assets/info-3K5VOQVL-BBsmKGzA.js +1 -0
- package/dist/web/assets/input-D-dR8RI6.js +1 -0
- package/dist/web/assets/{jinja-DWU92jHm.js → jinja-Cjw-evAn.js} +1 -1
- package/dist/web/assets/{jira-watcher-section-BhQzWJ3r.js → jira-watcher-section-DIC1yIV3.js} +1 -1
- package/dist/web/assets/{jison-Bt3f5-S6.js → jison-DfATMYoY.js} +1 -1
- package/dist/web/assets/{julia-BS-e0jQg.js → julia-DDCaxiqT.js} +1 -1
- package/dist/web/assets/{just-OU89Ot3I.js → just-CJL529u6.js} +1 -1
- package/dist/web/assets/keybindings-store-tVfhPANS.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-BW03P3AF.js +1 -0
- package/dist/web/assets/{latex-Bt5mTs31.js → latex-Zc4EpLpW.js} +1 -1
- package/dist/web/assets/{liquid-C03IGCJ6.js → liquid-B_6KMNYS.js} +1 -1
- package/dist/web/assets/{lua-Dl4zPu0P.js → lua-BtS2idK7.js} +1 -1
- package/dist/web/assets/markdown-renderer-CvL1pWeK.js +3 -0
- package/dist/web/assets/markdown-renderer-sJNNVhlS.js +1 -0
- package/dist/web/assets/{marko-BEnkIoHY.js → marko-Wk6LBnck.js} +1 -1
- package/dist/web/assets/{mdc-DGglct19.js → mdc-cRaXBrzL.js} +1 -1
- package/dist/web/assets/{media-url-LiPp2UsV.js → media-url-DL8OCGGg.js} +1 -1
- package/dist/web/assets/{mobile-bottom-sheet-BizNfPAu.js → mobile-bottom-sheet-CoUauvLF.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-CZ0HZ2E_.js +1 -0
- package/dist/web/assets/monaco-dotenv-language-BDYnKcnr.js +1 -0
- package/dist/web/assets/monaspace-argon-latin-400-italic-DHf095HZ.woff2 +0 -0
- package/dist/web/assets/monaspace-argon-latin-400-italic-DZMiIHEH.woff +0 -0
- package/dist/web/assets/monaspace-argon-latin-400-normal-DZUN4ACH.woff +0 -0
- package/dist/web/assets/monaspace-argon-latin-400-normal-RS-2TGNg.woff2 +0 -0
- package/dist/web/assets/monaspace-argon-latin-700-normal-4y--rLW1.woff +0 -0
- package/dist/web/assets/monaspace-argon-latin-700-normal-D9kWRRK5.woff2 +0 -0
- package/dist/web/assets/monaspace-krypton-latin-400-italic-BoBCEexI.woff2 +0 -0
- package/dist/web/assets/monaspace-krypton-latin-400-italic-LWEicbvC.woff +0 -0
- package/dist/web/assets/monaspace-krypton-latin-400-normal-D9XlxC9R.woff +0 -0
- package/dist/web/assets/monaspace-krypton-latin-400-normal-DsuVXUab.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-codicons-DSvMY_FK.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-devicons-BBab8P54.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-font-awesome-BzNW1pRA.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-font-awesome-ext-D30e--UY.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-font-awesome-legacy-D_qekXx9.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-font-logos-gdu3INfy.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-iec-power-Cw6TNeDf.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-material-l-CXi9Ay.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-misc-BaVfdyeB.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-octicons-CJLTTzKm.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-pomicons-D7T3Ya3H.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-powerline-Cgg0sdGS.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-seti-DYiUFq6z.woff2 +0 -0
- package/dist/web/assets/nerd-symbols-weather-D4Jrp5XD.woff2 +0 -0
- package/dist/web/assets/{nextflow-DKFYidyC.js → nextflow-Bos2wvDV.js} +1 -1
- package/dist/web/assets/{nginx-Bhq0tzlh.js → nginx-DMlOwzdr.js} +1 -1
- package/dist/web/assets/{nim-CSuBzart.js → nim-D2dZQA88.js} +1 -1
- package/dist/web/assets/notification-store-BZbsPnW0.js +1 -0
- package/dist/web/assets/notifications-settings-section-DPUROMw-.js +1 -0
- package/dist/web/assets/{number-overlay-editor-CYHlP43e.js → number-overlay-editor-DZ2i_Bnb.js} +1 -1
- package/dist/web/assets/{overview-panel-xn2BYvn6.js → overview-panel-R146OIom.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-DwmYPOlx.js +1 -0
- package/dist/web/assets/panel-store-BVLBRn6M.js +1 -0
- package/dist/web/assets/pdf-preview-BWUPGLp6.js +1 -0
- package/dist/web/assets/{perl-uDVR7Ceh.js → perl-C5-Z6fPn.js} +1 -1
- package/dist/web/assets/{php-Bby8J3zk.js → php-BXNNhkMH.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-D0oogIFi.js +1 -0
- package/dist/web/assets/{postgres-viewer-CJbHLcGE.js → postgres-viewer-CjOvaruz.js} +3 -3
- package/dist/web/assets/ppmbot-settings-section-DrvWh8l8.js +1 -0
- package/dist/web/assets/problems-panel-B7BWVhdy.js +1 -0
- package/dist/web/assets/process-table-BRMS1MrX.js +1 -0
- package/dist/web/assets/{project-store-Dy3A3LJT.js → project-store-BhMbVln3.js} +1 -1
- package/dist/web/assets/proxy-settings-section-Bv0Ny-Yy.js +1 -0
- package/dist/web/assets/{pug-EapfojTW.js → pug-C1zf1yWy.js} +1 -1
- package/dist/web/assets/{qml-DiR6J5_C.js → qml-OW58jGpD.js} +1 -1
- package/dist/web/assets/query-audit-section-BcHJZcVC.js +1 -0
- package/dist/web/assets/radar-KQ55EAFF-CQIJOQGa.js +1 -0
- package/dist/web/assets/{razor-B2QvlGNY.js → razor-DzjSaobM.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-ByjaeZKX.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-view-D13mtr9F.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BTzss2wX.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-CbqTCaC6.js +1 -0
- package/dist/web/assets/{rst-D2eJ0kH4.js → rst-RfuihOUW.js} +1 -1
- package/dist/web/assets/{ruby-DzpnBpz-.js → ruby-CNO3pli1.js} +1 -1
- package/dist/web/assets/{run-in-terminal-DisO5HC-.js → run-in-terminal-Cb_hVU8x.js} +1 -1
- package/dist/web/assets/{sas-WDAKsX0U.js → sas-DZY5BtXx.js} +1 -1
- package/dist/web/assets/schedules-settings-section-DO8xAOVj.js +1 -0
- package/dist/web/assets/scroll-area-LtNV8g5o.js +1 -0
- package/dist/web/assets/{scss-Ci6PdscL.js → scss--4g-REcN.js} +1 -1
- package/dist/web/assets/{send-to-chat-DDFdKWNf.js → send-to-chat-Cnpru1M0.js} +1 -1
- package/dist/web/assets/{separator-CyisF27O.js → separator-Cds1yxy8.js} +1 -1
- package/dist/web/assets/settings-body-Rnu-FcX-.js +2 -0
- package/dist/web/assets/settings-store-DZPgPtEA.js +2 -0
- package/dist/web/assets/settings-tab-C6PHxs0Z.js +1 -0
- package/dist/web/assets/settings-window-content-CQ4gT2qj.js +1 -0
- package/dist/web/assets/{shaderlab-Cv3mWofL.js → shaderlab-Cu4sBiVn.js} +1 -1
- package/dist/web/assets/{shellsession-D1KVtQa1.js → shellsession-DWzJfEv7.js} +1 -1
- package/dist/web/assets/{soy-BGLBwFZT.js → soy-BnqE-5Ff.js} +1 -1
- package/dist/web/assets/{sparql-TvnQmFDh.js → sparql-Ctg__NhZ.js} +1 -1
- package/dist/web/assets/{sql-query-editor-DaQqRBNA.js → sql-query-editor-D9k19T_M.js} +1 -1
- package/dist/web/assets/sqlite-viewer-DoV9hnWJ.js +1 -0
- package/dist/web/assets/{stata-Gi-BKyEv.js → stata-Qk2h66XW.js} +1 -1
- package/dist/web/assets/{streaming-store-DAbnOfLu.js → streaming-store-uDu3PoN1.js} +1 -1
- package/dist/web/assets/{surrealql-BVXs6tkz.js → surrealql-8QEX7EfH.js} +1 -1
- package/dist/web/assets/{svelte-BlnFpLWV.js → svelte-D_mubC5-.js} +1 -1
- package/dist/web/assets/system-monitor-body-2vQ1kMxE.js +2 -0
- package/dist/web/assets/system-monitor-tab-krAcvwF7.js +1 -0
- package/dist/web/assets/system-monitor-window-content-qXLcicFM.js +1 -0
- package/dist/web/assets/tab-host-window-content-7fPZNEni.js +1 -0
- package/dist/web/assets/{tab-store-B7BksLr-.js → tab-store-DGJGnbwv.js} +1 -1
- package/dist/web/assets/team-member-sheet-2FnRmk1a.js +2 -0
- package/dist/web/assets/team-member-window-content-BgvJFypM.js +1 -0
- package/dist/web/assets/{templ-YJYH5r1A.js → templ-C1jV0fsO.js} +1 -1
- package/dist/web/assets/terminal-tab-Cs0sGljx.js +3 -0
- package/dist/web/assets/{tex-IVZLDIeh.js → tex-D_StFXy_.js} +1 -1
- package/dist/web/assets/tool-cards-DU_S2o51.js +9 -0
- package/dist/web/assets/treemap-KZPCXAKY-BhEtjljr.js +1 -0
- package/dist/web/assets/{ts-tags-DBd321I-.js → ts-tags-B5m47rEm.js} +1 -1
- package/dist/web/assets/{twig-DQENQjEn.js → twig-C_br6GIl.js} +1 -1
- package/dist/web/assets/{use-blob-url-CGChX4vi.js → use-blob-url-C-SGi_Hb.js} +1 -1
- package/dist/web/assets/use-inline-blame-B4trxGcR.js +16 -0
- package/dist/web/assets/use-lsp-CV0vzILO.js +6 -0
- package/dist/web/assets/use-monaco-theme-DBqbWjWX.js +1 -0
- package/dist/web/assets/{use-open-team-member-kmNnlzDD.js → use-open-team-member-DENsjp0s.js} +1 -1
- package/dist/web/assets/use-remote-desktop-display-choice-BK_f787P.js +1 -0
- package/dist/web/assets/{use-websocket-D8OGBwH8.js → use-websocket-LgXiX1qN.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-BoRFiriK.js → vendor-mermaid-Cbig5zA6.js} +1 -1
- package/dist/web/assets/video-preview-BDNwumbW.js +1 -0
- package/dist/web/assets/{vue-Do2JXEwi.js → vue-DQwCnLdr.js} +1 -1
- package/dist/web/assets/{vue-html-Bse0CwSC.js → vue-html-T_EoGpPJ.js} +1 -1
- package/dist/web/assets/{vue-vine-C8JSXu5Z.js → vue-vine-DmxLqX50.js} +1 -1
- package/dist/web/assets/{window-pip-registry-C2dcY0pE.js → window-pip-registry-3l4hoxuD.js} +1 -1
- package/dist/web/assets/{window-store-2z4t5YAt.js → window-store-UC1jJeLM.js} +1 -1
- package/dist/web/assets/ws-auth-DEAJiGCR.js +1 -0
- package/dist/web/assets/{xml-OX6YmzGK.js → xml-Bs6Bw8is.js} +1 -1
- package/dist/web/assets/{xsl-RQUQgcgy.js → xsl-f5ZNhRCc.js} +1 -1
- package/dist/web/index.html +105 -71
- package/dist/web/sw.js +1 -1
- package/docs/project-roadmap.md +2 -0
- package/licenses/Apache-2.0.txt +73 -0
- package/licenses/CC-BY-4.0.txt +156 -0
- package/licenses/MIT.txt +18 -0
- package/licenses/OFL-1.1.txt +43 -0
- package/licenses/Unlicense.txt +10 -0
- package/package.json +14 -7
- package/packages/ext-git-graph/src/blame-view.ts +4 -5
- package/packages/ext-git-graph/src/commit-detail-escaping.test.ts +205 -0
- package/packages/ext-git-graph/src/commit-detail-file-cap.test.ts +65 -0
- package/packages/ext-git-graph/src/commit-message-html.test.ts +214 -0
- package/packages/ext-git-graph/src/commit-message-html.ts +190 -0
- package/packages/ext-git-graph/src/commit-request-generation.test.ts +57 -0
- package/packages/ext-git-graph/src/compare-view.ts +4 -5
- package/packages/ext-git-graph/src/extension.ts +148 -36
- package/packages/ext-git-graph/src/file-history-view.ts +4 -5
- package/packages/ext-git-graph/src/log-args.test.ts +57 -0
- package/packages/ext-git-graph/src/ppm-api.ts +39 -6
- package/packages/ext-git-graph/src/project-scope.test.ts +77 -0
- package/packages/ext-git-graph/src/project-scope.ts +69 -0
- package/packages/ext-git-graph/src/shortstat-parser.test.ts +53 -0
- package/packages/ext-git-graph/src/shortstat-parser.ts +45 -0
- package/packages/ext-git-graph/src/types.ts +2 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +407 -0
- package/packages/ext-git-graph/src/webview-html.ts +631 -108
- package/packages/ext-git-graph/src/webview-shell.test.ts +63 -0
- package/packages/ext-git-graph/src/webview-shell.ts +48 -7
- package/scripts/copy-monaco.ts +63 -0
- package/scripts/gen-file-icons.ts +485 -0
- package/scripts/gen-nerd-font.ts +311 -0
- package/scripts/gen-product-icons.ts +442 -0
- package/scripts/monaco-staging.ts +32 -0
- package/scripts/precompress-web.ts +77 -0
- package/scripts/third-party-notices.ts +160 -0
- package/scripts/vite-monaco-dev-assets.ts +63 -0
- package/src/providers/claude-agent-sdk.ts +32 -2
- package/src/server/index.ts +17 -0
- package/src/server/routes/chat.ts +16 -6
- package/src/server/routes/git.ts +113 -1
- package/src/server/routes/lsp.ts +58 -0
- package/src/server/routes/project-scoped.ts +2 -0
- package/src/server/routes/static-encoding.ts +73 -0
- package/src/server/routes/static-fallback.ts +51 -0
- package/src/server/routes/static.ts +41 -5
- package/src/server/ws/lsp.ts +433 -0
- package/src/services/chat-search.service.ts +211 -26
- package/src/services/fs-ops/fs-real-path.ts +23 -0
- package/src/services/git-blame/commit-line-diff.ts +124 -0
- package/src/services/git-blame/git-blame.service.ts +96 -1
- package/src/services/git-repos/git-repo-discovery.ts +152 -0
- package/src/services/lsp/lsp-capabilities.ts +160 -0
- package/src/services/lsp/lsp-manager.ts +442 -0
- package/src/services/lsp/lsp-protocol.ts +170 -0
- package/src/services/lsp/lsp-session.ts +466 -0
- package/src/services/lsp/server-registry.ts +401 -0
- package/src/services/search-index-db.service.ts +10 -2
- package/src/shared/blame.ts +51 -0
- package/src/shared/lsp-uri.ts +108 -0
- package/src/web/app.tsx +6 -0
- package/src/web/components/ai-resources/ai-resource-editor.tsx +1 -1
- package/src/web/components/ai-resources/ai-resources-panel.tsx +1 -1
- package/src/web/components/ai-resources/mcp-group.tsx +1 -1
- package/src/web/components/ai-resources/new-resource-menu.tsx +1 -1
- package/src/web/components/ai-resources/resource-visuals.tsx +1 -1
- package/src/web/components/auth/login-screen.tsx +1 -1
- package/src/web/components/auth/support-dialog.tsx +1 -1
- package/src/web/components/chat/attachment-chips.tsx +113 -5
- package/src/web/components/chat/background-command-bar.tsx +1 -1
- package/src/web/components/chat/background-output-panel.tsx +1 -1
- package/src/web/components/chat/change-edit-list.tsx +1 -1
- package/src/web/components/chat/change-file-row.tsx +1 -1
- package/src/web/components/chat/chat-history-bar.tsx +2 -2
- package/src/web/components/chat/chat-history-panel.tsx +1 -1
- package/src/web/components/chat/chat-placeholder.tsx +1 -1
- package/src/web/components/chat/chat-scroll-nav.tsx +1 -1
- package/src/web/components/chat/chat-tab.tsx +1 -1
- package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +1 -1
- package/src/web/components/chat/chat-welcome.tsx +1 -1
- package/src/web/components/chat/codex-usage-panel.tsx +1 -1
- package/src/web/components/chat/file-picker.tsx +1 -1
- package/src/web/components/chat/image-preview-states.tsx +1 -1
- package/src/web/components/chat/message-action-bar.tsx +1 -1
- package/src/web/components/chat/message-input.tsx +1 -1
- package/src/web/components/chat/message-list.tsx +1 -1
- package/src/web/components/chat/mode-selector.tsx +1 -1
- package/src/web/components/chat/model-selector.tsx +1 -1
- package/src/web/components/chat/model-thinking-selector.tsx +1 -1
- package/src/web/components/chat/pre-compact-button.tsx +1 -1
- package/src/web/components/chat/provider-selector.tsx +1 -1
- package/src/web/components/chat/send-message-card.tsx +1 -1
- package/src/web/components/chat/session-context-menu.tsx +1 -1
- package/src/web/components/chat/session-debug-dialog.tsx +1 -1
- package/src/web/components/chat/session-history-list.tsx +1 -1
- package/src/web/components/chat/session-list-panel.tsx +1 -1
- package/src/web/components/chat/session-picker.tsx +1 -1
- package/src/web/components/chat/slash-command-picker.tsx +1 -1
- package/src/web/components/chat/task-tracker.tsx +1 -1
- package/src/web/components/chat/team-activity-panel.tsx +1 -1
- package/src/web/components/chat/team-member-activity-row.tsx +1 -1
- package/src/web/components/chat/team-member-list.tsx +1 -1
- package/src/web/components/chat/team-member-sheet.tsx +1 -1
- package/src/web/components/chat/team-member-window-content.tsx +1 -1
- package/src/web/components/chat/team-working-bar.tsx +1 -1
- package/src/web/components/chat/tool-cards.tsx +2 -2
- package/src/web/components/chat/turn-change-sheet.tsx +1 -1
- package/src/web/components/chat/turn-change-tray.tsx +1 -1
- package/src/web/components/chat/turn-cost-warning.tsx +1 -1
- package/src/web/components/chat/usage-badge.tsx +1 -1
- package/src/web/components/chat/usage-panel-shell.tsx +1 -1
- package/src/web/components/chat/version-switcher.tsx +1 -1
- package/src/web/components/database/connection-import-export.tsx +1 -1
- package/src/web/components/database/connection-list.tsx +1 -1
- package/src/web/components/database/connection-row.tsx +1 -1
- package/src/web/components/database/database-sidebar.tsx +1 -1
- package/src/web/components/database/database-viewer.tsx +1 -1
- package/src/web/components/database/export-button.tsx +1 -1
- package/src/web/components/database/glide-context-menu.tsx +1 -1
- package/src/web/components/database/glide-data-grid.tsx +1 -1
- package/src/web/components/database/glide-data-preview-panel.tsx +2 -2
- package/src/web/components/database/glide-grid-pagination.tsx +1 -1
- package/src/web/components/database/glide-grid-toolbar.tsx +1 -1
- package/src/web/components/database/glide-header-menu.tsx +1 -1
- package/src/web/components/database/glide-save-bar.tsx +1 -1
- package/src/web/components/database/schema-table-tree.tsx +1 -1
- package/src/web/components/editor/audio-preview.tsx +1 -1
- package/src/web/components/editor/code-editor.tsx +167 -21
- package/src/web/components/editor/compare-picker.tsx +1 -1
- package/src/web/components/editor/conflict-editor.tsx +15 -6
- package/src/web/components/editor/csv-preview.tsx +1 -1
- package/src/web/components/editor/diff-viewer.tsx +59 -37
- package/src/web/components/editor/docx-preview.tsx +1 -1
- package/src/web/components/editor/editor-breadcrumb-external.tsx +1 -1
- package/src/web/components/editor/editor-breadcrumb.tsx +1 -1
- package/src/web/components/editor/editor-language-picker.tsx +3 -1
- package/src/web/components/editor/editor-language-service.tsx +77 -0
- package/src/web/components/editor/editor-mobile-toolbar.tsx +13 -2
- package/src/web/components/editor/editor-placeholder.tsx +1 -1
- package/src/web/components/editor/editor-toolbar.tsx +1 -1
- package/src/web/components/editor/image-preview.tsx +1 -1
- package/src/web/components/editor/lsp-status.tsx +241 -0
- package/src/web/components/editor/pdf-preview.tsx +1 -1
- package/src/web/components/editor/video-player/video-player-controls.tsx +1 -1
- package/src/web/components/editor/video-player/video-player.tsx +1 -1
- package/src/web/components/editor/video-player/video-settings-menu.tsx +1 -1
- package/src/web/components/editor/video-preview.tsx +1 -1
- package/src/web/components/explorer/file-tree.tsx +1 -1
- package/src/web/components/explorer/inline-tree-input.tsx +1 -1
- package/src/web/components/explorer/search-panel.tsx +3 -2
- package/src/web/components/explorer/tree-node-context-menu.tsx +1 -1
- package/src/web/components/explorer/tree-node.tsx +5 -12
- package/src/web/components/extensions/extension-quickpick.tsx +1 -1
- package/src/web/components/extensions/extension-tree-view.tsx +1 -1
- package/src/web/components/extensions/extension-webview.tsx +53 -20
- package/src/web/components/extensions/webview-theme.ts +121 -0
- package/src/web/components/floating-window/pip/pip-caption-button.tsx +1 -1
- package/src/web/components/git/create-worktree-dialog.tsx +5 -3
- package/src/web/components/git/git-log-panel.tsx +4 -2
- package/src/web/components/git/git-placeholder.tsx +1 -1
- package/src/web/components/git/git-ref-badge.tsx +1 -1
- package/src/web/components/git/git-repo-picker.tsx +145 -0
- package/src/web/components/git/git-status-panel.tsx +231 -250
- package/src/web/components/git/git-worktree-panel.tsx +6 -4
- package/src/web/components/git/hunk-stage-dialog.tsx +5 -3
- package/src/web/components/group-chat/group-chat-tab.tsx +1 -1
- package/src/web/components/group-chat/group-create-dialog.tsx +1 -1
- package/src/web/components/group-chat/group-full-transcript-view.tsx +1 -1
- package/src/web/components/group-chat/group-list.tsx +1 -1
- package/src/web/components/group-chat/group-member-edit-dialog.tsx +1 -1
- package/src/web/components/group-chat/group-member-roster.tsx +1 -1
- package/src/web/components/group-chat/group-message-item.tsx +1 -1
- package/src/web/components/group-chat/group-transcript-messages.tsx +1 -1
- package/src/web/components/jira/jira-config-form.tsx +1 -1
- package/src/web/components/jira/jira-filter-builder.tsx +1 -1
- package/src/web/components/jira/jira-panel.tsx +1 -1
- package/src/web/components/jira/jira-results-panel.tsx +1 -1
- package/src/web/components/jira/jira-ticket-card.tsx +1 -1
- package/src/web/components/jira/jira-ticket-detail.tsx +1 -1
- package/src/web/components/jira/jira-watcher-form.tsx +1 -1
- package/src/web/components/jira/jira-watcher-list.tsx +1 -1
- package/src/web/components/layout/add-project-form.tsx +1 -1
- package/src/web/components/layout/cloud-alias-row.tsx +1 -1
- package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +1 -1
- package/src/web/components/layout/cloud-share-popover.tsx +1 -1
- package/src/web/components/layout/command-palette-filter-chips.tsx +1 -1
- package/src/web/components/layout/command-palette.tsx +46 -8
- package/src/web/components/layout/dock-header.tsx +4 -4
- package/src/web/components/layout/dock-panel.tsx +3 -3
- package/src/web/components/layout/draggable-tab.tsx +20 -3
- package/src/web/components/layout/editor-panel.tsx +1 -1
- package/src/web/components/layout/mobile-drawer-tab-bar.tsx +10 -1
- package/src/web/components/layout/mobile-drawer.tsx +1 -1
- package/src/web/components/layout/mobile-nav.tsx +3 -3
- package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +13 -4
- package/src/web/components/layout/nav-section-rail.tsx +1 -1
- package/src/web/components/layout/notification-bell-popover.tsx +1 -1
- package/src/web/components/layout/panel-layout.tsx +1 -1
- package/src/web/components/layout/project-bottom-sheet.tsx +4 -1
- package/src/web/components/layout/project-sort.ts +1 -1
- package/src/web/components/layout/project-switcher.tsx +1 -1
- package/src/web/components/layout/reparenting-tab.tsx +1 -1
- package/src/web/components/layout/sidebar.tsx +1 -1
- package/src/web/components/layout/status-bar.tsx +4 -1
- package/src/web/components/layout/tab-bar.tsx +9 -23
- package/src/web/components/layout/tab-content.tsx +6 -1
- package/src/web/components/layout/tab-pool.tsx +1 -0
- package/src/web/components/layout/tab-pop-out-menu-item.tsx +1 -1
- package/src/web/components/layout/upgrade-button.tsx +1 -1
- package/src/web/components/layout/wake-lock-indicator.tsx +1 -1
- package/src/web/components/os-explorer/explorer-body.tsx +1 -1
- package/src/web/components/os-explorer/explorer-breadcrumb.tsx +1 -1
- package/src/web/components/os-explorer/explorer-sidebar.tsx +1 -1
- package/src/web/components/os-explorer/explorer-sort-menu.tsx +1 -1
- package/src/web/components/os-explorer/explorer-toolbar.tsx +1 -1
- package/src/web/components/os-explorer/icons/file-type-icon-map.ts +10 -94
- package/src/web/components/os-explorer/icons/file-type-icon.tsx +17 -13
- package/src/web/components/os-explorer/mobile/mobile-bottom-toolbar.tsx +1 -1
- package/src/web/components/os-explorer/mobile/mobile-explorer-top-bar.tsx +1 -1
- package/src/web/components/os-explorer/mobile/mobile-more-sheet.tsx +1 -1
- package/src/web/components/os-explorer/mobile/mobile-places-sheet.tsx +1 -1
- package/src/web/components/os-explorer/mobile/mobile-places-strip.tsx +1 -1
- package/src/web/components/os-explorer/properties-dialog.tsx +1 -1
- package/src/web/components/os-explorer/skins/macos-window-chrome.tsx +1 -1
- package/src/web/components/os-explorer/skins/windows-window-chrome.tsx +1 -1
- package/src/web/components/os-explorer/upload/upload-batch-card.tsx +1 -1
- package/src/web/components/os-explorer/upload/upload-batch-row.tsx +1 -1
- package/src/web/components/os-explorer/use-coarse-long-press.ts +8 -0
- package/src/web/components/os-explorer/views/column-view-mobile.tsx +1 -1
- package/src/web/components/os-explorer/views/icons-view-tile.tsx +1 -1
- package/src/web/components/os-explorer/views/list-row.tsx +1 -1
- package/src/web/components/os-explorer/views/list-view.tsx +1 -1
- package/src/web/components/postgres/postgres-viewer.tsx +1 -1
- package/src/web/components/problems/problems-panel.tsx +230 -0
- package/src/web/components/problems/problems-status.tsx +53 -0
- package/src/web/components/projects/dir-suggest.tsx +1 -1
- package/src/web/components/projects/project-list.tsx +1 -1
- package/src/web/components/remote-desktop/remote-desktop-mobile-toolbar.tsx +1 -1
- package/src/web/components/remote-desktop/remote-desktop-mobile-view.tsx +1 -1
- package/src/web/components/remote-desktop/remote-desktop-readiness-gate.tsx +1 -1
- package/src/web/components/remote-desktop/remote-desktop-warning-gate.tsx +1 -1
- package/src/web/components/remote-desktop/remote-desktop-window-content.tsx +1 -1
- package/src/web/components/root-error-boundary.tsx +116 -0
- package/src/web/components/settings/accounts/account-add-dialog.tsx +1 -1
- package/src/web/components/settings/accounts/account-card.tsx +1 -1
- package/src/web/components/settings/accounts/account-export-dialog.tsx +1 -1
- package/src/web/components/settings/accounts/account-export-simulation.tsx +1 -1
- package/src/web/components/settings/accounts/account-import-dialog.tsx +1 -1
- package/src/web/components/settings/accounts/account-profile-panel.tsx +1 -1
- package/src/web/components/settings/accounts/account-rotation-settings.tsx +1 -1
- package/src/web/components/settings/accounts/account-token-test-dialog.tsx +1 -1
- package/src/web/components/settings/accounts/account-usage-pattern-chart.tsx +1 -1
- package/src/web/components/settings/accounts/accounts-pane-header.tsx +1 -1
- package/src/web/components/settings/accounts/accounts-settings-section.tsx +1 -1
- package/src/web/components/settings/accounts/claude-accounts-section.tsx +9 -1
- package/src/web/components/settings/accounts/codex-accounts-section.tsx +10 -1
- package/src/web/components/settings/accounts/codex-add-account-dialog.tsx +1 -1
- package/src/web/components/settings/accounts/codex-backup-dialog.tsx +1 -1
- package/src/web/components/settings/ai-settings-section.tsx +1 -1
- package/src/web/components/settings/appearance-settings-section.tsx +56 -1
- package/src/web/components/settings/change-password-section.tsx +1 -1
- package/src/web/components/settings/extension-manager-section.tsx +1 -1
- package/src/web/components/settings/general-settings-section.tsx +1 -1
- package/src/web/components/settings/glob-list-editor.tsx +1 -1
- package/src/web/components/settings/keyboard-shortcuts-section.tsx +1 -1
- package/src/web/components/settings/mcp-server-dialog.tsx +1 -1
- package/src/web/components/settings/notifications-settings-section.tsx +1 -1
- package/src/web/components/settings/ppmbot-settings-section.tsx +1 -1
- package/src/web/components/settings/proxy-settings-section.tsx +1 -1
- package/src/web/components/settings/proxy-test-section.tsx +1 -1
- package/src/web/components/settings/query-audit-section.tsx +1 -1
- package/src/web/components/settings/schedules/schedule-row.tsx +1 -1
- package/src/web/components/settings/schedules/schedules-settings-section.tsx +1 -1
- package/src/web/components/settings/settings-body.tsx +1 -1
- package/src/web/components/settings/settings-categories.ts +14 -3
- package/src/web/components/settings/settings-category-list.tsx +1 -1
- package/src/web/components/settings/settings-section-content.tsx +1 -1
- package/src/web/components/settings/tag-settings-section.tsx +1 -1
- package/src/web/components/settings/theme-grid.tsx +1 -1
- package/src/web/components/settings/theme-manager-section.tsx +1 -1
- package/src/web/components/settings/theme-picker.tsx +1 -1
- package/src/web/components/shared/bug-report-popup.tsx +1 -1
- package/src/web/components/shared/connection-lost-overlay.tsx +1 -1
- package/src/web/components/shared/diagram-overlay.tsx +1 -1
- package/src/web/components/shared/image-overlay.tsx +1 -1
- package/src/web/components/shared/theme-mode-menu.tsx +1 -1
- package/src/web/components/sqlite/sqlite-data-grid.tsx +1 -1
- package/src/web/components/sqlite/sqlite-table-list.tsx +1 -1
- package/src/web/components/sqlite/sqlite-viewer.tsx +1 -1
- package/src/web/components/system/process-group-row.tsx +1 -1
- package/src/web/components/system/process-row.tsx +1 -1
- package/src/web/components/system/process-table-toolbar.tsx +1 -1
- package/src/web/components/system/resource-status-bar.tsx +1 -1
- package/src/web/components/system/sortable-header.tsx +1 -1
- package/src/web/components/system/system-monitor-body.tsx +1 -1
- package/src/web/components/terminal/terminal-finish-login.tsx +1 -1
- package/src/web/components/terminal/terminal-links-sheet.tsx +1 -1
- package/src/web/components/terminal/terminal-mobile-toolbar.tsx +1 -1
- package/src/web/components/terminal/terminal-placeholder.tsx +1 -1
- package/src/web/components/terminal/terminal-tab.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +1 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-login-step.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +9 -3
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-step-reducer.ts +14 -2
- package/src/web/components/tunnels/tunnel-manager-tab.tsx +1 -1
- package/src/web/components/ui/accordion.tsx +1 -1
- package/src/web/components/ui/adaptive-context-menu.tsx +9 -2
- package/src/web/components/ui/browse-button.tsx +1 -1
- package/src/web/components/ui/context-menu.tsx +1 -1
- package/src/web/components/ui/dialog.tsx +1 -1
- package/src/web/components/ui/dropdown-menu.tsx +1 -1
- package/src/web/components/ui/file-browser-picker.tsx +4 -6
- package/src/web/components/ui/select.tsx +1 -1
- package/src/web/components/ui/sidebar-header.tsx +1 -1
- package/src/web/components/ui/sonner.tsx +1 -1
- package/src/web/hooks/use-git-repo.ts +124 -0
- package/src/web/hooks/use-global-keybindings.ts +11 -6
- package/src/web/hooks/use-inline-blame.ts +161 -11
- package/src/web/hooks/use-is-touch-only.ts +46 -0
- package/src/web/hooks/use-lsp.ts +182 -0
- package/src/web/hooks/use-terminal.ts +60 -2
- package/src/web/hooks/use-touch-tab-drag.ts +18 -2
- package/src/web/hooks/use-url-sync.ts +15 -1
- package/src/web/index.html +74 -0
- package/src/web/lib/blame-hover-commands.ts +82 -0
- package/src/web/lib/blame-hover.ts +199 -0
- package/src/web/lib/chunk-recovery.ts +113 -0
- package/src/web/lib/editor-font.ts +70 -0
- package/src/web/lib/ext-command-dispatch.ts +24 -0
- package/src/web/lib/file-icons.generated.ts +408 -0
- package/src/web/lib/file-icons.tsx +192 -0
- package/src/web/lib/fluent-icon.tsx +62 -0
- package/src/web/lib/git-file-tree.ts +83 -0
- package/src/web/lib/git-repo-scope.ts +157 -0
- package/src/web/lib/icons.generated.tsx +428 -0
- package/src/web/lib/icons.ts +17 -0
- package/src/web/lib/lsp/lsp-client.ts +321 -0
- package/src/web/lib/lsp/lsp-documents.ts +39 -0
- package/src/web/lib/lsp/lsp-monaco.ts +214 -0
- package/src/web/lib/lsp/lsp-navigation.ts +129 -0
- package/src/web/lib/lsp/lsp-responses.ts +244 -0
- package/src/web/lib/lsp/lsp-semantic-tokens.ts +180 -0
- package/src/web/lib/lsp/lsp-shadow-models.ts +254 -0
- package/src/web/lib/lsp/monaco-builtin-typescript.ts +149 -0
- package/src/web/lib/lsp/register-providers.ts +458 -0
- package/src/web/lib/monaco-diff-language.ts +62 -0
- package/src/web/lib/monaco-dotenv-language.ts +134 -0
- package/src/web/lib/sidebar-tabs/tab-registry.ts +11 -2
- package/src/web/lib/tab-type-icons.ts +32 -4
- package/src/web/main.tsx +30 -1
- package/src/web/stores/git-repo-store.ts +117 -0
- package/src/web/stores/git-status-store.ts +10 -7
- package/src/web/stores/keybindings-store.ts +1 -0
- package/src/web/stores/panel-utils.ts +5 -2
- package/src/web/stores/problems-store.ts +116 -0
- package/src/web/stores/settings-store.ts +40 -0
- package/src/web/stores/tab-store.ts +2 -1
- package/src/web/stores/window-panel-persistence.ts +1 -0
- package/src/web/styles/file-icons.generated.css +1007 -0
- package/src/web/styles/fonts/nerd-symbols-codicons.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-devicons.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-font-awesome-ext.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-font-awesome-legacy.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-font-awesome.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-font-logos.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-iec-power.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-material.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-misc.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-octicons.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-pomicons.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-powerline.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-seti.woff2 +0 -0
- package/src/web/styles/fonts/nerd-symbols-weather.woff2 +0 -0
- package/src/web/styles/globals.css +30 -3
- package/src/web/styles/nerd-font.generated.css +153 -0
- package/src/web/sw.ts +69 -2
- package/src/web/theme/adapters/monaco-adapter.ts +20 -1
- package/src/web/theme/diff-token-rules.ts +34 -0
- package/src/web/theme/semantic-token-rules.ts +103 -0
- package/src/web/theme/theme-mode-options.ts +1 -1
- package/vite.config.ts +24 -7
- package/dist/web/assets/accounts-settings-section-ByM99C7p.js +0 -1
- package/dist/web/assets/ai-resource-editor-BsB9wa0z.js +0 -1
- package/dist/web/assets/ai-settings-section-BT-QVUBa.js +0 -1
- package/dist/web/assets/ai-settings-section-BUPOINaw.js +0 -1
- package/dist/web/assets/api-client-C6VTn7cG.js +0 -1
- package/dist/web/assets/appearance-settings-section-DJEoECoJ.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-D55g5j-p.js +0 -1
- package/dist/web/assets/arrow-left-DpXaakMC.js +0 -1
- package/dist/web/assets/arrow-right-BqNSIscF.js +0 -1
- package/dist/web/assets/audio-preview-CF4tTFv_.js +0 -1
- package/dist/web/assets/bot-D3-n2i31.js +0 -1
- package/dist/web/assets/brain-CuAQMSBE.js +0 -1
- package/dist/web/assets/calendar-clock-CDP7AVjA.js +0 -1
- package/dist/web/assets/chat-tab-fD2vWwj2.js +0 -15
- package/dist/web/assets/check-BQKbhtoA.js +0 -1
- package/dist/web/assets/chevron-down-B9puixxZ.js +0 -1
- package/dist/web/assets/chevron-right-DK_HbYZC.js +0 -1
- package/dist/web/assets/chevron-up-BPAINgoK.js +0 -1
- package/dist/web/assets/circle-BpGTLAas.js +0 -1
- package/dist/web/assets/circle-question-mark-DUaySkoB.js +0 -1
- package/dist/web/assets/clock-Dqq0H9yH.js +0 -1
- package/dist/web/assets/code-CX6640Tv.js +0 -1
- package/dist/web/assets/code-editor-CyFLXCsD.js +0 -7
- package/dist/web/assets/codex-daily-guard-Cg19EWxk.js +0 -1
- package/dist/web/assets/conflict-editor-DSjo2FRy.js +0 -19
- package/dist/web/assets/context-menu-DchAkdnL.js +0 -1
- package/dist/web/assets/copy-Bt_1tjoJ.js +0 -1
- package/dist/web/assets/csv-preview-BIE3Wpww.js +0 -2
- package/dist/web/assets/database-9_p74TtY.js +0 -1
- package/dist/web/assets/database-viewer-CMvIORcM.js +0 -1
- package/dist/web/assets/diff-viewer-BQQ6fUr6.js +0 -4
- package/dist/web/assets/docx-preview-DcCh59Oe.js +0 -12
- package/dist/web/assets/download-CEPFebri.js +0 -1
- package/dist/web/assets/explorer-body-DRo2JHP9.js +0 -2
- package/dist/web/assets/explorer-window-content-7mnRpSqn.js +0 -1
- package/dist/web/assets/extension-manager-section-CEfr7-Kv.js +0 -1
- package/dist/web/assets/extension-webview-D7HqqdTv.js +0 -3
- package/dist/web/assets/eye-BQaWPI4P.js +0 -1
- package/dist/web/assets/eye-off-BlB3QV90.js +0 -1
- package/dist/web/assets/file-exclamation-point-BDmSZbxs.js +0 -1
- package/dist/web/assets/files-settings-section-h6a-WpSO.js +0 -1
- package/dist/web/assets/flask-conical-Cj-J6cxs.js +0 -1
- package/dist/web/assets/folder-symlink-BSYalAHC.js +0 -1
- package/dist/web/assets/general-settings-section-Bt3KNcyM.js +0 -1
- package/dist/web/assets/git-log-panel-H-Bg9p7m.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-At-P8hlA.js +0 -1
- package/dist/web/assets/glide-data-grid-D3Xc_WGh.js +0 -141
- package/dist/web/assets/group-chat-tab-BkLt7J_s.js +0 -1
- package/dist/web/assets/hand-BkDyLfcc.js +0 -1
- package/dist/web/assets/image-preview-D_6-FhZP.js +0 -1
- package/dist/web/assets/index-BV_sFdHY.js +0 -52
- package/dist/web/assets/index-Di9nVG3y.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-btSsuixb.js +0 -1
- package/dist/web/assets/key-round-Cv4z7_KG.js +0 -1
- package/dist/web/assets/keybindings-store-alreySno.js +0 -1
- package/dist/web/assets/keyboard-HG0BUtuN.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-B_D0FamP.js +0 -1
- package/dist/web/assets/loader-circle-H81ywCuQ.js +0 -1
- package/dist/web/assets/markdown-renderer-CG_nGh7k.js +0 -3
- package/dist/web/assets/markdown-renderer-CgbqvSuc.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-DAZTzi1k.js +0 -1
- package/dist/web/assets/monitor-CKcYUoAV.js +0 -1
- package/dist/web/assets/notification-store-HCg5Shw9.js +0 -1
- package/dist/web/assets/notifications-settings-section-BAs_p_ai.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-B20_sIFd.js +0 -1
- package/dist/web/assets/panel-store-XhAruR6D.js +0 -1
- package/dist/web/assets/pdf-preview-BJjqU3AX.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-nzfJdXCC.js +0 -1
- package/dist/web/assets/power-D_wlLkC0.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-5U0a58oj.js +0 -1
- package/dist/web/assets/process-table-CqGL0Bcj.js +0 -1
- package/dist/web/assets/proxy-settings-section-B1LDpGSc.js +0 -1
- package/dist/web/assets/query-audit-section-DfCvY94_.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-CS4sHKD5.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-_LH4uCcA.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-view-C5TUPDh_.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-DuT4A893.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-B4V-1aJn.js +0 -1
- package/dist/web/assets/save-BehCuMf4.js +0 -1
- package/dist/web/assets/schedules-settings-section-C2SjwWFB.js +0 -1
- package/dist/web/assets/send-CtXcGcsk.js +0 -1
- package/dist/web/assets/settings-body-CdFauCAU.js +0 -2
- package/dist/web/assets/settings-store-BkNrLdjk.js +0 -2
- package/dist/web/assets/settings-tab-DGUlmMbc.js +0 -1
- package/dist/web/assets/settings-window-content-CIH5sihe.js +0 -1
- package/dist/web/assets/shield-check-z9PX8HVZ.js +0 -1
- package/dist/web/assets/shield-off-Du0U5dVI.js +0 -1
- package/dist/web/assets/sparkles-CO9zx1f-.js +0 -1
- package/dist/web/assets/sqlite-viewer-Bpz7QnBk.js +0 -1
- package/dist/web/assets/system-monitor-body-BBJOWFCa.js +0 -2
- package/dist/web/assets/system-monitor-tab-D7RIwhmg.js +0 -1
- package/dist/web/assets/system-monitor-window-content-CH0UmMP9.js +0 -1
- package/dist/web/assets/tab-host-window-content-C_yU5MH_.js +0 -1
- package/dist/web/assets/table-BK4h8E7u.js +0 -1
- package/dist/web/assets/team-member-sheet-CopMME1E.js +0 -2
- package/dist/web/assets/team-member-window-content-CUDQ6oX7.js +0 -1
- package/dist/web/assets/terminal-tab-BjI95uG5.js +0 -3
- package/dist/web/assets/text-wrap-DLtVgSnU.js +0 -1
- package/dist/web/assets/tool-cards-I71v1w5Z.js +0 -9
- package/dist/web/assets/treemap-KZPCXAKY-BBrhTPZk.js +0 -1
- package/dist/web/assets/use-coarse-long-press-XrJ4Upuv.js +0 -1
- package/dist/web/assets/use-inline-blame-CRUwd6FF.js +0 -8
- package/dist/web/assets/use-monaco-theme-qzMbRfCW.js +0 -1
- package/dist/web/assets/use-remote-desktop-display-choice-0zDkCmsK.js +0 -1
- package/dist/web/assets/video-preview-Mlgl7hGr.js +0 -1
- package/dist/web/assets/ws-auth-DI1E6Fe7.js +0 -1
- package/dist/web/assets/x-DlnNFF2t.js +0 -1
- package/dist/web/monacoeditorwork/css.worker.bundle.js +0 -54268
- package/dist/web/monacoeditorwork/editor.worker.bundle.js +0 -14316
- package/dist/web/monacoeditorwork/html.worker.bundle.js +0 -30452
- package/dist/web/monacoeditorwork/json.worker.bundle.js +0 -22095
- package/dist/web/monacoeditorwork/ts.worker.bundle.js +0 -225957
- package/src/web/components/explorer/file-icon-map.ts +0 -69
- /package/dist/web/assets/{abap-BIHt2d9F.js → abap-tkptwpsK.js} +0 -0
- /package/dist/web/assets/{actionscript-3-rbCNRHFj.js → actionscript-3-Di9TMGwg.js} +0 -0
- /package/dist/web/assets/{ada-CN94LQTJ.js → ada-CB9F079D.js} +0 -0
- /package/dist/web/assets/{andromeeda-BsmcoXuQ.js → andromeeda-Dcl8jpb7.js} +0 -0
- /package/dist/web/assets/{apache-pRQmqcVZ.js → apache-D0Nk0qsH.js} +0 -0
- /package/dist/web/assets/{apex-CNEumC1X.js → apex-mQIoWncD.js} +0 -0
- /package/dist/web/assets/{api-client-DKvkxuDr.js → api-client-bfB7cXRM.js} +0 -0
- /package/dist/web/assets/{applescript-DjEVsS-3.js → applescript-C6ljbcsI.js} +0 -0
- /package/dist/web/assets/{apply-theme-Abd1TNqE.js → apply-theme-BwIMNXyX.js} +0 -0
- /package/dist/web/assets/{ara-DbhZRlTL.js → ara-WFqRPGPe.js} +0 -0
- /package/dist/web/assets/{asciidoc-BsfbAXIK.js → asciidoc-bNd8w4nf.js} +0 -0
- /package/dist/web/assets/{asm-Vw5NMXjI.js → asm-BQ1_F580.js} +0 -0
- /package/dist/web/assets/{aurora-x-CoahU6sR.js → aurora-x-Ciqs_Dbu.js} +0 -0
- /package/dist/web/assets/{awk-ChKjCxHz.js → awk-GCR-6KZV.js} +0 -0
- /package/dist/web/assets/{ayu-dark-By9RKxTf.js → ayu-dark-DxJXuj99.js} +0 -0
- /package/dist/web/assets/{ayu-light-CEsgeLON.js → ayu-light-jvSyJWDV.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-CYrtwSLW.js → ayu-mirage-Cg3BPO6H.js} +0 -0
- /package/dist/web/assets/{ballerina-CCSVz22W.js → ballerina-BPz4CrX6.js} +0 -0
- /package/dist/web/assets/{bat-DU4--CMj.js → bat-CSTs2hIG.js} +0 -0
- /package/dist/web/assets/{beancount-DF_tlRlF.js → beancount-DMateAZX.js} +0 -0
- /package/dist/web/assets/{berry-CZTnatvO.js → berry-9lXg0GRM.js} +0 -0
- /package/dist/web/assets/{bibtex-BSpXy8jk.js → bibtex-DIbqmvFg.js} +0 -0
- /package/dist/web/assets/{bicep-yv1Ydq5Z.js → bicep-02WGsoJ8.js} +0 -0
- /package/dist/web/assets/{bird2-Db7Z7SMN.js → bird2-BY0tbu3k.js} +0 -0
- /package/dist/web/assets/{c-C3ivhwA4.js → c-jMBX_9Je.js} +0 -0
- /package/dist/web/assets/{c3-N4mKyst9.js → c3-B8JVbNjW.js} +0 -0
- /package/dist/web/assets/{cadence-BYK8tFFk.js → cadence-DUIf1tvL.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DU5MH6XF.js → can-open-in-ppm-DGEc0s4P.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BK9Tv2XG.js → catppuccin-frappe-FhUCVxex.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-De4mVCp3.js → catppuccin-latte-CzfrtmgL.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-Bxt_D7cs.js → catppuccin-macchiato-6xL0lOtj.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-Dz2o8gN7.js → catppuccin-mocha-D39-xS3P.js} +0 -0
- /package/dist/web/assets/{clarity-BJdh0Pw-.js → clarity-D8TeGvoT.js} +0 -0
- /package/dist/web/assets/{clojure-DG-FYGzn.js → clojure-Dx_acSX7.js} +0 -0
- /package/dist/web/assets/{cmake-D1imEXan.js → cmake-CyeYPq8o.js} +0 -0
- /package/dist/web/assets/{codeowners-YpylTFB5.js → codeowners-DrTI0lmI.js} +0 -0
- /package/dist/web/assets/{codeql-ajDEPgqi.js → codeql-CPkFxVW-.js} +0 -0
- /package/dist/web/assets/{common-lisp-C2sCrd-m.js → common-lisp-B0k-3LTj.js} +0 -0
- /package/dist/web/assets/{coq-BqybyDc9.js → coq-uygpo7to.js} +0 -0
- /package/dist/web/assets/{createLucideIcon-D6fVXe3s.js → createLucideIcon-DoiEKeJ_.js} +0 -0
- /package/dist/web/assets/{csharp-nKCEiujy.js → csharp-DKUYGfSp.js} +0 -0
- /package/dist/web/assets/{css-CJSp2CsD.js → css-DoOUp7v4.js} +0 -0
- /package/dist/web/assets/{csv-Nh9vQwQm.js → csv-B3YE13gi.js} +0 -0
- /package/dist/web/assets/{csv-parser-iow1WWML.js → csv-parser-DXePqmXe.js} +0 -0
- /package/dist/web/assets/{cue-Ch79RPsU.js → cue-DViO2wvn.js} +0 -0
- /package/dist/web/assets/{cypher-CgiOQ6hs.js → cypher-4BMCIW5N.js} +0 -0
- /package/dist/web/assets/{d-CmBcySpH.js → d-BT_sTHas.js} +0 -0
- /package/dist/web/assets/{dark-plus-COLEX2ui.js → dark-plus-DVVXu-1N.js} +0 -0
- /package/dist/web/assets/{dart-BTAArMcJ.js → dart-DHz6f6_6.js} +0 -0
- /package/dist/web/assets/{data-grid-types-tNj9zuRV.js → data-grid-types-OgUxMLdQ.js} +0 -0
- /package/dist/web/assets/{dax-BbZzRY9i.js → dax-ChYCjweK.js} +0 -0
- /package/dist/web/assets/{desktop-OmQvU3-J.js → desktop-D6Lt4p04.js} +0 -0
- /package/dist/web/assets/{diff-BEPnb9Fb.js → diff-D8TDe4hP.js} +0 -0
- /package/dist/web/assets/{dist-BiqPfYiP.js → dist-CrBOCtCW.js} +0 -0
- /package/dist/web/assets/{dist-BDpuZ376.js → dist-DOTlFQJA.js} +0 -0
- /package/dist/web/assets/{docker-Cg17HgTD.js → docker-Bsp0YbPx.js} +0 -0
- /package/dist/web/assets/{dotenv-DEMIaY7V.js → dotenv-B_7giSY_.js} +0 -0
- /package/dist/web/assets/{dracula-BkCFq8SO.js → dracula-TrQL2iB5.js} +0 -0
- /package/dist/web/assets/{dracula-soft-Cjp6-ltF.js → dracula-soft-n2XOlgh-.js} +0 -0
- /package/dist/web/assets/{dream-maker-Ce7Y_UKj.js → dream-maker-CdIEdhpT.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-BjpyfTbN.js → emacs-lisp-CSbixs6u.js} +0 -0
- /package/dist/web/assets/{everforest-dark-9r4okw1s.js → everforest-dark-BuZahZYp.js} +0 -0
- /package/dist/web/assets/{everforest-light-GCQTZ3Ju.js → everforest-light-DPH53z5H.js} +0 -0
- /package/dist/web/assets/{fennel-ITjY5Z6u.js → fennel-B1-K_hlJ.js} +0 -0
- /package/dist/web/assets/{fish-DP2uEzyg.js → fish-Cy12Dbua.js} +0 -0
- /package/dist/web/assets/{fluent-irzaP1f6.js → fluent-B_82ys8E.js} +0 -0
- /package/dist/web/assets/{format-bytes-B9Dbme9a.js → format-bytes-D5sBgIqU.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-BAPoainr.js → fortran-free-form-BRQdNzZF.js} +0 -0
- /package/dist/web/assets/{gdscript-DJ098V1z.js → gdscript-XBDmLUm9.js} +0 -0
- /package/dist/web/assets/{gdshader-DS2Jfy-K.js → gdshader-DhVfB3u4.js} +0 -0
- /package/dist/web/assets/{genie-CqfOaFFx.js → genie-X3K29Y49.js} +0 -0
- /package/dist/web/assets/{gherkin-CoZ2ucDH.js → gherkin-DKIx-6cX.js} +0 -0
- /package/dist/web/assets/{github-dark-BNLgnSO9.js → github-dark-Bf7zdp5s.js} +0 -0
- /package/dist/web/assets/{github-dark-default-CYlSggwi.js → github-dark-default-DqsBBV11.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-DumUysDk.js → github-dark-dimmed-X2gqRz6w.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-TKrcDJ2I.js → github-dark-high-contrast-Z7tvbGX4.js} +0 -0
- /package/dist/web/assets/{github-light-DVENFHLJ.js → github-light-BKxt-7zZ.js} +0 -0
- /package/dist/web/assets/{github-light-default-DtN8AGcE.js → github-light-default-B0liF4d4.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-NSyF37x4.js → github-light-high-contrast-F4encJwr.js} +0 -0
- /package/dist/web/assets/{gleam-hp4NMSb5.js → gleam-Pz2bHgBB.js} +0 -0
- /package/dist/web/assets/{gn-Dptw2PEu.js → gn-CgmdNsPU.js} +0 -0
- /package/dist/web/assets/{gnuplot-9juRzjwv.js → gnuplot-qLNF5yZ9.js} +0 -0
- /package/dist/web/assets/{go-D-QLCda0.js → go-CSDUNhE7.js} +0 -0
- /package/dist/web/assets/{groovy-DHKNy6Eh.js → groovy-B3NEnOHF.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-BFD6aQdB.js → gruvbox-dark-hard-DcoftiUX.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-D5llYBNp.js → gruvbox-dark-medium-D1wVSuD8.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-DOztQmNR.js → gruvbox-dark-soft-DWpunymH.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-BFGD-8Pd.js → gruvbox-light-hard-rHMvyUdS.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DzoyXgT7.js → gruvbox-light-medium-3O2KiXO7.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-B1Ix2zLN.js → gruvbox-light-soft-lNlXJPwH.js} +0 -0
- /package/dist/web/assets/{haskell-BnrJ0k7G.js → haskell-aaG3aC0h.js} +0 -0
- /package/dist/web/assets/{haxe-DwShHT_-.js → haxe-CPcHhUDd.js} +0 -0
- /package/dist/web/assets/{hcl-VOjEibVB.js → hcl-CMQNlR_4.js} +0 -0
- /package/dist/web/assets/{hjson-BHEn7pNn.js → hjson-DeuklPFj.js} +0 -0
- /package/dist/web/assets/{hlsl-CrvxlGii.js → hlsl-BI3hlsaM.js} +0 -0
- /package/dist/web/assets/{horizon-D3T-P0u6.js → horizon-C7-gOcjs.js} +0 -0
- /package/dist/web/assets/{horizon-bright-vifGsEdk.js → horizon-bright-Cxt9bRW7.js} +0 -0
- /package/dist/web/assets/{houston-IrOgT7r4.js → houston-DbF2G7iD.js} +0 -0
- /package/dist/web/assets/{hy-5eSgTJ8G.js → hy-DRG6Hs2I.js} +0 -0
- /package/dist/web/assets/{image-gallery-COea0nSk.js → image-gallery-CObzTisL.js} +0 -0
- /package/dist/web/assets/{imba-Dp0I4DVl.js → imba-CxKv_2TW.js} +0 -0
- /package/dist/web/assets/{ini-CHDKad9O.js → ini-BiHsyCdO.js} +0 -0
- /package/dist/web/assets/{java-YLv7IDJ1.js → java-D3RZzgDB.js} +0 -0
- /package/dist/web/assets/{javascript-jr4kIdgl.js → javascript-4FmSqG-T.js} +0 -0
- /package/dist/web/assets/{json-EJWSOZfp.js → json-CjB236_E.js} +0 -0
- /package/dist/web/assets/{json5-D6f_uNwJ.js → json5-bkfO-Rco.js} +0 -0
- /package/dist/web/assets/{jsonc-DrHCdmos.js → jsonc-BwaTeLyv.js} +0 -0
- /package/dist/web/assets/{jsonl-Cwc3cXEL.js → jsonl-CfxNSwGd.js} +0 -0
- /package/dist/web/assets/{jsonnet-BwZfaIFT.js → jsonnet-CQETCYrp.js} +0 -0
- /package/dist/web/assets/{jssm-BpEmg_MT.js → jssm-D5o3Zzdz.js} +0 -0
- /package/dist/web/assets/{jsx-DBGPwcr4.js → jsx-BAMILPLo.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-DRfVaGIX.js → kanagawa-dragon-BhGVxu3R.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-CjOlny0Q.js → kanagawa-lotus-FH4Y59ro.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-DvdM88a4.js → kanagawa-wave-eilvP9MB.js} +0 -0
- /package/dist/web/assets/{kdl-DSo3PvM0.js → kdl-BQ-yvXUK.js} +0 -0
- /package/dist/web/assets/{kotlin-BV8TwCGu.js → kotlin-BuCx0-VT.js} +0 -0
- /package/dist/web/assets/{kusto-DCo1Fdmm.js → kusto-DAN_n_Cy.js} +0 -0
- /package/dist/web/assets/{laserwave-DPX9FvD9.js → laserwave-Cq2BlxrT.js} +0 -0
- /package/dist/web/assets/{lean-Cya8dqZu.js → lean-Dhq7uXKw.js} +0 -0
- /package/dist/web/assets/{less-CJUPgkIs.js → less-CxaMQb8j.js} +0 -0
- /package/dist/web/assets/{lib-DUBAP_Gd.js → lib-BVwmtv2i.js} +0 -0
- /package/dist/web/assets/{libesm-CcPYXCKp.js → libesm-DdtEjhIi.js} +0 -0
- /package/dist/web/assets/{light-plus-BXXrlFJH.js → light-plus-B4sMAend.js} +0 -0
- /package/dist/web/assets/{llvm-CUbQanZr.js → llvm-DQ6-B_6Y.js} +0 -0
- /package/dist/web/assets/{log-B3fFlSMd.js → log-Bb_vqvu7.js} +0 -0
- /package/dist/web/assets/{logo-ucAyw6zf.js → logo-BzfYv3A_.js} +0 -0
- /package/dist/web/assets/{luau-C4l6TSTB.js → luau-BnAeNR77.js} +0 -0
- /package/dist/web/assets/{make-CDtGIVc7.js → make-B6IFuxpC.js} +0 -0
- /package/dist/web/assets/{markdown-CH1zKu2p.js → markdown-Z0xi77Fn.js} +0 -0
- /package/dist/web/assets/{material-theme-CEuGVTmh.js → material-theme-1scy1SYn.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-CUZ3MoIr.js → material-theme-darker-G-JykXQP.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-DxAqJSid.js → material-theme-lighter-BtKkCMVq.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-BSvvHJp6.js → material-theme-ocean-irrDC89L.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-QVOl50_m.js → material-theme-palenight-Eq5_K4LM.js} +0 -0
- /package/dist/web/assets/{matlab-CZLQLwUp.js → matlab-BE3oCXZC.js} +0 -0
- /package/dist/web/assets/{mdx-DO4NJsOo.js → mdx-DYiuFTGw.js} +0 -0
- /package/dist/web/assets/{mermaid-CIwzg1uO.js → mermaid-DVlaEvtw.js} +0 -0
- /package/dist/web/assets/{min-dark-BdIgslXy.js → min-dark-DSkeTpQa.js} +0 -0
- /package/dist/web/assets/{min-light-DyU-T1r2.js → min-light-CFv2Q0uF.js} +0 -0
- /package/dist/web/assets/{mipsasm-DRad-Klm.js → mipsasm-CiAFuZQ2.js} +0 -0
- /package/dist/web/assets/{mojo-DXp5LDOc.js → mojo-ARshcaSQ.js} +0 -0
- /package/dist/web/assets/{monokai-BiKX3qby.js → monokai-CPTV-SOg.js} +0 -0
- /package/dist/web/assets/{moonbit-BOUoLF5r.js → moonbit-D57B0dZr.js} +0 -0
- /package/dist/web/assets/{move-Dlk64FWK.js → move-qgy3G_o9.js} +0 -0
- /package/dist/web/assets/{narrat-B-qd2Lh0.js → narrat-CZ3rC-oc.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-iAMYas0F.js → nextflow-groovy-BxxIOcI4.js} +0 -0
- /package/dist/web/assets/{night-owl-3YNqjftR.js → night-owl-B1ryGCda.js} +0 -0
- /package/dist/web/assets/{night-owl-light-GIncHb5w.js → night-owl-light-BZvNnvMF.js} +0 -0
- /package/dist/web/assets/{nix-xjlEb3uw.js → nix-BVBQi8yv.js} +0 -0
- /package/dist/web/assets/{nord-C8tvWx7P.js → nord-3NXw613h.js} +0 -0
- /package/dist/web/assets/{nushell-BqBb4pU6.js → nushell-BMOLRalb.js} +0 -0
- /package/dist/web/assets/{objective-c-Bk6s0Cn5.js → objective-c-AxruEUgh.js} +0 -0
- /package/dist/web/assets/{objective-cpp-DGTVWQ3V.js → objective-cpp-cFT0qRsD.js} +0 -0
- /package/dist/web/assets/{ocaml-D6wPQ4kw.js → ocaml-_8JH6O8J.js} +0 -0
- /package/dist/web/assets/{odin-C9mw2xRN.js → odin-nwYvR0O6.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-SMBlneFb.js → one-dark-pro-C1LaYJaH.js} +0 -0
- /package/dist/web/assets/{one-light-C9JMU1Cx.js → one-light-B7rMc__c.js} +0 -0
- /package/dist/web/assets/{openscad-C0I9CtuA.js → openscad-Cwes8bKO.js} +0 -0
- /package/dist/web/assets/{pascal-D0z4DJnY.js → pascal-DMt-6tdZ.js} +0 -0
- /package/dist/web/assets/{pkl-CITYNGVz.js → pkl-QBTyYQmB.js} +0 -0
- /package/dist/web/assets/{plastic-Bf0T6rmg.js → plastic-BTSUp8Fk.js} +0 -0
- /package/dist/web/assets/{plsql-Chr907pu.js → plsql-DQv3IFXP.js} +0 -0
- /package/dist/web/assets/{po-07U75CYV.js → po-CNwZx4tW.js} +0 -0
- /package/dist/web/assets/{poimandres-B0T4qwXY.js → poimandres-8Os7Qequ.js} +0 -0
- /package/dist/web/assets/{polar-BvNJMMV5.js → polar-b4yK8oD8.js} +0 -0
- /package/dist/web/assets/{portal-container-context-Bqn516X4.js → portal-container-context-BarKmT4S.js} +0 -0
- /package/dist/web/assets/{postcss-BSdf-zzo.js → postcss-sFctwpxx.js} +0 -0
- /package/dist/web/assets/{powerquery-B2Ad_HK8.js → powerquery-Cg_WrtuN.js} +0 -0
- /package/dist/web/assets/{powershell-DO5WY2v2.js → powershell-C7Ifz95h.js} +0 -0
- /package/dist/web/assets/{prisma-BfaRPYzs.js → prisma-Z52HUJzQ.js} +0 -0
- /package/dist/web/assets/{prolog-Cz0Nue9e.js → prolog-DLqW-zR1.js} +0 -0
- /package/dist/web/assets/{proto-FVleUZJO.js → proto-BOIzxCCJ.js} +0 -0
- /package/dist/web/assets/{puppet-BEX5o7hE.js → puppet-De7TjZIf.js} +0 -0
- /package/dist/web/assets/{purescript-BZX6Kw4j.js → purescript-R76ou1WT.js} +0 -0
- /package/dist/web/assets/{python-CO89UIxE.js → python-Dprm0tNP.js} +0 -0
- /package/dist/web/assets/{qmldir-DH526DWB.js → qmldir-Clp_jpNw.js} +0 -0
- /package/dist/web/assets/{qss-wp8im4Iz.js → qss-eQPYYzSo.js} +0 -0
- /package/dist/web/assets/{r-F9n--bvq.js → r-CCcRHIf5.js} +0 -0
- /package/dist/web/assets/{racket-BQvbOE5D.js → racket-CzE472yp.js} +0 -0
- /package/dist/web/assets/{raku-B0iWSynj.js → raku-DQwXrTSi.js} +0 -0
- /package/dist/web/assets/{react-Bcm1Oab0.js → react-Bghu0NUO.js} +0 -0
- /package/dist/web/assets/{red-Cm00r9eI.js → red-KCS6wyop.js} +0 -0
- /package/dist/web/assets/{reg-CBuhna22.js → reg-CcrAddUh.js} +0 -0
- /package/dist/web/assets/{regexp-C9j1_6oU.js → regexp-DDbud-Ri.js} +0 -0
- /package/dist/web/assets/{rel-BYzlBhbq.js → rel-99GDgaHp.js} +0 -0
- /package/dist/web/assets/{resolve-theme-Dm8ehbOv.js → resolve-theme-CW2niGV2.js} +0 -0
- /package/dist/web/assets/{riscv-CQQP0Ro9.js → riscv-Dm2eNv0R.js} +0 -0
- /package/dist/web/assets/{ron-j1ON9YzM.js → ron-CzFt0ygH.js} +0 -0
- /package/dist/web/assets/{rose-pine-Cbri3jon.js → rose-pine-Ck6lCrCP.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-BMuvKrGo.js → rose-pine-dawn-vtALRJNj.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-4biZzaYD.js → rose-pine-moon-DPto8qXw.js} +0 -0
- /package/dist/web/assets/{rosmsg-CXx22rtz.js → rosmsg-NtS6429H.js} +0 -0
- /package/dist/web/assets/{rust-D28cFIhL.js → rust-BjIXvF9h.js} +0 -0
- /package/dist/web/assets/{sass-DtNw4V28.js → sass-CQ23wf5E.js} +0 -0
- /package/dist/web/assets/{scala-hv69_YQC.js → scala-LfKLM143.js} +0 -0
- /package/dist/web/assets/{scheme-Dtp9B_ng.js → scheme-D3SLBXlF.js} +0 -0
- /package/dist/web/assets/{sdbl-DEwEngAE.js → sdbl-ODRd2rGN.js} +0 -0
- /package/dist/web/assets/{shellscript-CCOF9tox.js → shellscript-3KB1G_oA.js} +0 -0
- /package/dist/web/assets/{slack-dark-DT0E0ABt.js → slack-dark-DTtyWmIy.js} +0 -0
- /package/dist/web/assets/{slack-ochin-DHHiQnxo.js → slack-ochin-Bu0PApk3.js} +0 -0
- /package/dist/web/assets/{smalltalk-BF_I35xJ.js → smalltalk-haMT-Sbe.js} +0 -0
- /package/dist/web/assets/{snazzy-light-Cv7tIZo9.js → snazzy-light-DXJzefE9.js} +0 -0
- /package/dist/web/assets/{solarized-dark-wZ5YPCys.js → solarized-dark-B6LyYa18.js} +0 -0
- /package/dist/web/assets/{solarized-light-DGDOr1AS.js → solarized-light-QLADebkv.js} +0 -0
- /package/dist/web/assets/{solidity-BJknuPqJ.js → solidity-mzfq1aDc.js} +0 -0
- /package/dist/web/assets/{splunk-B1ClO_KU.js → splunk-CyH4RWBp.js} +0 -0
- /package/dist/web/assets/{sql-CXZ66NtF.js → sql-CWVlT5D3.js} +0 -0
- /package/dist/web/assets/{ssh-config-kgM67Sf6.js → ssh-config-DNvQJ1Qx.js} +0 -0
- /package/dist/web/assets/{stylus-RcVaInR-.js → stylus-ByQQdtmf.js} +0 -0
- /package/dist/web/assets/{swift-Cm0fh2lX.js → swift-D1cpY4ow.js} +0 -0
- /package/dist/web/assets/{synthwave-84-CwLiazxr.js → synthwave-84-BDF_-QiW.js} +0 -0
- /package/dist/web/assets/{system-verilog-CzYaDVLH.js → system-verilog-BYrkMydC.js} +0 -0
- /package/dist/web/assets/{systemd-DbSagfLw.js → systemd-CQm3zyK0.js} +0 -0
- /package/dist/web/assets/{talonscript-BCFnWejL.js → talonscript-DMW5CzE1.js} +0 -0
- /package/dist/web/assets/{tasl-BUdqtEe1.js → tasl-BhFzMCr2.js} +0 -0
- /package/dist/web/assets/{tcl-CR_lTV9N.js → tcl-D7VEAF-9.js} +0 -0
- /package/dist/web/assets/{terraform-Bqsha-xe.js → terraform-DdT5A0Vy.js} +0 -0
- /package/dist/web/assets/{tokyo-night-Cnuo6JB6.js → tokyo-night-WGLMM6Q9.js} +0 -0
- /package/dist/web/assets/{toml-CLFdhT22.js → toml-CZ7ipXHZ.js} +0 -0
- /package/dist/web/assets/{tsv-Dw3tLrZN.js → tsv-B1zVvoTr.js} +0 -0
- /package/dist/web/assets/{tsx-B8k1sFqw.js → tsx-D4HwRUBq.js} +0 -0
- /package/dist/web/assets/{turtle-BMKMfTrj.js → turtle-B4r8KEJH.js} +0 -0
- /package/dist/web/assets/{typescript-D38LfGSl.js → typescript-BnHhxMtp.js} +0 -0
- /package/dist/web/assets/{typespec-EbgGJHV_.js → typespec-DP2q46GT.js} +0 -0
- /package/dist/web/assets/{typst-CQXV2SzX.js → typst-DFsD_yaD.js} +0 -0
- /package/dist/web/assets/{use-is-mobile-Dypg-2ZO.js → use-is-mobile-BQ9Bv5Ga.js} +0 -0
- /package/dist/web/assets/{use-visual-viewport-Bj3QHRkF.js → use-visual-viewport-CbwnktSG.js} +0 -0
- /package/dist/web/assets/{utils-CwNUra6_.js → utils-Bmf_8h7Y.js} +0 -0
- /package/dist/web/assets/{v-Ci1jObJJ.js → v-Bji8hSVT.js} +0 -0
- /package/dist/web/assets/{vala-C_NdfqrY.js → vala-D3TIgGmU.js} +0 -0
- /package/dist/web/assets/{vb-K_r_h_s8.js → vb-DvcxFS2q.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-BtjgHRUe.js → vendor-xterm-BqPDsE9b.js} +0 -0
- /package/dist/web/assets/{verilog-DQPYLsZI.js → verilog-Dy7cF35d.js} +0 -0
- /package/dist/web/assets/{vesper-BrmzEV8s.js → vesper-BzjwUv9J.js} +0 -0
- /package/dist/web/assets/{vhdl-CjxQGaH2.js → vhdl-DuFnFNmW.js} +0 -0
- /package/dist/web/assets/{viml-CTKJNQH1.js → viml-yAPgKlbz.js} +0 -0
- /package/dist/web/assets/{vitesse-black-i-H_3p1i.js → vitesse-black-oSSQdyIZ.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-DZC_Yy3_.js → vitesse-dark-BZxwPihB.js} +0 -0
- /package/dist/web/assets/{vitesse-light-rf4kpmk8.js → vitesse-light-uIigycvt.js} +0 -0
- /package/dist/web/assets/{vyper-BLnOw4Nf.js → vyper-CX3NAxm5.js} +0 -0
- /package/dist/web/assets/{wasm-DbLMmiW0.js → wasm-6mEOOvVa.js} +0 -0
- /package/dist/web/assets/{wasm-CWeHvGNG.js → wasm-D9td37qO.js} +0 -0
- /package/dist/web/assets/{wenyan-CLwdRuzd.js → wenyan-lwNIHgk6.js} +0 -0
- /package/dist/web/assets/{wgsl-CBTDMVJR.js → wgsl-DQAzCfog.js} +0 -0
- /package/dist/web/assets/{wikitext-CQHrF84e.js → wikitext-DTXmt5NE.js} +0 -0
- /package/dist/web/assets/{wit-8xdbdipU.js → wit-Bdw_7WDH.js} +0 -0
- /package/dist/web/assets/{wolfram-tFwx32a_.js → wolfram-DqyHDZ07.js} +0 -0
- /package/dist/web/assets/{yaml-BP8N91fU.js → yaml-CPXhdByd.js} +0 -0
- /package/dist/web/assets/{zenscript-B10Pj7JT.js → zenscript-6s_i5zek.js} +0 -0
- /package/dist/web/assets/{zig-BZKcTtrK.js → zig-B2htezJ_.js} +0 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which language server serves which file, how to find it, and what to tell
|
|
3
|
+
* the user when it is missing.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here spawns or touches the filesystem — it answers "what would you
|
|
6
|
+
* run" so the decisions are testable on their own. `lsp-manager.ts` does the
|
|
7
|
+
* looking and the launching.
|
|
8
|
+
*
|
|
9
|
+
* The language ids are LSP's, which are VS Code's, and they are deliberately
|
|
10
|
+
* *not* PPM's Monaco ids. Monaco maps `.tsx` to `typescript`; LSP calls it
|
|
11
|
+
* `typescriptreact`, and the distinction is load-bearing rather than cosmetic —
|
|
12
|
+
* tsserver decides whether to parse JSX from the language id, so a `.tsx` file
|
|
13
|
+
* announced as `typescript` gets a syntax error on its first tag.
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
import { createRequire } from "node:module";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
|
|
19
|
+
export interface LanguageServerDefinition {
|
|
20
|
+
/** Stable id, used in status reporting and as the marker owner. */
|
|
21
|
+
id: string;
|
|
22
|
+
displayName: string;
|
|
23
|
+
/** LSP language ids this server handles. */
|
|
24
|
+
languages: string[];
|
|
25
|
+
command: string;
|
|
26
|
+
args: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Files that mark the root of a project this server understands. The nearest
|
|
29
|
+
* ancestor holding one becomes the rootUri, so a monorepo package gets its
|
|
30
|
+
* own server rather than one rooted at the repository top.
|
|
31
|
+
*/
|
|
32
|
+
rootMarkers: string[];
|
|
33
|
+
/** Shown verbatim when the command cannot be found. */
|
|
34
|
+
installHint: string;
|
|
35
|
+
/**
|
|
36
|
+
* The npm package PPM depends on for this server, when it ships one.
|
|
37
|
+
*
|
|
38
|
+
* Only set where the package is in PPM's own `dependencies` — naming one that is not there
|
|
39
|
+
* makes `bundledServerEntry` answer with a path nothing ever wrote.
|
|
40
|
+
*/
|
|
41
|
+
bundledPackage?: string;
|
|
42
|
+
initializationOptions?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* File extension to LSP language id.
|
|
47
|
+
*
|
|
48
|
+
* Extensionless names that are whole filenames (Dockerfile, Makefile) are
|
|
49
|
+
* matched separately, in `lspLanguageForPath`.
|
|
50
|
+
*/
|
|
51
|
+
const EXTENSION_LANGUAGE: Record<string, string> = {
|
|
52
|
+
ts: "typescript", mts: "typescript", cts: "typescript",
|
|
53
|
+
tsx: "typescriptreact",
|
|
54
|
+
js: "javascript", mjs: "javascript", cjs: "javascript",
|
|
55
|
+
jsx: "javascriptreact",
|
|
56
|
+
py: "python", pyi: "python",
|
|
57
|
+
go: "go",
|
|
58
|
+
rs: "rust",
|
|
59
|
+
c: "c", h: "c",
|
|
60
|
+
cc: "cpp", cpp: "cpp", cxx: "cpp", hpp: "cpp", hh: "cpp", hxx: "cpp",
|
|
61
|
+
json: "json",
|
|
62
|
+
jsonc: "jsonc",
|
|
63
|
+
html: "html", htm: "html",
|
|
64
|
+
css: "css", scss: "scss", less: "less",
|
|
65
|
+
yaml: "yaml", yml: "yaml",
|
|
66
|
+
sh: "shellscript", bash: "shellscript", zsh: "shellscript",
|
|
67
|
+
php: "php",
|
|
68
|
+
rb: "ruby",
|
|
69
|
+
lua: "lua",
|
|
70
|
+
vue: "vue",
|
|
71
|
+
svelte: "svelte",
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const FILENAME_LANGUAGE: Record<string, string> = {
|
|
75
|
+
dockerfile: "dockerfile",
|
|
76
|
+
"tsconfig.json": "jsonc",
|
|
77
|
+
"jsconfig.json": "jsonc",
|
|
78
|
+
".eslintrc.json": "jsonc",
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** The LSP language id for a path, or null when no server could serve it. */
|
|
82
|
+
export function lspLanguageForPath(filePath: string): string | null {
|
|
83
|
+
const base = filePath.replace(/\\/g, "/").split("/").pop()?.toLowerCase() ?? "";
|
|
84
|
+
const byName = FILENAME_LANGUAGE[base];
|
|
85
|
+
if (byName) return byName;
|
|
86
|
+
|
|
87
|
+
const dot = base.lastIndexOf(".");
|
|
88
|
+
if (dot <= 0) return null; // no extension, or a dotfile with no suffix
|
|
89
|
+
return EXTENSION_LANGUAGE[base.slice(dot + 1)] ?? null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The servers PPM knows how to drive.
|
|
94
|
+
*
|
|
95
|
+
* The first entry that is actually installed wins, so ordering within a
|
|
96
|
+
* language matters. TypeScript comes from `typescript-language-server`, which
|
|
97
|
+
* wraps the same tsserver VS Code drives — the intelligence is identical, only
|
|
98
|
+
* the transport differs.
|
|
99
|
+
*/
|
|
100
|
+
export const LANGUAGE_SERVERS: LanguageServerDefinition[] = [
|
|
101
|
+
{
|
|
102
|
+
id: "typescript",
|
|
103
|
+
displayName: "TypeScript",
|
|
104
|
+
languages: ["typescript", "typescriptreact", "javascript", "javascriptreact"],
|
|
105
|
+
command: "typescript-language-server",
|
|
106
|
+
args: ["--stdio"],
|
|
107
|
+
rootMarkers: ["tsconfig.json", "jsconfig.json", "package.json"],
|
|
108
|
+
// `typescript@5` is pinned deliberately. The 7.x line is the native port
|
|
109
|
+
// and ships no `tsserver.js`, so typescript-language-server refuses to
|
|
110
|
+
// start against it with "provides no tsserver" — which reads like a broken
|
|
111
|
+
// install rather than the wrong major version.
|
|
112
|
+
installHint: "bun add -g typescript-language-server typescript@5",
|
|
113
|
+
// Shipped with PPM, so this one works on a fresh install with nothing else done. The
|
|
114
|
+
// project's own copy still wins where there is one — a repository pinned to TypeScript 4
|
|
115
|
+
// has to be analysed by its own server, not by whatever PPM happens to carry.
|
|
116
|
+
bundledPackage: "typescript-language-server",
|
|
117
|
+
initializationOptions: {
|
|
118
|
+
// Matches what VS Code asks tsserver for: completions that can add an
|
|
119
|
+
// import, and snippet text so a function completion fills its parens.
|
|
120
|
+
preferences: {
|
|
121
|
+
includeCompletionsForModuleExports: true,
|
|
122
|
+
includeCompletionsWithSnippetText: true,
|
|
123
|
+
includeCompletionsWithInsertText: true,
|
|
124
|
+
importModuleSpecifierPreference: "shortest",
|
|
125
|
+
// Inlay hints are opt-in *per kind* on the server side, and tsserver
|
|
126
|
+
// returns an empty array for every one that is off. Without these the
|
|
127
|
+
// editor asks, the server answers "no hints", and a feature that is
|
|
128
|
+
// switched on in Monaco shows nothing at all — measured as 0 hints for
|
|
129
|
+
// a 2233-line file.
|
|
130
|
+
//
|
|
131
|
+
// Parameter names only. Those are the ones worth reading — they say
|
|
132
|
+
// what a bare `true` or a positional array index means at a call site.
|
|
133
|
+
// The type hints (variable, property, return) are the noisy ones: they
|
|
134
|
+
// restate what the code already says on most lines, and VS Code ships
|
|
135
|
+
// all of them off.
|
|
136
|
+
includeInlayParameterNameHints: "all",
|
|
137
|
+
// `foo(name)` for `foo(name: string)` is the one hint that never adds
|
|
138
|
+
// anything, so it is suppressed the way VS Code suppresses it.
|
|
139
|
+
includeInlayParameterNameHintsWhenArgumentMatchesName: false,
|
|
140
|
+
includeInlayEnumMemberValueHints: true,
|
|
141
|
+
includeInlayFunctionLikeReturnTypeHints: false,
|
|
142
|
+
includeInlayFunctionParameterTypeHints: false,
|
|
143
|
+
includeInlayVariableTypeHints: false,
|
|
144
|
+
includeInlayPropertyDeclarationTypeHints: false,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: "pyright",
|
|
150
|
+
displayName: "Pyright",
|
|
151
|
+
languages: ["python"],
|
|
152
|
+
command: "pyright-langserver",
|
|
153
|
+
args: ["--stdio"],
|
|
154
|
+
rootMarkers: ["pyproject.toml", "setup.py", "setup.cfg", "requirements.txt", "Pipfile"],
|
|
155
|
+
installHint: "bun add -g pyright",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "gopls",
|
|
159
|
+
displayName: "gopls",
|
|
160
|
+
languages: ["go"],
|
|
161
|
+
command: "gopls",
|
|
162
|
+
args: [],
|
|
163
|
+
rootMarkers: ["go.work", "go.mod"],
|
|
164
|
+
installHint: "go install golang.org/x/tools/gopls@latest",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "rust-analyzer",
|
|
168
|
+
displayName: "rust-analyzer",
|
|
169
|
+
languages: ["rust"],
|
|
170
|
+
command: "rust-analyzer",
|
|
171
|
+
args: [],
|
|
172
|
+
rootMarkers: ["Cargo.toml"],
|
|
173
|
+
installHint: "rustup component add rust-analyzer",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "clangd",
|
|
177
|
+
displayName: "clangd",
|
|
178
|
+
languages: ["c", "cpp"],
|
|
179
|
+
command: "clangd",
|
|
180
|
+
args: ["--background-index"],
|
|
181
|
+
rootMarkers: ["compile_commands.json", "compile_flags.txt", ".clangd", "CMakeLists.txt", "Makefile"],
|
|
182
|
+
installHint: "install clangd from your package manager (pacman -S clang, apt install clangd)",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: "json",
|
|
186
|
+
displayName: "JSON",
|
|
187
|
+
languages: ["json", "jsonc"],
|
|
188
|
+
command: "vscode-json-language-server",
|
|
189
|
+
args: ["--stdio"],
|
|
190
|
+
rootMarkers: ["package.json"],
|
|
191
|
+
installHint: "bun add -g vscode-langservers-extracted",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: "html",
|
|
195
|
+
displayName: "HTML",
|
|
196
|
+
languages: ["html"],
|
|
197
|
+
command: "vscode-html-language-server",
|
|
198
|
+
args: ["--stdio"],
|
|
199
|
+
rootMarkers: ["package.json"],
|
|
200
|
+
installHint: "bun add -g vscode-langservers-extracted",
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: "css",
|
|
204
|
+
displayName: "CSS",
|
|
205
|
+
languages: ["css", "scss", "less"],
|
|
206
|
+
command: "vscode-css-language-server",
|
|
207
|
+
args: ["--stdio"],
|
|
208
|
+
rootMarkers: ["package.json"],
|
|
209
|
+
installHint: "bun add -g vscode-langservers-extracted",
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
id: "yaml",
|
|
213
|
+
displayName: "YAML",
|
|
214
|
+
languages: ["yaml"],
|
|
215
|
+
command: "yaml-language-server",
|
|
216
|
+
args: ["--stdio"],
|
|
217
|
+
rootMarkers: [],
|
|
218
|
+
installHint: "bun add -g yaml-language-server",
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
id: "bash",
|
|
222
|
+
displayName: "Bash",
|
|
223
|
+
languages: ["shellscript"],
|
|
224
|
+
command: "bash-language-server",
|
|
225
|
+
args: ["start"],
|
|
226
|
+
rootMarkers: [],
|
|
227
|
+
installHint: "bun add -g bash-language-server",
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
id: "intelephense",
|
|
231
|
+
displayName: "Intelephense",
|
|
232
|
+
languages: ["php"],
|
|
233
|
+
command: "intelephense",
|
|
234
|
+
args: ["--stdio"],
|
|
235
|
+
rootMarkers: ["composer.json"],
|
|
236
|
+
installHint: "bun add -g intelephense",
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: "solargraph",
|
|
240
|
+
displayName: "Solargraph",
|
|
241
|
+
languages: ["ruby"],
|
|
242
|
+
command: "solargraph",
|
|
243
|
+
args: ["stdio"],
|
|
244
|
+
rootMarkers: ["Gemfile", ".solargraph.yml"],
|
|
245
|
+
installHint: "gem install solargraph",
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
id: "lua",
|
|
249
|
+
displayName: "Lua",
|
|
250
|
+
languages: ["lua"],
|
|
251
|
+
command: "lua-language-server",
|
|
252
|
+
args: [],
|
|
253
|
+
rootMarkers: [".luarc.json"],
|
|
254
|
+
installHint: "install lua-language-server from your package manager",
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: "vue",
|
|
258
|
+
displayName: "Vue",
|
|
259
|
+
languages: ["vue"],
|
|
260
|
+
command: "vue-language-server",
|
|
261
|
+
args: ["--stdio"],
|
|
262
|
+
rootMarkers: ["package.json"],
|
|
263
|
+
installHint: "bun add -g @vue/language-server",
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: "svelte",
|
|
267
|
+
displayName: "Svelte",
|
|
268
|
+
languages: ["svelte"],
|
|
269
|
+
command: "svelteserver",
|
|
270
|
+
args: ["--stdio"],
|
|
271
|
+
rootMarkers: ["package.json"],
|
|
272
|
+
installHint: "bun add -g svelte-language-server",
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
/** Every server that claims this language, in preference order. */
|
|
277
|
+
export function serversForLanguage(languageId: string): LanguageServerDefinition[] {
|
|
278
|
+
return LANGUAGE_SERVERS.filter((s) => s.languages.includes(languageId));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export function serverById(id: string): LanguageServerDefinition | undefined {
|
|
282
|
+
return LANGUAGE_SERVERS.find((s) => s.id === id);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Directories to search, nearest first, from the file's own directory up to and
|
|
287
|
+
* including the project root.
|
|
288
|
+
*
|
|
289
|
+
* Every directory here is both searched for `node_modules/.bin/<server>` — which
|
|
290
|
+
* is then *executed* — and searched for a root marker that would become a
|
|
291
|
+
* server's rootUri. So the bound is the whole trust story: without it a file at
|
|
292
|
+
* `~/notes/x.ts` puts `~/node_modules/.bin` on the list and roots a server at
|
|
293
|
+
* the user's home directory, indexing everything they own.
|
|
294
|
+
*
|
|
295
|
+
* The bound is enforced rather than assumed. The walk used to stop by comparing
|
|
296
|
+
* *lengths*, which happens to hold for a file inside the project and not at all
|
|
297
|
+
* for one outside it: `/home/ada/repo-other/deep/x.ts` against a project at
|
|
298
|
+
* `/home/ada/repo` yielded three `repo-other` directories and `/home/ada`. The
|
|
299
|
+
* bridge confines the path before this is reached, so nothing could reach it —
|
|
300
|
+
* but a guard whose comment claims more than its code does is one caller away
|
|
301
|
+
* from being a real hole.
|
|
302
|
+
*/
|
|
303
|
+
export function ancestorDirs(filePath: string, projectPath: string, platform: NodeJS.Platform = process.platform): string[] {
|
|
304
|
+
const p = platform === "win32" ? path.win32 : path.posix;
|
|
305
|
+
const root = p.normalize(projectPath).replace(/[\\/]+$/, "");
|
|
306
|
+
const start = p.dirname(p.normalize(filePath));
|
|
307
|
+
// Windows paths are case-insensitive, so `C:\Users\Ada\Repo` and `c:\users\ada\repo` name
|
|
308
|
+
// one directory. Comparing them case-sensitively refuses the project outright — and, once
|
|
309
|
+
// the walk can no longer recognise its own root, lets it climb straight past it to `C:\`.
|
|
310
|
+
const fold = (dir: string) => (platform === "win32" ? dir.toLowerCase() : dir);
|
|
311
|
+
const foldedRoot = fold(root);
|
|
312
|
+
const inside = (dir: string) => fold(dir) === foldedRoot || fold(dir).startsWith(foldedRoot + p.sep);
|
|
313
|
+
if (!inside(start)) return [root];
|
|
314
|
+
|
|
315
|
+
const dirs: string[] = [];
|
|
316
|
+
for (let dir = start; ; ) {
|
|
317
|
+
dirs.push(dir);
|
|
318
|
+
if (fold(dir) === foldedRoot) return dirs;
|
|
319
|
+
const parent = p.dirname(dir);
|
|
320
|
+
if (parent === dir) break; // hit the filesystem root
|
|
321
|
+
dir = parent;
|
|
322
|
+
}
|
|
323
|
+
dirs.push(root);
|
|
324
|
+
return dirs;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Absolute paths to try for a server command, in order, ending with the bare
|
|
329
|
+
* command for PATH lookup.
|
|
330
|
+
*
|
|
331
|
+
* A project's own `node_modules/.bin` comes first so a repository that pins its
|
|
332
|
+
* language server gets that version — the same reason VS Code offers "Use
|
|
333
|
+
* Workspace Version" for TypeScript. Getting this backwards means a project
|
|
334
|
+
* pinned to TypeScript 4 is analysed by whatever is installed globally.
|
|
335
|
+
*
|
|
336
|
+
* That does mean opening a file runs a binary the repository supplied, so it is
|
|
337
|
+
* worth being explicit about what bounds it. Registering a project in PPM
|
|
338
|
+
* already hands that directory a terminal and an agent running in
|
|
339
|
+
* `bypassPermissions`; a `postinstall` script has run long before any of this.
|
|
340
|
+
* The setting is off by default and per device, so a language server exists only
|
|
341
|
+
* where someone asked for one. And `dirs` comes from `ancestorDirs`, which
|
|
342
|
+
* answers with directories inside the project and nothing else — that is the
|
|
343
|
+
* part that had to be enforced rather than assumed, and it is where the
|
|
344
|
+
* confinement actually lives.
|
|
345
|
+
*/
|
|
346
|
+
export function candidateCommandPaths(command: string, dirs: string[], platform: NodeJS.Platform = process.platform): string[] {
|
|
347
|
+
const p = platform === "win32" ? path.win32 : path.posix;
|
|
348
|
+
// npm/bun write a .cmd shim on Windows; the extensionless file there is a
|
|
349
|
+
// shell script Windows cannot execute.
|
|
350
|
+
const names = platform === "win32" ? [`${command}.cmd`, `${command}.exe`, command] : [command];
|
|
351
|
+
|
|
352
|
+
const candidates: string[] = [];
|
|
353
|
+
for (const dir of dirs) {
|
|
354
|
+
for (const name of names) {
|
|
355
|
+
candidates.push(p.join(dir, "node_modules", ".bin", name));
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
candidates.push(command);
|
|
359
|
+
return candidates;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* The copy PPM ships itself, for servers listed in its own dependencies.
|
|
364
|
+
*
|
|
365
|
+
* The floor under the other two lookups, and the reason the TypeScript server works on a
|
|
366
|
+
* fresh install with nothing else done: PPM depends on `typescript-language-server`, so npm
|
|
367
|
+
* puts it in PPM's *own* `node_modules` — which is neither the project's nor on `PATH`, so
|
|
368
|
+
* without this it was installed and unreachable.
|
|
369
|
+
*
|
|
370
|
+
* This answers with the package's **entry script**, not npm's `.bin` shim, and that is the
|
|
371
|
+
* load-bearing part. The shim starts `#!/usr/bin/env node`; PPM runs on Bun, and someone who
|
|
372
|
+
* installed it with `bun install -g ppm` may have no `node` on the machine at all. Measured:
|
|
373
|
+
* spawning the shim with nothing named `node` on `PATH` exits **127** with `env: 'node': No
|
|
374
|
+
* such file or directory` — after the server had already been reported as installed. The
|
|
375
|
+
* caller runs this with `process.execPath` instead. It also retires the `.cmd`/`.exe` guessing
|
|
376
|
+
* on Windows, since the entry is the same `.mjs` file on every platform.
|
|
377
|
+
*
|
|
378
|
+
* Resolved through the package rather than built from `import.meta.dir`: PPM runs from a
|
|
379
|
+
* global install, from a checkout, and from a bundled binary, and only the resolver knows
|
|
380
|
+
* where its dependencies actually landed in each. `null` when the package is absent, which is
|
|
381
|
+
* every server PPM does not bundle.
|
|
382
|
+
*/
|
|
383
|
+
export function bundledServerEntry(
|
|
384
|
+
definition: LanguageServerDefinition,
|
|
385
|
+
resolve: (specifier: string) => string = createRequire(import.meta.url).resolve,
|
|
386
|
+
): string | null {
|
|
387
|
+
const pkg = definition.bundledPackage;
|
|
388
|
+
if (!pkg) return null;
|
|
389
|
+
let manifestPath: string;
|
|
390
|
+
let manifest: { bin?: string | Record<string, string> };
|
|
391
|
+
try {
|
|
392
|
+
manifestPath = resolve(`${pkg}/package.json`);
|
|
393
|
+
manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as typeof manifest;
|
|
394
|
+
} catch {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
// `bin` is either a bare string — the package's own name — or a map of command to path.
|
|
398
|
+
const relative = typeof manifest.bin === "string" ? manifest.bin : manifest.bin?.[definition.command];
|
|
399
|
+
if (!relative) return null;
|
|
400
|
+
return path.resolve(path.dirname(manifestPath), relative);
|
|
401
|
+
}
|
|
@@ -10,7 +10,7 @@ import { resolve } from "node:path";
|
|
|
10
10
|
import { mkdirSync, existsSync } from "node:fs";
|
|
11
11
|
import { getPpmDir } from "./ppm-dir.ts";
|
|
12
12
|
|
|
13
|
-
export const SEARCH_INDEX_SCHEMA_VERSION =
|
|
13
|
+
export const SEARCH_INDEX_SCHEMA_VERSION = 2;
|
|
14
14
|
|
|
15
15
|
let db: Database | null = null;
|
|
16
16
|
|
|
@@ -75,6 +75,14 @@ function runMigrations(database: Database): void {
|
|
|
75
75
|
|
|
76
76
|
CREATE INDEX IF NOT EXISTS idx_session_meta_project ON session_meta(project_path);
|
|
77
77
|
`);
|
|
78
|
-
database.exec(`PRAGMA user_version = ${SEARCH_INDEX_SCHEMA_VERSION}`);
|
|
79
78
|
}
|
|
79
|
+
if (row.user_version < 2) {
|
|
80
|
+
// Records which build of the indexer wrote a row. `isStale` compares it, so
|
|
81
|
+
// improving what gets indexed re-indexes every session instead of leaving
|
|
82
|
+
// the old, thinner rows stamped as fresh forever (jsonl_mtime still matches).
|
|
83
|
+
database.exec(
|
|
84
|
+
"ALTER TABLE session_meta ADD COLUMN indexer_version INTEGER NOT NULL DEFAULT 0",
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
database.exec(`PRAGMA user_version = ${SEARCH_INDEX_SCHEMA_VERSION}`);
|
|
80
88
|
}
|
package/src/shared/blame.ts
CHANGED
|
@@ -77,3 +77,54 @@ export function formatRelativeTime(timestampMs: number, now: number = Date.now()
|
|
|
77
77
|
}
|
|
78
78
|
return "just now";
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* What the editor's blame hover shows beyond the one-line annotation: the whole
|
|
83
|
+
* commit message, and the change the commit made to the hovered line.
|
|
84
|
+
*
|
|
85
|
+
* Separate from `BlameCommitInfo` because it costs a `git show` per commit,
|
|
86
|
+
* where the annotation costs one `git blame` per file. It is fetched for the
|
|
87
|
+
* line the cursor is on and nothing else.
|
|
88
|
+
*/
|
|
89
|
+
export interface BlameLineDetail {
|
|
90
|
+
hash: string;
|
|
91
|
+
author: string;
|
|
92
|
+
authorMail: string;
|
|
93
|
+
/** Unix seconds. */
|
|
94
|
+
authorTime: number;
|
|
95
|
+
/** Subject and body, as committed. */
|
|
96
|
+
message: string;
|
|
97
|
+
/** What the commit removed at this line, capped. */
|
|
98
|
+
removed: string[];
|
|
99
|
+
/** The line as this commit wrote it. */
|
|
100
|
+
added: string[];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The absolute date beside the relative one, in GitLens' wording:
|
|
105
|
+
* "December 2nd, 2025 4:17 PM". Both are shown because "9 months ago" is the
|
|
106
|
+
* useful reading and the exact date is the one you need to go looking for a
|
|
107
|
+
* commit.
|
|
108
|
+
*
|
|
109
|
+
* Built by hand rather than with `toLocaleString`, whose output depends on the
|
|
110
|
+
* host's locale and would make the format untestable and inconsistent between
|
|
111
|
+
* the machine serving PPM and the phone reading it.
|
|
112
|
+
*/
|
|
113
|
+
export function formatAbsoluteTime(timestampMs: number): string {
|
|
114
|
+
const d = new Date(timestampMs);
|
|
115
|
+
const months = [
|
|
116
|
+
"January", "February", "March", "April", "May", "June",
|
|
117
|
+
"July", "August", "September", "October", "November", "December",
|
|
118
|
+
];
|
|
119
|
+
const day = d.getDate();
|
|
120
|
+
const hour12 = d.getHours() % 12 || 12;
|
|
121
|
+
const minute = String(d.getMinutes()).padStart(2, "0");
|
|
122
|
+
const meridiem = d.getHours() < 12 ? "AM" : "PM";
|
|
123
|
+
return `${months[d.getMonth()]} ${day}${ordinalSuffix(day)}, ${d.getFullYear()} ${hour12}:${minute} ${meridiem}`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function ordinalSuffix(day: number): string {
|
|
127
|
+
// 11th, 12th, 13th are the exceptions to the last-digit rule.
|
|
128
|
+
if (day % 100 >= 11 && day % 100 <= 13) return "th";
|
|
129
|
+
return ["th", "st", "nd", "rd"][day % 10] ?? "th";
|
|
130
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `file:` URI conversion, shared because both sides need it: the server hands
|
|
3
|
+
* document URIs to language servers, and the browser turns a URI a server
|
|
4
|
+
* returned (a definition, a diagnostic, a reference) back into a path it can
|
|
5
|
+
* open a tab for.
|
|
6
|
+
*
|
|
7
|
+
* The encoding deliberately matches what VS Code puts on the wire, because
|
|
8
|
+
* that is what every language server has been tested against:
|
|
9
|
+
*
|
|
10
|
+
* /home/ada/a b/c.ts -> file:///home/ada/a%20b/c.ts
|
|
11
|
+
* C:\Users\ada\b.ts -> file:///c%3A/Users/ada/b.ts
|
|
12
|
+
*
|
|
13
|
+
* Two details that look like details and are not:
|
|
14
|
+
*
|
|
15
|
+
* - The Windows drive letter is lower-cased. The same file reached as `C:\` and
|
|
16
|
+
* `c:\` must produce one URI, or a diagnostic published for one spelling never
|
|
17
|
+
* clears the markers set under the other.
|
|
18
|
+
* - `/` is not escaped but everything else in a segment is, so a `#` or `?` in a
|
|
19
|
+
* filename cannot truncate the URI into a fragment or a query.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** True for a Windows-style absolute path such as `C:\x` or `C:/x`. */
|
|
23
|
+
function isWindowsAbsolute(path: string): boolean {
|
|
24
|
+
return /^[A-Za-z]:[\\/]/.test(path);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function pathToFileUri(path: string): string {
|
|
28
|
+
const withSlashes = path.replace(/\\/g, "/");
|
|
29
|
+
|
|
30
|
+
if (isWindowsAbsolute(withSlashes)) {
|
|
31
|
+
const drive = withSlashes[0]!.toLowerCase();
|
|
32
|
+
const rest = withSlashes.slice(2); // drop "C:"
|
|
33
|
+
return `file:///${drive}%3A${encodePath(rest)}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// A UNC path (\\server\share) becomes an authority.
|
|
37
|
+
if (withSlashes.startsWith("//")) {
|
|
38
|
+
const [, , authority = "", ...segments] = withSlashes.split("/");
|
|
39
|
+
return `file://${encodeURIComponent(authority)}${encodePath(`/${segments.join("/")}`)}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return `file://${encodePath(withSlashes)}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Percent-encode each segment, leaving the separators alone. */
|
|
46
|
+
function encodePath(path: string): string {
|
|
47
|
+
return path.split("/").map((segment) => encodeURIComponent(segment)).join("/");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Turn a `file:` URI back into an OS path. Returns null for any other scheme —
|
|
52
|
+
* servers legitimately emit `untitled:` and their own custom schemes, and
|
|
53
|
+
* treating one of those as a path would open a tab for a file that never
|
|
54
|
+
* existed.
|
|
55
|
+
*/
|
|
56
|
+
export function fileUriToPath(uri: string): string | null {
|
|
57
|
+
if (!uri.startsWith("file:")) return null;
|
|
58
|
+
|
|
59
|
+
// file:///x, file://host/x, and the malformed-but-common file:/x.
|
|
60
|
+
let rest = uri.slice("file:".length);
|
|
61
|
+
let authority = "";
|
|
62
|
+
if (rest.startsWith("//")) {
|
|
63
|
+
rest = rest.slice(2);
|
|
64
|
+
const slash = rest.indexOf("/");
|
|
65
|
+
authority = slash < 0 ? rest : rest.slice(0, slash);
|
|
66
|
+
rest = slash < 0 ? "" : rest.slice(slash);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const decoded = rest.split("/").map(decodeSegment).join("/");
|
|
70
|
+
|
|
71
|
+
// A drive letter arrives as "/c:/Users/..." and has to lose the leading slash.
|
|
72
|
+
if (/^\/[A-Za-z]:/.test(decoded)) {
|
|
73
|
+
return decoded.slice(1);
|
|
74
|
+
}
|
|
75
|
+
if (authority) {
|
|
76
|
+
return `//${decodeSegment(authority)}${decoded}`;
|
|
77
|
+
}
|
|
78
|
+
return decoded;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function decodeSegment(segment: string): string {
|
|
82
|
+
try {
|
|
83
|
+
return decodeURIComponent(segment);
|
|
84
|
+
} catch {
|
|
85
|
+
// A stray "%" that is not an escape — keep the segment verbatim rather than
|
|
86
|
+
// losing the whole path.
|
|
87
|
+
return segment;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* A comparison key for two URIs that name the same file.
|
|
93
|
+
*
|
|
94
|
+
* Servers do not always echo a URI back byte for byte: casing of an escape
|
|
95
|
+
* (`%3a` vs `%3A`), an unescaped colon, or a Windows drive in the other case
|
|
96
|
+
* all appear in practice. Diagnostics are keyed by URI, so two spellings of one
|
|
97
|
+
* file means markers that are set twice and cleared never.
|
|
98
|
+
*/
|
|
99
|
+
export function uriKey(uri: string): string {
|
|
100
|
+
const path = fileUriToPath(uri);
|
|
101
|
+
if (path === null) return uri;
|
|
102
|
+
const normalized = path.replace(/\\/g, "/");
|
|
103
|
+
return isWindowsAbsolute(normalized)
|
|
104
|
+
// Windows paths are case-insensitive; POSIX paths are not, so only the
|
|
105
|
+
// drive letter is folded.
|
|
106
|
+
? `${normalized[0]!.toLowerCase()}${normalized.slice(1)}`
|
|
107
|
+
: normalized;
|
|
108
|
+
}
|
package/src/web/app.tsx
CHANGED
|
@@ -40,6 +40,7 @@ import { useExtensionWs } from "@/hooks/use-extension-ws";
|
|
|
40
40
|
import { useIsMobile } from "@/hooks/use-is-mobile";
|
|
41
41
|
import { UploadProgressPanel } from "@/components/os-explorer/upload/upload-progress-panel";
|
|
42
42
|
import { cn } from "@/lib/utils";
|
|
43
|
+
import { isRecoveryReloadPending } from "@/lib/chunk-recovery";
|
|
43
44
|
|
|
44
45
|
// Lazy: the explorer feature (views, actions, skins, icon map) is the same heavy bundle the
|
|
45
46
|
// desktop floating window already keeps out of the initial chunk (see `WINDOW_CONTENT`) —
|
|
@@ -148,6 +149,11 @@ export function App() {
|
|
|
148
149
|
useEffect(() => {
|
|
149
150
|
if (authState !== "authenticated") return;
|
|
150
151
|
const handler = (e: BeforeUnloadEvent) => {
|
|
152
|
+
// Except when the app is reloading itself out of a missing chunk. This
|
|
153
|
+
// fires from `vite:preloadError`, before the throw unmounts anything, so
|
|
154
|
+
// the guard is still installed — and "Leave site?" in front of an
|
|
155
|
+
// automatic recovery is a question the user cannot answer usefully.
|
|
156
|
+
if (isRecoveryReloadPending()) return;
|
|
151
157
|
e.preventDefault();
|
|
152
158
|
};
|
|
153
159
|
window.addEventListener("beforeunload", handler);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEffect, useState, useCallback, useRef } from "react";
|
|
2
2
|
import Editor from "@monaco-editor/react";
|
|
3
|
-
import { Save, Undo2, Loader2, AlertTriangle, Lock } from "
|
|
3
|
+
import { Save, Undo2, Loader2, AlertTriangle, Lock } from "@/lib/icons";
|
|
4
4
|
import { useMonacoTheme } from "@/lib/use-monaco-theme";
|
|
5
5
|
import { useAiResourcesStore } from "@/stores/ai-resources-store";
|
|
6
6
|
import { readAiResource, writeAiResource, type AiResourceType, type AiResourceScope } from "@/lib/api-ai-resources";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useMemo, useState } from "react";
|
|
2
|
-
import { RefreshCw, Search, Sparkles, FolderOpen } from "
|
|
2
|
+
import { RefreshCw, Search, Sparkles, FolderOpen } from "@/lib/icons";
|
|
3
3
|
import { SidebarHeader } from "@/components/ui/sidebar-header";
|
|
4
4
|
import { useShallow } from "zustand/react/shallow";
|
|
5
5
|
import { useProjectStore } from "@/stores/project-store";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Plus, Hexagon, Bot, SquareTerminal, Plug, Download } from "
|
|
1
|
+
import { Plus, Hexagon, Bot, SquareTerminal, Plug, Download } from "@/lib/icons";
|
|
2
2
|
import {
|
|
3
3
|
DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator,
|
|
4
4
|
} from "@/components/ui/dropdown-menu";
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
Bug,
|
|
12
12
|
Github,
|
|
13
13
|
Coffee,
|
|
14
|
-
} from "
|
|
14
|
+
} from "@/lib/icons";
|
|
15
15
|
import { useSettingsStore } from "@/stores/settings-store";
|
|
16
16
|
import { useIsMobile } from "@/hooks/use-is-mobile";
|
|
17
17
|
import { openBugReportPopup } from "@/lib/report-bug";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* mobile. Adaptive shell — Dialog on desktop, BottomSheet on mobile.
|
|
6
6
|
*/
|
|
7
7
|
import { useState } from "react";
|
|
8
|
-
import { Globe, Heart, QrCode } from "
|
|
8
|
+
import { Globe, Heart, QrCode } from "@/lib/icons";
|
|
9
9
|
import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog";
|
|
10
10
|
import { BottomSheet } from "@/components/ui/mobile-bottom-sheet";
|
|
11
11
|
import { Button } from "@/components/ui/button";
|