@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.
Files changed (968) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/CLAUDE.md +42 -1
  3. package/LICENSE +5 -0
  4. package/THIRD-PARTY-NOTICES.md +83 -0
  5. package/assets/skills/ppm/SKILL.md +1 -1
  6. package/assets/skills/ppm/references/http-api.md +1 -1
  7. package/bun.lock +38 -7
  8. package/dist/web/assets/KaTeX_Size3-Regular-gV2CO0n9.woff2 +0 -0
  9. package/dist/web/assets/accounts-settings-section-BuxD9zH3.js +1 -0
  10. package/dist/web/assets/ai-resource-editor-F09pf8Hd.js +1 -0
  11. package/dist/web/assets/ai-settings-section-Dd9tOUp0.js +1 -0
  12. package/dist/web/assets/ai-settings-section-FrU2X8Fu.js +1 -0
  13. package/dist/web/assets/{angular-html-CTx8qAkv.js → angular-html-DkR4iCth.js} +1 -1
  14. package/dist/web/assets/{angular-ts-BhBGUAnu.js → angular-ts-DcyL4Chx.js} +1 -1
  15. package/dist/web/assets/api-client-BUCo1lms.js +1 -0
  16. package/dist/web/assets/{api-settings-CqiVKFUX.js → api-settings-BcNjZIvG.js} +1 -1
  17. package/dist/web/assets/{api-themes-DtLXqXpC.js → api-themes-DBfyVUtX.js} +1 -1
  18. package/dist/web/assets/{apl-Dec3pSzF.js → apl-BVlrVtjt.js} +1 -1
  19. package/dist/web/assets/appearance-settings-section-whgnq3ss.js +1 -0
  20. package/dist/web/assets/architecture-PBZL5I3N-5K0wEkAn.js +1 -0
  21. package/dist/web/assets/{astro-Cb_3-S86.js → astro-MjJlozLj.js} +1 -1
  22. package/dist/web/assets/audio-preview-Bc54GCAV.js +1 -0
  23. package/dist/web/assets/{blade-1QMj5JxI.js → blade-DnJWi1fz.js} +1 -1
  24. package/dist/web/assets/{bsl-D0bT3Wjp.js → bsl-DCmJxSIz.js} +1 -1
  25. package/dist/web/assets/{button-DhnNoqpV.js → button-VW4QGKCn.js} +1 -1
  26. package/dist/web/assets/{cairo-DTuGb2w7.js → cairo-C8dDenub.js} +1 -1
  27. package/dist/web/assets/chat-tab-Cr6_KSGO.js +15 -0
  28. package/dist/web/assets/{cobol-DSx_Nb7T.js → cobol-DPx_nifl.js} +1 -1
  29. package/dist/web/assets/code-editor-DfmlGamv.js +7 -0
  30. package/dist/web/assets/codex-daily-guard-CfybHv_c.js +1 -0
  31. package/dist/web/assets/{coffee-DBcQ7DKB.js → coffee-DvFzqhgN.js} +1 -1
  32. package/dist/web/assets/conflict-editor-DenQUOT2.js +19 -0
  33. package/dist/web/assets/context-menu-DOODKZdF.js +1 -0
  34. package/dist/web/assets/{cpp-Bj1azGr-.js → cpp-BLJN0umi.js} +1 -1
  35. package/dist/web/assets/{crystal-CCgkDI0i.js → crystal-BXR-9fGw.js} +1 -1
  36. package/dist/web/assets/csv-preview-CClrJOuR.js +2 -0
  37. package/dist/web/assets/{data-grid-overlay-editor-C2NAQ-88.js → data-grid-overlay-editor-D4fhcMfT.js} +1 -1
  38. package/dist/web/assets/database-viewer-DItjm8wB.js +1 -0
  39. package/dist/web/assets/dialog-DQTn55Mt.js +1 -0
  40. package/dist/web/assets/diff-viewer-BpNj7pN9.js +4 -0
  41. package/dist/web/assets/docx-preview-DYBkiUaE.js +12 -0
  42. package/dist/web/assets/{edge-ClBfeO7z.js → edge-rWOlCmXT.js} +1 -1
  43. package/dist/web/assets/{edit-diff-preview-CRjufuw_.js → edit-diff-preview-COtmo54G.js} +1 -1
  44. package/dist/web/assets/editor-font-BDrdiGf1.js +1 -0
  45. package/dist/web/assets/editor-language-service-DxkZ51E5.js +1 -0
  46. package/dist/web/assets/{elixir-ir__-3kt.js → elixir-E7Y82okW.js} +1 -1
  47. package/dist/web/assets/{elm-CUv-xMuU.js → elm-DTPGbc-w.js} +1 -1
  48. package/dist/web/assets/{erb-DcRwHyUq.js → erb-DHqLHrE6.js} +1 -1
  49. package/dist/web/assets/{erlang-DW-GAdmv.js → erlang-Byg0nNiV.js} +1 -1
  50. package/dist/web/assets/{esm-DBm5LSCw.js → esm-D_DmOM7n.js} +1 -1
  51. package/dist/web/assets/explorer-body-D-5z464e.js +2 -0
  52. package/dist/web/assets/explorer-window-content-7-1wuRul.js +1 -0
  53. package/dist/web/assets/extension-manager-section-BhwB6nqr.js +1 -0
  54. package/dist/web/assets/extension-webview-DI4VL2tJ.js +12 -0
  55. package/dist/web/assets/file-icons-EzPL0q-k.js +1 -0
  56. package/dist/web/assets/file-icons.generated-CfaJuvZu.css +1 -0
  57. package/dist/web/assets/file-store-DMABxOkV.js +1 -0
  58. package/dist/web/assets/files-settings-section-CZzABuKz.js +1 -0
  59. package/dist/web/assets/format-file-meta-DOpzJJhS.js +1 -0
  60. package/dist/web/assets/{fortran-fixed-form-DrQbMSkt.js → fortran-fixed-form-CY1n0Xf6.js} +1 -1
  61. package/dist/web/assets/{fsharp-DvDj84Ys.js → fsharp-_vEDSCJz.js} +1 -1
  62. package/dist/web/assets/{gdresource-CPgY7R2s.js → gdresource-B6XT0wAC.js} +1 -1
  63. package/dist/web/assets/geist-cyrillic-ext-wght-italic-BYAq_K0C.woff2 +0 -0
  64. package/dist/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  65. package/dist/web/assets/geist-cyrillic-wght-italic-Da0gXVk3.woff2 +0 -0
  66. package/dist/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  67. package/dist/web/assets/geist-latin-ext-wght-italic-XgKbg5n7.woff2 +0 -0
  68. package/dist/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  69. package/dist/web/assets/geist-latin-wght-italic-dTnRTFFJ.woff2 +0 -0
  70. package/dist/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  71. package/dist/web/assets/geist-vietnamese-wght-italic-0fly6zkB.woff2 +0 -0
  72. package/dist/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  73. package/dist/web/assets/general-settings-section-BcxwiZ0X.js +1 -0
  74. package/dist/web/assets/{git-commit-NJ9iGbTd.js → git-commit-Wk9ovq59.js} +1 -1
  75. package/dist/web/assets/git-log-panel-CRN4JVOx.js +1 -0
  76. package/dist/web/assets/{git-rebase-DBSy9OKE.js → git-rebase-DSarGPvK.js} +1 -1
  77. package/dist/web/assets/git-repo-store-Dy69YCHN.js +1 -0
  78. package/dist/web/assets/gitGraph-HDMCJU4V-DkVT2MAM.js +1 -0
  79. package/dist/web/assets/glide-data-grid-BvgAqSUr.js +141 -0
  80. package/dist/web/assets/{glimmer-js-EGWSSdwJ.js → glimmer-js-CkYI35_P.js} +1 -1
  81. package/dist/web/assets/{glimmer-ts-BpfXRYRV.js → glimmer-ts-BqmIZcds.js} +1 -1
  82. package/dist/web/assets/{glsl-BtWQ4j8X.js → glsl-Be-yBCF5.js} +1 -1
  83. package/dist/web/assets/{graphql-DHR5AO2c.js → graphql-a5DrENHY.js} +1 -1
  84. package/dist/web/assets/group-chat-tab-DFa5mAx5.js +1 -0
  85. package/dist/web/assets/{hack-A3iOItmC.js → hack-BLAg20aD.js} +1 -1
  86. package/dist/web/assets/{haml-DXA8NXfZ.js → haml-Dj6bGOQH.js} +1 -1
  87. package/dist/web/assets/{handlebars-BdIFK4pP.js → handlebars-dmEa36Oh.js} +1 -1
  88. package/dist/web/assets/{html-derivative-Cd_vDV4L.js → html-derivative-lLi3-RNT.js} +1 -1
  89. package/dist/web/assets/{html-BTA4eRkb.js → html-yacZYzSE.js} +1 -1
  90. package/dist/web/assets/{http-CMY5fp9k.js → http-1KaxcE4e.js} +1 -1
  91. package/dist/web/assets/{hurl-DJZLRi6K.js → hurl-ST-dEEZR.js} +1 -1
  92. package/dist/web/assets/{hxml-C2EdtM37.js → hxml-CpDtuq__.js} +1 -1
  93. package/dist/web/assets/icons-DQjqk0lJ.js +1 -0
  94. package/dist/web/assets/image-preview-CJVxL0uH.js +1 -0
  95. package/dist/web/assets/index-D7DbXD3G.css +1 -0
  96. package/dist/web/assets/index-ZtfxZOyb.js +52 -0
  97. package/dist/web/assets/info-3K5VOQVL-BBsmKGzA.js +1 -0
  98. package/dist/web/assets/input-D-dR8RI6.js +1 -0
  99. package/dist/web/assets/{jinja-DWU92jHm.js → jinja-Cjw-evAn.js} +1 -1
  100. package/dist/web/assets/{jira-watcher-section-BhQzWJ3r.js → jira-watcher-section-DIC1yIV3.js} +1 -1
  101. package/dist/web/assets/{jison-Bt3f5-S6.js → jison-DfATMYoY.js} +1 -1
  102. package/dist/web/assets/{julia-BS-e0jQg.js → julia-DDCaxiqT.js} +1 -1
  103. package/dist/web/assets/{just-OU89Ot3I.js → just-CJL529u6.js} +1 -1
  104. package/dist/web/assets/keybindings-store-tVfhPANS.js +1 -0
  105. package/dist/web/assets/keyboard-shortcuts-section-BW03P3AF.js +1 -0
  106. package/dist/web/assets/{latex-Bt5mTs31.js → latex-Zc4EpLpW.js} +1 -1
  107. package/dist/web/assets/{liquid-C03IGCJ6.js → liquid-B_6KMNYS.js} +1 -1
  108. package/dist/web/assets/{lua-Dl4zPu0P.js → lua-BtS2idK7.js} +1 -1
  109. package/dist/web/assets/markdown-renderer-CvL1pWeK.js +3 -0
  110. package/dist/web/assets/markdown-renderer-sJNNVhlS.js +1 -0
  111. package/dist/web/assets/{marko-BEnkIoHY.js → marko-Wk6LBnck.js} +1 -1
  112. package/dist/web/assets/{mdc-DGglct19.js → mdc-cRaXBrzL.js} +1 -1
  113. package/dist/web/assets/{media-url-LiPp2UsV.js → media-url-DL8OCGGg.js} +1 -1
  114. package/dist/web/assets/{mobile-bottom-sheet-BizNfPAu.js → mobile-bottom-sheet-CoUauvLF.js} +1 -1
  115. package/dist/web/assets/mobile-explorer-sheet-CZ0HZ2E_.js +1 -0
  116. package/dist/web/assets/monaco-dotenv-language-BDYnKcnr.js +1 -0
  117. package/dist/web/assets/monaspace-argon-latin-400-italic-DHf095HZ.woff2 +0 -0
  118. package/dist/web/assets/monaspace-argon-latin-400-italic-DZMiIHEH.woff +0 -0
  119. package/dist/web/assets/monaspace-argon-latin-400-normal-DZUN4ACH.woff +0 -0
  120. package/dist/web/assets/monaspace-argon-latin-400-normal-RS-2TGNg.woff2 +0 -0
  121. package/dist/web/assets/monaspace-argon-latin-700-normal-4y--rLW1.woff +0 -0
  122. package/dist/web/assets/monaspace-argon-latin-700-normal-D9kWRRK5.woff2 +0 -0
  123. package/dist/web/assets/monaspace-krypton-latin-400-italic-BoBCEexI.woff2 +0 -0
  124. package/dist/web/assets/monaspace-krypton-latin-400-italic-LWEicbvC.woff +0 -0
  125. package/dist/web/assets/monaspace-krypton-latin-400-normal-D9XlxC9R.woff +0 -0
  126. package/dist/web/assets/monaspace-krypton-latin-400-normal-DsuVXUab.woff2 +0 -0
  127. package/dist/web/assets/nerd-symbols-codicons-DSvMY_FK.woff2 +0 -0
  128. package/dist/web/assets/nerd-symbols-devicons-BBab8P54.woff2 +0 -0
  129. package/dist/web/assets/nerd-symbols-font-awesome-BzNW1pRA.woff2 +0 -0
  130. package/dist/web/assets/nerd-symbols-font-awesome-ext-D30e--UY.woff2 +0 -0
  131. package/dist/web/assets/nerd-symbols-font-awesome-legacy-D_qekXx9.woff2 +0 -0
  132. package/dist/web/assets/nerd-symbols-font-logos-gdu3INfy.woff2 +0 -0
  133. package/dist/web/assets/nerd-symbols-iec-power-Cw6TNeDf.woff2 +0 -0
  134. package/dist/web/assets/nerd-symbols-material-l-CXi9Ay.woff2 +0 -0
  135. package/dist/web/assets/nerd-symbols-misc-BaVfdyeB.woff2 +0 -0
  136. package/dist/web/assets/nerd-symbols-octicons-CJLTTzKm.woff2 +0 -0
  137. package/dist/web/assets/nerd-symbols-pomicons-D7T3Ya3H.woff2 +0 -0
  138. package/dist/web/assets/nerd-symbols-powerline-Cgg0sdGS.woff2 +0 -0
  139. package/dist/web/assets/nerd-symbols-seti-DYiUFq6z.woff2 +0 -0
  140. package/dist/web/assets/nerd-symbols-weather-D4Jrp5XD.woff2 +0 -0
  141. package/dist/web/assets/{nextflow-DKFYidyC.js → nextflow-Bos2wvDV.js} +1 -1
  142. package/dist/web/assets/{nginx-Bhq0tzlh.js → nginx-DMlOwzdr.js} +1 -1
  143. package/dist/web/assets/{nim-CSuBzart.js → nim-D2dZQA88.js} +1 -1
  144. package/dist/web/assets/notification-store-BZbsPnW0.js +1 -0
  145. package/dist/web/assets/notifications-settings-section-DPUROMw-.js +1 -0
  146. package/dist/web/assets/{number-overlay-editor-CYHlP43e.js → number-overlay-editor-DZ2i_Bnb.js} +1 -1
  147. package/dist/web/assets/{overview-panel-xn2BYvn6.js → overview-panel-R146OIom.js} +1 -1
  148. package/dist/web/assets/packet-RMMSAZCW-DwmYPOlx.js +1 -0
  149. package/dist/web/assets/panel-store-BVLBRn6M.js +1 -0
  150. package/dist/web/assets/pdf-preview-BWUPGLp6.js +1 -0
  151. package/dist/web/assets/{perl-uDVR7Ceh.js → perl-C5-Z6fPn.js} +1 -1
  152. package/dist/web/assets/{php-Bby8J3zk.js → php-BXNNhkMH.js} +1 -1
  153. package/dist/web/assets/pie-UPGHQEXC-D0oogIFi.js +1 -0
  154. package/dist/web/assets/{postgres-viewer-CJbHLcGE.js → postgres-viewer-CjOvaruz.js} +3 -3
  155. package/dist/web/assets/ppmbot-settings-section-DrvWh8l8.js +1 -0
  156. package/dist/web/assets/problems-panel-B7BWVhdy.js +1 -0
  157. package/dist/web/assets/process-table-BRMS1MrX.js +1 -0
  158. package/dist/web/assets/{project-store-Dy3A3LJT.js → project-store-BhMbVln3.js} +1 -1
  159. package/dist/web/assets/proxy-settings-section-Bv0Ny-Yy.js +1 -0
  160. package/dist/web/assets/{pug-EapfojTW.js → pug-C1zf1yWy.js} +1 -1
  161. package/dist/web/assets/{qml-DiR6J5_C.js → qml-OW58jGpD.js} +1 -1
  162. package/dist/web/assets/query-audit-section-BcHJZcVC.js +1 -0
  163. package/dist/web/assets/radar-KQ55EAFF-CQIJOQGa.js +1 -0
  164. package/dist/web/assets/{razor-B2QvlGNY.js → razor-DzjSaobM.js} +1 -1
  165. package/dist/web/assets/remote-desktop-mobile-sheet-ByjaeZKX.js +2 -0
  166. package/dist/web/assets/remote-desktop-mobile-view-D13mtr9F.js +1 -0
  167. package/dist/web/assets/remote-desktop-readiness-gate-BTzss2wX.js +1 -0
  168. package/dist/web/assets/remote-desktop-window-content-CbqTCaC6.js +1 -0
  169. package/dist/web/assets/{rst-D2eJ0kH4.js → rst-RfuihOUW.js} +1 -1
  170. package/dist/web/assets/{ruby-DzpnBpz-.js → ruby-CNO3pli1.js} +1 -1
  171. package/dist/web/assets/{run-in-terminal-DisO5HC-.js → run-in-terminal-Cb_hVU8x.js} +1 -1
  172. package/dist/web/assets/{sas-WDAKsX0U.js → sas-DZY5BtXx.js} +1 -1
  173. package/dist/web/assets/schedules-settings-section-DO8xAOVj.js +1 -0
  174. package/dist/web/assets/scroll-area-LtNV8g5o.js +1 -0
  175. package/dist/web/assets/{scss-Ci6PdscL.js → scss--4g-REcN.js} +1 -1
  176. package/dist/web/assets/{send-to-chat-DDFdKWNf.js → send-to-chat-Cnpru1M0.js} +1 -1
  177. package/dist/web/assets/{separator-CyisF27O.js → separator-Cds1yxy8.js} +1 -1
  178. package/dist/web/assets/settings-body-Rnu-FcX-.js +2 -0
  179. package/dist/web/assets/settings-store-DZPgPtEA.js +2 -0
  180. package/dist/web/assets/settings-tab-C6PHxs0Z.js +1 -0
  181. package/dist/web/assets/settings-window-content-CQ4gT2qj.js +1 -0
  182. package/dist/web/assets/{shaderlab-Cv3mWofL.js → shaderlab-Cu4sBiVn.js} +1 -1
  183. package/dist/web/assets/{shellsession-D1KVtQa1.js → shellsession-DWzJfEv7.js} +1 -1
  184. package/dist/web/assets/{soy-BGLBwFZT.js → soy-BnqE-5Ff.js} +1 -1
  185. package/dist/web/assets/{sparql-TvnQmFDh.js → sparql-Ctg__NhZ.js} +1 -1
  186. package/dist/web/assets/{sql-query-editor-DaQqRBNA.js → sql-query-editor-D9k19T_M.js} +1 -1
  187. package/dist/web/assets/sqlite-viewer-DoV9hnWJ.js +1 -0
  188. package/dist/web/assets/{stata-Gi-BKyEv.js → stata-Qk2h66XW.js} +1 -1
  189. package/dist/web/assets/{streaming-store-DAbnOfLu.js → streaming-store-uDu3PoN1.js} +1 -1
  190. package/dist/web/assets/{surrealql-BVXs6tkz.js → surrealql-8QEX7EfH.js} +1 -1
  191. package/dist/web/assets/{svelte-BlnFpLWV.js → svelte-D_mubC5-.js} +1 -1
  192. package/dist/web/assets/system-monitor-body-2vQ1kMxE.js +2 -0
  193. package/dist/web/assets/system-monitor-tab-krAcvwF7.js +1 -0
  194. package/dist/web/assets/system-monitor-window-content-qXLcicFM.js +1 -0
  195. package/dist/web/assets/tab-host-window-content-7fPZNEni.js +1 -0
  196. package/dist/web/assets/{tab-store-B7BksLr-.js → tab-store-DGJGnbwv.js} +1 -1
  197. package/dist/web/assets/team-member-sheet-2FnRmk1a.js +2 -0
  198. package/dist/web/assets/team-member-window-content-BgvJFypM.js +1 -0
  199. package/dist/web/assets/{templ-YJYH5r1A.js → templ-C1jV0fsO.js} +1 -1
  200. package/dist/web/assets/terminal-tab-Cs0sGljx.js +3 -0
  201. package/dist/web/assets/{tex-IVZLDIeh.js → tex-D_StFXy_.js} +1 -1
  202. package/dist/web/assets/tool-cards-DU_S2o51.js +9 -0
  203. package/dist/web/assets/treemap-KZPCXAKY-BhEtjljr.js +1 -0
  204. package/dist/web/assets/{ts-tags-DBd321I-.js → ts-tags-B5m47rEm.js} +1 -1
  205. package/dist/web/assets/{twig-DQENQjEn.js → twig-C_br6GIl.js} +1 -1
  206. package/dist/web/assets/{use-blob-url-CGChX4vi.js → use-blob-url-C-SGi_Hb.js} +1 -1
  207. package/dist/web/assets/use-inline-blame-B4trxGcR.js +16 -0
  208. package/dist/web/assets/use-lsp-CV0vzILO.js +6 -0
  209. package/dist/web/assets/use-monaco-theme-DBqbWjWX.js +1 -0
  210. package/dist/web/assets/{use-open-team-member-kmNnlzDD.js → use-open-team-member-DENsjp0s.js} +1 -1
  211. package/dist/web/assets/use-remote-desktop-display-choice-BK_f787P.js +1 -0
  212. package/dist/web/assets/{use-websocket-D8OGBwH8.js → use-websocket-LgXiX1qN.js} +1 -1
  213. package/dist/web/assets/{vendor-mermaid-BoRFiriK.js → vendor-mermaid-Cbig5zA6.js} +1 -1
  214. package/dist/web/assets/video-preview-BDNwumbW.js +1 -0
  215. package/dist/web/assets/{vue-Do2JXEwi.js → vue-DQwCnLdr.js} +1 -1
  216. package/dist/web/assets/{vue-html-Bse0CwSC.js → vue-html-T_EoGpPJ.js} +1 -1
  217. package/dist/web/assets/{vue-vine-C8JSXu5Z.js → vue-vine-DmxLqX50.js} +1 -1
  218. package/dist/web/assets/{window-pip-registry-C2dcY0pE.js → window-pip-registry-3l4hoxuD.js} +1 -1
  219. package/dist/web/assets/{window-store-2z4t5YAt.js → window-store-UC1jJeLM.js} +1 -1
  220. package/dist/web/assets/ws-auth-DEAJiGCR.js +1 -0
  221. package/dist/web/assets/{xml-OX6YmzGK.js → xml-Bs6Bw8is.js} +1 -1
  222. package/dist/web/assets/{xsl-RQUQgcgy.js → xsl-f5ZNhRCc.js} +1 -1
  223. package/dist/web/index.html +105 -71
  224. package/dist/web/sw.js +1 -1
  225. package/docs/project-roadmap.md +2 -0
  226. package/licenses/Apache-2.0.txt +73 -0
  227. package/licenses/CC-BY-4.0.txt +156 -0
  228. package/licenses/MIT.txt +18 -0
  229. package/licenses/OFL-1.1.txt +43 -0
  230. package/licenses/Unlicense.txt +10 -0
  231. package/package.json +14 -7
  232. package/packages/ext-git-graph/src/blame-view.ts +4 -5
  233. package/packages/ext-git-graph/src/commit-detail-escaping.test.ts +205 -0
  234. package/packages/ext-git-graph/src/commit-detail-file-cap.test.ts +65 -0
  235. package/packages/ext-git-graph/src/commit-message-html.test.ts +214 -0
  236. package/packages/ext-git-graph/src/commit-message-html.ts +190 -0
  237. package/packages/ext-git-graph/src/commit-request-generation.test.ts +57 -0
  238. package/packages/ext-git-graph/src/compare-view.ts +4 -5
  239. package/packages/ext-git-graph/src/extension.ts +148 -36
  240. package/packages/ext-git-graph/src/file-history-view.ts +4 -5
  241. package/packages/ext-git-graph/src/log-args.test.ts +57 -0
  242. package/packages/ext-git-graph/src/ppm-api.ts +39 -6
  243. package/packages/ext-git-graph/src/project-scope.test.ts +77 -0
  244. package/packages/ext-git-graph/src/project-scope.ts +69 -0
  245. package/packages/ext-git-graph/src/shortstat-parser.test.ts +53 -0
  246. package/packages/ext-git-graph/src/shortstat-parser.ts +45 -0
  247. package/packages/ext-git-graph/src/types.ts +2 -0
  248. package/packages/ext-git-graph/src/webview-html.test.ts +407 -0
  249. package/packages/ext-git-graph/src/webview-html.ts +631 -108
  250. package/packages/ext-git-graph/src/webview-shell.test.ts +63 -0
  251. package/packages/ext-git-graph/src/webview-shell.ts +48 -7
  252. package/scripts/copy-monaco.ts +63 -0
  253. package/scripts/gen-file-icons.ts +485 -0
  254. package/scripts/gen-nerd-font.ts +311 -0
  255. package/scripts/gen-product-icons.ts +442 -0
  256. package/scripts/monaco-staging.ts +32 -0
  257. package/scripts/precompress-web.ts +77 -0
  258. package/scripts/third-party-notices.ts +160 -0
  259. package/scripts/vite-monaco-dev-assets.ts +63 -0
  260. package/src/providers/claude-agent-sdk.ts +32 -2
  261. package/src/server/index.ts +17 -0
  262. package/src/server/routes/chat.ts +16 -6
  263. package/src/server/routes/git.ts +113 -1
  264. package/src/server/routes/lsp.ts +58 -0
  265. package/src/server/routes/project-scoped.ts +2 -0
  266. package/src/server/routes/static-encoding.ts +73 -0
  267. package/src/server/routes/static-fallback.ts +51 -0
  268. package/src/server/routes/static.ts +41 -5
  269. package/src/server/ws/lsp.ts +433 -0
  270. package/src/services/chat-search.service.ts +211 -26
  271. package/src/services/fs-ops/fs-real-path.ts +23 -0
  272. package/src/services/git-blame/commit-line-diff.ts +124 -0
  273. package/src/services/git-blame/git-blame.service.ts +96 -1
  274. package/src/services/git-repos/git-repo-discovery.ts +152 -0
  275. package/src/services/lsp/lsp-capabilities.ts +160 -0
  276. package/src/services/lsp/lsp-manager.ts +442 -0
  277. package/src/services/lsp/lsp-protocol.ts +170 -0
  278. package/src/services/lsp/lsp-session.ts +466 -0
  279. package/src/services/lsp/server-registry.ts +401 -0
  280. package/src/services/search-index-db.service.ts +10 -2
  281. package/src/shared/blame.ts +51 -0
  282. package/src/shared/lsp-uri.ts +108 -0
  283. package/src/web/app.tsx +6 -0
  284. package/src/web/components/ai-resources/ai-resource-editor.tsx +1 -1
  285. package/src/web/components/ai-resources/ai-resources-panel.tsx +1 -1
  286. package/src/web/components/ai-resources/mcp-group.tsx +1 -1
  287. package/src/web/components/ai-resources/new-resource-menu.tsx +1 -1
  288. package/src/web/components/ai-resources/resource-visuals.tsx +1 -1
  289. package/src/web/components/auth/login-screen.tsx +1 -1
  290. package/src/web/components/auth/support-dialog.tsx +1 -1
  291. package/src/web/components/chat/attachment-chips.tsx +113 -5
  292. package/src/web/components/chat/background-command-bar.tsx +1 -1
  293. package/src/web/components/chat/background-output-panel.tsx +1 -1
  294. package/src/web/components/chat/change-edit-list.tsx +1 -1
  295. package/src/web/components/chat/change-file-row.tsx +1 -1
  296. package/src/web/components/chat/chat-history-bar.tsx +2 -2
  297. package/src/web/components/chat/chat-history-panel.tsx +1 -1
  298. package/src/web/components/chat/chat-placeholder.tsx +1 -1
  299. package/src/web/components/chat/chat-scroll-nav.tsx +1 -1
  300. package/src/web/components/chat/chat-tab.tsx +1 -1
  301. package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +1 -1
  302. package/src/web/components/chat/chat-welcome.tsx +1 -1
  303. package/src/web/components/chat/codex-usage-panel.tsx +1 -1
  304. package/src/web/components/chat/file-picker.tsx +1 -1
  305. package/src/web/components/chat/image-preview-states.tsx +1 -1
  306. package/src/web/components/chat/message-action-bar.tsx +1 -1
  307. package/src/web/components/chat/message-input.tsx +1 -1
  308. package/src/web/components/chat/message-list.tsx +1 -1
  309. package/src/web/components/chat/mode-selector.tsx +1 -1
  310. package/src/web/components/chat/model-selector.tsx +1 -1
  311. package/src/web/components/chat/model-thinking-selector.tsx +1 -1
  312. package/src/web/components/chat/pre-compact-button.tsx +1 -1
  313. package/src/web/components/chat/provider-selector.tsx +1 -1
  314. package/src/web/components/chat/send-message-card.tsx +1 -1
  315. package/src/web/components/chat/session-context-menu.tsx +1 -1
  316. package/src/web/components/chat/session-debug-dialog.tsx +1 -1
  317. package/src/web/components/chat/session-history-list.tsx +1 -1
  318. package/src/web/components/chat/session-list-panel.tsx +1 -1
  319. package/src/web/components/chat/session-picker.tsx +1 -1
  320. package/src/web/components/chat/slash-command-picker.tsx +1 -1
  321. package/src/web/components/chat/task-tracker.tsx +1 -1
  322. package/src/web/components/chat/team-activity-panel.tsx +1 -1
  323. package/src/web/components/chat/team-member-activity-row.tsx +1 -1
  324. package/src/web/components/chat/team-member-list.tsx +1 -1
  325. package/src/web/components/chat/team-member-sheet.tsx +1 -1
  326. package/src/web/components/chat/team-member-window-content.tsx +1 -1
  327. package/src/web/components/chat/team-working-bar.tsx +1 -1
  328. package/src/web/components/chat/tool-cards.tsx +2 -2
  329. package/src/web/components/chat/turn-change-sheet.tsx +1 -1
  330. package/src/web/components/chat/turn-change-tray.tsx +1 -1
  331. package/src/web/components/chat/turn-cost-warning.tsx +1 -1
  332. package/src/web/components/chat/usage-badge.tsx +1 -1
  333. package/src/web/components/chat/usage-panel-shell.tsx +1 -1
  334. package/src/web/components/chat/version-switcher.tsx +1 -1
  335. package/src/web/components/database/connection-import-export.tsx +1 -1
  336. package/src/web/components/database/connection-list.tsx +1 -1
  337. package/src/web/components/database/connection-row.tsx +1 -1
  338. package/src/web/components/database/database-sidebar.tsx +1 -1
  339. package/src/web/components/database/database-viewer.tsx +1 -1
  340. package/src/web/components/database/export-button.tsx +1 -1
  341. package/src/web/components/database/glide-context-menu.tsx +1 -1
  342. package/src/web/components/database/glide-data-grid.tsx +1 -1
  343. package/src/web/components/database/glide-data-preview-panel.tsx +2 -2
  344. package/src/web/components/database/glide-grid-pagination.tsx +1 -1
  345. package/src/web/components/database/glide-grid-toolbar.tsx +1 -1
  346. package/src/web/components/database/glide-header-menu.tsx +1 -1
  347. package/src/web/components/database/glide-save-bar.tsx +1 -1
  348. package/src/web/components/database/schema-table-tree.tsx +1 -1
  349. package/src/web/components/editor/audio-preview.tsx +1 -1
  350. package/src/web/components/editor/code-editor.tsx +167 -21
  351. package/src/web/components/editor/compare-picker.tsx +1 -1
  352. package/src/web/components/editor/conflict-editor.tsx +15 -6
  353. package/src/web/components/editor/csv-preview.tsx +1 -1
  354. package/src/web/components/editor/diff-viewer.tsx +59 -37
  355. package/src/web/components/editor/docx-preview.tsx +1 -1
  356. package/src/web/components/editor/editor-breadcrumb-external.tsx +1 -1
  357. package/src/web/components/editor/editor-breadcrumb.tsx +1 -1
  358. package/src/web/components/editor/editor-language-picker.tsx +3 -1
  359. package/src/web/components/editor/editor-language-service.tsx +77 -0
  360. package/src/web/components/editor/editor-mobile-toolbar.tsx +13 -2
  361. package/src/web/components/editor/editor-placeholder.tsx +1 -1
  362. package/src/web/components/editor/editor-toolbar.tsx +1 -1
  363. package/src/web/components/editor/image-preview.tsx +1 -1
  364. package/src/web/components/editor/lsp-status.tsx +241 -0
  365. package/src/web/components/editor/pdf-preview.tsx +1 -1
  366. package/src/web/components/editor/video-player/video-player-controls.tsx +1 -1
  367. package/src/web/components/editor/video-player/video-player.tsx +1 -1
  368. package/src/web/components/editor/video-player/video-settings-menu.tsx +1 -1
  369. package/src/web/components/editor/video-preview.tsx +1 -1
  370. package/src/web/components/explorer/file-tree.tsx +1 -1
  371. package/src/web/components/explorer/inline-tree-input.tsx +1 -1
  372. package/src/web/components/explorer/search-panel.tsx +3 -2
  373. package/src/web/components/explorer/tree-node-context-menu.tsx +1 -1
  374. package/src/web/components/explorer/tree-node.tsx +5 -12
  375. package/src/web/components/extensions/extension-quickpick.tsx +1 -1
  376. package/src/web/components/extensions/extension-tree-view.tsx +1 -1
  377. package/src/web/components/extensions/extension-webview.tsx +53 -20
  378. package/src/web/components/extensions/webview-theme.ts +121 -0
  379. package/src/web/components/floating-window/pip/pip-caption-button.tsx +1 -1
  380. package/src/web/components/git/create-worktree-dialog.tsx +5 -3
  381. package/src/web/components/git/git-log-panel.tsx +4 -2
  382. package/src/web/components/git/git-placeholder.tsx +1 -1
  383. package/src/web/components/git/git-ref-badge.tsx +1 -1
  384. package/src/web/components/git/git-repo-picker.tsx +145 -0
  385. package/src/web/components/git/git-status-panel.tsx +231 -250
  386. package/src/web/components/git/git-worktree-panel.tsx +6 -4
  387. package/src/web/components/git/hunk-stage-dialog.tsx +5 -3
  388. package/src/web/components/group-chat/group-chat-tab.tsx +1 -1
  389. package/src/web/components/group-chat/group-create-dialog.tsx +1 -1
  390. package/src/web/components/group-chat/group-full-transcript-view.tsx +1 -1
  391. package/src/web/components/group-chat/group-list.tsx +1 -1
  392. package/src/web/components/group-chat/group-member-edit-dialog.tsx +1 -1
  393. package/src/web/components/group-chat/group-member-roster.tsx +1 -1
  394. package/src/web/components/group-chat/group-message-item.tsx +1 -1
  395. package/src/web/components/group-chat/group-transcript-messages.tsx +1 -1
  396. package/src/web/components/jira/jira-config-form.tsx +1 -1
  397. package/src/web/components/jira/jira-filter-builder.tsx +1 -1
  398. package/src/web/components/jira/jira-panel.tsx +1 -1
  399. package/src/web/components/jira/jira-results-panel.tsx +1 -1
  400. package/src/web/components/jira/jira-ticket-card.tsx +1 -1
  401. package/src/web/components/jira/jira-ticket-detail.tsx +1 -1
  402. package/src/web/components/jira/jira-watcher-form.tsx +1 -1
  403. package/src/web/components/jira/jira-watcher-list.tsx +1 -1
  404. package/src/web/components/layout/add-project-form.tsx +1 -1
  405. package/src/web/components/layout/cloud-alias-row.tsx +1 -1
  406. package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +1 -1
  407. package/src/web/components/layout/cloud-share-popover.tsx +1 -1
  408. package/src/web/components/layout/command-palette-filter-chips.tsx +1 -1
  409. package/src/web/components/layout/command-palette.tsx +46 -8
  410. package/src/web/components/layout/dock-header.tsx +4 -4
  411. package/src/web/components/layout/dock-panel.tsx +3 -3
  412. package/src/web/components/layout/draggable-tab.tsx +20 -3
  413. package/src/web/components/layout/editor-panel.tsx +1 -1
  414. package/src/web/components/layout/mobile-drawer-tab-bar.tsx +10 -1
  415. package/src/web/components/layout/mobile-drawer.tsx +1 -1
  416. package/src/web/components/layout/mobile-nav.tsx +3 -3
  417. package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +13 -4
  418. package/src/web/components/layout/nav-section-rail.tsx +1 -1
  419. package/src/web/components/layout/notification-bell-popover.tsx +1 -1
  420. package/src/web/components/layout/panel-layout.tsx +1 -1
  421. package/src/web/components/layout/project-bottom-sheet.tsx +4 -1
  422. package/src/web/components/layout/project-sort.ts +1 -1
  423. package/src/web/components/layout/project-switcher.tsx +1 -1
  424. package/src/web/components/layout/reparenting-tab.tsx +1 -1
  425. package/src/web/components/layout/sidebar.tsx +1 -1
  426. package/src/web/components/layout/status-bar.tsx +4 -1
  427. package/src/web/components/layout/tab-bar.tsx +9 -23
  428. package/src/web/components/layout/tab-content.tsx +6 -1
  429. package/src/web/components/layout/tab-pool.tsx +1 -0
  430. package/src/web/components/layout/tab-pop-out-menu-item.tsx +1 -1
  431. package/src/web/components/layout/upgrade-button.tsx +1 -1
  432. package/src/web/components/layout/wake-lock-indicator.tsx +1 -1
  433. package/src/web/components/os-explorer/explorer-body.tsx +1 -1
  434. package/src/web/components/os-explorer/explorer-breadcrumb.tsx +1 -1
  435. package/src/web/components/os-explorer/explorer-sidebar.tsx +1 -1
  436. package/src/web/components/os-explorer/explorer-sort-menu.tsx +1 -1
  437. package/src/web/components/os-explorer/explorer-toolbar.tsx +1 -1
  438. package/src/web/components/os-explorer/icons/file-type-icon-map.ts +10 -94
  439. package/src/web/components/os-explorer/icons/file-type-icon.tsx +17 -13
  440. package/src/web/components/os-explorer/mobile/mobile-bottom-toolbar.tsx +1 -1
  441. package/src/web/components/os-explorer/mobile/mobile-explorer-top-bar.tsx +1 -1
  442. package/src/web/components/os-explorer/mobile/mobile-more-sheet.tsx +1 -1
  443. package/src/web/components/os-explorer/mobile/mobile-places-sheet.tsx +1 -1
  444. package/src/web/components/os-explorer/mobile/mobile-places-strip.tsx +1 -1
  445. package/src/web/components/os-explorer/properties-dialog.tsx +1 -1
  446. package/src/web/components/os-explorer/skins/macos-window-chrome.tsx +1 -1
  447. package/src/web/components/os-explorer/skins/windows-window-chrome.tsx +1 -1
  448. package/src/web/components/os-explorer/upload/upload-batch-card.tsx +1 -1
  449. package/src/web/components/os-explorer/upload/upload-batch-row.tsx +1 -1
  450. package/src/web/components/os-explorer/use-coarse-long-press.ts +8 -0
  451. package/src/web/components/os-explorer/views/column-view-mobile.tsx +1 -1
  452. package/src/web/components/os-explorer/views/icons-view-tile.tsx +1 -1
  453. package/src/web/components/os-explorer/views/list-row.tsx +1 -1
  454. package/src/web/components/os-explorer/views/list-view.tsx +1 -1
  455. package/src/web/components/postgres/postgres-viewer.tsx +1 -1
  456. package/src/web/components/problems/problems-panel.tsx +230 -0
  457. package/src/web/components/problems/problems-status.tsx +53 -0
  458. package/src/web/components/projects/dir-suggest.tsx +1 -1
  459. package/src/web/components/projects/project-list.tsx +1 -1
  460. package/src/web/components/remote-desktop/remote-desktop-mobile-toolbar.tsx +1 -1
  461. package/src/web/components/remote-desktop/remote-desktop-mobile-view.tsx +1 -1
  462. package/src/web/components/remote-desktop/remote-desktop-readiness-gate.tsx +1 -1
  463. package/src/web/components/remote-desktop/remote-desktop-warning-gate.tsx +1 -1
  464. package/src/web/components/remote-desktop/remote-desktop-window-content.tsx +1 -1
  465. package/src/web/components/root-error-boundary.tsx +116 -0
  466. package/src/web/components/settings/accounts/account-add-dialog.tsx +1 -1
  467. package/src/web/components/settings/accounts/account-card.tsx +1 -1
  468. package/src/web/components/settings/accounts/account-export-dialog.tsx +1 -1
  469. package/src/web/components/settings/accounts/account-export-simulation.tsx +1 -1
  470. package/src/web/components/settings/accounts/account-import-dialog.tsx +1 -1
  471. package/src/web/components/settings/accounts/account-profile-panel.tsx +1 -1
  472. package/src/web/components/settings/accounts/account-rotation-settings.tsx +1 -1
  473. package/src/web/components/settings/accounts/account-token-test-dialog.tsx +1 -1
  474. package/src/web/components/settings/accounts/account-usage-pattern-chart.tsx +1 -1
  475. package/src/web/components/settings/accounts/accounts-pane-header.tsx +1 -1
  476. package/src/web/components/settings/accounts/accounts-settings-section.tsx +1 -1
  477. package/src/web/components/settings/accounts/claude-accounts-section.tsx +9 -1
  478. package/src/web/components/settings/accounts/codex-accounts-section.tsx +10 -1
  479. package/src/web/components/settings/accounts/codex-add-account-dialog.tsx +1 -1
  480. package/src/web/components/settings/accounts/codex-backup-dialog.tsx +1 -1
  481. package/src/web/components/settings/ai-settings-section.tsx +1 -1
  482. package/src/web/components/settings/appearance-settings-section.tsx +56 -1
  483. package/src/web/components/settings/change-password-section.tsx +1 -1
  484. package/src/web/components/settings/extension-manager-section.tsx +1 -1
  485. package/src/web/components/settings/general-settings-section.tsx +1 -1
  486. package/src/web/components/settings/glob-list-editor.tsx +1 -1
  487. package/src/web/components/settings/keyboard-shortcuts-section.tsx +1 -1
  488. package/src/web/components/settings/mcp-server-dialog.tsx +1 -1
  489. package/src/web/components/settings/notifications-settings-section.tsx +1 -1
  490. package/src/web/components/settings/ppmbot-settings-section.tsx +1 -1
  491. package/src/web/components/settings/proxy-settings-section.tsx +1 -1
  492. package/src/web/components/settings/proxy-test-section.tsx +1 -1
  493. package/src/web/components/settings/query-audit-section.tsx +1 -1
  494. package/src/web/components/settings/schedules/schedule-row.tsx +1 -1
  495. package/src/web/components/settings/schedules/schedules-settings-section.tsx +1 -1
  496. package/src/web/components/settings/settings-body.tsx +1 -1
  497. package/src/web/components/settings/settings-categories.ts +14 -3
  498. package/src/web/components/settings/settings-category-list.tsx +1 -1
  499. package/src/web/components/settings/settings-section-content.tsx +1 -1
  500. package/src/web/components/settings/tag-settings-section.tsx +1 -1
  501. package/src/web/components/settings/theme-grid.tsx +1 -1
  502. package/src/web/components/settings/theme-manager-section.tsx +1 -1
  503. package/src/web/components/settings/theme-picker.tsx +1 -1
  504. package/src/web/components/shared/bug-report-popup.tsx +1 -1
  505. package/src/web/components/shared/connection-lost-overlay.tsx +1 -1
  506. package/src/web/components/shared/diagram-overlay.tsx +1 -1
  507. package/src/web/components/shared/image-overlay.tsx +1 -1
  508. package/src/web/components/shared/theme-mode-menu.tsx +1 -1
  509. package/src/web/components/sqlite/sqlite-data-grid.tsx +1 -1
  510. package/src/web/components/sqlite/sqlite-table-list.tsx +1 -1
  511. package/src/web/components/sqlite/sqlite-viewer.tsx +1 -1
  512. package/src/web/components/system/process-group-row.tsx +1 -1
  513. package/src/web/components/system/process-row.tsx +1 -1
  514. package/src/web/components/system/process-table-toolbar.tsx +1 -1
  515. package/src/web/components/system/resource-status-bar.tsx +1 -1
  516. package/src/web/components/system/sortable-header.tsx +1 -1
  517. package/src/web/components/system/system-monitor-body.tsx +1 -1
  518. package/src/web/components/terminal/terminal-finish-login.tsx +1 -1
  519. package/src/web/components/terminal/terminal-links-sheet.tsx +1 -1
  520. package/src/web/components/terminal/terminal-mobile-toolbar.tsx +1 -1
  521. package/src/web/components/terminal/terminal-placeholder.tsx +1 -1
  522. package/src/web/components/terminal/terminal-tab.tsx +1 -1
  523. package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +1 -0
  524. package/src/web/components/tunnels/named-tunnel/named-tunnel-login-step.tsx +1 -1
  525. package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +1 -1
  526. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +9 -3
  527. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +1 -1
  528. package/src/web/components/tunnels/named-tunnel/named-tunnel-step-reducer.ts +14 -2
  529. package/src/web/components/tunnels/tunnel-manager-tab.tsx +1 -1
  530. package/src/web/components/ui/accordion.tsx +1 -1
  531. package/src/web/components/ui/adaptive-context-menu.tsx +9 -2
  532. package/src/web/components/ui/browse-button.tsx +1 -1
  533. package/src/web/components/ui/context-menu.tsx +1 -1
  534. package/src/web/components/ui/dialog.tsx +1 -1
  535. package/src/web/components/ui/dropdown-menu.tsx +1 -1
  536. package/src/web/components/ui/file-browser-picker.tsx +4 -6
  537. package/src/web/components/ui/select.tsx +1 -1
  538. package/src/web/components/ui/sidebar-header.tsx +1 -1
  539. package/src/web/components/ui/sonner.tsx +1 -1
  540. package/src/web/hooks/use-git-repo.ts +124 -0
  541. package/src/web/hooks/use-global-keybindings.ts +11 -6
  542. package/src/web/hooks/use-inline-blame.ts +161 -11
  543. package/src/web/hooks/use-is-touch-only.ts +46 -0
  544. package/src/web/hooks/use-lsp.ts +182 -0
  545. package/src/web/hooks/use-terminal.ts +60 -2
  546. package/src/web/hooks/use-touch-tab-drag.ts +18 -2
  547. package/src/web/hooks/use-url-sync.ts +15 -1
  548. package/src/web/index.html +74 -0
  549. package/src/web/lib/blame-hover-commands.ts +82 -0
  550. package/src/web/lib/blame-hover.ts +199 -0
  551. package/src/web/lib/chunk-recovery.ts +113 -0
  552. package/src/web/lib/editor-font.ts +70 -0
  553. package/src/web/lib/ext-command-dispatch.ts +24 -0
  554. package/src/web/lib/file-icons.generated.ts +408 -0
  555. package/src/web/lib/file-icons.tsx +192 -0
  556. package/src/web/lib/fluent-icon.tsx +62 -0
  557. package/src/web/lib/git-file-tree.ts +83 -0
  558. package/src/web/lib/git-repo-scope.ts +157 -0
  559. package/src/web/lib/icons.generated.tsx +428 -0
  560. package/src/web/lib/icons.ts +17 -0
  561. package/src/web/lib/lsp/lsp-client.ts +321 -0
  562. package/src/web/lib/lsp/lsp-documents.ts +39 -0
  563. package/src/web/lib/lsp/lsp-monaco.ts +214 -0
  564. package/src/web/lib/lsp/lsp-navigation.ts +129 -0
  565. package/src/web/lib/lsp/lsp-responses.ts +244 -0
  566. package/src/web/lib/lsp/lsp-semantic-tokens.ts +180 -0
  567. package/src/web/lib/lsp/lsp-shadow-models.ts +254 -0
  568. package/src/web/lib/lsp/monaco-builtin-typescript.ts +149 -0
  569. package/src/web/lib/lsp/register-providers.ts +458 -0
  570. package/src/web/lib/monaco-diff-language.ts +62 -0
  571. package/src/web/lib/monaco-dotenv-language.ts +134 -0
  572. package/src/web/lib/sidebar-tabs/tab-registry.ts +11 -2
  573. package/src/web/lib/tab-type-icons.ts +32 -4
  574. package/src/web/main.tsx +30 -1
  575. package/src/web/stores/git-repo-store.ts +117 -0
  576. package/src/web/stores/git-status-store.ts +10 -7
  577. package/src/web/stores/keybindings-store.ts +1 -0
  578. package/src/web/stores/panel-utils.ts +5 -2
  579. package/src/web/stores/problems-store.ts +116 -0
  580. package/src/web/stores/settings-store.ts +40 -0
  581. package/src/web/stores/tab-store.ts +2 -1
  582. package/src/web/stores/window-panel-persistence.ts +1 -0
  583. package/src/web/styles/file-icons.generated.css +1007 -0
  584. package/src/web/styles/fonts/nerd-symbols-codicons.woff2 +0 -0
  585. package/src/web/styles/fonts/nerd-symbols-devicons.woff2 +0 -0
  586. package/src/web/styles/fonts/nerd-symbols-font-awesome-ext.woff2 +0 -0
  587. package/src/web/styles/fonts/nerd-symbols-font-awesome-legacy.woff2 +0 -0
  588. package/src/web/styles/fonts/nerd-symbols-font-awesome.woff2 +0 -0
  589. package/src/web/styles/fonts/nerd-symbols-font-logos.woff2 +0 -0
  590. package/src/web/styles/fonts/nerd-symbols-iec-power.woff2 +0 -0
  591. package/src/web/styles/fonts/nerd-symbols-material.woff2 +0 -0
  592. package/src/web/styles/fonts/nerd-symbols-misc.woff2 +0 -0
  593. package/src/web/styles/fonts/nerd-symbols-octicons.woff2 +0 -0
  594. package/src/web/styles/fonts/nerd-symbols-pomicons.woff2 +0 -0
  595. package/src/web/styles/fonts/nerd-symbols-powerline.woff2 +0 -0
  596. package/src/web/styles/fonts/nerd-symbols-seti.woff2 +0 -0
  597. package/src/web/styles/fonts/nerd-symbols-weather.woff2 +0 -0
  598. package/src/web/styles/globals.css +30 -3
  599. package/src/web/styles/nerd-font.generated.css +153 -0
  600. package/src/web/sw.ts +69 -2
  601. package/src/web/theme/adapters/monaco-adapter.ts +20 -1
  602. package/src/web/theme/diff-token-rules.ts +34 -0
  603. package/src/web/theme/semantic-token-rules.ts +103 -0
  604. package/src/web/theme/theme-mode-options.ts +1 -1
  605. package/vite.config.ts +24 -7
  606. package/dist/web/assets/accounts-settings-section-ByM99C7p.js +0 -1
  607. package/dist/web/assets/ai-resource-editor-BsB9wa0z.js +0 -1
  608. package/dist/web/assets/ai-settings-section-BT-QVUBa.js +0 -1
  609. package/dist/web/assets/ai-settings-section-BUPOINaw.js +0 -1
  610. package/dist/web/assets/api-client-C6VTn7cG.js +0 -1
  611. package/dist/web/assets/appearance-settings-section-DJEoECoJ.js +0 -1
  612. package/dist/web/assets/architecture-PBZL5I3N-D55g5j-p.js +0 -1
  613. package/dist/web/assets/arrow-left-DpXaakMC.js +0 -1
  614. package/dist/web/assets/arrow-right-BqNSIscF.js +0 -1
  615. package/dist/web/assets/audio-preview-CF4tTFv_.js +0 -1
  616. package/dist/web/assets/bot-D3-n2i31.js +0 -1
  617. package/dist/web/assets/brain-CuAQMSBE.js +0 -1
  618. package/dist/web/assets/calendar-clock-CDP7AVjA.js +0 -1
  619. package/dist/web/assets/chat-tab-fD2vWwj2.js +0 -15
  620. package/dist/web/assets/check-BQKbhtoA.js +0 -1
  621. package/dist/web/assets/chevron-down-B9puixxZ.js +0 -1
  622. package/dist/web/assets/chevron-right-DK_HbYZC.js +0 -1
  623. package/dist/web/assets/chevron-up-BPAINgoK.js +0 -1
  624. package/dist/web/assets/circle-BpGTLAas.js +0 -1
  625. package/dist/web/assets/circle-question-mark-DUaySkoB.js +0 -1
  626. package/dist/web/assets/clock-Dqq0H9yH.js +0 -1
  627. package/dist/web/assets/code-CX6640Tv.js +0 -1
  628. package/dist/web/assets/code-editor-CyFLXCsD.js +0 -7
  629. package/dist/web/assets/codex-daily-guard-Cg19EWxk.js +0 -1
  630. package/dist/web/assets/conflict-editor-DSjo2FRy.js +0 -19
  631. package/dist/web/assets/context-menu-DchAkdnL.js +0 -1
  632. package/dist/web/assets/copy-Bt_1tjoJ.js +0 -1
  633. package/dist/web/assets/csv-preview-BIE3Wpww.js +0 -2
  634. package/dist/web/assets/database-9_p74TtY.js +0 -1
  635. package/dist/web/assets/database-viewer-CMvIORcM.js +0 -1
  636. package/dist/web/assets/diff-viewer-BQQ6fUr6.js +0 -4
  637. package/dist/web/assets/docx-preview-DcCh59Oe.js +0 -12
  638. package/dist/web/assets/download-CEPFebri.js +0 -1
  639. package/dist/web/assets/explorer-body-DRo2JHP9.js +0 -2
  640. package/dist/web/assets/explorer-window-content-7mnRpSqn.js +0 -1
  641. package/dist/web/assets/extension-manager-section-CEfr7-Kv.js +0 -1
  642. package/dist/web/assets/extension-webview-D7HqqdTv.js +0 -3
  643. package/dist/web/assets/eye-BQaWPI4P.js +0 -1
  644. package/dist/web/assets/eye-off-BlB3QV90.js +0 -1
  645. package/dist/web/assets/file-exclamation-point-BDmSZbxs.js +0 -1
  646. package/dist/web/assets/files-settings-section-h6a-WpSO.js +0 -1
  647. package/dist/web/assets/flask-conical-Cj-J6cxs.js +0 -1
  648. package/dist/web/assets/folder-symlink-BSYalAHC.js +0 -1
  649. package/dist/web/assets/general-settings-section-Bt3KNcyM.js +0 -1
  650. package/dist/web/assets/git-log-panel-H-Bg9p7m.js +0 -1
  651. package/dist/web/assets/gitGraph-HDMCJU4V-At-P8hlA.js +0 -1
  652. package/dist/web/assets/glide-data-grid-D3Xc_WGh.js +0 -141
  653. package/dist/web/assets/group-chat-tab-BkLt7J_s.js +0 -1
  654. package/dist/web/assets/hand-BkDyLfcc.js +0 -1
  655. package/dist/web/assets/image-preview-D_6-FhZP.js +0 -1
  656. package/dist/web/assets/index-BV_sFdHY.js +0 -52
  657. package/dist/web/assets/index-Di9nVG3y.css +0 -2
  658. package/dist/web/assets/info-3K5VOQVL-btSsuixb.js +0 -1
  659. package/dist/web/assets/key-round-Cv4z7_KG.js +0 -1
  660. package/dist/web/assets/keybindings-store-alreySno.js +0 -1
  661. package/dist/web/assets/keyboard-HG0BUtuN.js +0 -1
  662. package/dist/web/assets/keyboard-shortcuts-section-B_D0FamP.js +0 -1
  663. package/dist/web/assets/loader-circle-H81ywCuQ.js +0 -1
  664. package/dist/web/assets/markdown-renderer-CG_nGh7k.js +0 -3
  665. package/dist/web/assets/markdown-renderer-CgbqvSuc.js +0 -1
  666. package/dist/web/assets/mobile-explorer-sheet-DAZTzi1k.js +0 -1
  667. package/dist/web/assets/monitor-CKcYUoAV.js +0 -1
  668. package/dist/web/assets/notification-store-HCg5Shw9.js +0 -1
  669. package/dist/web/assets/notifications-settings-section-BAs_p_ai.js +0 -1
  670. package/dist/web/assets/packet-RMMSAZCW-B20_sIFd.js +0 -1
  671. package/dist/web/assets/panel-store-XhAruR6D.js +0 -1
  672. package/dist/web/assets/pdf-preview-BJjqU3AX.js +0 -1
  673. package/dist/web/assets/pie-UPGHQEXC-nzfJdXCC.js +0 -1
  674. package/dist/web/assets/power-D_wlLkC0.js +0 -1
  675. package/dist/web/assets/ppmbot-settings-section-5U0a58oj.js +0 -1
  676. package/dist/web/assets/process-table-CqGL0Bcj.js +0 -1
  677. package/dist/web/assets/proxy-settings-section-B1LDpGSc.js +0 -1
  678. package/dist/web/assets/query-audit-section-DfCvY94_.js +0 -1
  679. package/dist/web/assets/radar-KQ55EAFF-CS4sHKD5.js +0 -1
  680. package/dist/web/assets/remote-desktop-mobile-sheet-_LH4uCcA.js +0 -2
  681. package/dist/web/assets/remote-desktop-mobile-view-C5TUPDh_.js +0 -1
  682. package/dist/web/assets/remote-desktop-readiness-gate-DuT4A893.js +0 -1
  683. package/dist/web/assets/remote-desktop-window-content-B4V-1aJn.js +0 -1
  684. package/dist/web/assets/save-BehCuMf4.js +0 -1
  685. package/dist/web/assets/schedules-settings-section-C2SjwWFB.js +0 -1
  686. package/dist/web/assets/send-CtXcGcsk.js +0 -1
  687. package/dist/web/assets/settings-body-CdFauCAU.js +0 -2
  688. package/dist/web/assets/settings-store-BkNrLdjk.js +0 -2
  689. package/dist/web/assets/settings-tab-DGUlmMbc.js +0 -1
  690. package/dist/web/assets/settings-window-content-CIH5sihe.js +0 -1
  691. package/dist/web/assets/shield-check-z9PX8HVZ.js +0 -1
  692. package/dist/web/assets/shield-off-Du0U5dVI.js +0 -1
  693. package/dist/web/assets/sparkles-CO9zx1f-.js +0 -1
  694. package/dist/web/assets/sqlite-viewer-Bpz7QnBk.js +0 -1
  695. package/dist/web/assets/system-monitor-body-BBJOWFCa.js +0 -2
  696. package/dist/web/assets/system-monitor-tab-D7RIwhmg.js +0 -1
  697. package/dist/web/assets/system-monitor-window-content-CH0UmMP9.js +0 -1
  698. package/dist/web/assets/tab-host-window-content-C_yU5MH_.js +0 -1
  699. package/dist/web/assets/table-BK4h8E7u.js +0 -1
  700. package/dist/web/assets/team-member-sheet-CopMME1E.js +0 -2
  701. package/dist/web/assets/team-member-window-content-CUDQ6oX7.js +0 -1
  702. package/dist/web/assets/terminal-tab-BjI95uG5.js +0 -3
  703. package/dist/web/assets/text-wrap-DLtVgSnU.js +0 -1
  704. package/dist/web/assets/tool-cards-I71v1w5Z.js +0 -9
  705. package/dist/web/assets/treemap-KZPCXAKY-BBrhTPZk.js +0 -1
  706. package/dist/web/assets/use-coarse-long-press-XrJ4Upuv.js +0 -1
  707. package/dist/web/assets/use-inline-blame-CRUwd6FF.js +0 -8
  708. package/dist/web/assets/use-monaco-theme-qzMbRfCW.js +0 -1
  709. package/dist/web/assets/use-remote-desktop-display-choice-0zDkCmsK.js +0 -1
  710. package/dist/web/assets/video-preview-Mlgl7hGr.js +0 -1
  711. package/dist/web/assets/ws-auth-DI1E6Fe7.js +0 -1
  712. package/dist/web/assets/x-DlnNFF2t.js +0 -1
  713. package/dist/web/monacoeditorwork/css.worker.bundle.js +0 -54268
  714. package/dist/web/monacoeditorwork/editor.worker.bundle.js +0 -14316
  715. package/dist/web/monacoeditorwork/html.worker.bundle.js +0 -30452
  716. package/dist/web/monacoeditorwork/json.worker.bundle.js +0 -22095
  717. package/dist/web/monacoeditorwork/ts.worker.bundle.js +0 -225957
  718. package/src/web/components/explorer/file-icon-map.ts +0 -69
  719. /package/dist/web/assets/{abap-BIHt2d9F.js → abap-tkptwpsK.js} +0 -0
  720. /package/dist/web/assets/{actionscript-3-rbCNRHFj.js → actionscript-3-Di9TMGwg.js} +0 -0
  721. /package/dist/web/assets/{ada-CN94LQTJ.js → ada-CB9F079D.js} +0 -0
  722. /package/dist/web/assets/{andromeeda-BsmcoXuQ.js → andromeeda-Dcl8jpb7.js} +0 -0
  723. /package/dist/web/assets/{apache-pRQmqcVZ.js → apache-D0Nk0qsH.js} +0 -0
  724. /package/dist/web/assets/{apex-CNEumC1X.js → apex-mQIoWncD.js} +0 -0
  725. /package/dist/web/assets/{api-client-DKvkxuDr.js → api-client-bfB7cXRM.js} +0 -0
  726. /package/dist/web/assets/{applescript-DjEVsS-3.js → applescript-C6ljbcsI.js} +0 -0
  727. /package/dist/web/assets/{apply-theme-Abd1TNqE.js → apply-theme-BwIMNXyX.js} +0 -0
  728. /package/dist/web/assets/{ara-DbhZRlTL.js → ara-WFqRPGPe.js} +0 -0
  729. /package/dist/web/assets/{asciidoc-BsfbAXIK.js → asciidoc-bNd8w4nf.js} +0 -0
  730. /package/dist/web/assets/{asm-Vw5NMXjI.js → asm-BQ1_F580.js} +0 -0
  731. /package/dist/web/assets/{aurora-x-CoahU6sR.js → aurora-x-Ciqs_Dbu.js} +0 -0
  732. /package/dist/web/assets/{awk-ChKjCxHz.js → awk-GCR-6KZV.js} +0 -0
  733. /package/dist/web/assets/{ayu-dark-By9RKxTf.js → ayu-dark-DxJXuj99.js} +0 -0
  734. /package/dist/web/assets/{ayu-light-CEsgeLON.js → ayu-light-jvSyJWDV.js} +0 -0
  735. /package/dist/web/assets/{ayu-mirage-CYrtwSLW.js → ayu-mirage-Cg3BPO6H.js} +0 -0
  736. /package/dist/web/assets/{ballerina-CCSVz22W.js → ballerina-BPz4CrX6.js} +0 -0
  737. /package/dist/web/assets/{bat-DU4--CMj.js → bat-CSTs2hIG.js} +0 -0
  738. /package/dist/web/assets/{beancount-DF_tlRlF.js → beancount-DMateAZX.js} +0 -0
  739. /package/dist/web/assets/{berry-CZTnatvO.js → berry-9lXg0GRM.js} +0 -0
  740. /package/dist/web/assets/{bibtex-BSpXy8jk.js → bibtex-DIbqmvFg.js} +0 -0
  741. /package/dist/web/assets/{bicep-yv1Ydq5Z.js → bicep-02WGsoJ8.js} +0 -0
  742. /package/dist/web/assets/{bird2-Db7Z7SMN.js → bird2-BY0tbu3k.js} +0 -0
  743. /package/dist/web/assets/{c-C3ivhwA4.js → c-jMBX_9Je.js} +0 -0
  744. /package/dist/web/assets/{c3-N4mKyst9.js → c3-B8JVbNjW.js} +0 -0
  745. /package/dist/web/assets/{cadence-BYK8tFFk.js → cadence-DUIf1tvL.js} +0 -0
  746. /package/dist/web/assets/{can-open-in-ppm-DU5MH6XF.js → can-open-in-ppm-DGEc0s4P.js} +0 -0
  747. /package/dist/web/assets/{catppuccin-frappe-BK9Tv2XG.js → catppuccin-frappe-FhUCVxex.js} +0 -0
  748. /package/dist/web/assets/{catppuccin-latte-De4mVCp3.js → catppuccin-latte-CzfrtmgL.js} +0 -0
  749. /package/dist/web/assets/{catppuccin-macchiato-Bxt_D7cs.js → catppuccin-macchiato-6xL0lOtj.js} +0 -0
  750. /package/dist/web/assets/{catppuccin-mocha-Dz2o8gN7.js → catppuccin-mocha-D39-xS3P.js} +0 -0
  751. /package/dist/web/assets/{clarity-BJdh0Pw-.js → clarity-D8TeGvoT.js} +0 -0
  752. /package/dist/web/assets/{clojure-DG-FYGzn.js → clojure-Dx_acSX7.js} +0 -0
  753. /package/dist/web/assets/{cmake-D1imEXan.js → cmake-CyeYPq8o.js} +0 -0
  754. /package/dist/web/assets/{codeowners-YpylTFB5.js → codeowners-DrTI0lmI.js} +0 -0
  755. /package/dist/web/assets/{codeql-ajDEPgqi.js → codeql-CPkFxVW-.js} +0 -0
  756. /package/dist/web/assets/{common-lisp-C2sCrd-m.js → common-lisp-B0k-3LTj.js} +0 -0
  757. /package/dist/web/assets/{coq-BqybyDc9.js → coq-uygpo7to.js} +0 -0
  758. /package/dist/web/assets/{createLucideIcon-D6fVXe3s.js → createLucideIcon-DoiEKeJ_.js} +0 -0
  759. /package/dist/web/assets/{csharp-nKCEiujy.js → csharp-DKUYGfSp.js} +0 -0
  760. /package/dist/web/assets/{css-CJSp2CsD.js → css-DoOUp7v4.js} +0 -0
  761. /package/dist/web/assets/{csv-Nh9vQwQm.js → csv-B3YE13gi.js} +0 -0
  762. /package/dist/web/assets/{csv-parser-iow1WWML.js → csv-parser-DXePqmXe.js} +0 -0
  763. /package/dist/web/assets/{cue-Ch79RPsU.js → cue-DViO2wvn.js} +0 -0
  764. /package/dist/web/assets/{cypher-CgiOQ6hs.js → cypher-4BMCIW5N.js} +0 -0
  765. /package/dist/web/assets/{d-CmBcySpH.js → d-BT_sTHas.js} +0 -0
  766. /package/dist/web/assets/{dark-plus-COLEX2ui.js → dark-plus-DVVXu-1N.js} +0 -0
  767. /package/dist/web/assets/{dart-BTAArMcJ.js → dart-DHz6f6_6.js} +0 -0
  768. /package/dist/web/assets/{data-grid-types-tNj9zuRV.js → data-grid-types-OgUxMLdQ.js} +0 -0
  769. /package/dist/web/assets/{dax-BbZzRY9i.js → dax-ChYCjweK.js} +0 -0
  770. /package/dist/web/assets/{desktop-OmQvU3-J.js → desktop-D6Lt4p04.js} +0 -0
  771. /package/dist/web/assets/{diff-BEPnb9Fb.js → diff-D8TDe4hP.js} +0 -0
  772. /package/dist/web/assets/{dist-BiqPfYiP.js → dist-CrBOCtCW.js} +0 -0
  773. /package/dist/web/assets/{dist-BDpuZ376.js → dist-DOTlFQJA.js} +0 -0
  774. /package/dist/web/assets/{docker-Cg17HgTD.js → docker-Bsp0YbPx.js} +0 -0
  775. /package/dist/web/assets/{dotenv-DEMIaY7V.js → dotenv-B_7giSY_.js} +0 -0
  776. /package/dist/web/assets/{dracula-BkCFq8SO.js → dracula-TrQL2iB5.js} +0 -0
  777. /package/dist/web/assets/{dracula-soft-Cjp6-ltF.js → dracula-soft-n2XOlgh-.js} +0 -0
  778. /package/dist/web/assets/{dream-maker-Ce7Y_UKj.js → dream-maker-CdIEdhpT.js} +0 -0
  779. /package/dist/web/assets/{emacs-lisp-BjpyfTbN.js → emacs-lisp-CSbixs6u.js} +0 -0
  780. /package/dist/web/assets/{everforest-dark-9r4okw1s.js → everforest-dark-BuZahZYp.js} +0 -0
  781. /package/dist/web/assets/{everforest-light-GCQTZ3Ju.js → everforest-light-DPH53z5H.js} +0 -0
  782. /package/dist/web/assets/{fennel-ITjY5Z6u.js → fennel-B1-K_hlJ.js} +0 -0
  783. /package/dist/web/assets/{fish-DP2uEzyg.js → fish-Cy12Dbua.js} +0 -0
  784. /package/dist/web/assets/{fluent-irzaP1f6.js → fluent-B_82ys8E.js} +0 -0
  785. /package/dist/web/assets/{format-bytes-B9Dbme9a.js → format-bytes-D5sBgIqU.js} +0 -0
  786. /package/dist/web/assets/{fortran-free-form-BAPoainr.js → fortran-free-form-BRQdNzZF.js} +0 -0
  787. /package/dist/web/assets/{gdscript-DJ098V1z.js → gdscript-XBDmLUm9.js} +0 -0
  788. /package/dist/web/assets/{gdshader-DS2Jfy-K.js → gdshader-DhVfB3u4.js} +0 -0
  789. /package/dist/web/assets/{genie-CqfOaFFx.js → genie-X3K29Y49.js} +0 -0
  790. /package/dist/web/assets/{gherkin-CoZ2ucDH.js → gherkin-DKIx-6cX.js} +0 -0
  791. /package/dist/web/assets/{github-dark-BNLgnSO9.js → github-dark-Bf7zdp5s.js} +0 -0
  792. /package/dist/web/assets/{github-dark-default-CYlSggwi.js → github-dark-default-DqsBBV11.js} +0 -0
  793. /package/dist/web/assets/{github-dark-dimmed-DumUysDk.js → github-dark-dimmed-X2gqRz6w.js} +0 -0
  794. /package/dist/web/assets/{github-dark-high-contrast-TKrcDJ2I.js → github-dark-high-contrast-Z7tvbGX4.js} +0 -0
  795. /package/dist/web/assets/{github-light-DVENFHLJ.js → github-light-BKxt-7zZ.js} +0 -0
  796. /package/dist/web/assets/{github-light-default-DtN8AGcE.js → github-light-default-B0liF4d4.js} +0 -0
  797. /package/dist/web/assets/{github-light-high-contrast-NSyF37x4.js → github-light-high-contrast-F4encJwr.js} +0 -0
  798. /package/dist/web/assets/{gleam-hp4NMSb5.js → gleam-Pz2bHgBB.js} +0 -0
  799. /package/dist/web/assets/{gn-Dptw2PEu.js → gn-CgmdNsPU.js} +0 -0
  800. /package/dist/web/assets/{gnuplot-9juRzjwv.js → gnuplot-qLNF5yZ9.js} +0 -0
  801. /package/dist/web/assets/{go-D-QLCda0.js → go-CSDUNhE7.js} +0 -0
  802. /package/dist/web/assets/{groovy-DHKNy6Eh.js → groovy-B3NEnOHF.js} +0 -0
  803. /package/dist/web/assets/{gruvbox-dark-hard-BFD6aQdB.js → gruvbox-dark-hard-DcoftiUX.js} +0 -0
  804. /package/dist/web/assets/{gruvbox-dark-medium-D5llYBNp.js → gruvbox-dark-medium-D1wVSuD8.js} +0 -0
  805. /package/dist/web/assets/{gruvbox-dark-soft-DOztQmNR.js → gruvbox-dark-soft-DWpunymH.js} +0 -0
  806. /package/dist/web/assets/{gruvbox-light-hard-BFGD-8Pd.js → gruvbox-light-hard-rHMvyUdS.js} +0 -0
  807. /package/dist/web/assets/{gruvbox-light-medium-DzoyXgT7.js → gruvbox-light-medium-3O2KiXO7.js} +0 -0
  808. /package/dist/web/assets/{gruvbox-light-soft-B1Ix2zLN.js → gruvbox-light-soft-lNlXJPwH.js} +0 -0
  809. /package/dist/web/assets/{haskell-BnrJ0k7G.js → haskell-aaG3aC0h.js} +0 -0
  810. /package/dist/web/assets/{haxe-DwShHT_-.js → haxe-CPcHhUDd.js} +0 -0
  811. /package/dist/web/assets/{hcl-VOjEibVB.js → hcl-CMQNlR_4.js} +0 -0
  812. /package/dist/web/assets/{hjson-BHEn7pNn.js → hjson-DeuklPFj.js} +0 -0
  813. /package/dist/web/assets/{hlsl-CrvxlGii.js → hlsl-BI3hlsaM.js} +0 -0
  814. /package/dist/web/assets/{horizon-D3T-P0u6.js → horizon-C7-gOcjs.js} +0 -0
  815. /package/dist/web/assets/{horizon-bright-vifGsEdk.js → horizon-bright-Cxt9bRW7.js} +0 -0
  816. /package/dist/web/assets/{houston-IrOgT7r4.js → houston-DbF2G7iD.js} +0 -0
  817. /package/dist/web/assets/{hy-5eSgTJ8G.js → hy-DRG6Hs2I.js} +0 -0
  818. /package/dist/web/assets/{image-gallery-COea0nSk.js → image-gallery-CObzTisL.js} +0 -0
  819. /package/dist/web/assets/{imba-Dp0I4DVl.js → imba-CxKv_2TW.js} +0 -0
  820. /package/dist/web/assets/{ini-CHDKad9O.js → ini-BiHsyCdO.js} +0 -0
  821. /package/dist/web/assets/{java-YLv7IDJ1.js → java-D3RZzgDB.js} +0 -0
  822. /package/dist/web/assets/{javascript-jr4kIdgl.js → javascript-4FmSqG-T.js} +0 -0
  823. /package/dist/web/assets/{json-EJWSOZfp.js → json-CjB236_E.js} +0 -0
  824. /package/dist/web/assets/{json5-D6f_uNwJ.js → json5-bkfO-Rco.js} +0 -0
  825. /package/dist/web/assets/{jsonc-DrHCdmos.js → jsonc-BwaTeLyv.js} +0 -0
  826. /package/dist/web/assets/{jsonl-Cwc3cXEL.js → jsonl-CfxNSwGd.js} +0 -0
  827. /package/dist/web/assets/{jsonnet-BwZfaIFT.js → jsonnet-CQETCYrp.js} +0 -0
  828. /package/dist/web/assets/{jssm-BpEmg_MT.js → jssm-D5o3Zzdz.js} +0 -0
  829. /package/dist/web/assets/{jsx-DBGPwcr4.js → jsx-BAMILPLo.js} +0 -0
  830. /package/dist/web/assets/{kanagawa-dragon-DRfVaGIX.js → kanagawa-dragon-BhGVxu3R.js} +0 -0
  831. /package/dist/web/assets/{kanagawa-lotus-CjOlny0Q.js → kanagawa-lotus-FH4Y59ro.js} +0 -0
  832. /package/dist/web/assets/{kanagawa-wave-DvdM88a4.js → kanagawa-wave-eilvP9MB.js} +0 -0
  833. /package/dist/web/assets/{kdl-DSo3PvM0.js → kdl-BQ-yvXUK.js} +0 -0
  834. /package/dist/web/assets/{kotlin-BV8TwCGu.js → kotlin-BuCx0-VT.js} +0 -0
  835. /package/dist/web/assets/{kusto-DCo1Fdmm.js → kusto-DAN_n_Cy.js} +0 -0
  836. /package/dist/web/assets/{laserwave-DPX9FvD9.js → laserwave-Cq2BlxrT.js} +0 -0
  837. /package/dist/web/assets/{lean-Cya8dqZu.js → lean-Dhq7uXKw.js} +0 -0
  838. /package/dist/web/assets/{less-CJUPgkIs.js → less-CxaMQb8j.js} +0 -0
  839. /package/dist/web/assets/{lib-DUBAP_Gd.js → lib-BVwmtv2i.js} +0 -0
  840. /package/dist/web/assets/{libesm-CcPYXCKp.js → libesm-DdtEjhIi.js} +0 -0
  841. /package/dist/web/assets/{light-plus-BXXrlFJH.js → light-plus-B4sMAend.js} +0 -0
  842. /package/dist/web/assets/{llvm-CUbQanZr.js → llvm-DQ6-B_6Y.js} +0 -0
  843. /package/dist/web/assets/{log-B3fFlSMd.js → log-Bb_vqvu7.js} +0 -0
  844. /package/dist/web/assets/{logo-ucAyw6zf.js → logo-BzfYv3A_.js} +0 -0
  845. /package/dist/web/assets/{luau-C4l6TSTB.js → luau-BnAeNR77.js} +0 -0
  846. /package/dist/web/assets/{make-CDtGIVc7.js → make-B6IFuxpC.js} +0 -0
  847. /package/dist/web/assets/{markdown-CH1zKu2p.js → markdown-Z0xi77Fn.js} +0 -0
  848. /package/dist/web/assets/{material-theme-CEuGVTmh.js → material-theme-1scy1SYn.js} +0 -0
  849. /package/dist/web/assets/{material-theme-darker-CUZ3MoIr.js → material-theme-darker-G-JykXQP.js} +0 -0
  850. /package/dist/web/assets/{material-theme-lighter-DxAqJSid.js → material-theme-lighter-BtKkCMVq.js} +0 -0
  851. /package/dist/web/assets/{material-theme-ocean-BSvvHJp6.js → material-theme-ocean-irrDC89L.js} +0 -0
  852. /package/dist/web/assets/{material-theme-palenight-QVOl50_m.js → material-theme-palenight-Eq5_K4LM.js} +0 -0
  853. /package/dist/web/assets/{matlab-CZLQLwUp.js → matlab-BE3oCXZC.js} +0 -0
  854. /package/dist/web/assets/{mdx-DO4NJsOo.js → mdx-DYiuFTGw.js} +0 -0
  855. /package/dist/web/assets/{mermaid-CIwzg1uO.js → mermaid-DVlaEvtw.js} +0 -0
  856. /package/dist/web/assets/{min-dark-BdIgslXy.js → min-dark-DSkeTpQa.js} +0 -0
  857. /package/dist/web/assets/{min-light-DyU-T1r2.js → min-light-CFv2Q0uF.js} +0 -0
  858. /package/dist/web/assets/{mipsasm-DRad-Klm.js → mipsasm-CiAFuZQ2.js} +0 -0
  859. /package/dist/web/assets/{mojo-DXp5LDOc.js → mojo-ARshcaSQ.js} +0 -0
  860. /package/dist/web/assets/{monokai-BiKX3qby.js → monokai-CPTV-SOg.js} +0 -0
  861. /package/dist/web/assets/{moonbit-BOUoLF5r.js → moonbit-D57B0dZr.js} +0 -0
  862. /package/dist/web/assets/{move-Dlk64FWK.js → move-qgy3G_o9.js} +0 -0
  863. /package/dist/web/assets/{narrat-B-qd2Lh0.js → narrat-CZ3rC-oc.js} +0 -0
  864. /package/dist/web/assets/{nextflow-groovy-iAMYas0F.js → nextflow-groovy-BxxIOcI4.js} +0 -0
  865. /package/dist/web/assets/{night-owl-3YNqjftR.js → night-owl-B1ryGCda.js} +0 -0
  866. /package/dist/web/assets/{night-owl-light-GIncHb5w.js → night-owl-light-BZvNnvMF.js} +0 -0
  867. /package/dist/web/assets/{nix-xjlEb3uw.js → nix-BVBQi8yv.js} +0 -0
  868. /package/dist/web/assets/{nord-C8tvWx7P.js → nord-3NXw613h.js} +0 -0
  869. /package/dist/web/assets/{nushell-BqBb4pU6.js → nushell-BMOLRalb.js} +0 -0
  870. /package/dist/web/assets/{objective-c-Bk6s0Cn5.js → objective-c-AxruEUgh.js} +0 -0
  871. /package/dist/web/assets/{objective-cpp-DGTVWQ3V.js → objective-cpp-cFT0qRsD.js} +0 -0
  872. /package/dist/web/assets/{ocaml-D6wPQ4kw.js → ocaml-_8JH6O8J.js} +0 -0
  873. /package/dist/web/assets/{odin-C9mw2xRN.js → odin-nwYvR0O6.js} +0 -0
  874. /package/dist/web/assets/{one-dark-pro-SMBlneFb.js → one-dark-pro-C1LaYJaH.js} +0 -0
  875. /package/dist/web/assets/{one-light-C9JMU1Cx.js → one-light-B7rMc__c.js} +0 -0
  876. /package/dist/web/assets/{openscad-C0I9CtuA.js → openscad-Cwes8bKO.js} +0 -0
  877. /package/dist/web/assets/{pascal-D0z4DJnY.js → pascal-DMt-6tdZ.js} +0 -0
  878. /package/dist/web/assets/{pkl-CITYNGVz.js → pkl-QBTyYQmB.js} +0 -0
  879. /package/dist/web/assets/{plastic-Bf0T6rmg.js → plastic-BTSUp8Fk.js} +0 -0
  880. /package/dist/web/assets/{plsql-Chr907pu.js → plsql-DQv3IFXP.js} +0 -0
  881. /package/dist/web/assets/{po-07U75CYV.js → po-CNwZx4tW.js} +0 -0
  882. /package/dist/web/assets/{poimandres-B0T4qwXY.js → poimandres-8Os7Qequ.js} +0 -0
  883. /package/dist/web/assets/{polar-BvNJMMV5.js → polar-b4yK8oD8.js} +0 -0
  884. /package/dist/web/assets/{portal-container-context-Bqn516X4.js → portal-container-context-BarKmT4S.js} +0 -0
  885. /package/dist/web/assets/{postcss-BSdf-zzo.js → postcss-sFctwpxx.js} +0 -0
  886. /package/dist/web/assets/{powerquery-B2Ad_HK8.js → powerquery-Cg_WrtuN.js} +0 -0
  887. /package/dist/web/assets/{powershell-DO5WY2v2.js → powershell-C7Ifz95h.js} +0 -0
  888. /package/dist/web/assets/{prisma-BfaRPYzs.js → prisma-Z52HUJzQ.js} +0 -0
  889. /package/dist/web/assets/{prolog-Cz0Nue9e.js → prolog-DLqW-zR1.js} +0 -0
  890. /package/dist/web/assets/{proto-FVleUZJO.js → proto-BOIzxCCJ.js} +0 -0
  891. /package/dist/web/assets/{puppet-BEX5o7hE.js → puppet-De7TjZIf.js} +0 -0
  892. /package/dist/web/assets/{purescript-BZX6Kw4j.js → purescript-R76ou1WT.js} +0 -0
  893. /package/dist/web/assets/{python-CO89UIxE.js → python-Dprm0tNP.js} +0 -0
  894. /package/dist/web/assets/{qmldir-DH526DWB.js → qmldir-Clp_jpNw.js} +0 -0
  895. /package/dist/web/assets/{qss-wp8im4Iz.js → qss-eQPYYzSo.js} +0 -0
  896. /package/dist/web/assets/{r-F9n--bvq.js → r-CCcRHIf5.js} +0 -0
  897. /package/dist/web/assets/{racket-BQvbOE5D.js → racket-CzE472yp.js} +0 -0
  898. /package/dist/web/assets/{raku-B0iWSynj.js → raku-DQwXrTSi.js} +0 -0
  899. /package/dist/web/assets/{react-Bcm1Oab0.js → react-Bghu0NUO.js} +0 -0
  900. /package/dist/web/assets/{red-Cm00r9eI.js → red-KCS6wyop.js} +0 -0
  901. /package/dist/web/assets/{reg-CBuhna22.js → reg-CcrAddUh.js} +0 -0
  902. /package/dist/web/assets/{regexp-C9j1_6oU.js → regexp-DDbud-Ri.js} +0 -0
  903. /package/dist/web/assets/{rel-BYzlBhbq.js → rel-99GDgaHp.js} +0 -0
  904. /package/dist/web/assets/{resolve-theme-Dm8ehbOv.js → resolve-theme-CW2niGV2.js} +0 -0
  905. /package/dist/web/assets/{riscv-CQQP0Ro9.js → riscv-Dm2eNv0R.js} +0 -0
  906. /package/dist/web/assets/{ron-j1ON9YzM.js → ron-CzFt0ygH.js} +0 -0
  907. /package/dist/web/assets/{rose-pine-Cbri3jon.js → rose-pine-Ck6lCrCP.js} +0 -0
  908. /package/dist/web/assets/{rose-pine-dawn-BMuvKrGo.js → rose-pine-dawn-vtALRJNj.js} +0 -0
  909. /package/dist/web/assets/{rose-pine-moon-4biZzaYD.js → rose-pine-moon-DPto8qXw.js} +0 -0
  910. /package/dist/web/assets/{rosmsg-CXx22rtz.js → rosmsg-NtS6429H.js} +0 -0
  911. /package/dist/web/assets/{rust-D28cFIhL.js → rust-BjIXvF9h.js} +0 -0
  912. /package/dist/web/assets/{sass-DtNw4V28.js → sass-CQ23wf5E.js} +0 -0
  913. /package/dist/web/assets/{scala-hv69_YQC.js → scala-LfKLM143.js} +0 -0
  914. /package/dist/web/assets/{scheme-Dtp9B_ng.js → scheme-D3SLBXlF.js} +0 -0
  915. /package/dist/web/assets/{sdbl-DEwEngAE.js → sdbl-ODRd2rGN.js} +0 -0
  916. /package/dist/web/assets/{shellscript-CCOF9tox.js → shellscript-3KB1G_oA.js} +0 -0
  917. /package/dist/web/assets/{slack-dark-DT0E0ABt.js → slack-dark-DTtyWmIy.js} +0 -0
  918. /package/dist/web/assets/{slack-ochin-DHHiQnxo.js → slack-ochin-Bu0PApk3.js} +0 -0
  919. /package/dist/web/assets/{smalltalk-BF_I35xJ.js → smalltalk-haMT-Sbe.js} +0 -0
  920. /package/dist/web/assets/{snazzy-light-Cv7tIZo9.js → snazzy-light-DXJzefE9.js} +0 -0
  921. /package/dist/web/assets/{solarized-dark-wZ5YPCys.js → solarized-dark-B6LyYa18.js} +0 -0
  922. /package/dist/web/assets/{solarized-light-DGDOr1AS.js → solarized-light-QLADebkv.js} +0 -0
  923. /package/dist/web/assets/{solidity-BJknuPqJ.js → solidity-mzfq1aDc.js} +0 -0
  924. /package/dist/web/assets/{splunk-B1ClO_KU.js → splunk-CyH4RWBp.js} +0 -0
  925. /package/dist/web/assets/{sql-CXZ66NtF.js → sql-CWVlT5D3.js} +0 -0
  926. /package/dist/web/assets/{ssh-config-kgM67Sf6.js → ssh-config-DNvQJ1Qx.js} +0 -0
  927. /package/dist/web/assets/{stylus-RcVaInR-.js → stylus-ByQQdtmf.js} +0 -0
  928. /package/dist/web/assets/{swift-Cm0fh2lX.js → swift-D1cpY4ow.js} +0 -0
  929. /package/dist/web/assets/{synthwave-84-CwLiazxr.js → synthwave-84-BDF_-QiW.js} +0 -0
  930. /package/dist/web/assets/{system-verilog-CzYaDVLH.js → system-verilog-BYrkMydC.js} +0 -0
  931. /package/dist/web/assets/{systemd-DbSagfLw.js → systemd-CQm3zyK0.js} +0 -0
  932. /package/dist/web/assets/{talonscript-BCFnWejL.js → talonscript-DMW5CzE1.js} +0 -0
  933. /package/dist/web/assets/{tasl-BUdqtEe1.js → tasl-BhFzMCr2.js} +0 -0
  934. /package/dist/web/assets/{tcl-CR_lTV9N.js → tcl-D7VEAF-9.js} +0 -0
  935. /package/dist/web/assets/{terraform-Bqsha-xe.js → terraform-DdT5A0Vy.js} +0 -0
  936. /package/dist/web/assets/{tokyo-night-Cnuo6JB6.js → tokyo-night-WGLMM6Q9.js} +0 -0
  937. /package/dist/web/assets/{toml-CLFdhT22.js → toml-CZ7ipXHZ.js} +0 -0
  938. /package/dist/web/assets/{tsv-Dw3tLrZN.js → tsv-B1zVvoTr.js} +0 -0
  939. /package/dist/web/assets/{tsx-B8k1sFqw.js → tsx-D4HwRUBq.js} +0 -0
  940. /package/dist/web/assets/{turtle-BMKMfTrj.js → turtle-B4r8KEJH.js} +0 -0
  941. /package/dist/web/assets/{typescript-D38LfGSl.js → typescript-BnHhxMtp.js} +0 -0
  942. /package/dist/web/assets/{typespec-EbgGJHV_.js → typespec-DP2q46GT.js} +0 -0
  943. /package/dist/web/assets/{typst-CQXV2SzX.js → typst-DFsD_yaD.js} +0 -0
  944. /package/dist/web/assets/{use-is-mobile-Dypg-2ZO.js → use-is-mobile-BQ9Bv5Ga.js} +0 -0
  945. /package/dist/web/assets/{use-visual-viewport-Bj3QHRkF.js → use-visual-viewport-CbwnktSG.js} +0 -0
  946. /package/dist/web/assets/{utils-CwNUra6_.js → utils-Bmf_8h7Y.js} +0 -0
  947. /package/dist/web/assets/{v-Ci1jObJJ.js → v-Bji8hSVT.js} +0 -0
  948. /package/dist/web/assets/{vala-C_NdfqrY.js → vala-D3TIgGmU.js} +0 -0
  949. /package/dist/web/assets/{vb-K_r_h_s8.js → vb-DvcxFS2q.js} +0 -0
  950. /package/dist/web/assets/{vendor-xterm-BtjgHRUe.js → vendor-xterm-BqPDsE9b.js} +0 -0
  951. /package/dist/web/assets/{verilog-DQPYLsZI.js → verilog-Dy7cF35d.js} +0 -0
  952. /package/dist/web/assets/{vesper-BrmzEV8s.js → vesper-BzjwUv9J.js} +0 -0
  953. /package/dist/web/assets/{vhdl-CjxQGaH2.js → vhdl-DuFnFNmW.js} +0 -0
  954. /package/dist/web/assets/{viml-CTKJNQH1.js → viml-yAPgKlbz.js} +0 -0
  955. /package/dist/web/assets/{vitesse-black-i-H_3p1i.js → vitesse-black-oSSQdyIZ.js} +0 -0
  956. /package/dist/web/assets/{vitesse-dark-DZC_Yy3_.js → vitesse-dark-BZxwPihB.js} +0 -0
  957. /package/dist/web/assets/{vitesse-light-rf4kpmk8.js → vitesse-light-uIigycvt.js} +0 -0
  958. /package/dist/web/assets/{vyper-BLnOw4Nf.js → vyper-CX3NAxm5.js} +0 -0
  959. /package/dist/web/assets/{wasm-DbLMmiW0.js → wasm-6mEOOvVa.js} +0 -0
  960. /package/dist/web/assets/{wasm-CWeHvGNG.js → wasm-D9td37qO.js} +0 -0
  961. /package/dist/web/assets/{wenyan-CLwdRuzd.js → wenyan-lwNIHgk6.js} +0 -0
  962. /package/dist/web/assets/{wgsl-CBTDMVJR.js → wgsl-DQAzCfog.js} +0 -0
  963. /package/dist/web/assets/{wikitext-CQHrF84e.js → wikitext-DTXmt5NE.js} +0 -0
  964. /package/dist/web/assets/{wit-8xdbdipU.js → wit-Bdw_7WDH.js} +0 -0
  965. /package/dist/web/assets/{wolfram-tFwx32a_.js → wolfram-DqyHDZ07.js} +0 -0
  966. /package/dist/web/assets/{yaml-BP8N91fU.js → yaml-CPXhdByd.js} +0 -0
  967. /package/dist/web/assets/{zenscript-B10Pj7JT.js → zenscript-6s_i5zek.js} +0 -0
  968. /package/dist/web/assets/{zig-BZKcTtrK.js → zig-B2htezJ_.js} +0 -0
