@hienlh/ppm 0.18.7 → 0.18.9

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 (510) hide show
  1. package/.spike/s.err +63 -0
  2. package/.spike/tunnel.err +42 -0
  3. package/.spike/w.err +96 -0
  4. package/CHANGELOG.md +16 -0
  5. package/CLAUDE.md +1 -0
  6. package/assets/skills/ppm/SKILL.md +1 -1
  7. package/assets/skills/ppm/references/http-api.md +5 -3
  8. package/dist/web/assets/{ai-resource-editor-DZQUyrsU.js → ai-resource-editor-DFCuNe-P.js} +1 -1
  9. package/dist/web/assets/{angular-html-jfMqUuRd.js → angular-html-Ctz0zN01.js} +1 -1
  10. package/dist/web/assets/{angular-ts-wytn9PMm.js → angular-ts-QXHpgB1C.js} +1 -1
  11. package/dist/web/assets/{api-settings-DlcoR5QT.js → api-settings-nblja3Rk.js} +1 -1
  12. package/dist/web/assets/{apl-i-ahKx6O.js → apl-b9KVk-O4.js} +1 -1
  13. package/dist/web/assets/architecture-PBZL5I3N-C7ra20CE.js +1 -0
  14. package/dist/web/assets/{astro-DVBCJfG6.js → astro-BlFEeGYr.js} +1 -1
  15. package/dist/web/assets/{audio-preview-GGksv6U8.js → audio-preview-CZLmhf__.js} +1 -1
  16. package/dist/web/assets/{blade-BHlL8SqU.js → blade-CGkj2MUI.js} +1 -1
  17. package/dist/web/assets/{bsl-D-UOfR1F.js → bsl-CVsbb6ap.js} +1 -1
  18. package/dist/web/assets/button-BA_fJOtX.js +1 -0
  19. package/dist/web/assets/{cairo-Bn6rucli.js → cairo-BbIHl2iE.js} +1 -1
  20. package/dist/web/assets/chat-tab-flMPLoKb.js +15 -0
  21. package/dist/web/assets/circle-hjUGru6R.js +1 -0
  22. package/dist/web/assets/circle-question-mark-CzR7YRc-.js +1 -0
  23. package/dist/web/assets/{cobol-Byn9FYKu.js → cobol-BWSGjmWb.js} +1 -1
  24. package/dist/web/assets/code-editor-C2VQbXzw.js +10 -0
  25. package/dist/web/assets/{coffee-DjBl4gm-.js → coffee-CWGNOxds.js} +1 -1
  26. package/dist/web/assets/{conflict-editor-Dg_JIcKq.js → conflict-editor-CdH_h0vD.js} +3 -3
  27. package/dist/web/assets/{context-menu-DkQdt6YA.js → context-menu-Cq0u3SK9.js} +1 -1
  28. package/dist/web/assets/{cpp-CKzic-3E.js → cpp-DHGV24J2.js} +1 -1
  29. package/dist/web/assets/{crystal-Bkg-Ly_g.js → crystal-Vlwf2UMP.js} +1 -1
  30. package/dist/web/assets/{csv-preview-DsJ_a2Op.js → csv-preview-CY_454vd.js} +1 -1
  31. package/dist/web/assets/{data-grid-overlay-editor-B1mTl3KS.js → data-grid-overlay-editor-D9il5DZS.js} +1 -1
  32. package/dist/web/assets/{database-viewer-CzjnrnMz.js → database-viewer-BCZOTrPT.js} +1 -1
  33. package/dist/web/assets/{diff-viewer-DUNkO-ll.js → diff-viewer-BwfMN-nW.js} +1 -1
  34. package/dist/web/assets/{docx-preview-DujpUDkE.js → docx-preview-D3Sdh_aT.js} +1 -1
  35. package/dist/web/assets/{edge-DVbZnd3Y.js → edge-Bhqk64zS.js} +1 -1
  36. package/dist/web/assets/{edit-diff-preview-BivQwZMD.js → edit-diff-preview-gq6ALf2B.js} +1 -1
  37. package/dist/web/assets/{elixir-Dwi8Wu7W.js → elixir-D466WCFm.js} +1 -1
  38. package/dist/web/assets/{elm-DtIv-HXJ.js → elm-Bfs2qNPR.js} +1 -1
  39. package/dist/web/assets/{erb-D3HEDz1x.js → erb-WI7jUaB6.js} +1 -1
  40. package/dist/web/assets/{erlang-2MjTCzGz.js → erlang-BCBe8nCc.js} +1 -1
  41. package/dist/web/assets/{esm-CZ8B8Ba2.js → esm-CZs9WVDO.js} +1 -1
  42. package/dist/web/assets/{explorer-body-DSDJUQs7.js → explorer-body-BKOMM566.js} +2 -2
  43. package/dist/web/assets/{explorer-window-content-CWYBapkj.js → explorer-window-content-Bbzijk8t.js} +1 -1
  44. package/dist/web/assets/{extension-webview-DBTFznQp.js → extension-webview-CuOQrHIS.js} +1 -1
  45. package/dist/web/assets/format-bytes-Dk7B73B7.js +1 -0
  46. package/dist/web/assets/{fortran-fixed-form-BLyAtyPM.js → fortran-fixed-form-CXLIv8Ox.js} +1 -1
  47. package/dist/web/assets/{fsharp-Bxbn_gbr.js → fsharp-CZsYmiw9.js} +1 -1
  48. package/dist/web/assets/{gdresource-sFMY4D2Q.js → gdresource-BGRvoWfC.js} +1 -1
  49. package/dist/web/assets/{git-commit-BzB9Lio5.js → git-commit-DH6mY3Km.js} +1 -1
  50. package/dist/web/assets/{git-log-panel-D8ZQdoYl.js → git-log-panel-DcV7PhqW.js} +1 -1
  51. package/dist/web/assets/{git-rebase-CKSVd848.js → git-rebase-C5Gql6Ma.js} +1 -1
  52. package/dist/web/assets/gitGraph-HDMCJU4V-D4hYLNJU.js +1 -0
  53. package/dist/web/assets/{glide-data-grid-uIjdTT7c.js → glide-data-grid-Cehfgrzc.js} +7 -7
  54. package/dist/web/assets/{glimmer-js-BY8aExAJ.js → glimmer-js-1-6JMJlj.js} +1 -1
  55. package/dist/web/assets/{glimmer-ts-Bak54dBX.js → glimmer-ts-C_Njj0nK.js} +1 -1
  56. package/dist/web/assets/{glsl-nR2eaJQe.js → glsl-DbkxE1TN.js} +1 -1
  57. package/dist/web/assets/{graphql-CGPPFAU6.js → graphql-BK75fiXl.js} +1 -1
  58. package/dist/web/assets/group-chat-tab-BVPYxjz-.js +1 -0
  59. package/dist/web/assets/{hack-CXIMX-Ol.js → hack-DG151vit.js} +1 -1
  60. package/dist/web/assets/{haml-tPY-9Pfm.js → haml-DKeIPQWM.js} +1 -1
  61. package/dist/web/assets/{handlebars-BuW1LT7T.js → handlebars-398uCI13.js} +1 -1
  62. package/dist/web/assets/{html-bgVcwZ-t.js → html-NLWdst5q.js} +1 -1
  63. package/dist/web/assets/{html-derivative-D6-IxTgn.js → html-derivative-CJf_Le2z.js} +1 -1
  64. package/dist/web/assets/{http-CJ1zyB-h.js → http-G1K2FozA.js} +1 -1
  65. package/dist/web/assets/{hurl-CmoT7l3T.js → hurl-WDC6sSBz.js} +1 -1
  66. package/dist/web/assets/{hxml-CztOsL8o.js → hxml-Dc3jBXuf.js} +1 -1
  67. package/dist/web/assets/{image-preview-B0VXSpYu.js → image-preview-D-Ok10eZ.js} +1 -1
  68. package/dist/web/assets/index-CerSxGdf.js +52 -0
  69. package/dist/web/assets/index-DRA_OpWY.css +2 -0
  70. package/dist/web/assets/info-3K5VOQVL-lRlrTlkb.js +1 -0
  71. package/dist/web/assets/{jinja-B1pq3jJq.js → jinja-CWsQj2y0.js} +1 -1
  72. package/dist/web/assets/{jison-D8B5pCwA.js → jison-CciJg2NW.js} +1 -1
  73. package/dist/web/assets/{julia-D0K3bwpU.js → julia-IOQNJAB7.js} +1 -1
  74. package/dist/web/assets/{just-B9Jlddu-.js → just-BGdHchwS.js} +1 -1
  75. package/dist/web/assets/{keybindings-store-FyolpNND.js → keybindings-store-aIY40k2o.js} +1 -1
  76. package/dist/web/assets/{latex-BPJSSE6j.js → latex-D6TOl-L2.js} +1 -1
  77. package/dist/web/assets/{liquid-lv10fo4U.js → liquid-CVSvu_Wn.js} +1 -1
  78. package/dist/web/assets/{lua-PNuaIBEF.js → lua-CcKiU6HW.js} +1 -1
  79. package/dist/web/assets/markdown-renderer-I89kyQhe.js +1 -0
  80. package/dist/web/assets/{markdown-renderer-BaBQ6Wm6.js → markdown-renderer-pVzBdkpl.js} +3 -3
  81. package/dist/web/assets/{marko-Du3frD6X.js → marko--UOicMGo.js} +1 -1
  82. package/dist/web/assets/{mdc-BeDVcFRl.js → mdc-D690aU2C.js} +1 -1
  83. package/dist/web/assets/media-url-CylYQld1.js +1 -0
  84. package/dist/web/assets/{mobile-explorer-sheet-Zxjl-e4c.js → mobile-explorer-sheet-5Uj9ZMM9.js} +1 -1
  85. package/dist/web/assets/{nextflow-DkcXP71s.js → nextflow-DR8PhpF8.js} +1 -1
  86. package/dist/web/assets/{nginx-C5n8N_bt.js → nginx-Qb9pUk1g.js} +1 -1
  87. package/dist/web/assets/{nim-CIhyfs-A.js → nim-DLa8R3NS.js} +1 -1
  88. package/dist/web/assets/{notification-store-DnGpxgkF.js → notification-store-DJ-OtAG3.js} +1 -1
  89. package/dist/web/assets/{number-overlay-editor-NgOsWJ7x.js → number-overlay-editor-D9SkFg1Y.js} +1 -1
  90. package/dist/web/assets/overview-panel-Cgi3UPY1.js +1 -0
  91. package/dist/web/assets/packet-RMMSAZCW-BIhk1mvp.js +1 -0
  92. package/dist/web/assets/{pdf-preview-xzAA4-kD.js → pdf-preview-Di5xHFyT.js} +1 -1
  93. package/dist/web/assets/{perl-Cf31sZYE.js → perl-AMNGIneF.js} +1 -1
  94. package/dist/web/assets/{php-Dzl_MDIW.js → php-CDsOOxXn.js} +1 -1
  95. package/dist/web/assets/pie-UPGHQEXC-SLS6i76l.js +1 -0
  96. package/dist/web/assets/{postgres-viewer-Dkec6GyK.js → postgres-viewer-CR6VpTrX.js} +3 -3
  97. package/dist/web/assets/process-table-DL6shbzt.js +1 -0
  98. package/dist/web/assets/{pug-CxSYHrB3.js → pug-C2kdkhQ6.js} +1 -1
  99. package/dist/web/assets/{qml-DlEjGhwN.js → qml-DRDkUp75.js} +1 -1
  100. package/dist/web/assets/radar-KQ55EAFF-JJ6O1Er_.js +1 -0
  101. package/dist/web/assets/{razor-KVt5uW14.js → razor-wY_6wUeC.js} +1 -1
  102. package/dist/web/assets/{rst-D5BwNTnw.js → rst-BRpofyNs.js} +1 -1
  103. package/dist/web/assets/{ruby-D5fejQwd.js → ruby-ieATBhWm.js} +1 -1
  104. package/dist/web/assets/{sas-Bj7B1CB2.js → sas-CoOOEbOO.js} +1 -1
  105. package/dist/web/assets/{scss-BB0CUoCL.js → scss-_nWV0bsb.js} +1 -1
  106. package/dist/web/assets/{settings-store-C9YT1Hir.js → settings-store-C20lqh0G.js} +2 -2
  107. package/dist/web/assets/settings-tab-jbiQwozX.js +1 -0
  108. package/dist/web/assets/{shaderlab-BdjEZUMc.js → shaderlab-XkqfIfO8.js} +1 -1
  109. package/dist/web/assets/{shellsession-Bp1OA1rR.js → shellsession-BKBIqTlM.js} +1 -1
  110. package/dist/web/assets/{soy-DlYz3wsC.js → soy-oVDnPzzh.js} +1 -1
  111. package/dist/web/assets/{sparql-CdfII5Jd.js → sparql-N2VclEsF.js} +1 -1
  112. package/dist/web/assets/{sql-query-editor-Bz1XrUqI.js → sql-query-editor-BPYsJDsn.js} +1 -1
  113. package/dist/web/assets/{sqlite-viewer-D5-NZw6b.js → sqlite-viewer-Bq9ZJA2y.js} +1 -1
  114. package/dist/web/assets/{stata-BvUA6GUW.js → stata-BuuClVDg.js} +1 -1
  115. package/dist/web/assets/{surrealql--DLNbTyI.js → surrealql-DE5_63MS.js} +1 -1
  116. package/dist/web/assets/{svelte-CBfSsG4n.js → svelte--YWjlOrK.js} +1 -1
  117. package/dist/web/assets/system-monitor-body-CKEYWyN9.js +2 -0
  118. package/dist/web/assets/system-monitor-tab-WjhFFHyM.js +1 -0
  119. package/dist/web/assets/system-monitor-window-content-CMiISeoC.js +1 -0
  120. package/dist/web/assets/team-member-sheet-oY5EkH53.js +2 -0
  121. package/dist/web/assets/{team-member-window-content-DSpZ2zhL.js → team-member-window-content-yCBeI_5X.js} +1 -1
  122. package/dist/web/assets/{templ-Dv8zpKZW.js → templ-MlpvJx4a.js} +1 -1
  123. package/dist/web/assets/{terminal-tab-DXazqejW.js → terminal-tab-BxHtMR7h.js} +3 -3
  124. package/dist/web/assets/{tex-CsrOiqh1.js → tex-0loAoXJG.js} +1 -1
  125. package/dist/web/assets/{tool-cards-Bgp8iceS.js → tool-cards-BcGrk1zk.js} +5 -5
  126. package/dist/web/assets/treemap-KZPCXAKY-Be3KNmns.js +1 -0
  127. package/dist/web/assets/{ts-tags-3T98k4EJ.js → ts-tags-pt-Ug0hK.js} +1 -1
  128. package/dist/web/assets/{twig-u6QZ45FH.js → twig-DOePpLOL.js} +1 -1
  129. package/dist/web/assets/{use-monaco-theme-CpF3A7JL.js → use-monaco-theme-CGucu3fb.js} +1 -1
  130. package/dist/web/assets/{use-open-team-member-CUvV02fA.js → use-open-team-member-DdrRXj-M.js} +1 -1
  131. package/dist/web/assets/{use-websocket-TnL2I1io.js → use-websocket-C-Rxv8JN.js} +1 -1
  132. package/dist/web/assets/{vendor-mermaid-Bg4vE8QA.js → vendor-mermaid-DrwG0NYt.js} +1 -1
  133. package/dist/web/assets/video-preview-DYAbbmd0.js +1 -0
  134. package/dist/web/assets/{vue-CxIsxtwn.js → vue-D6f-rprj.js} +1 -1
  135. package/dist/web/assets/{vue-html-BGL5qnuH.js → vue-html-DEYRkS1V.js} +1 -1
  136. package/dist/web/assets/{vue-vine-DHPh_gMr.js → vue-vine-CxSG2ojf.js} +1 -1
  137. package/dist/web/assets/{xml-C-vM2m7J.js → xml-DhrxbATj.js} +1 -1
  138. package/dist/web/assets/{xsl-DvTXNwuO.js → xsl-CU0ZndUO.js} +1 -1
  139. package/dist/web/index.html +18 -17
  140. package/dist/web/sw.js +1 -1
  141. package/docs/system-architecture.md +2 -2
  142. package/package.json +1 -1
  143. package/src/server/helpers/media-route-handlers.ts +22 -3
  144. package/src/server/index.ts +2 -8
  145. package/src/server/routes/files.ts +5 -2
  146. package/src/server/routes/fs-browse.ts +5 -2
  147. package/src/server/routes/resources.ts +119 -73
  148. package/src/services/autostart-generator.ts +79 -7
  149. package/src/services/autostart-register.ts +15 -2
  150. package/src/services/fs-path-guard.service.ts +17 -1
  151. package/src/services/media-transcode/transcode-stream.ts +27 -5
  152. package/src/services/proc-table-linux.ts +4 -0
  153. package/src/services/redact-secrets.ts +33 -0
  154. package/src/services/system-metrics/cpu-memory-collector.ts +101 -0
  155. package/src/services/system-metrics/disk-net-collector-darwin.ts +75 -0
  156. package/src/services/system-metrics/disk-net-collector-linux.ts +88 -0
  157. package/src/services/system-metrics/disk-net-collector-windows.ts +57 -0
  158. package/src/services/system-metrics/gpu-collector-nvidia.ts +78 -0
  159. package/src/services/system-metrics/gpu-process-memory-nvidia.ts +66 -0
  160. package/src/services/system-metrics/gpu-process-usage-windows.ts +138 -0
  161. package/src/services/system-metrics/kill-executor.ts +85 -0
  162. package/src/services/system-metrics/kill-guard.ts +124 -0
  163. package/src/services/system-metrics/kill-identity-resolver.ts +72 -0
  164. package/src/services/system-metrics/kill-request-handler.ts +79 -0
  165. package/src/services/system-metrics/metrics-collector-lock.ts +36 -0
  166. package/src/services/system-metrics/metrics-poll-scheduler.ts +83 -0
  167. package/src/services/system-metrics/metrics-subscriber-registry.ts +85 -0
  168. package/src/services/system-metrics/powershell-session-bootstrap.ts +48 -0
  169. package/src/services/system-metrics/powershell-session.ts +182 -0
  170. package/src/services/system-metrics/ppm-process-ownership.ts +34 -0
  171. package/src/services/system-metrics/ppm-protected-pids.ts +84 -0
  172. package/src/services/system-metrics/process-collector-darwin.ts +141 -0
  173. package/src/services/system-metrics/process-collector-linux.ts +85 -0
  174. package/src/services/system-metrics/process-collector-types.ts +80 -0
  175. package/src/services/system-metrics/process-collector-windows-parse.ts +153 -0
  176. package/src/services/system-metrics/process-collector-windows.ts +136 -0
  177. package/src/services/system-metrics/process-cpu-delta.ts +61 -0
  178. package/src/services/system-metrics/process-grouping.ts +142 -0
  179. package/src/services/system-metrics/process-io-delta.ts +84 -0
  180. package/src/services/system-metrics/process-io-linux.ts +46 -0
  181. package/src/services/system-metrics/process-net-collector-darwin.ts +103 -0
  182. package/src/services/system-metrics/process-rows-builder.ts +111 -0
  183. package/src/services/system-metrics/rate-delta.ts +47 -0
  184. package/src/services/system-metrics/system-metrics-platform.ts +51 -0
  185. package/src/services/system-metrics/system-metrics-tick.ts +178 -0
  186. package/src/services/system-metrics/system-metrics.service.ts +212 -0
  187. package/src/types/system-metrics.ts +199 -0
  188. package/src/web/components/editor/video-player/video-player.tsx +54 -22
  189. package/src/web/components/floating-window/window-content-registry.ts +2 -0
  190. package/src/web/components/floating-window/window-persistence.ts +1 -1
  191. package/src/web/components/floating-window/window-store-types.ts +1 -1
  192. package/src/web/components/system/build-kill-request.ts +9 -0
  193. package/src/web/components/system/chart-scale.ts +28 -0
  194. package/src/web/components/system/cpu-core-bars.tsx +33 -0
  195. package/src/web/components/system/kill-confirm-dialog.tsx +89 -0
  196. package/src/web/components/system/metric-chart-canvas.tsx +108 -0
  197. package/src/web/components/system/overview-cards/cpu-card.tsx +39 -0
  198. package/src/web/components/system/overview-cards/disk-card.tsx +41 -0
  199. package/src/web/components/system/overview-cards/gpu-card.tsx +33 -0
  200. package/src/web/components/system/overview-cards/mem-card.tsx +32 -0
  201. package/src/web/components/system/overview-cards/net-card.tsx +41 -0
  202. package/src/web/components/system/overview-panel.tsx +97 -0
  203. package/src/web/components/system/process-columns-grid.ts +93 -0
  204. package/src/web/components/system/process-group-row.tsx +71 -0
  205. package/src/web/components/system/process-row-format.ts +56 -0
  206. package/src/web/components/system/process-row.tsx +82 -0
  207. package/src/web/components/system/process-table-model.ts +127 -0
  208. package/src/web/components/system/process-table-sort.ts +90 -0
  209. package/src/web/components/system/process-table-toolbar.tsx +190 -0
  210. package/src/web/components/system/process-table-totals.ts +49 -0
  211. package/src/web/components/system/process-table.tsx +187 -0
  212. package/src/web/components/system/resolve-open-system-monitor-action.ts +29 -0
  213. package/src/web/components/system/resource-status-bar.tsx +17 -16
  214. package/src/web/components/system/sortable-header.tsx +65 -0
  215. package/src/web/components/system/sparkline-canvas.tsx +8 -9
  216. package/src/web/components/system/system-monitor-body.tsx +146 -0
  217. package/src/web/components/system/system-monitor-tab.tsx +2 -185
  218. package/src/web/components/system/system-monitor-window-content.tsx +18 -0
  219. package/src/web/components/system/use-open-system-monitor.ts +34 -0
  220. package/src/web/hooks/resource-monitor-lease.ts +55 -0
  221. package/src/web/hooks/use-element-width.ts +27 -0
  222. package/src/web/hooks/use-resource-monitor.ts +113 -35
  223. package/src/web/lib/format-bytes.ts +16 -0
  224. package/src/web/lib/media-url.ts +30 -4
  225. package/.release-run.sh +0 -5
  226. package/dist/web/assets/architecture-PBZL5I3N-Bs7wzj-W.js +0 -1
  227. package/dist/web/assets/arrow-right-DubGFkN8.js +0 -1
  228. package/dist/web/assets/button-B4MWPjWj.js +0 -1
  229. package/dist/web/assets/chat-tab-Xd2WMjdX.js +0 -15
  230. package/dist/web/assets/circle-question-mark-CENpx4oA.js +0 -1
  231. package/dist/web/assets/code-editor-DqXYJWAB.js +0 -10
  232. package/dist/web/assets/gitGraph-HDMCJU4V-D7i54kbM.js +0 -1
  233. package/dist/web/assets/group-chat-tab-B3sryFdA.js +0 -1
  234. package/dist/web/assets/index-DgbOF3xa.js +0 -52
  235. package/dist/web/assets/index-oxsyfDa0.css +0 -2
  236. package/dist/web/assets/info-3K5VOQVL-BV41AzR9.js +0 -1
  237. package/dist/web/assets/markdown-renderer-feiuhJ9n.js +0 -1
  238. package/dist/web/assets/media-url-CUpN5vI1.js +0 -1
  239. package/dist/web/assets/packet-RMMSAZCW-CaJoP44m.js +0 -1
  240. package/dist/web/assets/pie-UPGHQEXC-DSGZmNw2.js +0 -1
  241. package/dist/web/assets/radar-KQ55EAFF-Be4VUTs0.js +0 -1
  242. package/dist/web/assets/settings-tab-Bd8e6iqY.js +0 -1
  243. package/dist/web/assets/system-monitor-tab-A0jvt5Qw.js +0 -1
  244. package/dist/web/assets/team-member-sheet-5Oaqm8I_.js +0 -2
  245. package/dist/web/assets/treemap-KZPCXAKY-Cu2zgbxU.js +0 -1
  246. package/dist/web/assets/video-preview-CwtLPELG.js +0 -1
  247. package/src/services/resource-monitor-utils.ts +0 -141
  248. package/src/services/resource-monitor.service.ts +0 -147
  249. package/src/web/components/system/system-monitor-group-row.tsx +0 -153
  250. /package/dist/web/assets/{abap-C1K0-wzc.js → abap-MRbmsXOs.js} +0 -0
  251. /package/dist/web/assets/{actionscript-3-CJhQVjLA.js → actionscript-3-BDDHKqa4.js} +0 -0
  252. /package/dist/web/assets/{ada-Bt8r9fME.js → ada-DpuV9KwV.js} +0 -0
  253. /package/dist/web/assets/{andromeeda-DF1I8qi3.js → andromeeda-D6qUCKJo.js} +0 -0
  254. /package/dist/web/assets/{apache-CnlleE6P.js → apache-CX1NU_Tl.js} +0 -0
  255. /package/dist/web/assets/{apex-j0C6Xmk6.js → apex-B4-aoQ3K.js} +0 -0
  256. /package/dist/web/assets/{api-settings-DfNRPr1q.js → api-settings-kQHV6pYZ.js} +0 -0
  257. /package/dist/web/assets/{api-themes-8WTH6KpV.js → api-themes-CrK0tkW_.js} +0 -0
  258. /package/dist/web/assets/{applescript-DO7AnO8U.js → applescript-Dm9NI6KR.js} +0 -0
  259. /package/dist/web/assets/{apply-theme-CNj1iA-v.js → apply-theme-BH_d4amk.js} +0 -0
  260. /package/dist/web/assets/{ara-i83AydZj.js → ara-BGN8GAYn.js} +0 -0
  261. /package/dist/web/assets/{asciidoc-DbBA6-sF.js → asciidoc-s_yVuR3t.js} +0 -0
  262. /package/dist/web/assets/{asm-B5S47Rgr.js → asm-BzQdSvTe.js} +0 -0
  263. /package/dist/web/assets/{aurora-x-De_IaSKw.js → aurora-x-BJTLETG_.js} +0 -0
  264. /package/dist/web/assets/{awk-CfyLHXqS.js → awk-BQEGWxvX.js} +0 -0
  265. /package/dist/web/assets/{ayu-dark-DTLdZ1Si.js → ayu-dark-CpTORmLc.js} +0 -0
  266. /package/dist/web/assets/{ayu-light-DTOfkzhu.js → ayu-light-D8PVj-e6.js} +0 -0
  267. /package/dist/web/assets/{ayu-mirage-DsAECCMv.js → ayu-mirage-DyElQHtm.js} +0 -0
  268. /package/dist/web/assets/{ballerina-CumGp9A7.js → ballerina-C82NkRtj.js} +0 -0
  269. /package/dist/web/assets/{bat-Ca2SBbYN.js → bat-0X7DtGI-.js} +0 -0
  270. /package/dist/web/assets/{beancount-CqyXBwwF.js → beancount-Xgvy6YRl.js} +0 -0
  271. /package/dist/web/assets/{berry-yl-kJr_H.js → berry-CCT2pZcQ.js} +0 -0
  272. /package/dist/web/assets/{bibtex-DoFFszjV.js → bibtex-CpXgZ9M_.js} +0 -0
  273. /package/dist/web/assets/{bicep-CWPi4nfK.js → bicep-fkeSA62l.js} +0 -0
  274. /package/dist/web/assets/{bird2-DXew-ut0.js → bird2-Co7SeAI8.js} +0 -0
  275. /package/dist/web/assets/{c-clbySDvd.js → c-BpmrTvJh.js} +0 -0
  276. /package/dist/web/assets/{c3-B65jvSM1.js → c3-BZ_Z0RrR.js} +0 -0
  277. /package/dist/web/assets/{cadence-Cm8tQTHN.js → cadence-B0GBC8OF.js} +0 -0
  278. /package/dist/web/assets/{can-open-in-ppm-DXGOSUQc.js → can-open-in-ppm-omBzUBBq.js} +0 -0
  279. /package/dist/web/assets/{catppuccin-frappe-DLeGslh_.js → catppuccin-frappe-DIt_xR7m.js} +0 -0
  280. /package/dist/web/assets/{catppuccin-latte-CR5GeHws.js → catppuccin-latte-Dw40AcqA.js} +0 -0
  281. /package/dist/web/assets/{catppuccin-macchiato-p-XgjxhP.js → catppuccin-macchiato-BJ7DfVEF.js} +0 -0
  282. /package/dist/web/assets/{catppuccin-mocha-B8QOAZLl.js → catppuccin-mocha-NI2lfXzU.js} +0 -0
  283. /package/dist/web/assets/{clarity-DPulbvKH.js → clarity-F39L0xMJ.js} +0 -0
  284. /package/dist/web/assets/{clock-D493FU_D.js → clock-CvhF4DJP.js} +0 -0
  285. /package/dist/web/assets/{clojure-DFuWS20u.js → clojure-DloMkd8K.js} +0 -0
  286. /package/dist/web/assets/{cmake-DejCqcu4.js → cmake-CwerJun_.js} +0 -0
  287. /package/dist/web/assets/{code-CLF5x7KK.js → code-DDPoqVri.js} +0 -0
  288. /package/dist/web/assets/{codeowners-BwAyqWIH.js → codeowners-CQyVz4Qf.js} +0 -0
  289. /package/dist/web/assets/{codeql-DgSwFjqI.js → codeql-Bb229zuY.js} +0 -0
  290. /package/dist/web/assets/{common-lisp-CxIVJCtf.js → common-lisp-KMlIwq5I.js} +0 -0
  291. /package/dist/web/assets/{copy-BApI9v7Z.js → copy-DKn11Pye.js} +0 -0
  292. /package/dist/web/assets/{coq-DLSjSnmf.js → coq-DHX_3IIo.js} +0 -0
  293. /package/dist/web/assets/{csharp-C1HHzXBp.js → csharp-CEmCZv9Q.js} +0 -0
  294. /package/dist/web/assets/{css-VXsMY--y.js → css-CqZqBD05.js} +0 -0
  295. /package/dist/web/assets/{csv-BEbcJdHz.js → csv-l1g_V5MV.js} +0 -0
  296. /package/dist/web/assets/{csv-parser-BRtnJCfv.js → csv-parser-CnS0wqr6.js} +0 -0
  297. /package/dist/web/assets/{cue-BkDnFqUD.js → cue-BrxRmilg.js} +0 -0
  298. /package/dist/web/assets/{cypher-1cMqojSQ.js → cypher-rZkKwqZc.js} +0 -0
  299. /package/dist/web/assets/{d-BnYjRXtH.js → d-BALR-QuP.js} +0 -0
  300. /package/dist/web/assets/{dark-plus-XfbaH7kZ.js → dark-plus-Cj7rVwh-.js} +0 -0
  301. /package/dist/web/assets/{dart-Ca7s-8hK.js → dart-CWQcdkXk.js} +0 -0
  302. /package/dist/web/assets/{data-grid-types-BXwlFMzs.js → data-grid-types-CYvF-xK5.js} +0 -0
  303. /package/dist/web/assets/{database-B9okYLx6.js → database-BH0urvbs.js} +0 -0
  304. /package/dist/web/assets/{dax-CmuOw-mY.js → dax-BNHD-QBA.js} +0 -0
  305. /package/dist/web/assets/{desktop-C2gJ6Ovb.js → desktop-CN0IXPrP.js} +0 -0
  306. /package/dist/web/assets/{diff-BCEo1Ej7.js → diff-BtOXapES.js} +0 -0
  307. /package/dist/web/assets/{dist-CUPbqNnL.js → dist-DB1Oaqcc.js} +0 -0
  308. /package/dist/web/assets/{dist-DOlBnxFX.js → dist-Di6G_5jU.js} +0 -0
  309. /package/dist/web/assets/{docker-DN2jlyAh.js → docker-DNsAo_qO.js} +0 -0
  310. /package/dist/web/assets/{dotenv-NExMY2kS.js → dotenv-D6Pl6aOU.js} +0 -0
  311. /package/dist/web/assets/{download-D9UYwY0-.js → download-zCATy4x4.js} +0 -0
  312. /package/dist/web/assets/{dracula-B9lbE01y.js → dracula-C3m-w12D.js} +0 -0
  313. /package/dist/web/assets/{dracula-soft-CMBBfKF_.js → dracula-soft-BYqvXm6Z.js} +0 -0
  314. /package/dist/web/assets/{dream-maker-DEyDwFsd.js → dream-maker-DZAPbPTi.js} +0 -0
  315. /package/dist/web/assets/{emacs-lisp-D_qP2zS6.js → emacs-lisp-Ao5SW8ay.js} +0 -0
  316. /package/dist/web/assets/{everforest-dark-DbHa2U-p.js → everforest-dark-uC8QYotQ.js} +0 -0
  317. /package/dist/web/assets/{everforest-light-BISkJchP.js → everforest-light-CTgsVNMr.js} +0 -0
  318. /package/dist/web/assets/{fennel-6B22SfJR.js → fennel-WuBw6IR1.js} +0 -0
  319. /package/dist/web/assets/{file-exclamation-point-a8f3_w7a.js → file-exclamation-point-COAwgNGw.js} +0 -0
  320. /package/dist/web/assets/{fish-CubIIvJD.js → fish-Byy9dusu.js} +0 -0
  321. /package/dist/web/assets/{fluent-DF55zQ09.js → fluent-CDxb_sgw.js} +0 -0
  322. /package/dist/web/assets/{fortran-free-form-DvOu8jAt.js → fortran-free-form-DKWSTamT.js} +0 -0
  323. /package/dist/web/assets/{gdscript-DCPxdLpq.js → gdscript-prYHMgtD.js} +0 -0
  324. /package/dist/web/assets/{gdshader-CTZ381FO.js → gdshader-D-RM-SQk.js} +0 -0
  325. /package/dist/web/assets/{genie-C_QDtvgU.js → genie-CowkJhej.js} +0 -0
  326. /package/dist/web/assets/{gherkin-BcvK42tF.js → gherkin-CLFpoVYJ.js} +0 -0
  327. /package/dist/web/assets/{github-dark-default-CKGVrl3Z.js → github-dark-default-BK_1Qgb8.js} +0 -0
  328. /package/dist/web/assets/{github-dark-dimmed-C3dQZ_LC.js → github-dark-dimmed-Cv9lj6f-.js} +0 -0
  329. /package/dist/web/assets/{github-dark-high-contrast-DW78QukY.js → github-dark-high-contrast-CW5ZgIDh.js} +0 -0
  330. /package/dist/web/assets/{github-dark-C9afs_4w.js → github-dark-nW2F-RLd.js} +0 -0
  331. /package/dist/web/assets/{github-light-BnP2dznS.js → github-light-D4PqBHGZ.js} +0 -0
  332. /package/dist/web/assets/{github-light-default-C2fPZzPG.js → github-light-default-B-cHtJJV.js} +0 -0
  333. /package/dist/web/assets/{github-light-high-contrast-BzIuUFR2.js → github-light-high-contrast-Dt0HJq50.js} +0 -0
  334. /package/dist/web/assets/{gleam-BpeKwEIO.js → gleam-DwSyXJWP.js} +0 -0
  335. /package/dist/web/assets/{gn-nUb_Mit0.js → gn-Cv5WEzHc.js} +0 -0
  336. /package/dist/web/assets/{gnuplot-D7I0v20p.js → gnuplot-D7bRdY_M.js} +0 -0
  337. /package/dist/web/assets/{go-D7Qqska7.js → go-DiRVJ22U.js} +0 -0
  338. /package/dist/web/assets/{groovy-DS-pne5-.js → groovy-BHAgLTeO.js} +0 -0
  339. /package/dist/web/assets/{gruvbox-dark-hard-C0W01fsq.js → gruvbox-dark-hard-C8QZ3gzY.js} +0 -0
  340. /package/dist/web/assets/{gruvbox-dark-medium-Bqo6fQbg.js → gruvbox-dark-medium-Dp1eeid2.js} +0 -0
  341. /package/dist/web/assets/{gruvbox-dark-soft-D-XSM_fu.js → gruvbox-dark-soft-Cwq0dWVj.js} +0 -0
  342. /package/dist/web/assets/{gruvbox-light-hard-IVAwMJRl.js → gruvbox-light-hard-CLQCq2-w.js} +0 -0
  343. /package/dist/web/assets/{gruvbox-light-medium-38ATiG7i.js → gruvbox-light-medium-APHsh6Mo.js} +0 -0
  344. /package/dist/web/assets/{gruvbox-light-soft-DnZr3c_0.js → gruvbox-light-soft-CX-fYc64.js} +0 -0
  345. /package/dist/web/assets/{haskell-uQcywkDH.js → haskell-C4Tw-TDa.js} +0 -0
  346. /package/dist/web/assets/{haxe-c6bI4_GT.js → haxe-B7fSduTQ.js} +0 -0
  347. /package/dist/web/assets/{hcl-CQXTiEXq.js → hcl-Bi3ho6yC.js} +0 -0
  348. /package/dist/web/assets/{hjson-ChETf2bz.js → hjson-BXwae2M1.js} +0 -0
  349. /package/dist/web/assets/{hlsl-BMC4JGoE.js → hlsl-CRuQLBSa.js} +0 -0
  350. /package/dist/web/assets/{horizon-BusFlhLW.js → horizon-DtdQ6qjv.js} +0 -0
  351. /package/dist/web/assets/{horizon-bright-2oD0Mz7W.js → horizon-bright-BXSF_uKq.js} +0 -0
  352. /package/dist/web/assets/{houston-DdbbjqFg.js → houston-C6ASpUjT.js} +0 -0
  353. /package/dist/web/assets/{hy-D_SOuqw9.js → hy-BrWBHtHY.js} +0 -0
  354. /package/dist/web/assets/{image-gallery-CrM5fHKy.js → image-gallery-CGvlv8zR.js} +0 -0
  355. /package/dist/web/assets/{imba-BxLOHO5I.js → imba-C_JJXckG.js} +0 -0
  356. /package/dist/web/assets/{ini-ox-CFcg0.js → ini-DEE_vSHQ.js} +0 -0
  357. /package/dist/web/assets/{java-Bzo8yIal.js → java-CnmpcjcT.js} +0 -0
  358. /package/dist/web/assets/{javascript-DHuz9VXn.js → javascript-C-M7sa2e.js} +0 -0
  359. /package/dist/web/assets/{json-0_y80FD5.js → json-BjZ3dAk6.js} +0 -0
  360. /package/dist/web/assets/{json5-CEQ50pGM.js → json5-BQ2vpqjp.js} +0 -0
  361. /package/dist/web/assets/{jsonc-CfrLEAKA.js → jsonc-C5MjoWGx.js} +0 -0
  362. /package/dist/web/assets/{jsonl-fKbrANC2.js → jsonl-JvhrmQJI.js} +0 -0
  363. /package/dist/web/assets/{jsonnet-DKbkPaQ2.js → jsonnet-C5pdZVuo.js} +0 -0
  364. /package/dist/web/assets/{jssm-Dxxx1Hqu.js → jssm-Db17uybX.js} +0 -0
  365. /package/dist/web/assets/{jsx-DlJL-Oj3.js → jsx-tJp2Cyqu.js} +0 -0
  366. /package/dist/web/assets/{kanagawa-dragon-CwN4SV1c.js → kanagawa-dragon-BculT_Y1.js} +0 -0
  367. /package/dist/web/assets/{kanagawa-lotus-BHltayiE.js → kanagawa-lotus-yQgHUGwU.js} +0 -0
  368. /package/dist/web/assets/{kanagawa-wave-D-KXPjw6.js → kanagawa-wave-CyGoWN4d.js} +0 -0
  369. /package/dist/web/assets/{kdl-DvtoJdFo.js → kdl-Bn8R1REF.js} +0 -0
  370. /package/dist/web/assets/{kotlin-CTS4MLcx.js → kotlin-DWughK73.js} +0 -0
  371. /package/dist/web/assets/{kusto-HtSE_sKm.js → kusto--serPb0x.js} +0 -0
  372. /package/dist/web/assets/{laserwave-DaXZG9ge.js → laserwave-DfAPJ1tt.js} +0 -0
  373. /package/dist/web/assets/{lean-BYtGUfWx.js → lean-UAm1HOKl.js} +0 -0
  374. /package/dist/web/assets/{less-BoxmU_Mk.js → less-Xj6Ka0fF.js} +0 -0
  375. /package/dist/web/assets/{lib-B1clP4ai.js → lib-DgNcCtj3.js} +0 -0
  376. /package/dist/web/assets/{libesm-ah-mr-sh.js → libesm-CPh1Av0r.js} +0 -0
  377. /package/dist/web/assets/{light-plus-Bt5CyUuo.js → light-plus-BfS7gPcj.js} +0 -0
  378. /package/dist/web/assets/{llvm-CSdk9q9V.js → llvm-DvWiVwvU.js} +0 -0
  379. /package/dist/web/assets/{log-B-kp_3CL.js → log-Bo5z9bNz.js} +0 -0
  380. /package/dist/web/assets/{logo-DdIsXFDO.js → logo-CrIjcMZT.js} +0 -0
  381. /package/dist/web/assets/{luau-DUBpLlzQ.js → luau-C9TsYwNt.js} +0 -0
  382. /package/dist/web/assets/{make-B3JVjoW_.js → make-GYq4qVbx.js} +0 -0
  383. /package/dist/web/assets/{markdown-Seon0vHs.js → markdown-p5mNledS.js} +0 -0
  384. /package/dist/web/assets/{material-theme-Nq-ChX1P.js → material-theme-CWYOVxsP.js} +0 -0
  385. /package/dist/web/assets/{material-theme-darker-CPV4ayXJ.js → material-theme-darker-BDGty7YH.js} +0 -0
  386. /package/dist/web/assets/{material-theme-lighter-0kyjYqEd.js → material-theme-lighter-JbgOgV3n.js} +0 -0
  387. /package/dist/web/assets/{material-theme-ocean-DGpAp5co.js → material-theme-ocean-EMOpLpa2.js} +0 -0
  388. /package/dist/web/assets/{material-theme-palenight-B0AUn0NG.js → material-theme-palenight-CY5hgm7h.js} +0 -0
  389. /package/dist/web/assets/{matlab-C2waytxs.js → matlab-C-He_NTH.js} +0 -0
  390. /package/dist/web/assets/{mdx-DAis6R6I.js → mdx-Cr2TR5fj.js} +0 -0
  391. /package/dist/web/assets/{mermaid-_rnT2YGD.js → mermaid-BYc0-B0U.js} +0 -0
  392. /package/dist/web/assets/{min-dark-BSSjchUB.js → min-dark-CMJwqJqB.js} +0 -0
  393. /package/dist/web/assets/{min-light-DomAFQsa.js → min-light-Cx6vFiEX.js} +0 -0
  394. /package/dist/web/assets/{mipsasm-bBgtvPyG.js → mipsasm-Bjer5HwK.js} +0 -0
  395. /package/dist/web/assets/{mobile-bottom-sheet-CS3XMwFw.js → mobile-bottom-sheet-BUOJgiaZ.js} +0 -0
  396. /package/dist/web/assets/{mojo-Cp9BayW0.js → mojo-t90PR-Y2.js} +0 -0
  397. /package/dist/web/assets/{monokai-CL_9gbmn.js → monokai-dci_PdCm.js} +0 -0
  398. /package/dist/web/assets/{moonbit-BS_fcr-P.js → moonbit-AAzI-Hd-.js} +0 -0
  399. /package/dist/web/assets/{move-C79AH45U.js → move-kwBhnhrG.js} +0 -0
  400. /package/dist/web/assets/{narrat-CJ5s3BDf.js → narrat-CXww2YQL.js} +0 -0
  401. /package/dist/web/assets/{nextflow-groovy-ZHa4JrPJ.js → nextflow-groovy-CJXsuXGB.js} +0 -0
  402. /package/dist/web/assets/{night-owl-Jkf9zFQK.js → night-owl-_GD204Wr.js} +0 -0
  403. /package/dist/web/assets/{night-owl-light-DRPeaG5J.js → night-owl-light-DNgkw3kl.js} +0 -0
  404. /package/dist/web/assets/{nix-D2Jet9DN.js → nix-BgiorKFd.js} +0 -0
  405. /package/dist/web/assets/{nord-CREVs22j.js → nord-CaBmcxFC.js} +0 -0
  406. /package/dist/web/assets/{nushell-CAiDi_mR.js → nushell-DUh4UGx1.js} +0 -0
  407. /package/dist/web/assets/{objective-c-CVkmJkC1.js → objective-c-Cl9KU86S.js} +0 -0
  408. /package/dist/web/assets/{objective-cpp-DIKDO1Ly.js → objective-cpp-DVkIA8A0.js} +0 -0
  409. /package/dist/web/assets/{ocaml-R9qtGQhs.js → ocaml-vvoHTak0.js} +0 -0
  410. /package/dist/web/assets/{odin-DTYNQqVr.js → odin-Cyjw8woZ.js} +0 -0
  411. /package/dist/web/assets/{one-dark-pro-BSLWUJn5.js → one-dark-pro-B1cviILi.js} +0 -0
  412. /package/dist/web/assets/{one-light-DbkRXG3t.js → one-light-BPGUJeYI.js} +0 -0
  413. /package/dist/web/assets/{openscad-BlPcSnmT.js → openscad-BLMdTUU8.js} +0 -0
  414. /package/dist/web/assets/{pascal-B1Y46ZZB.js → pascal-i5niy3e7.js} +0 -0
  415. /package/dist/web/assets/{pkl-BhJSJbFv.js → pkl-CuOV7SsU.js} +0 -0
  416. /package/dist/web/assets/{plastic-BzxsCTpi.js → plastic-Bf_zE5KL.js} +0 -0
  417. /package/dist/web/assets/{plsql-DBba7dyP.js → plsql-cfqEtMD3.js} +0 -0
  418. /package/dist/web/assets/{plus-DmjC2iRB.js → plus-BM-Ty0fp.js} +0 -0
  419. /package/dist/web/assets/{po-BvgLlnNo.js → po-CFJcWgjr.js} +0 -0
  420. /package/dist/web/assets/{poimandres-DUaI_1JP.js → poimandres-G5YoaIFf.js} +0 -0
  421. /package/dist/web/assets/{polar-C7uILwJn.js → polar-rcjs3i9R.js} +0 -0
  422. /package/dist/web/assets/{postcss-BgJlpFdw.js → postcss-CBKY1FTZ.js} +0 -0
  423. /package/dist/web/assets/{powerquery-Dn1MIpZu.js → powerquery-Db7SXLbO.js} +0 -0
  424. /package/dist/web/assets/{powershell-Bo-DYzOS.js → powershell-LFy3MUTP.js} +0 -0
  425. /package/dist/web/assets/{prisma-CTLs5IdT.js → prisma-BE8GR1lH.js} +0 -0
  426. /package/dist/web/assets/{prolog-QRGun3eG.js → prolog-DOn5lR1e.js} +0 -0
  427. /package/dist/web/assets/{proto-B7PI7apn.js → proto-wr-TpAK_.js} +0 -0
  428. /package/dist/web/assets/{puppet-CBq0tLrP.js → puppet-D2Dkv62u.js} +0 -0
  429. /package/dist/web/assets/{purescript-DFewOQb2.js → purescript-DvgJgPdy.js} +0 -0
  430. /package/dist/web/assets/{python-iWuxKXvT.js → python-C7TlkHhK.js} +0 -0
  431. /package/dist/web/assets/{qmldir-cXiW3AsF.js → qmldir-CtZMwhcW.js} +0 -0
  432. /package/dist/web/assets/{qss-DASwAbBL.js → qss-dNZ2btnl.js} +0 -0
  433. /package/dist/web/assets/{r-TU2eaIPw.js → r-BlqnNkHS.js} +0 -0
  434. /package/dist/web/assets/{racket-SkRKqrLY.js → racket-CzRQrGc4.js} +0 -0
  435. /package/dist/web/assets/{raku-D31lthkZ.js → raku-BwutWhBF.js} +0 -0
  436. /package/dist/web/assets/{red-CTcQZevb.js → red-BMXMywmL.js} +0 -0
  437. /package/dist/web/assets/{reg-D8YAsTGf.js → reg-BqOKrIOw.js} +0 -0
  438. /package/dist/web/assets/{regexp-CD2uvAWx.js → regexp-Bero1BN2.js} +0 -0
  439. /package/dist/web/assets/{rel-CAaI-1fg.js → rel-BXKWIElA.js} +0 -0
  440. /package/dist/web/assets/{resolve-theme-CJvkL8hU.js → resolve-theme-IdhSR-gx.js} +0 -0
  441. /package/dist/web/assets/{riscv-DR-hJVIj.js → riscv-BbbBYJBo.js} +0 -0
  442. /package/dist/web/assets/{ron-CuUCJ0n4.js → ron-BtVTWW4b.js} +0 -0
  443. /package/dist/web/assets/{rose-pine-dawn-Bqz2sBRY.js → rose-pine-dawn-D7lwhUei.js} +0 -0
  444. /package/dist/web/assets/{rose-pine-aFHxW48i.js → rose-pine-hvkvQzvU.js} +0 -0
  445. /package/dist/web/assets/{rose-pine-moon-wqyh0an4.js → rose-pine-moon-CoHDmsIw.js} +0 -0
  446. /package/dist/web/assets/{rosmsg-CI1ywimO.js → rosmsg-CdaZFgI8.js} +0 -0
  447. /package/dist/web/assets/{run-in-terminal-CGW6o37_.js → run-in-terminal-CyS5Itj-.js} +0 -0
  448. /package/dist/web/assets/{rust-p7Imk4G_.js → rust-Dy2qsphD.js} +0 -0
  449. /package/dist/web/assets/{sass-C8JfaqCV.js → sass-Bz7NVxDb.js} +0 -0
  450. /package/dist/web/assets/{save-DRPrDfTt.js → save-C4z1p51e.js} +0 -0
  451. /package/dist/web/assets/{scala-DNxCW1By.js → scala-sXSwsNyq.js} +0 -0
  452. /package/dist/web/assets/{scheme-BYuUPJoL.js → scheme-DS7TUbN7.js} +0 -0
  453. /package/dist/web/assets/{sdbl-DbPeJPUr.js → sdbl-iISFvIep.js} +0 -0
  454. /package/dist/web/assets/{send-to-chat-YXHdAyLG.js → send-to-chat-BcO39BDR.js} +0 -0
  455. /package/dist/web/assets/{shellscript-DMiHlR3q.js → shellscript-BkIl4ApC.js} +0 -0
  456. /package/dist/web/assets/{shield-check-8GObuUAn.js → shield-check-C5laObJv.js} +0 -0
  457. /package/dist/web/assets/{shield-off-egKAZEwR.js → shield-off-DULFtyLS.js} +0 -0
  458. /package/dist/web/assets/{slack-dark-C4xGcQXI.js → slack-dark-B1eg0_m2.js} +0 -0
  459. /package/dist/web/assets/{slack-ochin-BzgRt_wm.js → slack-ochin-mdkc1ldu.js} +0 -0
  460. /package/dist/web/assets/{smalltalk-LDeL9PYH.js → smalltalk-CORtd03t.js} +0 -0
  461. /package/dist/web/assets/{snazzy-light-CXE7a5j_.js → snazzy-light-Bc6Q2G89.js} +0 -0
  462. /package/dist/web/assets/{solarized-dark-DgUhY74x.js → solarized-dark-CF83zRXM.js} +0 -0
  463. /package/dist/web/assets/{solarized-light-DD9C-H-9.js → solarized-light-BoKQZaYU.js} +0 -0
  464. /package/dist/web/assets/{solidity-CAbDB4D4.js → solidity-DOgi1N4w.js} +0 -0
  465. /package/dist/web/assets/{sparkles-n1hzh65o.js → sparkles-Dqsf3hq6.js} +0 -0
  466. /package/dist/web/assets/{splunk-kQREPfIc.js → splunk-BXfw5ZLy.js} +0 -0
  467. /package/dist/web/assets/{sql-CBzeNAD8.js → sql-BcVs-eX4.js} +0 -0
  468. /package/dist/web/assets/{ssh-config-L1euxrsM.js → ssh-config-CLCtNkkd.js} +0 -0
  469. /package/dist/web/assets/{stylus-DvBnYniP.js → stylus-DdP992aO.js} +0 -0
  470. /package/dist/web/assets/{swift-DF5NDQp6.js → swift-BnGb6Lgc.js} +0 -0
  471. /package/dist/web/assets/{synthwave-84-DbBhB_Hq.js → synthwave-84-cg9264l9.js} +0 -0
  472. /package/dist/web/assets/{system-verilog-D8s2ZW_k.js → system-verilog-GbHpszs3.js} +0 -0
  473. /package/dist/web/assets/{systemd-a5-XZJsG.js → systemd-Dz-bNsDQ.js} +0 -0
  474. /package/dist/web/assets/{table-BX2ZrJfM.js → table-CHmxuh6M.js} +0 -0
  475. /package/dist/web/assets/{talonscript-BLa0URTW.js → talonscript-CFIidoBA.js} +0 -0
  476. /package/dist/web/assets/{tasl-DIoV4XcC.js → tasl-Cu-TRTKx.js} +0 -0
  477. /package/dist/web/assets/{tcl-ztYAdXfQ.js → tcl-DwCHCB1K.js} +0 -0
  478. /package/dist/web/assets/{terraform-DvpCCiOZ.js → terraform-BzZw4T1z.js} +0 -0
  479. /package/dist/web/assets/{tokyo-night-BkHlYUv0.js → tokyo-night-RKsj2-tv.js} +0 -0
  480. /package/dist/web/assets/{toml-acIrxos6.js → toml-CirbOgDP.js} +0 -0
  481. /package/dist/web/assets/{tsv-BJB5EVCT.js → tsv-CraRcWdU.js} +0 -0
  482. /package/dist/web/assets/{tsx-B1MmXGT3.js → tsx-CjFg0lgw.js} +0 -0
  483. /package/dist/web/assets/{turtle-DFceTiqd.js → turtle-B-WBIOa6.js} +0 -0
  484. /package/dist/web/assets/{typescript-Dz9wU5Y1.js → typescript-MpLarYn1.js} +0 -0
  485. /package/dist/web/assets/{typespec-CPuYZijj.js → typespec-B7QlHMZ_.js} +0 -0
  486. /package/dist/web/assets/{typst-CfsCIYv8.js → typst-CcHSKFZj.js} +0 -0
  487. /package/dist/web/assets/{use-blob-url-BmlYYZ8L.js → use-blob-url-BKyVxOZw.js} +0 -0
  488. /package/dist/web/assets/{use-is-mobile-B8FA4kQf.js → use-is-mobile-BXGVvczu.js} +0 -0
  489. /package/dist/web/assets/{v-CGo0jcXA.js → v-xTGhWZuD.js} +0 -0
  490. /package/dist/web/assets/{vala-AsSR0hrb.js → vala-DwebjH3H.js} +0 -0
  491. /package/dist/web/assets/{vb-C7tvbXv1.js → vb-BxJT2RAy.js} +0 -0
  492. /package/dist/web/assets/{vendor-xterm-C1diXHJl.js → vendor-xterm-CU6zIYMB.js} +0 -0
  493. /package/dist/web/assets/{verilog--a33ND-p.js → verilog-CvV6RHPD.js} +0 -0
  494. /package/dist/web/assets/{vesper-B_Z0h4pn.js → vesper-CY3qd7E_.js} +0 -0
  495. /package/dist/web/assets/{vhdl-CWL5dZPN.js → vhdl-B9ZX-sUL.js} +0 -0
  496. /package/dist/web/assets/{viml-BglmT14Y.js → viml-Y42h_ExQ.js} +0 -0
  497. /package/dist/web/assets/{vitesse-black-RKFsSqQI.js → vitesse-black-DkXP6Sv-.js} +0 -0
  498. /package/dist/web/assets/{vitesse-dark-D7zDWNmc.js → vitesse-dark-B9CkIB6r.js} +0 -0
  499. /package/dist/web/assets/{vitesse-light-MAp87W5b.js → vitesse-light-C7DHrJCK.js} +0 -0
  500. /package/dist/web/assets/{vyper-CgCBYg1G.js → vyper-Cnd9s5j-.js} +0 -0
  501. /package/dist/web/assets/{wasm-Bwl4txwp.js → wasm-DQE71XTB.js} +0 -0
  502. /package/dist/web/assets/{wasm-BOG7ZeTT.js → wasm-iWe7Fzjc.js} +0 -0
  503. /package/dist/web/assets/{wenyan-DpShPKXZ.js → wenyan-Bc5Pnm9l.js} +0 -0
  504. /package/dist/web/assets/{wgsl-BakcCblK.js → wgsl-D-YUAWkP.js} +0 -0
  505. /package/dist/web/assets/{wikitext-NroRWVAO.js → wikitext-DYQDUYf2.js} +0 -0
  506. /package/dist/web/assets/{wit-B5CM2pg6.js → wit-P6u7mfwy.js} +0 -0
  507. /package/dist/web/assets/{wolfram-7MTFBJpR.js → wolfram-6SXLUqao.js} +0 -0
  508. /package/dist/web/assets/{yaml-Bwr01G2K.js → yaml-CQiMLVcZ.js} +0 -0
  509. /package/dist/web/assets/{zenscript-Dj8GATvi.js → zenscript-DFMywo_P.js} +0 -0
  510. /package/dist/web/assets/{zig-LAE-fbS-.js → zig-CtAjaIiF.js} +0 -0
