@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useCallback, useMemo } from "react";
|
|
2
|
-
import { Eye, Sparkles, WrapText, ExternalLink, X, GripHorizontal } from "
|
|
2
|
+
import { Eye, Sparkles, WrapText, ExternalLink, X, GripHorizontal } from "@/lib/icons";
|
|
3
3
|
import Editor from "@monaco-editor/react";
|
|
4
|
-
import { Loader2 } from "
|
|
4
|
+
import { Loader2 } from "@/lib/icons";
|
|
5
5
|
import { useMonacoTheme } from "@/lib/use-monaco-theme";
|
|
6
6
|
|
|
7
7
|
export interface PreviewData {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState, useRef } from "react";
|
|
2
|
-
import { Search, X, Trash2, Plus, Columns } from "
|
|
2
|
+
import { Search, X, Trash2, Plus, Columns } from "@/lib/icons";
|
|
3
3
|
import { ExportButton } from "./export-button";
|
|
4
4
|
import { GlideColumnSearch } from "./glide-column-search";
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useEffect, useRef } from "react";
|
|
2
2
|
import { createPortal } from "react-dom";
|
|
3
|
-
import { Filter, Pin, PinOff, ArrowUp, ArrowDown, X } from "
|
|
3
|
+
import { Filter, Pin, PinOff, ArrowUp, ArrowDown, X } from "@/lib/icons";
|
|
4
4
|
|
|
5
5
|
interface HeaderMenuProps {
|
|
6
6
|
colName: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useState, useCallback, useRef, useMemo, memo, lazy, Suspense } from "react";
|
|
2
|
-
import Editor, { type OnMount } from "@monaco-editor/react";
|
|
2
|
+
import Editor, { type Monaco, type OnMount } from "@monaco-editor/react";
|
|
3
3
|
import type * as MonacoType from "monaco-editor";
|
|
4
4
|
import { api, projectUrl } from "@/lib/api-client";
|
|
5
5
|
import { useShallow } from "zustand/react/shallow";
|
|
@@ -9,7 +9,13 @@ import { useSettingsStore } from "@/stores/settings-store";
|
|
|
9
9
|
import { basename } from "@/lib/utils";
|
|
10
10
|
import { useMonacoTheme } from "@/lib/use-monaco-theme";
|
|
11
11
|
import { useInlineBlame } from "@/hooks/use-inline-blame";
|
|
12
|
-
import {
|
|
12
|
+
import { applyBuiltinTypeScript } from "@/lib/lsp/monaco-builtin-typescript";
|
|
13
|
+
import { useIsMobile, isMobileDevice } from "@/hooks/use-is-mobile";
|
|
14
|
+
import { useIsTouchOnly } from "@/hooks/use-is-touch-only";
|
|
15
|
+
import type { EditorLspState } from "./editor-language-service";
|
|
16
|
+
import { EDITOR_FONT_FAMILY, EDITOR_FONT_LIGATURES, EDITOR_FONT_SIZE } from "@/lib/editor-font";
|
|
17
|
+
import { LspStatus } from "./lsp-status";
|
|
18
|
+
import { Loader2, FileWarning, Play, Database, ExternalLink, X, GripHorizontal, ShieldCheck, ShieldOff } from "@/lib/icons";
|
|
13
19
|
import { EditorBreadcrumb } from "./editor-breadcrumb";
|
|
14
20
|
import { EditorToolbar } from "./editor-toolbar";
|
|
15
21
|
import { EditorLanguagePicker } from "./editor-language-picker";
|
|
@@ -25,10 +31,18 @@ import type { DbQueryResult } from "../database/use-database";
|
|
|
25
31
|
// all from these very sets, so they must not be redeclared here.
|
|
26
32
|
import { AUDIO_EXTS, IMAGE_EXTS, SQLITE_EXTS, VIDEO_EXTS } from "@/components/os-explorer/can-open-in-ppm";
|
|
27
33
|
import { onHostResize } from "@/components/floating-window/pip/pip-resize-signal";
|
|
34
|
+
import { DOTENV_LANGUAGE_ID, isDotenvFile, registerDotenvLanguage } from "@/lib/monaco-dotenv-language";
|
|
28
35
|
|
|
29
36
|
const MarkdownRenderer = lazy(() =>
|
|
30
37
|
import("@/components/shared/markdown-renderer").then((m) => ({ default: m.MarkdownRenderer }))
|
|
31
38
|
);
|
|
39
|
+
// Only mounted while the language-server setting is on, which is what keeps
|
|
40
|
+
// the LSP client, the Monaco providers and the conversions out of the chunk
|
|
41
|
+
// that opening a file pulls in. Static-importing anything from that module —
|
|
42
|
+
// even a constant — would put it back.
|
|
43
|
+
const EditorLanguageService = lazy(() =>
|
|
44
|
+
import("./editor-language-service").then((m) => ({ default: m.EditorLanguageService }))
|
|
45
|
+
);
|
|
32
46
|
const CsvPreview = lazy(() => import("./csv-preview").then((m) => ({ default: m.CsvPreview })));
|
|
33
47
|
const ImagePreview = lazy(() => import("./image-preview").then((m) => ({ default: m.ImagePreview })));
|
|
34
48
|
const PdfPreview = lazy(() => import("./pdf-preview").then((m) => ({ default: m.PdfPreview })));
|
|
@@ -52,7 +66,10 @@ function getMonacoLanguage(filename: string): string {
|
|
|
52
66
|
sh: "shell", bash: "shell",
|
|
53
67
|
sql: "sql",
|
|
54
68
|
};
|
|
55
|
-
|
|
69
|
+
// The extension answers first, so `.env.example.md` stays markdown; an env
|
|
70
|
+
// file's suffix is not an extension at all (`.env.test.example`), which is
|
|
71
|
+
// why the name has to be tested as a whole.
|
|
72
|
+
return map[ext] ?? (isDotenvFile(filename) ? DOTENV_LANGUAGE_ID : "plaintext");
|
|
56
73
|
}
|
|
57
74
|
|
|
58
75
|
interface CodeEditorProps {
|
|
@@ -76,14 +93,34 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
76
93
|
const editorRef = useRef<MonacoType.editor.IStandaloneCodeEditor | null>(null);
|
|
77
94
|
// Mirrors editorRef as state, so hooks that must react to the editor existing
|
|
78
95
|
// (inline blame) re-run on mount instead of reading a ref that is still null.
|
|
96
|
+
// `Monaco` rather than `typeof MonacoType`: the bare `monaco-editor` types declare
|
|
97
|
+
// `languages.typescript` as a deprecated stub, and the TypeScript defaults this reaches for
|
|
98
|
+
// are only on the type that includes the language contributions.
|
|
79
99
|
const [mounted, setMounted] = useState<{
|
|
80
100
|
editor: MonacoType.editor.IStandaloneCodeEditor;
|
|
81
|
-
monaco:
|
|
101
|
+
monaco: Monaco;
|
|
82
102
|
} | null>(null);
|
|
83
103
|
const { tabs, updateTab } = useTabStore(useShallow((s) => ({ tabs: s.tabs, updateTab: s.updateTab })));
|
|
84
|
-
const { wordWrap, toggleWordWrap } = useSettingsStore(
|
|
104
|
+
const { wordWrap, toggleWordWrap, mobileWordWrap, toggleMobileWordWrap } = useSettingsStore(
|
|
105
|
+
useShallow((s) => ({
|
|
106
|
+
wordWrap: s.wordWrap, toggleWordWrap: s.toggleWordWrap,
|
|
107
|
+
mobileWordWrap: s.mobileWordWrap, toggleMobileWordWrap: s.toggleMobileWordWrap,
|
|
108
|
+
})),
|
|
109
|
+
);
|
|
85
110
|
const inlineBlame = useSettingsStore((s) => s.inlineBlame);
|
|
86
111
|
const toggleInlineBlame = useSettingsStore((s) => s.toggleInlineBlame);
|
|
112
|
+
const lspEnabled = useSettingsStore((s) => s.lspEnabled);
|
|
113
|
+
const setLspEnabled = useSettingsStore((s) => s.setLspEnabled);
|
|
114
|
+
// The viewport breakpoint, not the `isMobile` further down: that one is
|
|
115
|
+
// `ontouchstart`, which is also true of a touch-screen laptop with every
|
|
116
|
+
// reason to run a language server and enough width to read unwrapped code.
|
|
117
|
+
const isPhone = useIsMobile();
|
|
118
|
+
const isTouchOnly = useIsTouchOnly();
|
|
119
|
+
// A phone's wrap state is its own pref. The toggle for `wordWrap` lives in
|
|
120
|
+
// the desktop-only breadcrumb bar, so a phone had no way to reach it and
|
|
121
|
+
// defaulted to off — the one shape of this setting a narrow screen cannot use.
|
|
122
|
+
const wrapOn = isPhone ? mobileWordWrap : wordWrap;
|
|
123
|
+
const toggleWrap = isPhone ? toggleMobileWordWrap : toggleWordWrap;
|
|
87
124
|
const monacoTheme = useMonacoTheme();
|
|
88
125
|
|
|
89
126
|
const isUntitled = metadata?.isUntitled === true;
|
|
@@ -379,7 +416,9 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
379
416
|
// GitLens-style annotation on the cursor's line. Off unless the pref is on,
|
|
380
417
|
// and never for an untitled buffer or inline (read-only preview) content —
|
|
381
418
|
// neither has a path git could blame.
|
|
382
|
-
|
|
419
|
+
// Never on a phone: it is a `git blame` for every file opened and a
|
|
420
|
+
// `git show` for every hover, on the device least able to pay for either.
|
|
421
|
+
const canBlame = !isUntitled && inlineContent == null && !!filePath && !!projectName && !isPhone;
|
|
383
422
|
const blame = useInlineBlame({
|
|
384
423
|
editor: mounted?.editor ?? null,
|
|
385
424
|
monaco: mounted?.monaco ?? null,
|
|
@@ -388,6 +427,31 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
388
427
|
enabled: inlineBlame && canBlame,
|
|
389
428
|
});
|
|
390
429
|
|
|
430
|
+
// Real language intelligence, from a real language server on the host.
|
|
431
|
+
//
|
|
432
|
+
// Servable is about the buffer: an untitled or inline one has no path, and an
|
|
433
|
+
// external file (outside any project) has no project whose node_modules,
|
|
434
|
+
// tsconfig or go.mod would tell a server what it is looking at, so it gets
|
|
435
|
+
// nothing rather than a server rooted somewhere arbitrary.
|
|
436
|
+
const lspServable = !isUntitled && !isExternalFile && inlineContent == null && !!filePath && !!projectName;
|
|
437
|
+
// Off until asked, and never on a touch-only device. A server is a real process on the
|
|
438
|
+
// host — one `typescript-language-server` was 854 MB resident — so it starts because
|
|
439
|
+
// someone wanted it, not because a file was opened.
|
|
440
|
+
//
|
|
441
|
+
// `useIsTouchOnly` rather than `isPhone`: that one is a 768px viewport test, so narrowing a
|
|
442
|
+
// desktop window past the breakpoint shut the language server down mid-session and dragging
|
|
443
|
+
// it back cold-started another one. What a *machine* should be asked to run cannot depend on
|
|
444
|
+
// how wide a window happens to be.
|
|
445
|
+
// Two questions, deliberately separated. `lspWanted` is about the *device*: the setting is
|
|
446
|
+
// on and this machine can run a server. `lspOn` adds the buffer. Monaco's TypeScript
|
|
447
|
+
// defaults are global to the page, so only the device half may decide them — a scratch
|
|
448
|
+
// buffer no server can serve must not switch the built-in worker back on underneath the
|
|
449
|
+
// project file in the next tab.
|
|
450
|
+
const lspWanted = lspEnabled && !isTouchOnly;
|
|
451
|
+
const lspOn = lspWanted && lspServable;
|
|
452
|
+
const [lsp, setLsp] = useState<EditorLspState>({ status: null, diagnostics: [] });
|
|
453
|
+
const handleLspState = useCallback((next: EditorLspState) => setLsp(next), []);
|
|
454
|
+
|
|
391
455
|
const saveFile = useCallback(
|
|
392
456
|
async (text: string) => {
|
|
393
457
|
if (!filePath) return;
|
|
@@ -402,9 +466,16 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
402
466
|
// The blame line table is keyed by line number, so an edit invalidates
|
|
403
467
|
// it; a save is the point where a fresh one can be had.
|
|
404
468
|
blame.refresh();
|
|
469
|
+
// Servers that only re-analyse on save (gopls by default, several
|
|
470
|
+
// linters) would otherwise keep reporting the previous contents.
|
|
471
|
+
// Dynamically, so the save path does not statically import the LSP
|
|
472
|
+
// client; by the time this runs the chunk is already loaded.
|
|
473
|
+
if (lspOn && projectName && filePath) {
|
|
474
|
+
void import("@/hooks/use-lsp").then((m) => m.notifyLspSave(projectName, filePath, text));
|
|
475
|
+
}
|
|
405
476
|
} catch { /* Silent — unsaved indicator persists */ }
|
|
406
477
|
},
|
|
407
|
-
[filePath, projectName, isExternalFile, blame.refresh], // eslint-disable-line react-hooks/exhaustive-deps
|
|
478
|
+
[filePath, projectName, isExternalFile, lspOn, blame.refresh], // eslint-disable-line react-hooks/exhaustive-deps
|
|
408
479
|
);
|
|
409
480
|
|
|
410
481
|
function handleChange(value: string | undefined) {
|
|
@@ -473,6 +544,25 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
473
544
|
revealTarget();
|
|
474
545
|
}, [revealAt, revealTarget]);
|
|
475
546
|
|
|
547
|
+
/**
|
|
548
|
+
* Monaco's own TypeScript worker is not a fallback *beside* a real server — it is a
|
|
549
|
+
* slower, single-file second answer, and two answers is what put "Loading…" under a hover
|
|
550
|
+
* the server had already given. With no server coming it is the only answer there is, and
|
|
551
|
+
* unregistering it left a fresh desktop install and every phone with nothing at all.
|
|
552
|
+
*
|
|
553
|
+
* An effect rather than a line in the mount handler: the setting can be toggled while an
|
|
554
|
+
* editor is open, and this has to follow it.
|
|
555
|
+
*/
|
|
556
|
+
useEffect(() => {
|
|
557
|
+
const monaco = mounted?.monaco;
|
|
558
|
+
if (!monaco) return;
|
|
559
|
+
applyBuiltinTypeScript(
|
|
560
|
+
lspWanted,
|
|
561
|
+
monaco.languages.typescript.typescriptDefaults,
|
|
562
|
+
monaco.languages.typescript.javascriptDefaults,
|
|
563
|
+
);
|
|
564
|
+
}, [mounted, lspWanted]);
|
|
565
|
+
|
|
476
566
|
const handleEditorMount: OnMount = useCallback((editor, monaco) => {
|
|
477
567
|
editorRef.current = editor;
|
|
478
568
|
monacoInstanceRef.current = monaco;
|
|
@@ -489,18 +579,18 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
489
579
|
}
|
|
490
580
|
editor.addCommand(
|
|
491
581
|
monaco.KeyMod.Alt | monaco.KeyCode.KeyZ,
|
|
492
|
-
() =>
|
|
582
|
+
() => {
|
|
583
|
+
// Read the breakpoint at press time: which of the two prefs this editor
|
|
584
|
+
// is showing depends on the viewport, and the binding outlives a resize.
|
|
585
|
+
const settings = useSettingsStore.getState();
|
|
586
|
+
if (isMobileDevice()) settings.toggleMobileWordWrap();
|
|
587
|
+
else settings.toggleWordWrap();
|
|
588
|
+
},
|
|
493
589
|
);
|
|
494
590
|
editor.addCommand(
|
|
495
591
|
monaco.KeyMod.Alt | monaco.KeyCode.KeyB,
|
|
496
592
|
() => useSettingsStore.getState().toggleInlineBlame(),
|
|
497
593
|
);
|
|
498
|
-
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
|
|
499
|
-
noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true,
|
|
500
|
-
});
|
|
501
|
-
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
|
|
502
|
-
noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true,
|
|
503
|
-
});
|
|
504
594
|
// Register SQL completion if schema available
|
|
505
595
|
if (sqlSchemaInfo) {
|
|
506
596
|
completionDisposable.current?.dispose();
|
|
@@ -695,6 +785,18 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
695
785
|
className="flex flex-col h-full w-full overflow-hidden"
|
|
696
786
|
style={mobileHeight ? { height: `${mobileHeight}px`, maxHeight: `${mobileHeight}px` } : undefined}
|
|
697
787
|
>
|
|
788
|
+
{/* Renders nothing — it is the language server, mounted only when asked. */}
|
|
789
|
+
{lspOn && mounted && filePath && projectName && (
|
|
790
|
+
<Suspense fallback={null}>
|
|
791
|
+
<EditorLanguageService
|
|
792
|
+
editor={mounted.editor}
|
|
793
|
+
monaco={mounted.monaco}
|
|
794
|
+
projectName={projectName}
|
|
795
|
+
filePath={filePath}
|
|
796
|
+
onState={handleLspState}
|
|
797
|
+
/>
|
|
798
|
+
</Suspense>
|
|
799
|
+
)}
|
|
698
800
|
{/* Inline content toolbar (cell viewer mode) */}
|
|
699
801
|
{inlineContent != null && canBeautifyInline && (
|
|
700
802
|
<div className="flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2">
|
|
@@ -713,6 +815,18 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
713
815
|
tabId={tabId}
|
|
714
816
|
className="flex items-center flex-1 min-w-0 overflow-x-auto scrollbar-none px-2 gap-0.5"
|
|
715
817
|
/>
|
|
818
|
+
{/* `lspWanted`, not `lspServable` alone: on a touch-only device no server
|
|
819
|
+
runs whatever the setting says, so a chip there offers a switch that
|
|
820
|
+
changes nothing — and turning it on hides the chip itself, leaving no
|
|
821
|
+
way back to it. */}
|
|
822
|
+
{lspServable && !isTouchOnly && (
|
|
823
|
+
<LspStatus
|
|
824
|
+
enabled={lspWanted}
|
|
825
|
+
onToggle={setLspEnabled}
|
|
826
|
+
status={lsp.status}
|
|
827
|
+
diagnostics={lsp.diagnostics}
|
|
828
|
+
/>
|
|
829
|
+
)}
|
|
716
830
|
<EditorLanguagePicker value={effectiveLanguage} onChange={handleLanguageChange} />
|
|
717
831
|
{sqlPickerBar}
|
|
718
832
|
<EditorToolbar
|
|
@@ -721,8 +835,8 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
721
835
|
onMdModeChange={setMdMode}
|
|
722
836
|
csvMode={csvMode}
|
|
723
837
|
onCsvModeChange={setCsvMode}
|
|
724
|
-
wordWrap={
|
|
725
|
-
onToggleWordWrap={
|
|
838
|
+
wordWrap={wrapOn}
|
|
839
|
+
onToggleWordWrap={toggleWrap}
|
|
726
840
|
inlineBlame={inlineBlame}
|
|
727
841
|
onToggleInlineBlame={canBlame ? toggleInlineBlame : undefined}
|
|
728
842
|
blameStale={blame.stale}
|
|
@@ -749,7 +863,7 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
749
863
|
{/* Content area */}
|
|
750
864
|
{isCsv && csvMode === "table" ? (
|
|
751
865
|
<Suspense fallback={<div className="flex items-center justify-center h-full"><Loader2 className="size-5 animate-spin text-text-subtle" /></div>}>
|
|
752
|
-
<CsvPreview content={content ?? ""} onContentChange={handleChange} wordWrap={
|
|
866
|
+
<CsvPreview content={content ?? ""} onContentChange={handleChange} wordWrap={wrapOn} />
|
|
753
867
|
</Suspense>
|
|
754
868
|
) : isMarkdown && mdMode === "preview" ? (
|
|
755
869
|
<MarkdownPreview content={content ?? ""} />
|
|
@@ -759,14 +873,19 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
759
873
|
height="100%"
|
|
760
874
|
key={effectiveLanguage}
|
|
761
875
|
language={effectiveLanguage}
|
|
876
|
+
// Before, not on, mount: the model is created with its language
|
|
877
|
+
// id first, and a model created against an unregistered id is
|
|
878
|
+
// plaintext for good.
|
|
879
|
+
beforeMount={registerDotenvLanguage}
|
|
762
880
|
value={content ?? ""}
|
|
763
881
|
onChange={inlineContent != null ? undefined : handleChange}
|
|
764
882
|
onMount={handleEditorMount}
|
|
765
883
|
theme={monacoTheme}
|
|
766
884
|
options={{
|
|
767
|
-
fontSize:
|
|
768
|
-
fontFamily:
|
|
769
|
-
|
|
885
|
+
fontSize: EDITOR_FONT_SIZE,
|
|
886
|
+
fontFamily: EDITOR_FONT_FAMILY,
|
|
887
|
+
fontLigatures: EDITOR_FONT_LIGATURES,
|
|
888
|
+
wordWrap: wrapOn ? "on" : "off",
|
|
770
889
|
minimap: { enabled: false },
|
|
771
890
|
scrollBeyondLastLine: false,
|
|
772
891
|
automaticLayout: true,
|
|
@@ -774,6 +893,26 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
774
893
|
folding: true,
|
|
775
894
|
bracketPairColorization: { enabled: true },
|
|
776
895
|
readOnly: inlineContent != null,
|
|
896
|
+
|
|
897
|
+
// VS Code's defaults for the things a language server drives.
|
|
898
|
+
// Monaco ships several of these off, which makes real
|
|
899
|
+
// intelligence look absent even once a server is answering.
|
|
900
|
+
quickSuggestions: { other: true, comments: false, strings: false },
|
|
901
|
+
suggestOnTriggerCharacters: true,
|
|
902
|
+
acceptSuggestionOnEnter: "on",
|
|
903
|
+
suggestSelection: "first",
|
|
904
|
+
parameterHints: { enabled: true },
|
|
905
|
+
inlayHints: { enabled: "on" },
|
|
906
|
+
// Standalone Monaco hardcodes its themes' `semanticHighlighting`
|
|
907
|
+
// to false and the default here follows the theme, so this is the
|
|
908
|
+
// only switch that turns server token colouring on at all.
|
|
909
|
+
"semanticHighlighting.enabled": true,
|
|
910
|
+
// Sticky scroll costs a row of vertical space, which is free on a
|
|
911
|
+
// desktop and expensive on a phone.
|
|
912
|
+
stickyScroll: { enabled: !isMobile },
|
|
913
|
+
// The peek and references widgets are how a cross-file result is
|
|
914
|
+
// read; the default height shows barely two lines.
|
|
915
|
+
peekWidgetDefaultFocus: "editor",
|
|
777
916
|
}}
|
|
778
917
|
loading={<Loader2 className="size-5 animate-spin text-text-subtle" />}
|
|
779
918
|
/>
|
|
@@ -791,7 +930,14 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
|
|
|
791
930
|
)}
|
|
792
931
|
|
|
793
932
|
{/* Mobile toolbar — bottom, like terminal */}
|
|
794
|
-
{isMobile &&
|
|
933
|
+
{isMobile && (
|
|
934
|
+
<EditorMobileToolbar
|
|
935
|
+
editorRef={editorRef}
|
|
936
|
+
readOnly={inlineContent != null}
|
|
937
|
+
wrapOn={wrapOn}
|
|
938
|
+
onToggleWrap={toggleWrap}
|
|
939
|
+
/>
|
|
940
|
+
)}
|
|
795
941
|
|
|
796
942
|
{/* Save As dialog for untitled tabs */}
|
|
797
943
|
{showSaveAs && (
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState, useMemo, useEffect, useRef } from "react";
|
|
2
|
-
import { Columns2, FileCode, X } from "
|
|
2
|
+
import { Columns2, FileCode, X } from "@/lib/icons";
|
|
3
3
|
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
|
|
4
4
|
import { useTabStore } from "@/stores/tab-store";
|
|
5
5
|
import { useFileStore } from "@/stores/file-store";
|
|
@@ -4,9 +4,12 @@ import type * as MonacoType from "monaco-editor";
|
|
|
4
4
|
import { api, projectUrl } from "@/lib/api-client";
|
|
5
5
|
import { useShallow } from "zustand/react/shallow";
|
|
6
6
|
import { useSettingsStore } from "@/stores/settings-store";
|
|
7
|
+
import { useIsMobile } from "@/hooks/use-is-mobile";
|
|
7
8
|
import { useMonacoTheme } from "@/lib/use-monaco-theme";
|
|
9
|
+
import { EDITOR_FONT_FAMILY, EDITOR_FONT_LIGATURES, EDITOR_FONT_SIZE } from "@/lib/editor-font";
|
|
8
10
|
import { onHostResize } from "@/components/floating-window/pip/pip-resize-signal";
|
|
9
|
-
import { Loader2 } from "
|
|
11
|
+
import { Loader2 } from "@/lib/icons";
|
|
12
|
+
import { DOTENV_LANGUAGE_ID, isDotenvFile, registerDotenvLanguage } from "@/lib/monaco-dotenv-language";
|
|
10
13
|
|
|
11
14
|
function getMonacoLanguage(filename: string): string {
|
|
12
15
|
const ext = filename.split(".").pop()?.toLowerCase() ?? "";
|
|
@@ -22,7 +25,7 @@ function getMonacoLanguage(filename: string): string {
|
|
|
22
25
|
rb: "ruby", php: "php", swift: "swift",
|
|
23
26
|
sql: "sql", xml: "xml", toml: "toml",
|
|
24
27
|
};
|
|
25
|
-
return map[ext] ?? "plaintext";
|
|
28
|
+
return map[ext] ?? (isDotenvFile(filename) ? DOTENV_LANGUAGE_ID : "plaintext");
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
interface ConflictRegion {
|
|
@@ -102,7 +105,11 @@ export function ConflictEditor({ metadata }: ConflictEditorProps) {
|
|
|
102
105
|
const widgetsRef = useRef<MonacoType.editor.IContentWidget[]>([]);
|
|
103
106
|
const decorationsRef = useRef<MonacoType.editor.IEditorDecorationsCollection | null>(null);
|
|
104
107
|
|
|
105
|
-
|
|
108
|
+
// A phone keeps its own wrap answer, and defaults to wrapping.
|
|
109
|
+
const { wordWrap, mobileWordWrap } = useSettingsStore(
|
|
110
|
+
useShallow((s) => ({ wordWrap: s.wordWrap, mobileWordWrap: s.mobileWordWrap })),
|
|
111
|
+
);
|
|
112
|
+
const wrapOn = useIsMobile() ? mobileWordWrap : wordWrap;
|
|
106
113
|
const monacoTheme = useMonacoTheme();
|
|
107
114
|
|
|
108
115
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
@@ -353,13 +360,15 @@ export function ConflictEditor({ metadata }: ConflictEditorProps) {
|
|
|
353
360
|
<Editor
|
|
354
361
|
height={containerHeight}
|
|
355
362
|
language={language}
|
|
363
|
+
beforeMount={registerDotenvLanguage}
|
|
356
364
|
value={content}
|
|
357
365
|
onMount={handleMount}
|
|
358
366
|
theme={monacoTheme}
|
|
359
367
|
options={{
|
|
360
|
-
fontSize:
|
|
361
|
-
fontFamily:
|
|
362
|
-
|
|
368
|
+
fontSize: EDITOR_FONT_SIZE,
|
|
369
|
+
fontFamily: EDITOR_FONT_FAMILY,
|
|
370
|
+
fontLigatures: EDITOR_FONT_LIGATURES,
|
|
371
|
+
wordWrap: wrapOn ? "on" : "off",
|
|
363
372
|
glyphMargin: true,
|
|
364
373
|
readOnly: false,
|
|
365
374
|
automaticLayout: true,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "@tanstack/react-table";
|
|
10
10
|
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
11
11
|
import { parseCsv, serializeCsv } from "@/lib/csv-parser";
|
|
12
|
-
import { ArrowUp, ArrowDown } from "
|
|
12
|
+
import { ArrowUp, ArrowDown } from "@/lib/icons";
|
|
13
13
|
|
|
14
14
|
interface CsvPreviewProps {
|
|
15
15
|
content: string;
|
|
@@ -4,9 +4,12 @@ import { api, projectUrl } from "@/lib/api-client";
|
|
|
4
4
|
import { useShallow } from "zustand/react/shallow";
|
|
5
5
|
import { useSettingsStore } from "@/stores/settings-store";
|
|
6
6
|
import { useMonacoTheme } from "@/lib/use-monaco-theme";
|
|
7
|
+
import { EDITOR_FONT_FAMILY, EDITOR_FONT_LIGATURES, EDITOR_FONT_SIZE } from "@/lib/editor-font";
|
|
8
|
+
import { useGitRepo } from "@/hooks/use-git-repo";
|
|
7
9
|
import { onHostResize } from "@/components/floating-window/pip/pip-resize-signal";
|
|
8
|
-
import { Loader2, FileCode, WrapText, UserRound } from "
|
|
10
|
+
import { Loader2, FileCode, WrapText, UserRound } from "@/lib/icons";
|
|
9
11
|
import { useInlineBlame } from "@/hooks/use-inline-blame";
|
|
12
|
+
import { DOTENV_LANGUAGE_ID, isDotenvFile, registerDotenvLanguage } from "@/lib/monaco-dotenv-language";
|
|
10
13
|
|
|
11
14
|
function getMonacoLanguage(filename: string): string {
|
|
12
15
|
const ext = filename.split(".").pop()?.toLowerCase() ?? "";
|
|
@@ -19,7 +22,7 @@ function getMonacoLanguage(filename: string): string {
|
|
|
19
22
|
yaml: "yaml", yml: "yaml",
|
|
20
23
|
sh: "shell", bash: "shell",
|
|
21
24
|
};
|
|
22
|
-
return map[ext] ?? "plaintext";
|
|
25
|
+
return map[ext] ?? (isDotenvFile(filename) ? DOTENV_LANGUAGE_ID : "plaintext");
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
interface DiffViewerProps {
|
|
@@ -43,8 +46,14 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
43
46
|
const [fullFileDiff, setFullFileDiff] = useState<{ original: string; modified: string } | null>(null);
|
|
44
47
|
const [loading, setLoading] = useState(!isInline);
|
|
45
48
|
const [error, setError] = useState<string | null>(null);
|
|
46
|
-
const { wordWrap, toggleWordWrap } = useSettingsStore(
|
|
49
|
+
const { wordWrap, toggleWordWrap, mobileWordWrap, toggleMobileWordWrap } = useSettingsStore(
|
|
50
|
+
useShallow((s) => ({
|
|
51
|
+
wordWrap: s.wordWrap, toggleWordWrap: s.toggleWordWrap,
|
|
52
|
+
mobileWordWrap: s.mobileWordWrap, toggleMobileWordWrap: s.toggleMobileWordWrap,
|
|
53
|
+
})),
|
|
54
|
+
);
|
|
47
55
|
const monacoTheme = useMonacoTheme();
|
|
56
|
+
const gitRepo = useGitRepo(projectName);
|
|
48
57
|
|
|
49
58
|
// Measure container height — Monaco needs explicit pixel height on mobile
|
|
50
59
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
@@ -108,12 +117,17 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
108
117
|
// Monaco DiffEditor computes the diff itself, giving full-file view instead
|
|
109
118
|
// of just the changed hunks + 3 lines of context that `git diff` returns.
|
|
110
119
|
if (filePath) {
|
|
111
|
-
|
|
120
|
+
// git is being run inside the repository, which for a container project
|
|
121
|
+
// is a subfolder — so the path it is asked about has to be relative to
|
|
122
|
+
// that, and a file outside it has no diff to show.
|
|
123
|
+
const inRepo = gitRepo.repoPath(filePath);
|
|
124
|
+
if (inRepo == null) { setLoading(false); return; }
|
|
125
|
+
const params = new URLSearchParams({ file: inRepo });
|
|
112
126
|
if (ref1) params.set("ref", ref1);
|
|
113
127
|
if (ref2) params.set("ref2", ref2);
|
|
114
128
|
api
|
|
115
129
|
.get<{ original: string; modified: string }>(
|
|
116
|
-
|
|
130
|
+
gitRepo.gitUrl(`/file-full-diff?${params}`),
|
|
117
131
|
)
|
|
118
132
|
.then((data) => { setFullFileDiff(data); setLoading(false); })
|
|
119
133
|
.catch((err) => { setError(err instanceof Error ? err.message : "Failed to load diff"); setLoading(false); });
|
|
@@ -125,16 +139,16 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
125
139
|
const params = new URLSearchParams();
|
|
126
140
|
if (ref1) params.set("ref1", ref1);
|
|
127
141
|
if (ref2) params.set("ref2", ref2);
|
|
128
|
-
url =
|
|
142
|
+
url = gitRepo.gitUrl(`/diff?${params}`);
|
|
129
143
|
} else {
|
|
130
|
-
url =
|
|
144
|
+
url = gitRepo.gitUrl("/diff");
|
|
131
145
|
}
|
|
132
146
|
|
|
133
147
|
api
|
|
134
148
|
.get<{ diff: string }>(url)
|
|
135
149
|
.then((data) => { setDiffText(data.diff); setLoading(false); })
|
|
136
150
|
.catch((err) => { setError(err instanceof Error ? err.message : "Failed to load diff"); setLoading(false); });
|
|
137
|
-
}, [filePath, projectName, ref1, ref2, file1, file2, isInline]);
|
|
151
|
+
}, [filePath, projectName, ref1, ref2, file1, file2, isInline, gitRepo]);
|
|
138
152
|
|
|
139
153
|
const { original, modified } = useMemo(() => {
|
|
140
154
|
if (isInline) return { original: inlineOriginal ?? "", modified: inlineModified ?? "" };
|
|
@@ -152,6 +166,13 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
152
166
|
const inlineBlame = useSettingsStore((s) => s.inlineBlame);
|
|
153
167
|
const toggleInlineBlame = useSettingsStore((s) => s.toggleInlineBlame);
|
|
154
168
|
|
|
169
|
+
const isMobile = typeof window !== "undefined" && window.innerWidth < 768;
|
|
170
|
+
// A phone wraps by default and keeps its own answer: the desktop pref is
|
|
171
|
+
// shared across devices, and a 27-inch monitor's "no wrap" is not a 6-inch
|
|
172
|
+
// screen's.
|
|
173
|
+
const wrapOn = isMobile ? mobileWordWrap : wordWrap;
|
|
174
|
+
const toggleWrap = isMobile ? toggleMobileWordWrap : toggleWordWrap;
|
|
175
|
+
|
|
155
176
|
/**
|
|
156
177
|
* Blame is only honest on the full-file path.
|
|
157
178
|
*
|
|
@@ -162,7 +183,9 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
162
183
|
* its line 40 is not the file's line 40 — annotating it would confidently
|
|
163
184
|
* name the wrong commit.
|
|
164
185
|
*/
|
|
165
|
-
|
|
186
|
+
// Not on a phone: an annotation on every focused line is a `git blame` per
|
|
187
|
+
// file and a `git show` per hover, on the device least able to pay for either.
|
|
188
|
+
const canBlame = Boolean(projectName && filePath && fullFileDiff) && !isMobile;
|
|
166
189
|
|
|
167
190
|
// The left pane is the file at `ref1` (the route defaults to HEAD); the right
|
|
168
191
|
// is `ref2`, or the working tree when there is none.
|
|
@@ -186,7 +209,6 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
186
209
|
});
|
|
187
210
|
|
|
188
211
|
// Force inline on mobile (<768px) since side-by-side is too narrow
|
|
189
|
-
const isMobile = typeof window !== "undefined" && window.innerWidth < 768;
|
|
190
212
|
const renderSideBySide = !isMobile;
|
|
191
213
|
|
|
192
214
|
// Sync word wrap on both sub-editors.
|
|
@@ -198,11 +220,11 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
198
220
|
useEffect(() => {
|
|
199
221
|
const editor = diffEditorRef.current;
|
|
200
222
|
if (!editor) return;
|
|
201
|
-
const val: "on" | "off" =
|
|
223
|
+
const val: "on" | "off" = wrapOn ? "on" : "off";
|
|
202
224
|
editor.updateOptions({ diffWordWrap: val });
|
|
203
225
|
editor.getOriginalEditor().updateOptions({ wordWrapOverride2: val } as any);
|
|
204
226
|
editor.getModifiedEditor().updateOptions({ wordWrapOverride2: val } as any);
|
|
205
|
-
}, [
|
|
227
|
+
}, [wrapOn, editorReady]);
|
|
206
228
|
|
|
207
229
|
if (!projectName && !isInline) {
|
|
208
230
|
return (
|
|
@@ -241,34 +263,33 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
241
263
|
return (
|
|
242
264
|
<div className="flex flex-col h-full">
|
|
243
265
|
{/* Toolbar */}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
{
|
|
257
|
-
{
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
</div>
|
|
265
|
-
)}
|
|
266
|
+
<div className="flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0">
|
|
267
|
+
{canBlame && (
|
|
268
|
+
<button type="button" onClick={toggleInlineBlame}
|
|
269
|
+
title="Inline blame (Alt+B) — who last touched the cursor's line. Click a pane to annotate that side."
|
|
270
|
+
className={`flex items-center justify-center rounded hover:bg-muted active:scale-95 transition-colors p-1 ${
|
|
271
|
+
inlineBlame ? "bg-muted text-foreground" : ""
|
|
272
|
+
}`}
|
|
273
|
+
>
|
|
274
|
+
<UserRound className="size-3.5" />
|
|
275
|
+
</button>
|
|
276
|
+
)}
|
|
277
|
+
<button type="button" onClick={toggleWrap}
|
|
278
|
+
title={wrapOn ? "Wrapping long lines — tap to scroll sideways instead" : "Toggle word wrap"}
|
|
279
|
+
className={`flex items-center justify-center rounded hover:bg-muted active:scale-95 transition-colors ${
|
|
280
|
+
isMobile ? "size-11" : "p-1"
|
|
281
|
+
} ${wrapOn ? "bg-muted text-foreground" : ""}`}
|
|
282
|
+
>
|
|
283
|
+
<WrapText className="size-3.5" />
|
|
284
|
+
</button>
|
|
285
|
+
</div>
|
|
266
286
|
{/* Monaco DiffEditor */}
|
|
267
287
|
<div ref={containerRef} className="flex-1 overflow-hidden">
|
|
268
288
|
{containerHeight && containerHeight > 0 ? (
|
|
269
289
|
<DiffEditor
|
|
270
290
|
height={containerHeight}
|
|
271
291
|
language={language}
|
|
292
|
+
beforeMount={registerDotenvLanguage}
|
|
272
293
|
original={original}
|
|
273
294
|
modified={modified}
|
|
274
295
|
theme={monacoTheme}
|
|
@@ -288,9 +309,10 @@ export function DiffViewer({ metadata }: DiffViewerProps) {
|
|
|
288
309
|
);
|
|
289
310
|
}}
|
|
290
311
|
options={{
|
|
291
|
-
fontSize: isMobile ? 11 :
|
|
292
|
-
fontFamily:
|
|
293
|
-
|
|
312
|
+
fontSize: isMobile ? 11 : EDITOR_FONT_SIZE,
|
|
313
|
+
fontFamily: EDITOR_FONT_FAMILY,
|
|
314
|
+
fontLigatures: EDITOR_FONT_LIGATURES,
|
|
315
|
+
diffWordWrap: wrapOn ? "on" : "off",
|
|
294
316
|
renderSideBySide,
|
|
295
317
|
useInlineViewWhenSpaceIsLimited: false,
|
|
296
318
|
readOnly: true,
|