@@ -1,15 +1,18 @@
1
1
  /**
2
- * Shared tab-type → lucide icon map.
2
+ * Shared tab-type → icon map.
3
3
  *
4
4
  * Single source of truth so the mobile nav, dock header, and tab bar render the
5
5
  * same glyph per tab type. Adding a new panel tab type = one entry here, no
6
6
  * per-component change (extensibility invariant for the generalized dock).
7
7
  */
8
8
  import {
9
- Terminal, MessageSquare, FileCode, Database, FileDiff, Settings, Puzzle, Sparkles, Users,
9
+ Terminal, MessageSquare, FileCode, Database, FileDiff, Settings, Puzzle, Sparkles, Users, CircleX,
10
+ GitCommitHorizontal,
10
11
  type LucideIcon,
11
- } from "lucide-react";
12
+ } from "@/lib/icons";
13
+ import type { ElementType } from "react";
12
14
  import type { TabType } from "@/stores/tab-store";
15
+ import { fileIconElement } from "@/lib/file-icons";
13
16
 
14
17
  export const TAB_TYPE_ICONS: Record<TabType, LucideIcon> = {
15
18
  terminal: Terminal,
@@ -24,12 +27,37 @@ export const TAB_TYPE_ICONS: Record<TabType, LucideIcon> = {
24
27
  "extension-webview": Puzzle,
25
28
  "conflict-editor": FileDiff,
26
29
  "system-monitor": Settings,
27
- "git-log": FileCode,
30
+ "git-log": GitCommitHorizontal,
28
31
  "ai-resource": Sparkles,
29
32
  group: Users,
33
+ problems: CircleX,
30
34
  };
31
35
 
32
36
  /** Resolve the icon for a tab type, falling back to a generic glyph. */
33
37
  export function getTabTypeIcon(type: TabType): LucideIcon {
34
38
  return TAB_TYPE_ICONS[type] ?? Puzzle;
35
39
  }
40
+
41
+ /** The tab types whose title names a file rather than a kind of panel. */
42
+ const FILE_TAB_TYPES = new Set<TabType>(["editor", "git-diff", "conflict-editor"]);
43
+
44
+ export interface TabIconSubject {
45
+ type: TabType;
46
+ title: string;
47
+ metadata?: Record<string, unknown>;
48
+ }
49
+
50
+ /**
51
+ * A tab that holds a file is labelled with *that file's* icon, the way VS Code
52
+ * does it — a strip of eight identical `FileCode` glyphs tells you nothing about
53
+ * which tab is which, and that is just as true of the dock header and the mobile
54
+ * tab switcher as it is of the desktop strip. The tab's own metadata is
55
+ * preferred over its title, which a rename or a "(hash)" suffix can have edited.
56
+ */
57
+ export function getTabIcon(tab: TabIconSubject): ElementType {
58
+ if (FILE_TAB_TYPES.has(tab.type)) {
59
+ const path = (tab.metadata?.filePath as string | undefined) || tab.title;
60
+ if (path) return fileIconElement(path);
61
+ }
62
+ return getTabTypeIcon(tab.type);
63
+ }
package/src/web/main.tsx CHANGED
@@ -1,6 +1,24 @@
1
1
  import { StrictMode } from "react";
2
2
  import { createRoot } from "react-dom/client";
3
3
  import { App } from "./app.tsx";
4
+ import { RootErrorBoundary } from "./components/root-error-boundary.tsx";
5
+ import { installChunkErrorRecovery } from "./lib/chunk-recovery.ts";
6
+ // Self-hosted, because a font stack is only a wish list: -apple-system and
7
+ // Segoe UI miss on Linux and a generic sans-serif can resolve to Liberation
8
+ // *Serif* through fontconfig, so every surface named a font it never got. Each
9
+ // face is a separate lazy request the browser only makes for text that uses it
10
+ // — Geist by subset (the Vietnamese range is its own file), Monaspace only once
11
+ // an editor or a terminal is on screen — and none of them are precached.
12
+ import "@fontsource-variable/geist/wght.css";
13
+ import "@fontsource-variable/geist/wght-italic.css";
14
+ import "@fontsource/monaspace-argon/latin-400.css";
15
+ import "@fontsource/monaspace-argon/latin-400-italic.css";
16
+ import "@fontsource/monaspace-argon/latin-700.css";
17
+ import "@fontsource/monaspace-krypton/latin-400.css";
18
+ import "@fontsource/monaspace-krypton/latin-400-italic.css";
19
+ // The terminal's icon glyphs, split per Nerd Fonts block so a powerline prompt
20
+ // costs 7 KiB and only someone drawing a Material Design icon pays for those.
21
+ import "./styles/nerd-font.generated.css";
4
22
  import "./styles/globals.css";
5
23
  import "katex/dist/katex.min.css";
6
24
 
@@ -21,8 +39,19 @@ if (typeof Node !== "undefined") {
21
39
  };
22
40
  }