@@ -0,0 +1,89 @@
1
+ import { useEffect, useState } from "react";
2
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
3
+ import { BottomSheet } from "@/components/ui/mobile-bottom-sheet";
4
+ import { Button } from "@/components/ui/button";
5
+ import { Switch } from "@/components/ui/switch";
6
+ import { useIsMobile } from "@/hooks/use-is-mobile";
7
+ import { formatRam } from "@/lib/format-bytes";
8
+ import type { ProcessInfo } from "../../../types/system-metrics";
9
+
10
+ export interface KillConfirmDialogProps {
11
+ process: ProcessInfo | null;
12
+ onConfirm: (proc: ProcessInfo, tree: boolean) => void;
13
+ onCancel: () => void;
14
+ }
15
+
16
+ /** Confirm dialog for ending a process. Bottom sheet below `md`, centered dialog at
17
+ * `md`+. The "end child processes" toggle defaults off and the destructive action is
18
+ * never the default focus — Escape/backdrop cancels either way. */
19
+ export function KillConfirmDialog({ process, onConfirm, onCancel }: KillConfirmDialogProps) {
20
+ const isMobile = useIsMobile();
21
+ const [tree, setTree] = useState(false);
22
+
23
+ useEffect(() => {
24
+ if (!process) setTree(false);
25
+ }, [process]);
26
+
27
+ if (!process) return null;
28
+
29
+ const body = (
30
+ <div className="space-y-4" data-testid="sysmon-kill-confirm">
31
+ <p className="text-sm">
32
+ End <span className="font-medium">{process.name}</span> (pid {process.pid})?
33
+ </p>
34
+ <p className="text-xs text-text-subtle">
35
+ CPU {process.cpu.toFixed(1)}% · RAM {formatRam(process.ramMB)}
36
+ </p>
37
+ <label className="flex items-center justify-between gap-3 min-h-11 py-1">
38
+ <span className="text-sm">Also end child processes</span>
39
+ <Switch
40
+ checked={tree}
41
+ onCheckedChange={setTree}
42
+ data-testid="sysmon-kill-tree"
43
+ aria-label="Also end child processes"
44
+ />
45
+ </label>
46
+ <div className="flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2">
47
+ <Button
48
+ variant="outline"
49
+ onClick={onCancel}
50
+ data-testid="sysmon-kill-confirm-cancel"
51
+ className="min-h-11"
52
+ >
53
+ Cancel
54
+ </Button>
55
+ <Button
56
+ variant="destructive"
57
+ autoFocus={false}
58
+ onClick={() => onConfirm(process, tree)}
59
+ data-testid="sysmon-kill-confirm-ok"
60
+ className="min-h-11"
61
+ >
62
+ End process
63
+ </Button>
64
+ </div>
65
+ </div>
66
+ );
67
+
68
+ if (isMobile) {
69
+ return (
70
+ <BottomSheet open onClose={onCancel}>
71
+ <div className="px-4 pb-4">
72
+ <h2 className="text-base font-semibold mb-3">End process</h2>
73
+ {body}
74
+ </div>
75
+ </BottomSheet>
76
+ );
77
+ }
78
+
79
+ return (
80
+ <Dialog open onOpenChange={(open) => !open && onCancel()}>
81
+ <DialogContent>
82
+ <DialogHeader>
83
+ <DialogTitle>End process</DialogTitle>
84
+ </DialogHeader>
85
+ {body}
86
+ </DialogContent>
87
+ </Dialog>
88
+ );
89
+ }
@@ -0,0 +1,108 @@
1
+ import { useRef, useEffect, memo } from "react";
2
+ import { useElementWidth } from "@/hooks/use-element-width";
3
+ import { resolveScaleMax, resolveCssColor } from "./chart-scale";
4
+
5
+ export interface MetricSeries {
6
+ data: number[];
7
+ color: string;
8
+ }
9
+
10
+ interface MetricChartCanvasProps {
11
+ /** 1-2 series drawn on the same axis. */
12
+ series: MetricSeries[];
13
+ height: number;
14
+ /** Fixed scale ceiling (e.g. 100 for a percentage axis). Omitted = autoscale to
15
+ * the max across all series in the visible window. */
16
+ maxValue?: number;
17
+ }
18
+
19
+ /** Generalised, filled, multi-series canvas chart for the Overview cards. Fills the
20
+ * width of its parent — the cards live in a resizable floating window, so a fixed
21
+ * pixel width overflows the card as soon as the window is narrower than designed.
22
+ * No redraw throttle — one draw per prop change, which at a 2s tick cadence is
23
+ * nowhere near a frame budget. `SparklineCanvas` stays the small inline variant
24
+ * used by process rows. */
25
+ export const MetricChartCanvas = memo(function MetricChartCanvas({
26
+ series,
27
+ height,
28
+ maxValue,
29
+ }: MetricChartCanvasProps) {
30
+ const wrapperRef = useRef<HTMLDivElement>(null);
31
+ const canvasRef = useRef<HTMLCanvasElement>(null);
32
+ const width = useElementWidth(wrapperRef);
33
+
34
+ useEffect(() => {
35
+ const canvas = canvasRef.current;
36
+ if (!canvas || width === 0) return;
37
+ const ctx = canvas.getContext("2d");
38
+ if (!ctx) return;
39
+
40
+ const dpr = window.devicePixelRatio || 1;
41
+ canvas.width = width * dpr;
42
+ canvas.height = height * dpr;
43
+ ctx.scale(dpr, dpr);
44
+ ctx.clearRect(0, 0, width, height);
45
+
46
+ // Resolved once per draw, not per point — `var(...)` is not a canvas-resolvable
47
+ // color, so every strokeStyle/fillStyle assignment below must go through this.
48
+ const style = getComputedStyle(canvas);
49
+ const colorOf = (c: string) => resolveCssColor(c, style);
50
+
51
+ const padding = 2;
52
+ const drawH = height - padding * 2;
53
+ const longest = Math.max(1, ...series.map((s) => s.data.length));
54
+
55
+ // A flat baseline when there isn't enough data yet to draw a meaningful line —
56
+ // a freshly-opened window otherwise shows nothing at all for the first tick.
57
+ if (longest < 2) {
58
+ ctx.beginPath();
59
+ ctx.strokeStyle = colorOf("var(--color-border)");
60
+ ctx.lineWidth = 1;
61
+ ctx.moveTo(0, height - padding);
62
+ ctx.lineTo(width, height - padding);
63
+ ctx.stroke();
64
+ return;
65
+ }
66
+
67
+ const scaleMax = resolveScaleMax(series.flatMap((s) => s.data), maxValue);
68
+
69
+ for (const s of series) {
70
+ if (s.data.length < 2) continue;
71
+ const localStepX = width / (s.data.length - 1);
72
+
73
+ // Filled area under the line.
74
+ ctx.beginPath();
75
+ ctx.moveTo(0, height - padding);
76
+ for (let i = 0; i < s.data.length; i++) {
77
+ const x = i * localStepX;
78
+ const y = padding + drawH - (s.data[i]! / scaleMax) * drawH;
79
+ ctx.lineTo(x, y);
80
+ }
81
+ ctx.lineTo((s.data.length - 1) * localStepX, height - padding);
82
+ ctx.closePath();
83
+ ctx.fillStyle = colorOf(s.color);
84
+ ctx.globalAlpha = 0.12;
85
+ ctx.fill();
86
+ ctx.globalAlpha = 1;
87
+
88
+ // Line on top.
89
+ ctx.beginPath();
90
+ ctx.strokeStyle = colorOf(s.color);
91
+ ctx.lineWidth = 1.5;
92
+ ctx.lineJoin = "round";
93
+ for (let i = 0; i < s.data.length; i++) {
94
+ const x = i * localStepX;
95
+ const y = padding + drawH - (s.data[i]! / scaleMax) * drawH;
96
+ if (i === 0) ctx.moveTo(x, y);
97
+ else ctx.lineTo(x, y);
98
+ }
99
+ ctx.stroke();
100
+ }
101
+ }, [series, width, height, maxValue]);
102
+
103
+ return (
104
+ <div ref={wrapperRef} className="w-full min-w-0 overflow-hidden" style={{ height }}>
105
+ <canvas ref={canvasRef} style={{ width: width || "100%", height }} className="block" />
106
+ </div>
107
+ );
108
+ });
@@ -0,0 +1,39 @@
1
+ import { MetricChartCanvas } from "../metric-chart-canvas";
2
+ import { CpuCoreBars } from "../cpu-core-bars";
3
+
4
+ export interface CpuCardProps {
5
+ total: number;
6
+ cores: number[];
7
+ model: string;
8
+ series: number[];
9
+ }
10
+
11
+ function cpuColor(pct: number): string {
12
+ if (pct > 80) return "text-error";
13
+ if (pct > 50) return "text-warning";
14
+ return "text-success";
15
+ }
16
+
17
+ export function CpuCard({ total, cores, model, series }: CpuCardProps) {
18
+ return (
19
+ <div
20
+ className="rounded-lg border border-border p-4 space-y-2"
21
+ data-testid="sysmon-card-cpu"
22
+ data-cpu-total={total}
23
+ >
24
+ <div className="flex items-baseline justify-between">
25
+ <h3 className="text-sm font-medium">CPU</h3>
26
+ <span className={`text-2xl font-semibold ${cpuColor(total)}`}>{total.toFixed(1)}%</span>
27
+ </div>
28
+ <MetricChartCanvas
29
+ series={[{ data: series, color: "var(--color-primary)" }]}
30
+ height={56}
31
+ maxValue={100}
32
+ />
33
+ <CpuCoreBars cores={cores} />
34
+ <p className="text-[11px] text-text-subtle truncate" title={model}>
35
+ {model}
36
+ </p>
37
+ </div>
38
+ );
39
+ }
@@ -0,0 +1,41 @@
1
+ import { formatBps } from "@/lib/format-bytes";
2
+ import { MetricChartCanvas } from "../metric-chart-canvas";
3
+
4
+ export interface DiskCardProps {
5
+ available: boolean;
6
+ inBps: number;
7
+ outBps: number;
8
+ readSeries: number[];
9
+ writeSeries: number[];
10
+ /** True while the stream has not yet delivered a second tick — a rate needs two
11
+ * samples, so `available:false` here is expected, not a missing collector. */
12
+ measuring?: boolean;
13
+ }
14
+
15
+ export function DiskCard({ available, inBps, outBps, readSeries, writeSeries, measuring }: DiskCardProps) {
16
+ return (
17
+ <div
18
+ className="rounded-lg border border-border p-4 space-y-2"
19
+ data-testid="sysmon-card-disk"
20
+ data-available={available}
21
+ >
22
+ <h3 className="text-sm font-medium">Disk</h3>
23
+ {available ? (
24
+ <>
25
+ <MetricChartCanvas
26
+ series={[
27
+ { data: readSeries, color: "var(--color-primary)" },
28
+ { data: writeSeries, color: "var(--color-warning)" },
29
+ ]}
30
+ height={56}
31
+ />
32
+ <p className="text-[11px] text-text-subtle">
33
+ Read {formatBps(inBps)} · Write {formatBps(outBps)}
34
+ </p>
35
+ </>
36
+ ) : (
37
+ <p className="text-[11px] text-text-subtle">{measuring ? "measuring…" : "n/a"}</p>
38
+ )}
39
+ </div>
40
+ );
41
+ }
@@ -0,0 +1,33 @@
1
+ import { formatRam } from "@/lib/format-bytes";
2
+ import { MetricChartCanvas } from "../metric-chart-canvas";
3
+
4
+ export interface GpuCardProps {
5
+ name: string;
6
+ utilPercent: number;
7
+ vramUsedMB: number;
8
+ vramTotalMB: number;
9
+ series: number[];
10
+ }
11
+
12
+ /** One card per GPU. The caller (`overview-panel.tsx`) renders zero of these when
13
+ * `system.gpus` is empty — hide, never a disabled placeholder card. */
14
+ export function GpuCard({ name, utilPercent, vramUsedMB, vramTotalMB, series }: GpuCardProps) {
15
+ return (
16
+ <div className="rounded-lg border border-border p-4 space-y-2" data-testid="sysmon-card-gpu">
17
+ <div className="flex items-baseline justify-between gap-2">
18
+ <h3 className="text-sm font-medium truncate" title={name}>
19
+ {name}
20
+ </h3>
21
+ <span className="text-2xl font-semibold shrink-0">{utilPercent.toFixed(0)}%</span>
22
+ </div>
23
+ <MetricChartCanvas
24
+ series={[{ data: series, color: "var(--color-primary)" }]}
25
+ height={56}
26
+ maxValue={100}
27
+ />
28
+ <p className="text-[11px] text-text-subtle">
29
+ VRAM {formatRam(vramUsedMB)} / {formatRam(vramTotalMB)}
30
+ </p>
31
+ </div>
32
+ );
33
+ }
@@ -0,0 +1,32 @@
1
+ import { formatRam } from "@/lib/format-bytes";
2
+ import { MetricChartCanvas } from "../metric-chart-canvas";
3
+
4
+ export interface MemCardProps {
5
+ usedMB: number;
6
+ totalMB: number;
7
+ percent: number;
8
+ series: number[];
9
+ }
10
+
11
+ export function MemCard({ usedMB, totalMB, percent, series }: MemCardProps) {
12
+ return (
13
+ <div
14
+ className="rounded-lg border border-border p-4 space-y-2"
15
+ data-testid="sysmon-card-mem"
16
+ data-mem-percent={percent}
17
+ >
18
+ <div className="flex items-baseline justify-between">
19
+ <h3 className="text-sm font-medium">Memory</h3>
20
+ <span className="text-2xl font-semibold">{percent.toFixed(1)}%</span>
21
+ </div>
22
+ <MetricChartCanvas
23
+ series={[{ data: series, color: "var(--color-primary)" }]}
24
+ height={56}
25
+ maxValue={100}
26
+ />
27
+ <p className="text-[11px] text-text-subtle">
28
+ {formatRam(usedMB)} / {formatRam(totalMB)}
29
+ </p>
30
+ </div>
31
+ );
32
+ }
@@ -0,0 +1,41 @@
1
+ import { formatBps } from "@/lib/format-bytes";
2
+ import { MetricChartCanvas } from "../metric-chart-canvas";
3
+
4
+ export interface NetCardProps {
5
+ available: boolean;
6
+ inBps: number;
7
+ outBps: number;
8
+ downSeries: number[];
9
+ upSeries: number[];
10
+ /** True while the stream has not yet delivered a second tick — a rate needs two
11
+ * samples, so `available:false` here is expected, not a missing collector. */
12
+ measuring?: boolean;
13
+ }
14
+
15
+ export function NetCard({ available, inBps, outBps, downSeries, upSeries, measuring }: NetCardProps) {
16
+ return (
17
+ <div
18
+ className="rounded-lg border border-border p-4 space-y-2"
19
+ data-testid="sysmon-card-net"
20
+ data-available={available}
21
+ >
22
+ <h3 className="text-sm font-medium">Network</h3>
23
+ {available ? (
24
+ <>
25
+ <MetricChartCanvas
26
+ series={[
27
+ { data: downSeries, color: "var(--color-primary)" },
28
+ { data: upSeries, color: "var(--color-warning)" },
29
+ ]}
30
+ height={56}
31
+ />
32
+ <p className="text-[11px] text-text-subtle">
33
+ Down {formatBps(inBps)} · Up {formatBps(outBps)}
34
+ </p>
35
+ </>
36
+ ) : (
37
+ <p className="text-[11px] text-text-subtle">{measuring ? "measuring…" : "n/a"}</p>
38
+ )}
39
+ </div>
40
+ );
41
+ }
@@ -0,0 +1,97 @@
1
+ import { useMemo } from "react";
2
+ import type { MetricsHistoryPoint, SystemMetrics } from "../../../types/system-metrics";
3
+ import { CpuCard } from "./overview-cards/cpu-card";
4
+ import { MemCard } from "./overview-cards/mem-card";
5
+ import { DiskCard } from "./overview-cards/disk-card";
6
+ import { NetCard } from "./overview-cards/net-card";
7
+ import { GpuCard } from "./overview-cards/gpu-card";
8
+
9
+ export interface OverviewPanelProps {
10
+ system: SystemMetrics;
11
+ history: MetricsHistoryPoint[];
12
+ }
13
+
14
+ const SERIES_POINTS = 200;
15
+
16
+ /** One pass over the recent history window building every card's series together,
17
+ * rather than one `.slice(-200).map(...)` per card. */
18
+ function useOverviewSeries(history: MetricsHistoryPoint[]) {
19
+ return useMemo(() => {
20
+ const recent = history.slice(-SERIES_POINTS);
21
+ const cpu: number[] = [];
22
+ const mem: number[] = [];
23
+ const diskRead: number[] = [];
24
+ const diskWrite: number[] = [];
25
+ const netDown: number[] = [];
26
+ const netUp: number[] = [];
27
+ const gpuUtil: number[][] = [];
28
+
29
+ for (const point of recent) {
30
+ cpu.push(point.system.cpu.total);
31
+ mem.push(point.system.mem.percent);
32
+ diskRead.push(point.system.disk.available ? point.system.disk.inBps : 0);
33
+ diskWrite.push(point.system.disk.available ? point.system.disk.outBps : 0);
34
+ netDown.push(point.system.net.available ? point.system.net.inBps : 0);
35
+ netUp.push(point.system.net.available ? point.system.net.outBps : 0);
36
+ point.system.gpus.forEach((g, i) => {
37
+ (gpuUtil[i] ??= []).push(g.utilPercent);
38
+ });
39
+ }
40
+
41
+ return { cpu, mem, diskRead, diskWrite, netDown, netUp, gpuUtil };
42
+ }, [history]);
43
+ }
44
+
45
+ export function OverviewPanel({ system, history }: OverviewPanelProps) {
46
+ const series = useOverviewSeries(history);
47
+ // Disk/net rates need a delta between two samples — `available:false` on the very
48
+ // first frame(s) is the collector doing exactly what it should, not a missing
49
+ // source, so the card says so instead of the flat, indistinguishable "n/a".
50
+ const measuring = history.length <= 1;
51
+
52
+ return (
53
+ <div
54
+ className="p-4 grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4"
55
+ data-testid="sysmon-overview"
56
+ >
57
+ <CpuCard
58
+ total={system.cpu.total}
59
+ cores={system.cpu.cores}
60
+ model={system.cpu.model}
61
+ series={series.cpu}
62
+ />
63
+ <MemCard
64
+ usedMB={system.mem.usedMB}
65
+ totalMB={system.mem.totalMB}
66
+ percent={system.mem.percent}
67
+ series={series.mem}
68
+ />
69
+ <DiskCard
70
+ available={system.disk.available}
71
+ inBps={system.disk.inBps}
72
+ outBps={system.disk.outBps}
73
+ readSeries={series.diskRead}
74
+ writeSeries={series.diskWrite}
75
+ measuring={measuring}
76
+ />
77
+ <NetCard
78
+ available={system.net.available}
79
+ inBps={system.net.inBps}
80
+ outBps={system.net.outBps}
81
+ downSeries={series.netDown}
82
+ upSeries={series.netUp}
83
+ measuring={measuring}
84
+ />
85
+ {system.gpus.map((gpu, i) => (
86
+ <GpuCard
87
+ key={`${gpu.name}-${i}`}
88
+ name={gpu.name}
89
+ utilPercent={gpu.utilPercent}
90
+ vramUsedMB={gpu.vramUsedMB}
91
+ vramTotalMB={gpu.vramTotalMB}
92
+ series={series.gpuUtil[i] ?? []}
93
+ />
94
+ ))}
95
+ </div>
96
+ );
97
+ }
@@ -0,0 +1,93 @@
1
+ /** Pure grid-template builder for the process table. No React, so the visibility
2
+ * rules (which optional columns exist, which one survives below `@lg`) are
3
+ * unit-testable without mounting a component.
4
+ *
5
+ * Two responsive templates are computed up front and switched via CSS custom
6
+ * properties + a `@lg:` Tailwind class (see `PROCESS_ROW_GRID_CLASS` below) —
7
+ * Tailwind's arbitrary-value scan only needs the class NAME to be a static
8
+ * string; the var() value itself can vary at runtime. This mirrors the fixed
9
+ * two-template approach the process table already used for the trend/age
10
+ * track, just parameterised by which optional columns the host can measure. */
11
+ import type { CSSProperties } from "react";
12
+ import type { ProcessColumnAvailability, SortKey } from "../../../types/system-metrics";
13
+
14
+ export type OptionalColumnKey = "disk" | "gpu" | "net";
15
+
16
+ /** Alias kept local so call sites don't need to know the exact server-contract
17
+ * type name — this module only cares about the three boolean flags. */
18
+ export type ProcessColumnsFlags = ProcessColumnAvailability;
19
+
20
+ const OPTIONAL_COLUMN_ORDER: OptionalColumnKey[] = ["disk", "gpu", "net"];
21
+
22
+ /** Disk/Net cells show two values ("↓ read ↑ write"); GPU shows one composite
23
+ * ("12% · 1.1 GB") and fits narrower. */
24
+ const OPTIONAL_COLUMN_WIDTH: Record<OptionalColumnKey, string> = {
25
+ disk: "120px",
26
+ gpu: "90px",
27
+ net: "120px",
28
+ };
29
+
30
+ /** Fixed tracks that exist regardless of optional columns: Process name (flexible),
31
+ * CPU, RAM at the start; the trend/age track (wide only) and the kill button at
32
+ * the end. */
33
+ const NAME_CPU_RAM = ["minmax(0,1fr)", "64px", "80px"];
34
+ const TREND_TRACK = "130px";
35
+ const KILL_TRACK = "44px";
36
+
37
+ export interface ProcessGridResult {
38
+ /** Grid template for `@lg` and up: Name/CPU/RAM + every enabled optional column
39
+ * in a fixed order + the trend/age track + kill button. */
40
+ wideTemplate: string;
41
+ /** Grid template below `@lg`: Name/CPU/RAM + AT MOST the one optional column
42
+ * currently sorted by (if enabled) + kill button. No trend/age track. */
43
+ narrowTemplate: string;
44
+ /** Which optional columns are enabled at all (host can measure them). */
45
+ columns: ProcessColumnsFlags;
46
+ /** The single optional column visible below `@lg`, or null when the current
47
+ * sort isn't on an optional column (or that column isn't enabled). */
48
+ narrowExtra: OptionalColumnKey | null;
49
+ }
50
+
51
+ function isOptionalColumnKey(key: SortKey): key is OptionalColumnKey {
52
+ return key === "disk" || key === "gpu" || key === "net";
53
+ }
54
+
55
+ export function buildProcessGrid(columns: ProcessColumnsFlags, sortKey: SortKey): ProcessGridResult {
56
+ const enabled = OPTIONAL_COLUMN_ORDER.filter((k) => columns[k]);
57
+ const narrowExtra = isOptionalColumnKey(sortKey) && columns[sortKey] ? sortKey : null;
58
+
59
+ const wideTemplate = [
60
+ ...NAME_CPU_RAM,
61
+ ...enabled.map((k) => OPTIONAL_COLUMN_WIDTH[k]),
62
+ TREND_TRACK,
63
+ KILL_TRACK,
64
+ ].join(" ");
65
+
66
+ const narrowTemplate = [
67
+ ...NAME_CPU_RAM,
68
+ ...(narrowExtra ? [OPTIONAL_COLUMN_WIDTH[narrowExtra]] : []),
69
+ KILL_TRACK,
70
+ ].join(" ");
71
+
72
+ return { wideTemplate, narrowTemplate, columns, narrowExtra };
73
+ }
74
+
75
+ /** Static class names (Tailwind can see both arbitrary-value strings at build
76
+ * time); the actual template text is supplied per-render via the two CSS
77
+ * custom properties in `gridCssVars`. */
78
+ export const PROCESS_ROW_GRID_CLASS = "grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]";
79
+
80
+ export function gridCssVars(grid: ProcessGridResult): CSSProperties {
81
+ return {
82
+ "--sysmon-grid-n": grid.narrowTemplate,
83
+ "--sysmon-grid-w": grid.wideTemplate,
84
+ } as CSSProperties;
85
+ }
86
+
87
+ /** Visibility className for an optional column's cell: always visible when it is
88
+ * the narrow-mode survivor, otherwise hidden below `@lg` and shown at `@lg`+.
89
+ * Caller must only render the cell at all when `columns[key]` is true — when
90
+ * disabled, the column has no track in either template. */
91
+ export function optionalCellClassName(grid: ProcessGridResult, key: OptionalColumnKey): string {
92
+ return grid.narrowExtra === key ? "block" : "hidden @lg:block";
93
+ }
@@ -0,0 +1,71 @@
1
+ import { ChevronRight, ChevronDown } from "lucide-react";
2
+ import { cn } from "@/lib/utils";
3
+ import { formatRam } from "@/lib/format-bytes";
4
+ import { cpuColor, formatDiskCell, formatGpuCell, formatNetCell, sumOptionalBps } from "./process-row-format";
5
+ import { optionalCellClassName, type ProcessGridResult } from "./process-columns-grid";
6
+ import { SparklineCanvas } from "./sparkline-canvas";
7
+ import type { ProcessGroup } from "../../../types/system-metrics";
8
+
9
+ export interface ProcessGroupRowProps {
10
+ group: ProcessGroup;
11
+ expanded: boolean;
12
+ spark: number[];
13
+ grid: ProcessGridResult;
14
+ onToggle: (key: string) => void;
15
+ }
16
+
17
+ export function ProcessGroupRow({ group, expanded, spark, grid, onToggle }: ProcessGroupRowProps) {
18
+ const Chevron = expanded ? ChevronDown : ChevronRight;
19
+
20
+ return (
21
+ <div
22
+ className="grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]"
23
+ onClick={() => onToggle(group.key)}
24
+ data-testid="sysmon-group-row"
25
+ data-group-key={group.key}
26
+ data-count={group.count}
27
+ data-disk-bps={sumOptionalBps(group.diskReadBps, group.diskWriteBps)}
28
+ data-gpu-pct={group.gpuPct}
29
+ data-net-bps={sumOptionalBps(group.netInBps, group.netOutBps)}
30
+ >
31
+ <div className="flex items-center gap-1.5 min-w-0">
32
+ <button
33
+ type="button"
34
+ onClick={(e) => {
35
+ e.stopPropagation();
36
+ onToggle(group.key);
37
+ }}
38
+ aria-expanded={expanded}
39
+ aria-label={`${expanded ? "Collapse" : "Expand"} ${group.label}`}
40
+ data-testid="sysmon-group-expand"
41
+ className="flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0"
42
+ >
43
+ <Chevron className="size-3.5 text-text-subtle" />
44
+ </button>
45
+ <span className="truncate font-medium">{group.label}</span>
46
+ <span className="text-text-subtle shrink-0">({group.count})</span>
47
+ </div>
48
+ <span className={cn("text-right", cpuColor(group.cpu))}>{group.cpu.toFixed(1)}%</span>
49
+ <span className="text-right text-text-secondary">{formatRam(group.ramMB)}</span>
50
+ {grid.columns.disk && (
51
+ <span className={cn("text-right text-text-secondary tabular-nums truncate", optionalCellClassName(grid, "disk"))}>
52
+ {formatDiskCell(group.diskReadBps, group.diskWriteBps)}
53
+ </span>
54
+ )}
55
+ {grid.columns.gpu && (
56
+ <span className={cn("text-right text-text-secondary tabular-nums truncate", optionalCellClassName(grid, "gpu"))}>
57
+ {formatGpuCell(group.gpuPct, group.gpuMemMB)}
58
+ </span>
59
+ )}
60
+ {grid.columns.net && (
61
+ <span className={cn("text-right text-text-secondary tabular-nums truncate", optionalCellClassName(grid, "net"))}>
62
+ {formatNetCell(group.netInBps, group.netOutBps)}
63
+ </span>
64
+ )}
65
+ <div className="hidden @lg:flex items-center justify-end">
66
+ {spark.length > 1 && <SparklineCanvas data={spark} width={120} height={20} maxValue={100} />}
67
+ </div>
68
+ <div className="hidden @lg:block" />
69
+ </div>
70
+ );
71
+ }