@hienlh/ppm 0.23.12 → 0.23.14

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 (3245) hide show
  1. package/CHANGELOG.md +205 -0
  2. package/CLAUDE.md +42 -7
  3. package/THIRD-PARTY-NOTICES.md +2 -2
  4. package/assets/skills/ppm/SKILL.md +5 -4
  5. package/assets/skills/ppm/references/cli-reference.md +34 -8
  6. package/assets/skills/ppm/references/common-tasks.md +8 -4
  7. package/assets/skills/ppm/references/http-api.md +65 -17
  8. package/bun.lock +53 -41
  9. package/dist/web/assets/_basePickBy-DZsMzaag.js +1 -0
  10. package/dist/web/assets/_basePickBy-DZsMzaag.js.br +0 -0
  11. package/dist/web/assets/_basePickBy-DZsMzaag.js.gz +0 -0
  12. package/dist/web/assets/_baseUniq-BVfFdhnG.js +1 -0
  13. package/dist/web/assets/_baseUniq-BVfFdhnG.js.br +0 -0
  14. package/dist/web/assets/_baseUniq-BVfFdhnG.js.gz +0 -0
  15. package/dist/web/assets/accounts-settings-section-C3uzfcyx.js +1 -0
  16. package/dist/web/assets/accounts-settings-section-C3uzfcyx.js.br +0 -0
  17. package/dist/web/assets/accounts-settings-section-C3uzfcyx.js.gz +0 -0
  18. package/dist/web/assets/adaptive-context-menu-v544UeQs.js +1 -0
  19. package/dist/web/assets/adaptive-context-menu-v544UeQs.js.br +0 -0
  20. package/dist/web/assets/adaptive-context-menu-v544UeQs.js.gz +0 -0
  21. package/dist/web/assets/agent-session-sheet-BGM_TtXa.js +2 -0
  22. package/dist/web/assets/agent-session-sheet-BGM_TtXa.js.br +0 -0
  23. package/dist/web/assets/agent-session-sheet-BGM_TtXa.js.gz +0 -0
  24. package/dist/web/assets/agent-session-sheet-store-DXiGofzB.js +1 -0
  25. package/dist/web/assets/agent-session-window-content-DNa0uxco.js +1 -0
  26. package/dist/web/assets/agent-session-window-content-DNa0uxco.js.br +0 -0
  27. package/dist/web/assets/agent-session-window-content-DNa0uxco.js.gz +0 -0
  28. package/dist/web/assets/ai-resource-editor-Bjh12UJ5.js +1 -0
  29. package/dist/web/assets/ai-resource-editor-Bjh12UJ5.js.br +0 -0
  30. package/dist/web/assets/ai-resource-editor-Bjh12UJ5.js.gz +0 -0
  31. package/dist/web/assets/ai-settings-section-BUmAoa1c.js +1 -0
  32. package/dist/web/assets/ai-settings-section-BUmAoa1c.js.br +0 -0
  33. package/dist/web/assets/ai-settings-section-BUmAoa1c.js.gz +0 -0
  34. package/dist/web/assets/ai-settings-section-D18U_alH.js +1 -0
  35. package/dist/web/assets/android-tab-DkemOp4O.js +2 -0
  36. package/dist/web/assets/android-tab-DkemOp4O.js.br +0 -0
  37. package/dist/web/assets/android-tab-DkemOp4O.js.gz +0 -0
  38. package/dist/web/assets/angular-html-C-EXiYxF.js +1 -0
  39. package/dist/web/assets/angular-html-C-EXiYxF.js.br +0 -0
  40. package/dist/web/assets/angular-html-C-EXiYxF.js.gz +0 -0
  41. package/dist/web/assets/angular-ts-7vgQKHTG.js +1 -0
  42. package/dist/web/assets/angular-ts-7vgQKHTG.js.br +0 -0
  43. package/dist/web/assets/angular-ts-7vgQKHTG.js.gz +0 -0
  44. package/dist/web/assets/api-client-DAQfiXg0.js +1 -0
  45. package/dist/web/assets/api-client-OiA8Ida1.js +1 -0
  46. package/dist/web/assets/api-client-OiA8Ida1.js.br +0 -0
  47. package/dist/web/assets/api-client-OiA8Ida1.js.gz +0 -0
  48. package/dist/web/assets/api-settings-BD9LvTw-.js +1 -0
  49. package/dist/web/assets/api-settings-obEnPtdW.js +1 -0
  50. package/dist/web/assets/api-settings-obEnPtdW.js.br +0 -0
  51. package/dist/web/assets/api-settings-obEnPtdW.js.gz +0 -0
  52. package/dist/web/assets/api-themes-M86KsVMo.js +1 -0
  53. package/dist/web/assets/apl-5jVD2fgP.js +1 -0
  54. package/dist/web/assets/apl-5jVD2fgP.js.br +0 -0
  55. package/dist/web/assets/apl-5jVD2fgP.js.gz +0 -0
  56. package/dist/web/assets/appearance-settings-section-ZfH6MlPQ.js +1 -0
  57. package/dist/web/assets/appearance-settings-section-ZfH6MlPQ.js.br +0 -0
  58. package/dist/web/assets/appearance-settings-section-ZfH6MlPQ.js.gz +0 -0
  59. package/dist/web/assets/apps-panel-CqLd47PW.js +1 -0
  60. package/dist/web/assets/apps-panel-CqLd47PW.js.br +0 -0
  61. package/dist/web/assets/apps-panel-CqLd47PW.js.gz +0 -0
  62. package/dist/web/assets/arc-I7PUO0-e.js +1 -0
  63. package/dist/web/assets/arc-I7PUO0-e.js.br +0 -0
  64. package/dist/web/assets/arc-I7PUO0-e.js.gz +0 -0
  65. package/dist/web/assets/architecture-PBZL5I3N-B-Uky3bj.js +1 -0
  66. package/dist/web/assets/architectureDiagram-2XIMDMQ5-BRrtQjsr.js +36 -0
  67. package/dist/web/assets/architectureDiagram-2XIMDMQ5-BRrtQjsr.js.br +0 -0
  68. package/dist/web/assets/architectureDiagram-2XIMDMQ5-BRrtQjsr.js.gz +0 -0
  69. package/dist/web/assets/astro-QYZZ8yJJ.js +1 -0
  70. package/dist/web/assets/astro-QYZZ8yJJ.js.br +0 -0
  71. package/dist/web/assets/astro-QYZZ8yJJ.js.gz +0 -0
  72. package/dist/web/assets/audio-preview-COlIaXik.js +1 -0
  73. package/dist/web/assets/audio-preview-COlIaXik.js.br +2 -0
  74. package/dist/web/assets/audio-preview-COlIaXik.js.gz +0 -0
  75. package/dist/web/assets/blade-cgabhmsU.js +1 -0
  76. package/dist/web/assets/blade-cgabhmsU.js.br +0 -0
  77. package/dist/web/assets/blade-cgabhmsU.js.gz +0 -0
  78. package/dist/web/assets/blockDiagram-WCTKOSBZ-DGzimbRP.js +132 -0
  79. package/dist/web/assets/blockDiagram-WCTKOSBZ-DGzimbRP.js.br +0 -0
  80. package/dist/web/assets/blockDiagram-WCTKOSBZ-DGzimbRP.js.gz +0 -0
  81. package/dist/web/assets/branch-review-tab-D45ZjK7j.js +1 -0
  82. package/dist/web/assets/branch-review-tab-D45ZjK7j.js.br +0 -0
  83. package/dist/web/assets/branch-review-tab-D45ZjK7j.js.gz +0 -0
  84. package/dist/web/assets/bsl-CJ7_JlQ8.js +1 -0
  85. package/dist/web/assets/bsl-CJ7_JlQ8.js.br +0 -0
  86. package/dist/web/assets/bsl-CJ7_JlQ8.js.gz +0 -0
  87. package/dist/web/assets/button-DR4_Bprq.js +1 -0
  88. package/dist/web/assets/button-DR4_Bprq.js.br +0 -0
  89. package/dist/web/assets/button-DR4_Bprq.js.gz +0 -0
  90. package/dist/web/assets/c4Diagram-IC4MRINW-CYgja0Vj.js +10 -0
  91. package/dist/web/assets/c4Diagram-IC4MRINW-CYgja0Vj.js.br +0 -0
  92. package/dist/web/assets/c4Diagram-IC4MRINW-CYgja0Vj.js.gz +0 -0
  93. package/dist/web/assets/cairo-5CpV2T1P.js +1 -0
  94. package/dist/web/assets/cairo-5CpV2T1P.js.br +0 -0
  95. package/dist/web/assets/cairo-5CpV2T1P.js.gz +0 -0
  96. package/dist/web/assets/channel-DPtrFCA5.js +1 -0
  97. package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js +1 -0
  98. package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.br +0 -0
  99. package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.gz +0 -0
  100. package/dist/web/assets/chat-tab-BxtuxnUo.js +17 -0
  101. package/dist/web/assets/chat-tab-BxtuxnUo.js.br +0 -0
  102. package/dist/web/assets/chat-tab-BxtuxnUo.js.gz +0 -0
  103. package/dist/web/assets/chat-tab-CWp56c6g.js +1 -0
  104. package/dist/web/assets/chat-tab-CWp56c6g.js.br +0 -0
  105. package/dist/web/assets/chat-tab-CWp56c6g.js.gz +0 -0
  106. package/dist/web/assets/chunk-4BX2VUAB-C34azZaK.js +1 -0
  107. package/dist/web/assets/chunk-55IACEB6-lLZt91qK.js +1 -0
  108. package/dist/web/assets/chunk-7E7YKBS2-C4ZO5Pu3.js +1 -0
  109. package/dist/web/assets/chunk-7R4GIKGN-D3k5MAee.js +80 -0
  110. package/dist/web/assets/chunk-7R4GIKGN-D3k5MAee.js.br +0 -0
  111. package/dist/web/assets/chunk-7R4GIKGN-D3k5MAee.js.gz +0 -0
  112. package/dist/web/assets/chunk-C72U2L5F-DJYrpKtC.js +1 -0
  113. package/dist/web/assets/chunk-EGIJ26TM-BWMmrqKU.js +1 -0
  114. package/dist/web/assets/chunk-FMBD7UC4-BQAL1rdi.js +15 -0
  115. package/dist/web/assets/chunk-GEFDOKGD-ClUT8N5D.js +2 -0
  116. package/dist/web/assets/chunk-GEFDOKGD-ClUT8N5D.js.br +0 -0
  117. package/dist/web/assets/chunk-GEFDOKGD-ClUT8N5D.js.gz +0 -0
  118. package/dist/web/assets/chunk-GLR3WWYH-BPnxz1C7.js +2 -0
  119. package/dist/web/assets/chunk-GLR3WWYH-BPnxz1C7.js.br +0 -0
  120. package/dist/web/assets/chunk-GLR3WWYH-BPnxz1C7.js.gz +0 -0
  121. package/dist/web/assets/chunk-HHEYEP7N-BuMrJGFc.js +1 -0
  122. package/dist/web/assets/chunk-JSJVCQXG-BtujOcXV.js +1 -0
  123. package/dist/web/assets/chunk-JSJVCQXG-BtujOcXV.js.br +0 -0
  124. package/dist/web/assets/chunk-JSJVCQXG-BtujOcXV.js.gz +0 -0
  125. package/dist/web/assets/chunk-KX2RTZJC-DUDiP7Yd.js +1 -0
  126. package/dist/web/assets/chunk-KYZI473N-DJeOp6mm.js +53 -0
  127. package/dist/web/assets/chunk-KYZI473N-DJeOp6mm.js.br +0 -0
  128. package/dist/web/assets/chunk-KYZI473N-DJeOp6mm.js.gz +0 -0
  129. package/dist/web/assets/chunk-L3YUKLVL-EJ6HIENH.js +1 -0
  130. package/dist/web/assets/chunk-MX3YWQON-D4w4VuVE.js +1 -0
  131. package/dist/web/assets/chunk-MX3YWQON-D4w4VuVE.js.br +0 -0
  132. package/dist/web/assets/chunk-MX3YWQON-D4w4VuVE.js.gz +0 -0
  133. package/dist/web/assets/chunk-NQ4KR5QH-CpKJy3xG.js +220 -0
  134. package/dist/web/assets/chunk-NQ4KR5QH-CpKJy3xG.js.br +0 -0
  135. package/dist/web/assets/chunk-NQ4KR5QH-CpKJy3xG.js.gz +0 -0
  136. package/dist/web/assets/chunk-O4XLMI2P-DxH8ZaVs.js +7 -0
  137. package/dist/web/assets/chunk-O4XLMI2P-DxH8ZaVs.js.br +0 -0
  138. package/dist/web/assets/chunk-O4XLMI2P-DxH8ZaVs.js.gz +0 -0
  139. package/dist/web/assets/chunk-OZEHJAEY-Y8-7O5Mi.js +1 -0
  140. package/dist/web/assets/chunk-OZEHJAEY-Y8-7O5Mi.js.br +0 -0
  141. package/dist/web/assets/chunk-OZEHJAEY-Y8-7O5Mi.js.gz +0 -0
  142. package/dist/web/assets/chunk-PQ6SQG4A-Dh4202bK.js +1 -0
  143. package/dist/web/assets/chunk-PQ6SQG4A-Dh4202bK.js.br +0 -0
  144. package/dist/web/assets/chunk-PQ6SQG4A-Dh4202bK.js.gz +0 -0
  145. package/dist/web/assets/chunk-PU5JKC2W-CKcDA1rA.js +11 -0
  146. package/dist/web/assets/chunk-PU5JKC2W-CKcDA1rA.js.br +0 -0
  147. package/dist/web/assets/chunk-PU5JKC2W-CKcDA1rA.js.gz +0 -0
  148. package/dist/web/assets/chunk-QZHKN3VN-L8x9oN54.js +1 -0
  149. package/dist/web/assets/chunk-R5LLSJPH-BCVA8OTp.js +1 -0
  150. package/dist/web/assets/chunk-WL4C6EOR-BBskKt7O.js +189 -0
  151. package/dist/web/assets/chunk-WL4C6EOR-BBskKt7O.js.br +0 -0
  152. package/dist/web/assets/chunk-WL4C6EOR-BBskKt7O.js.gz +0 -0
  153. package/dist/web/assets/chunk-XIRO2GV7-DdW94AiK.js +1 -0
  154. package/dist/web/assets/chunk-XPW4576I-CWknSB3b.js +32 -0
  155. package/dist/web/assets/chunk-XPW4576I-CWknSB3b.js.br +0 -0
  156. package/dist/web/assets/chunk-XPW4576I-CWknSB3b.js.gz +0 -0
  157. package/dist/web/assets/chunk-XZSTWKYB-BpHDY2Kb.js +94 -0
  158. package/dist/web/assets/chunk-XZSTWKYB-BpHDY2Kb.js.br +0 -0
  159. package/dist/web/assets/chunk-XZSTWKYB-BpHDY2Kb.js.gz +0 -0
  160. package/dist/web/assets/chunk-YBOYWFTD-bFqPImfF.js +1 -0
  161. package/dist/web/assets/classDiagram-VBA2DB6C-CIjURp-9.js +1 -0
  162. package/dist/web/assets/classDiagram-v2-RAHNMMFH-clKWjh1c.js +1 -0
  163. package/dist/web/assets/clipboard-D-VCry-F.js +1 -0
  164. package/dist/web/assets/clipboard-D-VCry-F.js.br +0 -0
  165. package/dist/web/assets/clipboard-D-VCry-F.js.gz +0 -0
  166. package/dist/web/assets/clone-Bi0DAQV-.js +1 -0
  167. package/dist/web/assets/cobol-Bd6KmX0J.js +1 -0
  168. package/dist/web/assets/cobol-Bd6KmX0J.js.br +0 -0
  169. package/dist/web/assets/cobol-Bd6KmX0J.js.gz +0 -0
  170. package/dist/web/assets/code-editor-Culc4-j-.js +10 -0
  171. package/dist/web/assets/code-editor-Culc4-j-.js.br +0 -0
  172. package/dist/web/assets/code-editor-Culc4-j-.js.gz +0 -0
  173. package/dist/web/assets/code-fence-C1cQ2ktb.js +1 -0
  174. package/dist/web/assets/codex-reset-credit-button-Dav3UqiJ.js +1 -0
  175. package/dist/web/assets/codex-reset-credit-button-Dav3UqiJ.js.br +0 -0
  176. package/dist/web/assets/codex-reset-credit-button-Dav3UqiJ.js.gz +0 -0
  177. package/dist/web/assets/coffee-DvwNSvU3.js +1 -0
  178. package/dist/web/assets/coffee-DvwNSvU3.js.br +0 -0
  179. package/dist/web/assets/coffee-DvwNSvU3.js.gz +0 -0
  180. package/dist/web/assets/conflict-editor-Hi-bm0vI.js +19 -0
  181. package/dist/web/assets/conflict-editor-Hi-bm0vI.js.br +0 -0
  182. package/dist/web/assets/conflict-editor-Hi-bm0vI.js.gz +0 -0
  183. package/dist/web/assets/connection-form-tab-DdOo2bzr.js +4 -0
  184. package/dist/web/assets/connection-form-tab-DdOo2bzr.js.br +0 -0
  185. package/dist/web/assets/connection-form-tab-DdOo2bzr.js.gz +0 -0
  186. package/dist/web/assets/context-menu-BoQ6lxte.js +1 -0
  187. package/dist/web/assets/context-menu-BoQ6lxte.js.br +0 -0
  188. package/dist/web/assets/context-menu-BoQ6lxte.js.gz +0 -0
  189. package/dist/web/assets/cose-bilkent-S5V4N54A-ClbAPz7l.js +1 -0
  190. package/dist/web/assets/cose-bilkent-S5V4N54A-ClbAPz7l.js.br +0 -0
  191. package/dist/web/assets/cose-bilkent-S5V4N54A-ClbAPz7l.js.gz +0 -0
  192. package/dist/web/assets/cpp-e2ra-IrU.js +1 -0
  193. package/dist/web/assets/cpp-e2ra-IrU.js.br +0 -0
  194. package/dist/web/assets/cpp-e2ra-IrU.js.gz +0 -0
  195. package/dist/web/assets/crystal-BxSLXYRc.js +1 -0
  196. package/dist/web/assets/crystal-BxSLXYRc.js.br +0 -0
  197. package/dist/web/assets/crystal-BxSLXYRc.js.gz +0 -0
  198. package/dist/web/assets/csv-preview-C4B9osB_.js +10 -0
  199. package/dist/web/assets/csv-preview-C4B9osB_.js.br +0 -0
  200. package/dist/web/assets/csv-preview-C4B9osB_.js.gz +0 -0
  201. package/dist/web/assets/dagre-DQKD3TcA.js +1 -0
  202. package/dist/web/assets/dagre-DQKD3TcA.js.br +0 -0
  203. package/dist/web/assets/dagre-DQKD3TcA.js.gz +0 -0
  204. package/dist/web/assets/dagre-KLK3FWXG-Dpb3uk5y.js +4 -0
  205. package/dist/web/assets/dagre-KLK3FWXG-Dpb3uk5y.js.br +0 -0
  206. package/dist/web/assets/dagre-KLK3FWXG-Dpb3uk5y.js.gz +0 -0
  207. package/dist/web/assets/database-drivers-section-BYNY-P18.js +1 -0
  208. package/dist/web/assets/database-drivers-section-BYNY-P18.js.br +0 -0
  209. package/dist/web/assets/database-drivers-section-BYNY-P18.js.gz +0 -0
  210. package/dist/web/assets/db-explorer-store-DWkvEWNP.js +1 -0
  211. package/dist/web/assets/db-explorer-store-DWkvEWNP.js.br +0 -0
  212. package/dist/web/assets/db-explorer-store-DWkvEWNP.js.gz +0 -0
  213. package/dist/web/assets/db-tab-parts-BrVgleMJ.js +1 -0
  214. package/dist/web/assets/db-tab-parts-BrVgleMJ.js.br +0 -0
  215. package/dist/web/assets/db-tab-parts-BrVgleMJ.js.gz +0 -0
  216. package/dist/web/assets/db-types-D0vYhq7b.js +1 -0
  217. package/dist/web/assets/db-types-D0vYhq7b.js.br +0 -0
  218. package/dist/web/assets/db-types-D0vYhq7b.js.gz +0 -0
  219. package/dist/web/assets/design-canvas-check-1-Rp0ZRx.js +1 -0
  220. package/dist/web/assets/design-canvas-check-1-Rp0ZRx.js.br +0 -0
  221. package/dist/web/assets/design-canvas-check-1-Rp0ZRx.js.gz +0 -0
  222. package/dist/web/assets/design-export-client-B8EySrNZ.js +1 -0
  223. package/dist/web/assets/design-export-client-B8EySrNZ.js.br +0 -0
  224. package/dist/web/assets/design-export-client-B8EySrNZ.js.gz +0 -0
  225. package/dist/web/assets/design-responsive-dialog-0naA94rr.js +1 -0
  226. package/dist/web/assets/design-responsive-dialog-0naA94rr.js.br +0 -0
  227. package/dist/web/assets/design-responsive-dialog-0naA94rr.js.gz +0 -0
  228. package/dist/web/assets/design-settings-section-BoFRA6B0.js +2 -0
  229. package/dist/web/assets/design-settings-section-BoFRA6B0.js.br +0 -0
  230. package/dist/web/assets/design-settings-section-BoFRA6B0.js.gz +0 -0
  231. package/dist/web/assets/design-skill-suggestion-BVWan1dm.js +3 -0
  232. package/dist/web/assets/design-skill-suggestion-BVWan1dm.js.br +0 -0
  233. package/dist/web/assets/design-skill-suggestion-BVWan1dm.js.gz +0 -0
  234. package/dist/web/assets/design-tab--pMbjoyJ.js +57 -0
  235. package/dist/web/assets/design-tab--pMbjoyJ.js.br +0 -0
  236. package/dist/web/assets/design-tab--pMbjoyJ.js.gz +0 -0
  237. package/dist/web/assets/designs-sidebar-panel-D4aHxvNM.js +1 -0
  238. package/dist/web/assets/designs-sidebar-panel-D4aHxvNM.js.br +0 -0
  239. package/dist/web/assets/designs-sidebar-panel-D4aHxvNM.js.gz +0 -0
  240. package/dist/web/assets/diagram-E7M64L7V-nFzFvVKn.js +24 -0
  241. package/dist/web/assets/diagram-E7M64L7V-nFzFvVKn.js.br +0 -0
  242. package/dist/web/assets/diagram-E7M64L7V-nFzFvVKn.js.gz +0 -0
  243. package/dist/web/assets/diagram-IFDJBPK2-DTz3twyY.js +43 -0
  244. package/dist/web/assets/diagram-IFDJBPK2-DTz3twyY.js.br +0 -0
  245. package/dist/web/assets/diagram-IFDJBPK2-DTz3twyY.js.gz +0 -0
  246. package/dist/web/assets/diagram-P4PSJMXO-DqAQw4f4.js +24 -0
  247. package/dist/web/assets/diagram-P4PSJMXO-DqAQw4f4.js.br +0 -0
  248. package/dist/web/assets/diagram-P4PSJMXO-DqAQw4f4.js.gz +0 -0
  249. package/dist/web/assets/dialog-DLrqSaHA.js +1 -0
  250. package/dist/web/assets/dialog-DLrqSaHA.js.br +0 -0
  251. package/dist/web/assets/dialog-DLrqSaHA.js.gz +0 -0
  252. package/dist/web/assets/diff-viewer-WZKDSphn.js +4 -0
  253. package/dist/web/assets/diff-viewer-WZKDSphn.js.br +0 -0
  254. package/dist/web/assets/diff-viewer-WZKDSphn.js.gz +0 -0
  255. package/dist/web/assets/docx-preview-DNNgfe62.js +12 -0
  256. package/dist/web/assets/docx-preview-DNNgfe62.js.br +0 -0
  257. package/dist/web/assets/docx-preview-DNNgfe62.js.gz +0 -0
  258. package/dist/web/assets/dropdown-menu-ByeFrLIJ.js +1 -0
  259. package/dist/web/assets/dropdown-menu-ByeFrLIJ.js.br +0 -0
  260. package/dist/web/assets/dropdown-menu-ByeFrLIJ.js.gz +0 -0
  261. package/dist/web/assets/edge-BMgSJ-Bj.js +1 -0
  262. package/dist/web/assets/edge-BMgSJ-Bj.js.br +0 -0
  263. package/dist/web/assets/edge-BMgSJ-Bj.js.gz +0 -0
  264. package/dist/web/assets/edit-diff-preview-jg2S1fk-.js +7 -0
  265. package/dist/web/assets/edit-diff-preview-jg2S1fk-.js.br +0 -0
  266. package/dist/web/assets/edit-diff-preview-jg2S1fk-.js.gz +0 -0
  267. package/dist/web/assets/editor-dialog-Dq-Haj3-.js +1 -0
  268. package/dist/web/assets/editor-dialog-Dq-Haj3-.js.br +0 -0
  269. package/dist/web/assets/editor-dialog-Dq-Haj3-.js.gz +0 -0
  270. package/dist/web/assets/editor-language-service-as9g04JJ.js +1 -0
  271. package/dist/web/assets/editor-language-service-as9g04JJ.js.br +0 -0
  272. package/dist/web/assets/editor-language-service-as9g04JJ.js.gz +0 -0
  273. package/dist/web/assets/elixir-C-vsifv7.js +1 -0
  274. package/dist/web/assets/elixir-C-vsifv7.js.br +0 -0
  275. package/dist/web/assets/elixir-C-vsifv7.js.gz +0 -0
  276. package/dist/web/assets/elm-AlQORVd6.js +1 -0
  277. package/dist/web/assets/elm-AlQORVd6.js.br +0 -0
  278. package/dist/web/assets/elm-AlQORVd6.js.gz +0 -0
  279. package/dist/web/assets/erDiagram-INFDFZHY-iXaSunsJ.js +70 -0
  280. package/dist/web/assets/erDiagram-INFDFZHY-iXaSunsJ.js.br +0 -0
  281. package/dist/web/assets/erDiagram-INFDFZHY-iXaSunsJ.js.gz +0 -0
  282. package/dist/web/assets/erb-Bl2JVWWG.js +1 -0
  283. package/dist/web/assets/erb-Bl2JVWWG.js.br +0 -0
  284. package/dist/web/assets/erb-Bl2JVWWG.js.gz +0 -0
  285. package/dist/web/assets/erlang-BRqOjXH9.js +1 -0
  286. package/dist/web/assets/erlang-BRqOjXH9.js.br +0 -0
  287. package/dist/web/assets/erlang-BRqOjXH9.js.gz +0 -0
  288. package/dist/web/assets/explorer-body-D4C2wOou.js +2 -0
  289. package/dist/web/assets/explorer-body-D4C2wOou.js.br +0 -0
  290. package/dist/web/assets/explorer-body-D4C2wOou.js.gz +0 -0
  291. package/dist/web/assets/explorer-model-DzQgZCjd.js +1 -0
  292. package/dist/web/assets/explorer-model-DzQgZCjd.js.br +0 -0
  293. package/dist/web/assets/explorer-model-DzQgZCjd.js.gz +0 -0
  294. package/dist/web/assets/explorer-window-content-8w4tzl-b.js +1 -0
  295. package/dist/web/assets/explorer-window-content-8w4tzl-b.js.br +0 -0
  296. package/dist/web/assets/explorer-window-content-8w4tzl-b.js.gz +0 -0
  297. package/dist/web/assets/extension-manager-section-iiuCXwd3.js +1 -0
  298. package/dist/web/assets/extension-manager-section-iiuCXwd3.js.br +0 -0
  299. package/dist/web/assets/extension-manager-section-iiuCXwd3.js.gz +0 -0
  300. package/dist/web/assets/extension-webview-DT1Y9bkz.js +12 -0
  301. package/dist/web/assets/extension-webview-DT1Y9bkz.js.br +0 -0
  302. package/dist/web/assets/extension-webview-DT1Y9bkz.js.gz +0 -0
  303. package/dist/web/assets/file-diff-lX1a7RLF.js +1 -0
  304. package/dist/web/assets/file-icons-B1-viqUQ.js +1 -0
  305. package/dist/web/assets/file-icons-B1-viqUQ.js.br +0 -0
  306. package/dist/web/assets/file-icons-B1-viqUQ.js.gz +0 -0
  307. package/dist/web/assets/file-icons.generated-BTxvyD8L.css +1 -0
  308. package/dist/web/assets/file-icons.generated-BTxvyD8L.css.br +0 -0
  309. package/dist/web/assets/file-icons.generated-BTxvyD8L.css.gz +0 -0
  310. package/dist/web/assets/file-store-Bk1WYfdy.js +1 -0
  311. package/dist/web/assets/file-store-Bk1WYfdy.js.br +0 -0
  312. package/dist/web/assets/file-store-Bk1WYfdy.js.gz +0 -0
  313. package/dist/web/assets/files-settings-section-C29D5TCc.js +1 -0
  314. package/dist/web/assets/files-settings-section-C29D5TCc.js.br +0 -0
  315. package/dist/web/assets/files-settings-section-C29D5TCc.js.gz +0 -0
  316. package/dist/web/assets/filter-dialog-frame-ZGzke_Zc.js +1 -0
  317. package/dist/web/assets/filter-dialog-frame-ZGzke_Zc.js.br +0 -0
  318. package/dist/web/assets/filter-dialog-frame-ZGzke_Zc.js.gz +0 -0
  319. package/dist/web/assets/flowDiagram-PKNHOUZH-Ds_IZGyf.js +162 -0
  320. package/dist/web/assets/flowDiagram-PKNHOUZH-Ds_IZGyf.js.br +0 -0
  321. package/dist/web/assets/flowDiagram-PKNHOUZH-Ds_IZGyf.js.gz +0 -0
  322. package/dist/web/assets/format-file-meta-CnLWYScm.js +1 -0
  323. package/dist/web/assets/format-file-meta-CnLWYScm.js.br +0 -0
  324. package/dist/web/assets/format-file-meta-CnLWYScm.js.gz +0 -0
  325. package/dist/web/assets/fortran-fixed-form-CWbxmDGR.js +1 -0
  326. package/dist/web/assets/fortran-fixed-form-CWbxmDGR.js.br +0 -0
  327. package/dist/web/assets/fortran-fixed-form-CWbxmDGR.js.gz +0 -0
  328. package/dist/web/assets/fs-api-ssn-HsD4.js +1 -0
  329. package/dist/web/assets/fs-api-ssn-HsD4.js.br +0 -0
  330. package/dist/web/assets/fs-api-ssn-HsD4.js.gz +0 -0
  331. package/dist/web/assets/fsharp-DKMYbq6I.js +1 -0
  332. package/dist/web/assets/fsharp-DKMYbq6I.js.br +0 -0
  333. package/dist/web/assets/fsharp-DKMYbq6I.js.gz +0 -0
  334. package/dist/web/assets/ganttDiagram-A5KZAMGK-CiIdbM3n.js +292 -0
  335. package/dist/web/assets/ganttDiagram-A5KZAMGK-CiIdbM3n.js.br +0 -0
  336. package/dist/web/assets/ganttDiagram-A5KZAMGK-CiIdbM3n.js.gz +0 -0
  337. package/dist/web/assets/gdresource-B3yFau4V.js +1 -0
  338. package/dist/web/assets/gdresource-B3yFau4V.js.br +0 -0
  339. package/dist/web/assets/gdresource-B3yFau4V.js.gz +0 -0
  340. package/dist/web/assets/general-settings-section-DVd5hmw7.js +1 -0
  341. package/dist/web/assets/general-settings-section-DVd5hmw7.js.br +0 -0
  342. package/dist/web/assets/general-settings-section-DVd5hmw7.js.gz +0 -0
  343. package/dist/web/assets/git-commit-BW0p3Ekk.js +1 -0
  344. package/dist/web/assets/git-commit-BW0p3Ekk.js.br +0 -0
  345. package/dist/web/assets/git-commit-BW0p3Ekk.js.gz +0 -0
  346. package/dist/web/assets/git-commit-horizontal-BVihXafd.js +1 -0
  347. package/dist/web/assets/git-log-panel-CcufNPXO.js +1 -0
  348. package/dist/web/assets/git-log-panel-CcufNPXO.js.br +0 -0
  349. package/dist/web/assets/git-log-panel-CcufNPXO.js.gz +0 -0
  350. package/dist/web/assets/git-rebase-CUSAK8_s.js +1 -0
  351. package/dist/web/assets/git-repo-store-BOYLnV67.js +1 -0
  352. package/dist/web/assets/git-repo-store-BOYLnV67.js.br +0 -0
  353. package/dist/web/assets/git-repo-store-BOYLnV67.js.gz +0 -0
  354. package/dist/web/assets/git-review-tab-Dfu5YxgC.js +3 -0
  355. package/dist/web/assets/git-review-tab-Dfu5YxgC.js.br +0 -0
  356. package/dist/web/assets/git-review-tab-Dfu5YxgC.js.gz +0 -0
  357. package/dist/web/assets/gitGraph-HDMCJU4V-YCo9XlXj.js +1 -0
  358. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-BbhjtccU.js +65 -0
  359. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-BbhjtccU.js.br +0 -0
  360. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-BbhjtccU.js.gz +0 -0
  361. package/dist/web/assets/glide-data-grid-B75J0oe4.js +177 -0
  362. package/dist/web/assets/glide-data-grid-B75J0oe4.js.br +0 -0
  363. package/dist/web/assets/glide-data-grid-B75J0oe4.js.gz +0 -0
  364. package/dist/web/assets/glimmer-js-Dn43Q3P1.js +1 -0
  365. package/dist/web/assets/glimmer-js-Dn43Q3P1.js.br +0 -0
  366. package/dist/web/assets/glimmer-js-Dn43Q3P1.js.gz +0 -0
  367. package/dist/web/assets/glimmer-ts-DZYYD22W.js +1 -0
  368. package/dist/web/assets/glimmer-ts-DZYYD22W.js.br +0 -0
  369. package/dist/web/assets/glimmer-ts-DZYYD22W.js.gz +0 -0
  370. package/dist/web/assets/glsl-pYErV1oY.js +1 -0
  371. package/dist/web/assets/glsl-pYErV1oY.js.br +0 -0
  372. package/dist/web/assets/glsl-pYErV1oY.js.gz +0 -0
  373. package/dist/web/assets/graphlib-pKiIWcwD.js +1 -0
  374. package/dist/web/assets/graphlib-pKiIWcwD.js.br +0 -0
  375. package/dist/web/assets/graphlib-pKiIWcwD.js.gz +0 -0
  376. package/dist/web/assets/graphql-VCU9SikS.js +1 -0
  377. package/dist/web/assets/graphql-VCU9SikS.js.br +0 -0
  378. package/dist/web/assets/graphql-VCU9SikS.js.gz +0 -0
  379. package/dist/web/assets/grid-save-dialog-DCZKjmfY.js +2 -0
  380. package/dist/web/assets/grid-save-dialog-DCZKjmfY.js.br +0 -0
  381. package/dist/web/assets/grid-save-dialog-DCZKjmfY.js.gz +0 -0
  382. package/dist/web/assets/group-chat-tab-CatWu-oT.js +1 -0
  383. package/dist/web/assets/group-chat-tab-CatWu-oT.js.br +0 -0
  384. package/dist/web/assets/group-chat-tab-CatWu-oT.js.gz +0 -0
  385. package/dist/web/assets/hack-MIhm1LlJ.js +1 -0
  386. package/dist/web/assets/hack-MIhm1LlJ.js.br +0 -0
  387. package/dist/web/assets/hack-MIhm1LlJ.js.gz +0 -0
  388. package/dist/web/assets/haml-D-ys61WH.js +1 -0
  389. package/dist/web/assets/haml-D-ys61WH.js.br +0 -0
  390. package/dist/web/assets/haml-D-ys61WH.js.gz +0 -0
  391. package/dist/web/assets/handlebars-Ci0Fz22e.js +1 -0
  392. package/dist/web/assets/handlebars-Ci0Fz22e.js.br +0 -0
  393. package/dist/web/assets/handlebars-Ci0Fz22e.js.gz +0 -0
  394. package/dist/web/assets/html-BfSqT2Ng.js +1 -0
  395. package/dist/web/assets/html-BfSqT2Ng.js.br +0 -0
  396. package/dist/web/assets/html-BfSqT2Ng.js.gz +0 -0
  397. package/dist/web/assets/html-derivative-mrGnBIXr.js +1 -0
  398. package/dist/web/assets/http-DwPxJWot.js +1 -0
  399. package/dist/web/assets/http-DwPxJWot.js.br +0 -0
  400. package/dist/web/assets/http-DwPxJWot.js.gz +0 -0
  401. package/dist/web/assets/hurl-G2E98JqX.js +1 -0
  402. package/dist/web/assets/hurl-G2E98JqX.js.br +0 -0
  403. package/dist/web/assets/hurl-G2E98JqX.js.gz +0 -0
  404. package/dist/web/assets/hxml-DAle7vtu.js +1 -0
  405. package/dist/web/assets/hxml-DAle7vtu.js.br +0 -0
  406. package/dist/web/assets/hxml-DAle7vtu.js.gz +0 -0
  407. package/dist/web/assets/icons-JMA45Ifw.js +1 -0
  408. package/dist/web/assets/icons-JMA45Ifw.js.br +0 -0
  409. package/dist/web/assets/icons-JMA45Ifw.js.gz +0 -0
  410. package/dist/web/assets/image-preview-Bhg1jHHQ.js +1 -0
  411. package/dist/web/assets/impexp-state-HapOpwYX.js +4 -0
  412. package/dist/web/assets/impexp-state-HapOpwYX.js.br +0 -0
  413. package/dist/web/assets/impexp-state-HapOpwYX.js.gz +0 -0
  414. package/dist/web/assets/impexp-tab-Cnr8ZIpb.js +1 -0
  415. package/dist/web/assets/impexp-tab-Cnr8ZIpb.js.br +0 -0
  416. package/dist/web/assets/impexp-tab-Cnr8ZIpb.js.gz +0 -0
  417. package/dist/web/assets/index-6UiaKItX.js +59 -0
  418. package/dist/web/assets/index-6UiaKItX.js.br +0 -0
  419. package/dist/web/assets/index-6UiaKItX.js.gz +0 -0
  420. package/dist/web/assets/index-Ch28kMx1.css +1 -0
  421. package/dist/web/assets/index-Ch28kMx1.css.br +0 -0
  422. package/dist/web/assets/index-Ch28kMx1.css.gz +0 -0
  423. package/dist/web/assets/info-3K5VOQVL-EeVpjyO8.js +1 -0
  424. package/dist/web/assets/infoDiagram-LFFYTUFH-Cqqn4BSQ.js +2 -0
  425. package/dist/web/assets/input-D-RG8dzb.js +1 -0
  426. package/dist/web/assets/isEmpty-DrA5f9p9.js +1 -0
  427. package/dist/web/assets/isEmpty-DrA5f9p9.js.br +0 -0
  428. package/dist/web/assets/isEmpty-DrA5f9p9.js.gz +0 -0
  429. package/dist/web/assets/ishikawaDiagram-PHBUUO56-DPS2-OUX.js +70 -0
  430. package/dist/web/assets/ishikawaDiagram-PHBUUO56-DPS2-OUX.js.br +0 -0
  431. package/dist/web/assets/ishikawaDiagram-PHBUUO56-DPS2-OUX.js.gz +0 -0
  432. package/dist/web/assets/jinja-ttwiOGfK.js +1 -0
  433. package/dist/web/assets/jinja-ttwiOGfK.js.br +0 -0
  434. package/dist/web/assets/jinja-ttwiOGfK.js.gz +0 -0
  435. package/dist/web/assets/jira-watcher-section-CPJaxMv3.js +1 -0
  436. package/dist/web/assets/jison-CBhlp18T.js +1 -0
  437. package/dist/web/assets/jison-CBhlp18T.js.br +0 -0
  438. package/dist/web/assets/jison-CBhlp18T.js.gz +0 -0
  439. package/dist/web/assets/journeyDiagram-4ABVD52K-DAxvmzHb.js +139 -0
  440. package/dist/web/assets/journeyDiagram-4ABVD52K-DAxvmzHb.js.br +0 -0
  441. package/dist/web/assets/journeyDiagram-4ABVD52K-DAxvmzHb.js.gz +0 -0
  442. package/dist/web/assets/julia-TzQ-uRbV.js +1 -0
  443. package/dist/web/assets/julia-TzQ-uRbV.js.br +0 -0
  444. package/dist/web/assets/julia-TzQ-uRbV.js.gz +0 -0
  445. package/dist/web/assets/just-_esTBNSS.js +1 -0
  446. package/dist/web/assets/just-_esTBNSS.js.br +0 -0
  447. package/dist/web/assets/just-_esTBNSS.js.gz +0 -0
  448. package/dist/web/assets/kanban-definition-K7BYSVSG-qY_uDl8T.js +89 -0
  449. package/dist/web/assets/kanban-definition-K7BYSVSG-qY_uDl8T.js.br +0 -0
  450. package/dist/web/assets/kanban-definition-K7BYSVSG-qY_uDl8T.js.gz +0 -0
  451. package/dist/web/assets/keybindings-store-DD1cJso2.js +1 -0
  452. package/dist/web/assets/keyboard-shortcuts-section-D4Bq_kJ6.js +1 -0
  453. package/dist/web/assets/keyboard-shortcuts-section-D4Bq_kJ6.js.br +0 -0
  454. package/dist/web/assets/keyboard-shortcuts-section-D4Bq_kJ6.js.gz +0 -0
  455. package/dist/web/assets/language-servers-section-D--Ji4HN.js +2 -0
  456. package/dist/web/assets/language-servers-section-D--Ji4HN.js.br +0 -0
  457. package/dist/web/assets/language-servers-section-D--Ji4HN.js.gz +0 -0
  458. package/dist/web/assets/latex-HI6kHIHG.js +1 -0
  459. package/dist/web/assets/latex-HI6kHIHG.js.br +0 -0
  460. package/dist/web/assets/latex-HI6kHIHG.js.gz +0 -0
  461. package/dist/web/assets/line-BN9s1Tpq.js +1 -0
  462. package/dist/web/assets/linear-Di4UGcbw.js +1 -0
  463. package/dist/web/assets/linear-Di4UGcbw.js.br +0 -0
  464. package/dist/web/assets/linear-Di4UGcbw.js.gz +0 -0
  465. package/dist/web/assets/liquid-BA8TlMtj.js +1 -0
  466. package/dist/web/assets/liquid-BA8TlMtj.js.br +0 -0
  467. package/dist/web/assets/liquid-BA8TlMtj.js.gz +0 -0
  468. package/dist/web/assets/logs-app-C4OVSXwd.css +1 -0
  469. package/dist/web/assets/logs-app-C4OVSXwd.css.br +0 -0
  470. package/dist/web/assets/logs-app-C4OVSXwd.css.gz +0 -0
  471. package/dist/web/assets/logs-app-DVwDWcnC.js +13 -0
  472. package/dist/web/assets/logs-app-DVwDWcnC.js.br +0 -0
  473. package/dist/web/assets/logs-app-DVwDWcnC.js.gz +0 -0
  474. package/dist/web/assets/logs-tab-BNaMLDde.js +1 -0
  475. package/dist/web/assets/logs-window-content-hjhdEgZx.js +1 -0
  476. package/dist/web/assets/lsp-client-FPx6oPde.js +1 -0
  477. package/dist/web/assets/lsp-client-FPx6oPde.js.br +0 -0
  478. package/dist/web/assets/lsp-client-FPx6oPde.js.gz +0 -0
  479. package/dist/web/assets/lua-2lvvhJ5i.js +1 -0
  480. package/dist/web/assets/lua-2lvvhJ5i.js.br +0 -0
  481. package/dist/web/assets/lua-2lvvhJ5i.js.gz +0 -0
  482. package/dist/web/assets/markdown-renderer-D9vn8m8E.js +1 -0
  483. package/dist/web/assets/markdown-renderer-PKijmP-6.js +5 -0
  484. package/dist/web/assets/markdown-renderer-PKijmP-6.js.br +0 -0
  485. package/dist/web/assets/markdown-renderer-PKijmP-6.js.gz +0 -0
  486. package/dist/web/assets/marko-DQFZDVmt.js +1 -0
  487. package/dist/web/assets/marko-DQFZDVmt.js.br +0 -0
  488. package/dist/web/assets/marko-DQFZDVmt.js.gz +0 -0
  489. package/dist/web/assets/mdc-DtRUqkf-.js +1 -0
  490. package/dist/web/assets/mdc-DtRUqkf-.js.br +0 -0
  491. package/dist/web/assets/mdc-DtRUqkf-.js.gz +0 -0
  492. package/dist/web/assets/media-url-524XBuIF.js +1 -0
  493. package/dist/web/assets/mermaid-parser.core-CAVW1Yfe.js +4 -0
  494. package/dist/web/assets/mermaid-parser.core-CAVW1Yfe.js.br +0 -0
  495. package/dist/web/assets/mermaid-parser.core-CAVW1Yfe.js.gz +0 -0
  496. package/dist/web/assets/mermaid.core-BXnr9nXf.js +11 -0
  497. package/dist/web/assets/mermaid.core-BXnr9nXf.js.br +0 -0
  498. package/dist/web/assets/mermaid.core-BXnr9nXf.js.gz +0 -0
  499. package/dist/web/assets/mindmap-definition-YRQLILUH-B4Wlz_59.js +68 -0
  500. package/dist/web/assets/mindmap-definition-YRQLILUH-B4Wlz_59.js.br +0 -0
  501. package/dist/web/assets/mindmap-definition-YRQLILUH-B4Wlz_59.js.gz +0 -0
  502. package/dist/web/assets/mobile-bottom-sheet-BdF6oawx.js +1 -0
  503. package/dist/web/assets/mobile-bottom-sheet-BdF6oawx.js.br +0 -0
  504. package/dist/web/assets/mobile-bottom-sheet-BdF6oawx.js.gz +0 -0
  505. package/dist/web/assets/mobile-explorer-sheet-1Gw9WsAM.js +1 -0
  506. package/dist/web/assets/mobile-explorer-sheet-1Gw9WsAM.js.br +0 -0
  507. package/dist/web/assets/mobile-explorer-sheet-1Gw9WsAM.js.gz +0 -0
  508. package/dist/web/assets/monaco-dotenv-language-BvSPgqNj.js +1 -0
  509. package/dist/web/assets/new-design-dialog-ChYww1VY.js +1 -0
  510. package/dist/web/assets/new-design-dialog-ChYww1VY.js.br +0 -0
  511. package/dist/web/assets/new-design-dialog-ChYww1VY.js.gz +0 -0
  512. package/dist/web/assets/nextflow-DBVZnnT_.js +1 -0
  513. package/dist/web/assets/nextflow-DBVZnnT_.js.br +0 -0
  514. package/dist/web/assets/nextflow-DBVZnnT_.js.gz +0 -0
  515. package/dist/web/assets/nginx-C4PeWBJv.js +1 -0
  516. package/dist/web/assets/nginx-C4PeWBJv.js.br +0 -0
  517. package/dist/web/assets/nginx-C4PeWBJv.js.gz +0 -0
  518. package/dist/web/assets/nim-DT5bnWs7.js +1 -0
  519. package/dist/web/assets/nim-DT5bnWs7.js.br +0 -0
  520. package/dist/web/assets/nim-DT5bnWs7.js.gz +0 -0
  521. package/dist/web/assets/notification-store-DqWBYQnQ.js +1 -0
  522. package/dist/web/assets/notifications-settings-section-BDKNseLC.js +1 -0
  523. package/dist/web/assets/notifications-settings-section-BDKNseLC.js.br +0 -0
  524. package/dist/web/assets/notifications-settings-section-BDKNseLC.js.gz +0 -0
  525. package/dist/web/assets/onboarding-entry-Ce587TR6.js +1 -0
  526. package/dist/web/assets/onboarding-entry-Ce587TR6.js.br +0 -0
  527. package/dist/web/assets/onboarding-entry-Ce587TR6.js.gz +0 -0
  528. package/dist/web/assets/onboarding-quick-orientation-BG3yKbth.js +1 -0
  529. package/dist/web/assets/onboarding-quick-orientation-BG3yKbth.js.br +0 -0
  530. package/dist/web/assets/onboarding-quick-orientation-BG3yKbth.js.gz +0 -0
  531. package/dist/web/assets/open-db-tabs-BWkvLJiI.js +1 -0
  532. package/dist/web/assets/open-db-tabs-BWkvLJiI.js.br +0 -0
  533. package/dist/web/assets/open-db-tabs-BWkvLJiI.js.gz +0 -0
  534. package/dist/web/assets/open-settings-CJ-BQ5Co.js +1 -0
  535. package/dist/web/assets/ordinal-BV0jQl_h.js +1 -0
  536. package/dist/web/assets/ordinal-BV0jQl_h.js.br +0 -0
  537. package/dist/web/assets/ordinal-BV0jQl_h.js.gz +0 -0
  538. package/dist/web/assets/overview-panel-CmFpdkp2.js +1 -0
  539. package/dist/web/assets/overview-panel-CmFpdkp2.js.br +0 -0
  540. package/dist/web/assets/overview-panel-CmFpdkp2.js.gz +0 -0
  541. package/dist/web/assets/packet-RMMSAZCW-DybThnCq.js +1 -0
  542. package/dist/web/assets/panel-store-DFurR27n.js +1 -0
  543. package/dist/web/assets/panel-store-DFurR27n.js.br +0 -0
  544. package/dist/web/assets/panel-store-DFurR27n.js.gz +0 -0
  545. package/dist/web/assets/patch-tab-metadata-BUNJESEQ.js +1 -0
  546. package/dist/web/assets/pdf-preview-B_okpfOG.js +1 -0
  547. package/dist/web/assets/pdf-preview-B_okpfOG.js.br +0 -0
  548. package/dist/web/assets/pdf-preview-B_okpfOG.js.gz +0 -0
  549. package/dist/web/assets/performance-panel-zJMhzM4W.js +3 -0
  550. package/dist/web/assets/performance-panel-zJMhzM4W.js.br +0 -0
  551. package/dist/web/assets/performance-panel-zJMhzM4W.js.gz +0 -0
  552. package/dist/web/assets/perl-BYfk64iB.js +1 -0
  553. package/dist/web/assets/perl-BYfk64iB.js.br +0 -0
  554. package/dist/web/assets/perl-BYfk64iB.js.gz +0 -0
  555. package/dist/web/assets/php-jITHM5rW.js +1 -0
  556. package/dist/web/assets/php-jITHM5rW.js.br +0 -0
  557. package/dist/web/assets/php-jITHM5rW.js.gz +0 -0
  558. package/dist/web/assets/pie-UPGHQEXC-BV0L1ST2.js +1 -0
  559. package/dist/web/assets/pieDiagram-SKSYHLDU-DywbOif1.js +30 -0
  560. package/dist/web/assets/pieDiagram-SKSYHLDU-DywbOif1.js.br +0 -0
  561. package/dist/web/assets/pieDiagram-SKSYHLDU-DywbOif1.js.gz +0 -0
  562. package/dist/web/assets/ppmbot-settings-section-DUqPA3XC.js +1 -0
  563. package/dist/web/assets/ppmbot-settings-section-DUqPA3XC.js.br +0 -0
  564. package/dist/web/assets/ppmbot-settings-section-DUqPA3XC.js.gz +0 -0
  565. package/dist/web/assets/pptx-export-BDJ7y1G6.js +111 -0
  566. package/dist/web/assets/pptx-export-BDJ7y1G6.js.br +0 -0
  567. package/dist/web/assets/pptx-export-BDJ7y1G6.js.gz +0 -0
  568. package/dist/web/assets/problems-panel-Cwsfn1St.js +1 -0
  569. package/dist/web/assets/problems-panel-Cwsfn1St.js.br +0 -0
  570. package/dist/web/assets/problems-panel-Cwsfn1St.js.gz +0 -0
  571. package/dist/web/assets/process-row-format-B1ix3LMo.js +1 -0
  572. package/dist/web/assets/process-table-l1-hFLUJ.js +1 -0
  573. package/dist/web/assets/process-table-l1-hFLUJ.js.br +0 -0
  574. package/dist/web/assets/process-table-l1-hFLUJ.js.gz +0 -0
  575. package/dist/web/assets/project-framework-store-Bi5dyHdx.js +1 -0
  576. package/dist/web/assets/project-store-CEGoLMOl.js +1 -0
  577. package/dist/web/assets/project-store-CEGoLMOl.js.br +0 -0
  578. package/dist/web/assets/project-store-CEGoLMOl.js.gz +0 -0
  579. package/dist/web/assets/proxy-settings-section-VZ6gpJkZ.js +1 -0
  580. package/dist/web/assets/proxy-settings-section-VZ6gpJkZ.js.br +0 -0
  581. package/dist/web/assets/proxy-settings-section-VZ6gpJkZ.js.gz +0 -0
  582. package/dist/web/assets/pug-C3C14waW.js +1 -0
  583. package/dist/web/assets/pug-C3C14waW.js.br +0 -0
  584. package/dist/web/assets/pug-C3C14waW.js.gz +0 -0
  585. package/dist/web/assets/qml-DMYSBRVt.js +1 -0
  586. package/dist/web/assets/qml-DMYSBRVt.js.br +0 -0
  587. package/dist/web/assets/qml-DMYSBRVt.js.gz +0 -0
  588. package/dist/web/assets/quadrantDiagram-337W2JSQ-CYGg6fRU.js +7 -0
  589. package/dist/web/assets/quadrantDiagram-337W2JSQ-CYGg6fRU.js.br +0 -0
  590. package/dist/web/assets/quadrantDiagram-337W2JSQ-CYGg6fRU.js.gz +0 -0
  591. package/dist/web/assets/query-audit-section-J5i6_AGL.js +1 -0
  592. package/dist/web/assets/query-audit-section-J5i6_AGL.js.br +0 -0
  593. package/dist/web/assets/query-audit-section-J5i6_AGL.js.gz +0 -0
  594. package/dist/web/assets/query-tab-Br2U5YPQ.js +22 -0
  595. package/dist/web/assets/query-tab-Br2U5YPQ.js.br +0 -0
  596. package/dist/web/assets/query-tab-Br2U5YPQ.js.gz +0 -0
  597. package/dist/web/assets/radar-KQ55EAFF-BZY71XNv.js +1 -0
  598. package/dist/web/assets/razor-C8pIPfbg.js +1 -0
  599. package/dist/web/assets/razor-C8pIPfbg.js.br +0 -0
  600. package/dist/web/assets/razor-C8pIPfbg.js.gz +0 -0
  601. package/dist/web/assets/remote-access-settings-section-CI-ZVbmv.js +1 -0
  602. package/dist/web/assets/remote-access-settings-section-CI-ZVbmv.js.br +0 -0
  603. package/dist/web/assets/remote-access-settings-section-CI-ZVbmv.js.gz +0 -0
  604. package/dist/web/assets/remote-desktop-clipboard-notice-B4_htemB.js +1 -0
  605. package/dist/web/assets/remote-desktop-clipboard-notice-B4_htemB.js.br +0 -0
  606. package/dist/web/assets/remote-desktop-clipboard-notice-B4_htemB.js.gz +0 -0
  607. package/dist/web/assets/remote-desktop-mobile-sheet-DJMad2gK.js +2 -0
  608. package/dist/web/assets/remote-desktop-mobile-sheet-DJMad2gK.js.br +0 -0
  609. package/dist/web/assets/remote-desktop-mobile-sheet-DJMad2gK.js.gz +0 -0
  610. package/dist/web/assets/remote-desktop-mobile-view-C3CDk2Fw.js +1 -0
  611. package/dist/web/assets/remote-desktop-mobile-view-C3CDk2Fw.js.br +0 -0
  612. package/dist/web/assets/remote-desktop-mobile-view-C3CDk2Fw.js.gz +0 -0
  613. package/dist/web/assets/remote-desktop-readiness-gate-Ch8Fuhfv.js +1 -0
  614. package/dist/web/assets/remote-desktop-readiness-gate-Ch8Fuhfv.js.br +0 -0
  615. package/dist/web/assets/remote-desktop-readiness-gate-Ch8Fuhfv.js.gz +0 -0
  616. package/dist/web/assets/remote-desktop-settings-section-BKM0nXJ7.js +1 -0
  617. package/dist/web/assets/remote-desktop-settings-section-BKM0nXJ7.js.br +0 -0
  618. package/dist/web/assets/remote-desktop-settings-section-BKM0nXJ7.js.gz +0 -0
  619. package/dist/web/assets/remote-desktop-window-content-Bty8zFfF.js +1 -0
  620. package/dist/web/assets/remote-desktop-window-content-Bty8zFfF.js.br +0 -0
  621. package/dist/web/assets/remote-desktop-window-content-Bty8zFfF.js.gz +0 -0
  622. package/dist/web/assets/rename-object-dialog-CyJMUdup.js +1 -0
  623. package/dist/web/assets/rename-object-dialog-CyJMUdup.js.br +0 -0
  624. package/dist/web/assets/rename-object-dialog-CyJMUdup.js.gz +0 -0
  625. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BtAcFKFS.js +73 -0
  626. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BtAcFKFS.js.br +0 -0
  627. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BtAcFKFS.js.gz +0 -0
  628. package/dist/web/assets/review-code-YefYFbqb.js +5 -0
  629. package/dist/web/assets/review-code-YefYFbqb.js.br +0 -0
  630. package/dist/web/assets/review-code-YefYFbqb.js.gz +0 -0
  631. package/dist/web/assets/rst-BhZIcU_y.js +1 -0
  632. package/dist/web/assets/rst-BhZIcU_y.js.br +0 -0
  633. package/dist/web/assets/rst-BhZIcU_y.js.gz +0 -0
  634. package/dist/web/assets/ruby-DjnL4Qo1.js +1 -0
  635. package/dist/web/assets/ruby-DjnL4Qo1.js.br +0 -0
  636. package/dist/web/assets/ruby-DjnL4Qo1.js.gz +0 -0
  637. package/dist/web/assets/run-in-terminal-button-C-ensVoK.js +1 -0
  638. package/dist/web/assets/run-in-terminal-z_H3VtlO.js +1 -0
  639. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-C1VJQsDx.js +10 -0
  640. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-C1VJQsDx.js.br +0 -0
  641. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-C1VJQsDx.js.gz +0 -0
  642. package/dist/web/assets/sas-TfkzbzI4.js +1 -0
  643. package/dist/web/assets/sas-TfkzbzI4.js.br +0 -0
  644. package/dist/web/assets/sas-TfkzbzI4.js.gz +0 -0
  645. package/dist/web/assets/save-as-dialog-B3UTyvHe.js +1 -0
  646. package/dist/web/assets/save-as-dialog-B3UTyvHe.js.br +0 -0
  647. package/dist/web/assets/save-as-dialog-B3UTyvHe.js.gz +0 -0
  648. package/dist/web/assets/schedules-settings-section-BE-0v3Tz.js +1 -0
  649. package/dist/web/assets/schedules-settings-section-BE-0v3Tz.js.br +0 -0
  650. package/dist/web/assets/schedules-settings-section-BE-0v3Tz.js.gz +0 -0
  651. package/dist/web/assets/scroll-area-B84ALpNT.js +1 -0
  652. package/dist/web/assets/scroll-area-B84ALpNT.js.br +0 -0
  653. package/dist/web/assets/scroll-area-B84ALpNT.js.gz +0 -0
  654. package/dist/web/assets/scss-nfidDCpi.js +1 -0
  655. package/dist/web/assets/scss-nfidDCpi.js.br +0 -0
  656. package/dist/web/assets/scss-nfidDCpi.js.gz +0 -0
  657. package/dist/web/assets/send-to-chat-B1pJKdHk.js +1 -0
  658. package/dist/web/assets/send-to-chat-B1pJKdHk.js.br +0 -0
  659. package/dist/web/assets/send-to-chat-B1pJKdHk.js.gz +0 -0
  660. package/dist/web/assets/separator-ClLtG2v5.js +1 -0
  661. package/dist/web/assets/sequenceDiagram-2WXFIKYE-nCGWX-jE.js +145 -0
  662. package/dist/web/assets/sequenceDiagram-2WXFIKYE-nCGWX-jE.js.br +0 -0
  663. package/dist/web/assets/sequenceDiagram-2WXFIKYE-nCGWX-jE.js.gz +0 -0
  664. package/dist/web/assets/services-panel-Dcog2FRz.js +1 -0
  665. package/dist/web/assets/services-panel-Dcog2FRz.js.br +0 -0
  666. package/dist/web/assets/services-panel-Dcog2FRz.js.gz +0 -0
  667. package/dist/web/assets/session-changes-bar-CQUTTdce.js +1 -0
  668. package/dist/web/assets/session-changes-bar-CQUTTdce.js.br +0 -0
  669. package/dist/web/assets/session-changes-bar-CQUTTdce.js.gz +0 -0
  670. package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js +1 -0
  671. package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.br +0 -0
  672. package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.gz +0 -0
  673. package/dist/web/assets/session-review-tab-C_8fPRUA.js +6 -0
  674. package/dist/web/assets/session-review-tab-C_8fPRUA.js.br +0 -0
  675. package/dist/web/assets/session-review-tab-C_8fPRUA.js.gz +0 -0
  676. package/dist/web/assets/session-turns-NMVd_geJ.js +9 -0
  677. package/dist/web/assets/session-turns-NMVd_geJ.js.br +0 -0
  678. package/dist/web/assets/session-turns-NMVd_geJ.js.gz +0 -0
  679. package/dist/web/assets/settings-body-QXejvAs5.js +1 -0
  680. package/dist/web/assets/settings-body-QXejvAs5.js.br +0 -0
  681. package/dist/web/assets/settings-body-QXejvAs5.js.gz +0 -0
  682. package/dist/web/assets/settings-categories-CcR9eL3x.js +1 -0
  683. package/dist/web/assets/settings-categories-CcR9eL3x.js.br +0 -0
  684. package/dist/web/assets/settings-categories-CcR9eL3x.js.gz +0 -0
  685. package/dist/web/assets/settings-section-content-DEB1DoVo.js +2 -0
  686. package/dist/web/assets/settings-section-content-DEB1DoVo.js.br +0 -0
  687. package/dist/web/assets/settings-section-content-DEB1DoVo.js.gz +0 -0
  688. package/dist/web/assets/settings-section-content-DXvUKJ01.js +1 -0
  689. package/dist/web/assets/settings-store-DIPe0D2_.js +2 -0
  690. package/dist/web/assets/settings-store-DIPe0D2_.js.br +0 -0
  691. package/dist/web/assets/settings-store-DIPe0D2_.js.gz +0 -0
  692. package/dist/web/assets/settings-tab-Dytz_a6o.js +1 -0
  693. package/dist/web/assets/settings-window-content-DbaJYKWz.js +1 -0
  694. package/dist/web/assets/shaderlab-CPu31TpY.js +1 -0
  695. package/dist/web/assets/shaderlab-CPu31TpY.js.br +0 -0
  696. package/dist/web/assets/shaderlab-CPu31TpY.js.gz +0 -0
  697. package/dist/web/assets/shellsession-SNCEdFDb.js +1 -0
  698. package/dist/web/assets/slash-command-picker-CMgT1HB0.js +1 -0
  699. package/dist/web/assets/slash-command-picker-CMgT1HB0.js.br +0 -0
  700. package/dist/web/assets/slash-command-picker-CMgT1HB0.js.gz +0 -0
  701. package/dist/web/assets/sortable-header-CspLHJ89.js +1 -0
  702. package/dist/web/assets/sortable-header-CspLHJ89.js.br +0 -0
  703. package/dist/web/assets/sortable-header-CspLHJ89.js.gz +0 -0
  704. package/dist/web/assets/soy-CnTY51wD.js +1 -0
  705. package/dist/web/assets/soy-CnTY51wD.js.br +0 -0
  706. package/dist/web/assets/soy-CnTY51wD.js.gz +0 -0
  707. package/dist/web/assets/sparql-Bo8ZDeqE.js +1 -0
  708. package/dist/web/assets/sparql-Bo8ZDeqE.js.br +0 -0
  709. package/dist/web/assets/sparql-Bo8ZDeqE.js.gz +0 -0
  710. package/dist/web/assets/sql-completion-provider-DpYWIHib.js +5 -0
  711. package/dist/web/assets/sql-completion-provider-DpYWIHib.js.br +0 -0
  712. package/dist/web/assets/sql-completion-provider-DpYWIHib.js.gz +0 -0
  713. package/dist/web/assets/sql-identifiers-EJ-1Q-Yo.js +1 -0
  714. package/dist/web/assets/sql-identifiers-EJ-1Q-Yo.js.br +0 -0
  715. package/dist/web/assets/sql-identifiers-EJ-1Q-Yo.js.gz +0 -0
  716. package/dist/web/assets/sql-object-tab-BsWrC-2m.js +1 -0
  717. package/dist/web/assets/sql-object-tab-BsWrC-2m.js.br +0 -0
  718. package/dist/web/assets/sql-object-tab-BsWrC-2m.js.gz +0 -0
  719. package/dist/web/assets/sqlite-viewer-CIxKUQMo.js +1 -0
  720. package/dist/web/assets/sqlite-viewer-CIxKUQMo.js.br +0 -0
  721. package/dist/web/assets/sqlite-viewer-CIxKUQMo.js.gz +0 -0
  722. package/dist/web/assets/start-ellipsis-DoNrF95a.js +1 -0
  723. package/dist/web/assets/stata-CRPv34qR.js +1 -0
  724. package/dist/web/assets/stata-CRPv34qR.js.br +0 -0
  725. package/dist/web/assets/stata-CRPv34qR.js.gz +0 -0
  726. package/dist/web/assets/stateDiagram-RAJIS63D-BN4MhYz8.js +1 -0
  727. package/dist/web/assets/stateDiagram-RAJIS63D-BN4MhYz8.js.br +0 -0
  728. package/dist/web/assets/stateDiagram-RAJIS63D-BN4MhYz8.js.gz +0 -0
  729. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-CYb4zl__.js +1 -0
  730. package/dist/web/assets/structure-save-dialog-CVWKQTIr.js +1 -0
  731. package/dist/web/assets/structure-save-dialog-CVWKQTIr.js.br +0 -0
  732. package/dist/web/assets/structure-save-dialog-CVWKQTIr.js.gz +0 -0
  733. package/dist/web/assets/structure-tab-rs2T0F7s.js +3 -0
  734. package/dist/web/assets/structure-tab-rs2T0F7s.js.br +0 -0
  735. package/dist/web/assets/structure-tab-rs2T0F7s.js.gz +0 -0
  736. package/dist/web/assets/surrealql-piKAap88.js +1 -0
  737. package/dist/web/assets/surrealql-piKAap88.js.br +0 -0
  738. package/dist/web/assets/surrealql-piKAap88.js.gz +0 -0
  739. package/dist/web/assets/svelte-CUBWC2AD.js +1 -0
  740. package/dist/web/assets/svelte-CUBWC2AD.js.br +0 -0
  741. package/dist/web/assets/svelte-CUBWC2AD.js.gz +0 -0
  742. package/dist/web/assets/system-monitor-body-DyocekjK.js +2 -0
  743. package/dist/web/assets/system-monitor-body-DyocekjK.js.br +0 -0
  744. package/dist/web/assets/system-monitor-body-DyocekjK.js.gz +0 -0
  745. package/dist/web/assets/system-monitor-tab-DvLaI7Nf.js +1 -0
  746. package/dist/web/assets/system-monitor-window-content-DCCUwpO7.js +1 -0
  747. package/dist/web/assets/tab-host-window-content-CwlNioCH.js +1 -0
  748. package/dist/web/assets/tab-host-window-content-CwlNioCH.js.br +0 -0
  749. package/dist/web/assets/tab-host-window-content-CwlNioCH.js.gz +0 -0
  750. package/dist/web/assets/tab-store-C8Zyikmj.js +1 -0
  751. package/dist/web/assets/table-tab-niRIXhm5.js +2 -0
  752. package/dist/web/assets/table-tab-niRIXhm5.js.br +0 -0
  753. package/dist/web/assets/table-tab-niRIXhm5.js.gz +0 -0
  754. package/dist/web/assets/telegram-bot-token-field-CcsMhJKq.js +1 -0
  755. package/dist/web/assets/telegram-bot-token-field-CcsMhJKq.js.br +0 -0
  756. package/dist/web/assets/telegram-bot-token-field-CcsMhJKq.js.gz +0 -0
  757. package/dist/web/assets/templ-Bz1re8GV.js +1 -0
  758. package/dist/web/assets/templ-Bz1re8GV.js.br +0 -0
  759. package/dist/web/assets/templ-Bz1re8GV.js.gz +0 -0
  760. package/dist/web/assets/terminal-tab-CfWWDWnb.js +3 -0
  761. package/dist/web/assets/terminal-tab-CfWWDWnb.js.br +0 -0
  762. package/dist/web/assets/terminal-tab-CfWWDWnb.js.gz +0 -0
  763. package/dist/web/assets/tex-BTSBmW-r.js +1 -0
  764. package/dist/web/assets/tex-BTSBmW-r.js.br +0 -0
  765. package/dist/web/assets/tex-BTSBmW-r.js.gz +0 -0
  766. package/dist/web/assets/timeline-definition-YZTLITO2-4W8EW7Yh.js +61 -0
  767. package/dist/web/assets/timeline-definition-YZTLITO2-4W8EW7Yh.js.br +0 -0
  768. package/dist/web/assets/timeline-definition-YZTLITO2-4W8EW7Yh.js.gz +0 -0
  769. package/dist/web/assets/tool-cards-BRiwHLQM.js +14 -0
  770. package/dist/web/assets/tool-cards-BRiwHLQM.js.br +0 -0
  771. package/dist/web/assets/tool-cards-BRiwHLQM.js.gz +0 -0
  772. package/dist/web/assets/treemap-KZPCXAKY-a0uFEvBV.js +1 -0
  773. package/dist/web/assets/ts-tags-BKvdq53h.js +1 -0
  774. package/dist/web/assets/ts-tags-BKvdq53h.js.br +0 -0
  775. package/dist/web/assets/ts-tags-BKvdq53h.js.gz +0 -0
  776. package/dist/web/assets/twig-g5pUi4QE.js +1 -0
  777. package/dist/web/assets/twig-g5pUi4QE.js.br +0 -0
  778. package/dist/web/assets/twig-g5pUi4QE.js.gz +0 -0
  779. package/dist/web/assets/use-at-most-wide-2yOBr4it.js +1 -0
  780. package/dist/web/assets/use-blob-url-CKz9HiVf.js +1 -0
  781. package/dist/web/assets/use-db-driver-installed-BHTdleJ4.js +1 -0
  782. package/dist/web/assets/use-db-read-BZxd05qt.js +1 -0
  783. package/dist/web/assets/use-db-read-BZxd05qt.js.br +0 -0
  784. package/dist/web/assets/use-db-read-BZxd05qt.js.gz +0 -0
  785. package/dist/web/assets/use-db-tab-Cr64E4jG.js +1 -0
  786. package/dist/web/assets/use-db-tab-Cr64E4jG.js.br +0 -0
  787. package/dist/web/assets/use-db-tab-Cr64E4jG.js.gz +0 -0
  788. package/dist/web/assets/use-design-canvas-check-BTaQQFE7.js +1 -0
  789. package/dist/web/assets/use-design-canvas-check-BTaQQFE7.js.br +0 -0
  790. package/dist/web/assets/use-design-canvas-check-BTaQQFE7.js.gz +0 -0
  791. package/dist/web/assets/use-inline-blame-CDwi3wup.js +16 -0
  792. package/dist/web/assets/use-inline-blame-CDwi3wup.js.br +0 -0
  793. package/dist/web/assets/use-inline-blame-CDwi3wup.js.gz +0 -0
  794. package/dist/web/assets/use-lsp-BLoLBdkC.js +6 -0
  795. package/dist/web/assets/use-lsp-BLoLBdkC.js.br +0 -0
  796. package/dist/web/assets/use-lsp-BLoLBdkC.js.gz +0 -0
  797. package/dist/web/assets/use-monaco-theme-CqVBeKOM.js +1 -0
  798. package/dist/web/assets/use-opener-focus-BJ2V4yOL.js +1 -0
  799. package/dist/web/assets/use-process-kill-DdZcs_r5.js +1 -0
  800. package/dist/web/assets/use-process-kill-DdZcs_r5.js.br +0 -0
  801. package/dist/web/assets/use-process-kill-DdZcs_r5.js.gz +0 -0
  802. package/dist/web/assets/use-sql-schema-info-eLYr9ZWT.js +4 -0
  803. package/dist/web/assets/use-sql-schema-info-eLYr9ZWT.js.br +0 -0
  804. package/dist/web/assets/use-sql-schema-info-eLYr9ZWT.js.gz +0 -0
  805. package/dist/web/assets/use-websocket-ClfTQqfz.js +1 -0
  806. package/dist/web/assets/vendor-ui-CS1GvlOm.js +45 -0
  807. package/dist/web/assets/vendor-ui-CS1GvlOm.js.br +0 -0
  808. package/dist/web/assets/vendor-ui-CS1GvlOm.js.gz +0 -0
  809. package/dist/web/assets/vennDiagram-LZ73GAT5-CSSSCLbo.js +34 -0
  810. package/dist/web/assets/vennDiagram-LZ73GAT5-CSSSCLbo.js.br +0 -0
  811. package/dist/web/assets/vennDiagram-LZ73GAT5-CSSSCLbo.js.gz +0 -0
  812. package/dist/web/assets/video-preview-CLgy5ToN.js +1 -0
  813. package/dist/web/assets/video-preview-CLgy5ToN.js.br +0 -0
  814. package/dist/web/assets/video-preview-CLgy5ToN.js.gz +0 -0
  815. package/dist/web/assets/voice-settings-section-Bjq-jjqt.js +1 -0
  816. package/dist/web/assets/voice-settings-section-Bjq-jjqt.js.br +0 -0
  817. package/dist/web/assets/voice-settings-section-Bjq-jjqt.js.gz +0 -0
  818. package/dist/web/assets/vue-B0IgDz6z.js +1 -0
  819. package/dist/web/assets/vue-B0IgDz6z.js.br +0 -0
  820. package/dist/web/assets/vue-B0IgDz6z.js.gz +0 -0
  821. package/dist/web/assets/vue-html-hcwjAVXX.js +1 -0
  822. package/dist/web/assets/vue-html-hcwjAVXX.js.br +0 -0
  823. package/dist/web/assets/vue-html-hcwjAVXX.js.gz +0 -0
  824. package/dist/web/assets/vue-vine-5lyGNA4R.js +1 -0
  825. package/dist/web/assets/vue-vine-5lyGNA4R.js.br +0 -0
  826. package/dist/web/assets/vue-vine-5lyGNA4R.js.gz +0 -0
  827. package/dist/web/assets/web-preview-tab-De1l63HH.js +1 -0
  828. package/dist/web/assets/web-preview-tab-De1l63HH.js.br +0 -0
  829. package/dist/web/assets/web-preview-tab-De1l63HH.js.gz +0 -0
  830. package/dist/web/assets/window-store-o2qUlxU1.js +1 -0
  831. package/dist/web/assets/window-store-o2qUlxU1.js.br +0 -0
  832. package/dist/web/assets/window-store-o2qUlxU1.js.gz +0 -0
  833. package/dist/web/assets/ws-auth-DISX8w5V.js +1 -0
  834. package/dist/web/assets/xml-DmDOybPe.js +1 -0
  835. package/dist/web/assets/xml-DmDOybPe.js.br +0 -0
  836. package/dist/web/assets/xml-DmDOybPe.js.gz +0 -0
  837. package/dist/web/assets/xsl-DIyZiiHl.js +1 -0
  838. package/dist/web/assets/xsl-DIyZiiHl.js.br +0 -0
  839. package/dist/web/assets/xsl-DIyZiiHl.js.gz +0 -0
  840. package/dist/web/assets/xychartDiagram-JWTSCODW-3FpyTslg.js +7 -0
  841. package/dist/web/assets/xychartDiagram-JWTSCODW-3FpyTslg.js.br +0 -0
  842. package/dist/web/assets/xychartDiagram-JWTSCODW-3FpyTslg.js.gz +0 -0
  843. package/dist/web/index.html +51 -35
  844. package/dist/web/index.html.br +0 -0
  845. package/dist/web/index.html.gz +0 -0
  846. package/dist/web/sw.js +1 -1
  847. package/dist/web/sw.js.br +0 -0
  848. package/dist/web/sw.js.gz +0 -0
  849. package/docs/architecture/ai-chat-and-providers.md +393 -1
  850. package/docs/architecture/data-and-storage.md +108 -172
  851. package/docs/architecture/integrations.md +12 -4
  852. package/docs/architecture/workspace-and-ui.md +192 -9
  853. package/docs/code-standards.md +30 -1
  854. package/docs/codebase-summary.md +36 -23
  855. package/docs/deployment-guide.md +56 -12
  856. package/docs/project-overview-pdr.md +2 -2
  857. package/docs/project-roadmap.md +21 -2
  858. package/docs/system-architecture.md +12 -7
  859. package/package.json +4 -3
  860. package/packages/ext-git-graph/src/checkout-pathspec.test.ts +52 -0
  861. package/packages/ext-git-graph/src/commit-detail-escaping.test.ts +84 -30
  862. package/packages/ext-git-graph/src/commit-detail-status.test.ts +83 -0
  863. package/packages/ext-git-graph/src/commit-keeps-typing.test.ts +54 -0
  864. package/packages/ext-git-graph/src/commit-paging.test.ts +93 -0
  865. package/packages/ext-git-graph/src/discard-undo-toast.test.ts +46 -0
  866. package/packages/ext-git-graph/src/extension.ts +517 -308
  867. package/packages/ext-git-graph/src/fetch-through-ppm.test.ts +152 -0
  868. package/packages/ext-git-graph/src/git-log-parser.ts +3 -1
  869. package/packages/ext-git-graph/src/gone-branch-filter.test.ts +65 -0
  870. package/packages/ext-git-graph/src/inspector-file-icons.test.ts +93 -0
  871. package/packages/ext-git-graph/src/log-args.test.ts +2 -2
  872. package/packages/ext-git-graph/src/outside-ref-changes.test.ts +185 -0
  873. package/packages/ext-git-graph/src/panel-test-harness.ts +242 -0
  874. package/packages/ext-git-graph/src/ppm-git.test.ts +76 -0
  875. package/packages/ext-git-graph/src/ppm-git.ts +151 -0
  876. package/packages/ext-git-graph/src/remote-head-refs.test.ts +32 -0
  877. package/packages/ext-git-graph/src/request-answers.test.ts +76 -0
  878. package/packages/ext-git-graph/src/search-marks.test.ts +53 -0
  879. package/packages/ext-git-graph/src/stash-list.test.ts +56 -0
  880. package/packages/ext-git-graph/src/types.ts +53 -16
  881. package/packages/ext-git-graph/src/undo-commit-webview.test.ts +82 -0
  882. package/packages/ext-git-graph/src/undo-targets-through-ppm.test.ts +164 -0
  883. package/packages/ext-git-graph/src/webview-html.test.ts +529 -595
  884. package/packages/ext-git-graph/src/webview-html.ts +144 -3765
  885. package/packages/ext-git-graph/src/webview-icons.generated.ts +69 -0
  886. package/packages/ext-git-graph/src/webview-protocol.test.ts +135 -0
  887. package/packages/ext-git-graph/src/webview-script-actions.ts +1291 -0
  888. package/packages/ext-git-graph/src/webview-script-core.ts +624 -0
  889. package/packages/ext-git-graph/src/webview-script-graph.ts +570 -0
  890. package/packages/ext-git-graph/src/webview-script-inspector.ts +571 -0
  891. package/packages/ext-git-graph/src/webview-script-list.ts +696 -0
  892. package/packages/ext-git-graph/src/webview-script-main.ts +279 -0
  893. package/packages/ext-git-graph/src/webview-script-settings.ts +285 -0
  894. package/packages/ext-git-graph/src/webview-styles.ts +615 -0
  895. package/packages/ext-git-graph/src/wip-model.ts +299 -0
  896. package/scripts/gen-db-driver-locks.ts +41 -0
  897. package/scripts/gen-file-icons.ts +27 -0
  898. package/scripts/gen-git-graph-icons.ts +135 -0
  899. package/scripts/gen-product-icons.ts +34 -0
  900. package/scripts/vite-glide-eager-editors.ts +37 -0
  901. package/src/cli/commands/config-cmd.ts +10 -0
  902. package/src/cli/commands/db-cmd.ts +279 -50
  903. package/src/cli/commands/logs.ts +26 -7
  904. package/src/cli/utils/tty-prompt.ts +51 -0
  905. package/src/index.ts +4 -0
  906. package/src/lib/account-crypto.ts +6 -0
  907. package/src/providers/claude-agent-sdk-query-options.ts +111 -0
  908. package/src/providers/claude-agent-sdk.ts +326 -133
  909. package/src/providers/claude-warm-spare.ts +26 -9
  910. package/src/providers/cli-provider-base.ts +28 -5
  911. package/src/providers/codex-app-server/codex-event-mapper.ts +4 -9
  912. package/src/providers/codex-app-server/codex-file-baselines.ts +47 -0
  913. package/src/providers/codex-app-server/codex-history.ts +1 -1
  914. package/src/providers/codex-app-server/codex-jsonrpc-client.ts +57 -11
  915. package/src/providers/codex-app-server/codex-patch.ts +68 -4
  916. package/src/providers/codex-app-server/codex-provider.ts +76 -14
  917. package/src/providers/codex-app-server/codex-rollout-header.ts +2 -1
  918. package/src/providers/codex-app-server/codex-rollout-items.ts +22 -0
  919. package/src/providers/codex-app-server/codex-thread-params.ts +34 -1
  920. package/src/providers/cursor-cli/cursor-history.ts +2 -1
  921. package/src/providers/registry.ts +12 -7
  922. package/src/server/index.ts +224 -103
  923. package/src/server/middleware/access-log.ts +127 -0
  924. package/src/server/middleware/auth.ts +8 -0
  925. package/src/server/routes/accounts.ts +13 -2
  926. package/src/server/routes/android.ts +6 -0
  927. package/src/server/routes/chat-file-changes.ts +215 -0
  928. package/src/server/routes/chat-history-page.ts +116 -0
  929. package/src/server/routes/chat.ts +125 -38
  930. package/src/server/routes/database-changeset.ts +178 -0
  931. package/src/server/routes/database-drivers.ts +36 -0
  932. package/src/server/routes/database-grid-export.ts +212 -0
  933. package/src/server/routes/database-grid.ts +317 -0
  934. package/src/server/routes/database-impexp.ts +317 -0
  935. package/src/server/routes/database-query.ts +186 -0
  936. package/src/server/routes/database-route-helpers.ts +130 -0
  937. package/src/server/routes/database-structure.ts +292 -0
  938. package/src/server/routes/database.ts +539 -280
  939. package/src/server/routes/design-settings.ts +30 -6
  940. package/src/server/routes/git.ts +254 -16
  941. package/src/server/routes/html-preview.ts +42 -9
  942. package/src/server/routes/jira-watcher-routes.ts +7 -1
  943. package/src/server/routes/logs.ts +158 -0
  944. package/src/server/routes/mcp.ts +11 -1
  945. package/src/server/routes/notifications.ts +192 -0
  946. package/src/server/routes/port-forwarding.ts +19 -19
  947. package/src/server/routes/project-scoped.ts +0 -2
  948. package/src/server/routes/query-audit-hook.ts +37 -31
  949. package/src/server/routes/remote-desktop.ts +19 -0
  950. package/src/server/routes/settings.ts +141 -45
  951. package/src/server/routes/system-services.ts +12 -6
  952. package/src/server/routes/tailscale.ts +70 -0
  953. package/src/server/routes/trace.ts +4 -1
  954. package/src/server/routes/tunnel-spawn.ts +55 -12
  955. package/src/server/routes/tunnel.ts +5 -0
  956. package/src/server/routes/tunnels.ts +63 -11
  957. package/src/server/routes/upgrade.ts +5 -1
  958. package/src/server/ws/android.ts +36 -11
  959. package/src/server/ws/chat.ts +294 -69
  960. package/src/server/ws/extensions.ts +13 -10
  961. package/src/server/ws/global.ts +14 -0
  962. package/src/server/ws/group-chat.ts +5 -0
  963. package/src/server/ws/lsp.ts +29 -4
  964. package/src/server/ws/remote-desktop.ts +25 -9
  965. package/src/server/ws/terminal.ts +8 -1
  966. package/src/services/account-pick.service.ts +1 -1
  967. package/src/services/account-selector.service.ts +76 -14
  968. package/src/services/account.service.ts +54 -23
  969. package/src/services/agent-transcript/agent-transcript-activity.ts +11 -4
  970. package/src/services/ai-chat-env.ts +28 -0
  971. package/src/services/android/android-operations.ts +10 -0
  972. package/src/services/android/android-session.ts +20 -0
  973. package/src/services/android/android-video.ts +41 -7
  974. package/src/services/android/avd-manager.ts +21 -3
  975. package/src/services/android/emulator-launcher.ts +40 -2
  976. package/src/services/autostart-register.ts +24 -8
  977. package/src/services/bash-output-spy.ts +6 -3
  978. package/src/services/binary-content.ts +8 -0
  979. package/src/services/binary-upgrade-apply.ts +5 -0
  980. package/src/services/binary-upgrade-download.ts +9 -1
  981. package/src/services/binary-upgrade-swap.ts +18 -3
  982. package/src/services/chat-prepare/chat-prepare.service.ts +4 -1
  983. package/src/services/chat-prepare/settle-within-budget.ts +10 -3
  984. package/src/services/chat-search.service.ts +4 -2
  985. package/src/services/chat.service.ts +115 -5
  986. package/src/services/claude-transcript-exists.ts +24 -0
  987. package/src/services/cloud-ws.service.ts +46 -12
  988. package/src/services/cloud.service.ts +40 -9
  989. package/src/services/cloudflared.service.ts +25 -3
  990. package/src/services/codex-account-cooldown.ts +4 -0
  991. package/src/services/codex-account-login.ts +15 -4
  992. package/src/services/compact-segment.ts +156 -0
  993. package/src/services/compaction-savings.ts +8 -2
  994. package/src/services/config-secret-keys.ts +2 -0
  995. package/src/services/config.service.ts +44 -6
  996. package/src/services/database/analyser-mysql.ts +384 -0
  997. package/src/services/database/analyser-postgres.ts +259 -0
  998. package/src/services/database/analyser-sqlite.ts +411 -0
  999. package/src/services/database/changeset.service.ts +60 -0
  1000. package/src/services/database/changeset.ts +473 -0
  1001. package/src/services/database/connection-config.ts +370 -0
  1002. package/src/services/database/connection-database.ts +90 -0
  1003. package/src/services/database/connection-endpoint.ts +160 -0
  1004. package/src/services/database/connection-login.ts +144 -0
  1005. package/src/services/database/connection-test.ts +191 -0
  1006. package/src/services/database/db-errors.ts +57 -0
  1007. package/src/services/database/db-values.ts +45 -0
  1008. package/src/services/database/ddl/ddl-common.ts +47 -0
  1009. package/src/services/database/ddl/ddl-mysql.ts +202 -0
  1010. package/src/services/database/ddl/ddl-objects.ts +116 -0
  1011. package/src/services/database/ddl/ddl-postgres.ts +208 -0
  1012. package/src/services/database/ddl/ddl-sqlite.ts +172 -0
  1013. package/src/services/database/ddl/ddl-types.ts +61 -0
  1014. package/src/services/database/ddl/sqlite-alter-plan.ts +61 -0
  1015. package/src/services/database/ddl/sqlite-apply.ts +112 -0
  1016. package/src/services/database/ddl/sqlite-recreate.ts +202 -0
  1017. package/src/services/database/ddl/table-diff.ts +187 -0
  1018. package/src/services/database/dialect-mysql.ts +58 -0
  1019. package/src/services/database/dialect-postgres.ts +52 -0
  1020. package/src/services/database/dialect-sqlite.ts +30 -0
  1021. package/src/services/database/dialect.ts +108 -0
  1022. package/src/services/database/dialects.ts +20 -0
  1023. package/src/services/database/drivers/db-driver-catalog.ts +99 -0
  1024. package/src/services/database/drivers/db-driver-install.ts +348 -0
  1025. package/src/services/database/drivers/db-driver-loader.ts +103 -0
  1026. package/src/services/database/drivers/db-driver-locks.generated.json +201 -0
  1027. package/src/services/database/drivers/db-driver-store.ts +75 -0
  1028. package/src/services/database/export-batch.ts +68 -0
  1029. package/src/services/database/file-database.ts +105 -0
  1030. package/src/services/database/grid-cell.ts +80 -0
  1031. package/src/services/database/grid-export-text.ts +318 -0
  1032. package/src/services/database/grid-export-tickets.ts +61 -0
  1033. package/src/services/database/grid-export-xlsx.ts +296 -0
  1034. package/src/services/database/grid-export.ts +13 -0
  1035. package/src/services/database/grid-query-builder.ts +397 -0
  1036. package/src/services/database/grid.service.ts +157 -0
  1037. package/src/services/database/host-files.ts +52 -0
  1038. package/src/services/database/impexp/column-map.ts +58 -0
  1039. package/src/services/database/impexp/export-job-runner.ts +281 -0
  1040. package/src/services/database/impexp/impexp-files.ts +118 -0
  1041. package/src/services/database/impexp/impexp-job-store.ts +195 -0
  1042. package/src/services/database/impexp/impexp-request.ts +279 -0
  1043. package/src/services/database/impexp/import-job-runner.ts +181 -0
  1044. package/src/services/database/impexp/import-table-writer.ts +319 -0
  1045. package/src/services/database/impexp/import-uploads.ts +167 -0
  1046. package/src/services/database/impexp/readers/csv-reader.ts +359 -0
  1047. package/src/services/database/impexp/readers/file-rows.ts +59 -0
  1048. package/src/services/database/impexp/readers/file-text.ts +80 -0
  1049. package/src/services/database/impexp/readers/json-reader.ts +505 -0
  1050. package/src/services/database/impexp/zip-output.ts +55 -0
  1051. package/src/services/database/init-adapters.ts +4 -0
  1052. package/src/services/database/isolation-level.ts +18 -0
  1053. package/src/services/database/mysql-adapter.ts +62 -0
  1054. package/src/services/database/object-scripts.ts +20 -0
  1055. package/src/services/database/object-sql-mysql.ts +53 -0
  1056. package/src/services/database/object-sql-postgres.ts +265 -0
  1057. package/src/services/database/object-sql-sqlite.ts +25 -0
  1058. package/src/services/database/postgres-adapter.ts +93 -23
  1059. package/src/services/database/postgres-array-nulls.ts +101 -0
  1060. package/src/services/database/postgres-connect-options.ts +92 -0
  1061. package/src/services/database/query-script-runner.ts +203 -0
  1062. package/src/services/database/readonly-check.ts +39 -15
  1063. package/src/services/database/sqlite-adapter.ts +100 -17
  1064. package/src/services/database/ssh-agent-socket.ts +50 -0
  1065. package/src/services/database/ssh-known-hosts.ts +113 -0
  1066. package/src/services/database/ssh-tunnel.ts +613 -0
  1067. package/src/services/database/structure-change-request.ts +214 -0
  1068. package/src/services/database/structure-edit.service.ts +143 -0
  1069. package/src/services/database/tls-identity-check.ts +81 -0
  1070. package/src/services/db-backup/db-backup-restore.ts +14 -2
  1071. package/src/services/db.service.ts +153 -54
  1072. package/src/services/design/bridge/bridge-script.ts +14 -6
  1073. package/src/services/design/bridge/html-preview-bridge.ts +23 -0
  1074. package/src/services/design/comments/design-comments-store.ts +7 -2
  1075. package/src/services/design/design-skill-install.service.ts +269 -0
  1076. package/src/services/design/design-turn-snapshot.ts +5 -2
  1077. package/src/services/design/mcp/design-mcp-endpoint.ts +15 -77
  1078. package/src/services/design/mcp/design-mcp-tokens.ts +9 -65
  1079. package/src/services/design/preview/design-preview-html.ts +1 -1
  1080. package/src/services/draft.service.ts +10 -3
  1081. package/src/services/edge-forwarder.ts +50 -3
  1082. package/src/services/event-loop-lag.ts +37 -2
  1083. package/src/services/extension-host-worker.ts +41 -6
  1084. package/src/services/extension-installer.ts +13 -5
  1085. package/src/services/extension-manifest.ts +9 -2
  1086. package/src/services/extension-rpc-handlers.ts +39 -4
  1087. package/src/services/extension-rpc.ts +31 -2
  1088. package/src/services/extension.service.ts +48 -13
  1089. package/src/services/file-lines.ts +2 -2
  1090. package/src/services/file-list-index.service.ts +17 -1
  1091. package/src/services/file-watcher/linux-inotify.ts +47 -6
  1092. package/src/services/file-watcher/watch-tree.ts +42 -6
  1093. package/src/services/file-watcher.service.ts +15 -7
  1094. package/src/services/file.service.ts +6 -0
  1095. package/src/services/fs-ops/fs-core-ops.ts +5 -1
  1096. package/src/services/fs-ops/fs-git-init.service.ts +13 -1
  1097. package/src/services/fs-ops/fs-ops-copy-move.service.ts +5 -0
  1098. package/src/services/fs-ops/fs-ops-mutate.service.ts +6 -1
  1099. package/src/services/fs-ops/fs-ops-trash.service.ts +17 -3
  1100. package/src/services/git-changes/diff-sections.ts +230 -0
  1101. package/src/services/git-changes/git-changes.service.ts +471 -0
  1102. package/src/services/git-changes/git-events.ts +28 -0
  1103. package/src/services/git-changes/git-operation.ts +86 -0
  1104. package/src/services/git-changes/porcelain-v2.ts +117 -0
  1105. package/src/services/git-commit-draft.service.ts +51 -0
  1106. package/src/services/git-discard-journal/git-discard-journal.service.ts +412 -0
  1107. package/src/services/git-hunks/git-hunks.service.ts +50 -11
  1108. package/src/services/git-workflow/git-workflow.service.ts +198 -0
  1109. package/src/services/git.service.ts +64 -8
  1110. package/src/services/group-chat/group-chat.service.ts +31 -5
  1111. package/src/services/group-chat/responder-router.ts +15 -3
  1112. package/src/services/host-info/host-info.service.ts +16 -0
  1113. package/src/services/host-info/spawn-runner.ts +25 -0
  1114. package/src/services/jira-config.service.ts +13 -1
  1115. package/src/services/jira-debug-session.service.ts +19 -4
  1116. package/src/services/jira-watcher.service.ts +53 -11
  1117. package/src/services/jsonl-transcript-parser.ts +49 -19
  1118. package/src/services/log-level-config.ts +36 -0
  1119. package/src/services/logger.ts +280 -0
  1120. package/src/services/logs/browser-logs.ts +84 -0
  1121. package/src/services/logs/github-issues.ts +76 -0
  1122. package/src/services/logs/log-ai.ts +40 -0
  1123. package/src/services/logs/log-columns.ts +160 -0
  1124. package/src/services/logs/log-environment.ts +94 -0
  1125. package/src/services/logs/log-file-index.ts +355 -0
  1126. package/src/services/logs/log-issues.ts +390 -0
  1127. package/src/services/logs/log-live.ts +82 -0
  1128. package/src/services/logs/log-report-draft.ts +63 -0
  1129. package/src/services/logs/log-store.ts +609 -0
  1130. package/src/services/lsp/lsp-install.ts +199 -11
  1131. package/src/services/lsp/lsp-manager.ts +31 -7
  1132. package/src/services/lsp/lsp-release-catalog.ts +87 -0
  1133. package/src/services/lsp/lsp-session.ts +29 -2
  1134. package/src/services/lsp/server-registry.ts +85 -18
  1135. package/src/services/mcp-http-endpoint.ts +127 -0
  1136. package/src/services/mcp-oauth/mcp-oauth-flows.ts +11 -4
  1137. package/src/services/mcp-session-tokens.ts +77 -0
  1138. package/src/services/media-transcode/ffmpeg-capabilities.ts +33 -2
  1139. package/src/services/media-transcode/transcode-stream.ts +7 -1
  1140. package/src/services/memory-diagnostics.ts +86 -0
  1141. package/src/services/mysql.service.ts +1065 -0
  1142. package/src/services/named-tunnel/cloudflared-login-helpers.ts +4 -2
  1143. package/src/services/named-tunnel/cloudflared-login.service.ts +15 -2
  1144. package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +7 -1
  1145. package/src/services/named-tunnel/named-tunnel-setup.service.ts +9 -1
  1146. package/src/services/nested-subagent-spy.ts +7 -4
  1147. package/src/services/notification-format.ts +74 -0
  1148. package/src/services/notification-link.ts +22 -0
  1149. package/src/services/notification.service.ts +157 -12
  1150. package/src/services/ntfy-notification.service.ts +134 -0
  1151. package/src/services/picked-account-binding.ts +7 -1
  1152. package/src/services/port-forward/forward-hop.ts +296 -0
  1153. package/src/services/port-forward/frame-ancestors.ts +117 -0
  1154. package/src/services/port-forward/tailscale-forward.ts +261 -0
  1155. package/src/services/postgres.service.ts +815 -21
  1156. package/src/services/ppmbot/cli-reference-default.ts +17 -4
  1157. package/src/services/ppmbot/ppmbot-delegation.ts +8 -0
  1158. package/src/services/ppmbot/ppmbot-service.ts +58 -46
  1159. package/src/services/ppmbot/ppmbot-session.ts +14 -10
  1160. package/src/services/ppmbot/ppmbot-streamer.ts +6 -3
  1161. package/src/services/ppmbot/ppmbot-telegram.ts +45 -13
  1162. package/src/services/project.service.ts +12 -1
  1163. package/src/services/provider-usage/usage-registry.ts +12 -2
  1164. package/src/services/proxy-agent-anthropic-bridge.ts +11 -1
  1165. package/src/services/proxy-agent-bridge.ts +11 -1
  1166. package/src/services/proxy-agent-turn.ts +25 -2
  1167. package/src/services/proxy-image-bridge.ts +2 -2
  1168. package/src/services/proxy-openai-bridge.ts +1 -1
  1169. package/src/services/proxy-sdk-bridge.ts +1 -1
  1170. package/src/services/proxy.service.ts +32 -9
  1171. package/src/services/query-audit/query-audit.service.ts +10 -2
  1172. package/src/services/read-lines.ts +16 -4
  1173. package/src/services/redact-secrets.ts +23 -2
  1174. package/src/services/remote-desktop/ffmpeg-install.ts +85 -0
  1175. package/src/services/remote-desktop/mediamtx-install.service.ts +11 -2
  1176. package/src/services/remote-desktop/mediamtx-process.ts +31 -2
  1177. package/src/services/remote-desktop/remote-desktop-audio.ts +24 -7
  1178. package/src/services/remote-desktop/remote-desktop-capture-input.ts +7 -4
  1179. package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +30 -10
  1180. package/src/services/remote-desktop/remote-desktop-capture.ts +40 -6
  1181. package/src/services/remote-desktop/remote-desktop-displays-win32.ts +92 -0
  1182. package/src/services/remote-desktop/remote-desktop-displays.ts +8 -5
  1183. package/src/services/remote-desktop/remote-desktop-input-uinput.ts +20 -1
  1184. package/src/services/remote-desktop/remote-desktop-input-win32.ts +49 -9
  1185. package/src/services/remote-desktop/remote-desktop-portal.ts +19 -3
  1186. package/src/services/remote-desktop/remote-desktop-privacy.ts +8 -1
  1187. package/src/services/remote-desktop/remote-desktop-requirements.ts +3 -2
  1188. package/src/services/remote-desktop/remote-desktop-resolution.ts +6 -0
  1189. package/src/services/remote-desktop/remote-desktop-session.ts +111 -27
  1190. package/src/services/remote-desktop/remote-desktop-x11.ts +25 -2
  1191. package/src/services/scheduler-core.ts +22 -10
  1192. package/src/services/scheduler-runner.ts +28 -10
  1193. package/src/services/sd-notify.ts +26 -2
  1194. package/src/services/session-file-baselines/reverse-unified-diff.ts +85 -0
  1195. package/src/services/session-file-baselines/session-file-baselines.service.ts +241 -0
  1196. package/src/services/session-file-baselines/session-file-blame.ts +200 -0
  1197. package/src/services/session-file-baselines/session-file-changes.service.ts +321 -0
  1198. package/src/services/session-file-baselines/session-file-history.ts +347 -0
  1199. package/src/services/session-file-baselines/session-review-actions.ts +560 -0
  1200. package/src/services/session-file-baselines/session-review-blocks.ts +90 -0
  1201. package/src/services/session-file-baselines/session-review-marks.ts +90 -0
  1202. package/src/services/session-file-baselines/session-turn-revert.ts +374 -0
  1203. package/src/services/session-file-baselines/shell-change-tracker.ts +489 -0
  1204. package/src/services/session-trace/session-trace-db.ts +14 -1
  1205. package/src/services/session-trace/session-trace-store.ts +56 -0
  1206. package/src/services/session-trace/turn-stop-reader.ts +70 -0
  1207. package/src/services/speech-to-text/whisper-install.service.ts +13 -1
  1208. package/src/services/sqlite-types.ts +2 -0
  1209. package/src/services/sqlite.service.ts +507 -13
  1210. package/src/services/supervisor-state.ts +6 -4
  1211. package/src/services/supervisor-stopped-page.ts +6 -6
  1212. package/src/services/supervisor.ts +118 -44
  1213. package/src/services/system-metrics/gpu-collector-nvidia.ts +13 -3
  1214. package/src/services/system-metrics/kill-request-handler.ts +9 -8
  1215. package/src/services/system-metrics/powershell-session.ts +40 -7
  1216. package/src/services/system-metrics/process-collector-windows.ts +4 -3
  1217. package/src/services/system-metrics/process-net-collector-darwin.ts +13 -5
  1218. package/src/services/system-metrics/signal-request-handler.ts +9 -8
  1219. package/src/services/system-metrics/system-metrics-platform.ts +11 -2
  1220. package/src/services/system-metrics/system-metrics.service.ts +31 -4
  1221. package/src/services/system-services/app-icon-service.ts +19 -1
  1222. package/src/services/system-services/app-icons-windows.ts +105 -0
  1223. package/src/services/system-services/apps-windows-native.ts +233 -0
  1224. package/src/services/system-services/apps-windows.ts +156 -0
  1225. package/src/services/system-services/launchd-collector.ts +12 -1
  1226. package/src/services/system-services/service-backend.ts +6 -3
  1227. package/src/services/system-services/systemd-collector.ts +9 -1
  1228. package/src/services/system-services/windows-services-parse.ts +186 -0
  1229. package/src/services/system-services/windows-services.ts +200 -0
  1230. package/src/services/tab-tools-mcp/tab-open-broker.ts +135 -0
  1231. package/src/services/tab-tools-mcp/tab-target.ts +88 -0
  1232. package/src/services/tab-tools-mcp/tab-tools-mcp-endpoint.ts +116 -0
  1233. package/src/services/tab-tools-mcp/tab-tools-mcp-tokens.ts +36 -0
  1234. package/src/services/tab-tools-mcp/tab-tools-mcp-tool.ts +78 -0
  1235. package/src/services/table-cache.service.ts +4 -2
  1236. package/src/services/tailscale/tailscale-app-service.ts +239 -0
  1237. package/src/services/tailscale/tailscale-cli.ts +48 -0
  1238. package/src/services/tailscale/tailscale-login.ts +257 -0
  1239. package/src/services/tailscale/tailscale-state.ts +198 -0
  1240. package/src/services/telegram-bot-api.ts +80 -0
  1241. package/src/services/telegram-bots.ts +131 -0
  1242. package/src/services/telegram-connect.service.ts +262 -0
  1243. package/src/services/telegram-notification.service.ts +48 -55
  1244. package/src/services/terminal.service.ts +46 -11
  1245. package/src/services/theme-import/fetch-url.ts +11 -2
  1246. package/src/services/tunnel-registry-parse.ts +4 -0
  1247. package/src/services/tunnel.service.ts +15 -0
  1248. package/src/services/upgrade.service.ts +30 -2
  1249. package/src/services/web-push/web-push-crypto.ts +150 -0
  1250. package/src/services/web-push/web-push-store.ts +116 -0
  1251. package/src/services/web-push/web-push.service.ts +240 -0
  1252. package/src/shared/agent-transcript-protocol.ts +4 -1
  1253. package/src/shared/chat-reply.ts +51 -0
  1254. package/src/shared/db-changeset.ts +89 -0
  1255. package/src/shared/db-column-kind.ts +90 -0
  1256. package/src/shared/db-connection-config.ts +256 -0
  1257. package/src/shared/db-connection-url.ts +252 -0
  1258. package/src/shared/db-drivers.ts +36 -0
  1259. package/src/shared/db-explorer-prefs.ts +123 -0
  1260. package/src/shared/db-filter-parser.ts +534 -0
  1261. package/src/shared/db-grid-export.ts +88 -0
  1262. package/src/shared/db-grid.ts +234 -0
  1263. package/src/shared/db-impexp.ts +313 -0
  1264. package/src/shared/db-lookup-prefs.ts +37 -0
  1265. package/src/shared/db-query-script.ts +110 -0
  1266. package/src/shared/db-structure-change.ts +83 -0
  1267. package/src/shared/db-structure.ts +195 -0
  1268. package/src/shared/db-table-model.ts +500 -0
  1269. package/src/shared/db-types.ts +31 -0
  1270. package/src/shared/design-canvas-check-format.ts +23 -0
  1271. package/src/shared/design-skill-suggestion.ts +20 -4
  1272. package/src/shared/git-changes.ts +220 -0
  1273. package/src/shared/log-fingerprint.ts +32 -0
  1274. package/src/shared/log-levels.ts +41 -0
  1275. package/src/shared/log-redact.ts +82 -0
  1276. package/src/shared/logs-api.ts +145 -0
  1277. package/src/shared/logs-model.ts +230 -0
  1278. package/src/shared/notification-settings.ts +184 -0
  1279. package/src/shared/ppmbot-telegram.ts +16 -0
  1280. package/src/shared/review-blocks.ts +222 -0
  1281. package/src/shared/session-file-changes.ts +136 -0
  1282. package/src/shared/split-sql-statements.ts +388 -0
  1283. package/src/shared/sql-identifiers.ts +97 -0
  1284. package/src/shared/tab-open-protocol.ts +70 -0
  1285. package/src/shared/tailscale-setup.ts +126 -0
  1286. package/src/shared/terminal-size.ts +23 -0
  1287. package/src/shared/tool-result-content.ts +5 -0
  1288. package/src/shared/turn-stop.ts +30 -0
  1289. package/src/shared/user-agent-label.ts +59 -0
  1290. package/src/shared/web-push-payload.ts +41 -0
  1291. package/src/types/api.ts +12 -3
  1292. package/src/types/chat.ts +6 -0
  1293. package/src/types/config.ts +25 -0
  1294. package/src/types/database.ts +215 -7
  1295. package/src/types/system-metrics.ts +9 -5
  1296. package/src/types/system-services.ts +8 -3
  1297. package/src/web/app.tsx +31 -7
  1298. package/src/web/components/auth/login-screen.tsx +21 -10
  1299. package/src/web/components/chat/change-file-row.tsx +1 -79
  1300. package/src/web/components/chat/chat-history-bar.tsx +13 -8
  1301. package/src/web/components/chat/chat-tab.tsx +186 -40
  1302. package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +7 -1
  1303. package/src/web/components/chat/message-action-bar.tsx +3 -1
  1304. package/src/web/components/chat/message-input.tsx +75 -14
  1305. package/src/web/components/chat/message-list.tsx +146 -9
  1306. package/src/web/components/chat/message-reply-reference.ts +43 -0
  1307. package/src/web/components/chat/message-user-bubble.tsx +10 -3
  1308. package/src/web/components/chat/model-thinking-selector.tsx +6 -4
  1309. package/src/web/components/chat/prompt-cache-chip.tsx +1 -1
  1310. package/src/web/components/chat/reply-card.tsx +28 -0
  1311. package/src/web/components/chat/running-agents-bar.tsx +180 -58
  1312. package/src/web/components/chat/session-change-row.tsx +118 -0
  1313. package/src/web/components/chat/session-changes-bar.tsx +223 -0
  1314. package/src/web/components/chat/session-changes-context.tsx +21 -0
  1315. package/src/web/components/chat/tab-tool-card.tsx +93 -0
  1316. package/src/web/components/chat/tool-cards.tsx +11 -0
  1317. package/src/web/components/chat/turn-change-pill.tsx +20 -2
  1318. package/src/web/components/chat/turn-change-review.tsx +383 -0
  1319. package/src/web/components/chat/turn-change-rollup.tsx +15 -4
  1320. package/src/web/components/chat/turn-change-sheet.tsx +103 -94
  1321. package/src/web/components/chat/turn-change-tray.tsx +90 -93
  1322. package/src/web/components/chat/turn-stop-bar.tsx +42 -0
  1323. package/src/web/components/chat/user-message-parse.ts +5 -2
  1324. package/src/web/components/database/connection-color-picker.tsx +42 -46
  1325. package/src/web/components/database/connection-form/connection-advanced-pane.tsx +82 -0
  1326. package/src/web/components/database/connection-form/connection-form-state.ts +719 -0
  1327. package/src/web/components/database/connection-form/connection-form-tab.tsx +160 -0
  1328. package/src/web/components/database/connection-form/connection-general-pane.tsx +231 -0
  1329. package/src/web/components/database/connection-form/connection-ssh-pane.tsx +136 -0
  1330. package/src/web/components/database/connection-form/connection-ssl-pane.tsx +68 -0
  1331. package/src/web/components/database/connection-form/connection-test-result.tsx +90 -0
  1332. package/src/web/components/database/connection-form/database-picker.tsx +136 -0
  1333. package/src/web/components/database/connection-form/engine-tiles.tsx +72 -0
  1334. package/src/web/components/database/connection-form/form-controls.tsx +219 -0
  1335. package/src/web/components/database/connection-form/use-connection-form.ts +369 -0
  1336. package/src/web/components/database/connection-import-export.tsx +6 -5
  1337. package/src/web/components/database/connections-section/connection-menus.ts +100 -0
  1338. package/src/web/components/database/connections-section/connection-tree-model.ts +113 -0
  1339. package/src/web/components/database/connections-section/connections-section.tsx +432 -0
  1340. package/src/web/components/database/connections-section/delete-connection-dialog.tsx +75 -0
  1341. package/src/web/components/database/connections-section/folder-name-input.tsx +41 -0
  1342. package/src/web/components/database/database-sidebar.tsx +55 -78
  1343. package/src/web/components/database/db-login/db-login-dialog.tsx +255 -0
  1344. package/src/web/components/database/db-login/db-login-store.ts +63 -0
  1345. package/src/web/components/database/db-rows-status.tsx +32 -0
  1346. package/src/web/components/database/db-sidebar-reveal.ts +66 -0
  1347. package/src/web/components/database/db-tab-parts.tsx +117 -0
  1348. package/src/web/components/database/driver-missing-notice.tsx +72 -0
  1349. package/src/web/components/database/explorer/db-explorer-store.ts +658 -0
  1350. package/src/web/components/database/explorer/explorer-menu.tsx +193 -0
  1351. package/src/web/components/database/explorer/explorer-model.ts +341 -0
  1352. package/src/web/components/database/explorer/open-db-tabs.ts +160 -0
  1353. package/src/web/components/database/explorer/open-new-query.ts +22 -0
  1354. package/src/web/components/database/explorer/open-new-table.ts +37 -0
  1355. package/src/web/components/database/explorer/sql-templates.ts +110 -0
  1356. package/src/web/components/database/explorer/tree-parts.tsx +109 -0
  1357. package/src/web/components/database/explorer/use-db-explorer-sync.ts +25 -0
  1358. package/src/web/components/database/explorer/use-row-menu.ts +37 -0
  1359. package/src/web/components/database/explorer/use-tree-keys.ts +92 -0
  1360. package/src/web/components/database/export-button.tsx +96 -113
  1361. package/src/web/components/database/extract-query-table.ts +4 -3
  1362. package/src/web/components/database/focused-database-prompt.tsx +85 -0
  1363. package/src/web/components/database/glide-context-menu.tsx +52 -62
  1364. package/src/web/components/database/glide-data-grid.tsx +1401 -157
  1365. package/src/web/components/database/glide-grid-theme.ts +49 -2
  1366. package/src/web/components/database/glide-grid-types.ts +222 -48
  1367. package/src/web/components/database/glide-header-menu.tsx +52 -103
  1368. package/src/web/components/database/glide-save-bar.tsx +4 -3
  1369. package/src/web/components/database/grid/cell-context-menu.tsx +151 -0
  1370. package/src/web/components/database/grid/cell-data-formats.ts +298 -0
  1371. package/src/web/components/database/grid/cell-data-panel.tsx +662 -0
  1372. package/src/web/components/database/grid/cell-display.ts +52 -0
  1373. package/src/web/components/database/grid/cell-editor.tsx +55 -0
  1374. package/src/web/components/database/grid/cell-menu.ts +210 -0
  1375. package/src/web/components/database/grid/change-marks.ts +51 -0
  1376. package/src/web/components/database/grid/column-filter-cell.ts +34 -0
  1377. package/src/web/components/database/grid/column-menu.ts +51 -0
  1378. package/src/web/components/database/grid/columns-panel.tsx +241 -0
  1379. package/src/web/components/database/grid/columns-sheet.tsx +172 -0
  1380. package/src/web/components/database/grid/copy-as.ts +170 -0
  1381. package/src/web/components/database/grid/dictionary-lookup-dialog.tsx +169 -0
  1382. package/src/web/components/database/grid/fetch-all-dialog.tsx +51 -0
  1383. package/src/web/components/database/grid/filter-chips.tsx +107 -0
  1384. package/src/web/components/database/grid/filter-dialog-frame.tsx +95 -0
  1385. package/src/web/components/database/grid/filter-dialog-host.tsx +43 -0
  1386. package/src/web/components/database/grid/filter-funnel-menu.ts +131 -0
  1387. package/src/web/components/database/grid/filter-multiple-values-dialog.tsx +61 -0
  1388. package/src/web/components/database/grid/filter-row.tsx +216 -0
  1389. package/src/web/components/database/grid/filter-sheet.tsx +227 -0
  1390. package/src/web/components/database/grid/filters-panel.tsx +163 -0
  1391. package/src/web/components/database/grid/fk-cell-button.ts +67 -0
  1392. package/src/web/components/database/grid/fk-cell-editor.tsx +36 -0
  1393. package/src/web/components/database/grid/form-view-model.ts +263 -0
  1394. package/src/web/components/database/grid/form-view.tsx +505 -0
  1395. package/src/web/components/database/grid/generate-sql-dialog.tsx +135 -0
  1396. package/src/web/components/database/grid/generate-sql.ts +101 -0
  1397. package/src/web/components/database/grid/grid-changeset.ts +262 -0
  1398. package/src/web/components/database/grid/grid-filters.ts +172 -0
  1399. package/src/web/components/database/grid/grid-header-overlay.tsx +140 -0
  1400. package/src/web/components/database/grid/grid-save-dialog.tsx +251 -0
  1401. package/src/web/components/database/grid/grid-save-host.tsx +19 -0
  1402. package/src/web/components/database/grid/grid-save-model.ts +64 -0
  1403. package/src/web/components/database/grid/grid-save-store.ts +65 -0
  1404. package/src/web/components/database/grid/grid-status-bar.tsx +54 -0
  1405. package/src/web/components/database/grid/header-bands.ts +232 -0
  1406. package/src/web/components/database/grid/json-document.ts +139 -0
  1407. package/src/web/components/database/grid/json-tree.tsx +74 -0
  1408. package/src/web/components/database/grid/load-more.ts +22 -0
  1409. package/src/web/components/database/grid/master-detail-split.tsx +233 -0
  1410. package/src/web/components/database/grid/pick-table.tsx +109 -0
  1411. package/src/web/components/database/grid/reference-filter.ts +48 -0
  1412. package/src/web/components/database/grid/references-panel.tsx +82 -0
  1413. package/src/web/components/database/grid/references.ts +104 -0
  1414. package/src/web/components/database/grid/refresh-menu.tsx +133 -0
  1415. package/src/web/components/database/grid/row-form-sheet.tsx +234 -0
  1416. package/src/web/components/database/grid/selection-commands.ts +124 -0
  1417. package/src/web/components/database/grid/selection-stats.ts +131 -0
  1418. package/src/web/components/database/grid/set-filter-dialog.tsx +93 -0
  1419. package/src/web/components/database/grid/table-keys.ts +130 -0
  1420. package/src/web/components/database/grid/table-toolbar.tsx +326 -0
  1421. package/src/web/components/database/grid/table-view-state.ts +63 -0
  1422. package/src/web/components/database/grid/text-value-dialog.tsx +80 -0
  1423. package/src/web/components/database/grid/use-cell-long-press.ts +146 -0
  1424. package/src/web/components/database/grid/use-changeset.ts +48 -0
  1425. package/src/web/components/database/grid/use-filter-pickers.ts +76 -0
  1426. package/src/web/components/database/grid/use-grid-copy.ts +99 -0
  1427. package/src/web/components/database/grid/use-opener-focus.ts +17 -0
  1428. package/src/web/components/database/grid/use-pick-search.ts +38 -0
  1429. package/src/web/components/database/grid/use-table-filters.ts +84 -0
  1430. package/src/web/components/database/grid/value-filter-text.ts +96 -0
  1431. package/src/web/components/database/grid/value-lookup-dialog.tsx +91 -0
  1432. package/src/web/components/database/impexp/impexp-columns-dialog.tsx +171 -0
  1433. package/src/web/components/database/impexp/impexp-config.tsx +131 -0
  1434. package/src/web/components/database/impexp/impexp-database-fields.tsx +107 -0
  1435. package/src/web/components/database/impexp/impexp-file-input.tsx +118 -0
  1436. package/src/web/components/database/impexp/impexp-format-options.tsx +127 -0
  1437. package/src/web/components/database/impexp/impexp-map-table.tsx +187 -0
  1438. package/src/web/components/database/impexp/impexp-parts.tsx +77 -0
  1439. package/src/web/components/database/impexp/impexp-side-panes.tsx +191 -0
  1440. package/src/web/components/database/impexp/impexp-state.ts +590 -0
  1441. package/src/web/components/database/impexp/impexp-tab.tsx +222 -0
  1442. package/src/web/components/database/impexp/impexp-tables-select.tsx +169 -0
  1443. package/src/web/components/database/impexp/impexp-upload.ts +52 -0
  1444. package/src/web/components/database/impexp/open-impexp-tab.ts +58 -0
  1445. package/src/web/components/database/impexp/use-impexp-database.ts +75 -0
  1446. package/src/web/components/database/impexp/use-impexp-job.ts +114 -0
  1447. package/src/web/components/database/object-tree/object-menus.ts +141 -0
  1448. package/src/web/components/database/object-tree/object-tree-model.ts +132 -0
  1449. package/src/web/components/database/object-tree/objects-section.tsx +503 -0
  1450. package/src/web/components/database/open-connection-form.ts +21 -0
  1451. package/src/web/components/database/query/discard-result-edits-dialog.tsx +43 -0
  1452. package/src/web/components/database/query/format-sql.ts +67 -0
  1453. package/src/web/components/database/query/history-panel.tsx +177 -0
  1454. package/src/web/components/database/query/messages-panel.tsx +98 -0
  1455. package/src/web/components/database/query/query-file.ts +56 -0
  1456. package/src/web/components/database/query/query-history.ts +56 -0
  1457. package/src/web/components/database/query/query-run-state.ts +282 -0
  1458. package/src/web/components/database/query/query-tab.tsx +397 -0
  1459. package/src/web/components/database/query/query-target-picker.tsx +95 -0
  1460. package/src/web/components/database/query/result-tabs.tsx +104 -0
  1461. package/src/web/components/database/query/result-view.tsx +111 -0
  1462. package/src/web/components/database/query/use-query-file-save.tsx +117 -0
  1463. package/src/web/components/database/query/use-query-runner.ts +202 -0
  1464. package/src/web/components/database/query/use-sql-schema-info.ts +40 -0
  1465. package/src/web/components/database/reformat-cursor.ts +40 -0
  1466. package/src/web/components/database/sidebar-split.tsx +89 -0
  1467. package/src/web/components/database/sql-completion-provider.ts +149 -49
  1468. package/src/web/components/database/sql-object/sql-object-model.ts +39 -0
  1469. package/src/web/components/database/sql-object/sql-object-tab.tsx +138 -0
  1470. package/src/web/components/database/sql-query-editor.tsx +203 -36
  1471. package/src/web/components/database/sql-run.ts +40 -0
  1472. package/src/web/components/database/structure/structure-model.ts +90 -0
  1473. package/src/web/components/database/structure/structure-tab.tsx +326 -0
  1474. package/src/web/components/database/table/table-tab.tsx +694 -0
  1475. package/src/web/components/database/table-editor/column-dialog.tsx +129 -0
  1476. package/src/web/components/database/table-editor/editor-dialog.tsx +122 -0
  1477. package/src/web/components/database/table-editor/foreign-key-dialog.tsx +188 -0
  1478. package/src/web/components/database/table-editor/key-dialog.tsx +197 -0
  1479. package/src/web/components/database/table-editor/rename-object-dialog.tsx +45 -0
  1480. package/src/web/components/database/table-editor/structure-save-dialog.tsx +167 -0
  1481. package/src/web/components/database/table-editor/structure-save-host.tsx +24 -0
  1482. package/src/web/components/database/table-editor/structure-save-model.ts +91 -0
  1483. package/src/web/components/database/table-editor/structure-save-store.ts +52 -0
  1484. package/src/web/components/database/table-editor/table-editor-commands.ts +27 -0
  1485. package/src/web/components/database/table-editor/table-editor-dialogs.tsx +32 -0
  1486. package/src/web/components/database/table-editor/table-editor-model.ts +252 -0
  1487. package/src/web/components/database/table-editor/table-editor.tsx +485 -0
  1488. package/src/web/components/database/table-editor/use-table-editor-tab.ts +145 -0
  1489. package/src/web/components/database/use-connections.ts +39 -85
  1490. package/src/web/components/database/use-database.ts +419 -214
  1491. package/src/web/components/database/use-db-read.ts +88 -0
  1492. package/src/web/components/database/use-db-tab.ts +68 -0
  1493. package/src/web/components/database/use-glide-cell-content.ts +81 -88
  1494. package/src/web/components/database/use-glide-columns.ts +16 -32
  1495. package/src/web/components/database/use-glide-grid-actions.ts +44 -99
  1496. package/src/web/components/database/use-glide-selection.ts +6 -18
  1497. package/src/web/components/design/design-skill-suggestion.tsx +46 -11
  1498. package/src/web/components/design/design-split-layout.tsx +106 -10
  1499. package/src/web/components/design/design-tab-context.ts +2 -0
  1500. package/src/web/components/design/design-tab.tsx +5 -1
  1501. package/src/web/components/design/design-toolbar.tsx +13 -2
  1502. package/src/web/components/design/use-design-layout.ts +7 -4
  1503. package/src/web/components/editor/code-editor.tsx +81 -47
  1504. package/src/web/components/editor/conflict-editor.tsx +4 -1
  1505. package/src/web/components/editor/diff-viewer.tsx +40 -4
  1506. package/src/web/components/editor/editor-fix-with-ai.tsx +111 -0
  1507. package/src/web/components/editor/editor-selection-context.tsx +70 -0
  1508. package/src/web/components/editor/html-preview.tsx +48 -9
  1509. package/src/web/components/editor/lsp-status.tsx +18 -4
  1510. package/src/web/components/editor/video-player/video-player-controls.tsx +19 -3
  1511. package/src/web/components/editor/video-player/video-player.tsx +67 -14
  1512. package/src/web/components/extensions/extension-webview.tsx +44 -9
  1513. package/src/web/components/extensions/webview-external-link.ts +29 -0
  1514. package/src/web/components/extensions/webview-file-icons.ts +87 -0
  1515. package/src/web/components/extensions/webview-theme.ts +12 -0
  1516. package/src/web/components/floating-window/close-window.ts +32 -0
  1517. package/src/web/components/floating-window/floating-window.tsx +65 -24
  1518. package/src/web/components/floating-window/open-tab-in-pip.ts +3 -0
  1519. package/src/web/components/floating-window/use-window-drag.ts +33 -7
  1520. package/src/web/components/floating-window/use-window-meta.ts +138 -0
  1521. package/src/web/components/floating-window/window-chrome-contract.ts +19 -2
  1522. package/src/web/components/floating-window/window-content-registry.ts +2 -0
  1523. package/src/web/components/floating-window/window-dock-layout.ts +72 -0
  1524. package/src/web/components/floating-window/window-dock-list.tsx +156 -0
  1525. package/src/web/components/floating-window/window-dock.tsx +192 -0
  1526. package/src/web/components/floating-window/window-geometry.ts +42 -4
  1527. package/src/web/components/floating-window/window-layer.tsx +59 -23
  1528. package/src/web/components/floating-window/window-persistence.ts +16 -3
  1529. package/src/web/components/floating-window/window-store-types.ts +14 -3
  1530. package/src/web/components/floating-window/window-store.ts +75 -8
  1531. package/src/web/components/floating-window/window-title-identity.tsx +86 -0
  1532. package/src/web/components/git/git-branch-row.tsx +138 -0
  1533. package/src/web/components/git/git-change-parts.tsx +142 -0
  1534. package/src/web/components/git/git-change-row.tsx +218 -0
  1535. package/src/web/components/git/git-change-tree.tsx +190 -0
  1536. package/src/web/components/git/git-commit-composer.tsx +126 -0
  1537. package/src/web/components/git/git-confirm.tsx +84 -0
  1538. package/src/web/components/git/git-operation-banner.tsx +48 -0
  1539. package/src/web/components/git/git-stash-section.tsx +128 -0
  1540. package/src/web/components/git/git-status-panel.tsx +588 -1043
  1541. package/src/web/components/git/git-worktree-panel.tsx +7 -7
  1542. package/src/web/components/git-review/git-review-block.tsx +356 -0
  1543. package/src/web/components/git-review/git-review-desktop.tsx +355 -0
  1544. package/src/web/components/git-review/git-review-parts.tsx +238 -0
  1545. package/src/web/components/git-review/git-review-phone.tsx +230 -0
  1546. package/src/web/components/git-review/git-review-tab.tsx +123 -0
  1547. package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +2 -2
  1548. package/src/web/components/layout/command-palette-db-commands.ts +56 -0
  1549. package/src/web/components/layout/command-palette.tsx +41 -16
  1550. package/src/web/components/layout/draggable-tab.tsx +7 -0
  1551. package/src/web/components/layout/mobile-drawer.tsx +27 -14
  1552. package/src/web/components/layout/mobile-nav.tsx +4 -3
  1553. package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +8 -1
  1554. package/src/web/components/layout/nav-section-rail.tsx +22 -6
  1555. package/src/web/components/layout/sidebar.tsx +2 -2
  1556. package/src/web/components/layout/status-bar.tsx +6 -0
  1557. package/src/web/components/layout/tab-bar.tsx +5 -8
  1558. package/src/web/components/layout/tab-close-confirm-dialog.tsx +62 -0
  1559. package/src/web/components/layout/tab-content.tsx +47 -7
  1560. package/src/web/components/layout/tab-pool.tsx +10 -2
  1561. package/src/web/components/layout/tab-pop-out-menu-item.tsx +2 -2
  1562. package/src/web/components/layout/upgrade-button.tsx +3 -2
  1563. package/src/web/components/logs/logs-actions.ts +84 -0
  1564. package/src/web/components/logs/logs-app.tsx +265 -0
  1565. package/src/web/components/logs/logs-client.ts +31 -0
  1566. package/src/web/components/logs/logs-issues-pane.tsx +214 -0
  1567. package/src/web/components/logs/logs-pane.tsx +683 -0
  1568. package/src/web/components/logs/logs-phone-pane.tsx +365 -0
  1569. package/src/web/components/logs/logs-report-pane.tsx +440 -0
  1570. package/src/web/components/logs/logs-report-store.ts +153 -0
  1571. package/src/web/components/logs/logs-state.ts +93 -0
  1572. package/src/web/components/logs/logs-tab.tsx +4 -0
  1573. package/src/web/components/logs/logs-ui.tsx +104 -0
  1574. package/src/web/components/logs/logs-window-content.tsx +13 -0
  1575. package/src/web/components/logs/logs.css +440 -0
  1576. package/src/web/components/logs/open-logs.ts +64 -0
  1577. package/src/web/components/logs/use-follow-list.ts +90 -0
  1578. package/src/web/components/logs/use-logs-badge.ts +57 -0
  1579. package/src/web/components/logs/use-logs-feed.ts +251 -0
  1580. package/src/web/components/logs/use-logs-issues.ts +61 -0
  1581. package/src/web/components/onboarding/onboarding-quick-orientation.tsx +4 -4
  1582. package/src/web/components/os-explorer/actions/explorer-actions-upload.ts +2 -1
  1583. package/src/web/components/os-explorer/skins/macos-window-chrome.tsx +17 -11
  1584. package/src/web/components/os-explorer/skins/windows-window-chrome.tsx +14 -5
  1585. package/src/web/components/os-explorer/views/inline-name-input.tsx +13 -4
  1586. package/src/web/components/remote-desktop/ffmpeg-install-button.tsx +59 -0
  1587. package/src/web/components/remote-desktop/remote-desktop-readiness-gate.tsx +2 -0
  1588. package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +1 -0
  1589. package/src/web/components/session-review/review-code.tsx +507 -0
  1590. package/src/web/components/session-review/review-desktop.tsx +256 -0
  1591. package/src/web/components/session-review/review-parts.tsx +267 -0
  1592. package/src/web/components/session-review/review-phone.tsx +206 -0
  1593. package/src/web/components/session-review/review-tokens.tsx +70 -0
  1594. package/src/web/components/session-review/review-view.tsx +158 -0
  1595. package/src/web/components/session-review/session-review-tab.tsx +71 -0
  1596. package/src/web/components/settings/ai-settings-section.tsx +20 -0
  1597. package/src/web/components/settings/database-drivers-section.tsx +251 -0
  1598. package/src/web/components/settings/design-settings-section.tsx +55 -3
  1599. package/src/web/components/settings/design-window-setting.tsx +28 -0
  1600. package/src/web/components/settings/language-servers-section.tsx +8 -2
  1601. package/src/web/components/settings/notifications-settings-section.tsx +463 -24
  1602. package/src/web/components/settings/ntfy-server-form.tsx +192 -0
  1603. package/src/web/components/settings/open-settings.ts +11 -9
  1604. package/src/web/components/settings/ppmbot-settings-section.tsx +6 -214
  1605. package/src/web/components/settings/ppmbot-telegram-section.tsx +139 -0
  1606. package/src/web/components/settings/remote-access/public-link-pane.tsx +282 -0
  1607. package/src/web/components/settings/remote-access/remote-access-settings-section.tsx +49 -0
  1608. package/src/web/components/settings/remote-access/remote-access-tab-store.ts +24 -0
  1609. package/src/web/components/settings/run-in-terminal-button.tsx +32 -0
  1610. package/src/web/components/settings/settings-body.tsx +14 -2
  1611. package/src/web/components/settings/settings-categories.ts +14 -1
  1612. package/src/web/components/settings/settings-rows.tsx +61 -0
  1613. package/src/web/components/settings/settings-section-content.tsx +2 -0
  1614. package/src/web/components/settings/tailscale/tailscale-settings-section.tsx +410 -0
  1615. package/src/web/components/settings/tailscale/tailscale-setup-steps.tsx +248 -0
  1616. package/src/web/components/settings/tailscale/tailscale-sign-in-dialog.tsx +98 -0
  1617. package/src/web/components/settings/tailscale/tailscale-ui.tsx +81 -0
  1618. package/src/web/components/settings/telegram-bot-token-field.tsx +129 -0
  1619. package/src/web/components/settings/telegram-connect.tsx +147 -0
  1620. package/src/web/components/settings/voice-settings-section.tsx +28 -3
  1621. package/src/web/components/sqlite/sqlite-viewer.tsx +92 -134
  1622. package/src/web/components/system/apps/app-rows.ts +19 -3
  1623. package/src/web/components/system/apps/apps-panel.tsx +3 -1
  1624. package/src/web/components/system/services/service-action-confirm.tsx +20 -1
  1625. package/src/web/components/system/services/service-details-sheet.tsx +14 -4
  1626. package/src/web/components/system/services/service-details-text.ts +5 -0
  1627. package/src/web/components/system/services/services-panel.tsx +7 -5
  1628. package/src/web/components/terminal/terminal-selection-chat.tsx +178 -0
  1629. package/src/web/components/terminal/terminal-tab.tsx +10 -6
  1630. package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +1 -20
  1631. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +1 -1
  1632. package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +2 -2
  1633. package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +1 -1
  1634. package/src/web/components/tunnels/open-port-forwarding.ts +17 -0
  1635. package/src/web/components/tunnels/port-forwarding-panel.tsx +370 -0
  1636. package/src/web/components/ui/adaptive-context-menu.tsx +32 -3
  1637. package/src/web/components/ui/sidebar-header.tsx +1 -1
  1638. package/src/web/components/web-preview/open-web-preview-tab.ts +14 -0
  1639. package/src/web/components/web-preview/web-preview-tab.tsx +92 -0
  1640. package/src/web/hooks/use-at-most-wide.ts +20 -0
  1641. package/src/web/hooks/use-chat.ts +214 -11
  1642. package/src/web/hooks/use-commit-draft.ts +59 -0
  1643. package/src/web/hooks/use-db-driver-installed.ts +16 -0
  1644. package/src/web/hooks/use-design-session-redirect.ts +3 -2
  1645. package/src/web/hooks/use-draft.ts +25 -15
  1646. package/src/web/hooks/use-extension-ws.ts +15 -1
  1647. package/src/web/hooks/use-git-changes.ts +114 -0
  1648. package/src/web/hooks/use-git-review.ts +617 -0
  1649. package/src/web/hooks/use-global-events.ts +5 -0
  1650. package/src/web/hooks/use-lsp.ts +4 -2
  1651. package/src/web/hooks/use-notification-clicks.ts +43 -0
  1652. package/src/web/hooks/use-session-file-changes.ts +100 -0
  1653. package/src/web/hooks/use-session-review.ts +554 -0
  1654. package/src/web/hooks/use-session-turns.ts +65 -0
  1655. package/src/web/hooks/use-terminal.ts +19 -5
  1656. package/src/web/hooks/use-turn-review.ts +204 -0
  1657. package/src/web/hooks/use-url-sync.ts +15 -12
  1658. package/src/web/lib/aggregate-turn-file-changes.ts +127 -35
  1659. package/src/web/lib/ai-tab-placement.ts +102 -0
  1660. package/src/web/lib/api-client.ts +113 -47
  1661. package/src/web/lib/api-settings.ts +1 -0
  1662. package/src/web/lib/api-tailscale.ts +12 -0
  1663. package/src/web/lib/api-tunnels.ts +13 -1
  1664. package/src/web/lib/chat-attempt-lifecycle.ts +3 -1
  1665. package/src/web/lib/code-fence.ts +7 -0
  1666. package/src/web/lib/db-drivers.ts +41 -0
  1667. package/src/web/lib/db-table-edit.ts +94 -0
  1668. package/src/web/lib/db-tabs.ts +273 -0
  1669. package/src/web/lib/design/api-design-settings.ts +11 -0
  1670. package/src/web/lib/design/design-layout-mode.ts +16 -1
  1671. package/src/web/lib/design/design-view-prefs.ts +20 -1
  1672. package/src/web/lib/design/open-design-tab.ts +54 -1
  1673. package/src/web/lib/file-icon-name.ts +6 -0
  1674. package/src/web/lib/file-icons.generated.ts +10 -1
  1675. package/src/web/lib/file-icons.tsx +34 -6
  1676. package/src/web/lib/git-changes-view.ts +292 -0
  1677. package/src/web/lib/git-file-tree.ts +8 -8
  1678. package/src/web/lib/git-review-model.ts +496 -0
  1679. package/src/web/lib/html-preview-loads.ts +87 -0
  1680. package/src/web/lib/icons.generated.tsx +41 -1
  1681. package/src/web/lib/logs/logs-report.ts +128 -0
  1682. package/src/web/lib/logs/logs-view-model.ts +201 -0
  1683. package/src/web/lib/lsp/lsp-client.ts +1 -1
  1684. package/src/web/lib/lsp/lsp-documents.ts +8 -0
  1685. package/src/web/lib/lsp/register-providers.ts +5 -1
  1686. package/src/web/lib/model-display-name.ts +16 -0
  1687. package/src/web/lib/monaco-lightbulb-gutter.ts +32 -0
  1688. package/src/web/lib/open-ai-tab.ts +160 -0
  1689. package/src/web/lib/open-git-review.ts +24 -0
  1690. package/src/web/lib/read-ndjson.ts +35 -0
  1691. package/src/web/lib/running-agent-rows.ts +66 -16
  1692. package/src/web/lib/send-to-chat.ts +55 -9
  1693. package/src/web/lib/session-file-changes-client.ts +148 -0
  1694. package/src/web/lib/session-file-changes.ts +69 -0
  1695. package/src/web/lib/session-review-model.ts +379 -0
  1696. package/src/web/lib/session-turns.ts +123 -0
  1697. package/src/web/lib/sidebar-tabs/tab-registry.ts +1 -1
  1698. package/src/web/lib/tab-tool-call.ts +69 -0
  1699. package/src/web/lib/tab-type-icons.ts +12 -3
  1700. package/src/web/lib/turn-review.ts +102 -0
  1701. package/src/web/lib/web-preview-url.ts +31 -0
  1702. package/src/web/lib/web-push-client.ts +91 -0
  1703. package/src/web/lib/web-push-support.ts +88 -0
  1704. package/src/web/stores/chat-jump-store.ts +31 -0
  1705. package/src/web/stores/commit-draft-store.ts +119 -0
  1706. package/src/web/stores/db-rows-status-store.ts +31 -0
  1707. package/src/web/stores/git-status-store.ts +21 -2
  1708. package/src/web/stores/panel-store.ts +47 -1
  1709. package/src/web/stores/panel-utils.ts +77 -11
  1710. package/src/web/stores/session-turns-store.ts +40 -0
  1711. package/src/web/stores/settings-store.ts +86 -42
  1712. package/src/web/stores/tab-close-confirm-store.ts +59 -0
  1713. package/src/web/stores/tab-store.ts +10 -2
  1714. package/src/web/stores/unsaved-grid-rows-store.ts +42 -0
  1715. package/src/web/stores/window-panel-actions.ts +21 -3
  1716. package/src/web/stores/window-panel-persistence.ts +25 -11
  1717. package/src/web/styles/file-icons.generated.css +6 -0
  1718. package/src/web/styles/globals.css +54 -0
  1719. package/src/web/sw-notification-click.ts +51 -0
  1720. package/src/web/sw.ts +35 -0
  1721. package/src/web/theme/adapters/shiki-adapter.ts +55 -1
  1722. package/templates/skill/SKILL.md.tmpl +4 -3
  1723. package/templates/skill/common-tasks.md +8 -4
  1724. package/vite.config.ts +3 -0
  1725. package/dist/web/assets/_basePickBy-BEVUuplK.js +0 -1
  1726. package/dist/web/assets/_basePickBy-BEVUuplK.js.br +0 -0
  1727. package/dist/web/assets/_basePickBy-BEVUuplK.js.gz +0 -0
  1728. package/dist/web/assets/_baseUniq-qb_BgEfK.js +0 -1
  1729. package/dist/web/assets/_baseUniq-qb_BgEfK.js.br +0 -0
  1730. package/dist/web/assets/_baseUniq-qb_BgEfK.js.gz +0 -0
  1731. package/dist/web/assets/accounts-settings-section-CGe5ikvs.js +0 -1
  1732. package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.br +0 -0
  1733. package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.gz +0 -0
  1734. package/dist/web/assets/agent-session-sheet-store-_OeezCXB.js +0 -1
  1735. package/dist/web/assets/agent-session-sheet-vBhfHYrC.js +0 -2
  1736. package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.br +0 -0
  1737. package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.gz +0 -0
  1738. package/dist/web/assets/agent-session-window-content-BxIxDN5i.js +0 -1
  1739. package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.br +0 -0
  1740. package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.gz +0 -0
  1741. package/dist/web/assets/ai-resource-editor-Y8clBPRv.js +0 -1
  1742. package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.br +0 -0
  1743. package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.gz +0 -0
  1744. package/dist/web/assets/ai-settings-section-BB8vscte.js +0 -1
  1745. package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js +0 -1
  1746. package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.br +0 -0
  1747. package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.gz +0 -0
  1748. package/dist/web/assets/android-tab-BIOUVVoW.js +0 -2
  1749. package/dist/web/assets/android-tab-BIOUVVoW.js.br +0 -0
  1750. package/dist/web/assets/android-tab-BIOUVVoW.js.gz +0 -0
  1751. package/dist/web/assets/angular-html-Djm1KT_p.js +0 -1
  1752. package/dist/web/assets/angular-html-Djm1KT_p.js.br +0 -0
  1753. package/dist/web/assets/angular-html-Djm1KT_p.js.gz +0 -0
  1754. package/dist/web/assets/angular-ts-D8ZYU4i0.js +0 -1
  1755. package/dist/web/assets/angular-ts-D8ZYU4i0.js.br +0 -0
  1756. package/dist/web/assets/angular-ts-D8ZYU4i0.js.gz +0 -0
  1757. package/dist/web/assets/api-client-CbrcysYC.js +0 -1
  1758. package/dist/web/assets/api-client-F5Zi1sR0.js +0 -1
  1759. package/dist/web/assets/api-client-F5Zi1sR0.js.br +0 -0
  1760. package/dist/web/assets/api-client-F5Zi1sR0.js.gz +0 -0
  1761. package/dist/web/assets/api-settings-Cc_CpfmC.js +0 -1
  1762. package/dist/web/assets/api-settings-Cc_CpfmC.js.br +0 -0
  1763. package/dist/web/assets/api-settings-Cc_CpfmC.js.gz +0 -0
  1764. package/dist/web/assets/api-settings-D1axn9vm.js +0 -1
  1765. package/dist/web/assets/api-themes-BtMBSjuM.js +0 -1
  1766. package/dist/web/assets/apl-Bxk9ez2r.js +0 -1
  1767. package/dist/web/assets/apl-Bxk9ez2r.js.br +0 -0
  1768. package/dist/web/assets/apl-Bxk9ez2r.js.gz +0 -0
  1769. package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js +0 -1
  1770. package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.br +0 -0
  1771. package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.gz +0 -0
  1772. package/dist/web/assets/apps-panel-DXHF0QEv.js +0 -1
  1773. package/dist/web/assets/apps-panel-DXHF0QEv.js.br +0 -0
  1774. package/dist/web/assets/apps-panel-DXHF0QEv.js.gz +0 -0
  1775. package/dist/web/assets/arc-CrBOnruw.js +0 -1
  1776. package/dist/web/assets/arc-CrBOnruw.js.br +0 -0
  1777. package/dist/web/assets/arc-CrBOnruw.js.gz +0 -0
  1778. package/dist/web/assets/architecture-PBZL5I3N-bv6Z6ZTl.js +0 -1
  1779. package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js +0 -36
  1780. package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.br +0 -0
  1781. package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.gz +0 -0
  1782. package/dist/web/assets/astro-CCE8GTuJ.js +0 -1
  1783. package/dist/web/assets/astro-CCE8GTuJ.js.br +0 -0
  1784. package/dist/web/assets/astro-CCE8GTuJ.js.gz +0 -0
  1785. package/dist/web/assets/audio-preview-DpjOKEm4.js +0 -1
  1786. package/dist/web/assets/audio-preview-DpjOKEm4.js.br +0 -0
  1787. package/dist/web/assets/audio-preview-DpjOKEm4.js.gz +0 -0
  1788. package/dist/web/assets/blade-pJLFJ0pe.js +0 -1
  1789. package/dist/web/assets/blade-pJLFJ0pe.js.br +0 -0
  1790. package/dist/web/assets/blade-pJLFJ0pe.js.gz +0 -0
  1791. package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js +0 -132
  1792. package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.br +0 -0
  1793. package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.gz +0 -0
  1794. package/dist/web/assets/branch-review-tab-4dgMNadQ.js +0 -1
  1795. package/dist/web/assets/branch-review-tab-4dgMNadQ.js.br +0 -0
  1796. package/dist/web/assets/branch-review-tab-4dgMNadQ.js.gz +0 -0
  1797. package/dist/web/assets/bsl-DJPQP6gj.js +0 -1
  1798. package/dist/web/assets/bsl-DJPQP6gj.js.br +0 -0
  1799. package/dist/web/assets/bsl-DJPQP6gj.js.gz +0 -0
  1800. package/dist/web/assets/button-DeAyLH9U.js +0 -1
  1801. package/dist/web/assets/button-DeAyLH9U.js.br +0 -0
  1802. package/dist/web/assets/button-DeAyLH9U.js.gz +0 -0
  1803. package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js +0 -10
  1804. package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.br +0 -0
  1805. package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.gz +0 -0
  1806. package/dist/web/assets/cairo-6pdze4qN.js +0 -1
  1807. package/dist/web/assets/cairo-6pdze4qN.js.br +0 -0
  1808. package/dist/web/assets/cairo-6pdze4qN.js.gz +0 -0
  1809. package/dist/web/assets/channel-C97aABFT.js +0 -1
  1810. package/dist/web/assets/chat-preparation-cache-BUCR58h4.js +0 -1
  1811. package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.br +0 -0
  1812. package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.gz +0 -0
  1813. package/dist/web/assets/chat-tab-Bbe_77oJ.js +0 -15
  1814. package/dist/web/assets/chat-tab-Bbe_77oJ.js.br +0 -0
  1815. package/dist/web/assets/chat-tab-Bbe_77oJ.js.gz +0 -0
  1816. package/dist/web/assets/chat-tab-D3i5O3dO.js +0 -1
  1817. package/dist/web/assets/chat-tab-D3i5O3dO.js.br +0 -0
  1818. package/dist/web/assets/chat-tab-D3i5O3dO.js.gz +0 -0
  1819. package/dist/web/assets/chunk-4BX2VUAB-Dd8hGWzs.js +0 -1
  1820. package/dist/web/assets/chunk-55IACEB6-BUOmRdCb.js +0 -1
  1821. package/dist/web/assets/chunk-7E7YKBS2-D5i9aZ57.js +0 -1
  1822. package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js +0 -80
  1823. package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.br +0 -0
  1824. package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.gz +0 -0
  1825. package/dist/web/assets/chunk-C72U2L5F-CEUvONYx.js +0 -1
  1826. package/dist/web/assets/chunk-EGIJ26TM-BG89sF-p.js +0 -1
  1827. package/dist/web/assets/chunk-FMBD7UC4-BDtpoO-Q.js +0 -15
  1828. package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js +0 -2
  1829. package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.br +0 -0
  1830. package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.gz +0 -0
  1831. package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js +0 -2
  1832. package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.br +0 -0
  1833. package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.gz +0 -0
  1834. package/dist/web/assets/chunk-HHEYEP7N-Cz5o2sXg.js +0 -1
  1835. package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js +0 -1
  1836. package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.br +0 -0
  1837. package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.gz +0 -0
  1838. package/dist/web/assets/chunk-KX2RTZJC-Dfwu46M7.js +0 -1
  1839. package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js +0 -53
  1840. package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.br +0 -0
  1841. package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.gz +0 -0
  1842. package/dist/web/assets/chunk-L3YUKLVL-DytBx0nd.js +0 -1
  1843. package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js +0 -1
  1844. package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.br +0 -0
  1845. package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.gz +0 -0
  1846. package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js +0 -220
  1847. package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.br +0 -0
  1848. package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.gz +0 -0
  1849. package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js +0 -7
  1850. package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.br +0 -0
  1851. package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.gz +0 -0
  1852. package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js +0 -1
  1853. package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.br +0 -0
  1854. package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.gz +0 -0
  1855. package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js +0 -1
  1856. package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.br +0 -0
  1857. package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.gz +0 -0
  1858. package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js +0 -11
  1859. package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.br +0 -0
  1860. package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.gz +0 -0
  1861. package/dist/web/assets/chunk-QZHKN3VN-_jIwYKZ3.js +0 -1
  1862. package/dist/web/assets/chunk-R5LLSJPH-CZY_f--s.js +0 -1
  1863. package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js +0 -189
  1864. package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.br +0 -0
  1865. package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.gz +0 -0
  1866. package/dist/web/assets/chunk-XIRO2GV7-BxPFOPRI.js +0 -1
  1867. package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js +0 -32
  1868. package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.br +0 -0
  1869. package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.gz +0 -0
  1870. package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js +0 -94
  1871. package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.br +0 -0
  1872. package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.gz +0 -0
  1873. package/dist/web/assets/chunk-YBOYWFTD-0Is1vHmh.js +0 -1
  1874. package/dist/web/assets/classDiagram-VBA2DB6C-HwLNQY_4.js +0 -1
  1875. package/dist/web/assets/classDiagram-v2-RAHNMMFH-CLUQCcjH.js +0 -1
  1876. package/dist/web/assets/clone-B5kRZECd.js +0 -1
  1877. package/dist/web/assets/cobol-6JrtZ3xT.js +0 -1
  1878. package/dist/web/assets/cobol-6JrtZ3xT.js.br +0 -0
  1879. package/dist/web/assets/cobol-6JrtZ3xT.js.gz +0 -0
  1880. package/dist/web/assets/code-editor-DXsIWoQ1.js +0 -7
  1881. package/dist/web/assets/code-editor-DXsIWoQ1.js.br +0 -0
  1882. package/dist/web/assets/code-editor-DXsIWoQ1.js.gz +0 -0
  1883. package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js +0 -1
  1884. package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.br +0 -0
  1885. package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.gz +0 -0
  1886. package/dist/web/assets/coffee-eR0Qd-vR.js +0 -1
  1887. package/dist/web/assets/coffee-eR0Qd-vR.js.br +0 -0
  1888. package/dist/web/assets/coffee-eR0Qd-vR.js.gz +0 -0
  1889. package/dist/web/assets/conflict-editor-D_RImo_V.js +0 -19
  1890. package/dist/web/assets/conflict-editor-D_RImo_V.js.br +0 -0
  1891. package/dist/web/assets/conflict-editor-D_RImo_V.js.gz +0 -0
  1892. package/dist/web/assets/context-menu-7OX80HDB.js +0 -1
  1893. package/dist/web/assets/context-menu-7OX80HDB.js.br +0 -0
  1894. package/dist/web/assets/context-menu-7OX80HDB.js.gz +0 -0
  1895. package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js +0 -1
  1896. package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.br +0 -0
  1897. package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.gz +0 -0
  1898. package/dist/web/assets/cpp-Bp_Laxmd.js +0 -1
  1899. package/dist/web/assets/cpp-Bp_Laxmd.js.br +0 -0
  1900. package/dist/web/assets/cpp-Bp_Laxmd.js.gz +0 -0
  1901. package/dist/web/assets/crystal-bc0lS6i8.js +0 -1
  1902. package/dist/web/assets/crystal-bc0lS6i8.js.br +0 -0
  1903. package/dist/web/assets/crystal-bc0lS6i8.js.gz +0 -0
  1904. package/dist/web/assets/csv-parser-CoxPdyLw.js +0 -6
  1905. package/dist/web/assets/csv-parser-CoxPdyLw.js.br +0 -0
  1906. package/dist/web/assets/csv-parser-CoxPdyLw.js.gz +0 -0
  1907. package/dist/web/assets/csv-preview-BuFdfLo3.js +0 -2
  1908. package/dist/web/assets/csv-preview-BuFdfLo3.js.br +0 -0
  1909. package/dist/web/assets/csv-preview-BuFdfLo3.js.gz +0 -0
  1910. package/dist/web/assets/dagre-D__SE4Ki.js +0 -1
  1911. package/dist/web/assets/dagre-D__SE4Ki.js.br +0 -0
  1912. package/dist/web/assets/dagre-D__SE4Ki.js.gz +0 -0
  1913. package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js +0 -4
  1914. package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.br +0 -0
  1915. package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.gz +0 -0
  1916. package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js +0 -1
  1917. package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.br +0 -0
  1918. package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.gz +0 -0
  1919. package/dist/web/assets/data-grid-types-CHD9-pon.js +0 -1
  1920. package/dist/web/assets/data-grid-types-CHD9-pon.js.br +0 -0
  1921. package/dist/web/assets/data-grid-types-CHD9-pon.js.gz +0 -0
  1922. package/dist/web/assets/database-viewer-ChcbYn9E.js +0 -1
  1923. package/dist/web/assets/database-viewer-ChcbYn9E.js.br +0 -0
  1924. package/dist/web/assets/database-viewer-ChcbYn9E.js.gz +0 -0
  1925. package/dist/web/assets/design-export-client-BfdZB7xK.js +0 -1
  1926. package/dist/web/assets/design-export-client-BfdZB7xK.js.br +0 -0
  1927. package/dist/web/assets/design-export-client-BfdZB7xK.js.gz +0 -0
  1928. package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js +0 -1
  1929. package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.br +0 -0
  1930. package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.gz +0 -0
  1931. package/dist/web/assets/design-settings-section-B_xOf51h.js +0 -2
  1932. package/dist/web/assets/design-settings-section-B_xOf51h.js.br +0 -0
  1933. package/dist/web/assets/design-settings-section-B_xOf51h.js.gz +0 -0
  1934. package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js +0 -3
  1935. package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.br +0 -0
  1936. package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.gz +0 -0
  1937. package/dist/web/assets/design-tab-BQSYJ4cS.js +0 -57
  1938. package/dist/web/assets/design-tab-BQSYJ4cS.js.br +0 -0
  1939. package/dist/web/assets/design-tab-BQSYJ4cS.js.gz +0 -0
  1940. package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js +0 -1
  1941. package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.br +0 -0
  1942. package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.gz +0 -0
  1943. package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js +0 -24
  1944. package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.br +0 -0
  1945. package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.gz +0 -0
  1946. package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js +0 -43
  1947. package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.br +0 -0
  1948. package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.gz +0 -0
  1949. package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js +0 -24
  1950. package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.br +0 -0
  1951. package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.gz +0 -0
  1952. package/dist/web/assets/dialog-Bocc0Fgb.js +0 -1
  1953. package/dist/web/assets/dialog-Bocc0Fgb.js.br +0 -0
  1954. package/dist/web/assets/dialog-Bocc0Fgb.js.gz +0 -0
  1955. package/dist/web/assets/diff-viewer-BZ6glGK-.js +0 -4
  1956. package/dist/web/assets/diff-viewer-BZ6glGK-.js.br +0 -0
  1957. package/dist/web/assets/diff-viewer-BZ6glGK-.js.gz +0 -0
  1958. package/dist/web/assets/dist-CBtAY9iX.js +0 -1
  1959. package/dist/web/assets/dist-CBtAY9iX.js.br +0 -0
  1960. package/dist/web/assets/dist-CBtAY9iX.js.gz +0 -0
  1961. package/dist/web/assets/dist-CWwUZUqE.js +0 -11
  1962. package/dist/web/assets/dist-CWwUZUqE.js.br +0 -0
  1963. package/dist/web/assets/dist-CWwUZUqE.js.gz +0 -0
  1964. package/dist/web/assets/docx-preview-Dt6RQpfA.js +0 -12
  1965. package/dist/web/assets/docx-preview-Dt6RQpfA.js.br +0 -0
  1966. package/dist/web/assets/docx-preview-Dt6RQpfA.js.gz +0 -0
  1967. package/dist/web/assets/edge-BxayftlC.js +0 -1
  1968. package/dist/web/assets/edge-BxayftlC.js.br +0 -0
  1969. package/dist/web/assets/edge-BxayftlC.js.gz +0 -0
  1970. package/dist/web/assets/edit-diff-preview-D-FNLOU2.js +0 -7
  1971. package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.br +0 -0
  1972. package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.gz +0 -0
  1973. package/dist/web/assets/editor-language-service-4sbsdqBV.js +0 -1
  1974. package/dist/web/assets/editor-language-service-4sbsdqBV.js.br +0 -0
  1975. package/dist/web/assets/editor-language-service-4sbsdqBV.js.gz +0 -0
  1976. package/dist/web/assets/elixir-CncTBq2d.js +0 -1
  1977. package/dist/web/assets/elixir-CncTBq2d.js.br +0 -0
  1978. package/dist/web/assets/elixir-CncTBq2d.js.gz +0 -0
  1979. package/dist/web/assets/elm-1uJDe5N1.js +0 -1
  1980. package/dist/web/assets/elm-1uJDe5N1.js.br +0 -0
  1981. package/dist/web/assets/elm-1uJDe5N1.js.gz +0 -0
  1982. package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js +0 -70
  1983. package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.br +0 -0
  1984. package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.gz +0 -0
  1985. package/dist/web/assets/erb-dH8FUiNl.js +0 -1
  1986. package/dist/web/assets/erb-dH8FUiNl.js.br +0 -0
  1987. package/dist/web/assets/erb-dH8FUiNl.js.gz +0 -0
  1988. package/dist/web/assets/erlang-D0F-1O48.js +0 -1
  1989. package/dist/web/assets/erlang-D0F-1O48.js.br +0 -0
  1990. package/dist/web/assets/erlang-D0F-1O48.js.gz +0 -0
  1991. package/dist/web/assets/esm-C3TeLjGW.js +0 -2
  1992. package/dist/web/assets/esm-C3TeLjGW.js.br +0 -0
  1993. package/dist/web/assets/esm-C3TeLjGW.js.gz +0 -0
  1994. package/dist/web/assets/explorer-body-DbgrG1fe.js +0 -2
  1995. package/dist/web/assets/explorer-body-DbgrG1fe.js.br +0 -0
  1996. package/dist/web/assets/explorer-body-DbgrG1fe.js.gz +0 -0
  1997. package/dist/web/assets/explorer-window-content-BCjWvHpp.js +0 -1
  1998. package/dist/web/assets/explorer-window-content-BCjWvHpp.js.br +0 -0
  1999. package/dist/web/assets/explorer-window-content-BCjWvHpp.js.gz +0 -0
  2000. package/dist/web/assets/extension-manager-section-DiMF4RnT.js +0 -1
  2001. package/dist/web/assets/extension-manager-section-DiMF4RnT.js.br +0 -0
  2002. package/dist/web/assets/extension-manager-section-DiMF4RnT.js.gz +0 -0
  2003. package/dist/web/assets/extension-webview-Coti6Vfw.js +0 -12
  2004. package/dist/web/assets/extension-webview-Coti6Vfw.js.br +0 -0
  2005. package/dist/web/assets/extension-webview-Coti6Vfw.js.gz +0 -0
  2006. package/dist/web/assets/file-icons-CK0J4QSy.js +0 -1
  2007. package/dist/web/assets/file-icons-CK0J4QSy.js.br +0 -0
  2008. package/dist/web/assets/file-icons-CK0J4QSy.js.gz +0 -0
  2009. package/dist/web/assets/file-icons.generated-BtBErEwb.css +0 -1
  2010. package/dist/web/assets/file-icons.generated-BtBErEwb.css.br +0 -0
  2011. package/dist/web/assets/file-icons.generated-BtBErEwb.css.gz +0 -0
  2012. package/dist/web/assets/file-store-Cm7-pHux.js +0 -1
  2013. package/dist/web/assets/file-store-Cm7-pHux.js.br +0 -0
  2014. package/dist/web/assets/file-store-Cm7-pHux.js.gz +0 -0
  2015. package/dist/web/assets/files-settings-section-ZTVwOwx0.js +0 -1
  2016. package/dist/web/assets/files-settings-section-ZTVwOwx0.js.br +0 -0
  2017. package/dist/web/assets/files-settings-section-ZTVwOwx0.js.gz +0 -0
  2018. package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js +0 -162
  2019. package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.br +0 -0
  2020. package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.gz +0 -0
  2021. package/dist/web/assets/format-file-meta-Drxf2J-k.js +0 -1
  2022. package/dist/web/assets/format-file-meta-Drxf2J-k.js.br +0 -0
  2023. package/dist/web/assets/format-file-meta-Drxf2J-k.js.gz +0 -0
  2024. package/dist/web/assets/fortran-fixed-form-DB7wVefV.js +0 -1
  2025. package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.br +0 -0
  2026. package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.gz +0 -0
  2027. package/dist/web/assets/fs-api-IX9SHt5k.js +0 -1
  2028. package/dist/web/assets/fs-api-IX9SHt5k.js.br +0 -0
  2029. package/dist/web/assets/fs-api-IX9SHt5k.js.gz +0 -0
  2030. package/dist/web/assets/fsharp-B5-po_gS.js +0 -1
  2031. package/dist/web/assets/fsharp-B5-po_gS.js.br +0 -0
  2032. package/dist/web/assets/fsharp-B5-po_gS.js.gz +0 -0
  2033. package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js +0 -292
  2034. package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.br +0 -0
  2035. package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.gz +0 -0
  2036. package/dist/web/assets/gdresource-DkWx6_xT.js +0 -1
  2037. package/dist/web/assets/gdresource-DkWx6_xT.js.br +0 -0
  2038. package/dist/web/assets/gdresource-DkWx6_xT.js.gz +0 -0
  2039. package/dist/web/assets/general-settings-section-B7Hjx_fb.js +0 -1
  2040. package/dist/web/assets/general-settings-section-B7Hjx_fb.js.br +0 -0
  2041. package/dist/web/assets/general-settings-section-B7Hjx_fb.js.gz +0 -0
  2042. package/dist/web/assets/git-commit-XsMhdamD.js +0 -1
  2043. package/dist/web/assets/git-commit-XsMhdamD.js.br +0 -0
  2044. package/dist/web/assets/git-commit-XsMhdamD.js.gz +0 -0
  2045. package/dist/web/assets/git-log-panel-CbcJ_YEH.js +0 -1
  2046. package/dist/web/assets/git-log-panel-CbcJ_YEH.js.br +0 -0
  2047. package/dist/web/assets/git-log-panel-CbcJ_YEH.js.gz +0 -0
  2048. package/dist/web/assets/git-rebase-CXs4QunZ.js +0 -1
  2049. package/dist/web/assets/git-repo-store-B_u5RzIM.js +0 -1
  2050. package/dist/web/assets/git-repo-store-B_u5RzIM.js.br +0 -0
  2051. package/dist/web/assets/git-repo-store-B_u5RzIM.js.gz +0 -0
  2052. package/dist/web/assets/gitGraph-HDMCJU4V-COyQftEp.js +0 -1
  2053. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js +0 -65
  2054. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.br +0 -0
  2055. package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.gz +0 -0
  2056. package/dist/web/assets/glide-data-grid-BfByGSf1.js +0 -141
  2057. package/dist/web/assets/glide-data-grid-BfByGSf1.js.br +0 -0
  2058. package/dist/web/assets/glide-data-grid-BfByGSf1.js.gz +0 -0
  2059. package/dist/web/assets/glimmer-js-CHoxSy4K.js +0 -1
  2060. package/dist/web/assets/glimmer-js-CHoxSy4K.js.br +0 -0
  2061. package/dist/web/assets/glimmer-js-CHoxSy4K.js.gz +0 -0
  2062. package/dist/web/assets/glimmer-ts-DY0DCf-r.js +0 -1
  2063. package/dist/web/assets/glimmer-ts-DY0DCf-r.js.br +0 -0
  2064. package/dist/web/assets/glimmer-ts-DY0DCf-r.js.gz +0 -0
  2065. package/dist/web/assets/glsl-E9hxFBBJ.js +0 -1
  2066. package/dist/web/assets/glsl-E9hxFBBJ.js.br +0 -0
  2067. package/dist/web/assets/glsl-E9hxFBBJ.js.gz +0 -0
  2068. package/dist/web/assets/graphlib-eYluCODn.js +0 -1
  2069. package/dist/web/assets/graphlib-eYluCODn.js.br +0 -0
  2070. package/dist/web/assets/graphlib-eYluCODn.js.gz +0 -0
  2071. package/dist/web/assets/graphql-DAalq3Uo.js +0 -1
  2072. package/dist/web/assets/graphql-DAalq3Uo.js.br +0 -0
  2073. package/dist/web/assets/graphql-DAalq3Uo.js.gz +0 -0
  2074. package/dist/web/assets/group-chat-tab-DCo9OP3D.js +0 -1
  2075. package/dist/web/assets/group-chat-tab-DCo9OP3D.js.br +0 -0
  2076. package/dist/web/assets/group-chat-tab-DCo9OP3D.js.gz +0 -0
  2077. package/dist/web/assets/hack-e6ehmpqx.js +0 -1
  2078. package/dist/web/assets/hack-e6ehmpqx.js.br +0 -0
  2079. package/dist/web/assets/hack-e6ehmpqx.js.gz +0 -0
  2080. package/dist/web/assets/haml-Pr4yq62b.js +0 -1
  2081. package/dist/web/assets/haml-Pr4yq62b.js.br +0 -0
  2082. package/dist/web/assets/haml-Pr4yq62b.js.gz +0 -0
  2083. package/dist/web/assets/handlebars-ZERVZ8gn.js +0 -1
  2084. package/dist/web/assets/handlebars-ZERVZ8gn.js.br +0 -0
  2085. package/dist/web/assets/handlebars-ZERVZ8gn.js.gz +0 -0
  2086. package/dist/web/assets/html-BmwVFf5D.js +0 -1
  2087. package/dist/web/assets/html-BmwVFf5D.js.br +0 -0
  2088. package/dist/web/assets/html-BmwVFf5D.js.gz +0 -0
  2089. package/dist/web/assets/html-derivative-C1JIrmAY.js +0 -1
  2090. package/dist/web/assets/http-BI6PtTvX.js +0 -1
  2091. package/dist/web/assets/http-BI6PtTvX.js.br +0 -0
  2092. package/dist/web/assets/http-BI6PtTvX.js.gz +0 -0
  2093. package/dist/web/assets/hurl-CJGLGxAF.js +0 -1
  2094. package/dist/web/assets/hurl-CJGLGxAF.js.br +0 -0
  2095. package/dist/web/assets/hurl-CJGLGxAF.js.gz +0 -0
  2096. package/dist/web/assets/hxml-B6i0QuF9.js +0 -1
  2097. package/dist/web/assets/hxml-B6i0QuF9.js.br +0 -0
  2098. package/dist/web/assets/hxml-B6i0QuF9.js.gz +0 -0
  2099. package/dist/web/assets/icons-CO_II6D-.js +0 -1
  2100. package/dist/web/assets/icons-CO_II6D-.js.br +0 -0
  2101. package/dist/web/assets/icons-CO_II6D-.js.gz +0 -0
  2102. package/dist/web/assets/image-preview-Cjlps7Pt.js +0 -1
  2103. package/dist/web/assets/index-CyDLBddf.js +0 -52
  2104. package/dist/web/assets/index-CyDLBddf.js.br +0 -0
  2105. package/dist/web/assets/index-CyDLBddf.js.gz +0 -0
  2106. package/dist/web/assets/index-Dh5apC3I.css +0 -1
  2107. package/dist/web/assets/index-Dh5apC3I.css.br +0 -0
  2108. package/dist/web/assets/index-Dh5apC3I.css.gz +0 -0
  2109. package/dist/web/assets/info-3K5VOQVL-M5BVLjMe.js +0 -1
  2110. package/dist/web/assets/infoDiagram-LFFYTUFH-BpJuT5o9.js +0 -2
  2111. package/dist/web/assets/input-CG8PS8mS.js +0 -1
  2112. package/dist/web/assets/isEmpty-BjAN1oSC.js +0 -1
  2113. package/dist/web/assets/isEmpty-BjAN1oSC.js.br +0 -0
  2114. package/dist/web/assets/isEmpty-BjAN1oSC.js.gz +0 -0
  2115. package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js +0 -70
  2116. package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.br +0 -0
  2117. package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.gz +0 -0
  2118. package/dist/web/assets/jinja-CM-duDMo.js +0 -1
  2119. package/dist/web/assets/jinja-CM-duDMo.js.br +0 -0
  2120. package/dist/web/assets/jinja-CM-duDMo.js.gz +0 -0
  2121. package/dist/web/assets/jira-watcher-section-Dz_-sUC2.js +0 -1
  2122. package/dist/web/assets/jison-F9rAmqyI.js +0 -1
  2123. package/dist/web/assets/jison-F9rAmqyI.js.br +0 -0
  2124. package/dist/web/assets/jison-F9rAmqyI.js.gz +0 -0
  2125. package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js +0 -139
  2126. package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.br +0 -0
  2127. package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.gz +0 -0
  2128. package/dist/web/assets/julia-AVSSuAUz.js +0 -1
  2129. package/dist/web/assets/julia-AVSSuAUz.js.br +0 -0
  2130. package/dist/web/assets/julia-AVSSuAUz.js.gz +0 -0
  2131. package/dist/web/assets/just-Dw8IR-fy.js +0 -1
  2132. package/dist/web/assets/just-Dw8IR-fy.js.br +0 -0
  2133. package/dist/web/assets/just-Dw8IR-fy.js.gz +0 -0
  2134. package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js +0 -89
  2135. package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.br +0 -0
  2136. package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.gz +0 -0
  2137. package/dist/web/assets/keybindings-store-BTq5Z7XP.js +0 -1
  2138. package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js +0 -1
  2139. package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.br +0 -0
  2140. package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.gz +0 -0
  2141. package/dist/web/assets/language-servers-section-DJJ7SFXo.js +0 -2
  2142. package/dist/web/assets/language-servers-section-DJJ7SFXo.js.br +0 -0
  2143. package/dist/web/assets/language-servers-section-DJJ7SFXo.js.gz +0 -0
  2144. package/dist/web/assets/latex-37_9fLdz.js +0 -1
  2145. package/dist/web/assets/latex-37_9fLdz.js.br +0 -0
  2146. package/dist/web/assets/latex-37_9fLdz.js.gz +0 -0
  2147. package/dist/web/assets/lib-6APiJkU3.js +0 -4
  2148. package/dist/web/assets/lib-6APiJkU3.js.br +0 -0
  2149. package/dist/web/assets/lib-6APiJkU3.js.gz +0 -0
  2150. package/dist/web/assets/line-CYtSrseF.js +0 -1
  2151. package/dist/web/assets/linear-DyCrWAir.js +0 -1
  2152. package/dist/web/assets/linear-DyCrWAir.js.br +0 -0
  2153. package/dist/web/assets/linear-DyCrWAir.js.gz +0 -0
  2154. package/dist/web/assets/liquid-CaR1gaJt.js +0 -1
  2155. package/dist/web/assets/liquid-CaR1gaJt.js.br +0 -0
  2156. package/dist/web/assets/liquid-CaR1gaJt.js.gz +0 -0
  2157. package/dist/web/assets/lsp-client-Dr3vQ1bb.js +0 -1
  2158. package/dist/web/assets/lsp-client-Dr3vQ1bb.js.br +0 -0
  2159. package/dist/web/assets/lsp-client-Dr3vQ1bb.js.gz +0 -0
  2160. package/dist/web/assets/lua-IFhrYmKl.js +0 -1
  2161. package/dist/web/assets/lua-IFhrYmKl.js.br +0 -0
  2162. package/dist/web/assets/lua-IFhrYmKl.js.gz +0 -0
  2163. package/dist/web/assets/markdown-renderer-CmnqFfTU.js +0 -5
  2164. package/dist/web/assets/markdown-renderer-CmnqFfTU.js.br +0 -0
  2165. package/dist/web/assets/markdown-renderer-CmnqFfTU.js.gz +0 -0
  2166. package/dist/web/assets/markdown-renderer-LJdVMbGl.js +0 -1
  2167. package/dist/web/assets/marko-2g0T6atb.js +0 -1
  2168. package/dist/web/assets/marko-2g0T6atb.js.br +0 -0
  2169. package/dist/web/assets/marko-2g0T6atb.js.gz +0 -0
  2170. package/dist/web/assets/mdc-Dku_3sTh.js +0 -1
  2171. package/dist/web/assets/mdc-Dku_3sTh.js.br +0 -0
  2172. package/dist/web/assets/mdc-Dku_3sTh.js.gz +0 -0
  2173. package/dist/web/assets/media-url-CrT-qulZ.js +0 -1
  2174. package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js +0 -4
  2175. package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.br +0 -0
  2176. package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.gz +0 -0
  2177. package/dist/web/assets/mermaid.core-D5SAzB7L.js +0 -11
  2178. package/dist/web/assets/mermaid.core-D5SAzB7L.js.br +0 -0
  2179. package/dist/web/assets/mermaid.core-D5SAzB7L.js.gz +0 -0
  2180. package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js +0 -68
  2181. package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.br +0 -0
  2182. package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.gz +0 -0
  2183. package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js +0 -1
  2184. package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.br +0 -0
  2185. package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.gz +0 -0
  2186. package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js +0 -1
  2187. package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.br +0 -0
  2188. package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.gz +0 -0
  2189. package/dist/web/assets/monaco-dotenv-language-DbSss7YR.js +0 -1
  2190. package/dist/web/assets/new-design-dialog-DI_hxvFV.js +0 -1
  2191. package/dist/web/assets/new-design-dialog-DI_hxvFV.js.br +0 -0
  2192. package/dist/web/assets/new-design-dialog-DI_hxvFV.js.gz +0 -0
  2193. package/dist/web/assets/nextflow-DwUrPV3b.js +0 -1
  2194. package/dist/web/assets/nextflow-DwUrPV3b.js.br +0 -0
  2195. package/dist/web/assets/nextflow-DwUrPV3b.js.gz +0 -0
  2196. package/dist/web/assets/nginx-D10J2vrQ.js +0 -1
  2197. package/dist/web/assets/nginx-D10J2vrQ.js.br +0 -0
  2198. package/dist/web/assets/nginx-D10J2vrQ.js.gz +0 -0
  2199. package/dist/web/assets/nim-BonDnBCZ.js +0 -1
  2200. package/dist/web/assets/nim-BonDnBCZ.js.br +0 -0
  2201. package/dist/web/assets/nim-BonDnBCZ.js.gz +0 -0
  2202. package/dist/web/assets/notification-store-9lBSplOV.js +0 -1
  2203. package/dist/web/assets/notifications-settings-section-0s-2OKRv.js +0 -1
  2204. package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.br +0 -0
  2205. package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.gz +0 -0
  2206. package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js +0 -9
  2207. package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.br +0 -0
  2208. package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.gz +0 -0
  2209. package/dist/web/assets/onboarding-entry-CGFdGLLP.js +0 -1
  2210. package/dist/web/assets/onboarding-entry-CGFdGLLP.js.br +0 -0
  2211. package/dist/web/assets/onboarding-entry-CGFdGLLP.js.gz +0 -0
  2212. package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js +0 -1
  2213. package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.br +0 -0
  2214. package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.gz +0 -0
  2215. package/dist/web/assets/ordinal-CEpaoDoJ.js +0 -1
  2216. package/dist/web/assets/ordinal-CEpaoDoJ.js.br +0 -0
  2217. package/dist/web/assets/ordinal-CEpaoDoJ.js.gz +0 -0
  2218. package/dist/web/assets/overview-panel-3htxfZS2.js +0 -1
  2219. package/dist/web/assets/overview-panel-3htxfZS2.js.br +0 -0
  2220. package/dist/web/assets/overview-panel-3htxfZS2.js.gz +0 -0
  2221. package/dist/web/assets/packet-RMMSAZCW-DCgVLum2.js +0 -1
  2222. package/dist/web/assets/panel-store-B6PoCwBA.js +0 -1
  2223. package/dist/web/assets/panel-store-B6PoCwBA.js.br +0 -0
  2224. package/dist/web/assets/panel-store-B6PoCwBA.js.gz +0 -0
  2225. package/dist/web/assets/pdf-preview-B8A4T-ES.js +0 -1
  2226. package/dist/web/assets/pdf-preview-B8A4T-ES.js.br +0 -0
  2227. package/dist/web/assets/pdf-preview-B8A4T-ES.js.gz +0 -0
  2228. package/dist/web/assets/performance-panel-V8gpnnf7.js +0 -3
  2229. package/dist/web/assets/performance-panel-V8gpnnf7.js.br +0 -0
  2230. package/dist/web/assets/performance-panel-V8gpnnf7.js.gz +0 -0
  2231. package/dist/web/assets/perl-DmdIiZTm.js +0 -1
  2232. package/dist/web/assets/perl-DmdIiZTm.js.br +0 -0
  2233. package/dist/web/assets/perl-DmdIiZTm.js.gz +0 -0
  2234. package/dist/web/assets/php-DXGvCIY0.js +0 -1
  2235. package/dist/web/assets/php-DXGvCIY0.js.br +0 -0
  2236. package/dist/web/assets/php-DXGvCIY0.js.gz +0 -0
  2237. package/dist/web/assets/pie-UPGHQEXC-pxihnmef.js +0 -1
  2238. package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js +0 -30
  2239. package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.br +0 -0
  2240. package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.gz +0 -0
  2241. package/dist/web/assets/postgres-viewer-sWS-ogTC.js +0 -3
  2242. package/dist/web/assets/postgres-viewer-sWS-ogTC.js.br +0 -0
  2243. package/dist/web/assets/postgres-viewer-sWS-ogTC.js.gz +0 -0
  2244. package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js +0 -1
  2245. package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.br +0 -0
  2246. package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.gz +0 -0
  2247. package/dist/web/assets/pptx-export-Ugjv0hso.js +0 -111
  2248. package/dist/web/assets/pptx-export-Ugjv0hso.js.br +0 -0
  2249. package/dist/web/assets/pptx-export-Ugjv0hso.js.gz +0 -0
  2250. package/dist/web/assets/problems-panel-Gcy79pSS.js +0 -1
  2251. package/dist/web/assets/problems-panel-Gcy79pSS.js.br +0 -0
  2252. package/dist/web/assets/problems-panel-Gcy79pSS.js.gz +0 -0
  2253. package/dist/web/assets/process-row-format-u6y7lOee.js +0 -1
  2254. package/dist/web/assets/process-table-BUTIp9Oy.js +0 -1
  2255. package/dist/web/assets/process-table-BUTIp9Oy.js.br +0 -0
  2256. package/dist/web/assets/process-table-BUTIp9Oy.js.gz +0 -0
  2257. package/dist/web/assets/project-store-CCimwgGF.js +0 -1
  2258. package/dist/web/assets/project-store-CCimwgGF.js.br +0 -0
  2259. package/dist/web/assets/project-store-CCimwgGF.js.gz +0 -0
  2260. package/dist/web/assets/proxy-settings-section-Buv_8y54.js +0 -1
  2261. package/dist/web/assets/proxy-settings-section-Buv_8y54.js.br +0 -0
  2262. package/dist/web/assets/proxy-settings-section-Buv_8y54.js.gz +0 -0
  2263. package/dist/web/assets/pug-BgMlgmpT.js +0 -1
  2264. package/dist/web/assets/pug-BgMlgmpT.js.br +0 -0
  2265. package/dist/web/assets/pug-BgMlgmpT.js.gz +0 -0
  2266. package/dist/web/assets/qml-DjqBS8bc.js +0 -1
  2267. package/dist/web/assets/qml-DjqBS8bc.js.br +0 -0
  2268. package/dist/web/assets/qml-DjqBS8bc.js.gz +0 -0
  2269. package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js +0 -7
  2270. package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.br +0 -0
  2271. package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.gz +0 -0
  2272. package/dist/web/assets/query-audit-section-N2DQtgJx.js +0 -1
  2273. package/dist/web/assets/query-audit-section-N2DQtgJx.js.br +0 -0
  2274. package/dist/web/assets/query-audit-section-N2DQtgJx.js.gz +0 -0
  2275. package/dist/web/assets/radar-KQ55EAFF-CeeNXQSm.js +0 -1
  2276. package/dist/web/assets/razor-CzV29vlj.js +0 -1
  2277. package/dist/web/assets/razor-CzV29vlj.js.br +0 -0
  2278. package/dist/web/assets/razor-CzV29vlj.js.gz +0 -0
  2279. package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js +0 -1
  2280. package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.br +0 -0
  2281. package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.gz +0 -0
  2282. package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js +0 -2
  2283. package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.br +0 -0
  2284. package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.gz +0 -0
  2285. package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js +0 -1
  2286. package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.br +0 -0
  2287. package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.gz +0 -0
  2288. package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js +0 -1
  2289. package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.br +0 -0
  2290. package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.gz +0 -0
  2291. package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js +0 -1
  2292. package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.br +0 -0
  2293. package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.gz +0 -0
  2294. package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js +0 -1
  2295. package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.br +0 -0
  2296. package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.gz +0 -0
  2297. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js +0 -73
  2298. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.br +0 -0
  2299. package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.gz +0 -0
  2300. package/dist/web/assets/rst-DffOOLD7.js +0 -1
  2301. package/dist/web/assets/rst-DffOOLD7.js.br +0 -0
  2302. package/dist/web/assets/rst-DffOOLD7.js.gz +0 -0
  2303. package/dist/web/assets/ruby-C5DczJCc.js +0 -1
  2304. package/dist/web/assets/ruby-C5DczJCc.js.br +0 -0
  2305. package/dist/web/assets/ruby-C5DczJCc.js.gz +0 -0
  2306. package/dist/web/assets/run-in-terminal-DCBNtYHQ.js +0 -1
  2307. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js +0 -10
  2308. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.br +0 -0
  2309. package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.gz +0 -0
  2310. package/dist/web/assets/sas-CoO1xLdH.js +0 -1
  2311. package/dist/web/assets/sas-CoO1xLdH.js.br +0 -0
  2312. package/dist/web/assets/sas-CoO1xLdH.js.gz +0 -0
  2313. package/dist/web/assets/schedules-settings-section-_cHX2qOa.js +0 -1
  2314. package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.br +0 -0
  2315. package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.gz +0 -0
  2316. package/dist/web/assets/scroll-area-sjOeAfoD.js +0 -1
  2317. package/dist/web/assets/scroll-area-sjOeAfoD.js.br +0 -0
  2318. package/dist/web/assets/scroll-area-sjOeAfoD.js.gz +0 -0
  2319. package/dist/web/assets/scss-d9PFDNvb.js +0 -1
  2320. package/dist/web/assets/scss-d9PFDNvb.js.br +0 -0
  2321. package/dist/web/assets/scss-d9PFDNvb.js.gz +0 -0
  2322. package/dist/web/assets/send-to-chat-dNqNV7Y4.js +0 -1
  2323. package/dist/web/assets/send-to-chat-dNqNV7Y4.js.br +0 -0
  2324. package/dist/web/assets/send-to-chat-dNqNV7Y4.js.gz +0 -0
  2325. package/dist/web/assets/separator-dHj3Km--.js +0 -1
  2326. package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js +0 -145
  2327. package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.br +0 -0
  2328. package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.gz +0 -0
  2329. package/dist/web/assets/services-panel-Dm54cnW3.js +0 -1
  2330. package/dist/web/assets/services-panel-Dm54cnW3.js.br +0 -0
  2331. package/dist/web/assets/services-panel-Dm54cnW3.js.gz +0 -0
  2332. package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js +0 -1
  2333. package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.br +0 -0
  2334. package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.gz +0 -0
  2335. package/dist/web/assets/settings-body-DRRQNaDA.js +0 -1
  2336. package/dist/web/assets/settings-body-DRRQNaDA.js.br +0 -0
  2337. package/dist/web/assets/settings-body-DRRQNaDA.js.gz +0 -0
  2338. package/dist/web/assets/settings-section-content-DRaHfvm8.js +0 -1
  2339. package/dist/web/assets/settings-section-content-U3mIx6hF.js +0 -2
  2340. package/dist/web/assets/settings-section-content-U3mIx6hF.js.br +0 -0
  2341. package/dist/web/assets/settings-section-content-U3mIx6hF.js.gz +0 -0
  2342. package/dist/web/assets/settings-store-Cyuo8ceh.js +0 -2
  2343. package/dist/web/assets/settings-store-Cyuo8ceh.js.br +0 -0
  2344. package/dist/web/assets/settings-store-Cyuo8ceh.js.gz +0 -0
  2345. package/dist/web/assets/settings-tab-CB_BhHTK.js +0 -1
  2346. package/dist/web/assets/settings-window-content-CgZIMNX8.js +0 -1
  2347. package/dist/web/assets/shaderlab-BkB57LhQ.js +0 -1
  2348. package/dist/web/assets/shaderlab-BkB57LhQ.js.br +0 -0
  2349. package/dist/web/assets/shaderlab-BkB57LhQ.js.gz +0 -0
  2350. package/dist/web/assets/shellsession-CTpUym8_.js +0 -1
  2351. package/dist/web/assets/slash-command-picker-CQlIqMW0.js +0 -1
  2352. package/dist/web/assets/slash-command-picker-CQlIqMW0.js.br +0 -0
  2353. package/dist/web/assets/slash-command-picker-CQlIqMW0.js.gz +0 -0
  2354. package/dist/web/assets/sortable-header-BOa8o7NJ.js +0 -1
  2355. package/dist/web/assets/sortable-header-BOa8o7NJ.js.br +0 -0
  2356. package/dist/web/assets/sortable-header-BOa8o7NJ.js.gz +0 -0
  2357. package/dist/web/assets/soy-CGmWpNZ2.js +0 -1
  2358. package/dist/web/assets/soy-CGmWpNZ2.js.br +0 -0
  2359. package/dist/web/assets/soy-CGmWpNZ2.js.gz +0 -0
  2360. package/dist/web/assets/sparql-DtdOj_MX.js +0 -1
  2361. package/dist/web/assets/sparql-DtdOj_MX.js.br +0 -0
  2362. package/dist/web/assets/sparql-DtdOj_MX.js.gz +0 -0
  2363. package/dist/web/assets/sql-query-editor--Z4bcqd8.js +0 -1
  2364. package/dist/web/assets/sql-query-editor--Z4bcqd8.js.br +0 -0
  2365. package/dist/web/assets/sql-query-editor--Z4bcqd8.js.gz +0 -0
  2366. package/dist/web/assets/sqlite-viewer-CSmX3qaj.js +0 -1
  2367. package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.br +0 -0
  2368. package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.gz +0 -0
  2369. package/dist/web/assets/stata-6W_BX14b.js +0 -1
  2370. package/dist/web/assets/stata-6W_BX14b.js.br +0 -0
  2371. package/dist/web/assets/stata-6W_BX14b.js.gz +0 -0
  2372. package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js +0 -1
  2373. package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.br +0 -0
  2374. package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.gz +0 -0
  2375. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-DH7CpDey.js +0 -1
  2376. package/dist/web/assets/surrealql-BhmbH4Yk.js +0 -1
  2377. package/dist/web/assets/surrealql-BhmbH4Yk.js.br +0 -0
  2378. package/dist/web/assets/surrealql-BhmbH4Yk.js.gz +0 -0
  2379. package/dist/web/assets/svelte-D6EOFdO-.js +0 -1
  2380. package/dist/web/assets/svelte-D6EOFdO-.js.br +0 -0
  2381. package/dist/web/assets/svelte-D6EOFdO-.js.gz +0 -0
  2382. package/dist/web/assets/system-monitor-body-LannpU6H.js +0 -2
  2383. package/dist/web/assets/system-monitor-body-LannpU6H.js.br +0 -0
  2384. package/dist/web/assets/system-monitor-body-LannpU6H.js.gz +0 -0
  2385. package/dist/web/assets/system-monitor-tab-BfVucwEF.js +0 -1
  2386. package/dist/web/assets/system-monitor-window-content-kLNW9Ln3.js +0 -1
  2387. package/dist/web/assets/tab-host-window-content-II_FtOYM.js +0 -1
  2388. package/dist/web/assets/tab-host-window-content-II_FtOYM.js.br +0 -0
  2389. package/dist/web/assets/tab-host-window-content-II_FtOYM.js.gz +0 -0
  2390. package/dist/web/assets/tab-store-DCpc0g0Q.js +0 -1
  2391. package/dist/web/assets/templ-DuLJgZN8.js +0 -1
  2392. package/dist/web/assets/templ-DuLJgZN8.js.br +0 -0
  2393. package/dist/web/assets/templ-DuLJgZN8.js.gz +0 -0
  2394. package/dist/web/assets/terminal-tab-CTe2polt.js +0 -3
  2395. package/dist/web/assets/terminal-tab-CTe2polt.js.br +0 -0
  2396. package/dist/web/assets/terminal-tab-CTe2polt.js.gz +0 -0
  2397. package/dist/web/assets/tex-D8IJD2J1.js +0 -1
  2398. package/dist/web/assets/tex-D8IJD2J1.js.br +0 -0
  2399. package/dist/web/assets/tex-D8IJD2J1.js.gz +0 -0
  2400. package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js +0 -61
  2401. package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.br +0 -0
  2402. package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.gz +0 -0
  2403. package/dist/web/assets/tool-cards-rxLXbBSm.js +0 -9
  2404. package/dist/web/assets/tool-cards-rxLXbBSm.js.br +0 -0
  2405. package/dist/web/assets/tool-cards-rxLXbBSm.js.gz +0 -0
  2406. package/dist/web/assets/treemap-KZPCXAKY-OVcqjFQG.js +0 -1
  2407. package/dist/web/assets/ts-tags-BxVcUOvj.js +0 -1
  2408. package/dist/web/assets/ts-tags-BxVcUOvj.js.br +0 -0
  2409. package/dist/web/assets/ts-tags-BxVcUOvj.js.gz +0 -0
  2410. package/dist/web/assets/twig-BT8vDHa2.js +0 -1
  2411. package/dist/web/assets/twig-BT8vDHa2.js.br +0 -0
  2412. package/dist/web/assets/twig-BT8vDHa2.js.gz +0 -0
  2413. package/dist/web/assets/use-blob-url-BC69n15x.js +0 -1
  2414. package/dist/web/assets/use-inline-blame-CxZ_QWzS.js +0 -16
  2415. package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.br +0 -0
  2416. package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.gz +0 -0
  2417. package/dist/web/assets/use-lsp-gCNE5A9K.js +0 -6
  2418. package/dist/web/assets/use-lsp-gCNE5A9K.js.br +0 -0
  2419. package/dist/web/assets/use-lsp-gCNE5A9K.js.gz +0 -0
  2420. package/dist/web/assets/use-monaco-theme-DvNGcCvz.js +0 -1
  2421. package/dist/web/assets/use-process-kill-Cbiu1mbY.js +0 -1
  2422. package/dist/web/assets/use-process-kill-Cbiu1mbY.js.br +0 -0
  2423. package/dist/web/assets/use-process-kill-Cbiu1mbY.js.gz +0 -0
  2424. package/dist/web/assets/use-websocket-AC7EG1LK.js +0 -1
  2425. package/dist/web/assets/vendor-ui-P9Ym7hCv.js +0 -45
  2426. package/dist/web/assets/vendor-ui-P9Ym7hCv.js.br +0 -0
  2427. package/dist/web/assets/vendor-ui-P9Ym7hCv.js.gz +0 -0
  2428. package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js +0 -34
  2429. package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.br +0 -0
  2430. package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.gz +0 -0
  2431. package/dist/web/assets/video-preview-C2Y61WUE.js +0 -1
  2432. package/dist/web/assets/video-preview-C2Y61WUE.js.br +0 -0
  2433. package/dist/web/assets/video-preview-C2Y61WUE.js.gz +0 -0
  2434. package/dist/web/assets/voice-settings-section-DCXZeLYI.js +0 -1
  2435. package/dist/web/assets/voice-settings-section-DCXZeLYI.js.br +0 -0
  2436. package/dist/web/assets/voice-settings-section-DCXZeLYI.js.gz +0 -0
  2437. package/dist/web/assets/vue-BcyG2SyR.js +0 -1
  2438. package/dist/web/assets/vue-BcyG2SyR.js.br +0 -0
  2439. package/dist/web/assets/vue-BcyG2SyR.js.gz +0 -0
  2440. package/dist/web/assets/vue-html-D8iVjZTe.js +0 -1
  2441. package/dist/web/assets/vue-html-D8iVjZTe.js.br +0 -0
  2442. package/dist/web/assets/vue-html-D8iVjZTe.js.gz +0 -0
  2443. package/dist/web/assets/vue-vine-DxBjHHk4.js +0 -1
  2444. package/dist/web/assets/vue-vine-DxBjHHk4.js.br +0 -0
  2445. package/dist/web/assets/vue-vine-DxBjHHk4.js.gz +0 -0
  2446. package/dist/web/assets/window-pip-registry-9Y9LQQYS.js +0 -1
  2447. package/dist/web/assets/window-store-vo1N70nK.js +0 -1
  2448. package/dist/web/assets/window-store-vo1N70nK.js.br +0 -0
  2449. package/dist/web/assets/window-store-vo1N70nK.js.gz +0 -0
  2450. package/dist/web/assets/ws-auth-Ytui7dXP.js +0 -1
  2451. package/dist/web/assets/xml-Zepcw_qF.js +0 -1
  2452. package/dist/web/assets/xml-Zepcw_qF.js.br +0 -0
  2453. package/dist/web/assets/xml-Zepcw_qF.js.gz +0 -0
  2454. package/dist/web/assets/xsl-_m-WMWv3.js +0 -1
  2455. package/dist/web/assets/xsl-_m-WMWv3.js.br +0 -0
  2456. package/dist/web/assets/xsl-_m-WMWv3.js.gz +0 -0
  2457. package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js +0 -7
  2458. package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.br +0 -0
  2459. package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.gz +0 -0
  2460. package/src/server/routes/fs-sqlite.ts +0 -129
  2461. package/src/server/routes/postgres.ts +0 -92
  2462. package/src/server/routes/sqlite.ts +0 -148
  2463. package/src/services/database/split-sql-statements.ts +0 -95
  2464. package/src/web/components/chat/change-edit-list.tsx +0 -50
  2465. package/src/web/components/database/connection-form-dialog.tsx +0 -252
  2466. package/src/web/components/database/connection-list.tsx +0 -192
  2467. package/src/web/components/database/connection-row.tsx +0 -104
  2468. package/src/web/components/database/database-viewer.tsx +0 -353
  2469. package/src/web/components/database/glide-column-search.tsx +0 -81
  2470. package/src/web/components/database/glide-data-preview-panel.tsx +0 -114
  2471. package/src/web/components/database/glide-grid-pagination.tsx +0 -34
  2472. package/src/web/components/database/glide-grid-toolbar.tsx +0 -105
  2473. package/src/web/components/database/resolve-preview-data.ts +0 -62
  2474. package/src/web/components/database/schema-table-tree.tsx +0 -98
  2475. package/src/web/components/database/split-sql-statements.ts +0 -116
  2476. package/src/web/components/database/use-db-tree-expansion.ts +0 -74
  2477. package/src/web/components/database/use-glide-pending-edits.ts +0 -72
  2478. package/src/web/components/database/use-glide-row-pinning.ts +0 -35
  2479. package/src/web/components/postgres/postgres-viewer.tsx +0 -283
  2480. package/src/web/components/postgres/use-postgres.ts +0 -161
  2481. package/src/web/components/shared/bug-report-popup.tsx +0 -59
  2482. package/src/web/components/sqlite/sqlite-data-grid.tsx +0 -213
  2483. package/src/web/components/sqlite/sqlite-query-editor.tsx +0 -10
  2484. package/src/web/components/sqlite/sqlite-table-list.tsx +0 -48
  2485. package/src/web/components/sqlite/use-sqlite.ts +0 -135
  2486. package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +0 -159
  2487. package/src/web/components/tunnels/public-tunnel-switch.tsx +0 -82
  2488. package/src/web/components/tunnels/tunnel-manager-tab.tsx +0 -207
  2489. package/src/web/lib/report-bug.ts +0 -79
  2490. /package/dist/web/assets/{__vite-browser-external-C5mXParC.js → __vite-browser-external-tODLo9mE.js} +0 -0
  2491. /package/dist/web/assets/{abap-Ds6L4g_T.js → abap-D-o-bvtI.js} +0 -0
  2492. /package/dist/web/assets/{abap-Ds6L4g_T.js.br → abap-D-o-bvtI.js.br} +0 -0
  2493. /package/dist/web/assets/{abap-Ds6L4g_T.js.gz → abap-D-o-bvtI.js.gz} +0 -0
  2494. /package/dist/web/assets/{actionscript-3-CLNiH4aj.js → actionscript-3-D2tIzAm8.js} +0 -0
  2495. /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.br → actionscript-3-D2tIzAm8.js.br} +0 -0
  2496. /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.gz → actionscript-3-D2tIzAm8.js.gz} +0 -0
  2497. /package/dist/web/assets/{ada-BoiebnO1.js → ada-DxatBcxS.js} +0 -0
  2498. /package/dist/web/assets/{ada-BoiebnO1.js.br → ada-DxatBcxS.js.br} +0 -0
  2499. /package/dist/web/assets/{ada-BoiebnO1.js.gz → ada-DxatBcxS.js.gz} +0 -0
  2500. /package/dist/web/assets/{andromeeda-CdMZLp1H.js → andromeeda-D0LK9YJ3.js} +0 -0
  2501. /package/dist/web/assets/{andromeeda-CdMZLp1H.js.br → andromeeda-D0LK9YJ3.js.br} +0 -0
  2502. /package/dist/web/assets/{andromeeda-CdMZLp1H.js.gz → andromeeda-D0LK9YJ3.js.gz} +0 -0
  2503. /package/dist/web/assets/{apache-BKOdPQIP.js → apache-B7uMPNiW.js} +0 -0
  2504. /package/dist/web/assets/{apache-BKOdPQIP.js.br → apache-B7uMPNiW.js.br} +0 -0
  2505. /package/dist/web/assets/{apache-BKOdPQIP.js.gz → apache-B7uMPNiW.js.gz} +0 -0
  2506. /package/dist/web/assets/{apex-kTmPDDVo.js → apex-B7GiXrAr.js} +0 -0
  2507. /package/dist/web/assets/{apex-kTmPDDVo.js.br → apex-B7GiXrAr.js.br} +0 -0
  2508. /package/dist/web/assets/{apex-kTmPDDVo.js.gz → apex-B7GiXrAr.js.gz} +0 -0
  2509. /package/dist/web/assets/{applescript-C65SMPLe.js → applescript-D_SIFkKe.js} +0 -0
  2510. /package/dist/web/assets/{applescript-C65SMPLe.js.br → applescript-D_SIFkKe.js.br} +0 -0
  2511. /package/dist/web/assets/{applescript-C65SMPLe.js.gz → applescript-D_SIFkKe.js.gz} +0 -0
  2512. /package/dist/web/assets/{apply-theme-Cc_cmrD5.js → apply-theme-ORrEdHKT.js} +0 -0
  2513. /package/dist/web/assets/{ara-BKT6no2T.js → ara-C3iECgdg.js} +0 -0
  2514. /package/dist/web/assets/{ara-BKT6no2T.js.br → ara-C3iECgdg.js.br} +0 -0
  2515. /package/dist/web/assets/{ara-BKT6no2T.js.gz → ara-C3iECgdg.js.gz} +0 -0
  2516. /package/dist/web/assets/{array-F4LNYbhF.js → array-Bn55RxR6.js} +0 -0
  2517. /package/dist/web/assets/{asciidoc-BGur0ue3.js → asciidoc-gc8z_MMY.js} +0 -0
  2518. /package/dist/web/assets/{asciidoc-BGur0ue3.js.br → asciidoc-gc8z_MMY.js.br} +0 -0
  2519. /package/dist/web/assets/{asciidoc-BGur0ue3.js.gz → asciidoc-gc8z_MMY.js.gz} +0 -0
  2520. /package/dist/web/assets/{asm-DOfgqCKD.js → asm-27qeoPOI.js} +0 -0
  2521. /package/dist/web/assets/{asm-DOfgqCKD.js.br → asm-27qeoPOI.js.br} +0 -0
  2522. /package/dist/web/assets/{asm-DOfgqCKD.js.gz → asm-27qeoPOI.js.gz} +0 -0
  2523. /package/dist/web/assets/{aurora-x-D64MWGxe.js → aurora-x-C5J9fWe1.js} +0 -0
  2524. /package/dist/web/assets/{aurora-x-D64MWGxe.js.br → aurora-x-C5J9fWe1.js.br} +0 -0
  2525. /package/dist/web/assets/{aurora-x-D64MWGxe.js.gz → aurora-x-C5J9fWe1.js.gz} +0 -0
  2526. /package/dist/web/assets/{awk-B_r8LcWp.js → awk-B7GBzF92.js} +0 -0
  2527. /package/dist/web/assets/{awk-B_r8LcWp.js.br → awk-B7GBzF92.js.br} +0 -0
  2528. /package/dist/web/assets/{awk-B_r8LcWp.js.gz → awk-B7GBzF92.js.gz} +0 -0
  2529. /package/dist/web/assets/{ayu-dark-DlDyr9-5.js → ayu-dark-XlnQhuLL.js} +0 -0
  2530. /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.br → ayu-dark-XlnQhuLL.js.br} +0 -0
  2531. /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.gz → ayu-dark-XlnQhuLL.js.gz} +0 -0
  2532. /package/dist/web/assets/{ayu-light-BF0a181n.js → ayu-light-DKLLilkU.js} +0 -0
  2533. /package/dist/web/assets/{ayu-light-BF0a181n.js.br → ayu-light-DKLLilkU.js.br} +0 -0
  2534. /package/dist/web/assets/{ayu-light-BF0a181n.js.gz → ayu-light-DKLLilkU.js.gz} +0 -0
  2535. /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js → ayu-mirage-Dv-XOprJ.js} +0 -0
  2536. /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.br → ayu-mirage-Dv-XOprJ.js.br} +0 -0
  2537. /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.gz → ayu-mirage-Dv-XOprJ.js.gz} +0 -0
  2538. /package/dist/web/assets/{ballerina-CyhD34qA.js → ballerina-DACRT-sT.js} +0 -0
  2539. /package/dist/web/assets/{ballerina-CyhD34qA.js.br → ballerina-DACRT-sT.js.br} +0 -0
  2540. /package/dist/web/assets/{ballerina-CyhD34qA.js.gz → ballerina-DACRT-sT.js.gz} +0 -0
  2541. /package/dist/web/assets/{bat-wHB_k1YG.js → bat-BlQCq2XE.js} +0 -0
  2542. /package/dist/web/assets/{bat-wHB_k1YG.js.br → bat-BlQCq2XE.js.br} +0 -0
  2543. /package/dist/web/assets/{bat-wHB_k1YG.js.gz → bat-BlQCq2XE.js.gz} +0 -0
  2544. /package/dist/web/assets/{beancount-SUF8MnzM.js → beancount-DYDztRI0.js} +0 -0
  2545. /package/dist/web/assets/{beancount-SUF8MnzM.js.br → beancount-DYDztRI0.js.br} +0 -0
  2546. /package/dist/web/assets/{beancount-SUF8MnzM.js.gz → beancount-DYDztRI0.js.gz} +0 -0
  2547. /package/dist/web/assets/{berry-BP_34_jr.js → berry-BE5YKqvx.js} +0 -0
  2548. /package/dist/web/assets/{berry-BP_34_jr.js.br → berry-BE5YKqvx.js.br} +0 -0
  2549. /package/dist/web/assets/{berry-BP_34_jr.js.gz → berry-BE5YKqvx.js.gz} +0 -0
  2550. /package/dist/web/assets/{bibtex-DKgKw2bN.js → bibtex-CAm7mgEm.js} +0 -0
  2551. /package/dist/web/assets/{bibtex-DKgKw2bN.js.br → bibtex-CAm7mgEm.js.br} +0 -0
  2552. /package/dist/web/assets/{bibtex-DKgKw2bN.js.gz → bibtex-CAm7mgEm.js.gz} +0 -0
  2553. /package/dist/web/assets/{bicep-BjU-KQeN.js → bicep-BKgAbfVa.js} +0 -0
  2554. /package/dist/web/assets/{bicep-BjU-KQeN.js.br → bicep-BKgAbfVa.js.br} +0 -0
  2555. /package/dist/web/assets/{bicep-BjU-KQeN.js.gz → bicep-BKgAbfVa.js.gz} +0 -0
  2556. /package/dist/web/assets/{bird2-CCFmrT2P.js → bird2-yrBNbW1G.js} +0 -0
  2557. /package/dist/web/assets/{bird2-CCFmrT2P.js.br → bird2-yrBNbW1G.js.br} +0 -0
  2558. /package/dist/web/assets/{bird2-CCFmrT2P.js.gz → bird2-yrBNbW1G.js.gz} +0 -0
  2559. /package/dist/web/assets/{c-BX-1170_.js → c-CD4cF1Lj.js} +0 -0
  2560. /package/dist/web/assets/{c-BX-1170_.js.br → c-CD4cF1Lj.js.br} +0 -0
  2561. /package/dist/web/assets/{c-BX-1170_.js.gz → c-CD4cF1Lj.js.gz} +0 -0
  2562. /package/dist/web/assets/{c3-DSc4IcLQ.js → c3-D_DrzBUd.js} +0 -0
  2563. /package/dist/web/assets/{c3-DSc4IcLQ.js.br → c3-D_DrzBUd.js.br} +0 -0
  2564. /package/dist/web/assets/{c3-DSc4IcLQ.js.gz → c3-D_DrzBUd.js.gz} +0 -0
  2565. /package/dist/web/assets/{cadence-CUaLlWyn.js → cadence-CUFCEgG9.js} +0 -0
  2566. /package/dist/web/assets/{cadence-CUaLlWyn.js.br → cadence-CUFCEgG9.js.br} +0 -0
  2567. /package/dist/web/assets/{cadence-CUaLlWyn.js.gz → cadence-CUFCEgG9.js.gz} +0 -0
  2568. /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js → can-open-in-ppm-7M6412iz.js} +0 -0
  2569. /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.br → can-open-in-ppm-7M6412iz.js.br} +0 -0
  2570. /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.gz → can-open-in-ppm-7M6412iz.js.gz} +0 -0
  2571. /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js → catppuccin-frappe-Dn32MuhA.js} +0 -0
  2572. /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.br → catppuccin-frappe-Dn32MuhA.js.br} +0 -0
  2573. /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.gz → catppuccin-frappe-Dn32MuhA.js.gz} +0 -0
  2574. /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js → catppuccin-latte-Dewo7yDf.js} +0 -0
  2575. /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.br → catppuccin-latte-Dewo7yDf.js.br} +0 -0
  2576. /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.gz → catppuccin-latte-Dewo7yDf.js.gz} +0 -0
  2577. /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js → catppuccin-macchiato-D8WOWZeo.js} +0 -0
  2578. /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.br → catppuccin-macchiato-D8WOWZeo.js.br} +0 -0
  2579. /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.gz → catppuccin-macchiato-D8WOWZeo.js.gz} +0 -0
  2580. /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js → catppuccin-mocha-b0md48XM.js} +0 -0
  2581. /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.br → catppuccin-mocha-b0md48XM.js.br} +0 -0
  2582. /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.gz → catppuccin-mocha-b0md48XM.js.gz} +0 -0
  2583. /package/dist/web/assets/{clarity-BijZXjQ6.js → clarity-Ct3UqLBj.js} +0 -0
  2584. /package/dist/web/assets/{clarity-BijZXjQ6.js.br → clarity-Ct3UqLBj.js.br} +0 -0
  2585. /package/dist/web/assets/{clarity-BijZXjQ6.js.gz → clarity-Ct3UqLBj.js.gz} +0 -0
  2586. /package/dist/web/assets/{clojure--ad2221W.js → clojure-CwP5aPEo.js} +0 -0
  2587. /package/dist/web/assets/{clojure--ad2221W.js.br → clojure-CwP5aPEo.js.br} +0 -0
  2588. /package/dist/web/assets/{clojure--ad2221W.js.gz → clojure-CwP5aPEo.js.gz} +0 -0
  2589. /package/dist/web/assets/{cmake-DyjUMpXU.js → cmake-D5RF49e5.js} +0 -0
  2590. /package/dist/web/assets/{cmake-DyjUMpXU.js.br → cmake-D5RF49e5.js.br} +0 -0
  2591. /package/dist/web/assets/{cmake-DyjUMpXU.js.gz → cmake-D5RF49e5.js.gz} +0 -0
  2592. /package/dist/web/assets/{codeowners-BeMhKnC9.js → codeowners-Cl5897L_.js} +0 -0
  2593. /package/dist/web/assets/{codeql-BGtwwp5_.js → codeql-BKh1RCg0.js} +0 -0
  2594. /package/dist/web/assets/{codeql-BGtwwp5_.js.br → codeql-BKh1RCg0.js.br} +0 -0
  2595. /package/dist/web/assets/{codeql-BGtwwp5_.js.gz → codeql-BKh1RCg0.js.gz} +0 -0
  2596. /package/dist/web/assets/{common-lisp--ldIKs5M.js → common-lisp-BhHuD6t0.js} +0 -0
  2597. /package/dist/web/assets/{common-lisp--ldIKs5M.js.br → common-lisp-BhHuD6t0.js.br} +0 -0
  2598. /package/dist/web/assets/{common-lisp--ldIKs5M.js.gz → common-lisp-BhHuD6t0.js.gz} +0 -0
  2599. /package/dist/web/assets/{coq-CRn01_Db.js → coq-Dco3qwD8.js} +0 -0
  2600. /package/dist/web/assets/{coq-CRn01_Db.js.br → coq-Dco3qwD8.js.br} +0 -0
  2601. /package/dist/web/assets/{coq-CRn01_Db.js.gz → coq-Dco3qwD8.js.gz} +0 -0
  2602. /package/dist/web/assets/{csharp-CuWM1IYq.js → csharp-Dpjw9ZA9.js} +0 -0
  2603. /package/dist/web/assets/{csharp-CuWM1IYq.js.br → csharp-Dpjw9ZA9.js.br} +0 -0
  2604. /package/dist/web/assets/{csharp-CuWM1IYq.js.gz → csharp-Dpjw9ZA9.js.gz} +0 -0
  2605. /package/dist/web/assets/{css-CQ_jz6Vl.js → css-CJ8lnCAk.js} +0 -0
  2606. /package/dist/web/assets/{css-CQ_jz6Vl.js.br → css-CJ8lnCAk.js.br} +0 -0
  2607. /package/dist/web/assets/{css-CQ_jz6Vl.js.gz → css-CJ8lnCAk.js.gz} +0 -0
  2608. /package/dist/web/assets/{csv-DP77pbR8.js → csv-BAcTN8Kt.js} +0 -0
  2609. /package/dist/web/assets/{csv-DP77pbR8.js.br → csv-BAcTN8Kt.js.br} +0 -0
  2610. /package/dist/web/assets/{csv-DP77pbR8.js.gz → csv-BAcTN8Kt.js.gz} +0 -0
  2611. /package/dist/web/assets/{cue-DScL5ELc.js → cue-Cr6y60TA.js} +0 -0
  2612. /package/dist/web/assets/{cue-DScL5ELc.js.br → cue-Cr6y60TA.js.br} +0 -0
  2613. /package/dist/web/assets/{cue-DScL5ELc.js.gz → cue-Cr6y60TA.js.gz} +0 -0
  2614. /package/dist/web/assets/{cypher-8ehI2vrw.js → cypher-DWtqXXFP.js} +0 -0
  2615. /package/dist/web/assets/{cypher-8ehI2vrw.js.br → cypher-DWtqXXFP.js.br} +0 -0
  2616. /package/dist/web/assets/{cypher-8ehI2vrw.js.gz → cypher-DWtqXXFP.js.gz} +0 -0
  2617. /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js → cytoscape.esm-C-5Awcry.js} +0 -0
  2618. /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.br → cytoscape.esm-C-5Awcry.js.br} +0 -0
  2619. /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.gz → cytoscape.esm-C-5Awcry.js.gz} +0 -0
  2620. /package/dist/web/assets/{d-BvFZUewv.js → d-BASiTZk4.js} +0 -0
  2621. /package/dist/web/assets/{d-BvFZUewv.js.br → d-BASiTZk4.js.br} +0 -0
  2622. /package/dist/web/assets/{d-BvFZUewv.js.gz → d-BASiTZk4.js.gz} +0 -0
  2623. /package/dist/web/assets/{dark-plus-DKLywSFP.js → dark-plus-56kmnrcl.js} +0 -0
  2624. /package/dist/web/assets/{dark-plus-DKLywSFP.js.br → dark-plus-56kmnrcl.js.br} +0 -0
  2625. /package/dist/web/assets/{dark-plus-DKLywSFP.js.gz → dark-plus-56kmnrcl.js.gz} +0 -0
  2626. /package/dist/web/assets/{dart-Cs_NJAZ7.js → dart-C5mZnjoE.js} +0 -0
  2627. /package/dist/web/assets/{dart-Cs_NJAZ7.js.br → dart-C5mZnjoE.js.br} +0 -0
  2628. /package/dist/web/assets/{dart-Cs_NJAZ7.js.gz → dart-C5mZnjoE.js.gz} +0 -0
  2629. /package/dist/web/assets/{dax-BB8KgXzI.js → dax-B4I2e7d8.js} +0 -0
  2630. /package/dist/web/assets/{dax-BB8KgXzI.js.br → dax-B4I2e7d8.js.br} +0 -0
  2631. /package/dist/web/assets/{dax-BB8KgXzI.js.gz → dax-B4I2e7d8.js.gz} +0 -0
  2632. /package/dist/web/assets/{defaultLocale-4xAk2LVU.js → defaultLocale-DNG1xVq7.js} +0 -0
  2633. /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.br → defaultLocale-DNG1xVq7.js.br} +0 -0
  2634. /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.gz → defaultLocale-DNG1xVq7.js.gz} +0 -0
  2635. /package/dist/web/assets/{design-system-status-label-ekiLyjKn.js → design-system-status-label-BRbs7m2y.js} +0 -0
  2636. /package/dist/web/assets/{desktop-Cs6Sk5Pu.js → desktop-DekGg0BT.js} +0 -0
  2637. /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.br → desktop-DekGg0BT.js.br} +0 -0
  2638. /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.gz → desktop-DekGg0BT.js.gz} +0 -0
  2639. /package/dist/web/assets/{diff-CXSq83h3.js → diff-CWnJBd73.js} +0 -0
  2640. /package/dist/web/assets/{diff-CXSq83h3.js.br → diff-CWnJBd73.js.br} +0 -0
  2641. /package/dist/web/assets/{diff-CXSq83h3.js.gz → diff-CWnJBd73.js.gz} +0 -0
  2642. /package/dist/web/assets/{dist-0EbiTA3n.js → dist-BSIakJVz.js} +0 -0
  2643. /package/dist/web/assets/{dist-0EbiTA3n.js.br → dist-BSIakJVz.js.br} +0 -0
  2644. /package/dist/web/assets/{dist-0EbiTA3n.js.gz → dist-BSIakJVz.js.gz} +0 -0
  2645. /package/dist/web/assets/{dist-D7mSb2HC.js → dist-BoIxGd-y.js} +0 -0
  2646. /package/dist/web/assets/{dist-D7mSb2HC.js.br → dist-BoIxGd-y.js.br} +0 -0
  2647. /package/dist/web/assets/{dist-D7mSb2HC.js.gz → dist-BoIxGd-y.js.gz} +0 -0
  2648. /package/dist/web/assets/{docker-BX5p1mZ3.js → docker-DevchDxK.js} +0 -0
  2649. /package/dist/web/assets/{docker-BX5p1mZ3.js.br → docker-DevchDxK.js.br} +0 -0
  2650. /package/dist/web/assets/{docker-BX5p1mZ3.js.gz → docker-DevchDxK.js.gz} +0 -0
  2651. /package/dist/web/assets/{dotenv-D8xdMiRo.js → dotenv-DCvtdaGJ.js} +0 -0
  2652. /package/dist/web/assets/{dotenv-D8xdMiRo.js.br → dotenv-DCvtdaGJ.js.br} +0 -0
  2653. /package/dist/web/assets/{dotenv-D8xdMiRo.js.gz → dotenv-DCvtdaGJ.js.gz} +0 -0
  2654. /package/dist/web/assets/{dracula-BNPKmiGE.js → dracula-8U6Vkk3l.js} +0 -0
  2655. /package/dist/web/assets/{dracula-BNPKmiGE.js.br → dracula-8U6Vkk3l.js.br} +0 -0
  2656. /package/dist/web/assets/{dracula-BNPKmiGE.js.gz → dracula-8U6Vkk3l.js.gz} +0 -0
  2657. /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js → dracula-soft-Bfeew5Wg.js} +0 -0
  2658. /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.br → dracula-soft-Bfeew5Wg.js.br} +0 -0
  2659. /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.gz → dracula-soft-Bfeew5Wg.js.gz} +0 -0
  2660. /package/dist/web/assets/{dream-maker-Yg8FPJu3.js → dream-maker-DDTJVuoy.js} +0 -0
  2661. /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.br → dream-maker-DDTJVuoy.js.br} +0 -0
  2662. /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.gz → dream-maker-DDTJVuoy.js.gz} +0 -0
  2663. /package/dist/web/assets/{editor-font-CBszn6vt.js → editor-font-HIW3wb51.js} +0 -0
  2664. /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js → emacs-lisp-CEHJqI4m.js} +0 -0
  2665. /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.br → emacs-lisp-CEHJqI4m.js.br} +0 -0
  2666. /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.gz → emacs-lisp-CEHJqI4m.js.gz} +0 -0
  2667. /package/dist/web/assets/{everforest-dark-7XTfQW4s.js → everforest-dark-CHHLt7cq.js} +0 -0
  2668. /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.br → everforest-dark-CHHLt7cq.js.br} +0 -0
  2669. /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.gz → everforest-dark-CHHLt7cq.js.gz} +0 -0
  2670. /package/dist/web/assets/{everforest-light-CmPZPQmV.js → everforest-light-TcTbK1sM.js} +0 -0
  2671. /package/dist/web/assets/{everforest-light-CmPZPQmV.js.br → everforest-light-TcTbK1sM.js.br} +0 -0
  2672. /package/dist/web/assets/{everforest-light-CmPZPQmV.js.gz → everforest-light-TcTbK1sM.js.gz} +0 -0
  2673. /package/dist/web/assets/{fennel-Dm71IPM6.js → fennel-Bh4vsA1A.js} +0 -0
  2674. /package/dist/web/assets/{fennel-Dm71IPM6.js.br → fennel-Bh4vsA1A.js.br} +0 -0
  2675. /package/dist/web/assets/{fennel-Dm71IPM6.js.gz → fennel-Bh4vsA1A.js.gz} +0 -0
  2676. /package/dist/web/assets/{fish-CIzcfZjZ.js → fish-D0T0fILG.js} +0 -0
  2677. /package/dist/web/assets/{fish-CIzcfZjZ.js.br → fish-D0T0fILG.js.br} +0 -0
  2678. /package/dist/web/assets/{fish-CIzcfZjZ.js.gz → fish-D0T0fILG.js.gz} +0 -0
  2679. /package/dist/web/assets/{fluent-DFSMEphj.js → fluent-CgXDXdyy.js} +0 -0
  2680. /package/dist/web/assets/{fluent-DFSMEphj.js.br → fluent-CgXDXdyy.js.br} +0 -0
  2681. /package/dist/web/assets/{fluent-DFSMEphj.js.gz → fluent-CgXDXdyy.js.gz} +0 -0
  2682. /package/dist/web/assets/{format-bytes-FQmpZ25A.js → format-bytes-DRt-NOUN.js} +0 -0
  2683. /package/dist/web/assets/{format-date-BMtvCeb9.js → format-date-CSHaU2wN.js} +0 -0
  2684. /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js → fortran-free-form-CUg3Xhz4.js} +0 -0
  2685. /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.br → fortran-free-form-CUg3Xhz4.js.br} +0 -0
  2686. /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.gz → fortran-free-form-CUg3Xhz4.js.gz} +0 -0
  2687. /package/dist/web/assets/{gdscript-DFnznHD1.js → gdscript-Cx056p_k.js} +0 -0
  2688. /package/dist/web/assets/{gdscript-DFnznHD1.js.br → gdscript-Cx056p_k.js.br} +0 -0
  2689. /package/dist/web/assets/{gdscript-DFnznHD1.js.gz → gdscript-Cx056p_k.js.gz} +0 -0
  2690. /package/dist/web/assets/{gdshader-B9wvgXVU.js → gdshader-Dj1qP4I5.js} +0 -0
  2691. /package/dist/web/assets/{gdshader-B9wvgXVU.js.br → gdshader-Dj1qP4I5.js.br} +0 -0
  2692. /package/dist/web/assets/{gdshader-B9wvgXVU.js.gz → gdshader-Dj1qP4I5.js.gz} +0 -0
  2693. /package/dist/web/assets/{genie-Bz0RXdFf.js → genie-SBt15wn7.js} +0 -0
  2694. /package/dist/web/assets/{genie-Bz0RXdFf.js.br → genie-SBt15wn7.js.br} +0 -0
  2695. /package/dist/web/assets/{genie-Bz0RXdFf.js.gz → genie-SBt15wn7.js.gz} +0 -0
  2696. /package/dist/web/assets/{gherkin-ZD8lWd_U.js → gherkin-bTJiHIrB.js} +0 -0
  2697. /package/dist/web/assets/{gherkin-ZD8lWd_U.js.br → gherkin-bTJiHIrB.js.br} +0 -0
  2698. /package/dist/web/assets/{gherkin-ZD8lWd_U.js.gz → gherkin-bTJiHIrB.js.gz} +0 -0
  2699. /package/dist/web/assets/{github-dark-D8IE4lln.js → github-dark-BOPhyugs.js} +0 -0
  2700. /package/dist/web/assets/{github-dark-D8IE4lln.js.br → github-dark-BOPhyugs.js.br} +0 -0
  2701. /package/dist/web/assets/{github-dark-D8IE4lln.js.gz → github-dark-BOPhyugs.js.gz} +0 -0
  2702. /package/dist/web/assets/{github-dark-default-Bv2-je5j.js → github-dark-default-Cktqe6NF.js} +0 -0
  2703. /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.br → github-dark-default-Cktqe6NF.js.br} +0 -0
  2704. /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.gz → github-dark-default-Cktqe6NF.js.gz} +0 -0
  2705. /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js → github-dark-dimmed-CeWfII_B.js} +0 -0
  2706. /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.br → github-dark-dimmed-CeWfII_B.js.br} +0 -0
  2707. /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.gz → github-dark-dimmed-CeWfII_B.js.gz} +0 -0
  2708. /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js → github-dark-high-contrast-CTx8LpdV.js} +0 -0
  2709. /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.br → github-dark-high-contrast-CTx8LpdV.js.br} +0 -0
  2710. /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.gz → github-dark-high-contrast-CTx8LpdV.js.gz} +0 -0
  2711. /package/dist/web/assets/{github-light-CVOMBMvb.js → github-light-DVsO5Un1.js} +0 -0
  2712. /package/dist/web/assets/{github-light-CVOMBMvb.js.br → github-light-DVsO5Un1.js.br} +0 -0
  2713. /package/dist/web/assets/{github-light-CVOMBMvb.js.gz → github-light-DVsO5Un1.js.gz} +0 -0
  2714. /package/dist/web/assets/{github-light-default-6Ayk6lJY.js → github-light-default-BiyPxicr.js} +0 -0
  2715. /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.br → github-light-default-BiyPxicr.js.br} +0 -0
  2716. /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.gz → github-light-default-BiyPxicr.js.gz} +0 -0
  2717. /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js → github-light-high-contrast-BPlnke0a.js} +0 -0
  2718. /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.br → github-light-high-contrast-BPlnke0a.js.br} +0 -0
  2719. /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.gz → github-light-high-contrast-BPlnke0a.js.gz} +0 -0
  2720. /package/dist/web/assets/{gleam-UeA7_OU8.js → gleam-CWSxvD0C.js} +0 -0
  2721. /package/dist/web/assets/{gleam-UeA7_OU8.js.br → gleam-CWSxvD0C.js.br} +0 -0
  2722. /package/dist/web/assets/{gleam-UeA7_OU8.js.gz → gleam-CWSxvD0C.js.gz} +0 -0
  2723. /package/dist/web/assets/{gn-DrdNDhFj.js → gn-D7NUVJuv.js} +0 -0
  2724. /package/dist/web/assets/{gn-DrdNDhFj.js.br → gn-D7NUVJuv.js.br} +0 -0
  2725. /package/dist/web/assets/{gn-DrdNDhFj.js.gz → gn-D7NUVJuv.js.gz} +0 -0
  2726. /package/dist/web/assets/{gnuplot-D8vxhaGw.js → gnuplot-c5uXmJKc.js} +0 -0
  2727. /package/dist/web/assets/{gnuplot-D8vxhaGw.js.br → gnuplot-c5uXmJKc.js.br} +0 -0
  2728. /package/dist/web/assets/{gnuplot-D8vxhaGw.js.gz → gnuplot-c5uXmJKc.js.gz} +0 -0
  2729. /package/dist/web/assets/{go-atNMhmH3.js → go-CRsHi4Cw.js} +0 -0
  2730. /package/dist/web/assets/{go-atNMhmH3.js.br → go-CRsHi4Cw.js.br} +0 -0
  2731. /package/dist/web/assets/{go-atNMhmH3.js.gz → go-CRsHi4Cw.js.gz} +0 -0
  2732. /package/dist/web/assets/{groovy-CLRzHDW2.js → groovy-DpV0RA5r.js} +0 -0
  2733. /package/dist/web/assets/{groovy-CLRzHDW2.js.br → groovy-DpV0RA5r.js.br} +0 -0
  2734. /package/dist/web/assets/{groovy-CLRzHDW2.js.gz → groovy-DpV0RA5r.js.gz} +0 -0
  2735. /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js → gruvbox-dark-hard-DD9fguUN.js} +0 -0
  2736. /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.br → gruvbox-dark-hard-DD9fguUN.js.br} +0 -0
  2737. /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.gz → gruvbox-dark-hard-DD9fguUN.js.gz} +0 -0
  2738. /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js → gruvbox-dark-medium-BvcwpYJ-.js} +0 -0
  2739. /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.br → gruvbox-dark-medium-BvcwpYJ-.js.br} +0 -0
  2740. /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.gz → gruvbox-dark-medium-BvcwpYJ-.js.gz} +0 -0
  2741. /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js → gruvbox-dark-soft-48dCxX9M.js} +0 -0
  2742. /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.br → gruvbox-dark-soft-48dCxX9M.js.br} +0 -0
  2743. /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.gz → gruvbox-dark-soft-48dCxX9M.js.gz} +0 -0
  2744. /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js → gruvbox-light-hard-CjJ994Ip.js} +0 -0
  2745. /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.br → gruvbox-light-hard-CjJ994Ip.js.br} +0 -0
  2746. /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.gz → gruvbox-light-hard-CjJ994Ip.js.gz} +0 -0
  2747. /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js → gruvbox-light-medium-DQJQZ_rV.js} +0 -0
  2748. /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.br → gruvbox-light-medium-DQJQZ_rV.js.br} +0 -0
  2749. /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.gz → gruvbox-light-medium-DQJQZ_rV.js.gz} +0 -0
  2750. /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js → gruvbox-light-soft-AqsC9mKw.js} +0 -0
  2751. /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.br → gruvbox-light-soft-AqsC9mKw.js.br} +0 -0
  2752. /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.gz → gruvbox-light-soft-AqsC9mKw.js.gz} +0 -0
  2753. /package/dist/web/assets/{haskell-CkgCblz9.js → haskell-B5V7yvmh.js} +0 -0
  2754. /package/dist/web/assets/{haskell-CkgCblz9.js.br → haskell-B5V7yvmh.js.br} +0 -0
  2755. /package/dist/web/assets/{haskell-CkgCblz9.js.gz → haskell-B5V7yvmh.js.gz} +0 -0
  2756. /package/dist/web/assets/{haxe-DwOdNXRl.js → haxe-LWTKfPKr.js} +0 -0
  2757. /package/dist/web/assets/{haxe-DwOdNXRl.js.br → haxe-LWTKfPKr.js.br} +0 -0
  2758. /package/dist/web/assets/{haxe-DwOdNXRl.js.gz → haxe-LWTKfPKr.js.gz} +0 -0
  2759. /package/dist/web/assets/{hcl-DXsxN8nX.js → hcl-QmNZdAtI.js} +0 -0
  2760. /package/dist/web/assets/{hcl-DXsxN8nX.js.br → hcl-QmNZdAtI.js.br} +0 -0
  2761. /package/dist/web/assets/{hcl-DXsxN8nX.js.gz → hcl-QmNZdAtI.js.gz} +0 -0
  2762. /package/dist/web/assets/{hjson-oBOZxrL4.js → hjson-CboJsAzK.js} +0 -0
  2763. /package/dist/web/assets/{hjson-oBOZxrL4.js.br → hjson-CboJsAzK.js.br} +0 -0
  2764. /package/dist/web/assets/{hjson-oBOZxrL4.js.gz → hjson-CboJsAzK.js.gz} +0 -0
  2765. /package/dist/web/assets/{hlsl-VEZxDU3L.js → hlsl-Bd-DO_WL.js} +0 -0
  2766. /package/dist/web/assets/{hlsl-VEZxDU3L.js.br → hlsl-Bd-DO_WL.js.br} +0 -0
  2767. /package/dist/web/assets/{hlsl-VEZxDU3L.js.gz → hlsl-Bd-DO_WL.js.gz} +0 -0
  2768. /package/dist/web/assets/{horizon-C_xHTsMO.js → horizon-CU8Bi_ss.js} +0 -0
  2769. /package/dist/web/assets/{horizon-C_xHTsMO.js.br → horizon-CU8Bi_ss.js.br} +0 -0
  2770. /package/dist/web/assets/{horizon-C_xHTsMO.js.gz → horizon-CU8Bi_ss.js.gz} +0 -0
  2771. /package/dist/web/assets/{horizon-bright-CJd-vMFG.js → horizon-bright-iSQ3_3jP.js} +0 -0
  2772. /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.br → horizon-bright-iSQ3_3jP.js.br} +0 -0
  2773. /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.gz → horizon-bright-iSQ3_3jP.js.gz} +0 -0
  2774. /package/dist/web/assets/{houston-BYOfZpV9.js → houston-CTXv3Puz.js} +0 -0
  2775. /package/dist/web/assets/{houston-BYOfZpV9.js.br → houston-CTXv3Puz.js.br} +0 -0
  2776. /package/dist/web/assets/{houston-BYOfZpV9.js.gz → houston-CTXv3Puz.js.gz} +0 -0
  2777. /package/dist/web/assets/{hy-DiruP4wR.js → hy-Cd4hTidD.js} +0 -0
  2778. /package/dist/web/assets/{hy-DiruP4wR.js.br → hy-Cd4hTidD.js.br} +0 -0
  2779. /package/dist/web/assets/{hy-DiruP4wR.js.gz → hy-Cd4hTidD.js.gz} +0 -0
  2780. /package/dist/web/assets/{image-gallery-B16hO6Ab.js → image-gallery-CIrjkWxw.js} +0 -0
  2781. /package/dist/web/assets/{image-preview-geometry-D4Ihz4UV.js → image-preview-geometry-DYxgeH3D.js} +0 -0
  2782. /package/dist/web/assets/{imba-BBm5cmpQ.js → imba-BipCHEY2.js} +0 -0
  2783. /package/dist/web/assets/{imba-BBm5cmpQ.js.br → imba-BipCHEY2.js.br} +0 -0
  2784. /package/dist/web/assets/{imba-BBm5cmpQ.js.gz → imba-BipCHEY2.js.gz} +0 -0
  2785. /package/dist/web/assets/{ini-DIjchSIH.js → ini-Dd1KkMrB.js} +0 -0
  2786. /package/dist/web/assets/{ini-DIjchSIH.js.br → ini-Dd1KkMrB.js.br} +0 -0
  2787. /package/dist/web/assets/{ini-DIjchSIH.js.gz → ini-Dd1KkMrB.js.gz} +0 -0
  2788. /package/dist/web/assets/{init-Cf64k-PQ.js → init-D-92dhHm.js} +0 -0
  2789. /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js → isArrayLikeObject-DwIR3mpY.js} +0 -0
  2790. /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.br → isArrayLikeObject-DwIR3mpY.js.br} +0 -0
  2791. /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.gz → isArrayLikeObject-DwIR3mpY.js.gz} +0 -0
  2792. /package/dist/web/assets/{java-BjdsRxXN.js → java-Dwvg585v.js} +0 -0
  2793. /package/dist/web/assets/{java-BjdsRxXN.js.br → java-Dwvg585v.js.br} +0 -0
  2794. /package/dist/web/assets/{java-BjdsRxXN.js.gz → java-Dwvg585v.js.gz} +0 -0
  2795. /package/dist/web/assets/{javascript-R2SZ_OEC.js → javascript-C5Y3hfxg.js} +0 -0
  2796. /package/dist/web/assets/{javascript-R2SZ_OEC.js.br → javascript-C5Y3hfxg.js.br} +0 -0
  2797. /package/dist/web/assets/{javascript-R2SZ_OEC.js.gz → javascript-C5Y3hfxg.js.gz} +0 -0
  2798. /package/dist/web/assets/{json-CYCJeTwK.js → json--kkpOdlG.js} +0 -0
  2799. /package/dist/web/assets/{json-CYCJeTwK.js.br → json--kkpOdlG.js.br} +0 -0
  2800. /package/dist/web/assets/{json-CYCJeTwK.js.gz → json--kkpOdlG.js.gz} +0 -0
  2801. /package/dist/web/assets/{json5-0Pz845K0.js → json5-mPOwTOsB.js} +0 -0
  2802. /package/dist/web/assets/{json5-0Pz845K0.js.br → json5-mPOwTOsB.js.br} +0 -0
  2803. /package/dist/web/assets/{json5-0Pz845K0.js.gz → json5-mPOwTOsB.js.gz} +0 -0
  2804. /package/dist/web/assets/{jsonc-B0jdT4uM.js → jsonc-Bie0E6D3.js} +0 -0
  2805. /package/dist/web/assets/{jsonc-B0jdT4uM.js.br → jsonc-Bie0E6D3.js.br} +0 -0
  2806. /package/dist/web/assets/{jsonc-B0jdT4uM.js.gz → jsonc-Bie0E6D3.js.gz} +0 -0
  2807. /package/dist/web/assets/{jsonl-CdvFKZtz.js → jsonl-CpqHmtC1.js} +0 -0
  2808. /package/dist/web/assets/{jsonl-CdvFKZtz.js.br → jsonl-CpqHmtC1.js.br} +0 -0
  2809. /package/dist/web/assets/{jsonl-CdvFKZtz.js.gz → jsonl-CpqHmtC1.js.gz} +0 -0
  2810. /package/dist/web/assets/{jsonnet-BYd5ZGqe.js → jsonnet-D21Ms51e.js} +0 -0
  2811. /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.br → jsonnet-D21Ms51e.js.br} +0 -0
  2812. /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.gz → jsonnet-D21Ms51e.js.gz} +0 -0
  2813. /package/dist/web/assets/{jssm-BlBU_IK1.js → jssm-BXnl1nur.js} +0 -0
  2814. /package/dist/web/assets/{jssm-BlBU_IK1.js.br → jssm-BXnl1nur.js.br} +0 -0
  2815. /package/dist/web/assets/{jssm-BlBU_IK1.js.gz → jssm-BXnl1nur.js.gz} +0 -0
  2816. /package/dist/web/assets/{jsx-CsWR7aMm.js → jsx-D4sv2qET.js} +0 -0
  2817. /package/dist/web/assets/{jsx-CsWR7aMm.js.br → jsx-D4sv2qET.js.br} +0 -0
  2818. /package/dist/web/assets/{jsx-CsWR7aMm.js.gz → jsx-D4sv2qET.js.gz} +0 -0
  2819. /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js → kanagawa-dragon-DhxR0UjL.js} +0 -0
  2820. /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.br → kanagawa-dragon-DhxR0UjL.js.br} +0 -0
  2821. /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.gz → kanagawa-dragon-DhxR0UjL.js.gz} +0 -0
  2822. /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js → kanagawa-lotus-fupRg5wp.js} +0 -0
  2823. /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.br → kanagawa-lotus-fupRg5wp.js.br} +0 -0
  2824. /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.gz → kanagawa-lotus-fupRg5wp.js.gz} +0 -0
  2825. /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js → kanagawa-wave-DSWbRS9M.js} +0 -0
  2826. /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.br → kanagawa-wave-DSWbRS9M.js.br} +0 -0
  2827. /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.gz → kanagawa-wave-DSWbRS9M.js.gz} +0 -0
  2828. /package/dist/web/assets/{katex-Cz0KLyXA.js → katex-CDEl5S5u.js} +0 -0
  2829. /package/dist/web/assets/{katex-Cz0KLyXA.js.br → katex-CDEl5S5u.js.br} +0 -0
  2830. /package/dist/web/assets/{katex-Cz0KLyXA.js.gz → katex-CDEl5S5u.js.gz} +0 -0
  2831. /package/dist/web/assets/{kdl-D712OVXR.js → kdl-DirGHqUy.js} +0 -0
  2832. /package/dist/web/assets/{kdl-D712OVXR.js.br → kdl-DirGHqUy.js.br} +0 -0
  2833. /package/dist/web/assets/{kdl-D712OVXR.js.gz → kdl-DirGHqUy.js.gz} +0 -0
  2834. /package/dist/web/assets/{kotlin-BEUa7XzN.js → kotlin-DkhUVMDC.js} +0 -0
  2835. /package/dist/web/assets/{kotlin-BEUa7XzN.js.br → kotlin-DkhUVMDC.js.br} +0 -0
  2836. /package/dist/web/assets/{kotlin-BEUa7XzN.js.gz → kotlin-DkhUVMDC.js.gz} +0 -0
  2837. /package/dist/web/assets/{kusto-n4J6aIey.js → kusto-DU7OpovF.js} +0 -0
  2838. /package/dist/web/assets/{kusto-n4J6aIey.js.br → kusto-DU7OpovF.js.br} +0 -0
  2839. /package/dist/web/assets/{kusto-n4J6aIey.js.gz → kusto-DU7OpovF.js.gz} +0 -0
  2840. /package/dist/web/assets/{laserwave-CddL9sH-.js → laserwave-iLKb1ZCT.js} +0 -0
  2841. /package/dist/web/assets/{laserwave-CddL9sH-.js.br → laserwave-iLKb1ZCT.js.br} +0 -0
  2842. /package/dist/web/assets/{laserwave-CddL9sH-.js.gz → laserwave-iLKb1ZCT.js.gz} +0 -0
  2843. /package/dist/web/assets/{lean-CS8dnaPi.js → lean-Cuvh_QAP.js} +0 -0
  2844. /package/dist/web/assets/{lean-CS8dnaPi.js.br → lean-Cuvh_QAP.js.br} +0 -0
  2845. /package/dist/web/assets/{lean-CS8dnaPi.js.gz → lean-Cuvh_QAP.js.gz} +0 -0
  2846. /package/dist/web/assets/{less-D7VWEXeK.js → less-B5tQZOdI.js} +0 -0
  2847. /package/dist/web/assets/{less-D7VWEXeK.js.br → less-B5tQZOdI.js.br} +0 -0
  2848. /package/dist/web/assets/{less-D7VWEXeK.js.gz → less-B5tQZOdI.js.gz} +0 -0
  2849. /package/dist/web/assets/{libesm-5wREk7JN.js → libesm-o0l6OH-c.js} +0 -0
  2850. /package/dist/web/assets/{libesm-5wREk7JN.js.br → libesm-o0l6OH-c.js.br} +0 -0
  2851. /package/dist/web/assets/{libesm-5wREk7JN.js.gz → libesm-o0l6OH-c.js.gz} +0 -0
  2852. /package/dist/web/assets/{light-plus-DUh-yC9k.js → light-plus-DiHU2KL5.js} +0 -0
  2853. /package/dist/web/assets/{light-plus-DUh-yC9k.js.br → light-plus-DiHU2KL5.js.br} +0 -0
  2854. /package/dist/web/assets/{light-plus-DUh-yC9k.js.gz → light-plus-DiHU2KL5.js.gz} +0 -0
  2855. /package/dist/web/assets/{llvm-P1D8XyMB.js → llvm-sCBTKCKN.js} +0 -0
  2856. /package/dist/web/assets/{llvm-P1D8XyMB.js.br → llvm-sCBTKCKN.js.br} +0 -0
  2857. /package/dist/web/assets/{llvm-P1D8XyMB.js.gz → llvm-sCBTKCKN.js.gz} +0 -0
  2858. /package/dist/web/assets/{log-BGft0RQz.js → log-DtyR34Ie.js} +0 -0
  2859. /package/dist/web/assets/{log-BGft0RQz.js.br → log-DtyR34Ie.js.br} +0 -0
  2860. /package/dist/web/assets/{log-BGft0RQz.js.gz → log-DtyR34Ie.js.gz} +0 -0
  2861. /package/dist/web/assets/{logo-uFZx2JEw.js → logo-CP91aQyG.js} +0 -0
  2862. /package/dist/web/assets/{logo-uFZx2JEw.js.br → logo-CP91aQyG.js.br} +0 -0
  2863. /package/dist/web/assets/{logo-uFZx2JEw.js.gz → logo-CP91aQyG.js.gz} +0 -0
  2864. /package/dist/web/assets/{luau-aDpnpIe3.js → luau-nfGo2ulP.js} +0 -0
  2865. /package/dist/web/assets/{luau-aDpnpIe3.js.br → luau-nfGo2ulP.js.br} +0 -0
  2866. /package/dist/web/assets/{luau-aDpnpIe3.js.gz → luau-nfGo2ulP.js.gz} +0 -0
  2867. /package/dist/web/assets/{make-DwjpJeU5.js → make-XbDn9GHe.js} +0 -0
  2868. /package/dist/web/assets/{make-DwjpJeU5.js.br → make-XbDn9GHe.js.br} +0 -0
  2869. /package/dist/web/assets/{make-DwjpJeU5.js.gz → make-XbDn9GHe.js.gz} +0 -0
  2870. /package/dist/web/assets/{markdown-DC-eWqXi.js → markdown-BB1_3xLr.js} +0 -0
  2871. /package/dist/web/assets/{markdown-DC-eWqXi.js.br → markdown-BB1_3xLr.js.br} +0 -0
  2872. /package/dist/web/assets/{markdown-DC-eWqXi.js.gz → markdown-BB1_3xLr.js.gz} +0 -0
  2873. /package/dist/web/assets/{marked.esm-DDb9MclE.js → marked.esm-CWfigb9x.js} +0 -0
  2874. /package/dist/web/assets/{marked.esm-DDb9MclE.js.br → marked.esm-CWfigb9x.js.br} +0 -0
  2875. /package/dist/web/assets/{marked.esm-DDb9MclE.js.gz → marked.esm-CWfigb9x.js.gz} +0 -0
  2876. /package/dist/web/assets/{material-theme-9BivM5cB.js → material-theme-CIx_sxAy.js} +0 -0
  2877. /package/dist/web/assets/{material-theme-9BivM5cB.js.br → material-theme-CIx_sxAy.js.br} +0 -0
  2878. /package/dist/web/assets/{material-theme-9BivM5cB.js.gz → material-theme-CIx_sxAy.js.gz} +0 -0
  2879. /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js → material-theme-darker-DsQeueDD.js} +0 -0
  2880. /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.br → material-theme-darker-DsQeueDD.js.br} +0 -0
  2881. /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.gz → material-theme-darker-DsQeueDD.js.gz} +0 -0
  2882. /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js → material-theme-lighter-x_lMi74j.js} +0 -0
  2883. /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.br → material-theme-lighter-x_lMi74j.js.br} +0 -0
  2884. /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.gz → material-theme-lighter-x_lMi74j.js.gz} +0 -0
  2885. /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js → material-theme-ocean-Bkgh25P8.js} +0 -0
  2886. /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.br → material-theme-ocean-Bkgh25P8.js.br} +0 -0
  2887. /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.gz → material-theme-ocean-Bkgh25P8.js.gz} +0 -0
  2888. /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js → material-theme-palenight-CoOjdbti.js} +0 -0
  2889. /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.br → material-theme-palenight-CoOjdbti.js.br} +0 -0
  2890. /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.gz → material-theme-palenight-CoOjdbti.js.gz} +0 -0
  2891. /package/dist/web/assets/{math-DAaFbMeh.js → math-CpYA_I4u.js} +0 -0
  2892. /package/dist/web/assets/{matlab-CqBfVqYF.js → matlab-D6xZas_8.js} +0 -0
  2893. /package/dist/web/assets/{matlab-CqBfVqYF.js.br → matlab-D6xZas_8.js.br} +0 -0
  2894. /package/dist/web/assets/{matlab-CqBfVqYF.js.gz → matlab-D6xZas_8.js.gz} +0 -0
  2895. /package/dist/web/assets/{mdx-CdC2mVzF.js → mdx-Cl5_YNoz.js} +0 -0
  2896. /package/dist/web/assets/{mdx-CdC2mVzF.js.br → mdx-Cl5_YNoz.js.br} +0 -0
  2897. /package/dist/web/assets/{mdx-CdC2mVzF.js.gz → mdx-Cl5_YNoz.js.gz} +0 -0
  2898. /package/dist/web/assets/{mermaid-B542RnGP.js → mermaid-8Eow4jz_.js} +0 -0
  2899. /package/dist/web/assets/{mermaid-B542RnGP.js.br → mermaid-8Eow4jz_.js.br} +0 -0
  2900. /package/dist/web/assets/{mermaid-B542RnGP.js.gz → mermaid-8Eow4jz_.js.gz} +0 -0
  2901. /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js → metric-chart-canvas-CigHBHid.js} +0 -0
  2902. /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.br → metric-chart-canvas-CigHBHid.js.br} +0 -0
  2903. /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.gz → metric-chart-canvas-CigHBHid.js.gz} +0 -0
  2904. /package/dist/web/assets/{min-dark-uGP-9UE_.js → min-dark-D4DhjgRE.js} +0 -0
  2905. /package/dist/web/assets/{min-dark-uGP-9UE_.js.br → min-dark-D4DhjgRE.js.br} +0 -0
  2906. /package/dist/web/assets/{min-dark-uGP-9UE_.js.gz → min-dark-D4DhjgRE.js.gz} +0 -0
  2907. /package/dist/web/assets/{min-light-BkFlXt3G.js → min-light-DzAckd0t.js} +0 -0
  2908. /package/dist/web/assets/{min-light-BkFlXt3G.js.br → min-light-DzAckd0t.js.br} +0 -0
  2909. /package/dist/web/assets/{min-light-BkFlXt3G.js.gz → min-light-DzAckd0t.js.gz} +0 -0
  2910. /package/dist/web/assets/{mipsasm-CkaxcMA-.js → mipsasm-zI_zu0tj.js} +0 -0
  2911. /package/dist/web/assets/{mipsasm-CkaxcMA-.js.br → mipsasm-zI_zu0tj.js.br} +0 -0
  2912. /package/dist/web/assets/{mipsasm-CkaxcMA-.js.gz → mipsasm-zI_zu0tj.js.gz} +0 -0
  2913. /package/dist/web/assets/{mojo-DDh7AQLv.js → mojo-DQnGGPHf.js} +0 -0
  2914. /package/dist/web/assets/{mojo-DDh7AQLv.js.br → mojo-DQnGGPHf.js.br} +0 -0
  2915. /package/dist/web/assets/{mojo-DDh7AQLv.js.gz → mojo-DQnGGPHf.js.gz} +0 -0
  2916. /package/dist/web/assets/{monokai-BA4dkSrE.js → monokai-CrFoD2VD.js} +0 -0
  2917. /package/dist/web/assets/{monokai-BA4dkSrE.js.br → monokai-CrFoD2VD.js.br} +0 -0
  2918. /package/dist/web/assets/{monokai-BA4dkSrE.js.gz → monokai-CrFoD2VD.js.gz} +0 -0
  2919. /package/dist/web/assets/{moonbit-DGxZDax4.js → moonbit-DdphIGs6.js} +0 -0
  2920. /package/dist/web/assets/{moonbit-DGxZDax4.js.br → moonbit-DdphIGs6.js.br} +0 -0
  2921. /package/dist/web/assets/{moonbit-DGxZDax4.js.gz → moonbit-DdphIGs6.js.gz} +0 -0
  2922. /package/dist/web/assets/{move-C1HZaVNc.js → move-BUlkn0xW.js} +0 -0
  2923. /package/dist/web/assets/{move-C1HZaVNc.js.br → move-BUlkn0xW.js.br} +0 -0
  2924. /package/dist/web/assets/{move-C1HZaVNc.js.gz → move-BUlkn0xW.js.gz} +0 -0
  2925. /package/dist/web/assets/{narrat-g4c9qhYS.js → narrat-CbOBdtCn.js} +0 -0
  2926. /package/dist/web/assets/{narrat-g4c9qhYS.js.br → narrat-CbOBdtCn.js.br} +0 -0
  2927. /package/dist/web/assets/{narrat-g4c9qhYS.js.gz → narrat-CbOBdtCn.js.gz} +0 -0
  2928. /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js → nextflow-groovy-CeVLUTuQ.js} +0 -0
  2929. /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.br → nextflow-groovy-CeVLUTuQ.js.br} +0 -0
  2930. /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.gz → nextflow-groovy-CeVLUTuQ.js.gz} +0 -0
  2931. /package/dist/web/assets/{night-owl-ds7NNgBg.js → night-owl-Bm4LhUR1.js} +0 -0
  2932. /package/dist/web/assets/{night-owl-ds7NNgBg.js.br → night-owl-Bm4LhUR1.js.br} +0 -0
  2933. /package/dist/web/assets/{night-owl-ds7NNgBg.js.gz → night-owl-Bm4LhUR1.js.gz} +0 -0
  2934. /package/dist/web/assets/{night-owl-light-DurCGAfC.js → night-owl-light-DtcBiMEf.js} +0 -0
  2935. /package/dist/web/assets/{night-owl-light-DurCGAfC.js.br → night-owl-light-DtcBiMEf.js.br} +0 -0
  2936. /package/dist/web/assets/{night-owl-light-DurCGAfC.js.gz → night-owl-light-DtcBiMEf.js.gz} +0 -0
  2937. /package/dist/web/assets/{nix-D7kCv9F9.js → nix-DrdwQ70g.js} +0 -0
  2938. /package/dist/web/assets/{nix-D7kCv9F9.js.br → nix-DrdwQ70g.js.br} +0 -0
  2939. /package/dist/web/assets/{nix-D7kCv9F9.js.gz → nix-DrdwQ70g.js.gz} +0 -0
  2940. /package/dist/web/assets/{nord-C-O3ceAv.js → nord-B0Head1v.js} +0 -0
  2941. /package/dist/web/assets/{nord-C-O3ceAv.js.br → nord-B0Head1v.js.br} +0 -0
  2942. /package/dist/web/assets/{nord-C-O3ceAv.js.gz → nord-B0Head1v.js.gz} +0 -0
  2943. /package/dist/web/assets/{nushell-oUYTGkzu.js → nushell-CmUdltKn.js} +0 -0
  2944. /package/dist/web/assets/{nushell-oUYTGkzu.js.br → nushell-CmUdltKn.js.br} +0 -0
  2945. /package/dist/web/assets/{nushell-oUYTGkzu.js.gz → nushell-CmUdltKn.js.gz} +0 -0
  2946. /package/dist/web/assets/{objective-c-CzqHoRSj.js → objective-c-BGDR33XN.js} +0 -0
  2947. /package/dist/web/assets/{objective-c-CzqHoRSj.js.br → objective-c-BGDR33XN.js.br} +0 -0
  2948. /package/dist/web/assets/{objective-c-CzqHoRSj.js.gz → objective-c-BGDR33XN.js.gz} +0 -0
  2949. /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js → objective-cpp-Buc1Zhd0.js} +0 -0
  2950. /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.br → objective-cpp-Buc1Zhd0.js.br} +0 -0
  2951. /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.gz → objective-cpp-Buc1Zhd0.js.gz} +0 -0
  2952. /package/dist/web/assets/{ocaml-B_nWFfqA.js → ocaml-xdzl9rRD.js} +0 -0
  2953. /package/dist/web/assets/{ocaml-B_nWFfqA.js.br → ocaml-xdzl9rRD.js.br} +0 -0
  2954. /package/dist/web/assets/{ocaml-B_nWFfqA.js.gz → ocaml-xdzl9rRD.js.gz} +0 -0
  2955. /package/dist/web/assets/{odin-BUQfWY13.js → odin-DiUFngnd.js} +0 -0
  2956. /package/dist/web/assets/{odin-BUQfWY13.js.br → odin-DiUFngnd.js.br} +0 -0
  2957. /package/dist/web/assets/{odin-BUQfWY13.js.gz → odin-DiUFngnd.js.gz} +0 -0
  2958. /package/dist/web/assets/{one-dark-pro-DJQor_US.js → one-dark-pro-BURxmIp3.js} +0 -0
  2959. /package/dist/web/assets/{one-dark-pro-DJQor_US.js.br → one-dark-pro-BURxmIp3.js.br} +0 -0
  2960. /package/dist/web/assets/{one-dark-pro-DJQor_US.js.gz → one-dark-pro-BURxmIp3.js.gz} +0 -0
  2961. /package/dist/web/assets/{one-light-BMvQ1R6M.js → one-light-BMRMInAj.js} +0 -0
  2962. /package/dist/web/assets/{one-light-BMvQ1R6M.js.br → one-light-BMRMInAj.js.br} +0 -0
  2963. /package/dist/web/assets/{one-light-BMvQ1R6M.js.gz → one-light-BMRMInAj.js.gz} +0 -0
  2964. /package/dist/web/assets/{openscad-DTylcqP8.js → openscad-DAgLA5J3.js} +0 -0
  2965. /package/dist/web/assets/{openscad-DTylcqP8.js.br → openscad-DAgLA5J3.js.br} +0 -0
  2966. /package/dist/web/assets/{openscad-DTylcqP8.js.gz → openscad-DAgLA5J3.js.gz} +0 -0
  2967. /package/dist/web/assets/{pascal-D0N_7LGg.js → pascal-CoDZxcRB.js} +0 -0
  2968. /package/dist/web/assets/{pascal-D0N_7LGg.js.br → pascal-CoDZxcRB.js.br} +0 -0
  2969. /package/dist/web/assets/{pascal-D0N_7LGg.js.gz → pascal-CoDZxcRB.js.gz} +0 -0
  2970. /package/dist/web/assets/{path-LyOWnqX5.js → path-DdeW1k-W.js} +0 -0
  2971. /package/dist/web/assets/{path-LyOWnqX5.js.br → path-DdeW1k-W.js.br} +0 -0
  2972. /package/dist/web/assets/{path-LyOWnqX5.js.gz → path-DdeW1k-W.js.gz} +0 -0
  2973. /package/dist/web/assets/{pkl-HQNdCmJT.js → pkl-DzKM6BuM.js} +0 -0
  2974. /package/dist/web/assets/{pkl-HQNdCmJT.js.br → pkl-DzKM6BuM.js.br} +0 -0
  2975. /package/dist/web/assets/{pkl-HQNdCmJT.js.gz → pkl-DzKM6BuM.js.gz} +0 -0
  2976. /package/dist/web/assets/{plastic-QMrjD10f.js → plastic-vF15LmNS.js} +0 -0
  2977. /package/dist/web/assets/{plastic-QMrjD10f.js.br → plastic-vF15LmNS.js.br} +0 -0
  2978. /package/dist/web/assets/{plastic-QMrjD10f.js.gz → plastic-vF15LmNS.js.gz} +0 -0
  2979. /package/dist/web/assets/{plsql-Ds9EzM4F.js → plsql-C1v07teA.js} +0 -0
  2980. /package/dist/web/assets/{plsql-Ds9EzM4F.js.br → plsql-C1v07teA.js.br} +0 -0
  2981. /package/dist/web/assets/{plsql-Ds9EzM4F.js.gz → plsql-C1v07teA.js.gz} +0 -0
  2982. /package/dist/web/assets/{po-CM8JtETE.js → po-CLLC8BuA.js} +0 -0
  2983. /package/dist/web/assets/{po-CM8JtETE.js.br → po-CLLC8BuA.js.br} +0 -0
  2984. /package/dist/web/assets/{po-CM8JtETE.js.gz → po-CLLC8BuA.js.gz} +0 -0
  2985. /package/dist/web/assets/{poimandres-fat7kglW.js → poimandres-Uq0xysxM.js} +0 -0
  2986. /package/dist/web/assets/{poimandres-fat7kglW.js.br → poimandres-Uq0xysxM.js.br} +0 -0
  2987. /package/dist/web/assets/{poimandres-fat7kglW.js.gz → poimandres-Uq0xysxM.js.gz} +0 -0
  2988. /package/dist/web/assets/{polar-CnOzO2UD.js → polar-2-luY1Pc.js} +0 -0
  2989. /package/dist/web/assets/{polar-CnOzO2UD.js.br → polar-2-luY1Pc.js.br} +0 -0
  2990. /package/dist/web/assets/{polar-CnOzO2UD.js.gz → polar-2-luY1Pc.js.gz} +0 -0
  2991. /package/dist/web/assets/{portal-container-context-NFSuymMu.js → portal-container-context-BXAsDqrB.js} +0 -0
  2992. /package/dist/web/assets/{postcss-BaqfiaQC.js → postcss-lbFhe0rz.js} +0 -0
  2993. /package/dist/web/assets/{postcss-BaqfiaQC.js.br → postcss-lbFhe0rz.js.br} +0 -0
  2994. /package/dist/web/assets/{postcss-BaqfiaQC.js.gz → postcss-lbFhe0rz.js.gz} +0 -0
  2995. /package/dist/web/assets/{powerquery-CtMX6ik_.js → powerquery-RL8O9Wie.js} +0 -0
  2996. /package/dist/web/assets/{powerquery-CtMX6ik_.js.br → powerquery-RL8O9Wie.js.br} +0 -0
  2997. /package/dist/web/assets/{powerquery-CtMX6ik_.js.gz → powerquery-RL8O9Wie.js.gz} +0 -0
  2998. /package/dist/web/assets/{powershell-BaTgHUxS.js → powershell-upFWhb-b.js} +0 -0
  2999. /package/dist/web/assets/{powershell-BaTgHUxS.js.br → powershell-upFWhb-b.js.br} +0 -0
  3000. /package/dist/web/assets/{powershell-BaTgHUxS.js.gz → powershell-upFWhb-b.js.gz} +0 -0
  3001. /package/dist/web/assets/{preload-helper-BEFjQwLd.js → preload-helper-CM8YhcCa.js} +0 -0
  3002. /package/dist/web/assets/{preload-helper-BEFjQwLd.js.br → preload-helper-CM8YhcCa.js.br} +0 -0
  3003. /package/dist/web/assets/{preload-helper-BEFjQwLd.js.gz → preload-helper-CM8YhcCa.js.gz} +0 -0
  3004. /package/dist/web/assets/{prisma-BLaoUK-7.js → prisma-DBtYaWFk.js} +0 -0
  3005. /package/dist/web/assets/{prisma-BLaoUK-7.js.br → prisma-DBtYaWFk.js.br} +0 -0
  3006. /package/dist/web/assets/{prisma-BLaoUK-7.js.gz → prisma-DBtYaWFk.js.gz} +0 -0
  3007. /package/dist/web/assets/{prolog-0I-GhZLt.js → prolog-D8jSMykJ.js} +0 -0
  3008. /package/dist/web/assets/{prolog-0I-GhZLt.js.br → prolog-D8jSMykJ.js.br} +0 -0
  3009. /package/dist/web/assets/{prolog-0I-GhZLt.js.gz → prolog-D8jSMykJ.js.gz} +0 -0
  3010. /package/dist/web/assets/{proto-CHfg51WI.js → proto-BM4eadF7.js} +0 -0
  3011. /package/dist/web/assets/{proto-CHfg51WI.js.br → proto-BM4eadF7.js.br} +0 -0
  3012. /package/dist/web/assets/{proto-CHfg51WI.js.gz → proto-BM4eadF7.js.gz} +0 -0
  3013. /package/dist/web/assets/{puppet-B0WZdEhx.js → puppet-BQDQ3Snu.js} +0 -0
  3014. /package/dist/web/assets/{puppet-B0WZdEhx.js.br → puppet-BQDQ3Snu.js.br} +0 -0
  3015. /package/dist/web/assets/{puppet-B0WZdEhx.js.gz → puppet-BQDQ3Snu.js.gz} +0 -0
  3016. /package/dist/web/assets/{purescript-CrVZ4Uql.js → purescript-Cj2aTX4s.js} +0 -0
  3017. /package/dist/web/assets/{purescript-CrVZ4Uql.js.br → purescript-Cj2aTX4s.js.br} +0 -0
  3018. /package/dist/web/assets/{purescript-CrVZ4Uql.js.gz → purescript-Cj2aTX4s.js.gz} +0 -0
  3019. /package/dist/web/assets/{python-aEpe7ZUF.js → python-BYpqq6u4.js} +0 -0
  3020. /package/dist/web/assets/{python-aEpe7ZUF.js.br → python-BYpqq6u4.js.br} +0 -0
  3021. /package/dist/web/assets/{python-aEpe7ZUF.js.gz → python-BYpqq6u4.js.gz} +0 -0
  3022. /package/dist/web/assets/{qmldir-DxTPc3lc.js → qmldir-4uiTcwAu.js} +0 -0
  3023. /package/dist/web/assets/{qss-D-nPbCGx.js → qss-D5xB-Mqo.js} +0 -0
  3024. /package/dist/web/assets/{qss-D-nPbCGx.js.br → qss-D5xB-Mqo.js.br} +0 -0
  3025. /package/dist/web/assets/{qss-D-nPbCGx.js.gz → qss-D5xB-Mqo.js.gz} +0 -0
  3026. /package/dist/web/assets/{r-BLnTqw3q.js → r-Cepe6IuL.js} +0 -0
  3027. /package/dist/web/assets/{r-BLnTqw3q.js.br → r-Cepe6IuL.js.br} +0 -0
  3028. /package/dist/web/assets/{r-BLnTqw3q.js.gz → r-Cepe6IuL.js.gz} +0 -0
  3029. /package/dist/web/assets/{racket-DNO4210g.js → racket-COKgCFuM.js} +0 -0
  3030. /package/dist/web/assets/{racket-DNO4210g.js.br → racket-COKgCFuM.js.br} +0 -0
  3031. /package/dist/web/assets/{racket-DNO4210g.js.gz → racket-COKgCFuM.js.gz} +0 -0
  3032. /package/dist/web/assets/{raku-iZJO4hxf.js → raku-z14Q9i7K.js} +0 -0
  3033. /package/dist/web/assets/{raku-iZJO4hxf.js.br → raku-z14Q9i7K.js.br} +0 -0
  3034. /package/dist/web/assets/{raku-iZJO4hxf.js.gz → raku-z14Q9i7K.js.gz} +0 -0
  3035. /package/dist/web/assets/{react-CzUPVyyG.js → react-PkBxFcos.js} +0 -0
  3036. /package/dist/web/assets/{red-F3EQNsNx.js → red-ObAvgvQ5.js} +0 -0
  3037. /package/dist/web/assets/{red-F3EQNsNx.js.br → red-ObAvgvQ5.js.br} +0 -0
  3038. /package/dist/web/assets/{red-F3EQNsNx.js.gz → red-ObAvgvQ5.js.gz} +0 -0
  3039. /package/dist/web/assets/{reg-DD_Uwu3t.js → reg-Qv4f0JFA.js} +0 -0
  3040. /package/dist/web/assets/{reg-DD_Uwu3t.js.br → reg-Qv4f0JFA.js.br} +0 -0
  3041. /package/dist/web/assets/{reg-DD_Uwu3t.js.gz → reg-Qv4f0JFA.js.gz} +0 -0
  3042. /package/dist/web/assets/{regexp-D3RlqUxN.js → regexp-B2qGjhef.js} +0 -0
  3043. /package/dist/web/assets/{regexp-D3RlqUxN.js.br → regexp-B2qGjhef.js.br} +0 -0
  3044. /package/dist/web/assets/{regexp-D3RlqUxN.js.gz → regexp-B2qGjhef.js.gz} +0 -0
  3045. /package/dist/web/assets/{rel-DM5GSHUR.js → rel-cWOyTUwd.js} +0 -0
  3046. /package/dist/web/assets/{rel-DM5GSHUR.js.br → rel-cWOyTUwd.js.br} +0 -0
  3047. /package/dist/web/assets/{rel-DM5GSHUR.js.gz → rel-cWOyTUwd.js.gz} +0 -0
  3048. /package/dist/web/assets/{resolve-theme-STMsK2vc.js → resolve-theme-mnfVcSjJ.js} +0 -0
  3049. /package/dist/web/assets/{resolve-theme-STMsK2vc.js.br → resolve-theme-mnfVcSjJ.js.br} +0 -0
  3050. /package/dist/web/assets/{resolve-theme-STMsK2vc.js.gz → resolve-theme-mnfVcSjJ.js.gz} +0 -0
  3051. /package/dist/web/assets/{riscv-C_jO4gJw.js → riscv-BZDwx-lv.js} +0 -0
  3052. /package/dist/web/assets/{riscv-C_jO4gJw.js.br → riscv-BZDwx-lv.js.br} +0 -0
  3053. /package/dist/web/assets/{riscv-C_jO4gJw.js.gz → riscv-BZDwx-lv.js.gz} +0 -0
  3054. /package/dist/web/assets/{ron--r6_MG5U.js → ron-BpjosPS0.js} +0 -0
  3055. /package/dist/web/assets/{ron--r6_MG5U.js.br → ron-BpjosPS0.js.br} +0 -0
  3056. /package/dist/web/assets/{ron--r6_MG5U.js.gz → ron-BpjosPS0.js.gz} +0 -0
  3057. /package/dist/web/assets/{rose-pine-NjvlliYf.js → rose-pine-DhxfJWcm.js} +0 -0
  3058. /package/dist/web/assets/{rose-pine-NjvlliYf.js.br → rose-pine-DhxfJWcm.js.br} +0 -0
  3059. /package/dist/web/assets/{rose-pine-NjvlliYf.js.gz → rose-pine-DhxfJWcm.js.gz} +0 -0
  3060. /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js → rose-pine-dawn-BbGt9Wy_.js} +0 -0
  3061. /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.br → rose-pine-dawn-BbGt9Wy_.js.br} +0 -0
  3062. /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.gz → rose-pine-dawn-BbGt9Wy_.js.gz} +0 -0
  3063. /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js → rose-pine-moon-dj4Zxgik.js} +0 -0
  3064. /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.br → rose-pine-moon-dj4Zxgik.js.br} +0 -0
  3065. /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.gz → rose-pine-moon-dj4Zxgik.js.gz} +0 -0
  3066. /package/dist/web/assets/{rosmsg-BQrgxzms.js → rosmsg-EciOaHo2.js} +0 -0
  3067. /package/dist/web/assets/{rosmsg-BQrgxzms.js.br → rosmsg-EciOaHo2.js.br} +0 -0
  3068. /package/dist/web/assets/{rosmsg-BQrgxzms.js.gz → rosmsg-EciOaHo2.js.gz} +0 -0
  3069. /package/dist/web/assets/{rough.esm-CSLcW3u5.js → rough.esm-HBESlUxy.js} +0 -0
  3070. /package/dist/web/assets/{rough.esm-CSLcW3u5.js.br → rough.esm-HBESlUxy.js.br} +0 -0
  3071. /package/dist/web/assets/{rough.esm-CSLcW3u5.js.gz → rough.esm-HBESlUxy.js.gz} +0 -0
  3072. /package/dist/web/assets/{rust-CP39BBh-.js → rust-C_eH59O_.js} +0 -0
  3073. /package/dist/web/assets/{rust-CP39BBh-.js.br → rust-C_eH59O_.js.br} +0 -0
  3074. /package/dist/web/assets/{rust-CP39BBh-.js.gz → rust-C_eH59O_.js.gz} +0 -0
  3075. /package/dist/web/assets/{sass-CMiN16ff.js → sass-Dos3R5lL.js} +0 -0
  3076. /package/dist/web/assets/{sass-CMiN16ff.js.br → sass-Dos3R5lL.js.br} +0 -0
  3077. /package/dist/web/assets/{sass-CMiN16ff.js.gz → sass-Dos3R5lL.js.gz} +0 -0
  3078. /package/dist/web/assets/{scala-jm4Hro87.js → scala-8lVKsTvf.js} +0 -0
  3079. /package/dist/web/assets/{scala-jm4Hro87.js.br → scala-8lVKsTvf.js.br} +0 -0
  3080. /package/dist/web/assets/{scala-jm4Hro87.js.gz → scala-8lVKsTvf.js.gz} +0 -0
  3081. /package/dist/web/assets/{scheme-Ct_BnC2r.js → scheme-Bd3VdaZj.js} +0 -0
  3082. /package/dist/web/assets/{scheme-Ct_BnC2r.js.br → scheme-Bd3VdaZj.js.br} +0 -0
  3083. /package/dist/web/assets/{scheme-Ct_BnC2r.js.gz → scheme-Bd3VdaZj.js.gz} +0 -0
  3084. /package/dist/web/assets/{sdbl-CnOjqCoH.js → sdbl-C4Yrjlgh.js} +0 -0
  3085. /package/dist/web/assets/{sdbl-CnOjqCoH.js.br → sdbl-C4Yrjlgh.js.br} +0 -0
  3086. /package/dist/web/assets/{sdbl-CnOjqCoH.js.gz → sdbl-C4Yrjlgh.js.gz} +0 -0
  3087. /package/dist/web/assets/{shellscript-C6sdrDvR.js → shellscript-BSi71kYk.js} +0 -0
  3088. /package/dist/web/assets/{shellscript-C6sdrDvR.js.br → shellscript-BSi71kYk.js.br} +0 -0
  3089. /package/dist/web/assets/{shellscript-C6sdrDvR.js.gz → shellscript-BSi71kYk.js.gz} +0 -0
  3090. /package/dist/web/assets/{slack-dark-BOdgeH19.js → slack-dark-aL6vlxZs.js} +0 -0
  3091. /package/dist/web/assets/{slack-dark-BOdgeH19.js.br → slack-dark-aL6vlxZs.js.br} +0 -0
  3092. /package/dist/web/assets/{slack-dark-BOdgeH19.js.gz → slack-dark-aL6vlxZs.js.gz} +0 -0
  3093. /package/dist/web/assets/{slack-ochin-DBMQIw0j.js → slack-ochin-BKt1E7sL.js} +0 -0
  3094. /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.br → slack-ochin-BKt1E7sL.js.br} +0 -0
  3095. /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.gz → slack-ochin-BKt1E7sL.js.gz} +0 -0
  3096. /package/dist/web/assets/{smalltalk-BMQqYubg.js → smalltalk-D6qVBL1U.js} +0 -0
  3097. /package/dist/web/assets/{smalltalk-BMQqYubg.js.br → smalltalk-D6qVBL1U.js.br} +0 -0
  3098. /package/dist/web/assets/{smalltalk-BMQqYubg.js.gz → smalltalk-D6qVBL1U.js.gz} +0 -0
  3099. /package/dist/web/assets/{snazzy-light-DwnLbrVG.js → snazzy-light-BrWerT0t.js} +0 -0
  3100. /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.br → snazzy-light-BrWerT0t.js.br} +0 -0
  3101. /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.gz → snazzy-light-BrWerT0t.js.gz} +0 -0
  3102. /package/dist/web/assets/{solarized-dark-DXJnupYd.js → solarized-dark-CzxTJgVQ.js} +0 -0
  3103. /package/dist/web/assets/{solarized-dark-DXJnupYd.js.br → solarized-dark-CzxTJgVQ.js.br} +0 -0
  3104. /package/dist/web/assets/{solarized-dark-DXJnupYd.js.gz → solarized-dark-CzxTJgVQ.js.gz} +0 -0
  3105. /package/dist/web/assets/{solarized-light-DqhyrtI4.js → solarized-light-BecaDAnG.js} +0 -0
  3106. /package/dist/web/assets/{solarized-light-DqhyrtI4.js.br → solarized-light-BecaDAnG.js.br} +0 -0
  3107. /package/dist/web/assets/{solarized-light-DqhyrtI4.js.gz → solarized-light-BecaDAnG.js.gz} +0 -0
  3108. /package/dist/web/assets/{solidity-BM0p0sku.js → solidity-C9t7pZ84.js} +0 -0
  3109. /package/dist/web/assets/{solidity-BM0p0sku.js.br → solidity-C9t7pZ84.js.br} +0 -0
  3110. /package/dist/web/assets/{solidity-BM0p0sku.js.gz → solidity-C9t7pZ84.js.gz} +0 -0
  3111. /package/dist/web/assets/{splunk-Cq6_jbaY.js → splunk-CtxfFKtF.js} +0 -0
  3112. /package/dist/web/assets/{splunk-Cq6_jbaY.js.br → splunk-CtxfFKtF.js.br} +0 -0
  3113. /package/dist/web/assets/{splunk-Cq6_jbaY.js.gz → splunk-CtxfFKtF.js.gz} +0 -0
  3114. /package/dist/web/assets/{sql-CPfIb_cO.js → sql-CCsqbgCh.js} +0 -0
  3115. /package/dist/web/assets/{sql-CPfIb_cO.js.br → sql-CCsqbgCh.js.br} +0 -0
  3116. /package/dist/web/assets/{sql-CPfIb_cO.js.gz → sql-CCsqbgCh.js.gz} +0 -0
  3117. /package/dist/web/assets/{src-C7A68uNq.js → src-BMgF6h1r.js} +0 -0
  3118. /package/dist/web/assets/{src-C7A68uNq.js.br → src-BMgF6h1r.js.br} +0 -0
  3119. /package/dist/web/assets/{src-C7A68uNq.js.gz → src-BMgF6h1r.js.gz} +0 -0
  3120. /package/dist/web/assets/{ssh-config-GRgzMVtG.js → ssh-config-3Fr37ACC.js} +0 -0
  3121. /package/dist/web/assets/{ssh-config-GRgzMVtG.js.br → ssh-config-3Fr37ACC.js.br} +0 -0
  3122. /package/dist/web/assets/{ssh-config-GRgzMVtG.js.gz → ssh-config-3Fr37ACC.js.gz} +0 -0
  3123. /package/dist/web/assets/{stylus-DNs7ubf9.js → stylus-BP4mE1sO.js} +0 -0
  3124. /package/dist/web/assets/{stylus-DNs7ubf9.js.br → stylus-BP4mE1sO.js.br} +0 -0
  3125. /package/dist/web/assets/{stylus-DNs7ubf9.js.gz → stylus-BP4mE1sO.js.gz} +0 -0
  3126. /package/dist/web/assets/{swift-BQV34vng.js → swift-0uqTFouD.js} +0 -0
  3127. /package/dist/web/assets/{swift-BQV34vng.js.br → swift-0uqTFouD.js.br} +0 -0
  3128. /package/dist/web/assets/{swift-BQV34vng.js.gz → swift-0uqTFouD.js.gz} +0 -0
  3129. /package/dist/web/assets/{synthwave-84-CypcdXbA.js → synthwave-84-DQaNM3DI.js} +0 -0
  3130. /package/dist/web/assets/{synthwave-84-CypcdXbA.js.br → synthwave-84-DQaNM3DI.js.br} +0 -0
  3131. /package/dist/web/assets/{synthwave-84-CypcdXbA.js.gz → synthwave-84-DQaNM3DI.js.gz} +0 -0
  3132. /package/dist/web/assets/{system-verilog-DaLPjQ4v.js → system-verilog-DUIVrZHZ.js} +0 -0
  3133. /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.br → system-verilog-DUIVrZHZ.js.br} +0 -0
  3134. /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.gz → system-verilog-DUIVrZHZ.js.gz} +0 -0
  3135. /package/dist/web/assets/{systemd-CXHFtmNc.js → systemd-CtNo_WIh.js} +0 -0
  3136. /package/dist/web/assets/{systemd-CXHFtmNc.js.br → systemd-CtNo_WIh.js.br} +0 -0
  3137. /package/dist/web/assets/{systemd-CXHFtmNc.js.gz → systemd-CtNo_WIh.js.gz} +0 -0
  3138. /package/dist/web/assets/{talonscript-DI9nO5jX.js → talonscript-B0HXaCVT.js} +0 -0
  3139. /package/dist/web/assets/{talonscript-DI9nO5jX.js.br → talonscript-B0HXaCVT.js.br} +0 -0
  3140. /package/dist/web/assets/{talonscript-DI9nO5jX.js.gz → talonscript-B0HXaCVT.js.gz} +0 -0
  3141. /package/dist/web/assets/{tasl-BAQyAl0c.js → tasl-Cb7RAl11.js} +0 -0
  3142. /package/dist/web/assets/{tasl-BAQyAl0c.js.br → tasl-Cb7RAl11.js.br} +0 -0
  3143. /package/dist/web/assets/{tasl-BAQyAl0c.js.gz → tasl-Cb7RAl11.js.gz} +0 -0
  3144. /package/dist/web/assets/{tcl-BP_ozI58.js → tcl-B79aC6l5.js} +0 -0
  3145. /package/dist/web/assets/{tcl-BP_ozI58.js.br → tcl-B79aC6l5.js.br} +0 -0
  3146. /package/dist/web/assets/{tcl-BP_ozI58.js.gz → tcl-B79aC6l5.js.gz} +0 -0
  3147. /package/dist/web/assets/{terraform-NrndR0yZ.js → terraform-75jJDjpW.js} +0 -0
  3148. /package/dist/web/assets/{terraform-NrndR0yZ.js.br → terraform-75jJDjpW.js.br} +0 -0
  3149. /package/dist/web/assets/{terraform-NrndR0yZ.js.gz → terraform-75jJDjpW.js.gz} +0 -0
  3150. /package/dist/web/assets/{tokyo-night-CbUQlN8D.js → tokyo-night-Cz9Uh9qb.js} +0 -0
  3151. /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.br → tokyo-night-Cz9Uh9qb.js.br} +0 -0
  3152. /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.gz → tokyo-night-Cz9Uh9qb.js.gz} +0 -0
  3153. /package/dist/web/assets/{toml-BM_zrMLj.js → toml-CD6y9A-z.js} +0 -0
  3154. /package/dist/web/assets/{toml-BM_zrMLj.js.br → toml-CD6y9A-z.js.br} +0 -0
  3155. /package/dist/web/assets/{toml-BM_zrMLj.js.gz → toml-CD6y9A-z.js.gz} +0 -0
  3156. /package/dist/web/assets/{tsv-CfyllNPO.js → tsv-CXJMbBrb.js} +0 -0
  3157. /package/dist/web/assets/{tsx-BROcpVjE.js → tsx-BWhuDCm8.js} +0 -0
  3158. /package/dist/web/assets/{tsx-BROcpVjE.js.br → tsx-BWhuDCm8.js.br} +0 -0
  3159. /package/dist/web/assets/{tsx-BROcpVjE.js.gz → tsx-BWhuDCm8.js.gz} +0 -0
  3160. /package/dist/web/assets/{turtle-CHmyeS9k.js → turtle-DWH-Rjse.js} +0 -0
  3161. /package/dist/web/assets/{turtle-CHmyeS9k.js.br → turtle-DWH-Rjse.js.br} +0 -0
  3162. /package/dist/web/assets/{turtle-CHmyeS9k.js.gz → turtle-DWH-Rjse.js.gz} +0 -0
  3163. /package/dist/web/assets/{typescript-BVwspRg8.js → typescript-BcravxO_.js} +0 -0
  3164. /package/dist/web/assets/{typescript-BVwspRg8.js.br → typescript-BcravxO_.js.br} +0 -0
  3165. /package/dist/web/assets/{typescript-BVwspRg8.js.gz → typescript-BcravxO_.js.gz} +0 -0
  3166. /package/dist/web/assets/{typespec-DXRppCgc.js → typespec-B0wvVykx.js} +0 -0
  3167. /package/dist/web/assets/{typespec-DXRppCgc.js.br → typespec-B0wvVykx.js.br} +0 -0
  3168. /package/dist/web/assets/{typespec-DXRppCgc.js.gz → typespec-B0wvVykx.js.gz} +0 -0
  3169. /package/dist/web/assets/{typst-L5uwArOj.js → typst-DWG2c48-.js} +0 -0
  3170. /package/dist/web/assets/{typst-L5uwArOj.js.br → typst-DWG2c48-.js.br} +0 -0
  3171. /package/dist/web/assets/{typst-L5uwArOj.js.gz → typst-DWG2c48-.js.gz} +0 -0
  3172. /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js → use-h264-canvas-decoder-JIlkOcWX.js} +0 -0
  3173. /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.br → use-h264-canvas-decoder-JIlkOcWX.js.br} +0 -0
  3174. /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.gz → use-h264-canvas-decoder-JIlkOcWX.js.gz} +0 -0
  3175. /package/dist/web/assets/{use-is-mobile-BClDZJP5.js → use-is-mobile-BXHbkfs9.js} +0 -0
  3176. /package/dist/web/assets/{use-visual-viewport-BGpcMnIx.js → use-visual-viewport-CHm9umK0.js} +0 -0
  3177. /package/dist/web/assets/{utils-btZ8C8-R.js → utils-Bslrbb-G.js} +0 -0
  3178. /package/dist/web/assets/{utils-btZ8C8-R.js.br → utils-Bslrbb-G.js.br} +0 -0
  3179. /package/dist/web/assets/{utils-btZ8C8-R.js.gz → utils-Bslrbb-G.js.gz} +0 -0
  3180. /package/dist/web/assets/{v-Bz99d5uk.js → v-Ch6E4Egd.js} +0 -0
  3181. /package/dist/web/assets/{v-Bz99d5uk.js.br → v-Ch6E4Egd.js.br} +0 -0
  3182. /package/dist/web/assets/{v-Bz99d5uk.js.gz → v-Ch6E4Egd.js.gz} +0 -0
  3183. /package/dist/web/assets/{vala-B-CtBLX1.js → vala-CGVKwbPx.js} +0 -0
  3184. /package/dist/web/assets/{vala-B-CtBLX1.js.br → vala-CGVKwbPx.js.br} +0 -0
  3185. /package/dist/web/assets/{vala-B-CtBLX1.js.gz → vala-CGVKwbPx.js.gz} +0 -0
  3186. /package/dist/web/assets/{vb-DHqiz9Cp.js → vb-BIEbSxyT.js} +0 -0
  3187. /package/dist/web/assets/{vb-DHqiz9Cp.js.br → vb-BIEbSxyT.js.br} +0 -0
  3188. /package/dist/web/assets/{vb-DHqiz9Cp.js.gz → vb-BIEbSxyT.js.gz} +0 -0
  3189. /package/dist/web/assets/{vendor-xterm-CfasyE0m.js → vendor-xterm-DCbcQFHk.js} +0 -0
  3190. /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.br → vendor-xterm-DCbcQFHk.js.br} +0 -0
  3191. /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.gz → vendor-xterm-DCbcQFHk.js.gz} +0 -0
  3192. /package/dist/web/assets/{verilog-DbTkSkM7.js → verilog-A-3pYPad.js} +0 -0
  3193. /package/dist/web/assets/{verilog-DbTkSkM7.js.br → verilog-A-3pYPad.js.br} +0 -0
  3194. /package/dist/web/assets/{verilog-DbTkSkM7.js.gz → verilog-A-3pYPad.js.gz} +0 -0
  3195. /package/dist/web/assets/{vesper-2aVei4Le.js → vesper-CK1naZAV.js} +0 -0
  3196. /package/dist/web/assets/{vesper-2aVei4Le.js.br → vesper-CK1naZAV.js.br} +0 -0
  3197. /package/dist/web/assets/{vesper-2aVei4Le.js.gz → vesper-CK1naZAV.js.gz} +0 -0
  3198. /package/dist/web/assets/{vhdl-BJJSCnQQ.js → vhdl-CVawmgMg.js} +0 -0
  3199. /package/dist/web/assets/{vhdl-BJJSCnQQ.js.br → vhdl-CVawmgMg.js.br} +0 -0
  3200. /package/dist/web/assets/{vhdl-BJJSCnQQ.js.gz → vhdl-CVawmgMg.js.gz} +0 -0
  3201. /package/dist/web/assets/{viml-qxSvRN8n.js → viml-CiWjaqBY.js} +0 -0
  3202. /package/dist/web/assets/{viml-qxSvRN8n.js.br → viml-CiWjaqBY.js.br} +0 -0
  3203. /package/dist/web/assets/{viml-qxSvRN8n.js.gz → viml-CiWjaqBY.js.gz} +0 -0
  3204. /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js → vitesse-black-PYXW4-BO.js} +0 -0
  3205. /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.br → vitesse-black-PYXW4-BO.js.br} +0 -0
  3206. /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.gz → vitesse-black-PYXW4-BO.js.gz} +0 -0
  3207. /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js → vitesse-dark-BU5s4AuG.js} +0 -0
  3208. /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.br → vitesse-dark-BU5s4AuG.js.br} +0 -0
  3209. /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.gz → vitesse-dark-BU5s4AuG.js.gz} +0 -0
  3210. /package/dist/web/assets/{vitesse-light-DkC_qU0k.js → vitesse-light-DgkIT-N7.js} +0 -0
  3211. /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.br → vitesse-light-DgkIT-N7.js.br} +0 -0
  3212. /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.gz → vitesse-light-DgkIT-N7.js.gz} +0 -0
  3213. /package/dist/web/assets/{vyper-WAhkfwIX.js → vyper-D8cRDPp3.js} +0 -0
  3214. /package/dist/web/assets/{vyper-WAhkfwIX.js.br → vyper-D8cRDPp3.js.br} +0 -0
  3215. /package/dist/web/assets/{vyper-WAhkfwIX.js.gz → vyper-D8cRDPp3.js.gz} +0 -0
  3216. /package/dist/web/assets/{wasm-BYGI5YYa.js → wasm-Bu8IyVr8.js} +0 -0
  3217. /package/dist/web/assets/{wasm-BYGI5YYa.js.br → wasm-Bu8IyVr8.js.br} +0 -0
  3218. /package/dist/web/assets/{wasm-BYGI5YYa.js.gz → wasm-Bu8IyVr8.js.gz} +0 -0
  3219. /package/dist/web/assets/{wasm-Miuao4O0.js → wasm-ClFJgzmT.js} +0 -0
  3220. /package/dist/web/assets/{wasm-Miuao4O0.js.br → wasm-ClFJgzmT.js.br} +0 -0
  3221. /package/dist/web/assets/{wasm-Miuao4O0.js.gz → wasm-ClFJgzmT.js.gz} +0 -0
  3222. /package/dist/web/assets/{wenyan-Dd5qjF8u.js → wenyan-B8plxIr8.js} +0 -0
  3223. /package/dist/web/assets/{wenyan-Dd5qjF8u.js.br → wenyan-B8plxIr8.js.br} +0 -0
  3224. /package/dist/web/assets/{wenyan-Dd5qjF8u.js.gz → wenyan-B8plxIr8.js.gz} +0 -0
  3225. /package/dist/web/assets/{wgsl-C3T5a0UO.js → wgsl-CVujtm3V.js} +0 -0
  3226. /package/dist/web/assets/{wgsl-C3T5a0UO.js.br → wgsl-CVujtm3V.js.br} +0 -0
  3227. /package/dist/web/assets/{wgsl-C3T5a0UO.js.gz → wgsl-CVujtm3V.js.gz} +0 -0
  3228. /package/dist/web/assets/{wikitext-CvCJjxSa.js → wikitext-CmcG9B69.js} +0 -0
  3229. /package/dist/web/assets/{wikitext-CvCJjxSa.js.br → wikitext-CmcG9B69.js.br} +0 -0
  3230. /package/dist/web/assets/{wikitext-CvCJjxSa.js.gz → wikitext-CmcG9B69.js.gz} +0 -0
  3231. /package/dist/web/assets/{wit-DybvG9BU.js → wit--gl2Jium.js} +0 -0
  3232. /package/dist/web/assets/{wit-DybvG9BU.js.br → wit--gl2Jium.js.br} +0 -0
  3233. /package/dist/web/assets/{wit-DybvG9BU.js.gz → wit--gl2Jium.js.gz} +0 -0
  3234. /package/dist/web/assets/{wolfram-CdhnrpZ7.js → wolfram-6T_1D-NS.js} +0 -0
  3235. /package/dist/web/assets/{wolfram-CdhnrpZ7.js.br → wolfram-6T_1D-NS.js.br} +0 -0
  3236. /package/dist/web/assets/{wolfram-CdhnrpZ7.js.gz → wolfram-6T_1D-NS.js.gz} +0 -0
  3237. /package/dist/web/assets/{yaml-B0HIje0z.js → yaml-CVFKoPnL.js} +0 -0
  3238. /package/dist/web/assets/{yaml-B0HIje0z.js.br → yaml-CVFKoPnL.js.br} +0 -0
  3239. /package/dist/web/assets/{yaml-B0HIje0z.js.gz → yaml-CVFKoPnL.js.gz} +0 -0
  3240. /package/dist/web/assets/{zenscript-CcLSNTvD.js → zenscript-CoT4yNdA.js} +0 -0
  3241. /package/dist/web/assets/{zenscript-CcLSNTvD.js.br → zenscript-CoT4yNdA.js.br} +0 -0
  3242. /package/dist/web/assets/{zenscript-CcLSNTvD.js.gz → zenscript-CoT4yNdA.js.gz} +0 -0
  3243. /package/dist/web/assets/{zig-dAelYAUr.js → zig-BWs2Qo3G.js} +0 -0
  3244. /package/dist/web/assets/{zig-dAelYAUr.js.br → zig-BWs2Qo3G.js.br} +0 -0
  3245. /package/dist/web/assets/{zig-dAelYAUr.js.gz → zig-BWs2Qo3G.js.gz} +0 -0
@@ -1,9 +1,20 @@
1
1
  /**
2
- * Generate the complete webview HTML for the git graph panel.
3
- * All JS + CSS is inlined since webview runs in an iframe sandbox.
2
+ * The Git Graph panel: one HTML document with its stylesheet and script
3
+ * inlined, since the webview runs in a sandboxed iframe that can load nothing.
4
+ *
5
+ * The markup here is the frame the script fills in. The script itself is one
6
+ * classic <script> assembled from the parts below, which share one scope —
7
+ * webview-script-core.ts says what that allows and what it rules out.
4
8
  */
5
- import { AVATAR_JS, FONT_TOKENS } from "./webview-shell.ts";
6
- import { COMMIT_MESSAGE_JS } from "./commit-message-html.ts";
9
+ import { WEBVIEW_ICONS } from "./webview-icons.generated.ts";
10
+ import { actionsScript } from "./webview-script-actions.ts";
11
+ import { coreScript } from "./webview-script-core.ts";
12
+ import { graphScript } from "./webview-script-graph.ts";
13
+ import { inspectorScript } from "./webview-script-inspector.ts";
14
+ import { listScript } from "./webview-script-list.ts";
15
+ import { mainScript } from "./webview-script-main.ts";
16
+ import { settingsScript } from "./webview-script-settings.ts";
17
+ import { graphStyles } from "./webview-styles.ts";
7
18
 
8
19
  /*
9
20
  * The narrowest the message column may get, in px. The graph column is capped
@@ -18,3799 +29,167 @@ const MESSAGE_MIN_W = 240;
18
29
  /** The narrowest the graph column may get, automatically or by dragging. */
19
30
  const GRAPH_MIN_W = 40;
20
31
 
21
- export function getWebviewHtml(): string {
22
- return `<!DOCTYPE html>
23
- <html>
24
- <head>
25
- <meta charset="utf-8">
26
- <style>
27
- ${getStyles()}
28
- </style>
29
- </head>
30
- <body>
31
- <div id="app">
32
- <header id="toolbar">
33
- <div class="toolbar-left">
34
- <div id="branch-selector" class="branch-dropdown">
35
- <button id="branch-trigger" class="branch-trigger">All Branches</button>
36
- <div id="branch-dropdown-menu" class="branch-dropdown-menu hidden">
37
- <input id="branch-filter" type="text" placeholder="Filter branches..." class="branch-filter-input" />
38
- <div id="branch-list" class="branch-list"></div>
39
- </div>
40
- </div>
41
- <button id="btn-refresh" title="Refresh"></button>
42
- <button id="btn-fetch" title="Fetch from remotes"></button>
32
+ function icon(name: string, cls?: string): string {
33
+ const svg = WEBVIEW_ICONS[name];
34
+ if (!svg) throw new Error(`Git Graph markup asks for an icon that is not generated: ${name}`);
35
+ return cls ? svg.replace('class="ic"', `class="ic ${cls}"`) : svg;
36
+ }
37
+
38
+ function toolbarHtml(): string {
39
+ return `<header id="toolbar">
40
+ <button type="button" id="branch-selector" class="gg-scope" aria-haspopup="menu">${icon("branch", "ic-sm")}<span id="scope-label" class="scope-lbl">All branches</span>${icon("chev-d", "ic-xs")}</button>
41
+ <div id="find-bar">
42
+ <label class="gg-find">${icon("search", "ic-sm")}<input id="find-input" type="text" placeholder="Find commits" aria-label="Find commits" autocomplete="off" spellcheck="false"><span id="find-count" class="count" aria-live="polite"></span><button type="button" id="find-prev" class="step" title="Previous match (Shift+Enter)" aria-label="Previous match">${icon("chev-u", "ic-xs")}</button><button type="button" id="find-next" class="step" title="Next match (Enter)" aria-label="Next match">${icon("chev-d", "ic-xs")}</button><button type="button" id="find-close" class="clear" title="Clear (Esc)" aria-label="Clear search">${icon("x", "ic-xs")}</button><button type="button" id="find-mode" class="mode" aria-haspopup="menu">Loaded</button></label>
43
43
  </div>
44
- <div class="toolbar-right">
45
- <div class="stash-dropdown">
46
- <button id="btn-stash" title="Stashes"></button>
47
- <div id="stash-popover" class="stash-popover hidden">
48
- <div class="stash-popover-header"><span>Stashes</span></div>
49
- <div id="stash-list" class="stash-list"></div>
50
- <div class="stash-popover-footer">
51
- <button id="stash-save" class="btn-sm">+ Stash Changes</button>
52
- </div>
53
- </div>
54
- </div>
55
- <div class="worktree-dropdown">
56
- <button id="btn-worktree" title="Worktrees"></button>
57
- <div id="worktree-popover" class="worktree-popover hidden">
58
- <div class="worktree-popover-header">
59
- <span>Worktrees</span>
60
- </div>
61
- <div id="worktree-list" class="worktree-list"></div>
62
- <div class="worktree-popover-footer">
63
- <button id="wt-add" class="btn-sm">+ Add Worktree</button>
64
- <button id="wt-prune" class="btn-sm secondary" title="Remove stale worktree entries">Prune</button>
65
- </div>
44
+ <span class="grow"></span>
45
+ <button type="button" id="btn-stash" class="tool wide opt" aria-haspopup="menu" title="Stashes" aria-label="Stashes">${icon("stash")}<span class="n"></span></button>
46
+ <button type="button" id="btn-worktree" class="tool wide opt" aria-haspopup="menu" title="Worktrees" aria-label="Worktrees">${icon("folder")}<span class="n"></span></button>
47
+ <button type="button" id="btn-submodule" class="tool wide opt hidden" aria-haspopup="menu" title="Submodules" aria-label="Submodules">${icon("cube")}<span class="n"></span></button>
48
+ <span class="sep"></span>
49
+ <span id="sync" class="sync" role="group" aria-label="Sync with the remote">
50
+ <button type="button" id="btn-fetch">${icon("sync", "ic-sm")}<span class="lbl">Fetch</span></button>
51
+ <button type="button" id="btn-pull" disabled>${icon("pull", "ic-sm")}<span class="lbl">Pull</span><span class="num"></span></button>
52
+ <button type="button" id="btn-push" disabled>${icon("push", "ic-sm")}<span class="lbl">Push</span><span class="num hot"></span></button>
53
+ </span>
54
+ <button type="button" id="btn-sync-m" class="sc-sync hidden"></button>
55
+ <span class="sep"></span>
56
+ <button type="button" id="btn-find" class="tool" title="Find (Ctrl+F)" aria-label="Find commits">${icon("search")}</button>
57
+ <button type="button" id="btn-view" class="tool" aria-haspopup="menu" title="View options" aria-label="View options">${icon("options")}</button>
58
+ <button type="button" id="btn-inspector" class="tool" aria-pressed="false" title="Show details" aria-label="Details">${icon("panel-right")}</button>
59
+ </header>`;
60
+ }
61
+
62
+ function listHtml(): string {
63
+ return `<div id="gg-main">
64
+ <div id="graph-area">
65
+ <div id="graph-container" class="scroll-thin">
66
+ <div id="graph-header" class="commit-row header-row" role="row">
67
+ <div class="col-graph">Graph<div class="graph-resize-handle" id="graph-resize-handle"></div></div>
68
+ <div class="col-message">Message</div>
69
+ <div class="col-changes">Changes</div>
70
+ <div class="col-author">Author</div>
71
+ <div class="col-date">Date</div>
72
+ <div class="col-hash">Hash</div>
66
73
  </div>
67
- </div>
68
- <div class="submodule-dropdown hidden" id="submodule-wrap">
69
- <button id="btn-submodule" title="Submodules"></button>
70
- <div id="submodule-popover" class="worktree-popover hidden">
71
- <div class="worktree-popover-header"><span>Submodules</span></div>
72
- <div id="submodule-list" class="worktree-list"></div>
73
- <div class="worktree-popover-footer">
74
- <button id="sm-update-all" class="btn-sm">Update all</button>
75
- </div>
74
+ <div id="commit-list-wrapper">
75
+ <div id="graph-clip"><div id="graph-svg-container"></div></div>
76
+ <div id="commit-list" role="rowgroup"></div>
76
77
  </div>
78
+ <div id="loading" class="loading hidden">Loading…</div>
77
79
  </div>
78
- <button id="btn-reflog" title="Reflog — undo a rebase, reset or deleted branch"></button>
79
- <button id="btn-find" title="Find (Ctrl+F)"></button>
80
- <button id="btn-settings" title="Settings"></button>
80
+ <div id="graph-pan-bar" class="hidden" aria-hidden="true"><div id="graph-pan-thumb"></div></div>
81
+ <div id="scroll-markers" aria-hidden="true"></div>
82
+ <div id="search-results" class="search-results hidden scroll-thin"></div>
81
83
  </div>
82
- </header>
83
- <div id="find-bar" class="find-bar hidden">
84
- <input id="find-input" type="text" placeholder="Search commits..." />
85
- <select id="find-mode" title="Where to search">
86
- <option value="loaded">Loaded rows</option>
87
- <option value="message">Message (all history)</option>
88
- <option value="author">Author (all history)</option>
89
- <option value="content">Code change (all history)</option>
90
- <option value="file">Touched file (all history)</option>
91
- </select>
92
- <span id="find-count"></span>
93
- <button id="find-prev" title="Previous">&uarr;</button>
94
- <button id="find-next" title="Next">&darr;</button>
95
- <button id="find-close" title="Close">&times;</button>
96
- </div>
97
- <div id="search-results" class="search-results hidden"></div>
98
- <div id="graph-area">
99
- <div id="graph-container">
100
- <div id="graph-header" class="commit-row header-row">
101
- <div class="col-refs">Branch / Tag</div>
102
- <div class="col-graph">Graph<div class="graph-resize-handle" id="graph-resize-handle"></div></div>
103
- <div class="col-message">Message</div>
104
- <div class="col-changes">Changes</div>
105
- <div class="col-author">Author</div>
106
- <div class="col-date">Date</div>
107
- <div class="col-hash">Hash</div>
108
- </div>
109
- <div id="commit-list-wrapper">
110
- <div id="graph-clip"><div id="graph-svg-container"></div></div>
111
- <div id="commit-list"></div>
112
- </div>
113
- <div id="loading" class="loading hidden">Loading...</div>
114
- </div>
115
- <div id="graph-pan-bar" class="hidden" aria-hidden="true"><div id="graph-pan-thumb"></div></div>
116
- <div id="scroll-markers" aria-hidden="true"></div>
117
- </div>
118
- <div id="detail-panel" class="detail-panel hidden"></div>
119
- <div id="settings-panel" class="settings-panel">
84
+ <div id="sheet-scrim" class="hidden"></div>
85
+ <aside id="detail-panel" class="detail-panel scroll-thin" aria-label="Details"></aside>
86
+ </div>`;
87
+ }
88
+
89
+ function settingsHtml(): string {
90
+ const row = (label: string, control: string) => `<div class="setting-row"><label>${label}</label>${control}</div>`;
91
+ const check = (id: string) => `<input type="checkbox" id="${id}">`;
92
+ return `<div id="settings-panel" role="dialog" aria-label="Git Graph settings">
120
93
  <div class="settings-header">
121
- <h3>Git Graph Settings</h3>
122
- <button id="settings-close" title="Close">&times;</button>
94
+ <h3>Git Graph settings</h3>
95
+ <button type="button" id="settings-close" class="tool" title="Close" aria-label="Close settings">${icon("x")}</button>
123
96
  </div>
124
- <div class="settings-body">
97
+ <div class="settings-body scroll-thin">
125
98
  <details class="settings-section" open>
126
99
  <summary>General</summary>
127
- <div class="setting-row"><label>Max Commits</label><input type="number" id="s-maxCommits" min="10" max="10000" step="50"></div>
128
- <div class="setting-row"><label>Show Tags</label><input type="checkbox" id="s-showTags"></div>
129
- <div class="setting-row"><label>Show Stashes</label><input type="checkbox" id="s-showStashes"></div>
130
- <div class="setting-row"><label>Show Remote Branches</label><input type="checkbox" id="s-showRemoteBranches"></div>
131
- <div class="setting-row"><label>Graph Style</label><select id="s-graphStyle"><option value="rounded">Rounded</option><option value="angular">Angular</option></select></div>
132
- <div class="setting-row"><label>First Parent Only</label><input type="checkbox" id="s-firstParentOnly"></div>
133
- <div class="setting-row"><label>Date Format</label><select id="s-dateFormat"><option value="relative">Relative</option><option value="absolute">Absolute</option><option value="iso">ISO</option></select></div>
134
- <div class="setting-row"><label>Commit Ordering</label><select id="s-commitOrdering"><option value="topo">Topological</option><option value="date">Date</option><option value="author-date">Author Date</option></select></div>
135
- <div class="setting-row"><label>Auto Fetch Interval</label><select id="s-autoFetchInterval"><option value="0">Disabled</option><option value="10">10 seconds</option><option value="30">30 seconds</option><option value="60">1 minute</option><option value="120">2 minutes</option><option value="300">5 minutes</option></select></div>
100
+ ${row("Commits per page", '<input type="number" id="s-maxCommits" min="10" max="10000" step="50">')}
101
+ ${row("Show tags", check("s-showTags"))}
102
+ ${row("Show stashes", check("s-showStashes"))}
103
+ ${row("Show remote branches", check("s-showRemoteBranches"))}
104
+ ${row("First parent only", check("s-firstParentOnly"))}
105
+ ${row("Graph style", '<select id="s-graphStyle"><option value="rounded">Rounded</option><option value="angular">Angular</option></select>')}
106
+ ${row("Dates", '<select id="s-dateFormat"><option value="relative">Relative</option><option value="absolute">Absolute</option><option value="iso">ISO</option></select>')}
107
+ ${row("Order", '<select id="s-commitOrdering"><option value="topo">Topological</option><option value="date">Commit date</option><option value="author-date">Author date</option></select>')}
108
+ ${row("Fetch automatically", '<select id="s-autoFetchInterval"><option value="0">Never</option><option value="10">Every 10 seconds</option><option value="30">Every 30 seconds</option><option value="60">Every minute</option><option value="120">Every 2 minutes</option><option value="300">Every 5 minutes</option></select>')}
136
109
  </details>
137
110
  <details class="settings-section" open>
138
111
  <summary>Columns</summary>
139
- <p style="font-size:11px;color:var(--subtext);margin-bottom:6px">Right-click the table header for the same list. A narrow panel drops the last few of its own accord, whatever is ticked here.</p>
140
- <div class="setting-row"><label>Branch / Tag</label><input type="checkbox" id="s-colRefs"></div>
141
- <div class="setting-row"><label>Changes</label><input type="checkbox" id="s-colChanges"></div>
142
- <div class="setting-row"><label>Author</label><input type="checkbox" id="s-colAuthor"></div>
143
- <div class="setting-row"><label>Date</label><input type="checkbox" id="s-colDate"></div>
144
- <div class="setting-row"><label>Hash</label><input type="checkbox" id="s-colHash"></div>
112
+ <p>The View menu has the same list. A narrow panel drops the last few by itself, whatever is ticked here.</p>
113
+ ${row("Changes", check("s-colChanges"))}
114
+ ${row("Author", check("s-colAuthor"))}
115
+ ${row("Date", check("s-colDate"))}
116
+ ${row("Hash", check("s-colHash"))}
145
117
  </details>
146
118
  <details class="settings-section" open>
147
- <summary>User Details</summary>
148
- <div class="setting-row"><label>Name</label><input type="text" id="s-userName" placeholder="user.name"></div>
149
- <div class="setting-row"><label>Email</label><input type="text" id="s-userEmail" placeholder="user.email"></div>
150
- <div class="setting-row" style="justify-content:flex-end"><button id="s-saveUser" class="btn-sm">Save User Details</button></div>
119
+ <summary>Your name and email</summary>
120
+ <p>What this repository's commits are signed with (git config user.name and user.email).</p>
121
+ ${row("Name", '<input type="text" id="s-userName" placeholder="user.name">')}
122
+ ${row("Email", '<input type="text" id="s-userEmail" placeholder="user.email">')}
123
+ <div class="setting-row"><span></span><button type="button" id="s-saveUser" class="btn xs outline">Save</button></div>
151
124
  </details>
152
125
  <details class="settings-section" open>
153
126
  <summary>Remotes</summary>
154
127
  <div id="s-remotes-list"></div>
155
128
  <div class="add-remote-form">
156
- <input type="text" id="s-newRemoteName" placeholder="Remote name">
157
- <input type="text" id="s-newRemoteUrl" placeholder="Remote URL">
158
- <button id="s-addRemote" class="btn-sm">Add Remote</button>
129
+ <input type="text" id="s-newRemoteName" placeholder="Name" aria-label="Remote name">
130
+ <input type="text" id="s-newRemoteUrl" placeholder="URL" aria-label="Remote URL">
131
+ <button type="button" id="s-addRemote" class="btn xs outline">${icon("plus", "ic-sm")}Add remote</button>
159
132
  </div>
160
133
  </details>
161
134
  <details class="settings-section">
162
- <summary>Issue Linking</summary>
163
- <p style="font-size:11px;color:var(--subtext);margin-bottom:6px">Turn issue references in commit messages into clickable links.</p>
135
+ <summary>Issue links</summary>
136
+ <p>Turn issue references in commit messages into links.</p>
164
137
  <div id="issue-rules-list"></div>
165
- <button id="add-issue-rule" class="btn-sm" style="margin-top:6px">+ Add Rule</button>
138
+ <button type="button" id="add-issue-rule" class="btn xs outline">${icon("plus", "ic-sm")}Add rule</button>
166
139
  </details>
167
140
  <details class="settings-section">
168
- <summary>Pull Request Creation</summary>
169
- <div class="setting-row"><label>Provider</label><select id="pr-provider"><option value="">Disabled</option><option value="github">GitHub</option><option value="gitlab">GitLab</option><option value="bitbucket">Bitbucket</option><option value="custom">Custom</option></select></div>
141
+ <summary>Pull requests</summary>
142
+ ${row("Provider", '<select id="pr-provider"><option value="">Off</option><option value="github">GitHub</option><option value="gitlab">GitLab</option><option value="bitbucket">Bitbucket</option><option value="custom">Custom</option></select>')}
170
143
  <div id="pr-config" class="hidden">
171
- <div class="setting-row"><label>Owner</label><input type="text" id="pr-owner" placeholder="owner or org"></div>
172
- <div class="setting-row"><label>Repo</label><input type="text" id="pr-repo" placeholder="repository name"></div>
173
- <div class="setting-row"><label>Target Branch</label><input type="text" id="pr-target" placeholder="main"></div>
174
- <div class="setting-row"><label>URL Template</label><input type="text" id="pr-url-template" placeholder="https://..."></div>
175
- <p style="font-size:10px;color:var(--subtext);margin:2px 0 4px">Variables: \${owner}, \${repo}, \${sourceBranch}, \${targetBranch}</p>
176
- <div class="setting-row" style="justify-content:flex-end"><button id="pr-save" class="btn-sm">Save PR Config</button></div>
144
+ ${row("Owner", '<input type="text" id="pr-owner" placeholder="owner or organisation">')}
145
+ ${row("Repository", '<input type="text" id="pr-repo" placeholder="repository name">')}
146
+ ${row("Target branch", '<input type="text" id="pr-target" placeholder="main">')}
147
+ ${row("Link", '<input type="text" id="pr-url-template" placeholder="https://…">')}
148
+ <p class="settings-note" id="pr-vars"></p>
149
+ <div class="setting-row"><span></span><button type="button" id="pr-save" class="btn xs outline">Save</button></div>
177
150
  </div>
178
151
  </details>
179
152
  </div>
180
- </div>
181
- <div id="status-bar">
182
- <span id="status-text">Loading repository...</span>
183
- </div>
153
+ </div>`;
154
+ }
155
+
156
+ export function getWebviewHtml(): string {
157
+ const script = [
158
+ coreScript(MESSAGE_MIN_W, GRAPH_MIN_W),
159
+ graphScript(),
160
+ listScript(),
161
+ inspectorScript(),
162
+ actionsScript(),
163
+ settingsScript(),
164
+ mainScript(),
165
+ ].join("\n");
166
+ return `<!DOCTYPE html>
167
+ <html>
168
+ <head>
169
+ <meta charset="utf-8">
170
+ <meta name="viewport" content="width=device-width, initial-scale=1">
171
+ <style>
172
+ ${graphStyles(MESSAGE_MIN_W)}
173
+ </style>
174
+ </head>
175
+ <body>
176
+ <div id="app">
177
+ ${toolbarHtml()}
178
+ <div id="op-banner" class="op-banner hidden" role="status"></div>
179
+ ${listHtml()}
180
+ <footer id="status-bar">
181
+ <span id="status-text">Loading repository…</span>
182
+ <span class="grow"></span>
183
+ <button type="button" id="btn-load-more" class="btn xs ghost hidden">Load more</button>
184
+ </footer>
184
185
  </div>
185
- <div id="context-menu" class="context-menu hidden"></div>
186
+ ${settingsHtml()}
187
+ <div id="menu-scrim" class="hidden"></div>
188
+ <div id="context-menu" class="menu hidden" role="menu"></div>
189
+ <div id="toast-host" aria-live="polite"></div>
186
190
  <script>
187
- ${getScript()}
191
+ ${script}
188
192
  </script>
189
193
  </body>
190
194
  </html>`;
191
195
  }
192
-
193
- /**
194
- * Dark values, emitted twice by design.
195
- *
196
- * The panel is a sandboxed iframe and cannot see the app's theme, so on its own
197
- * the only question it can ask is prefers-color-scheme — the *OS* setting,
198
- * which is why a light app still showed a dark graph. The host now stamps
199
- * data-ppm-theme on this document and injects the app's own tokens
200
- * (src/web/components/extensions/webview-theme.ts); the media query is the
201
- * fallback for a host that says nothing, and it must not override an explicit
202
- * light. Values are a charcoal rather than near-black so the toolbar, the list
203
- * and the banded rows read as three surfaces instead of one slab.
204
- */
205
- const DARK_TOKENS = `
206
- --bg: #16171c; --surface: #1d1f26; --text: #ecedf0; --subtext: #a2a5b0; --subtle: #6b6f7c;
207
- --border: #262932; --border2: #383c48; --selected: #1e293b;
208
- --band: color-mix(in srgb, var(--text) 6%, transparent);
209
- `;
210
-
211
- function getStyles(): string {
212
- return `
213
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
214
- :root {
215
- --bg: #ffffff; --surface: #f4f4f5; --text: #09090b; --subtext: #71717a; --subtle: #a1a1aa;
216
- --border: #e4e4e7; --border2: #d4d4d8; --blue: #3b82f6; --red: #ef4444; --green: #22c55e;
217
- --yellow: #eab308; --purple: #8b5cf6; --orange: #f97316;
218
- --selected: #eff6ff;
219
- /* Zebra banding. Stronger in dark below, because the same percentage is not
220
- equally visible in both directions: a wash of near-black over white shows
221
- up where the same lift of near-white over a near-black row does not, which
222
- is what left the list looking like one flat slab. */
223
- --band: color-mix(in srgb, var(--text) 3.5%, transparent);
224
- /* Derived, never injected: the app has no hover token and some of its themes
225
- give the same colour to both panel surfaces, which would leave a hovered
226
- row looking untouched. A tint of the text colour flips with the mode and
227
- stacks on top of the zebra banding instead of replacing it. */
228
- --surface-hover: color-mix(in srgb, var(--text) 8%, transparent);
229
- /* Width of the branch/tag column. Fixed, because the graph is one SVG overlay
230
- drawn on a single grid and it starts where this column ends. */
231
- --refs-col-w: 170px;
232
-
233
- ${FONT_TOKENS}
234
- }
235
- :root[data-ppm-theme="dark"] { ${DARK_TOKENS} }
236
- @media (prefers-color-scheme: dark) {
237
- :root:not([data-ppm-theme="light"]) { ${DARK_TOKENS} }
238
- }
239
- body { font-family: var(--ui-font); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: var(--bg); color: var(--text); font-size: 12px; overflow: hidden; height: 100vh; display: flex; flex-direction: column; }
240
- #app { display: flex; flex-direction: column; height: 100vh; }
241
-
242
- /* Toolbar */
243
- #toolbar { display: flex; justify-content: space-between; align-items: center; padding: 4px 10px; border-bottom: 1px solid var(--border); background: var(--surface); flex-shrink: 0; }
244
- .toolbar-left, .toolbar-right { display: flex; align-items: center; gap: 4px; }
245
- select { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; }
246
- button { background: transparent; color: var(--text); border: 1px solid var(--border); border-radius: 5px; padding: 3px 8px; font-size: 11px; cursor: pointer; min-width: 24px; min-height: 24px; transition: background 0.15s, border-color 0.15s; }
247
- button:hover { background: var(--surface-hover); border-color: var(--border2); }
248
- button:active { background: var(--surface); }
249
- .btn-fetching { opacity: 0.6; pointer-events: none; }
250
-
251
- /* Branch dropdown */
252
- .branch-dropdown { position: relative; }
253
- .branch-trigger { background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: 5px; padding: 3px 22px 3px 7px; font-size: 11px; cursor: pointer; min-width: 120px; text-align: left; position: relative; }
254
- .branch-trigger::after { content: '\\25BC'; font-size: 8px; position: absolute; right: 8px; top: 50%; transform: translateY(-50%); color: var(--subtext); }
255
- .branch-dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 6px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 220px; max-height: 300px; display: flex; flex-direction: column; margin-top: 2px; }
256
- .branch-filter-input { padding: 4px 7px; border: none; border-bottom: 1px solid var(--border); background: var(--bg); color: var(--text); font-size: 11px; outline: none; border-radius: 5px 5px 0 0; }
257
- .branch-list { overflow-y: auto; max-height: 250px; }
258
- .branch-option { padding: 4px 8px; cursor: pointer; font-size: 11px; display: flex; align-items: center; gap: 5px; }
259
- .branch-option:hover { background: var(--surface-hover); }
260
- .branch-option.selected { background: var(--selected); font-weight: 600; }
261
-
262
- /* Worktree popover */
263
- .worktree-dropdown { position: relative; }
264
- #btn-worktree { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
265
- #btn-worktree .wt-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
266
- .worktree-popover { position: absolute; top: 100%; right: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,0.2); min-width: 300px; max-width: 400px; margin-top: 4px; display: flex; flex-direction: column; }
267
- .worktree-popover-header { padding: 8px 12px; font-size: 12px; font-weight: 600; border-bottom: 1px solid var(--border); }
268
- .worktree-list { overflow-y: auto; max-height: 240px; }
269
- .wt-item { padding: 8px 12px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; }
270
- .wt-item:last-child { border-bottom: none; }
271
- .wt-item-info { flex: 1; min-width: 0; }
272
- .wt-item-branch { font-weight: 600; display: flex; align-items: center; gap: 4px; }
273
- .wt-item-path { font-size: 10px; color: var(--subtext); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
274
- .wt-badge { font-size: 9px; padding: 1px 4px; border-radius: 4px; background: var(--border); color: var(--subtext); }
275
- .wt-badge-current { background: var(--accent, #58a6ff); color: #fff; }
276
- .wt-item-active { background: var(--selected); }
277
- .wt-badge-locked { background: #d29922; color: #fff; }
278
- .wt-item-actions { display: flex; gap: 4px; flex-shrink: 0; }
279
- .wt-item-actions button { min-width: 24px; min-height: 24px; padding: 2px 6px; font-size: 10px; }
280
- .worktree-popover-footer { padding: 8px 12px; border-top: 1px solid var(--border); display: flex; gap: 6px; }
281
- .worktree-popover-footer .btn-sm { flex: 1; }
282
- .wt-empty { padding: 16px; text-align: center; font-size: 11px; color: var(--subtext); }
283
-
284
- /* Submodules reuse the worktree popover chrome; only the badges differ. */
285
- .submodule-dropdown { position: relative; }
286
- #btn-submodule { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
287
- #btn-submodule .sm-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
288
- .sm-badge-uninitialized { background: var(--border); color: var(--subtext); }
289
- .sm-badge-modified { background: #d29922; color: #fff; }
290
- .sm-badge-conflicted { background: #f85149; color: #fff; }
291
- @media (max-width: 768px) { .branch-option { padding: 10px 12px; min-height: 44px; } }
292
-
293
- /* Stash popover */
294
- .stash-dropdown { position: relative; }
295
- #btn-stash { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 3px 6px; }
296
- #btn-stash .stash-count { background: var(--accent, #58a6ff); color: #fff; font-size: 9px; border-radius: 7px; padding: 0 4px; min-width: 14px; text-align: center; line-height: 14px; }
297
- .stash-popover { position: absolute; top: 100%; right: 0; z-index: 60; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,0.2); min-width: 300px; max-width: 400px; margin-top: 4px; display: flex; flex-direction: column; }
298
- .stash-popover-header { padding: 8px 12px; font-size: 12px; font-weight: 600; border-bottom: 1px solid var(--border); }
299
- .stash-list { overflow-y: auto; max-height: 240px; }
300
- .stash-item { padding: 8px 12px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; }
301
- .stash-item:last-child { border-bottom: none; }
302
- .stash-item-info { flex: 1; min-width: 0; }
303
- .stash-item-ref { font-weight: 600; font-size: 11px; color: var(--subtext); }
304
- .stash-item-msg { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
305
- .stash-item-actions { display: flex; gap: 4px; flex-shrink: 0; }
306
- .stash-item-actions button { min-width: 24px; min-height: 24px; padding: 2px 6px; font-size: 10px; }
307
- .stash-empty { padding: 16px; text-align: center; font-size: 11px; color: var(--subtext); }
308
- .stash-popover-footer { padding: 8px 12px; border-top: 1px solid var(--border); display: flex; gap: 6px; }
309
- .stash-popover-footer .btn-sm { flex: 1; }
310
-
311
- /* Merge/rebase banner */
312
- .merge-banner { padding: 8px 12px; background: rgba(133, 77, 14, 0.12); border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; font-size: 12px; flex-shrink: 0; }
313
- .merge-banner .banner-icon { color: #eab308; }
314
- .merge-banner .banner-text { flex: 1; }
315
- .merge-banner .banner-actions { display: flex; gap: 4px; }
316
- .merge-banner .banner-actions button { font-size: 11px; padding: 2px 8px; }
317
- .merge-banner .btn-continue { background: var(--green); color: #fff; border-color: transparent; }
318
- .merge-banner .btn-abort { background: var(--red); color: #fff; border-color: transparent; }
319
-
320
- /* Conflict section */
321
- .conflict-header { padding: 4px 0; font-size: 12px; font-weight: 600; color: var(--red); display: flex; align-items: center; gap: 4px; }
322
- .file-status-U { color: var(--red); font-weight: bold; }
323
-
324
- /* Find bar */
325
- .find-bar { display: flex; align-items: center; gap: 5px; padding: 4px 10px; border-bottom: 1px solid var(--border); background: var(--surface); }
326
- .find-bar input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; }
327
- .find-bar input:focus { outline: none; border-color: var(--blue); }
328
- #find-count { font-size: 10px; color: var(--subtext); min-width: 50px; }
329
- .hidden { display: none !important; }
330
-
331
- /* Graph container. The scroller is wrapped, because the scroll markers have to
332
- sit beside it in a box that does not scroll with the rows. */
333
- #graph-area { position: relative; flex: 1; min-height: 0; display: flex; }
334
- #graph-container { flex: 1; min-width: 0; overflow-y: auto; overflow-x: hidden; }
335
- /* Where in the whole history the things worth scrolling to are: the checked-out
336
- commit, the selected row, and every search match. Over the scrollbar, like
337
- VS Code's own overview ruler, and never clickable — dragging the scrollbar
338
- underneath has to keep working. */
339
- #scroll-markers { position: absolute; right: 0; top: 0; bottom: 0; width: 5px; pointer-events: none; z-index: 3; }
340
- .scroll-marker { position: absolute; right: 0; width: 5px; height: 2px; border-radius: 1px; transform: translateY(-50%); }
341
- .sm-search { background: var(--yellow); }
342
- .sm-head { background: var(--green); height: 3px; }
343
- .sm-selected { background: var(--blue); height: 3px; }
344
- .commit-row { display: flex; align-items: center; cursor: pointer; height: 30px; padding: 0 6px; font-size: 12px; box-sizing: border-box; overflow: hidden; }
345
- /* Banding, before the hover and selected rules on purpose: it has the same
346
- specificity as they do, so source order is what decides the winner. Do not
347
- qualify it with #commit-list — an id would raise it above both of them and
348
- every other row would stop showing hover and selection. The header row is a
349
- .commit-row too but is the first child of its own parent, so it is odd. */
350
- .commit-row:nth-child(even) { background: var(--band); }
351
- .commit-row:hover { background: var(--surface-hover); }
352
- .commit-row.header-row { background: var(--surface); cursor: default; font-weight: 600; font-size: 10px; color: var(--subtext); text-transform: uppercase; letter-spacing: 0.5px; position: sticky; top: 0; z-index: 2; border-bottom: 1px solid var(--border); height: 24px; }
353
- .commit-row.header-row .col-message::before { display: none; }
354
- /* A tint and a bar, not a flood: with fifteen rows on screen a 15% yellow
355
- wash over half of them buried the list it was meant to annotate. The
356
- scroll markers carry where the rest of the matches are. */
357
- .commit-row.search-match { background: color-mix(in srgb, var(--yellow) 9%, transparent); box-shadow: inset 2px 0 0 var(--yellow); }
358
- /* After the match rule on purpose: the row you clicked should look selected,
359
- even when it is also a match. Which of the two it is stays visible in the
360
- find bar's count and in the scroll markers. */
361
- .commit-row.selected { background: var(--selected); box-shadow: inset 2px 0 0 var(--blue); }
362
- .commit-row.virtual { opacity: 0.85; font-style: italic; }
363
- .commit-row.virtual .col-message { color: var(--subtext); }
364
- .commit-row.stash-row { opacity: 0.75; }
365
- .commit-row.stash-row .col-message { color: var(--subtext); font-style: italic; }
366
- .file-clickable { cursor: pointer; border-radius: 3px; padding: 2px 4px; margin: 0 -4px; }
367
- .file-clickable:hover { background: var(--surface-hover); }
368
- /* Refs get a column of their own so every message starts at the same x — a
369
- branch badge pushing the text right was most of why the list read as ragged.
370
- The width has to be fixed rather than content-sized: rows are separate flex
371
- containers, so an auto width would put each row's graph at a different x, and
372
- the graph is one SVG overlay drawn on a single grid. */
373
- .col-refs { width: var(--refs-col-w, 170px); min-width: var(--refs-col-w, 170px); flex-shrink: 0; overflow: hidden; white-space: nowrap; display: flex; align-items: center; justify-content: flex-end; gap: 3px; padding-right: 6px; }
374
- .col-refs .ref-badge { min-width: 0; overflow: hidden; text-overflow: ellipsis; margin-right: 0; }
375
- .col-graph { width: var(--graph-col-w, 120px); min-width: var(--graph-col-w, 80px); overflow: hidden; flex-shrink: 0; position: relative; }
376
- .graph-resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 6px; cursor: col-resize; z-index: 3; background: transparent; }
377
- .graph-resize-handle:hover, .graph-resize-handle.dragging { background: var(--blue); opacity: 0.5; }
378
- /* Panning the graph is a drag on the graph itself, so there is no scrollbar in
379
- the table taking a row of its own — a real one cannot go on the overlay,
380
- which is as tall as the whole history, and in a 24px header row the thumb
381
- lands across the word "Graph". What is left is a hint: where in the lanes the
382
- column currently is, shown while a drag or a wheel is moving it and faded out
383
- after. It is positioned over the graph area rather than inside the scroller,
384
- so it neither scrolls away nor displaces a row. */
385
- /* A row's graph cell is an empty spacer, and the row centres its cells — so
386
- without this it is 0px tall and the pointer that looks like it is on the
387
- graph is really on the row behind it, which is what decides whether a drag
388
- pans or selects a commit. Not the header's cell: that one has a label in it,
389
- and stretching it takes the label off the line the other headings sit on. */
390
- .commit-row:not(.header-row) .col-graph { align-self: stretch; touch-action: pan-y; }
391
- :root.graph-can-pan .commit-row:not(.header-row) .col-graph { cursor: grab; }
392
- :root.graph-panning .commit-row:not(.header-row) .col-graph { cursor: grabbing; }
393
- #graph-pan-bar { position: absolute; z-index: 4; bottom: 6px; left: calc(var(--refs-col-w, 170px) + 6px); width: var(--graph-col-w, 120px); height: 4px; border-radius: 2px; background: color-mix(in srgb, var(--text) 10%, transparent); opacity: 0; transition: opacity 0.4s ease; pointer-events: none; }
394
- #graph-pan-bar.visible { opacity: 1; transition-duration: 0.1s; }
395
- #graph-pan-thumb { position: absolute; top: 0; bottom: 0; border-radius: 2px; background: var(--subtext); }
396
- /* The message never shrinks past a readable measure. Every other column is
397
- either fixed or hidden by the width tiers, so without a floor here this one
398
- absorbs the whole shortfall and disappears. */
399
- .col-message { flex: 1; min-width: ${MESSAGE_MIN_W}px; padding: 0 6px 0 12px; position: relative; display: flex; flex-direction: column; justify-content: center; align-self: stretch; overflow: hidden; }
400
- /* The lane's colour, restated where the eye reads the message. The row centres
401
- its cells, so this one has to stretch or the tick has nothing to span. */
402
- .col-message::before { content: ''; position: absolute; left: 3px; top: 7px; bottom: 7px; width: 2px; border-radius: 1px; background: var(--lane, transparent); opacity: 0.65; }
403
- .msg-subject { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
404
- /* Author, date and hash again, for the phone layout that has no room for their
405
- columns. Hidden until that layout asks for it. */
406
- .msg-meta { display: none; }
407
- /* Lines added and removed. Tabular figures so the columns of digits line up
408
- down the list rather than jittering with the glyph widths. */
409
- .col-changes { width: 84px; min-width: 84px; flex-shrink: 0; font-size: 11px; font-variant-numeric: tabular-nums; display: flex; align-items: center; gap: 5px; }
410
- .col-changes .ch-add { color: var(--green); }
411
- .col-changes .ch-del { color: var(--red); }
412
- .col-author { width: 130px; min-width: 130px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--subtext); font-size: 11px; }
413
- .avatar { width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 7px; font-weight: 700; color: #fff; flex-shrink: 0; letter-spacing: -0.2px; }
414
-
415
- /* Author hover card */
416
- .author-card { position: fixed; z-index: 80; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 6px 20px rgba(0,0,0,0.25); padding: 8px 10px; font-size: 11px; max-width: 280px; pointer-events: none; }
417
- .author-card .ac-head { display: flex; align-items: center; gap: 6px; font-weight: 600; margin-bottom: 4px; }
418
- .author-card .ac-row { color: var(--subtext); font-size: 10px; }
419
-
420
- /* Drag a ref badge onto a commit row to merge or rebase onto it */
421
- .ref-badge[draggable=true] { cursor: grab; }
422
- .commit-row.drop-target { outline: 2px dashed var(--blue); outline-offset: -2px; background: var(--selected); }
423
- .ref-badge.dragging { opacity: 0.45; }
424
-
425
- /* Whole-history search results */
426
- .search-results { position: absolute; top: 56px; left: 8px; right: 8px; max-height: 55vh; z-index: 45; background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,0.25); overflow: auto; }
427
- .sr-head { padding: 6px 10px; font-size: 10px; color: var(--subtext); border-bottom: 1px solid var(--border); position: sticky; top: 0; background: var(--surface); }
428
- .sr-item { padding: 6px 10px; border-bottom: 1px solid var(--border); cursor: pointer; }
429
- .sr-item:hover { background: var(--surface-hover); }
430
- .sr-subject { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
431
- .sr-meta { font-size: 10px; color: var(--subtext); display: flex; gap: 6px; align-items: center; margin-top: 2px; }
432
- .sr-hash { font-family: var(--mono-font); }
433
- .col-date { width: 80px; min-width: 80px; color: var(--subtext); font-size: 11px; }
434
- .col-hash { width: 60px; min-width: 60px; font-family: var(--mono-font); font-size: 10px; color: var(--subtle); }
435
-
436
- /* Columns the reader turned off, from the header's context menu or from
437
- Settings. Declared after :root so the refs variable — which is where the
438
- graph overlay starts, not just how wide a cell is — loses to this one on
439
- source order; the two have the same specificity. */
440
- .cols-no-refs { --refs-col-w: 0px; }
441
- .cols-no-refs .col-refs { display: none; }
442
- .cols-no-changes .col-changes { display: none; }
443
- .cols-no-author .col-author { display: none; }
444
- .cols-no-date .col-date { display: none; }
445
- .cols-no-hash .col-hash { display: none; }
446
-
447
- /* Ref badges — border + tinted bg + dark text */
448
- .ref-badge { display: inline-flex; align-items: center; gap: 3px; padding: 0px 5px; border-radius: 3px; font-size: 9px; font-weight: 600; margin-right: 3px; vertical-align: middle; line-height: 16px; border: 1px solid; color: #1a1a1a; }
449
- .ref-head { border-color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
450
- .ref-local { border-color: var(--blue); background: color-mix(in srgb, var(--blue) 12%, transparent); }
451
- .ref-remote { border-color: var(--purple); background: color-mix(in srgb, var(--purple) 12%, transparent); }
452
- .ref-tag { border-color: var(--yellow); background: color-mix(in srgb, var(--yellow) 12%, transparent); }
453
- .ref-stash { border-color: #808080; background: color-mix(in srgb, #808080 12%, transparent); }
454
- :root[data-ppm-theme="dark"] .ref-badge { color: #e4e4e7; }
455
- @media (prefers-color-scheme: dark) {
456
- :root:not([data-ppm-theme="light"]) .ref-badge { color: #e4e4e7; }
457
- }
458
-
459
- /* SVG graph — single SVG overlay.
460
- The clip box is what keeps the overlay inside its column: the SVG is drawn at
461
- whatever width the lanes need, which in a repository with enough parallel
462
- branches is wider than the panel. Unclipped it paints over the message,
463
- changes and author columns — it is positioned and they are not, so it wins
464
- the paint order — and capping the column without clipping only trades a
465
- missing message for one with branch lines drawn through it. What the clip
466
- hides is reached by panning: --graph-pan-x, driven by a drag on the graph. */
467
- #commit-list-wrapper { position: relative; }
468
- #graph-clip { position: absolute; top: 0; left: calc(var(--refs-col-w, 170px) + 6px); width: var(--graph-col-w, 120px); height: 100%; overflow: hidden; z-index: 1; pointer-events: none; }
469
- /* The clip box starts where the graph cell starts — 6px being the row's own
470
- padding — and the drawing keeps the 2px it always had inside it. Written the
471
- other way round, as one offset of 8px on the box, the box ends 2px past its
472
- column and the first pixels of the message have a branch line through them. */
473
- #graph-svg-container { position: absolute; top: 0; left: 2px; transform: translateX(calc(-1 * var(--graph-pan-x, 0px))); }
474
- #graph-svg-container circle { pointer-events: auto; cursor: pointer; }
475
- #graph-svg-container .line { stroke-width: 2; fill: none; }
476
- /* The checked-out commit wears a thicker ring rather than a different shape,
477
- so it still reads as the same kind of thing as every row above it. */
478
- #graph-svg-container .graphCurrent { stroke-width: 3.5; }
479
- #graph-svg-container .node-initials { font-size: 8px; font-weight: 700; fill: #fff; pointer-events: none; user-select: none; letter-spacing: -0.3px; }
480
- .commit-row.graph-hover { background: var(--surface-hover); }
481
-
482
- /* Detail panel. The panel itself carries no padding, because the header is a
483
- full-width sticky bar and each pane below it pads itself; anything else
484
- written into the panel wraps itself in .detail-pad. */
485
- .detail-panel { border-top: 1px solid var(--border2); background: var(--surface); max-height: 40vh; overflow-y: auto; flex-shrink: 0; }
486
- .detail-panel h3 { font-size: 13px; margin-bottom: 6px; }
487
- .detail-pad { padding: 8px 12px; }
488
-
489
- .detail-head { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-bottom: 1px solid var(--border); background: var(--surface); position: sticky; top: 0; z-index: 2; flex-shrink: 0; }
490
- .detail-head .avatar { width: 20px; height: 20px; font-size: 8px; }
491
- .detail-who { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
492
- .detail-author { font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
493
- .detail-when { font-size: 11px; color: var(--subtext); white-space: nowrap; }
494
- .detail-head-actions { margin-left: auto; display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
495
-
496
- /* The panel's only dismiss. Escape closes it too, but a touch screen has no
497
- Escape key, so a panel opened by a tap could not be put away at all — it
498
- sits over a third of the graph until another commit is tapped. It took the
499
- place of the two hash chips, which were a convenience: the metadata grid
500
- two lines below carries the hash and the parents in full.
501
-
502
- It stays 24px of ink on every device. The generic pointer: coarse button rule
503
- further down took it to 32, which is still under the 44 a finger needs, and
504
- growing the button itself would grow the header with it - this sits in a
505
- sticky bar above a panel that is already capped at 35vh on a phone. So the
506
- tap area grows instead, through an invisible overlay, which is the same thing
507
- the app does for its own 20px controls. Nothing else lives in
508
- .detail-head-actions, and what it reaches on the left is the committed-when
509
- text, which is not clickable. */
510
- .detail-close { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 0; border: none; border-radius: 5px; background: none; color: var(--subtext); }
511
- .detail-close:hover { background: var(--surface-hover); color: var(--text); }
512
-
513
- /* Two columns when there is room. A commit message is hard-wrapped by whoever
514
- wrote it, so on a wide panel it fills half the width and the rest of the row
515
- is empty; the file list goes there instead of below the fold. Each pane pads
516
- itself, because above the breakpoint each one also scrolls itself. */
517
- .detail-grid { display: grid; grid-template-columns: minmax(0, 1fr); }
518
- .detail-msg { padding: 12px 16px 16px; min-width: 0; }
519
- .detail-files { padding: 8px 12px 12px; min-width: 0; }
520
- /* Full hashes, both emails and both dates, in a label/value grid. One rule
521
- under it separates the provenance from the message; the subject carries none
522
- of its own, because two hairlines in a 360px panel is a lot of furniture and
523
- 14px semibold against 11.5px monospace already reads as two things. The rule
524
- belongs here rather than to the body, which is capped at a readable measure
525
- and would stop the border short of the pane for no visible reason. */
526
- .detail-meta { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 5px 14px; align-items: baseline; font-size: 11.5px; margin-bottom: 14px; padding-bottom: 13px; border-bottom: 1px solid var(--border); }
527
- .meta-label { color: var(--subtext); font-size: 11.5px; white-space: nowrap; }
528
- .meta-cells { display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 14px; min-width: 0; }
529
- .meta-value { min-width: 0; overflow-wrap: anywhere; cursor: pointer; }
530
- .meta-value.mono { font-family: var(--mono-font); font-size: 11.5px; color: var(--subtext); }
531
- /* The eight characters that identify the commit carry the contrast; the other
532
- thirty-two are there to be copied, not read. */
533
- .hash-lead { color: var(--text); font-weight: 600; }
534
- .meta-name { color: var(--text); }
535
- .meta-email { color: var(--subtext); margin-left: 6px; }
536
- .meta-value:hover .hash-lead, .meta-value:hover .meta-name, .meta-value:hover .meta-email { color: var(--blue); }
537
- .meta-value:hover { color: var(--blue); }
538
- .meta-value.copied, .meta-value.copied .hash-lead, .meta-value.copied .meta-name, .meta-value.copied .meta-email { color: var(--green); }
539
- .meta-value.copy-failed, .meta-value.copy-failed .hash-lead, .meta-value.copy-failed .meta-name, .meta-value.copy-failed .meta-email { color: var(--red); }
540
- .meta-when { color: var(--subtext); font-variant-numeric: tabular-nums; }
541
- .detail-subject { font-size: 15px; font-weight: 600; line-height: 1.4; letter-spacing: -0.1px; }
542
-
543
- /* The body. A paragraph its author wrapped at 72 columns is set as prose in the
544
- UI font and reflowed to the pane it is actually in — verbatim monospace gave
545
- a ragged half-filled column of the wrong width. A list or an aligned block is
546
- not reflowable and keeps its breaks and its monospace; splitCommitBody
547
- decides which is which. */
548
- .detail-text { margin-top: 13px; }
549
- .msg-p { font-size: 13px; line-height: 1.7; max-width: 68ch; }
550
- .msg-pre { font-family: var(--mono-font); font-size: 12px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }
551
- /* The reset zeroes every margin, so the space between paragraphs is set here
552
- rather than inherited from the browser's default for a p element. */
553
- .msg-p + .msg-p, .msg-p + .msg-pre, .msg-pre + .msg-p, .msg-pre + .msg-pre { margin-top: 13px; }
554
-
555
- /* One scrollbar per pane above the breakpoint. A long message and a long file
556
- list are two lists of unrelated length, and scrolling the pair as one means
557
- reaching the twentieth file by pushing the message off the screen. Below it
558
- they are stacked, and two scrollers inside one short panel is a trap for a
559
- thumb — so there the panel scrolls as a whole, as it always did. */
560
- @media (min-width: 900px) {
561
- .detail-panel.split { display: flex; flex-direction: column; overflow: hidden; }
562
- .detail-grid.has-files { grid-template-columns: minmax(0, 1fr) minmax(260px, 38%); }
563
- .detail-panel.split .detail-grid { flex: 1 1 auto; min-height: 0; }
564
- .detail-panel.split .detail-grid > * { overflow-y: auto; overscroll-behavior: contain; min-height: 0; }
565
- .detail-panel.split .detail-files { border-left: 1px solid var(--border); padding-top: 0; }
566
- /* The pane's own top padding would sit above a sticky header, leaving a strip
567
- for rows to scroll through; the header carries that space instead. */
568
- .detail-panel.split .files-head { position: sticky; top: 0; background: var(--surface); z-index: 1; padding: 8px 0 3px; }
569
- }
570
-
571
- .file-list { margin-top: 8px; min-width: 0; }
572
- .detail-files .file-list { margin-top: 0; }
573
- .files-head { display: flex; align-items: center; gap: 8px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--subtext); border-bottom: 1px solid var(--border); margin-bottom: 3px; }
574
- .files-head .file-view-toggle { margin-bottom: 0; }
575
- .files-total { margin-left: auto; font-family: var(--mono-font); font-size: 10px; letter-spacing: 0; text-transform: none; font-variant-numeric: tabular-nums; }
576
- .files-total .add { color: var(--green); }
577
- .files-total .del { color: var(--red); }
578
-
579
- .file-item { display: flex; align-items: center; gap: 6px; padding: 2px 4px; border-radius: 4px; font-size: 11px; font-family: var(--mono-font); min-width: 0; }
580
- .file-item.file-clickable { cursor: pointer; }
581
- .file-item.file-clickable:hover { background: var(--surface-hover); }
582
- /* Name first, then the directory it is in: the column is narrow, so what has
583
- to survive the ellipsis is the file name. */
584
- .file-item .file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 60%; }
585
- /* The directory takes the slack, which is what leaves the stats and the row's
586
- buttons together at the right edge instead of both claiming the same auto
587
- margin and meeting somewhere in the middle. */
588
- .file-item .file-dir { color: var(--subtle); font-size: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 1 1 auto; }
589
- .file-status { display: inline-block; width: 14px; text-align: center; font-weight: 700; font-size: 10px; }
590
- .file-status-A { color: var(--green); }
591
- .file-status-M { color: var(--yellow); }
592
- .file-status-D { color: var(--red); }
593
- .file-status-R { color: var(--blue); }
594
- .file-stat { color: var(--subtext); font-size: 11px; margin-left: auto; }
595
- .file-stat .add { color: var(--green); }
596
- .file-stat .del { color: var(--red); }
597
-
598
- /* File view toggle */
599
- .file-view-toggle { display: flex; gap: 2px; margin-bottom: 6px; }
600
- .toggle-btn { padding: 2px 6px; font-size: 12px; min-width: 28px; min-height: 28px; border: 1px solid var(--border); border-radius: 4px; background: transparent; cursor: pointer; }
601
- .toggle-btn.active { background: var(--surface-hover); border-color: var(--border2); }
602
- .tree-dir { display: flex; align-items: center; gap: 4px; padding: 2px 0; font-size: 12px; color: var(--subtext); }
603
- .tree-dir-name { font-weight: 500; color: var(--text); }
604
- .tree-dir-count { font-size: 11px; color: var(--subtle); }
605
-
606
- /* File actions */
607
- .file-actions { display: flex; gap: 2px; margin-left: 6px; flex-shrink: 0; }
608
- .file-action-btn { min-width: 24px; min-height: 24px; padding: 0 4px; border: none; background: transparent; cursor: pointer; border-radius: 4px; font-size: 12px; color: var(--subtext); display: flex; align-items: center; justify-content: center; }
609
- .file-action-btn:hover { background: var(--surface-hover); color: var(--text); }
610
- .file-action-btn[data-action="discard"]:hover { color: var(--red); }
611
- .section-actions { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
612
- .commit-section { margin-top: 12px; border-top: 1px solid var(--border); padding-top: 12px; }
613
- .commit-section textarea { width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 6px; padding: 8px; font-size: 12px; font-family: inherit; resize: vertical; min-height: 60px; }
614
- .commit-section textarea:focus { outline: none; border-color: var(--blue); }
615
- .commit-actions { display: flex; justify-content: flex-end; margin-top: 6px; gap: 6px; }
616
- .btn-commit { background: var(--green); color: #fff; border-color: transparent; padding: 4px 16px; font-weight: 600; }
617
- .btn-commit:disabled { opacity: 0.4; cursor: not-allowed; }
618
- .btn-commit:hover:not(:disabled) { opacity: 0.9; }
619
- @media (max-width: 768px) { .file-action-btn { min-width: 36px; min-height: 36px; } }
620
-
621
- /* Status bar */
622
- #status-bar { display: flex; align-items: center; padding: 4px 12px; border-top: 1px solid var(--border); background: var(--surface); font-size: 11px; color: var(--subtext); flex-shrink: 0; }
623
-
624
- /* Context menu */
625
- .context-menu { position: fixed; background: var(--surface); border: 1px solid var(--border2); border-radius: 6px; padding: 4px 0; min-width: 180px; z-index: 100; box-shadow: 0 4px 12px rgba(0,0,0,0.15); }
626
- .ctx-item { padding: 6px 12px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 8px; }
627
- .ctx-item:hover { background: var(--surface-hover); }
628
- .ctx-item.destructive { color: var(--red); }
629
- /* A column of its own for the tick, so a list of toggles does not shift
630
- sideways as they are ticked and unticked. */
631
- .ctx-tick { width: 12px; flex-shrink: 0; color: var(--blue); }
632
- .ctx-item.disabled { opacity: 0.5; cursor: default; }
633
- .ctx-item.disabled:hover { background: transparent; }
634
- .ctx-separator { border-top: 1px solid var(--border); margin: 4px 0; }
635
-
636
- /* Loading */
637
- .loading { text-align: center; padding: 16px; color: var(--subtext); }
638
-
639
- /* Settings panel */
640
- .settings-panel { position: absolute; right: 0; top: 0; bottom: 0; width: 340px; background: var(--surface); border-left: 1px solid var(--border2); z-index: 50; overflow-y: auto; transform: translateX(100%); transition: transform 0.2s ease; display: flex; flex-direction: column; }
641
- .settings-panel.open { transform: translateX(0); }
642
- .settings-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
643
- .settings-header h3 { font-size: 14px; font-weight: 600; }
644
- .settings-body { flex: 1; overflow-y: auto; padding: 8px 0; }
645
- .settings-section { border-bottom: 1px solid var(--border); padding: 8px 14px; }
646
- .settings-section summary { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--subtext); cursor: pointer; padding: 4px 0; user-select: none; }
647
- .settings-section[open] summary { margin-bottom: 6px; }
648
- .setting-row { display: flex; align-items: center; justify-content: space-between; padding: 5px 0; font-size: 12px; gap: 8px; }
649
- .setting-row label { flex: 1; min-width: 0; }
650
- .setting-row input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--blue); flex-shrink: 0; }
651
- .setting-row input[type="number"] { width: 72px; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; }
652
- .setting-row select { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; min-width: 100px; }
653
- .setting-row input[type="text"] { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 12px; }
654
- .btn-sm { font-size: 11px; padding: 3px 10px; border-radius: 6px; min-width: 0; min-height: 0; }
655
- .remote-item { padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 12px; }
656
- .remote-item:last-child { border-bottom: none; }
657
- .remote-item .remote-name { font-weight: 600; margin-bottom: 2px; }
658
- .remote-item .remote-url { color: var(--subtext); font-family: var(--mono-font); font-size: 11px; word-break: break-all; }
659
- .remote-actions { display: flex; gap: 4px; margin-top: 4px; }
660
- .add-remote-form { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
661
- .add-remote-form input { background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 4px 6px; font-size: 12px; }
662
- .issue-rule-row { display: flex; gap: 4px; align-items: center; margin-bottom: 4px; }
663
- .issue-rule-row input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 3px 6px; font-size: 11px; font-family: var(--mono-font); }
664
- .issue-rule-row input.rule-error { border-color: var(--red); }
665
- .issue-rule-row .rule-remove { min-width: 24px; min-height: 24px; padding: 0; font-size: 14px; color: var(--red); border: none; }
666
- @media (max-width: 768px) { .settings-panel { width: 100%; } }
667
-
668
- /* Dialog overlay */
669
- .dialog-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 200; display: flex; align-items: center; justify-content: center; }
670
- .dialog { background: var(--surface); border: 1px solid var(--border2); border-radius: 8px; padding: 16px; min-width: 300px; max-width: 400px; box-shadow: 0 8px 24px rgba(0,0,0,0.2); }
671
- .dialog h3 { font-size: 14px; margin-bottom: 12px; }
672
- .dialog p { font-size: 12px; color: var(--subtext); margin-bottom: 12px; }
673
- .dialog p.warning { color: var(--red); font-weight: 600; }
674
- .dialog input, .dialog select { width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--border2); border-radius: 4px; padding: 6px 8px; font-size: 12px; margin-bottom: 12px; }
675
- .dialog input:focus, .dialog select:focus { outline: none; border-color: var(--blue); }
676
- .dialog-actions { display: flex; justify-content: flex-end; gap: 8px; }
677
- .dialog-actions button { min-width: 64px; }
678
- .dialog-actions .btn-primary { background: var(--blue); color: #fff; border-color: transparent; }
679
- .dialog-actions .btn-danger { background: var(--red); color: #fff; border-color: transparent; }
680
-
681
- /* Links in commit messages */
682
- .commit-link { color: var(--blue); text-decoration: none; cursor: pointer; }
683
- .commit-link:hover { text-decoration: underline; }
684
-
685
- /* Toast notifications */
686
- .toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); padding: 8px 16px; border-radius: 6px; font-size: 12px; z-index: 300; animation: toast-in 0.3s ease; max-width: 80%; pointer-events: none; }
687
- .toast-error { background: var(--red); color: #fff; }
688
- .toast-success { background: var(--green); color: #fff; }
689
- .toast-info { background: var(--blue); color: #fff; }
690
- @keyframes toast-in { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }
691
-
692
- /* Touch devices — compact mobile layout */
693
- @media (pointer: coarse) {
694
- .commit-row { height: 32px; }
695
- .ctx-item { padding: 8px 12px; min-height: 36px; }
696
- button { min-width: 32px; min-height: 32px; padding: 2px 6px; }
697
- /* The one way out of the detail panel, and the only place 32 is not enough:
698
- a phone has no Escape key, so a panel opened by a tap is closed by this
699
- button or not at all. 10px each side takes the 24px box to 44, and the 32px
700
- the rule above gives it to 52. */
701
- .detail-close::before { content: ''; position: absolute; inset: -10px; }
702
- #app { flex-direction: column; }
703
- #toolbar { order: 10; border-bottom: none; border-top: 1px solid var(--border); padding: 2px 6px; }
704
- #toolbar button { font-size: 10px; }
705
- .branch-trigger { font-size: 10px !important; padding: 2px 6px !important; }
706
- #graph-area { order: 1; }
707
- /* A safety net, not the layout: the width tiers below are what make the row
708
- fit. This only means that a row which still does not fit — every optional
709
- column switched back on in a small panel — can be reached by scrolling
710
- rather than clipped away. */
711
- #graph-container { overflow-x: auto; overflow-y: auto; }
712
- #find-bar { order: 0; }
713
- #status-bar { order: 9; }
714
- .commit-row.header-row { min-height: 20px; }
715
- .detail-panel { order: 8; max-height: 35vh; }
716
- }
717
- /* Width tiers. Columns leave in order of how little they carry, so that the
718
- graph and the message keep their room instead of the message paying for
719
- everything. They apply to every pointer type: a tablet held in portrait is
720
- as narrow as the window a mouse drags to half the screen, and one layout for
721
- a width is one thing to reason about. The user's own column choices (the
722
- header's context menu) decide what is shown when there IS room; these decide
723
- what there is room for. */
724
- @media (max-width: 900px) {
725
- .col-date, .col-hash { display: none; }
726
- }
727
- @media (max-width: 760px) {
728
- .col-changes { display: none; }
729
- }
730
- /* Phone layout: the graph and the message, with author/date/hash under the
731
- subject. Six columns of fragments is not a list of commits, and 44px is the
732
- minimum touch target this row has to be anyway. isNarrowLayout() in the
733
- script uses this same 640px, because it decides where the ref badges go. */
734
- @media (max-width: 640px) {
735
- :root { --refs-col-w: 0px; }
736
- /* The floor the wide layout keeps for the message is the whole row here, and
737
- a floor wider than the panel is what makes a row overflow its own box. */
738
- .col-message { min-width: 0; }
739
- .commit-row { height: 44px; }
740
- .commit-row.header-row { height: 24px; }
741
- .col-refs, .col-changes, .col-author, .col-date, .col-hash { display: none; }
742
- .col-message { gap: 1px; }
743
- .msg-meta { display: block; font-size: 10px; color: var(--subtext); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
744
- .col-message .ref-badge { max-width: 90px; overflow: hidden; text-overflow: ellipsis; }
745
- }
746
- `;
747
- }
748
-
749
- function getScript(): string {
750
- return `
751
- const vscode = acquireVsCodeApi();
752
- const SVG_NS = 'http://www.w3.org/2000/svg';
753
- const NULL_VERTEX_ID = -1;
754
- const GRAPH_COLORS = ['#4ec9b0','#569cd6','#c586c0','#ce9178','#dcdcaa','#4fc1ff','#d7ba7d','#9cdcfe','#b5cea8','#d16969'];
755
- const graphConfig = {
756
- colours: GRAPH_COLORS,
757
- // Wide enough apart that two adjacent lanes' author avatars do not touch,
758
- // and tall enough that an 18px avatar is the row rather than a dot in it.
759
- grid: { x: 22, y: 30, offsetX: 14, offsetY: 15, expandY: 60 },
760
- nodeR: 9,
761
- style: 'rounded'
762
- };
763
-
764
- // --- State ---
765
- const DEFAULT_SETTINGS = {
766
- maxCommits: 300, showTags: true, showStashes: true, showRemoteBranches: true,
767
- graphStyle: 'rounded', firstParentOnly: false, dateFormat: 'relative', commitOrdering: 'topo',
768
- issueLinkingRules: [{ pattern: '#(\\\\d+)', url: '' }], prCreation: null,
769
- autoFetchInterval: 0,
770
- colRefs: true, colChanges: true, colAuthor: true, colDate: true, colHash: true,
771
- };
772
-
773
- /** Optional columns, in the order the header declares them. */
774
- const OPTIONAL_COLUMNS = [
775
- { key: 'colRefs', cls: 'cols-no-refs', label: 'Branch / Tag' },
776
- { key: 'colChanges', cls: 'cols-no-changes', label: 'Changes' },
777
- { key: 'colAuthor', cls: 'cols-no-author', label: 'Author' },
778
- { key: 'colDate', cls: 'cols-no-date', label: 'Date' },
779
- { key: 'colHash', cls: 'cols-no-hash', label: 'Hash' },
780
- ];
781
- const MESSAGE_MIN_W = ${MESSAGE_MIN_W};
782
- const GRAPH_MIN_W = ${GRAPH_MIN_W};
783
-
784
- const state = {
785
- repo: '',
786
- commits: [],
787
- branches: [],
788
- tags: [],
789
- remotes: [],
790
- stashes: [],
791
- currentBranch: '',
792
- head: '',
793
- selectedCommit: null,
794
- expandedCommit: null,
795
- maxCommits: 300,
796
- loading: false,
797
- uncommitted: null,
798
- searchMatches: [],
799
- /** hash -> {files, insertions, deletions}; arrives after the commits. */
800
- stats: {},
801
- searchIndex: -1,
802
- settings: { ...DEFAULT_SETTINGS },
803
- userDetails: { name: '', email: '' },
804
- /** Dragged width of the graph column, or null while it sizes itself. */
805
- graphColWidth: null,
806
- /** Width the lanes actually need — what the column is capped against. */
807
- graphWidth: 0,
808
- /** How far the graph is panned inside its column. */
809
- graphPanX: 0,
810
- fileViewMode: 'list',
811
- worktrees: [],
812
- submodules: [],
813
- mergeState: null,
814
- _lastDetail: null,
815
- };
816
-
817
- // --- SVG Icons ---
818
- const ICONS = {
819
- refresh: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>',
820
- download: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>',
821
- search: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
822
- settings: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z"/></svg>',
823
- folderOpen: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2l-1-5H4l-1 5a2 2 0 002 2z"/></svg>',
824
- file: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.5 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V7.5L14.5 2z"/><polyline points="14 2 14 8 20 8"/></svg>',
825
- list: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>',
826
- tree: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg>',
827
- plus: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>',
828
- minus: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"/></svg>',
829
- x: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',
830
- fileOpen: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>',
831
- gitBranch: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 01-9 9"/></svg>',
832
- trash: '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>',
833
- archive: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="21 8 21 21 3 21 3 8"/><rect x="1" y="3" width="22" height="5"/><line x1="10" y1="12" x2="14" y2="12"/></svg>',
834
- history: '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v5h5"/><path d="M3.05 13A9 9 0 106 5.3L3 8"/><path d="M12 7v5l4 2"/></svg>',
835
- };
836
-
837
- // --- Toast notifications ---
838
- function showToast(message, type) {
839
- const existing = document.querySelector('.toast');
840
- if (existing) existing.remove();
841
- const el = document.createElement('div');
842
- el.className = 'toast toast-' + (type || 'error');
843
- el.textContent = message;
844
- document.body.appendChild(el);
845
- setTimeout(() => { if (el.parentNode) el.remove(); }, 4000);
846
- }
847
-
848
- // --- Init ---
849
- document.getElementById('btn-refresh').innerHTML = ICONS.refresh;
850
- document.getElementById('btn-fetch').innerHTML = ICONS.download;
851
- document.getElementById('btn-submodule').innerHTML = ICONS.folderOpen + ' <span class="sm-count" style="display:none">0</span>';
852
- document.getElementById('btn-reflog').innerHTML = ICONS.history;
853
- document.getElementById('btn-find').innerHTML = ICONS.search;
854
- document.getElementById('btn-settings').innerHTML = ICONS.settings;
855
- document.getElementById('btn-worktree').innerHTML = ICONS.gitBranch + ' <span class="wt-count" style="display:none">0</span>';
856
- document.getElementById('btn-stash').innerHTML = ICONS.archive + ' <span class="stash-count" style="display:none">0</span>';
857
- vscode.postMessage({ command: 'ready' });
858
-
859
- // --- Message handler ---
860
- /*
861
- * The row's layout is decided in JS as well as in CSS (the ref badges live in
862
- * their own column on a wide screen and inline on a narrow one), so crossing
863
- * the breakpoint has to rebuild the rows. Without this, rotating a phone would
864
- * leave the badges in a column that CSS has just hidden.
865
- */
866
- let gWasNarrow = null;
867
- window.addEventListener('resize', () => {
868
- const narrow = isNarrowLayout();
869
- if (gWasNarrow === narrow) return;
870
- gWasNarrow = narrow;
871
- if (state.commits.length > 0) renderCommitList();
872
- });
873
-
874
- window.addEventListener('message', (event) => {
875
- const msg = event.data;
876
- switch (msg.command) {
877
- case 'loadSearchResults':
878
- renderSearchResults(msg.data);
879
- break;
880
- case 'loadRepoInfo':
881
- state.repo = msg.data.path;
882
- state.branches = msg.data.branches;
883
- state.tags = msg.data.tags;
884
- state.remotes = msg.data.remotes;
885
- state.stashes = msg.data.stashes;
886
- state.head = msg.data.head;
887
- state.currentBranch = msg.data.currentBranch;
888
- renderBranchSelector();
889
- updateStatus();
890
- if (document.getElementById('settings-panel').classList.contains('open')) renderRemotesList();
891
- break;
892
- case 'loadCommits':
893
- if (msg.append) {
894
- state.commits = state.commits.concat(msg.data);
895
- } else {
896
- state.commits = msg.data;
897
- // Not an append means the list was replaced — a branch change, a
898
- // refresh. Hashes are unique so keeping the old numbers would not be
899
- // wrong, but nothing would ever read them again and nothing would ever
900
- // drop them either: a long session switching branches grows a map of
901
- // every commit it has ever looked at.
902
- state.stats = {};
903
- }
904
- renderCommitList();
905
- updateStatus();
906
- state.loading = false;
907
- document.getElementById('loading').classList.add('hidden');
908
- break;
909
- case 'loadCommitStats':
910
- Object.assign(state.stats, msg.data);
911
- applyCommitStats();
912
- break;
913
- case 'commitDetails':
914
- // The answer has to still be the question. Arrow-keying down the list
915
- // spawns one "git show" per row with nothing cancelling the last, so they
916
- // come back in whatever order they finish: click A then B quickly and the
917
- // panel could show A while B is highlighted, and deselecting A while its
918
- // request was in flight popped the panel open again for a commit that is
919
- // no longer selected. (No backticks in here: this whole script is a
920
- // template literal, and one would end it hundreds of lines early.)
921
- if (msg.data && msg.data.hash === state.selectedCommit) renderDetailPanel(msg.data);
922
- break;
923
- case 'refresh':
924
- state.commits = msg.data;
925
- if (msg.repoInfo) {
926
- state.branches = msg.repoInfo.branches;
927
- state.tags = msg.repoInfo.tags;
928
- state.remotes = msg.repoInfo.remotes;
929
- state.stashes = msg.repoInfo.stashes;
930
- state.head = msg.repoInfo.head;
931
- state.currentBranch = msg.repoInfo.currentBranch;
932
- renderBranchSelector();
933
- }
934
- renderCommitList();
935
- updateStatus();
936
- break;
937
- case 'loadUncommitted':
938
- state.uncommitted = msg.data;
939
- state.mergeState = msg.data?.mergeState || null;
940
- renderCommitList();
941
- renderMergeBanner();
942
- if (state.selectedCommit === 'uncommitted') {
943
- const u = msg.data;
944
- if (!u || (u.staged.length === 0 && u.unstaged.length === 0 && (!u.conflicted || u.conflicted.length === 0))) {
945
- state.selectedCommit = null;
946
- state.expandedCommit = null;
947
- document.getElementById('detail-panel').classList.add('hidden');
948
- } else {
949
- renderUncommittedDetail();
950
- }
951
- }
952
- break;
953
- case 'loadSearchResults':
954
- renderSearchResults(msg.data);
955
- break;
956
- case 'loadSettings':
957
- state.settings = { ...DEFAULT_SETTINGS, ...msg.data };
958
- state.maxCommits = state.settings.maxCommits;
959
- applySettingsToUI();
960
- break;
961
- case 'loadUserDetails':
962
- state.userDetails = msg.data;
963
- document.getElementById('s-userName').value = msg.data.name;
964
- document.getElementById('s-userEmail').value = msg.data.email;
965
- break;
966
- case 'loadOwnerRepo':
967
- if (msg.data.owner) document.getElementById('pr-owner').value = msg.data.owner;
968
- if (msg.data.repo) document.getElementById('pr-repo').value = msg.data.repo;
969
- break;
970
- case 'actionResult':
971
- if (msg.action === 'fetch') {
972
- fetchInProgress = false;
973
- btnFetch.classList.remove('btn-fetching');
974
- btnFetch.title = 'Fetch from remotes';
975
- if (!msg.result.ok) {
976
- document.getElementById('status-text').textContent = 'Fetch failed: ' + (msg.result.error || 'Unknown error');
977
- }
978
- } else if (!msg.result.ok && msg.action === 'createBranch' && msg.result.error && msg.result.error.includes('already exists')) {
979
- // Extract branch name from error: "fatal: a branch named 'X' already exists"
980
- const branchMatch = msg.result.error.match(/branch named '([^']+)'/);
981
- const branchName = branchMatch ? branchMatch[1] : 'this branch';
982
- showDialog({
983
- title: 'Branch Already Exists',
984
- message: 'A branch named <b>' + escHtml(branchName) + '</b> already exists, do you want to replace it with this new branch?',
985
- rawMessage: true,
986
- confirmLabel: 'Yes, replace the existing branch',
987
- cancelLabel: 'No, choose another branch name',
988
- onConfirm: () => gitAction('createBranch', { ...msg.args, force: true }),
989
- });
990
- } else if (!msg.result.ok) {
991
- showToast('Git action failed: ' + (msg.result.error || 'Unknown error'), 'error');
992
- }
993
- // Refresh worktree list after worktree mutations
994
- if (msg.result.ok && (msg.action === 'addWorktree' || msg.action === 'removeWorktree' || msg.action === 'pruneWorktrees')) {
995
- vscode.postMessage({ command: 'requestWorktrees' });
996
- }
997
- // Refresh stash list after stash mutations
998
- if (msg.result.ok && ['stashSave','stashPop','stashDrop','stashApply'].includes(msg.action)) {
999
- vscode.postMessage({ command: 'requestStashes' });
1000
- }
1001
- break;
1002
- case 'loadWorktrees':
1003
- state.worktrees = msg.data || [];
1004
- renderWorktreeList();
1005
- break;
1006
- case 'loadSubmodules':
1007
- state.submodules = msg.data || [];
1008
- renderSubmoduleList();
1009
- break;
1010
- case 'loadStashes':
1011
- state.stashes = msg.data || [];
1012
- renderStashList();
1013
- if (state.commits.length > 0) renderCommitList();
1014
- break;
1015
- case 'error':
1016
- document.getElementById('status-text').textContent = 'Error: ' + msg.message;
1017
- break;
1018
- }
1019
- });
1020
-
1021
- // --- File context menu: blame / history for one file ---
1022
- function showFileContextMenu(x, y, filePath, hash) {
1023
- const items = [
1024
- { label: 'Blame this file', action: () => vscode.postMessage({ command: 'openBlame', filePath }) },
1025
- ];
1026
- if (hash && hash !== 'uncommitted' && hash !== 'staged') {
1027
- items.push({ label: 'Blame at ' + hash.substring(0, 7), action: () => vscode.postMessage({ command: 'openBlame', filePath, hash }) });
1028
- }
1029
- items.push(
1030
- { label: 'File history', action: () => vscode.postMessage({ command: 'openFileHistory', filePath }) },
1031
- { separator: true },
1032
- { label: 'Open file', action: () => vscode.postMessage({ command: 'openFile', filePath }) },
1033
- );
1034
- renderContextMenu(x, y, items);
1035
- }
1036
-
1037
- document.getElementById('detail-panel').addEventListener('contextmenu', (e) => {
1038
- const item = e.target.closest('.file-item');
1039
- if (!item || !item.dataset.path) return;
1040
- e.preventDefault();
1041
- e.stopPropagation();
1042
- showFileContextMenu(e.clientX, e.clientY, item.dataset.path, item.dataset.hash);
1043
- });
1044
-
1045
- // --- File click delegation (opens diff tab) ---
1046
- document.getElementById('detail-panel').addEventListener('click', (e) => {
1047
- // The header's dismiss.
1048
- if (e.target.closest('.detail-close')) { e.stopPropagation(); closeDetailPanel(); return; }
1049
- // Metadata values. The clipboard write is silent, so the thing clicked says
1050
- // it happened.
1051
- const copySource = e.target.closest('[data-copy]');
1052
- if (copySource) {
1053
- e.stopPropagation();
1054
- // The green flash is the only evidence the user gets, so it waits for the
1055
- // answer rather than assuming one. A failure says so instead of lying.
1056
- copyText(copySource.dataset.copy).then((ok) => {
1057
- const cls = ok ? 'copied' : 'copy-failed';
1058
- copySource.classList.add(cls);
1059
- setTimeout(() => copySource.classList.remove(cls), 900);
1060
- });
1061
- return;
1062
- }
1063
- // File-level action buttons (stage/unstage/discard/open)
1064
- const actionBtn = e.target.closest('.file-action-btn');
1065
- if (actionBtn) {
1066
- e.stopPropagation();
1067
- const action = actionBtn.dataset.action;
1068
- const file = actionBtn.dataset.file;
1069
- if (action === 'open') {
1070
- vscode.postMessage({ command: 'openFile', filePath: file });
1071
- } else if (action === 'open-conflict') {
1072
- vscode.postMessage({ command: 'openConflictFile', filePath: file });
1073
- } else if (action === 'stage') {
1074
- vscode.postMessage({ command: 'gitAction', action: 'stage', args: { files: [file] } });
1075
- } else if (action === 'unstage') {
1076
- vscode.postMessage({ command: 'gitAction', action: 'unstage', args: { files: [file] } });
1077
- } else if (action === 'discard') {
1078
- showDialog({
1079
- title: 'Discard Changes',
1080
- message: 'Discard changes to "' + file + '"? This cannot be undone.',
1081
- destructive: true,
1082
- confirmLabel: 'Discard',
1083
- onConfirm: () => vscode.postMessage({ command: 'gitAction', action: 'discard', args: { files: [file] } }),
1084
- });
1085
- }
1086
- return;
1087
- }
1088
- // Section-level actions (Stage All / Unstage All)
1089
- const sectionBtn = e.target.closest('.section-action-btn');
1090
- if (sectionBtn) {
1091
- e.stopPropagation();
1092
- const action = sectionBtn.dataset.action;
1093
- if (action === 'stage-all') {
1094
- const files = state.uncommitted.unstaged.map(f => f.path);
1095
- vscode.postMessage({ command: 'gitAction', action: 'stage', args: { files } });
1096
- } else if (action === 'unstage-all') {
1097
- const files = state.uncommitted.staged.map(f => f.path);
1098
- vscode.postMessage({ command: 'gitAction', action: 'unstage', args: { files } });
1099
- }
1100
- return;
1101
- }
1102
- // Toggle buttons (tree/list view)
1103
- const toggleBtn = e.target.closest('.toggle-btn[data-view]');
1104
- if (toggleBtn) {
1105
- state.fileViewMode = toggleBtn.dataset.view;
1106
- if (state.selectedCommit === 'uncommitted') {
1107
- renderUncommittedDetail();
1108
- } else if (state._lastDetail) {
1109
- renderDetailPanel(state._lastDetail);
1110
- }
1111
- return;
1112
- }
1113
- // File click (opens diff)
1114
- const item = e.target.closest('.file-clickable');
1115
- if (!item) return;
1116
- const filePath = item.dataset.path;
1117
- const hash = item.dataset.hash;
1118
- const parentHash = item.dataset.parent || null;
1119
- if (filePath && hash) {
1120
- vscode.postMessage({ command: 'openDiff', filePath, hash, parentHash });
1121
- }
1122
- });
1123
-
1124
- /* Blame and history are per-file, so the commit detail's file list is the
1125
- natural place to reach them. */
1126
- function showFileContextMenu(x, y, filePath, hash) {
1127
- const committed = hash && hash !== 'uncommitted' && hash !== 'staged';
1128
- const items = [
1129
- { label: 'Blame this file', action: () => vscode.postMessage({ command: 'openBlame', filePath }) },
1130
- ];
1131
- if (committed) {
1132
- items.push({ label: 'Blame at ' + hash.substring(0, 7), action: () => vscode.postMessage({ command: 'openBlame', filePath, hash }) });
1133
- }
1134
- items.push(
1135
- { label: 'File history', action: () => vscode.postMessage({ command: 'openFileHistory', filePath }) },
1136
- { separator: true },
1137
- { label: 'Open file', action: () => vscode.postMessage({ command: 'openFile', filePath }) },
1138
- );
1139
- renderContextMenu(x, y, items);
1140
- }
1141
-
1142
- document.getElementById('detail-panel').addEventListener('contextmenu', (e) => {
1143
- const item = e.target.closest('.file-clickable');
1144
- if (!item) return;
1145
- e.preventDefault();
1146
- e.stopPropagation();
1147
- showFileContextMenu(e.clientX, e.clientY, item.dataset.path || item.dataset.file, item.dataset.hash);
1148
- });
1149
-
1150
- /* Touch has no right-click, and the detail panel re-renders on every selection,
1151
- so the long-press is delegated rather than bound per row. */
1152
- (function setupFileLongPress() {
1153
- const panel = document.getElementById('detail-panel');
1154
- let timer = null, startX = 0, startY = 0, target = null;
1155
- panel.addEventListener('touchstart', (e) => {
1156
- target = e.target.closest('.file-clickable');
1157
- if (!target) return;
1158
- startX = e.touches[0].clientX;
1159
- startY = e.touches[0].clientY;
1160
- timer = setTimeout(() => {
1161
- e.preventDefault();
1162
- showFileContextMenu(startX, startY, target.dataset.path || target.dataset.file, target.dataset.hash);
1163
- target = null;
1164
- }, 500);
1165
- }, { passive: false });
1166
- const cancel = () => { if (timer) { clearTimeout(timer); timer = null; } };
1167
- panel.addEventListener('touchmove', (e) => {
1168
- if (timer && (Math.abs(e.touches[0].clientX - startX) > 10 || Math.abs(e.touches[0].clientY - startY) > 10)) cancel();
1169
- }, { passive: true });
1170
- panel.addEventListener('touchend', cancel);
1171
- panel.addEventListener('touchcancel', cancel);
1172
- })();
1173
-
1174
- // --- Branch dropdown ---
1175
- let selectedBranch = 'all';
1176
- const branchTrigger = document.getElementById('branch-trigger');
1177
- const branchMenu = document.getElementById('branch-dropdown-menu');
1178
- const branchFilterInput = document.getElementById('branch-filter');
1179
- const branchListEl = document.getElementById('branch-list');
1180
-
1181
- branchTrigger.addEventListener('click', (e) => {
1182
- e.stopPropagation();
1183
- const wasHidden = branchMenu.classList.contains('hidden');
1184
- branchMenu.classList.toggle('hidden');
1185
- if (wasHidden) {
1186
- branchFilterInput.value = '';
1187
- renderBranchOptions('');
1188
- branchFilterInput.focus();
1189
- }
1190
- });
1191
-
1192
- document.addEventListener('click', (e) => {
1193
- if (!e.target.closest('#branch-selector')) branchMenu.classList.add('hidden');
1194
- });
1195
-
1196
- branchFilterInput.addEventListener('input', () => {
1197
- renderBranchOptions(branchFilterInput.value.toLowerCase());
1198
- });
1199
- branchFilterInput.addEventListener('click', (e) => e.stopPropagation());
1200
-
1201
- function renderBranchOptions(filter) {
1202
- const options = [{ name: 'all', label: 'All Branches', current: false }];
1203
- state.branches.forEach(b => {
1204
- if (b.remote && !state.settings.showRemoteBranches) return;
1205
- options.push({ name: b.name, label: (b.current ? '* ' : '') + b.name, current: b.current });
1206
- });
1207
- const filtered = filter ? options.filter(o => o.label.toLowerCase().includes(filter)) : options;
1208
- branchListEl.innerHTML = filtered.map(o =>
1209
- '<div class="branch-option' + (o.name === selectedBranch ? ' selected' : '') + '" data-branch="' + escHtml(o.name) + '">' + escHtml(o.label) + '</div>'
1210
- ).join('');
1211
- }
1212
-
1213
- branchListEl.addEventListener('click', (e) => {
1214
- const opt = e.target.closest('.branch-option');
1215
- if (!opt) return;
1216
- const branch = opt.dataset.branch;
1217
- selectedBranch = branch;
1218
- branchTrigger.textContent = branch === 'all' ? 'All Branches' : branch;
1219
- branchMenu.classList.add('hidden');
1220
- state.commits = [];
1221
- document.getElementById('commit-list').innerHTML = '';
1222
- vscode.postMessage({ command: 'requestCommits', branch, maxCommits: state.maxCommits });
1223
- });
1224
-
1225
- function renderBranchSelector() {
1226
- const branchNames = state.branches.map(b => b.name);
1227
- if (selectedBranch !== 'all' && !branchNames.includes(selectedBranch)) selectedBranch = 'all';
1228
- branchTrigger.textContent = selectedBranch === 'all' ? 'All Branches' : selectedBranch;
1229
- }
1230
-
1231
- // --- Refresh ---
1232
- document.getElementById('btn-refresh').addEventListener('click', () => {
1233
- state.commits = [];
1234
- document.getElementById('commit-list').innerHTML = '';
1235
- vscode.postMessage({ command: 'requestRepoInfo' });
1236
- vscode.postMessage({ command: 'requestCommits', maxCommits: state.maxCommits });
1237
- });
1238
-
1239
- // --- Fetch ---
1240
- const btnFetch = document.getElementById('btn-fetch');
1241
- let fetchInProgress = false;
1242
- let autoFetchTimer = null;
1243
-
1244
- function doFetch() {
1245
- fetchInProgress = true;
1246
- btnFetch.classList.add('btn-fetching');
1247
- btnFetch.title = 'Fetching...';
1248
- vscode.postMessage({ command: 'gitAction', action: 'fetch', args: { prune: true } });
1249
- }
1250
-
1251
- btnFetch.addEventListener('click', () => { if (!fetchInProgress) doFetch(); });
1252
-
1253
- function startAutoFetch(intervalSec) {
1254
- stopAutoFetch();
1255
- if (!intervalSec || intervalSec <= 0) return;
1256
- const ms = Math.max(intervalSec, 10) * 1000;
1257
- autoFetchTimer = setInterval(() => { if (!fetchInProgress) doFetch(); }, ms);
1258
- }
1259
- function stopAutoFetch() {
1260
- if (autoFetchTimer) { clearInterval(autoFetchTimer); autoFetchTimer = null; }
1261
- }
1262
-
1263
- // --- Worktree popover ---
1264
- const wtPopover = document.getElementById('worktree-popover');
1265
- const btnWorktree = document.getElementById('btn-worktree');
1266
-
1267
- btnWorktree.addEventListener('click', (e) => {
1268
- e.stopPropagation();
1269
- const wasHidden = wtPopover.classList.contains('hidden');
1270
- wtPopover.classList.toggle('hidden');
1271
- if (wasHidden) vscode.postMessage({ command: 'requestWorktrees' });
1272
- });
1273
-
1274
- document.addEventListener('click', (e) => {
1275
- if (!e.target.closest('.worktree-dropdown')) wtPopover.classList.add('hidden');
1276
- });
1277
-
1278
- function renderWorktreeList() {
1279
- const listEl = document.getElementById('worktree-list');
1280
- const countEl = btnWorktree.querySelector('.wt-count');
1281
- const wts = state.worktrees;
1282
- if (countEl) {
1283
- countEl.textContent = wts.length;
1284
- countEl.style.display = wts.length > 1 ? '' : 'none';
1285
- }
1286
- if (!wts.length) {
1287
- listEl.innerHTML = '<div class="wt-empty">No worktrees found</div>';
1288
- return;
1289
- }
1290
- listEl.innerHTML = wts.map((wt, i) => {
1291
- const branchName = wt.branch || (wt.isDetached ? 'detached HEAD' : '(bare)');
1292
- const shortHash = wt.head ? wt.head.substring(0, 7) : '';
1293
- const isCurrent = wt.path === state.repo;
1294
- let badges = '';
1295
- if (isCurrent) badges += ' <span class="wt-badge wt-badge-current">current</span>';
1296
- if (wt.isMain && !isCurrent) badges += ' <span class="wt-badge">main</span>';
1297
- if (wt.locked) badges += ' <span class="wt-badge wt-badge-locked">locked</span>';
1298
- if (wt.prunable) badges += ' <span class="wt-badge">prunable</span>';
1299
- if (wt.isDetached) badges += ' <span class="wt-badge">detached</span>';
1300
- const actions = isCurrent ? ''
1301
- : '<button class="wt-open" data-idx="' + i + '" title="Open in PPM">' + ICONS.fileOpen + '</button>'
1302
- + (wt.isMain ? '' : '<button class="wt-remove" data-idx="' + i + '" title="Remove worktree">' + ICONS.trash + '</button>');
1303
- return '<div class="wt-item' + (isCurrent ? ' wt-item-active' : '') + '">'
1304
- + '<div class="wt-item-info">'
1305
- + '<div class="wt-item-branch">' + ICONS.gitBranch + ' ' + escHtml(branchName) + badges + '</div>'
1306
- + '<div class="wt-item-path" title="' + escHtml(wt.path) + '">' + escHtml(wt.path) + ' <span style="color:var(--subtle)">' + shortHash + '</span></div>'
1307
- + '</div>'
1308
- + (actions ? '<div class="wt-item-actions">' + actions + '</div>' : '')
1309
- + '</div>';
1310
- }).join('');
1311
-
1312
- // Bind action buttons
1313
- listEl.querySelectorAll('.wt-open').forEach(btn => {
1314
- btn.addEventListener('click', (e) => {
1315
- e.stopPropagation();
1316
- const wt = state.worktrees[parseInt(btn.dataset.idx)];
1317
- if (wt) vscode.postMessage({ command: 'openWorktree', path: wt.path });
1318
- });
1319
- });
1320
- listEl.querySelectorAll('.wt-remove').forEach(btn => {
1321
- btn.addEventListener('click', (e) => {
1322
- e.stopPropagation();
1323
- const wt = state.worktrees[parseInt(btn.dataset.idx)];
1324
- if (!wt) return;
1325
- showDialog({
1326
- title: 'Remove Worktree',
1327
- message: 'Remove worktree at "' + wt.path + '"?',
1328
- destructive: true,
1329
- confirmLabel: 'Remove',
1330
- onConfirm: () => vscode.postMessage({ command: 'removeWorktree', path: wt.path }),
1331
- });
1332
- });
1333
- });
1334
- }
1335
-
1336
- /* --- Submodules ---
1337
- The whole control stays hidden in the common case: most repositories have no
1338
- submodules, and an always-visible empty dropdown is just noise in a toolbar
1339
- that is already tight on a phone. */
1340
- const smWrap = document.getElementById('submodule-wrap');
1341
- const smPopover = document.getElementById('submodule-popover');
1342
- document.getElementById('btn-submodule').addEventListener('click', (e) => {
1343
- e.stopPropagation();
1344
- smPopover.classList.toggle('hidden');
1345
- if (!smPopover.classList.contains('hidden')) vscode.postMessage({ command: 'requestSubmodules' });
1346
- });
1347
- document.addEventListener('click', (e) => {
1348
- if (!e.target.closest('.submodule-dropdown')) smPopover.classList.add('hidden');
1349
- });
1350
-
1351
- const SM_STATE_TEXT = {
1352
- current: 'up to date',
1353
- uninitialized: 'not checked out',
1354
- modified: 'differs from the recorded commit',
1355
- conflicted: 'has merge conflicts',
1356
- };
1357
-
1358
- function renderSubmoduleList() {
1359
- const subs = state.submodules;
1360
- smWrap.classList.toggle('hidden', subs.length === 0);
1361
- if (!subs.length) { smPopover.classList.add('hidden'); return; }
1362
-
1363
- const stale = subs.filter((sm) => sm.state !== 'current').length;
1364
- const countEl = document.getElementById('btn-submodule').querySelector('.sm-count');
1365
- if (countEl) {
1366
- countEl.textContent = stale || subs.length;
1367
- countEl.style.display = '';
1368
- }
1369
-
1370
- const listEl = document.getElementById('submodule-list');
1371
- listEl.innerHTML = subs.map((sm, i) => {
1372
- const badge = sm.state === 'current' ? ''
1373
- : ' <span class="wt-badge sm-badge-' + escHtml(sm.state) + '">' + escHtml(sm.state) + '</span>';
1374
- const name = sm.path.split('/').pop() || sm.path;
1375
- return '<div class="wt-item">'
1376
- + '<div class="wt-item-info">'
1377
- + '<div class="wt-item-branch">' + escHtml(name) + badge + '</div>'
1378
- + '<div class="wt-item-path" title="' + escHtml(SM_STATE_TEXT[sm.state] || '') + '">'
1379
- + escHtml(sm.path) + ' <span style="color:var(--subtle)">' + escHtml(sm.hash.slice(0, 7)) + '</span>'
1380
- + (sm.describe ? ' ' + escHtml(sm.describe) : '')
1381
- + '</div>'
1382
- + '</div>'
1383
- + '<div class="wt-item-actions">'
1384
- + '<button class="sm-update" data-idx="' + i + '" title="Checkout the recorded commit">' + ICONS.download + '</button>'
1385
- + (sm.state === 'uninitialized' ? ''
1386
- : '<button class="sm-open" data-idx="' + i + '" title="Open in PPM">' + ICONS.fileOpen + '</button>')
1387
- + '</div>'
1388
- + '</div>';
1389
- }).join('');
1390
-
1391
- listEl.querySelectorAll('.sm-update').forEach((btn) => {
1392
- btn.addEventListener('click', (e) => {
1393
- e.stopPropagation();
1394
- const sm = state.submodules[parseInt(btn.dataset.idx)];
1395
- if (sm) vscode.postMessage({ command: 'updateSubmodule', path: sm.path });
1396
- });
1397
- });
1398
- listEl.querySelectorAll('.sm-open').forEach((btn) => {
1399
- btn.addEventListener('click', (e) => {
1400
- e.stopPropagation();
1401
- const sm = state.submodules[parseInt(btn.dataset.idx)];
1402
- if (sm) vscode.postMessage({ command: 'openSubmodule', path: sm.path });
1403
- });
1404
- });
1405
- }
1406
-
1407
- document.getElementById('sm-update-all').addEventListener('click', () => {
1408
- showDialog({
1409
- title: 'Update Submodules',
1410
- message: 'Check out the recorded commit in every submodule? Local changes inside them are left alone, but the checkout moves.',
1411
- confirmLabel: 'Update all',
1412
- onConfirm: () => {
1413
- for (const sm of state.submodules) vscode.postMessage({ command: 'updateSubmodule', path: sm.path });
1414
- },
1415
- });
1416
- });
1417
-
1418
- document.getElementById('wt-add').addEventListener('click', () => {
1419
- showCreateWorktreeDialog();
1420
- });
1421
-
1422
- document.getElementById('wt-prune').addEventListener('click', () => {
1423
- showDialog({
1424
- title: 'Prune Worktrees',
1425
- message: 'Remove stale worktree entries (worktrees whose directories no longer exist)?',
1426
- confirmLabel: 'Prune',
1427
- onConfirm: () => vscode.postMessage({ command: 'pruneWorktrees' }),
1428
- });
1429
- });
1430
-
1431
- function showCreateWorktreeDialog(startPoint) {
1432
- const overlay = document.createElement('div');
1433
- overlay.className = 'dialog-overlay';
1434
- const dialog = document.createElement('div');
1435
- dialog.className = 'dialog';
1436
- dialog.innerHTML = '<h3>Add Worktree</h3>'
1437
- + '<p style="font-size:12px;margin-bottom:8px">Path for the new worktree directory:</p>'
1438
- + '<input type="text" id="wt-dialog-path" placeholder="/path/to/worktree" style="width:100%;margin-bottom:8px" />'
1439
- + '<p style="font-size:12px;margin-bottom:4px">Branch:</p>'
1440
- + '<div style="display:flex;gap:8px;margin-bottom:6px">'
1441
- + '<label style="font-size:11px;display:flex;align-items:center;gap:4px"><input type="radio" name="wt-branch-mode" value="existing" checked /> Existing branch</label>'
1442
- + '<label style="font-size:11px;display:flex;align-items:center;gap:4px"><input type="radio" name="wt-branch-mode" value="new" /> New branch</label>'
1443
- + '</div>'
1444
- + '<input type="text" id="wt-dialog-branch" placeholder="Branch name" style="width:100%;margin-bottom:8px" />'
1445
- + (startPoint ? '<input type="hidden" id="wt-dialog-start" value="' + escHtml(startPoint) + '" />' : '<input type="text" id="wt-dialog-start" placeholder="Start point (commit/branch, optional)" style="width:100%;margin-bottom:8px" />');
1446
-
1447
- const actions = document.createElement('div');
1448
- actions.className = 'dialog-actions';
1449
- const cancelBtn = document.createElement('button');
1450
- cancelBtn.textContent = 'Cancel';
1451
- cancelBtn.className = 'secondary';
1452
- cancelBtn.addEventListener('click', () => overlay.remove());
1453
- const confirmBtn = document.createElement('button');
1454
- confirmBtn.textContent = 'Create';
1455
- confirmBtn.className = 'btn-primary';
1456
- confirmBtn.addEventListener('click', () => {
1457
- const path = dialog.querySelector('#wt-dialog-path').value.trim();
1458
- if (!path) { showToast('Path is required', 'error'); return; }
1459
- const branch = dialog.querySelector('#wt-dialog-branch').value.trim();
1460
- const mode = dialog.querySelector('input[name="wt-branch-mode"]:checked').value;
1461
- const sp = dialog.querySelector('#wt-dialog-start');
1462
- const startPt = sp ? sp.value.trim() : '';
1463
- const msg = { command: 'addWorktree', path };
1464
- if (mode === 'new' && branch) { msg.newBranch = branch; }
1465
- else if (branch) { msg.branch = branch; }
1466
- if (startPt) msg.startPoint = startPt;
1467
- vscode.postMessage(msg);
1468
- overlay.remove();
1469
- });
1470
- actions.appendChild(cancelBtn);
1471
- actions.appendChild(confirmBtn);
1472
- dialog.appendChild(actions);
1473
- overlay.appendChild(dialog);
1474
- document.body.appendChild(overlay);
1475
- setTimeout(() => dialog.querySelector('#wt-dialog-path').focus(), 50);
1476
- overlay.addEventListener('keydown', (e) => {
1477
- if (e.key === 'Escape') overlay.remove();
1478
- if (e.key === 'Enter') confirmBtn.click();
1479
- });
1480
- }
1481
-
1482
- // --- Merge/rebase banner ---
1483
- function renderMergeBanner() {
1484
- let banner = document.getElementById('merge-banner');
1485
- if (!state.mergeState) {
1486
- if (banner) banner.remove();
1487
- return;
1488
- }
1489
- const ms = state.mergeState;
1490
- const typeLabel = ms.type === 'cherry-pick' ? 'Cherry-pick' : ms.type.charAt(0).toUpperCase() + ms.type.slice(1);
1491
- const progressText = ms.progress ? ' (' + ms.progress + ')' : '';
1492
- const msgText = ms.message ? ' — ' + escHtml(ms.message) : '';
1493
-
1494
- let buttonsHtml = '';
1495
- if (ms.type === 'rebase') {
1496
- buttonsHtml = '<button class="btn-sm btn-continue" data-merge-action="rebaseContinue">Continue</button>'
1497
- + '<button class="btn-sm" data-merge-action="rebaseSkip">Skip</button>'
1498
- + '<button class="btn-sm btn-abort" data-merge-action="rebaseAbort">Abort</button>';
1499
- } else if (ms.type === 'merge') {
1500
- buttonsHtml = '<button class="btn-sm btn-abort" data-merge-action="mergeAbort">Abort</button>';
1501
- } else if (ms.type === 'cherry-pick') {
1502
- buttonsHtml = '<button class="btn-sm btn-continue" data-merge-action="cherryPickContinue">Continue</button>'
1503
- + '<button class="btn-sm btn-abort" data-merge-action="cherryPickAbort">Abort</button>';
1504
- }
1505
-
1506
- if (!banner) {
1507
- banner = document.createElement('div');
1508
- banner.id = 'merge-banner';
1509
- banner.className = 'merge-banner';
1510
- const toolbar = document.getElementById('toolbar');
1511
- toolbar.parentNode.insertBefore(banner, toolbar.nextSibling);
1512
- }
1513
- banner.innerHTML = '<span class="banner-icon">⚠</span>'
1514
- + '<span class="banner-text"><strong>' + typeLabel + ' in progress' + progressText + '</strong>' + msgText + '</span>'
1515
- + '<div class="banner-actions">' + buttonsHtml + '</div>';
1516
-
1517
- banner.querySelectorAll('[data-merge-action]').forEach(btn => {
1518
- btn.addEventListener('click', () => {
1519
- const action = btn.dataset.mergeAction;
1520
- if (action.includes('Abort')) {
1521
- showDialog({
1522
- title: 'Abort ' + typeLabel,
1523
- message: 'Abort the current ' + ms.type + '? Any resolved conflicts will be lost.',
1524
- destructive: true,
1525
- confirmLabel: 'Abort',
1526
- onConfirm: () => gitAction(action, {}),
1527
- });
1528
- } else {
1529
- gitAction(action, {});
1530
- }
1531
- });
1532
- });
1533
- }
1534
-
1535
- // --- Stash popover ---
1536
- const btnStash = document.getElementById('btn-stash');
1537
- const stashPopover = document.getElementById('stash-popover');
1538
-
1539
- btnStash.addEventListener('click', (e) => {
1540
- e.stopPropagation();
1541
- const wasHidden = stashPopover.classList.contains('hidden');
1542
- stashPopover.classList.toggle('hidden');
1543
- if (wasHidden) vscode.postMessage({ command: 'requestStashes' });
1544
- });
1545
-
1546
- document.addEventListener('click', (e) => {
1547
- if (!e.target.closest('.stash-dropdown')) stashPopover.classList.add('hidden');
1548
- });
1549
-
1550
- function renderStashList() {
1551
- const listEl = document.getElementById('stash-list');
1552
- const countEl = btnStash.querySelector('.stash-count');
1553
- const stashes = state.stashes;
1554
- if (countEl) {
1555
- countEl.textContent = stashes.length;
1556
- countEl.style.display = stashes.length > 0 ? '' : 'none';
1557
- }
1558
- if (!stashes.length) {
1559
- listEl.innerHTML = '<div class="stash-empty">No stashes</div>';
1560
- return;
1561
- }
1562
- listEl.innerHTML = stashes.map((s, i) => {
1563
- const ref = 'stash@{' + s.index + '}';
1564
- return '<div class="stash-item">'
1565
- + '<div class="stash-item-info">'
1566
- + '<div class="stash-item-ref">' + escHtml(ref) + '</div>'
1567
- + '<div class="stash-item-msg" title="' + escHtml(s.message) + '">' + escHtml(s.message) + '</div>'
1568
- + '</div>'
1569
- + '<div class="stash-item-actions">'
1570
- + '<button class="stash-apply btn-sm" data-idx="' + i + '" title="Apply (keep stash)">Apply</button>'
1571
- + '<button class="stash-pop btn-sm" data-idx="' + i + '" title="Pop (apply & remove)">Pop</button>'
1572
- + '<button class="stash-drop btn-sm" data-idx="' + i + '" title="Drop (delete)">Drop</button>'
1573
- + '</div>'
1574
- + '</div>';
1575
- }).join('');
1576
-
1577
- listEl.querySelectorAll('.stash-apply').forEach(btn => {
1578
- btn.addEventListener('click', (e) => {
1579
- e.stopPropagation();
1580
- const s = state.stashes[parseInt(btn.dataset.idx)];
1581
- if (s) gitAction('stashApply', { stashRef: 'stash@{' + s.index + '}' });
1582
- });
1583
- });
1584
- listEl.querySelectorAll('.stash-pop').forEach(btn => {
1585
- btn.addEventListener('click', (e) => {
1586
- e.stopPropagation();
1587
- const s = state.stashes[parseInt(btn.dataset.idx)];
1588
- if (s) gitAction('stashPop', { stashRef: 'stash@{' + s.index + '}' });
1589
- });
1590
- });
1591
- listEl.querySelectorAll('.stash-drop').forEach(btn => {
1592
- btn.addEventListener('click', (e) => {
1593
- e.stopPropagation();
1594
- const s = state.stashes[parseInt(btn.dataset.idx)];
1595
- if (!s) return;
1596
- showDialog({
1597
- title: 'Drop Stash',
1598
- message: 'Delete stash@{' + s.index + '}? This cannot be undone.',
1599
- destructive: true,
1600
- confirmLabel: 'Drop',
1601
- onConfirm: () => gitAction('stashDrop', { stashRef: 'stash@{' + s.index + '}' }),
1602
- });
1603
- });
1604
- });
1605
- }
1606
-
1607
- document.getElementById('stash-save').addEventListener('click', () => {
1608
- showDialog({
1609
- title: 'Stash Changes',
1610
- input: { placeholder: 'Stash message (optional)' },
1611
- confirmLabel: 'Stash',
1612
- onConfirm: (msg) => gitAction('stashSave', msg ? { message: msg } : {}),
1613
- });
1614
- });
1615
-
1616
- // --- Graph column resize ---
1617
- {
1618
- const resizeHandle = document.getElementById('graph-resize-handle');
1619
- let resizing = false, startX = 0, startW = 0;
1620
- resizeHandle.addEventListener('pointerdown', (e) => {
1621
- e.preventDefault();
1622
- resizing = true;
1623
- startX = e.clientX;
1624
- startW = document.querySelector('.col-graph').offsetWidth;
1625
- resizeHandle.classList.add('dragging');
1626
- resizeHandle.setPointerCapture(e.pointerId);
1627
- });
1628
- // Both ends of the drag go through the same cap the automatic width uses: a
1629
- // hand-dragged column wider than the panel is the bug this whole path is
1630
- // about, and a ceiling of its own would also be a ceiling the automatic width
1631
- // could exceed and the drag could then never restore.
1632
- const dragTo = (e) => {
1633
- state.graphColWidth = Math.max(GRAPH_MIN_W, startW + e.clientX - startX);
1634
- applyGraphColWidth();
1635
- };
1636
- resizeHandle.addEventListener('pointermove', (e) => { if (resizing) dragTo(e); });
1637
- resizeHandle.addEventListener('pointerup', (e) => {
1638
- if (!resizing) return;
1639
- resizing = false;
1640
- resizeHandle.classList.remove('dragging');
1641
- dragTo(e);
1642
- });
1643
- resizeHandle.addEventListener('dblclick', () => {
1644
- state.graphColWidth = null;
1645
- applyGraphColWidth();
1646
- });
1647
- }
1648
-
1649
- // --- Panning the graph inside its column ---
1650
- {
1651
- const list = document.getElementById('commit-list');
1652
- let tracking = false, panned = false, startX = 0, startY = 0, startPan = 0, pointerId = null;
1653
-
1654
- list.addEventListener('pointerdown', (e) => {
1655
- if (e.button !== 0 || !e.target.closest || !e.target.closest('.col-graph')) return;
1656
- if (graphPanMax() <= 0) return;
1657
- tracking = true;
1658
- panned = false;
1659
- startX = e.clientX;
1660
- startY = e.clientY;
1661
- startPan = state.graphPanX;
1662
- pointerId = e.pointerId;
1663
- });
1664
-
1665
- list.addEventListener('pointermove', (e) => {
1666
- if (!tracking) return;
1667
- const dx = e.clientX - startX;
1668
- if (!panned) {
1669
- // Sideways and past the slop before this is a pan: anything else is the
1670
- // press that selects a commit, or the finger that scrolls the list —
1671
- // .col-graph is touch-action: pan-y so the browser keeps that one.
1672
- if (Math.abs(dx) < 4 || Math.abs(dx) <= Math.abs(e.clientY - startY)) return;
1673
- panned = true;
1674
- list.setPointerCapture(pointerId);
1675
- document.documentElement.classList.add('graph-panning');
1676
- showPanHint(true);
1677
- }
1678
- state.graphPanX = startPan - dx;
1679
- applyGraphPan();
1680
- });
1681
-
1682
- const endPan = () => {
1683
- if (!tracking) return;
1684
- tracking = false;
1685
- if (!panned) return;
1686
- try { list.releasePointerCapture(pointerId); } catch (err) { /* already released */ }
1687
- document.documentElement.classList.remove('graph-panning');
1688
- showPanHint(false);
1689
- };
1690
- list.addEventListener('pointerup', endPan);
1691
- list.addEventListener('pointercancel', endPan);
1692
- // A drag is not a click. Captured on the way down, because the row's own
1693
- // handler would otherwise open the commit the pan happened to end on.
1694
- list.addEventListener('click', (e) => {
1695
- if (!panned) return;
1696
- panned = false;
1697
- e.stopPropagation();
1698
- e.preventDefault();
1699
- }, true);
1700
-
1701
- // A trackpad's sideways gesture and shift+wheel, over the list itself. The
1702
- // overlay cannot take these: it is pointer-events: none so that a click lands
1703
- // on the row underneath it.
1704
- document.getElementById('graph-container').addEventListener('wheel', (e) => {
1705
- const dx = e.shiftKey ? e.deltaY : e.deltaX;
1706
- if (!dx || (!e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))) return;
1707
- const before = state.graphPanX;
1708
- panGraphBy(dx);
1709
- if (state.graphPanX !== before) e.preventDefault();
1710
- }, { passive: false });
1711
- // The cap is a share of the panel's width, so it is only right until the
1712
- // panel changes size — and nothing re-renders the graph when a window is
1713
- // dragged or a sibling panel opens.
1714
- if (typeof ResizeObserver === 'function') {
1715
- new ResizeObserver(() => applyGraphColWidth()).observe(document.getElementById('graph-container'));
1716
- }
1717
- }
1718
-
1719
- // --- Columns the reader chose to see ---
1720
- function applyColumnVisibility() {
1721
- const root = document.documentElement;
1722
- OPTIONAL_COLUMNS.forEach((col) => {
1723
- root.classList.toggle(col.cls, state.settings[col.key] === false);
1724
- });
1725
- // Hiding a column hands its width to the graph, and no resize fires for it.
1726
- applyGraphColWidth();
1727
- }
1728
-
1729
- /**
1730
- * Whether a column is hidden by the panel's width whatever the setting says.
1731
- * The menu marks those rather than hiding them, so that a tick doing nothing is
1732
- * never the only explanation on offer.
1733
- */
1734
- function columnBlockedByWidth(key) {
1735
- if (typeof window.matchMedia !== 'function') return false;
1736
- if (key === 'colDate' || key === 'colHash') return window.matchMedia('(max-width: 900px)').matches;
1737
- if (key === 'colChanges') return window.matchMedia('(max-width: 760px)').matches;
1738
- return false;
1739
- }
1740
-
1741
- function setColumnVisible(key, visible) {
1742
- state.settings[key] = visible;
1743
- vscode.postMessage({ command: 'updateSetting', key, value: visible });
1744
- applyColumnVisibility();
1745
- const box = document.getElementById('s-' + key);
1746
- if (box) box.checked = visible;
1747
- }
1748
-
1749
- function showColumnMenu(x, y) {
1750
- renderContextMenu(x, y, OPTIONAL_COLUMNS.map((col) => ({
1751
- label: col.label + (columnBlockedByWidth(col.key) ? ' — needs a wider panel' : ''),
1752
- checked: state.settings[col.key] !== false,
1753
- disabled: columnBlockedByWidth(col.key),
1754
- action: () => setColumnVisible(col.key, state.settings[col.key] === false),
1755
- })));
1756
- }
1757
-
1758
- {
1759
- const header = document.getElementById('graph-header');
1760
- header.addEventListener('contextmenu', (e) => {
1761
- e.preventDefault();
1762
- showColumnMenu(e.clientX, e.clientY);
1763
- });
1764
- setupLongPress(header, (x, y) => showColumnMenu(x, y));
1765
- }
1766
-
1767
- // --- Graph rendering (faithful port of vscode-git-graph graph.ts) ---
1768
-
1769
- class GBranch {
1770
- constructor(colour, isStash) {
1771
- this._colour = colour;
1772
- this._isStash = !!isStash;
1773
- this._end = 0;
1774
- this._lines = [];
1775
- this._numUncommitted = 0;
1776
- }
1777
- addLine(p1, p2, isCommitted, lockedFirst) {
1778
- this._lines.push({ p1, p2, lockedFirst });
1779
- if (isCommitted) {
1780
- if (p2.x === 0 && p2.y < this._numUncommitted) this._numUncommitted = p2.y;
1781
- } else {
1782
- this._numUncommitted++;
1783
- }
1784
- }
1785
- getColour() { return this._colour; }
1786
- getEnd() { return this._end; }
1787
- setEnd(end) { this._end = end; }
1788
-
1789
- draw(svg, config, expandAt) {
1790
- const colour = this._isStash ? '#808080' : config.colours[this._colour % config.colours.length];
1791
- const d = config.grid.y * (config.style === 'angular' ? 0.38 : 0.8);
1792
- const pxLines = [];
1793
- let curPath = '';
1794
-
1795
- for (let i = 0; i < this._lines.length; i++) {
1796
- const ln = this._lines[i];
1797
- let x1 = ln.p1.x * config.grid.x + config.grid.offsetX;
1798
- let y1 = ln.p1.y * config.grid.y + config.grid.offsetY;
1799
- let x2 = ln.p2.x * config.grid.x + config.grid.offsetX;
1800
- let y2 = ln.p2.y * config.grid.y + config.grid.offsetY;
1801
-
1802
- if (expandAt > -1) {
1803
- if (ln.p1.y > expandAt) {
1804
- y1 += config.grid.expandY; y2 += config.grid.expandY;
1805
- } else if (ln.p2.y > expandAt) {
1806
- if (x1 === x2) {
1807
- y2 += config.grid.expandY;
1808
- } else if (ln.lockedFirst) {
1809
- pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
1810
- pxLines.push({ p1: { x: x2, y: y1 + config.grid.y }, p2: { x: x2, y: y2 + config.grid.expandY }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
1811
- continue;
1812
- } else {
1813
- pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x1, y: y2 - config.grid.y + config.grid.expandY }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
1814
- y1 += config.grid.expandY; y2 += config.grid.expandY;
1815
- }
1816
- }
1817
- }
1818
- pxLines.push({ p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 }, isC: i >= this._numUncommitted, lf: ln.lockedFirst });
1819
- }
1820
-
1821
- // Simplify consecutive vertical segments
1822
- let si = 0;
1823
- while (si < pxLines.length - 1) {
1824
- const a = pxLines[si], b = pxLines[si + 1];
1825
- if (a.p1.x === a.p2.x && a.p2.x === b.p1.x && b.p1.x === b.p2.x && a.p2.y === b.p1.y && a.isC === b.isC) {
1826
- a.p2.y = b.p2.y;
1827
- pxLines.splice(si + 1, 1);
1828
- } else { si++; }
1829
- }
1830
-
1831
- // Build SVG paths
1832
- for (let i = 0; i < pxLines.length; i++) {
1833
- const pl = pxLines[i];
1834
- const x1 = pl.p1.x, y1 = pl.p1.y, x2 = pl.p2.x, y2 = pl.p2.y;
1835
-
1836
- if (curPath !== '' && i > 0 && pl.isC !== pxLines[i - 1].isC) {
1837
- GBranch._drawPath(svg, curPath, pxLines[i - 1].isC, colour);
1838
- curPath = '';
1839
- }
1840
- if (curPath === '' || (i > 0 && (x1 !== pxLines[i - 1].p2.x || y1 !== pxLines[i - 1].p2.y))) {
1841
- curPath += 'M' + x1.toFixed(0) + ',' + y1.toFixed(1);
1842
- }
1843
- if (x1 === x2) {
1844
- curPath += 'L' + x2.toFixed(0) + ',' + y2.toFixed(1);
1845
- } else if (config.style === 'angular') {
1846
- curPath += 'L' + (pl.lf ? (x2.toFixed(0) + ',' + (y2 - d).toFixed(1)) : (x1.toFixed(0) + ',' + (y1 + d).toFixed(1))) + 'L' + x2.toFixed(0) + ',' + y2.toFixed(1);
1847
- } else {
1848
- curPath += 'C' + x1.toFixed(0) + ',' + (y1 + d).toFixed(1) + ' ' + x2.toFixed(0) + ',' + (y2 - d).toFixed(1) + ' ' + x2.toFixed(0) + ',' + y2.toFixed(1);
1849
- }
1850
- }
1851
- if (curPath !== '') GBranch._drawPath(svg, curPath, pxLines[pxLines.length - 1].isC, colour);
1852
- }
1853
-
1854
- static _drawPath(svg, path, isCommitted, colour) {
1855
- const line = document.createElementNS(SVG_NS, 'path');
1856
- line.setAttribute('class', 'line');
1857
- line.setAttribute('d', path);
1858
- line.setAttribute('stroke', isCommitted ? colour : '#808080');
1859
- if (!isCommitted) line.setAttribute('stroke-dasharray', '2');
1860
- svg.appendChild(line);
1861
- }
1862
- }
1863
-
1864
- class GVertex {
1865
- constructor(id, isStash, author) {
1866
- this.id = id;
1867
- this.isStash = isStash;
1868
- /** {name, email} of the commit's author, or null for a row that has none. */
1869
- this._author = author || null;
1870
- this._x = 0;
1871
- this._children = [];
1872
- this._parents = [];
1873
- this._nextParent = 0;
1874
- this._onBranch = null;
1875
- this._isCommitted = true;
1876
- this._isCurrent = false;
1877
- this._nextX = 0;
1878
- this._connections = [];
1879
- }
1880
- addChild(v) { this._children.push(v); }
1881
- getChildren() { return this._children; }
1882
- addParent(v) { this._parents.push(v); }
1883
- getParents() { return this._parents; }
1884
- hasParents() { return this._parents.length > 0; }
1885
- getNextParent() { return this._nextParent < this._parents.length ? this._parents[this._nextParent] : null; }
1886
- registerParentProcessed() { this._nextParent++; }
1887
- isMerge() { return this._parents.length > 1; }
1888
-
1889
- addToBranch(branch, x) { if (this._onBranch === null) { this._onBranch = branch; this._x = x; } }
1890
- isNotOnBranch() { return this._onBranch === null; }
1891
- isOnThisBranch(branch) { return this._onBranch === branch; }
1892
- getBranch() { return this._onBranch; }
1893
-
1894
- getPoint() { return { x: this._x, y: this.id }; }
1895
- getNextPoint() { return { x: this._nextX, y: this.id }; }
1896
-
1897
- getPointConnectingTo(vertex, onBranch) {
1898
- for (let i = 0; i < this._connections.length; i++) {
1899
- if (this._connections[i].connectsTo === vertex && this._connections[i].onBranch === onBranch) return { x: i, y: this.id };
1900
- }
1901
- return null;
1902
- }
1903
- registerUnavailablePoint(x, connectsTo, onBranch) {
1904
- if (x === this._nextX) { this._nextX = x + 1; this._connections[x] = { connectsTo, onBranch }; }
1905
- }
1906
-
1907
- getColour() { return this._onBranch !== null ? this._onBranch.getColour() : 0; }
1908
- getIsCommitted() { return this._isCommitted; }
1909
- setNotCommitted() { this._isCommitted = false; }
1910
- setCurrent() { this._isCurrent = true; }
1911
-
1912
- /*
1913
- * The node is the author's avatar, ringed in the lane's colour — which is
1914
- * what makes a graph readable as *who* rather than as a column of identical
1915
- * dots. Initials, never a fetched image: an avatar service would mean handing
1916
- * every committer's email address to a third party, which a self-hosted tool
1917
- * must not do quietly.
1918
- *
1919
- * Rows with no author — uncommitted changes, a stash — keep a plain dot,
1920
- * because inventing initials for them would be a lie.
1921
- */
1922
- draw(svg, config, expandOffset, overListener, outListener) {
1923
- if (this._onBranch === null) return;
1924
- const STASH_COLOR = '#808080';
1925
- const colour = this.isStash ? STASH_COLOR
1926
- : this._isCommitted ? config.colours[this._onBranch.getColour() % config.colours.length] : '#808080';
1927
- const cx = (this._x * config.grid.x + config.grid.offsetX).toString();
1928
- const cy = (this.id * config.grid.y + config.grid.offsetY + (expandOffset ? config.grid.expandY : 0)).toString();
1929
- const named = this._isCommitted && !this.isStash && !!this._author && !!this._author.name;
1930
- const r = named ? (config.nodeR || 9) : 4.5;
1931
-
1932
- const circle = document.createElementNS(SVG_NS, 'circle');
1933
- circle.dataset.id = this.id.toString();
1934
- circle.dataset.r = r.toString();
1935
- circle.setAttribute('cx', cx);
1936
- circle.setAttribute('cy', cy);
1937
- circle.setAttribute('r', r.toString());
1938
- circle.setAttribute('stroke', colour);
1939
- circle.setAttribute('stroke-width', named ? '2' : '0');
1940
- circle.setAttribute('fill', named ? authorColor(this._author.email || this._author.name) : colour);
1941
- if (this._isCurrent) circle.setAttribute('class', 'graphCurrent');
1942
- svg.appendChild(circle);
1943
-
1944
- if (named) {
1945
- const label = document.createElementNS(SVG_NS, 'text');
1946
- label.setAttribute('class', 'node-initials');
1947
- label.setAttribute('x', cx);
1948
- label.setAttribute('y', cy);
1949
- label.setAttribute('text-anchor', 'middle');
1950
- label.setAttribute('dominant-baseline', 'central');
1951
- label.textContent = authorInitials(this._author.name);
1952
- svg.appendChild(label);
1953
- }
1954
-
1955
- circle.addEventListener('mouseover', overListener);
1956
- circle.addEventListener('mouseout', outListener);
1957
- }
1958
- }
1959
-
1960
- // --- Graph layout state ---
1961
- let gVertices = [], gBranches = [], gAvailColours = [], gCommitLookup = {};
1962
-
1963
- function graphLoadCommits(commits) {
1964
- gVertices = []; gBranches = []; gAvailColours = [];
1965
- if (commits.length === 0) return;
1966
-
1967
- const nullVertex = new GVertex(NULL_VERTEX_ID, false);
1968
- const lookup = {};
1969
- for (let i = 0; i < commits.length; i++) {
1970
- lookup[commits[i].hash] = i;
1971
- gVertices.push(new GVertex(i, !!commits[i]._isStash, { name: commits[i].author, email: commits[i].authorEmail }));
1972
- }
1973
- gCommitLookup = lookup;
1974
-
1975
- for (let i = 0; i < commits.length; i++) {
1976
- for (let j = 0; j < commits[i].parents.length; j++) {
1977
- const ph = commits[i].parents[j];
1978
- if (typeof lookup[ph] === 'number') {
1979
- gVertices[i].addParent(gVertices[lookup[ph]]);
1980
- gVertices[lookup[ph]].addChild(gVertices[i]);
1981
- } else {
1982
- gVertices[i].addParent(nullVertex);
1983
- }
1984
- }
1985
- }
1986
-
1987
- if (state.head && typeof lookup[state.head] === 'number') {
1988
- gVertices[lookup[state.head]].setCurrent();
1989
- }
1990
-
1991
- let i = 0;
1992
- while (i < gVertices.length) {
1993
- if (gVertices[i].getNextParent() !== null || gVertices[i].isNotOnBranch()) {
1994
- graphDeterminePath(i);
1995
- } else { i++; }
1996
- }
1997
- }
1998
-
1999
- function graphDeterminePath(startAt) {
2000
- let i = startAt;
2001
- let vertex = gVertices[i], parentVertex = gVertices[i].getNextParent(), curVertex;
2002
- let lastPoint = vertex.isNotOnBranch() ? vertex.getNextPoint() : vertex.getPoint(), curPoint;
2003
-
2004
- if (parentVertex !== null && parentVertex.id !== NULL_VERTEX_ID && vertex.isMerge() && !vertex.isNotOnBranch() && !parentVertex.isNotOnBranch()) {
2005
- let foundPtp = false, pBranch = parentVertex.getBranch();
2006
- for (i = startAt + 1; i < gVertices.length; i++) {
2007
- curVertex = gVertices[i];
2008
- curPoint = curVertex.getPointConnectingTo(parentVertex, pBranch);
2009
- if (curPoint !== null) { foundPtp = true; } else { curPoint = curVertex.getNextPoint(); }
2010
- pBranch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), !foundPtp && curVertex !== parentVertex ? lastPoint.x < curPoint.x : true);
2011
- curVertex.registerUnavailablePoint(curPoint.x, parentVertex, pBranch);
2012
- lastPoint = curPoint;
2013
- if (foundPtp) { vertex.registerParentProcessed(); break; }
2014
- }
2015
- } else {
2016
- const branch = new GBranch(graphGetAvailableColour(startAt), vertex.isStash);
2017
- vertex.addToBranch(branch, lastPoint.x);
2018
- vertex.registerUnavailablePoint(lastPoint.x, vertex, branch);
2019
- for (i = startAt + 1; i < gVertices.length; i++) {
2020
- curVertex = gVertices[i];
2021
- curPoint = parentVertex === curVertex && !parentVertex.isNotOnBranch() ? curVertex.getPoint() : curVertex.getNextPoint();
2022
- branch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), lastPoint.x < curPoint.x);
2023
- curVertex.registerUnavailablePoint(curPoint.x, parentVertex, branch);
2024
- lastPoint = curPoint;
2025
- if (parentVertex === curVertex) {
2026
- vertex.registerParentProcessed();
2027
- const onBranch = !parentVertex.isNotOnBranch();
2028
- parentVertex.addToBranch(branch, curPoint.x);
2029
- vertex = parentVertex;
2030
- parentVertex = vertex.getNextParent();
2031
- if (parentVertex === null || onBranch) break;
2032
- }
2033
- }
2034
- if (i === gVertices.length && parentVertex !== null && parentVertex.id === NULL_VERTEX_ID) {
2035
- vertex.registerParentProcessed();
2036
- }
2037
- branch.setEnd(i);
2038
- gBranches.push(branch);
2039
- gAvailColours[branch.getColour()] = i;
2040
- }
2041
- }
2042
-
2043
- function graphGetAvailableColour(startAt) {
2044
- for (let i = 0; i < gAvailColours.length; i++) {
2045
- if (startAt > gAvailColours[i]) return i;
2046
- }
2047
- gAvailColours.push(0);
2048
- return gAvailColours.length - 1;
2049
- }
2050
-
2051
- function graphRender(expandIdx) {
2052
- const container = document.getElementById('graph-svg-container');
2053
- container.innerHTML = '';
2054
- if (gVertices.length === 0) { state.graphWidth = GRAPH_MIN_W; applyGraphColWidth(); return; }
2055
-
2056
- // Measure actual row height (may be fractional due to browser zoom)
2057
- // and use it for SVG grid to prevent cumulative sub-pixel drift
2058
- const firstRow = document.querySelector('#commit-list .commit-row');
2059
- const rowH = firstRow ? firstRow.getBoundingClientRect().height : graphConfig.grid.y;
2060
- const cfg = { ...graphConfig, grid: { ...graphConfig.grid, y: rowH, offsetY: rowH / 2 } };
2061
-
2062
- const svg = document.createElementNS(SVG_NS, 'svg');
2063
- const group = document.createElementNS(SVG_NS, 'g');
2064
-
2065
- for (let i = 0; i < gBranches.length; i++) gBranches[i].draw(group, cfg, expandIdx);
2066
-
2067
- const overL = (e) => graphVertexOver(e), outL = (e) => graphVertexOut(e);
2068
- for (let i = 0; i < gVertices.length; i++) {
2069
- gVertices[i].draw(group, cfg, expandIdx > -1 && i > expandIdx, overL, outL);
2070
- }
2071
-
2072
- svg.appendChild(group);
2073
-
2074
- let maxX = 0;
2075
- for (let i = 0; i < gVertices.length; i++) {
2076
- const p = gVertices[i].getNextPoint();
2077
- if (p.x > maxX) maxX = p.x;
2078
- }
2079
- const w = 2 * cfg.grid.offsetX + Math.max(maxX - 1, 0) * cfg.grid.x;
2080
- const h = gVertices.length * cfg.grid.y + cfg.grid.offsetY - cfg.grid.y / 2 + (expandIdx > -1 ? cfg.grid.expandY : 0);
2081
-
2082
- const gw = Math.max(w, GRAPH_MIN_W);
2083
- svg.setAttribute('width', gw.toString());
2084
- svg.setAttribute('height', h.toString());
2085
- container.appendChild(svg);
2086
- // The SVG is drawn at the width the lanes need; the column it shows through
2087
- // is a different number entirely, and the panel decides that one.
2088
- state.graphWidth = gw;
2089
- applyGraphColWidth();
2090
- }
2091
-
2092
- /*
2093
- * The widest the graph column may be right now: whatever is left of the panel
2094
- * once the columns that cannot shrink have taken theirs and the message has its
2095
- * floor. Measured from the header rather than from a table of constants, so
2096
- * hiding a column — by the user's choice or by a width tier — gives its pixels
2097
- * to the graph without anything here having to know which columns exist.
2098
- */
2099
- function graphColCap() {
2100
- const header = document.getElementById('graph-header');
2101
- const area = document.getElementById('graph-container');
2102
- if (!header || !area || !area.clientWidth) return MESSAGE_MIN_W;
2103
- let fixed = 0;
2104
- // offsetWidth is 0 for a hidden column, which is exactly the answer wanted.
2105
- header.querySelectorAll('.col-refs, .col-changes, .col-author, .col-date, .col-hash')
2106
- .forEach((cell) => { fixed += cell.offsetWidth; });
2107
- const rowPadding = 12;
2108
- return Math.max(GRAPH_MIN_W, area.clientWidth - fixed - rowPadding - MESSAGE_MIN_W);
2109
- }
2110
-
2111
- /**
2112
- * Publish the graph column's width: the dragged one if there is one, else what
2113
- * the lanes need, both capped to what the panel can spare.
2114
- */
2115
- function applyGraphColWidth() {
2116
- const cap = graphColCap();
2117
- const want = state.graphColWidth === null ? state.graphWidth : state.graphColWidth;
2118
- const width = Math.max(GRAPH_MIN_W, Math.min(want || GRAPH_MIN_W, cap));
2119
- document.documentElement.style.setProperty('--graph-col-w', width + 'px');
2120
- applyGraphPan();
2121
- }
2122
-
2123
- /** How far the graph can be moved: what is drawn, less what the column shows. */
2124
- function graphPanMax() {
2125
- const cell = document.querySelector('#graph-header .col-graph');
2126
- return Math.max(0, state.graphWidth - (cell ? cell.offsetWidth : 0));
2127
- }
2128
-
2129
- /**
2130
- * Move the overlay inside its clip box, and put the hint where the column now
2131
- * is. The hint is not a scrollbar: it takes no room in the table and is only
2132
- * legible while something is moving the graph.
2133
- */
2134
- function applyGraphPan() {
2135
- const cell = document.querySelector('#graph-header .col-graph');
2136
- const shown = cell ? cell.offsetWidth : 0;
2137
- const max = graphPanMax();
2138
- state.graphPanX = Math.min(Math.max(0, state.graphPanX), max);
2139
- document.documentElement.style.setProperty('--graph-pan-x', state.graphPanX + 'px');
2140
- document.documentElement.classList.toggle('graph-can-pan', max > 0);
2141
-
2142
- const bar = document.getElementById('graph-pan-bar');
2143
- const thumb = document.getElementById('graph-pan-thumb');
2144
- if (!bar || !thumb) return;
2145
- bar.classList.toggle('hidden', max <= 0 || !state.graphWidth);
2146
- if (max <= 0 || !state.graphWidth) return;
2147
- const ratio = shown / state.graphWidth;
2148
- thumb.style.width = (ratio * 100) + '%';
2149
- thumb.style.left = ((state.graphPanX / state.graphWidth) * 100) + '%';
2150
- }
2151
-
2152
- /** Show the hint while something is moving the graph, then let it fade. */
2153
- let panHintTimer = null;
2154
- function showPanHint(sticky) {
2155
- const bar = document.getElementById('graph-pan-bar');
2156
- if (!bar || bar.classList.contains('hidden')) return;
2157
- bar.classList.add('visible');
2158
- if (panHintTimer) clearTimeout(panHintTimer);
2159
- panHintTimer = sticky ? null : setTimeout(() => bar.classList.remove('visible'), 700);
2160
- }
2161
-
2162
- function panGraphBy(dx) {
2163
- state.graphPanX += dx;
2164
- applyGraphPan();
2165
- showPanHint(false);
2166
- }
2167
-
2168
- function graphVertexOver(e) {
2169
- if (!e.target || !e.target.dataset || !e.target.dataset.id) return;
2170
- const id = parseInt(e.target.dataset.id);
2171
- if (id >= 0 && id < gVertices.length) {
2172
- const rows = document.querySelectorAll('.commit-row:not(.header-row)');
2173
- if (rows[id]) rows[id].classList.add('graph-hover');
2174
- e.target.setAttribute('r', (Number(e.target.dataset.r || 4.5) + 1.5).toString());
2175
- }
2176
- }
2177
- function graphVertexOut(e) {
2178
- if (!e.target || !e.target.dataset || !e.target.dataset.id) return;
2179
- const id = parseInt(e.target.dataset.id);
2180
- if (id >= 0) {
2181
- const rows = document.querySelectorAll('.commit-row:not(.header-row)');
2182
- if (rows[id]) rows[id].classList.remove('graph-hover');
2183
- e.target.setAttribute('r', (e.target.dataset.r || '4.5'));
2184
- }
2185
- }
2186
-
2187
- // --- Commit list ---
2188
- function getDisplayCommits() {
2189
- let commits = state.commits;
2190
-
2191
- // Inject uncommitted changes virtual commit
2192
- const u = state.uncommitted;
2193
- const totalFiles = u ? (u.staged.length + u.unstaged.length + (u.conflicted ? u.conflicted.length : 0)) : 0;
2194
- if (u && totalFiles > 0) {
2195
- commits = [{
2196
- hash: 'uncommitted',
2197
- parents: state.head ? [state.head] : [],
2198
- author: '', authorEmail: '',
2199
- authorDate: Math.floor(Date.now() / 1000),
2200
- committer: '', committerEmail: '',
2201
- commitDate: Math.floor(Date.now() / 1000),
2202
- refs: [],
2203
- message: 'Uncommitted Changes (' + totalFiles + ' files)',
2204
- }, ...commits];
2205
- }
2206
-
2207
- // Inject stash virtual commits as branch spurs from their parent
2208
- if (state.settings.showStashes && state.stashes.length > 0) {
2209
- const parentIndexes = {};
2210
- const commitHashSet = new Set(commits.map(c => c.hash));
2211
- for (const s of state.stashes) {
2212
- if (!s.parentHash || !commitHashSet.has(s.parentHash)) continue;
2213
- if (!parentIndexes[s.parentHash]) parentIndexes[s.parentHash] = [];
2214
- parentIndexes[s.parentHash].push(s);
2215
- }
2216
- if (Object.keys(parentIndexes).length > 0) {
2217
- const result = [];
2218
- for (const c of commits) {
2219
- // Stash virtual commits must come BEFORE their parent in the array
2220
- // (graph algorithm scans forward to find parents — same pattern as uncommitted)
2221
- const stashesForCommit = parentIndexes[c.hash];
2222
- if (stashesForCommit) {
2223
- for (const s of stashesForCommit) {
2224
- result.push({
2225
- hash: s.hash,
2226
- parents: [s.parentHash],
2227
- author: '', authorEmail: '',
2228
- authorDate: 0, committer: '', committerEmail: '', commitDate: 0,
2229
- refs: [{ type: 'stash', name: 'stash@{' + s.index + '}' }],
2230
- message: s.message,
2231
- _isStash: true,
2232
- });
2233
- }
2234
- }
2235
- result.push(c);
2236
- }
2237
- commits = result;
2238
- }
2239
- }
2240
-
2241
- return commits;
2242
- }
2243
-
2244
- /*
2245
- * Below this width the row carries the graph and the message only, with the
2246
- * author, date and hash on a second line under the subject: six columns of
2247
- * fragments on a phone is not a list of commits, and PPM's layout rules ask for
2248
- * one column there. The value matches the max-width:640px block in the CSS —
2249
- * both have to agree, because the JS decides where the ref badges are put and
2250
- * the CSS decides which columns exist.
2251
- */
2252
- function isNarrowLayout() {
2253
- return typeof window.matchMedia === 'function' && window.matchMedia('(max-width: 640px)').matches;
2254
- }
2255
-
2256
- function renderCommitList() {
2257
- const container = document.getElementById('commit-list');
2258
- container.innerHTML = '';
2259
-
2260
- const displayCommits = getDisplayCommits();
2261
- graphLoadCommits(displayCommits);
2262
-
2263
- // Mark uncommitted vertex for dashed lines
2264
- if (displayCommits.length > 0 && displayCommits[0].hash === 'uncommitted') {
2265
- if (gVertices.length > 0) gVertices[0].setNotCommitted();
2266
- }
2267
-
2268
- displayCommits.forEach((commit, idx) => {
2269
- const isVirtual = commit.hash === 'uncommitted';
2270
- const isStash = !!commit._isStash;
2271
- const row = document.createElement('div');
2272
- row.className = 'commit-row' + (isVirtual ? ' virtual' : '') + (isStash ? ' stash-row' : '');
2273
- row.dataset.hash = commit.hash;
2274
-
2275
- // Branch / tag column. Below 640px there is no room for it, so the badges
2276
- // go inline ahead of the subject instead — one home or the other, never
2277
- // both, or the second copy's context menu would act on a hidden badge.
2278
- const narrow = isNarrowLayout();
2279
- const refsCol = document.createElement('div');
2280
- refsCol.className = 'col-refs';
2281
-
2282
- // Graph spacer column (SVG overlays this area)
2283
- const graphCol = document.createElement('div');
2284
- graphCol.className = 'col-graph';
2285
-
2286
- const msgCol = document.createElement('div');
2287
- msgCol.className = 'col-message';
2288
- let badges = '';
2289
- if (commit.refs) {
2290
- // Known remote prefixes from repo info (e.g. "origin/", "upstream/")
2291
- const remotePrefixes = state.remotes.map(r => r.name + '/');
2292
- // Re-classify refs using known remotes (parser may misclassify local branches with "/" as remote)
2293
- const classified = commit.refs.map(ref => {
2294
- if (ref.type === 'head' || ref.type === 'tag' || ref.type === 'stash') return ref;
2295
- const isActualRemote = remotePrefixes.some(p => ref.name.startsWith(p));
2296
- return { ...ref, type: isActualRemote ? 'remote' : 'local' };
2297
- });
2298
- // Merge remote+local: if origin/X and X both exist, show one synced badge
2299
- const localNames = new Set(classified.filter(r => r.type === 'head' || r.type === 'local').map(r => r.name));
2300
- const mergedRemotes = new Set();
2301
- classified.forEach(ref => {
2302
- if (ref.type === 'remote') {
2303
- const prefix = remotePrefixes.find(p => ref.name.startsWith(p));
2304
- const branchName = prefix ? ref.name.slice(prefix.length) : ref.name;
2305
- if (localNames.has(branchName)) {
2306
- mergedRemotes.add(ref.name);
2307
- }
2308
- }
2309
- });
2310
- classified.forEach(ref => {
2311
- if (ref.type === 'tag' && !state.settings.showTags) return;
2312
- if (ref.type === 'remote' && !state.settings.showRemoteBranches) return;
2313
- if (mergedRemotes.has(ref.name)) return;
2314
- const isSynced = (ref.type === 'head' || ref.type === 'local') &&
2315
- classified.some(r => r.type === 'remote' && remotePrefixes.some(p => r.name === p + ref.name));
2316
- const syncIcon = isSynced ? '<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-1px"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg> ' : '';
2317
- badges += '<span class="ref-badge ref-' + ref.type + '" data-ref="' + escHtml(ref.name) + '">' + syncIcon + escHtml(ref.name) + '</span>';
2318
- });
2319
- }
2320
- if (!narrow) refsCol.innerHTML = badges;
2321
- const meta = isVirtual || isStash ? ''
2322
- : '<span class="msg-meta">' + escHtml(commit.author) + ' \u00b7 '
2323
- + escHtml(formatDate(commit.commitDate)) + ' \u00b7 ' + escHtml(commit.hash.substring(0, 7))
2324
- + '</span>';
2325
- msgCol.innerHTML = '<span class="msg-subject">' + (narrow ? badges : '')
2326
- + formatCommitMessage(commit.message) + '</span>' + meta;
2327
-
2328
- // The lane's colour, for the tick at the start of the message.
2329
- const vertex = gVertices[idx];
2330
- if (vertex && !isVirtual && !isStash) {
2331
- row.style.setProperty('--lane', GRAPH_COLORS[vertex.getColour() % GRAPH_COLORS.length]);
2332
- }
2333
-
2334
- // Attach context menu and double-click to ref badges
2335
- row.appendChild(refsCol);
2336
- row.querySelectorAll('.ref-badge').forEach(badge => {
2337
- const refName = badge.dataset.ref || badge.textContent.trim();
2338
- const refType = badge.className.includes('ref-head') ? 'head'
2339
- : badge.className.includes('ref-remote') ? 'remote'
2340
- : badge.className.includes('ref-tag') ? 'tag'
2341
- : badge.className.includes('ref-stash') ? 'stash' : 'local';
2342
- badge.style.cursor = 'pointer';
2343
- makeRefDraggable(badge, refName, refType);
2344
- if (refType === 'stash') {
2345
- badge.addEventListener('contextmenu', (e) => {
2346
- e.preventDefault();
2347
- e.stopPropagation();
2348
- showStashBadgeMenu(e.clientX, e.clientY, refName);
2349
- });
2350
- } else {
2351
- badge.addEventListener('dblclick', (e) => {
2352
- e.stopPropagation();
2353
- gitAction('checkout', { target: refName });
2354
- });
2355
- badge.addEventListener('contextmenu', (e) => {
2356
- e.preventDefault();
2357
- e.stopPropagation();
2358
- showBranchContextMenu(e.clientX, e.clientY, refName, refType, commit);
2359
- });
2360
- }
2361
- });
2362
-
2363
- const changesCol = document.createElement('div');
2364
- changesCol.className = 'col-changes';
2365
- if (!isVirtual && !isStash) fillChangesCell(changesCol, state.stats[commit.hash]);
2366
-
2367
- const authorCol = document.createElement('div');
2368
- authorCol.className = 'col-author';
2369
- if (isVirtual || isStash) {
2370
- authorCol.textContent = '';
2371
- } else {
2372
- // No avatar here any more — it is the graph node now, and twice on one
2373
- // row was noise.
2374
- authorCol.textContent = commit.author;
2375
- authorCol.addEventListener('mouseenter', () => showAuthorCard(authorCol, commit));
2376
- authorCol.addEventListener('mouseleave', hideAuthorCard);
2377
- }
2378
-
2379
- const dateCol = document.createElement('div');
2380
- dateCol.className = 'col-date';
2381
- dateCol.textContent = isVirtual ? 'now' : isStash ? '' : formatDate(commit.commitDate);
2382
- // The column is relative by default, so the exact moment goes in the title
2383
- // rather than in a wider column.
2384
- if (!isVirtual && !isStash) dateCol.title = new Date(commit.commitDate * 1000).toLocaleString();
2385
-
2386
- const hashCol = document.createElement('div');
2387
- hashCol.className = 'col-hash';
2388
- hashCol.textContent = isVirtual ? '...' : isStash ? '' : commit.hash.substring(0, 7);
2389
-
2390
- row.appendChild(graphCol);
2391
- row.appendChild(msgCol);
2392
- row.appendChild(changesCol);
2393
- row.appendChild(authorCol);
2394
- row.appendChild(dateCol);
2395
- row.appendChild(hashCol);
2396
-
2397
- makeRowDropTarget(row, commit);
2398
- row.addEventListener('click', () => selectCommit(commit.hash));
2399
- if (isVirtual) {
2400
- row.addEventListener('contextmenu', (e) => {
2401
- e.preventDefault();
2402
- showUncommittedContextMenu(e.clientX, e.clientY);
2403
- });
2404
- setupLongPress(row, (x, y) => showUncommittedContextMenu(x, y));
2405
- } else if (isStash) {
2406
- const stashRef = (commit.refs && commit.refs[0]) ? commit.refs[0].name : '';
2407
- row.addEventListener('contextmenu', (e) => {
2408
- e.preventDefault();
2409
- if (stashRef) showStashBadgeMenu(e.clientX, e.clientY, stashRef);
2410
- });
2411
- setupLongPress(row, (x, y) => { if (stashRef) showStashBadgeMenu(x, y, stashRef); });
2412
- } else {
2413
- row.addEventListener('contextmenu', (e) => {
2414
- e.preventDefault();
2415
- showCommitContextMenu(e.clientX, e.clientY, commit);
2416
- });
2417
- setupLongPress(row, (x, y) => showCommitContextMenu(x, y, commit));
2418
- }
2419
-
2420
- container.appendChild(row);
2421
- });
2422
-
2423
- graphRender(-1);
2424
- renderScrollMarkers();
2425
- }
2426
-
2427
- /*
2428
- * A merge commit has no diffstat — that is git's default, not a failure — so an
2429
- * absent entry leaves the cell empty rather than claiming it changed nothing.
2430
- */
2431
- function fillChangesCell(cell, stat) {
2432
- cell.textContent = '';
2433
- if (!stat) return;
2434
- if (stat.insertions > 0) {
2435
- const add = document.createElement('span');
2436
- add.className = 'ch-add';
2437
- add.textContent = '+' + stat.insertions;
2438
- cell.appendChild(add);
2439
- }
2440
- if (stat.deletions > 0) {
2441
- const del = document.createElement('span');
2442
- del.className = 'ch-del';
2443
- del.textContent = '-' + stat.deletions;
2444
- cell.appendChild(del);
2445
- }
2446
- cell.title = stat.files + (stat.files === 1 ? ' file changed' : ' files changed');
2447
- }
2448
-
2449
- /** Fill the column in place: the rows are already drawn, and rebuilding them
2450
- * would throw away the scroll position and the open detail panel. */
2451
- function applyCommitStats() {
2452
- document.querySelectorAll('#commit-list .commit-row').forEach((row) => {
2453
- const cell = row.querySelector('.col-changes');
2454
- const hash = row.dataset.hash;
2455
- if (cell && hash && hash !== 'uncommitted') fillChangesCell(cell, state.stats[hash]);
2456
- });
2457
- }
2458
-
2459
- /*
2460
- * One tick per interesting row, positioned by its index in the whole loaded
2461
- * history rather than by pixels — the rows are a uniform height, so the two
2462
- * agree, and an index needs no measuring and survives a resize.
2463
- *
2464
- * Search matches are drawn first so that the checked-out and selected ticks sit
2465
- * on top of them when they land on the same row.
2466
- */
2467
- function renderScrollMarkers() {
2468
- const host = document.getElementById('scroll-markers');
2469
- if (!host) return;
2470
- host.innerHTML = '';
2471
- const commits = getDisplayCommits();
2472
- if (commits.length === 0) return;
2473
-
2474
- const mark = (idx, kind) => {
2475
- const el = document.createElement('div');
2476
- el.className = 'scroll-marker sm-' + kind;
2477
- el.style.top = ((idx + 0.5) / commits.length * 100) + '%';
2478
- host.appendChild(el);
2479
- };
2480
-
2481
- for (let i = 0; i < state.searchMatches.length; i++) mark(state.searchMatches[i], 'search');
2482
- for (let i = 0; i < commits.length; i++) {
2483
- if (commits[i].hash === state.head) mark(i, 'head');
2484
- if (commits[i].hash === state.selectedCommit) mark(i, 'selected');
2485
- }
2486
- }
2487
-
2488
- function selectCommit(hash) {
2489
- // Deselect previous
2490
- document.querySelectorAll('.commit-row.selected').forEach(el => el.classList.remove('selected'));
2491
-
2492
- if (state.selectedCommit === hash) {
2493
- state.selectedCommit = null;
2494
- state.expandedCommit = null;
2495
- document.getElementById('detail-panel').classList.add('hidden');
2496
- renderScrollMarkers();
2497
- return;
2498
- }
2499
-
2500
- state.selectedCommit = hash;
2501
- state.expandedCommit = hash;
2502
- const row = document.querySelector('[data-hash="' + CSS.escape(hash) + '"]');
2503
- if (row) row.classList.add('selected');
2504
- renderScrollMarkers();
2505
-
2506
- if (hash === 'uncommitted') {
2507
- renderUncommittedDetail();
2508
- return;
2509
- }
2510
- vscode.postMessage({ command: 'requestCommitDetails', hash });
2511
- }
2512
-
2513
- /* One dismiss for the close button and for Escape. They have to leave exactly
2514
- the same state behind: a row still marked selected, or a marker still in
2515
- the scroll bar, outlives the panel that explained it. */
2516
- function closeDetailPanel() {
2517
- state.selectedCommit = null;
2518
- state.expandedCommit = null;
2519
- document.getElementById('detail-panel').classList.add('hidden');
2520
- document.querySelectorAll('.commit-row.selected').forEach(el => el.classList.remove('selected'));
2521
- renderScrollMarkers();
2522
- }
2523
-
2524
- // --- File tree helpers ---
2525
- function buildFileTree(files) {
2526
- const root = { name: '', children: {}, files: [] };
2527
- for (const f of files) {
2528
- const parts = f.path.split('/');
2529
- let node = root;
2530
- for (let i = 0; i < parts.length - 1; i++) {
2531
- if (!node.children[parts[i]]) node.children[parts[i]] = { name: parts[i], children: {}, files: [] };
2532
- node = node.children[parts[i]];
2533
- }
2534
- node.files.push({ ...f, fileName: parts[parts.length - 1] });
2535
- }
2536
- return root;
2537
- }
2538
-
2539
- function countFiles(node) {
2540
- let count = node.files.length;
2541
- for (const child of Object.values(node.children)) count += countFiles(child);
2542
- return count;
2543
- }
2544
-
2545
- function renderFileTree(node, depth, hash, parentHash, section) {
2546
- let html = '';
2547
- const dirs = Object.keys(node.children).sort();
2548
- for (const dir of dirs) {
2549
- const child = node.children[dir];
2550
- html += '<div class="tree-dir" style="padding-left:' + (depth * 16) + 'px">';
2551
- html += ICONS.folderOpen + ' <span class="tree-dir-name">' + escHtml(dir) + '/</span>';
2552
- html += '<span class="tree-dir-count">(' + countFiles(child) + ')</span></div>';
2553
- html += renderFileTree(child, depth + 1, hash, parentHash, section);
2554
- }
2555
- const sortedFiles = [...node.files].sort((a, b) => a.fileName.localeCompare(b.fileName));
2556
- for (const f of sortedFiles) {
2557
- html += '<div class="file-item file-clickable" style="padding-left:' + (depth * 16) + 'px" ';
2558
- html += 'data-path="' + escHtml(f.path) + '" data-hash="' + escHtml(hash) + '" data-parent="' + escHtml(parentHash || '') + '">';
2559
- html += '<span class="file-status file-status-' + escHtml(f.status) + '">' + escHtml(f.status) + '</span>';
2560
- html += '<span class="file-name">' + escHtml(f.fileName) + '</span>';
2561
- if (f.additions > 0 || f.deletions > 0) {
2562
- html += '<span class="file-stat">';
2563
- if (f.additions > 0) html += '<span class="add">+' + f.additions + '</span> ';
2564
- if (f.deletions > 0) html += '<span class="del">-' + f.deletions + '</span>';
2565
- html += '</span>';
2566
- }
2567
- if (section) html += renderFileActions(f, section);
2568
- html += '</div>';
2569
- }
2570
- return html;
2571
- }
2572
-
2573
- /* Split so the file name can be shown before the directory it sits in: the
2574
- list lives in a narrow column, and truncating from the end has to eat the
2575
- path, not the name. */
2576
- function basename(path) {
2577
- const i = String(path).lastIndexOf('/');
2578
- return i === -1 ? String(path) : String(path).slice(i + 1);
2579
- }
2580
- function dirname(path) {
2581
- const i = String(path).lastIndexOf('/');
2582
- return i === -1 ? '' : String(path).slice(0, i);
2583
- }
2584
-
2585
- function renderFileListHtml(files, hash, parentHash, section) {
2586
- if (state.fileViewMode === 'tree') {
2587
- return renderFileTree(buildFileTree(files), 0, hash, parentHash, section);
2588
- }
2589
- return files.map(f =>
2590
- '<div class="file-item file-clickable" title="' + escHtml(f.path) + '" data-path="' + escHtml(f.path) + '" data-hash="' + escHtml(hash) + '" data-parent="' + escHtml(parentHash || '') + '">' +
2591
- '<span class="file-status file-status-' + escHtml(f.status) + '">' + escHtml(f.status) + '</span>' +
2592
- '<span class="file-name">' + escHtml(basename(f.path)) + '</span>' +
2593
- (dirname(f.path) ? '<span class="file-dir">' + escHtml(dirname(f.path)) + '</span>' : '') +
2594
- '<span class="file-stat">' +
2595
- (f.additions > 0 ? '<span class="add">+' + f.additions + '</span> ' : '') +
2596
- (f.deletions > 0 ? '<span class="del">-' + f.deletions + '</span>' : '') +
2597
- '</span>' +
2598
- (section ? renderFileActions(f, section) : '') +
2599
- '</div>'
2600
- ).join('');
2601
- }
2602
-
2603
- /* A cap that does not say it capped states a wrong number as a fact: a commit
2604
- touching ten thousand files rendered as "500 files changed", which is a
2605
- sentence the panel has no evidence for. The message cap already spells its
2606
- own truncation out, so this says it the same way. */
2607
- function fileCountLabel(shown, omitted) {
2608
- return shown + (shown === 1 ? ' file' : ' files') + ' changed'
2609
- + (omitted > 0 ? ' [… ' + omitted + ' more]' : '');
2610
- }
2611
-
2612
- function renderFileActions(file, section) {
2613
- let html = '<span class="file-actions">';
2614
- if (section === 'unstaged') {
2615
- html += '<button class="file-action-btn" data-action="stage" data-file="' + escHtml(file.path) + '" title="Stage">' + ICONS.plus + '</button>';
2616
- html += '<button class="file-action-btn" data-action="discard" data-file="' + escHtml(file.path) + '" title="Discard changes">' + ICONS.x + '</button>';
2617
- } else if (section === 'staged') {
2618
- html += '<button class="file-action-btn" data-action="unstage" data-file="' + escHtml(file.path) + '" title="Unstage">' + ICONS.minus + '</button>';
2619
- }
2620
- html += '<button class="file-action-btn" data-action="open" data-file="' + escHtml(file.path) + '" title="Open file">' + ICONS.fileOpen + '</button>';
2621
- html += '</span>';
2622
- return html;
2623
- }
2624
-
2625
- function fileViewToggleHtml() {
2626
- return '<div class="file-view-toggle">' +
2627
- '<button class="toggle-btn' + (state.fileViewMode === 'list' ? ' active' : '') + '" data-view="list" title="List view">' + ICONS.list + '</button>' +
2628
- '<button class="toggle-btn' + (state.fileViewMode === 'tree' ? ' active' : '') + '" data-view="tree" title="Tree view">' + ICONS.tree + '</button>' +
2629
- '</div>';
2630
- }
2631
-
2632
- function renderUncommittedDetail() {
2633
- const panel = document.getElementById('detail-panel');
2634
- panel.classList.remove('hidden');
2635
- panel.classList.remove('split');
2636
- const u = state.uncommitted;
2637
- if (!u) { panel.classList.add('hidden'); return; }
2638
- let html = '<div class="detail-pad"><h3>Uncommitted Changes</h3>';
2639
- const hasFiles = u.staged.length > 0 || u.unstaged.length > 0 || (u.conflicted && u.conflicted.length > 0);
2640
- if (hasFiles) {
2641
- html += fileViewToggleHtml();
2642
- }
2643
- // Conflict section (above staged/unstaged)
2644
- if (u.conflicted && u.conflicted.length > 0) {
2645
- html += '<div class="file-list"><div class="conflict-header">⚠ Conflicts (' + u.conflicted.length + ')</div>';
2646
- html += u.conflicted.map(f => {
2647
- const fileName = f.path.split('/').pop() || f.path;
2648
- return '<div class="file-item">'
2649
- + '<span class="file-status file-status-U">U</span>'
2650
- + '<span class="file-clickable" data-file="' + escHtml(f.path) + '" data-hash="uncommitted" data-parent="' + escHtml(state.head) + '">' + escHtml(f.path) + '</span>'
2651
- + '<div class="file-actions">'
2652
- + '<button class="file-action-btn" data-action="open-conflict" data-file="' + escHtml(f.path) + '" title="Open conflict file">' + ICONS.fileOpen + '</button>'
2653
- + '<button class="file-action-btn" data-action="stage" data-file="' + escHtml(f.path) + '" title="Mark resolved (stage)">' + ICONS.plus + '</button>'
2654
- + '</div></div>';
2655
- }).join('');
2656
- html += '</div>';
2657
- }
2658
- if (u.staged.length > 0) {
2659
- html += '<div class="file-list"><div class="section-actions"><strong>Staged (' + u.staged.length + '):</strong>';
2660
- html += '<button class="btn-sm section-action-btn" data-action="unstage-all">Unstage All</button></div>';
2661
- html += renderFileListHtml(u.staged, 'staged', state.head, 'staged');
2662
- html += '</div>';
2663
- }
2664
- if (u.unstaged.length > 0) {
2665
- html += '<div class="file-list"><div class="section-actions"><strong>Unstaged (' + u.unstaged.length + '):</strong>';
2666
- html += '<button class="btn-sm section-action-btn" data-action="stage-all">Stage All</button></div>';
2667
- html += renderFileListHtml(u.unstaged, 'uncommitted', state.head, 'unstaged');
2668
- html += '</div>';
2669
- }
2670
- if (u.staged.length === 0 && u.unstaged.length === 0 && (!u.conflicted || u.conflicted.length === 0)) {
2671
- html += '<p>No uncommitted changes.</p>';
2672
- }
2673
- html += '<div class="commit-section">';
2674
- html += '<textarea id="commit-message" placeholder="Commit message..." rows="3"></textarea>';
2675
- html += '<div class="commit-actions"><button id="btn-commit" class="btn-sm btn-commit" disabled>Commit</button></div>';
2676
- html += '</div></div>';
2677
- panel.innerHTML = html;
2678
- wireCommitControls();
2679
- }
2680
-
2681
- function wireCommitControls() {
2682
- const textarea = document.getElementById('commit-message');
2683
- const commitBtn = document.getElementById('btn-commit');
2684
- if (!textarea || !commitBtn) return;
2685
- const updateBtn = () => {
2686
- const hasMsg = textarea.value.trim().length > 0;
2687
- const hasStaged = state.uncommitted && state.uncommitted.staged.length > 0;
2688
- commitBtn.disabled = !(hasMsg && hasStaged);
2689
- };
2690
- textarea.addEventListener('input', updateBtn);
2691
- updateBtn();
2692
- commitBtn.addEventListener('click', () => {
2693
- const message = textarea.value.trim();
2694
- if (!message) return;
2695
- vscode.postMessage({ command: 'gitAction', action: 'commit', args: { message } });
2696
- textarea.value = '';
2697
- commitBtn.disabled = true;
2698
- });
2699
- }
2700
-
2701
- // --- Detail panel ---
2702
-
2703
- /* A value you can read in full and click to copy. Anything with a data-copy
2704
- attribute is handled by the panel's one click delegate. */
2705
- function copyable(inner, text, cls) {
2706
- return '<span class="meta-value ' + cls + '" data-copy="' + escHtml(text)
2707
- + '" title="Click to copy">' + inner + '</span>';
2708
- }
2709
-
2710
- /* Forty hex characters in one run is not text anyone reads. The eight that
2711
- identify the commit carry the contrast and the other thirty-two go quiet —
2712
- the whole thing is still there, and still what a click copies. */
2713
- function hashCell(hash) {
2714
- const lead = String(hash).slice(0, 8);
2715
- const tail = String(hash).slice(8);
2716
- return copyable('<span class="hash-lead">' + escHtml(lead) + '</span>' + escHtml(tail), hash, 'mono');
2717
- }
2718
-
2719
- /* Name and email are two things, so they are told apart by weight rather than
2720
- by angle brackets. What a click copies is still the canonical form, which is
2721
- what git itself wants back. */
2722
- function personCell(name, email) {
2723
- return copyable(
2724
- '<span class="meta-name">' + escHtml(name) + '</span><span class="meta-email">' + escHtml(email) + '</span>',
2725
- name + ' <' + email + '>',
2726
- 'person',
2727
- );
2728
- }
2729
-
2730
- /* The timezone is part of the answer: a commit stamped 09:13 means nothing
2731
- without knowing whose morning that was. Spelled out component by component
2732
- because dateStyle and timeStyle may not be combined with any other option —
2733
- asking for those plus timeZoneName is a TypeError, and behind a catch it
2734
- looks exactly like a locale that has no timezone name to give. */
2735
- const WHEN_FORMAT = {
2736
- year: 'numeric', month: 'short', day: 'numeric',
2737
- hour: 'numeric', minute: '2-digit', second: '2-digit',
2738
- timeZoneName: 'short',
2739
- };
2740
- function whenCell(ts) {
2741
- const when = new Date(ts * 1000);
2742
- return '<span class="meta-when">' + escHtml(when.toLocaleString(undefined, WHEN_FORMAT)) + '</span>';
2743
- }
2744
-
2745
- /* One label, one value, every row the same shape. The date used to ride along
2746
- in a third column so that the two dates lined up — which put it a name's
2747
- width away from the name it belonged to, and stranded it against the far edge
2748
- of the pane on any row that had one. A date is a field like the others. */
2749
- function metaRow(label, cells) {
2750
- return '<div class="meta-label">' + escHtml(label) + '</div>'
2751
- + '<div class="meta-cells">' + cells.join('') + '</div>';
2752
- }
2753
-
2754
- function renderDetailPanel(detail) {
2755
- state._lastDetail = detail;
2756
- const panel = document.getElementById('detail-panel');
2757
- panel.classList.remove('hidden');
2758
-
2759
- // Who and when, then the way out: the glanceable half.
2760
- let head = '<div class="detail-head">' + avatarHtml(detail.author, detail.authorEmail);
2761
- head += '<div class="detail-who">';
2762
- head += '<span class="detail-author" title="' + escHtml(detail.authorEmail) + '">' + escHtml(detail.author) + '</span>';
2763
- head += '<span class="detail-when" title="' + escHtml(new Date(detail.authorDate * 1000).toLocaleString()) + '">committed ' + escHtml(formatDate(detail.authorDate)) + '</span>';
2764
- if (detail.committer !== detail.author) {
2765
- head += '<span class="detail-when" title="' + escHtml(detail.committerEmail) + '">via ' + escHtml(detail.committer) + '</span>';
2766
- }
2767
- head += '</div><div class="detail-head-actions">';
2768
- head += '<button class="detail-close" title="Close (Esc)" aria-label="Close commit details">' + ICONS.x + '</button>';
2769
- head += '</div></div>';
2770
-
2771
- // Then the values themselves, which since the chips gave up the header is
2772
- // where both hashes are. Every row is always here, in
2773
- // the same order, even when the committer repeats the author: a field that
2774
- // comes and goes cannot be found by muscle memory, and the two dates only
2775
- // mean anything next to each other — which is what a rebase or an amend does
2776
- // to them, and the reason both are separate fields rather than one date.
2777
- let meta = '<div class="detail-meta">';
2778
- meta += metaRow('Commit', [hashCell(detail.hash)]);
2779
- if (detail.parents.length > 0) {
2780
- meta += metaRow(detail.parents.length > 1 ? 'Parents' : 'Parent', detail.parents.map(hashCell));
2781
- }
2782
- meta += metaRow('Author', [personCell(detail.author, detail.authorEmail)]);
2783
- meta += metaRow('Author date', [whenCell(detail.authorDate)]);
2784
- meta += metaRow('Committer', [personCell(detail.committer, detail.committerEmail)]);
2785
- meta += metaRow('Commit date', [whenCell(detail.commitDate)]);
2786
- meta += '</div>';
2787
-
2788
- // The subject carries the weight; the body keeps the author's own wrapping.
2789
- const message = String(detail.message || '');
2790
- const firstBreak = message.indexOf('\\n');
2791
- const subject = firstBreak === -1 ? message : message.slice(0, firstBreak);
2792
- const body = firstBreak === -1 ? '' : message.slice(firstBreak + 1).replace(/^\\n+/, '').replace(/\\s+$/, '');
2793
- let left = '<div class="detail-msg">' + meta + '<div class="detail-subject">' + formatCommitMessage(subject) + '</div>';
2794
- if (body) {
2795
- // A paragraph the author wrapped at 72 columns is reflowed to the pane it
2796
- // is actually in; a list or an aligned block keeps every break it had.
2797
- let blocks = '';
2798
- for (const block of splitCommitBody(body)) {
2799
- blocks += block.kind === 'prose'
2800
- ? '<p class="msg-p">' + formatCommitMessage(block.text) + '</p>'
2801
- : '<pre class="msg-pre">' + formatCommitMessage(block.text) + '</pre>';
2802
- }
2803
- left += '<div class="detail-text">' + blocks + '</div>';
2804
- }
2805
- left += '</div>';
2806
-
2807
- let right = '';
2808
- if (detail.fileChanges && detail.fileChanges.length > 0) {
2809
- let added = 0, removed = 0;
2810
- for (const f of detail.fileChanges) { added += f.additions || 0; removed += f.deletions || 0; }
2811
- right = '<div class="detail-files"><div class="file-list"><div class="files-head">'
2812
- + '<span>' + fileCountLabel(detail.fileChanges.length, detail.filesOmitted || 0) + '</span>'
2813
- + '<span class="files-total">'
2814
- + (added > 0 ? '<span class="add">+' + added + '</span> ' : '')
2815
- + (removed > 0 ? '<span class="del">-' + removed + '</span>' : '')
2816
- + '</span>' + fileViewToggleHtml() + '</div>'
2817
- + renderFileListHtml(detail.fileChanges, detail.hash, detail.parents[0] || '')
2818
- + '</div></div>';
2819
- }
2820
-
2821
- // The split panes each own a scrollbar, which means the panel must stop
2822
- // owning one — and must give it back for any other view written into it.
2823
- panel.classList.toggle('split', !!right);
2824
- panel.innerHTML = head + '<div class="detail-grid' + (right ? ' has-files' : '') + '">' + left + right + '</div>';
2825
- }
2826
-
2827
- // --- Context menu ---
2828
- function showCommitContextMenu(x, y, commit) {
2829
- const menu = document.getElementById('context-menu');
2830
- const items = [
2831
- { label: 'Copy Commit Hash', action: () => copyText(commit.hash) },
2832
- { label: 'Copy Short Hash', action: () => copyText(commit.hash.substring(0, 7)) },
2833
- { separator: true },
2834
- { label: 'Checkout...', action: () => gitAction('checkout', { target: commit.hash }) },
2835
- { label: 'Create Branch Here...', action: () => promptAndAction('Branch name:', (name) => gitAction('createBranch', { name, startPoint: commit.hash })) },
2836
- { label: 'Create Tag Here...', action: () => promptAndAction('Tag name:', (name) => gitAction('createTag', { name, hash: commit.hash })) },
2837
- { label: 'Create Worktree Here...', action: () => showCreateWorktreeDialog(commit.hash) },
2838
- { separator: true },
2839
- { label: 'Rebase current branch onto this...', action: () => {
2840
- showDialog({
2841
- title: 'Rebase',
2842
- message: 'Rebase current branch (' + escHtml(state.currentBranch) + ') onto commit ' + commit.hash.substring(0, 7) + '?',
2843
- rawMessage: true,
2844
- confirmLabel: 'Rebase',
2845
- onConfirm: () => gitAction('rebase', { branch: commit.hash }),
2846
- });
2847
- }},
2848
- ];
2849
- // Add "Create PR" if PR creation is configured and commit has a branch ref
2850
- if (state.settings.prCreation && state.settings.prCreation.urlTemplate) {
2851
- const branchRef = (commit.refs || []).find(r => r.type === 'local' || r.type === 'head');
2852
- if (branchRef) {
2853
- items.push({ separator: true });
2854
- items.push({ label: 'Create Pull Request (' + branchRef.name + ')', action: () => openPrUrl(branchRef.name) });
2855
- }
2856
- }
2857
- items.push(
2858
- { separator: true },
2859
- { label: 'Cherry-pick', action: () => gitAction('cherryPick', { hash: commit.hash }) },
2860
- { label: 'Revert', action: () => gitAction('revert', { hash: commit.hash }) },
2861
- { separator: true },
2862
- { label: 'Interactive rebase from here...', action: () => vscode.postMessage({ command: 'openInteractiveRebase', base: commit.hash }) },
2863
- { label: 'Compare with current branch...', action: () => vscode.postMessage({ command: 'openCompare', ref1: commit.hash, ref2: state.currentBranch || undefined }) },
2864
- { separator: true },
2865
- { label: 'Reset Current Branch to Here...', destructive: true, action: () => promptResetMode(commit.hash) },
2866
- );
2867
-
2868
- let html = '';
2869
- items.forEach((item, idx) => {
2870
- if (item.separator) {
2871
- html += '<div class="ctx-separator"></div>';
2872
- } else {
2873
- html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
2874
- }
2875
- });
2876
- menu.innerHTML = html;
2877
-
2878
- // Position (clamp to viewport)
2879
- menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
2880
- menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
2881
- menu.classList.remove('hidden');
2882
-
2883
- // Bind click handlers
2884
- menu.querySelectorAll('.ctx-item').forEach(el => {
2885
- const idx = parseInt(el.dataset.idx);
2886
- const item = items[idx];
2887
- if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
2888
- });
2889
-
2890
- // Close on click outside
2891
- setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
2892
- }
2893
-
2894
- function showUncommittedContextMenu(x, y) {
2895
- const menu = document.getElementById('context-menu');
2896
- const items = [
2897
- { label: 'Stash Uncommitted Changes...', action: () => {
2898
- showDialog({
2899
- title: 'Stash Changes',
2900
- input: { placeholder: 'Stash message (optional)' },
2901
- confirmLabel: 'Stash',
2902
- onConfirm: (message) => gitAction('stashSave', message ? { message } : {}),
2903
- });
2904
- }},
2905
- { label: 'Reset Uncommitted Changes...', destructive: true, action: () => {
2906
- showDialog({
2907
- title: 'Reset Changes',
2908
- message: 'Reset all uncommitted changes. Staged changes will be unstaged.',
2909
- select: { options: ['mixed', 'hard'], defaultValue: 'mixed', label: 'Reset mode:' },
2910
- destructive: true,
2911
- confirmLabel: 'Reset',
2912
- onConfirm: (mode) => {
2913
- if (mode === 'hard') {
2914
- showDialog({
2915
- title: 'Confirm Hard Reset',
2916
- message: 'WARNING: --hard will permanently discard ALL uncommitted changes!',
2917
- destructive: true,
2918
- confirmLabel: 'Reset Hard',
2919
- onConfirm: () => gitAction('reset', { mode: 'hard', hash: 'HEAD' }),
2920
- });
2921
- } else {
2922
- gitAction('reset', { mode, hash: 'HEAD' });
2923
- }
2924
- },
2925
- });
2926
- }},
2927
- { label: 'Clean Untracked Files...', destructive: true, action: () => {
2928
- showDialog({
2929
- title: 'Clean Untracked Files',
2930
- message: 'Permanently delete all untracked files and directories. This cannot be undone!',
2931
- destructive: true,
2932
- confirmLabel: 'Clean',
2933
- onConfirm: () => gitAction('clean', {}),
2934
- });
2935
- }},
2936
- { separator: true },
2937
- { label: 'Open Source Control View', action: () => vscode.postMessage({ command: 'openSourceControl' }) },
2938
- ];
2939
-
2940
- let html = '';
2941
- items.forEach((item, idx) => {
2942
- if (item.separator) {
2943
- html += '<div class="ctx-separator"></div>';
2944
- } else {
2945
- html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
2946
- }
2947
- });
2948
- menu.innerHTML = html;
2949
- menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
2950
- menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
2951
- menu.classList.remove('hidden');
2952
- menu.querySelectorAll('.ctx-item').forEach(el => {
2953
- const idx = parseInt(el.dataset.idx);
2954
- const item = items[idx];
2955
- if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
2956
- });
2957
- setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
2958
- }
2959
-
2960
- function showBranchContextMenu(x, y, branchName, refType, commit) {
2961
- const menu = document.getElementById('context-menu');
2962
- const items = [];
2963
-
2964
- if (refType === 'head' || refType === 'local') {
2965
- items.push(
2966
- { label: 'Checkout "' + branchName + '"', action: () => gitAction('checkout', { target: branchName }) },
2967
- { label: 'Merge into current branch', action: () => showDialog({
2968
- title: 'Merge "' + branchName + '"',
2969
- message: 'Merge "' + branchName + '" into the current branch?',
2970
- confirmLabel: 'Merge',
2971
- onConfirm: () => gitAction('merge', { branch: branchName }),
2972
- })
2973
- },
2974
- { label: 'Rebase onto "' + branchName + '"', action: () => showDialog({
2975
- title: 'Rebase onto "' + branchName + '"',
2976
- message: 'Rebase current branch onto "' + branchName + '"?',
2977
- confirmLabel: 'Rebase',
2978
- onConfirm: () => gitAction('rebase', { branch: branchName }),
2979
- })
2980
- },
2981
- { separator: true },
2982
- { label: 'Rename branch...', action: () => showDialog({
2983
- title: 'Rename Branch',
2984
- input: { placeholder: 'New branch name', defaultValue: branchName },
2985
- confirmLabel: 'Rename',
2986
- onConfirm: (newName) => { if (newName && newName !== branchName) gitAction('renameBranch', { oldName: branchName, newName }); },
2987
- })
2988
- },
2989
- );
2990
- if (refType !== 'head') {
2991
- items.push(
2992
- { label: 'Delete branch...', destructive: true, action: () => showDialog({
2993
- title: 'Delete Branch',
2994
- message: 'Delete local branch "' + branchName + '"?',
2995
- destructive: true,
2996
- confirmLabel: 'Delete',
2997
- onConfirm: () => gitAction('deleteBranch', { name: branchName, force: false }),
2998
- })
2999
- },
3000
- );
3001
- }
3002
- if (state.settings.prCreation && state.settings.prCreation.urlTemplate) {
3003
- items.push({ separator: true });
3004
- items.push({ label: 'Create Pull Request', action: () => openPrUrl(branchName) });
3005
- }
3006
- } else if (refType === 'remote') {
3007
- items.push(
3008
- { label: 'Checkout as local branch', action: () => gitAction('checkout', { target: branchName }) },
3009
- { separator: true },
3010
- { label: 'Delete remote branch...', destructive: true, action: () => showDialog({
3011
- title: 'Delete Remote Branch',
3012
- message: 'Delete remote branch "' + branchName + '"? This cannot be undone.',
3013
- destructive: true,
3014
- confirmLabel: 'Delete',
3015
- onConfirm: () => {
3016
- const parts = branchName.split('/');
3017
- const remote = parts[0];
3018
- const branch = parts.slice(1).join('/');
3019
- gitAction('push', { remote, branch, force: false, delete: true });
3020
- },
3021
- })
3022
- },
3023
- );
3024
- } else if (refType === 'tag') {
3025
- items.push(
3026
- { label: 'Checkout tag "' + branchName + '"', action: () => gitAction('checkout', { target: branchName }) },
3027
- { separator: true },
3028
- { label: 'Delete tag...', destructive: true, action: () => showDialog({
3029
- title: 'Delete Tag',
3030
- message: 'Delete tag "' + branchName + '"?',
3031
- destructive: true,
3032
- confirmLabel: 'Delete',
3033
- onConfirm: () => gitAction('deleteTag', { name: branchName }),
3034
- })
3035
- },
3036
- );
3037
- }
3038
-
3039
- let html = '';
3040
- items.forEach((item, idx) => {
3041
- if (item.separator) {
3042
- html += '<div class="ctx-separator"></div>';
3043
- } else {
3044
- html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
3045
- }
3046
- });
3047
- menu.innerHTML = html;
3048
- menu.style.left = Math.min(x, window.innerWidth - 220) + 'px';
3049
- menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
3050
- menu.classList.remove('hidden');
3051
- menu.querySelectorAll('.ctx-item').forEach(el => {
3052
- const idx = parseInt(el.dataset.idx);
3053
- const item = items[idx];
3054
- if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
3055
- });
3056
- setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
3057
- }
3058
-
3059
- function showStashBadgeMenu(x, y, stashRef) {
3060
- const menu = document.getElementById('context-menu');
3061
- const items = [
3062
- { label: 'Apply (keep stash)', action: () => gitAction('stashApply', { stashRef }) },
3063
- { label: 'Pop (apply & remove)', action: () => gitAction('stashPop', { stashRef }) },
3064
- { separator: true },
3065
- { label: 'Drop stash...', destructive: true, action: () => showDialog({
3066
- title: 'Drop Stash',
3067
- message: 'Delete ' + stashRef + '? This cannot be undone.',
3068
- destructive: true,
3069
- confirmLabel: 'Drop',
3070
- onConfirm: () => gitAction('stashDrop', { stashRef }),
3071
- })
3072
- },
3073
- ];
3074
- let html = '';
3075
- items.forEach((item, idx) => {
3076
- if (item.separator) {
3077
- html += '<div class="ctx-separator"></div>';
3078
- } else {
3079
- html += '<div class="ctx-item' + (item.destructive ? ' destructive' : '') + '" data-idx="' + idx + '">' + escHtml(item.label) + '</div>';
3080
- }
3081
- });
3082
- menu.innerHTML = html;
3083
- menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
3084
- menu.style.top = Math.min(y, window.innerHeight - 200) + 'px';
3085
- menu.classList.remove('hidden');
3086
- menu.querySelectorAll('.ctx-item').forEach(el => {
3087
- const idx = parseInt(el.dataset.idx);
3088
- const item = items[idx];
3089
- if (item && item.action) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
3090
- });
3091
- setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
3092
- }
3093
-
3094
- function hideContextMenu() {
3095
- document.getElementById('context-menu').classList.add('hidden');
3096
- }
3097
-
3098
- function gitAction(action, args) {
3099
- vscode.postMessage({ command: 'gitAction', action, args });
3100
- }
3101
-
3102
- function promptAndAction(title, callback) {
3103
- showDialog({ title, input: { placeholder: title }, onConfirm: (val) => { if (val) callback(val); } });
3104
- }
3105
-
3106
- function promptResetMode(hash) {
3107
- showDialog({
3108
- title: 'Reset Current Branch',
3109
- select: { options: ['soft', 'mixed', 'hard'], defaultValue: 'mixed', label: 'Reset mode:' },
3110
- onConfirm: (mode) => {
3111
- if (mode === 'hard') {
3112
- showDialog({
3113
- title: 'Confirm Hard Reset',
3114
- message: 'WARNING: --hard will discard ALL uncommitted changes. This cannot be undone!',
3115
- destructive: true,
3116
- confirmLabel: 'Reset Hard',
3117
- onConfirm: () => gitAction('reset', { mode, hash }),
3118
- });
3119
- } else {
3120
- gitAction('reset', { mode, hash });
3121
- }
3122
- },
3123
- });
3124
- }
3125
-
3126
- /* A panel is mounted sandbox="allow-scripts" with no allow-same-origin, so it
3127
- runs at an OPAQUE ORIGIN — and the default Permissions Policy allowlist for
3128
- clipboard-write is "self", which an opaque origin never matches. Measured in
3129
- Chromium with the iframe focused and a real click: writeText rejects with
3130
- NotAllowedError ("blocked because of a permissions policy"), while a textarea
3131
- plus execCommand('copy') returns true and the text really does land on the
3132
- system clipboard (pasted it back out to check). So every click-to-copy value
3133
- in every panel had been copying nothing, and saying that it had.
3134
-
3135
- The modern call is still tried first, for the day the policy changes. The
3136
- textarea has to stay RENDERED — display:none or visibility:hidden give an
3137
- empty selection and execCommand then copies nothing while still returning
3138
- true — and setSelectionRange is what actually selects on iOS. */
3139
- async function copyText(text) {
3140
- if (navigator.clipboard && navigator.clipboard.writeText) {
3141
- try {
3142
- await navigator.clipboard.writeText(text);
3143
- return true;
3144
- } catch (e) { /* fall through */ }
3145
- }
3146
- const ta = document.createElement('textarea');
3147
- ta.value = String(text == null ? '' : text);
3148
- ta.setAttribute('readonly', '');
3149
- ta.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px;padding:0;border:none;opacity:0;';
3150
- document.body.appendChild(ta);
3151
- const selection = document.getSelection();
3152
- const previous = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
3153
- try {
3154
- ta.focus();
3155
- ta.select();
3156
- ta.setSelectionRange(0, ta.value.length);
3157
- return document.execCommand('copy');
3158
- } catch (e) {
3159
- return false;
3160
- } finally {
3161
- ta.remove();
3162
- if (selection && previous) { selection.removeAllRanges(); selection.addRange(previous); }
3163
- }
3164
- }
3165
-
3166
- // --- Dialog system ---
3167
- function showDialog(opts) {
3168
- const overlay = document.createElement('div');
3169
- overlay.className = 'dialog-overlay';
3170
- const dialog = document.createElement('div');
3171
- dialog.className = 'dialog';
3172
- dialog.innerHTML = '<h3>' + escHtml(opts.title || 'Dialog') + '</h3>';
3173
- if (opts.message) {
3174
- const msgHtml = opts.rawMessage ? opts.message : escHtml(opts.message);
3175
- dialog.innerHTML += '<p' + (opts.destructive ? ' class="warning"' : '') + '>' + msgHtml + '</p>';
3176
- }
3177
-
3178
- let inputEl = null;
3179
- if (opts.input) {
3180
- inputEl = document.createElement('input');
3181
- inputEl.type = 'text';
3182
- inputEl.placeholder = opts.input.placeholder || '';
3183
- if (opts.input.defaultValue) inputEl.value = opts.input.defaultValue;
3184
- dialog.appendChild(inputEl);
3185
- }
3186
- if (opts.select) {
3187
- if (opts.select.label) dialog.innerHTML += '<p>' + escHtml(opts.select.label) + '</p>';
3188
- inputEl = document.createElement('select');
3189
- opts.select.options.forEach(o => {
3190
- const opt = document.createElement('option');
3191
- opt.value = o; opt.textContent = o;
3192
- if (o === opts.select.defaultValue) opt.selected = true;
3193
- inputEl.appendChild(opt);
3194
- });
3195
- dialog.appendChild(inputEl);
3196
- }
3197
-
3198
- const actions = document.createElement('div');
3199
- actions.className = 'dialog-actions';
3200
- const cancelBtn = document.createElement('button');
3201
- cancelBtn.textContent = opts.cancelLabel || 'Cancel';
3202
- cancelBtn.className = 'secondary';
3203
- cancelBtn.addEventListener('click', () => overlay.remove());
3204
- const confirmBtn = document.createElement('button');
3205
- confirmBtn.textContent = opts.confirmLabel || 'OK';
3206
- confirmBtn.className = opts.destructive ? 'btn-danger' : 'btn-primary';
3207
- confirmBtn.addEventListener('click', () => {
3208
- overlay.remove();
3209
- if (opts.onConfirm) opts.onConfirm(inputEl ? inputEl.value : undefined);
3210
- });
3211
- actions.appendChild(cancelBtn);
3212
- actions.appendChild(confirmBtn);
3213
- dialog.appendChild(actions);
3214
- overlay.appendChild(dialog);
3215
- document.body.appendChild(overlay);
3216
-
3217
- // Focus input and handle Enter/Escape
3218
- if (inputEl) setTimeout(() => inputEl.focus(), 50);
3219
- overlay.addEventListener('keydown', (e) => {
3220
- if (e.key === 'Escape') overlay.remove();
3221
- if (e.key === 'Enter') confirmBtn.click();
3222
- });
3223
- }
3224
-
3225
- // --- Mobile long-press ---
3226
- function setupLongPress(el, callback) {
3227
- let timer = null;
3228
- let startX = 0, startY = 0;
3229
- el.addEventListener('touchstart', (e) => {
3230
- startX = e.touches[0].clientX;
3231
- startY = e.touches[0].clientY;
3232
- timer = setTimeout(() => { e.preventDefault(); callback(startX, startY); }, 500);
3233
- }, { passive: false });
3234
- el.addEventListener('touchmove', (e) => {
3235
- if (timer && (Math.abs(e.touches[0].clientX - startX) > 10 || Math.abs(e.touches[0].clientY - startY) > 10)) {
3236
- clearTimeout(timer); timer = null;
3237
- }
3238
- }, { passive: true });
3239
- el.addEventListener('touchend', () => { if (timer) { clearTimeout(timer); timer = null; } });
3240
- el.addEventListener('touchcancel', () => { if (timer) { clearTimeout(timer); timer = null; } });
3241
- }
3242
-
3243
- // --- Text formatter (URLs, issues, commit hashes) ---
3244
- ${COMMIT_MESSAGE_JS}
3245
-
3246
- // --- Find widget ---
3247
- const findBar = document.getElementById('find-bar');
3248
- const findInput = document.getElementById('find-input');
3249
-
3250
- document.getElementById('btn-reflog').addEventListener('click', () => vscode.postMessage({ command: 'openReflog' }));
3251
- document.getElementById('btn-find').addEventListener('click', toggleFind);
3252
-
3253
- function toggleFind() {
3254
- findBar.classList.toggle('hidden');
3255
- if (!findBar.classList.contains('hidden')) findInput.focus();
3256
- else clearSearch();
3257
- }
3258
-
3259
- const findMode = document.getElementById('find-mode');
3260
- const searchResultsEl = document.getElementById('search-results');
3261
-
3262
- /*
3263
- * "Loaded rows" keeps the original behaviour: highlight matches among the rows
3264
- * already rendered. The other modes run in git over the whole history, because a
3265
- * commit older than the current page is otherwise invisible to a search.
3266
- */
3267
- findInput.addEventListener('input', () => {
3268
- if (findMode.value === 'loaded') doSearch(findInput.value);
3269
- });
3270
-
3271
- findInput.addEventListener('keydown', (e) => {
3272
- if (e.key !== 'Enter' || findMode.value === 'loaded') return;
3273
- e.preventDefault();
3274
- runHistorySearch();
3275
- });
3276
-
3277
- findMode.addEventListener('change', () => {
3278
- clearSearchHighlights();
3279
- hideSearchResults();
3280
- document.getElementById('find-count').textContent = '';
3281
- if (findMode.value === 'loaded') doSearch(findInput.value);
3282
- else if (findInput.value.trim()) runHistorySearch();
3283
- findInput.placeholder = findMode.value === 'loaded'
3284
- ? 'Search commits...'
3285
- : findMode.value === 'file' ? 'Path, then Enter…' : 'Type, then Enter…';
3286
- });
3287
-
3288
- function runHistorySearch() {
3289
- const text = findInput.value.trim();
3290
- if (!text) { hideSearchResults(); return; }
3291
- document.getElementById('find-count').textContent = 'searching…';
3292
- vscode.postMessage({ command: 'searchCommits', mode: findMode.value, text });
3293
- }
3294
-
3295
- function hideSearchResults() {
3296
- searchResultsEl.classList.add('hidden');
3297
- searchResultsEl.innerHTML = '';
3298
- }
3299
-
3300
- function renderSearchResults(data) {
3301
- const hits = data.hits || [];
3302
- document.getElementById('find-count').textContent = hits.length + ' match(es)';
3303
- if (!hits.length) {
3304
- searchResultsEl.innerHTML = '<div class="sr-head">Nothing in this repository matches.</div>';
3305
- searchResultsEl.classList.remove('hidden');
3306
- return;
3307
- }
3308
- const loaded = new Set(getDisplayCommits().map(c => c.hash));
3309
- searchResultsEl.innerHTML = '<div class="sr-head">' + hits.length + ' commit(s) across all history — click to open</div>'
3310
- + hits.map(h =>
3311
- '<div class="sr-item" data-hash="' + escHtml(h.hash) + '">'
3312
- + '<div class="sr-subject">' + escHtml(h.subject) + '</div>'
3313
- + '<div class="sr-meta">' + avatarHtml(h.author, h.authorEmail)
3314
- + '<span>' + escHtml(h.author) + '</span>'
3315
- + '<span>' + escHtml(formatDate(h.authorDate)) + '</span>'
3316
- + '<span class="sr-hash">' + escHtml(h.hash.substring(0, 7)) + '</span>'
3317
- + (loaded.has(h.hash) ? '' : '<span>not in the loaded range</span>')
3318
- + '</div>'
3319
- + '</div>').join('');
3320
- searchResultsEl.classList.remove('hidden');
3321
- }
3322
-
3323
- searchResultsEl.addEventListener('click', (e) => {
3324
- const item = e.target.closest('.sr-item');
3325
- if (!item) return;
3326
- const hash = item.dataset.hash;
3327
- hideSearchResults();
3328
- // Scroll to the row when this commit is on screen; otherwise just open its
3329
- // details, since loading the intervening history could be thousands of rows.
3330
- const row = document.querySelector('.commit-row[data-hash="' + hash + '"]');
3331
- if (row) { selectCommit(hash); row.scrollIntoView({ block: 'center' }); }
3332
- else { selectCommit(hash); }
3333
- });
3334
-
3335
- document.getElementById('find-next').addEventListener('click', () => navigateSearch(1));
3336
- document.getElementById('find-prev').addEventListener('click', () => navigateSearch(-1));
3337
- document.getElementById('find-close').addEventListener('click', () => { findBar.classList.add('hidden'); clearSearch(); });
3338
-
3339
- function doSearch(query) {
3340
- clearSearchHighlights();
3341
- state.searchMatches = [];
3342
- state.searchIndex = -1;
3343
- if (!query.trim()) { document.getElementById('find-count').textContent = ''; return; }
3344
- const q = query.toLowerCase();
3345
- const displayCommits = getDisplayCommits();
3346
- document.querySelectorAll('.commit-row:not(.header-row)').forEach((row, idx) => {
3347
- const commit = displayCommits[idx];
3348
- if (!commit || commit.hash === 'uncommitted') return;
3349
- const match = commit.message.toLowerCase().includes(q) ||
3350
- commit.author.toLowerCase().includes(q) ||
3351
- commit.hash.toLowerCase().startsWith(q);
3352
- if (match) { state.searchMatches.push(idx); row.classList.add('search-match'); }
3353
- });
3354
- document.getElementById('find-count').textContent = state.searchMatches.length + ' match(es)';
3355
- renderScrollMarkers();
3356
- if (state.searchMatches.length > 0) navigateSearch(0);
3357
- }
3358
-
3359
- function navigateSearch(dir) {
3360
- if (state.searchMatches.length === 0) return;
3361
- if (dir === 0) state.searchIndex = 0;
3362
- else state.searchIndex = (state.searchIndex + dir + state.searchMatches.length) % state.searchMatches.length;
3363
- const idx = state.searchMatches[state.searchIndex];
3364
- const rows = document.querySelectorAll('.commit-row:not(.header-row)');
3365
- if (rows[idx]) rows[idx].scrollIntoView({ block: 'center' });
3366
- document.getElementById('find-count').textContent = (state.searchIndex + 1) + ' of ' + state.searchMatches.length;
3367
- }
3368
-
3369
- function clearSearch() {
3370
- clearSearchHighlights();
3371
- hideSearchResults();
3372
- state.searchMatches = [];
3373
- state.searchIndex = -1;
3374
- findInput.value = '';
3375
- document.getElementById('find-count').textContent = '';
3376
- renderScrollMarkers();
3377
- }
3378
-
3379
- function clearSearchHighlights() {
3380
- document.querySelectorAll('.search-match').forEach(el => el.classList.remove('search-match'));
3381
- }
3382
-
3383
- // --- Keyboard shortcuts ---
3384
- document.addEventListener('keydown', (e) => {
3385
- if ((e.ctrlKey || e.metaKey) && e.key === 'f') { e.preventDefault(); toggleFind(); }
3386
- if (e.key === 'Escape') {
3387
- hideContextMenu();
3388
- if (!findBar.classList.contains('hidden')) { findBar.classList.add('hidden'); clearSearch(); }
3389
- else if (state.expandedCommit) closeDetailPanel();
3390
- }
3391
- });
3392
-
3393
- // --- Scroll to load more ---
3394
- document.getElementById('graph-container').addEventListener('scroll', (e) => {
3395
- const container = e.target;
3396
- if (container.scrollTop + container.clientHeight >= container.scrollHeight - 50) {
3397
- if (!state.loading && state.commits.length >= state.maxCommits) {
3398
- state.loading = true;
3399
- document.getElementById('loading').classList.remove('hidden');
3400
- vscode.postMessage({ command: 'requestCommits', maxCommits: state.maxCommits, skip: state.commits.length });
3401
- }
3402
- }
3403
- });
3404
-
3405
- // --- Utilities ---
3406
- function escHtml(s) { return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;'); }
3407
- ${AVATAR_JS}
3408
-
3409
- /* --- Author hover card --- */
3410
- let authorCardEl = null;
3411
- function showAuthorCard(anchorEl, commit) {
3412
- hideAuthorCard();
3413
- const rect = anchorEl.getBoundingClientRect();
3414
- const card = document.createElement('div');
3415
- card.className = 'author-card';
3416
- card.innerHTML = '<div class="ac-head">' + avatarHtml(commit.author, commit.authorEmail)
3417
- + escHtml(commit.author) + '</div>'
3418
- + '<div class="ac-row">' + escHtml(commit.authorEmail || '') + '</div>'
3419
- + '<div class="ac-row">authored ' + escHtml(formatDate(commit.authorDate)) + '</div>'
3420
- + (commit.committer && commit.committer !== commit.author
3421
- ? '<div class="ac-row">committed by ' + escHtml(commit.committer) + '</div>'
3422
- : '')
3423
- + '<div class="ac-row">' + escHtml(commit.hash.substring(0, 10)) + '</div>';
3424
- document.body.appendChild(card);
3425
- // Flip above the row when the card would fall off the bottom.
3426
- const cardRect = card.getBoundingClientRect();
3427
- const top = rect.bottom + cardRect.height > window.innerHeight ? rect.top - cardRect.height - 4 : rect.bottom + 4;
3428
- card.style.top = Math.max(4, top) + 'px';
3429
- card.style.left = Math.max(4, Math.min(rect.left, window.innerWidth - cardRect.width - 4)) + 'px';
3430
- authorCardEl = card;
3431
- }
3432
- function hideAuthorCard() {
3433
- if (authorCardEl) { authorCardEl.remove(); authorCardEl = null; }
3434
- }
3435
-
3436
- /* --- Drag a ref badge onto a commit to merge or rebase onto it --- */
3437
- let dragRef = null;
3438
-
3439
- function makeRefDraggable(badge, refName, refType) {
3440
- // Only branches can be merged or rebased; tags and stashes cannot.
3441
- if (refType === 'tag' || refType === 'stash') return;
3442
- badge.draggable = true;
3443
- badge.addEventListener('dragstart', (e) => {
3444
- dragRef = { name: refName, type: refType };
3445
- badge.classList.add('dragging');
3446
- e.dataTransfer.effectAllowed = 'move';
3447
- e.dataTransfer.setData('text/plain', refName);
3448
- e.stopPropagation();
3449
- });
3450
- badge.addEventListener('dragend', () => {
3451
- dragRef = null;
3452
- badge.classList.remove('dragging');
3453
- document.querySelectorAll('.commit-row.drop-target').forEach(r => r.classList.remove('drop-target'));
3454
- });
3455
- }
3456
-
3457
- function makeRowDropTarget(row, commit) {
3458
- if (commit.hash === 'uncommitted' || commit._isStash) return;
3459
- row.addEventListener('dragover', (e) => {
3460
- if (!dragRef) return;
3461
- e.preventDefault();
3462
- e.dataTransfer.dropEffect = 'move';
3463
- row.classList.add('drop-target');
3464
- });
3465
- row.addEventListener('dragleave', () => row.classList.remove('drop-target'));
3466
- row.addEventListener('drop', (e) => {
3467
- if (!dragRef) return;
3468
- e.preventDefault();
3469
- row.classList.remove('drop-target');
3470
- showDropActionMenu(e.clientX, e.clientY, dragRef, commit);
3471
- dragRef = null;
3472
- });
3473
- }
3474
-
3475
- function showDropActionMenu(x, y, ref, commit) {
3476
- const short = commit.hash.substring(0, 7);
3477
- const onCurrent = ref.name === state.currentBranch;
3478
- const items = [];
3479
- if (onCurrent) {
3480
- // Dragging the checked-out branch onto a commit = move this branch there.
3481
- items.push({ label: 'Rebase ' + ref.name + ' onto ' + short, action: () => showDialog({
3482
- title: 'Rebase',
3483
- message: 'Rebase ' + escHtml(ref.name) + ' onto commit ' + short + '?',
3484
- rawMessage: true,
3485
- confirmLabel: 'Rebase',
3486
- onConfirm: () => gitAction('rebase', { branch: commit.hash }),
3487
- }) });
3488
- } else {
3489
- items.push({ label: 'Merge ' + ref.name + ' into ' + (state.currentBranch || 'HEAD'), action: () => showDialog({
3490
- title: 'Merge',
3491
- message: 'Merge ' + escHtml(ref.name) + ' into ' + escHtml(state.currentBranch || 'HEAD') + '?',
3492
- rawMessage: true,
3493
- confirmLabel: 'Merge',
3494
- onConfirm: () => gitAction('merge', { branch: ref.name }),
3495
- }) });
3496
- items.push({ label: 'Rebase ' + (state.currentBranch || 'HEAD') + ' onto ' + ref.name, action: () => showDialog({
3497
- title: 'Rebase',
3498
- message: 'Rebase ' + escHtml(state.currentBranch || 'HEAD') + ' onto ' + escHtml(ref.name) + '?',
3499
- rawMessage: true,
3500
- confirmLabel: 'Rebase',
3501
- onConfirm: () => gitAction('rebase', { branch: ref.name }),
3502
- }) });
3503
- }
3504
- items.push({ separator: true });
3505
- items.push({ label: 'Compare ' + ref.name + ' with ' + short, action: () => vscode.postMessage({ command: 'openCompare', ref1: ref.name, ref2: commit.hash }) });
3506
- renderContextMenu(x, y, items);
3507
- }
3508
-
3509
- /**
3510
- * Render a context menu from an item list. The older menu builders each inline
3511
- * this same block; new menus go through here.
3512
- *
3513
- * An item may carry a checked flag, drawn as a tick in a column of its own so
3514
- * that a list of toggles does not jump sideways as they are turned on and off,
3515
- * and a disabled flag for one that is real but unavailable right now.
3516
- */
3517
- function renderContextMenu(x, y, items) {
3518
- const menu = document.getElementById('context-menu');
3519
- let html = '';
3520
- items.forEach((item, idx) => {
3521
- if (item.separator) {
3522
- html += '<div class="ctx-separator"></div>';
3523
- } else {
3524
- const cls = 'ctx-item' + (item.destructive ? ' destructive' : '') + (item.disabled ? ' disabled' : '');
3525
- const tick = item.checked === undefined ? '' :
3526
- '<span class="ctx-tick">' + (item.checked ? '\\u2713' : '') + '</span>';
3527
- html += '<div class="' + cls + '" data-idx="' + idx + '">' + tick + escHtml(item.label) + '</div>';
3528
- }
3529
- });
3530
- menu.innerHTML = html;
3531
- menu.style.left = Math.min(x, window.innerWidth - 200) + 'px';
3532
- menu.style.top = Math.min(y, window.innerHeight - 300) + 'px';
3533
- menu.classList.remove('hidden');
3534
- menu.querySelectorAll('.ctx-item').forEach(el => {
3535
- const item = items[parseInt(el.dataset.idx)];
3536
- if (item && item.action && !item.disabled) el.addEventListener('click', () => { hideContextMenu(); item.action(); });
3537
- });
3538
- setTimeout(() => document.addEventListener('click', hideContextMenu, { once: true }), 0);
3539
- }
3540
-
3541
-
3542
- function formatDate(ts) {
3543
- const fmt = state.settings.dateFormat;
3544
- if (fmt === 'iso') return new Date(ts * 1000).toISOString().substring(0, 16).replace('T', ' ');
3545
- if (fmt === 'absolute') return new Date(ts * 1000).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
3546
- const now = Date.now() / 1000;
3547
- const diff = now - ts;
3548
- if (diff < 60) return 'just now';
3549
- if (diff < 3600) return Math.floor(diff / 60) + 'm ago';
3550
- if (diff < 86400) return Math.floor(diff / 3600) + 'h ago';
3551
- if (diff < 2592000) return Math.floor(diff / 86400) + 'd ago';
3552
- if (diff < 31536000) return Math.floor(diff / 2592000) + 'mo ago';
3553
- return Math.floor(diff / 31536000) + 'y ago';
3554
- }
3555
-
3556
- function updateStatus() {
3557
- const parts = [];
3558
- if (state.currentBranch) parts.push(state.currentBranch);
3559
- parts.push(state.commits.length + ' commits');
3560
- parts.push(state.branches.length + ' branches');
3561
- parts.push(state.tags.length + ' tags');
3562
- document.getElementById('status-text').textContent = parts.join(' | ');
3563
- }
3564
-
3565
- // --- Settings panel ---
3566
- const settingsPanel = document.getElementById('settings-panel');
3567
-
3568
- document.getElementById('btn-settings').addEventListener('click', () => {
3569
- const isOpen = settingsPanel.classList.toggle('open');
3570
- if (isOpen) {
3571
- vscode.postMessage({ command: 'requestSettings' });
3572
- vscode.postMessage({ command: 'requestUserDetails' });
3573
- renderRemotesList();
3574
- }
3575
- });
3576
- document.getElementById('settings-close').addEventListener('click', () => {
3577
- settingsPanel.classList.remove('open');
3578
- });
3579
-
3580
- function applySettingsToUI() {
3581
- const s = state.settings;
3582
- document.getElementById('s-maxCommits').value = s.maxCommits;
3583
- document.getElementById('s-showTags').checked = s.showTags;
3584
- document.getElementById('s-showStashes').checked = s.showStashes;
3585
- document.getElementById('s-showRemoteBranches').checked = s.showRemoteBranches;
3586
- document.getElementById('s-graphStyle').value = s.graphStyle;
3587
- document.getElementById('s-firstParentOnly').checked = s.firstParentOnly;
3588
- document.getElementById('s-dateFormat').value = s.dateFormat;
3589
- document.getElementById('s-commitOrdering').value = s.commitOrdering;
3590
- document.getElementById('s-autoFetchInterval').value = s.autoFetchInterval || 0;
3591
- OPTIONAL_COLUMNS.forEach((col) => {
3592
- document.getElementById('s-' + col.key).checked = s[col.key] !== false;
3593
- });
3594
- applyColumnVisibility();
3595
- graphConfig.style = s.graphStyle;
3596
- startAutoFetch(s.autoFetchInterval);
3597
- renderIssueRules();
3598
- applyPrSettingsToUI();
3599
- }
3600
-
3601
- // The same five toggles as the header's context menu, through the same call.
3602
- OPTIONAL_COLUMNS.forEach((col) => {
3603
- document.getElementById('s-' + col.key).addEventListener('change', (e) => {
3604
- setColumnVisible(col.key, e.target.checked);
3605
- });
3606
- });
3607
-
3608
- // General setting change handlers
3609
- ['showTags', 'showStashes', 'showRemoteBranches', 'firstParentOnly'].forEach(key => {
3610
- document.getElementById('s-' + key).addEventListener('change', (e) => {
3611
- vscode.postMessage({ command: 'updateSetting', key, value: e.target.checked });
3612
- state.settings[key] = e.target.checked;
3613
- renderCommitList();
3614
- });
3615
- });
3616
- ['graphStyle', 'dateFormat', 'commitOrdering'].forEach(key => {
3617
- document.getElementById('s-' + key).addEventListener('change', (e) => {
3618
- vscode.postMessage({ command: 'updateSetting', key, value: e.target.value });
3619
- state.settings[key] = e.target.value;
3620
- if (key === 'graphStyle') graphConfig.style = e.target.value;
3621
- if (key === 'dateFormat') renderCommitList();
3622
- });
3623
- });
3624
- document.getElementById('s-maxCommits').addEventListener('change', (e) => {
3625
- const n = parseInt(e.target.value, 10);
3626
- if (n > 0 && n <= 10000) {
3627
- state.maxCommits = n;
3628
- state.settings.maxCommits = n;
3629
- vscode.postMessage({ command: 'updateSetting', key: 'maxCommits', value: n });
3630
- }
3631
- });
3632
- document.getElementById('s-autoFetchInterval').addEventListener('change', (e) => {
3633
- const val = parseInt(e.target.value, 10);
3634
- state.settings.autoFetchInterval = val;
3635
- vscode.postMessage({ command: 'updateSetting', key: 'autoFetchInterval', value: val });
3636
- startAutoFetch(val);
3637
- });
3638
-
3639
- // User details
3640
- document.getElementById('s-saveUser').addEventListener('click', () => {
3641
- const name = document.getElementById('s-userName').value.trim();
3642
- const email = document.getElementById('s-userEmail').value.trim();
3643
- vscode.postMessage({ command: 'updateUserDetails', name, email });
3644
- });
3645
-
3646
- // Remotes
3647
- function renderRemotesList() {
3648
- const container = document.getElementById('s-remotes-list');
3649
- if (state.remotes.length === 0) {
3650
- container.innerHTML = '<p style="font-size:12px;color:var(--subtext)">No remotes configured.</p>';
3651
- return;
3652
- }
3653
- container.innerHTML = state.remotes.map(r =>
3654
- '<div class="remote-item">' +
3655
- '<div class="remote-name">' + escHtml(r.name) + '</div>' +
3656
- '<div class="remote-url">' + escHtml(r.fetchUrl) + '</div>' +
3657
- '<div class="remote-actions">' +
3658
- '<button class="btn-sm" data-edit-remote="' + escHtml(r.name) + '">Edit URL</button>' +
3659
- '<button class="btn-sm" style="color:var(--red)" data-rm-remote="' + escHtml(r.name) + '">Remove</button>' +
3660
- '</div>' +
3661
- '</div>'
3662
- ).join('');
3663
- }
3664
-
3665
- document.getElementById('s-remotes-list').addEventListener('click', (e) => {
3666
- const editBtn = e.target.closest('[data-edit-remote]');
3667
- if (editBtn) {
3668
- const name = editBtn.dataset.editRemote;
3669
- const remote = state.remotes.find(r => r.name === name);
3670
- showDialog({
3671
- title: 'Edit Remote URL: ' + name,
3672
- input: { placeholder: 'New URL', defaultValue: remote ? remote.fetchUrl : '' },
3673
- onConfirm: (url) => { if (url) vscode.postMessage({ command: 'editRemoteUrl', name, url }); },
3674
- });
3675
- return;
3676
- }
3677
- const rmBtn = e.target.closest('[data-rm-remote]');
3678
- if (rmBtn) {
3679
- const name = rmBtn.dataset.rmRemote;
3680
- showDialog({
3681
- title: 'Remove Remote',
3682
- message: 'Remove remote "' + name + '"? This cannot be undone.',
3683
- destructive: true,
3684
- confirmLabel: 'Remove',
3685
- onConfirm: () => vscode.postMessage({ command: 'removeRemote', name }),
3686
- });
3687
- }
3688
- });
3689
-
3690
- document.getElementById('s-addRemote').addEventListener('click', () => {
3691
- const name = document.getElementById('s-newRemoteName').value.trim();
3692
- const url = document.getElementById('s-newRemoteUrl').value.trim();
3693
- if (name && url) {
3694
- vscode.postMessage({ command: 'addRemote', name, url });
3695
- document.getElementById('s-newRemoteName').value = '';
3696
- document.getElementById('s-newRemoteUrl').value = '';
3697
- }
3698
- });
3699
-
3700
- // --- Issue Linking ---
3701
- function renderIssueRules() {
3702
- const rules = state.settings.issueLinkingRules || [];
3703
- const container = document.getElementById('issue-rules-list');
3704
- container.innerHTML = rules.map((r, i) =>
3705
- '<div class="issue-rule-row" data-idx="' + i + '">' +
3706
- '<input type="text" class="rule-pattern" placeholder="Regex, e.g. #(\\d+)" value="' + escHtml(r.pattern) + '">' +
3707
- '<input type="text" class="rule-url" placeholder="URL with $1, e.g. https://..." value="' + escHtml(r.url) + '">' +
3708
- '<button class="rule-remove" title="Remove">&times;</button>' +
3709
- '</div>'
3710
- ).join('');
3711
- }
3712
-
3713
- let issueRuleDebounce = null;
3714
- document.getElementById('issue-rules-list').addEventListener('input', (e) => {
3715
- const row = e.target.closest('.issue-rule-row');
3716
- if (!row) return;
3717
- const idx = parseInt(row.dataset.idx);
3718
- const rules = [...(state.settings.issueLinkingRules || [])];
3719
- if (!rules[idx]) return;
3720
- if (e.target.classList.contains('rule-pattern')) {
3721
- rules[idx] = { ...rules[idx], pattern: e.target.value };
3722
- try { new RegExp(e.target.value); e.target.classList.remove('rule-error'); }
3723
- catch { e.target.classList.add('rule-error'); return; }
3724
- }
3725
- if (e.target.classList.contains('rule-url')) {
3726
- rules[idx] = { ...rules[idx], url: e.target.value };
3727
- }
3728
- state.settings.issueLinkingRules = rules;
3729
- clearTimeout(issueRuleDebounce);
3730
- issueRuleDebounce = setTimeout(() => {
3731
- vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
3732
- }, 500);
3733
- });
3734
-
3735
- document.getElementById('issue-rules-list').addEventListener('click', (e) => {
3736
- if (!e.target.closest('.rule-remove')) return;
3737
- const row = e.target.closest('.issue-rule-row');
3738
- const idx = parseInt(row.dataset.idx);
3739
- const rules = [...(state.settings.issueLinkingRules || [])];
3740
- rules.splice(idx, 1);
3741
- state.settings.issueLinkingRules = rules;
3742
- vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
3743
- renderIssueRules();
3744
- });
3745
-
3746
- document.getElementById('add-issue-rule').addEventListener('click', () => {
3747
- const rules = [...(state.settings.issueLinkingRules || []), { pattern: '', url: '' }];
3748
- state.settings.issueLinkingRules = rules;
3749
- vscode.postMessage({ command: 'updateSetting', key: 'issueLinkingRules', value: rules });
3750
- renderIssueRules();
3751
- });
3752
-
3753
- // --- PR Creation ---
3754
- const PR_TEMPLATES = {
3755
- github: 'https://github.com/\${owner}/\${repo}/compare/\${targetBranch}...\${sourceBranch}?expand=1',
3756
- gitlab: 'https://gitlab.com/\${owner}/\${repo}/-/merge_requests/new?source_branch=\${sourceBranch}&target_branch=\${targetBranch}',
3757
- bitbucket: 'https://bitbucket.org/\${owner}/\${repo}/pull-requests/new?source=\${sourceBranch}&dest=\${targetBranch}',
3758
- custom: '',
3759
- };
3760
-
3761
- document.getElementById('pr-provider').addEventListener('change', (e) => {
3762
- const provider = e.target.value;
3763
- const prConfig = document.getElementById('pr-config');
3764
- if (!provider) {
3765
- prConfig.classList.add('hidden');
3766
- state.settings.prCreation = null;
3767
- vscode.postMessage({ command: 'updateSetting', key: 'prCreation', value: null });
3768
- return;
3769
- }
3770
- prConfig.classList.remove('hidden');
3771
- document.getElementById('pr-url-template').value = PR_TEMPLATES[provider] || '';
3772
- document.getElementById('pr-target').value = 'main';
3773
- vscode.postMessage({ command: 'requestOwnerRepo' });
3774
- });
3775
-
3776
- document.getElementById('pr-save').addEventListener('click', () => {
3777
- const provider = document.getElementById('pr-provider').value;
3778
- if (!provider) return;
3779
- const config = {
3780
- provider,
3781
- urlTemplate: document.getElementById('pr-url-template').value.trim(),
3782
- owner: document.getElementById('pr-owner').value.trim(),
3783
- repo: document.getElementById('pr-repo').value.trim(),
3784
- defaultTargetBranch: document.getElementById('pr-target').value.trim() || 'main',
3785
- };
3786
- state.settings.prCreation = config;
3787
- vscode.postMessage({ command: 'updateSetting', key: 'prCreation', value: config });
3788
- });
3789
-
3790
- function applyPrSettingsToUI() {
3791
- const pr = state.settings.prCreation;
3792
- if (!pr) {
3793
- document.getElementById('pr-provider').value = '';
3794
- document.getElementById('pr-config').classList.add('hidden');
3795
- return;
3796
- }
3797
- document.getElementById('pr-provider').value = pr.provider;
3798
- document.getElementById('pr-config').classList.remove('hidden');
3799
- document.getElementById('pr-owner').value = pr.owner || '';
3800
- document.getElementById('pr-repo').value = pr.repo || '';
3801
- document.getElementById('pr-target').value = pr.defaultTargetBranch || 'main';
3802
- document.getElementById('pr-url-template').value = pr.urlTemplate || '';
3803
- }
3804
-
3805
- function openPrUrl(sourceBranch) {
3806
- const pr = state.settings.prCreation;
3807
- if (!pr || !pr.urlTemplate) return;
3808
- const url = pr.urlTemplate
3809
- .replace(/\\$\\{owner\\}/g, encodeURIComponent(pr.owner))
3810
- .replace(/\\$\\{repo\\}/g, encodeURIComponent(pr.repo))
3811
- .replace(/\\$\\{sourceBranch\\}/g, encodeURIComponent(sourceBranch))
3812
- .replace(/\\$\\{targetBranch\\}/g, encodeURIComponent(pr.defaultTargetBranch || 'main'));
3813
- window.open(url, '_blank');
3814
- }
3815
- `;
3816
- }