23
41
 
42
+ // Tells the boot watchdog in index.html that the module graph loaded, so it
43
+ // stops watching. Everything past this point has React above it and a root
44
+ // boundary to catch it; the watchdog is only for never getting here at all.
45
+ (window as unknown as { __ppmEntryRan?: boolean }).__ppmEntryRan = true;
46
+
47
+ // Before the first render, so a chunk that fails while the tree is still
48
+ // mounting is caught too.
49
+ installChunkErrorRecovery();
50
+
24
51
  createRoot(document.getElementById("root")!).render(
25
52
  <StrictMode>
26
- <App />
53
+ <RootErrorBoundary>
54
+ <App />
55
+ </RootErrorBoundary>
27
56
  </StrictMode>,
28
57
  );
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Which repository each project's git surfaces are pointed at.
3
+ *
4
+ * A workspace folder is often a container whose *children* are the
5
+ * repositories, and every git surface used to run `git` in the container and
6
+ * report "not a git repository" — which reads as PPM being broken rather than
7
+ * as the repositories being one level down. The server discovers them; this
8
+ * holds the answer and the user's choice.
9
+ *
10
+ * The choice is **device-local**, like `lspEnabled` and `mobileWordWrap` and
11
+ * for the same reason: a phone and a desktop may reasonably be looking at
12
+ * different services in the same workspace, and a server round-trip would make
13
+ * the last device to write win everywhere.
14
+ *
15
+ * The discovery result is cached per project because it costs a directory walk
16
+ * and half a dozen panels ask for it independently. `reload` is the escape
17
+ * hatch for "I just cloned something in there".
18
+ */
19
+ import { create } from "zustand";
20
+ import { api, projectUrl } from "@/lib/api-client";
21
+ import { resolveRepo, type GitRepoDiscovery } from "@/lib/git-repo-scope";
22
+
23
+ const STORAGE_KEY = "ppm-git-repo-choice";
24
+
25
+ function loadChoices(): Record<string, string> {
26
+ try {
27
+ const raw = localStorage.getItem(STORAGE_KEY);
28
+ if (!raw) return {};
29
+ const parsed = JSON.parse(raw) as unknown;
30
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
31
+ const out: Record<string, string> = {};
32
+ for (const [key, value] of Object.entries(parsed as Record<string, unknown>)) {
33
+ if (typeof value === "string") out[key] = value;
34
+ }
35
+ return out;
36
+ } catch {
37
+ return {}; // private mode, or somebody's extension wrote junk into the key
38
+ }
39
+ }
40
+
41
+ function saveChoices(choices: Record<string, string>): void {
42
+ try {
43
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(choices));
44
+ } catch {
45
+ // Out of quota or blocked: the choice still applies for this session.
46
+ }
47
+ }
48
+
49
+ /** projectName → the discovery request in flight, so callers can await it. */
50
+ const inflight = new Map<string, Promise<void>>();
51
+
52
+ interface GitRepoStore {
53
+ /** projectName → what the server found. */
54
+ discovery: Record<string, GitRepoDiscovery>;
55
+ /** projectName → chosen repository path. */
56
+ chosen: Record<string, string>;
57
+ /** Fetch once per project unless `force`. */
58
+ load: (projectName: string, force?: boolean) => Promise<void>;
59
+ choose: (projectName: string, repoPath: string) => void;
60
+ }
61
+
62
+ export const useGitRepoStore = create<GitRepoStore>((set, get) => ({
63
+ discovery: {},
64
+ chosen: loadChoices(),
65
+
66
+ load: async (projectName, force = false) => {
67
+ if (!force && get().discovery[projectName]) return;
68
+ // The promise is shared, not just flagged: `resolveGitRoot` awaits this to
69
+ // answer, and a boolean "already loading" would have it return the
70
+ // unscoped path while the answer was one tick away.
71
+ const existing = inflight.get(projectName);
72
+ if (existing && !force) return existing;
73
+ const request = (async () => {
74
+ try {
75
+ const data = await api.get<GitRepoDiscovery>(`${projectUrl(projectName)}/git/repos`);
76
+ set((s) => ({ discovery: { ...s.discovery, [projectName]: data } }));
77
+ } catch {
78
+ // A project whose directory has gone, or an offline tab. Leaving the
79
+ // entry absent keeps the surfaces in their loading state rather than
80
+ // asserting "no repository here", which would be a guess.
81
+ }
82
+ })();
83
+ inflight.set(projectName, request);
84
+ // Cleared by identity, not unconditionally: a `force` reload puts a second
85
+ // request in the map while the first is still running, and the first one's
86
+ // own cleanup would then delete the *second* entry — after which a
87
+ // concurrent caller joins nothing and starts a third directory walk.
88
+ void request.finally(() => {
89
+ if (inflight.get(projectName) === request) inflight.delete(projectName);
90
+ });
91
+ return request;
92
+ },
93
+
94
+ choose: (projectName, repoPath) => {
95
+ set((s) => {
96
+ const chosen = { ...s.chosen, [projectName]: repoPath };
97
+ saveChoices(chosen);
98
+ return { chosen };
99
+ });
100
+ },
101
+ }));
102
+
103
+ /**
104
+ * The repository to hand an extension command, for callers outside React.
105
+ *
106
+ * The keybinding handler, the command palette and the webview's recovery
107
+ * dispatch all pass a path as the command's first argument, and none of them is
108
+ * in a position to use a hook. Discovery is awaited rather than sampled: these
109
+ * are one-shot dispatches, so reading a not-yet-loaded store would hand over
110
+ * the container folder and the panel would open on something that is not a
111
+ * repository.
112
+ */
113
+ export async function resolveGitRoot(projectName: string, projectPath: string): Promise<string> {
114
+ await useGitRepoStore.getState().load(projectName);
115
+ const { discovery, chosen } = useGitRepoStore.getState();
116
+ return resolveRepo(discovery[projectName], chosen[projectName])?.path ?? projectPath;
117
+ }
@@ -1,6 +1,7 @@
1
1
  import { useCallback, useEffect } from "react";
2
2
  import { create } from "zustand";
3
- import { api, projectUrl } from "@/lib/api-client";
3
+ import { api } from "@/lib/api-client";
4
+ import { useGitRepo } from "@/hooks/use-git-repo";
4
5
  import type { GitStatus } from "../../types/git";
5
6
 
6
7
  /** Git status letter for file tree decorations */
@@ -145,23 +146,25 @@ export function useGitChangesPoller(
145
146
  const setCount = useGitStatusStore((s) => s.setCount);
146
147
  const setFileStatuses = useGitStatusStore((s) => s.setFileStatuses);
147
148
  const setMeta = useGitStatusStore((s) => s.setMeta);
149
+ // The project folder is not always the repository — see `use-git-repo`.
150
+ const { repo, gitUrl, rebaseStatus } = useGitRepo(projectName);
148
151
 
149
152
  const poll = useCallback(async () => {
150
- if (!projectName) return;
153
+ if (!projectName || !repo) return;
151
154
  try {
152
- const data = await api.get<GitStatus>(
153
- `${projectUrl(projectName)}/git/status`,
154
- );
155
+ const data = await api.get<GitStatus>(gitUrl("/status"));
155
156
  setCount(
156
157
  projectName,
157
158
  data.staged.length + data.unstaged.length + data.untracked.length,
158
159
  );
159
- setFileStatuses(projectName, data);
160
+ // The tree decorates nodes by project-relative path, and git answered in
161
+ // the repository's terms — which for a subfolder is one directory short.
162
+ setFileStatuses(projectName, rebaseStatus(data));
160
163
  setMeta(projectName, data);
161
164
  } catch {
162
165
  // Silently ignore — badge just keeps last-known value
163
166
  }
164
- }, [projectName, setCount, setFileStatuses]);
167
+ }, [projectName, repo, gitUrl, rebaseStatus, setCount, setFileStatuses, setMeta]);
165
168
 
166
169
  useEffect(() => {
167
170
  if (skip) return;
@@ -37,6 +37,7 @@ export const KEY_ACTIONS: KeyAction[] = [
37
37
  { id: "open-settings", label: "Open Settings", category: "tabs", defaultKey: "Mod+," },
38
38
  { id: "open-git-status", label: "Git Status (sidebar)", category: "tabs", defaultKey: "Mod+Shift+E" },
39
39
  { id: "open-search", label: "Search Files (sidebar)", category: "tabs", defaultKey: "Mod+Shift+F" },
40
+ { id: "open-problems", label: "Problems", category: "tabs", defaultKey: "Mod+Shift+M", note: "Errors and warnings across the open files, in the panel — VS Code's shortcut" },
40
41
  { id: "voice-input", label: "Voice Input", category: "general", defaultKey: "Mod+Shift+V", note: "Toggle speech-to-text in chat" },
41
42
  { id: "chat-nav-prev", label: "Previous Chat Message", category: "general", defaultKey: "Alt+ArrowUp", note: "Jump to your previous message in the visible chat transcript" },
42
43
  { id: "chat-nav-next", label: "Next Chat Message", category: "general", defaultKey: "Alt+ArrowDown", note: "Jump to your next message in the visible chat transcript" },
@@ -27,7 +27,7 @@ export const DOCK_PANEL_ID = "__dock__";
27
27
  * Enforced at load-time to prevent a crafted persisted blob from placing
28
28
  * arbitrary tab types in the privileged dock slot.
29
29
  */
30
- export const DOCK_ALLOWED_TAB_TYPES = new Set<TabType>(["terminal", "system-monitor"]);
30
+ export const DOCK_ALLOWED_TAB_TYPES = new Set<TabType>(["terminal", "system-monitor", "problems"]);
31
31
 
32
32
  // ---------------------------------------------------------------------------
33
33
  // Floating-window panels
@@ -42,7 +42,7 @@ export const DOCK_ALLOWED_TAB_TYPES = new Set<TabType>(["terminal", "system-moni
42
42
  * context-menu item that offers it. Split across two files, adding a window kind meant
43
43
  * remembering both, and one of them was always the one that got forgotten.
44
44
  */
45
- export const NON_POPPABLE_TAB_TYPES = new Set<TabType>(["system-monitor", "settings"]);
45
+ export const NON_POPPABLE_TAB_TYPES = new Set<TabType>(["system-monitor", "settings", "problems"]);
46
46
 
47
47
  /**
48
48
  * Prefix of the reserved panel IDs that host tabs detached into a floating window.
@@ -222,6 +222,9 @@ export function deriveTabId(type: TabType, metadata?: Record<string, unknown>):
222
222
  return `conflict-editor:${metadata?.filePath ?? "unknown"}`;
223
223
  case "settings":
224
224
  return "settings";
225
+ // One list of every problem, so a second open focuses the first.
226
+ case "problems":
227
+ return "problems";
225
228
  case "group":
226
229
  return `group:${metadata?.groupId ?? "unknown"}`;
227
230
  default:
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Diagnostics from every open file, in one place.
3
+ *
4
+ * `useLsp` already turns a file's diagnostics into Monaco markers, which is
5
+ * what draws the squiggles. Those are per-model though, so nothing can answer
6
+ * "what is wrong in this project" — the question the Problems panel exists for.
7
+ * Each editor publishes here as well, and the panel reads the union.
8
+ *
9
+ * The scope is deliberately the files that are open. LSP publishes diagnostics
10
+ * per open document, so a closed file's problems are not something the server
11
+ * has told us about, and listing stale ones from a previous session would be
12
+ * worse than listing none.
13
+ */
14
+ import { create } from "zustand";
15
+ import type { LspDiagnostic } from "@/hooks/use-lsp";
16
+
17
+ export interface FileProblems {
18
+ projectName: string;
19
+ /** Project-relative path. */
20
+ filePath: string;
21
+ diagnostics: LspDiagnostic[];
22
+ }
23
+
24
+ /** LSP severities, spelled out because the numbers are not self-explanatory. */
25
+ export const SEVERITY_ERROR = 1;
26
+ export const SEVERITY_WARNING = 2;
27
+
28
+ interface ProblemsState {
29
+ /** Keyed by project and path, so two projects cannot collide on a filename. */
30
+ files: Record<string, FileProblems>;
31
+ publish: (projectName: string, filePath: string, diagnostics: LspDiagnostic[]) => void;
32
+ clear: (projectName: string, filePath: string) => void;
33
+ }
34
+
35
+ /**
36
+ * A project name can contain a space, so a space separator would let
37
+ * ("app b", "c.ts") and ("app", "b/c.ts") collide on one key. NUL cannot appear
38
+ * in either, and is written as an escape so it is visible in the source.
39
+ */
40
+ export const problemKey = (projectName: string, filePath: string) => `${projectName}\u0000${filePath}`;
41
+
42
+ export const useProblemsStore = create<ProblemsState>((set) => ({
43
+ files: {},
44
+
45
+ publish: (projectName, filePath, diagnostics) =>
46
+ set((state) => {
47
+ const key = problemKey(projectName, filePath);
48
+ // A file that has been fixed publishes an empty list. Dropping the entry
49
+ // rather than storing an empty one keeps the panel's "no problems" state
50
+ // honest and stops it listing files with nothing under them.
51
+ if (diagnostics.length === 0) {
52
+ if (!state.files[key]) return state;
53
+ const { [key]: _removed, ...rest } = state.files;
54
+ return { files: rest };
55
+ }
56
+ return { files: { ...state.files, [key]: { projectName, filePath, diagnostics } } };
57
+ }),
58
+
59
+ clear: (projectName, filePath) =>
60
+ set((state) => {
61
+ const key = problemKey(projectName, filePath);
62
+ if (!state.files[key]) return state;
63
+ const { [key]: _removed, ...rest } = state.files;
64
+ return { files: rest };
65
+ }),
66
+ }));
67
+
68
+ /**
69
+ * Only one project's files.
70
+ *
71
+ * Editor tabs from other projects stay mounted for keep-alive, so their
72
+ * language servers keep publishing and the store holds more than one project at
73
+ * a time. Every view of this data is project-scoped, like the rest of PPM.
74
+ */
75
+ export function filesForProject(
76
+ files: Record<string, FileProblems>,
77
+ projectName: string | null,
78
+ ): Record<string, FileProblems> {
79
+ if (!projectName) return files;
80
+ return Object.fromEntries(
81
+ Object.entries(files).filter(([, file]) => file.projectName === projectName),
82
+ );
83
+ }
84
+
85
+ /** Totals across every open file, for the panel header and the tab badge. */
86
+ export function problemCounts(files: Record<string, FileProblems>): { errors: number; warnings: number } {
87
+ let errors = 0;
88
+ let warnings = 0;
89
+ for (const file of Object.values(files)) {
90
+ for (const diagnostic of file.diagnostics) {
91
+ if (diagnostic.severity === SEVERITY_ERROR) errors++;
92
+ else if (diagnostic.severity === SEVERITY_WARNING) warnings++;
93
+ }
94
+ }
95
+ return { errors, warnings };
96
+ }
97
+
98
+ /**
99
+ * Files in a stable order, each with its diagnostics sorted by position.
100
+ *
101
+ * Sorted rather than left in arrival order: the panel is read top to bottom
102
+ * against the file, and a list that reshuffles whenever a server republishes
103
+ * cannot be used that way.
104
+ */
105
+ export function sortedProblems(files: Record<string, FileProblems>): FileProblems[] {
106
+ return Object.values(files)
107
+ .map((file) => ({
108
+ ...file,
109
+ diagnostics: [...file.diagnostics].sort(
110
+ (a, b) =>
111
+ a.range.start.line - b.range.start.line ||
112
+ a.range.start.character - b.range.start.character,
113
+ ),
114
+ }))
115
+ .sort((a, b) => a.filePath.localeCompare(b.filePath));
116
+ }
@@ -34,6 +34,15 @@ interface SettingsState {
34
34
  /** GitLens-style annotation after the cursor's line in the code editor. */
35
35
  inlineBlame: boolean;
36
36
  wordWrap: boolean;
37
+ /** Word wrap on a phone-sized viewport. Device-local — see `persistDevicePref`. */
38
+ mobileWordWrap: boolean;
39
+ /**
40
+ * Run a language server for the open file. Off until asked, and device-local:
41
+ * one `typescript-language-server` was 854 MB resident, which is a reasonable
42
+ * thing to spend on a desktop and never a reasonable thing for a phone to
43
+ * turn on because a desktop did.
44
+ */
45
+ lspEnabled: boolean;
37
46
  tabWrap: boolean;
38
47
  editorTabStyle: EditorTabStyle;
39
48
  sidebarActiveTab: SidebarActiveTab;
@@ -70,6 +79,8 @@ interface SettingsState {
70
79
  setGitStatusViewMode: (mode: GitStatusViewMode) => void;
71
80
  toggleInlineBlame: () => void;
72
81
  toggleWordWrap: () => void;
82
+ toggleMobileWordWrap: () => void;
83
+ setLspEnabled: (enabled: boolean) => void;
73
84
  toggleTabWrap: () => void;
74
85
  setEditorTabStyle: (style: EditorTabStyle) => void;
75
86
  setSidebarActiveTab: (tab: SidebarActiveTab) => void;
@@ -96,6 +107,8 @@ interface PersistedSettings {
96
107
  gitStatusViewMode?: GitStatusViewMode;
97
108
  inlineBlame?: boolean;
98
109
  wordWrap?: boolean;
110
+ mobileWordWrap?: boolean;
111
+ lspEnabled?: boolean;
99
112
  tabWrap?: boolean;
100
113
  editorTabStyle?: EditorTabStyle;
101
114
  sidebarActiveTab?: SidebarActiveTab;
@@ -214,6 +227,20 @@ function persistUiPref(update: Partial<PersistedSettings>) {
214
227
  pushUiPrefsToServer(update);
215
228
  }
216
229
 
230
+ /**
231
+ * Persist a pref to this device only.
232
+ *
233
+ * The server round-trip above exists so prefs survive an origin change, but it
234
+ * also means the last device to write wins everywhere. That is wrong for the
235
+ * prefs that answer "what can this screen afford": a desktop turning the
236
+ * language server on must not start one for the phone, and unwrapping lines on
237
+ * a 27-inch monitor must not unwrap them on a 6-inch one. Those stay local, and
238
+ * `applyServerUiPrefs` deliberately does not read them back.
239
+ */
240
+ function persistDevicePref(update: Partial<PersistedSettings>) {
241
+ persistSettings(update);
242
+ }
243
+
217
244
  /**
218
245
  * Push the current theme selection to the dedicated server endpoint.
219
246
  * Errors are swallowed, so callers may ignore the promise; awaiting it only
@@ -283,6 +310,8 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
283
310
  gitStatusViewMode: _initial.gitStatusViewMode === "flat" ? "flat" : "tree",
284
311
  inlineBlame: _initial.inlineBlame ?? false,
285
312
  wordWrap: _initial.wordWrap ?? false,
313
+ mobileWordWrap: _initial.mobileWordWrap ?? true,
314
+ lspEnabled: _initial.lspEnabled ?? false,
286
315
  tabWrap: _initial.tabWrap ?? false,
287
316
  editorTabStyle: (_initial.editorTabStyle === "boxed" || _initial.editorTabStyle === "pill") ? _initial.editorTabStyle : "default",
288
317
  sidebarActiveTab: isValidSidebarTab(_initial.sidebarActiveTab) ? _initial.sidebarActiveTab : "history",
@@ -407,6 +436,17 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
407
436
  set({ wordWrap: next });
408
437
  },
409
438
 
439
+ toggleMobileWordWrap: () => {
440
+ const next = !get().mobileWordWrap;
441
+ persistDevicePref({ mobileWordWrap: next });
442
+ set({ mobileWordWrap: next });
443
+ },
444
+
445
+ setLspEnabled: (enabled) => {
446
+ persistDevicePref({ lspEnabled: enabled });
447
+ set({ lspEnabled: enabled });
448
+ },
449
+
410
450
  toggleTabWrap: () => {
411
451
  const next = !get().tabWrap;
412
452
  persistUiPref({ tabWrap: next });
@@ -17,7 +17,8 @@ export type TabType =
17
17
  | "system-monitor"
18
18
  | "git-log"
19
19
  | "ai-resource"
20
- | "group";
20
+ | "group"
21
+ | "problems";
21
22
 
22
23
  export interface Tab {
23
24
  id: string;
@@ -41,6 +41,7 @@ const POPPABLE_TAB_TYPES: Record<TabType, boolean> = {
41
41
  "git-log": true,
42
42
  "ai-resource": true,
43
43
  group: true,
44
+ problems: false,
44
45
  };
45
46
 
46
47
  export function isPoppableTabType(type: unknown): type is TabType {