@jheavenknows/bluerouter 5.3.14 → 5.3.16

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 (383) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +4 -4
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +57 -38
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  46. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  47. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  49. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  50. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  52. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  53. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  54. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  55. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  56. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  57. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  59. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  61. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  114. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  116. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  150. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  153. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  171. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  172. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  208. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  210. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  212. package/app/.next-cli-build/server/app/callback.html +1 -1
  213. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  214. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  215. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  216. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  217. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  218. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  219. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  220. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  221. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  222. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  223. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +6 -6
  224. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +6 -6
  225. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +6 -6
  226. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  227. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  228. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  229. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  230. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  231. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  232. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  233. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  234. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  235. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  236. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  237. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  238. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +7 -7
  239. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +7 -7
  240. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +7 -7
  241. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  242. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  243. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  244. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  245. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  246. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  247. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  248. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  249. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  250. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  251. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  252. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  253. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  254. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  255. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  256. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  257. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  258. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  259. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  260. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  261. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  262. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  263. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +6 -6
  264. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +6 -6
  265. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +6 -6
  266. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +1 -1
  267. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  268. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  269. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  270. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  271. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  272. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  273. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  274. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  275. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  276. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  277. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  278. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  279. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  280. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  281. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  282. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  283. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  284. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  285. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  286. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  287. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  288. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  289. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  290. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  291. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  292. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  294. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  295. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  296. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  297. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  298. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  299. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  300. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  301. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  302. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  304. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  305. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  306. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  307. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  308. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  309. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  310. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  311. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  312. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  313. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
  314. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +7 -7
  315. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
  316. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  317. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  319. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  320. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  321. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  322. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  324. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  325. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  326. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  327. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  328. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  329. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  330. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  331. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  332. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  333. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  334. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  335. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  336. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  338. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  339. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  340. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  341. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  342. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  343. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  344. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  345. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  346. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  347. package/app/.next-cli-build/server/app/index.html +1 -1
  348. package/app/.next-cli-build/server/app/index.rsc +5 -5
  349. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  350. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  351. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  352. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  353. package/app/.next-cli-build/server/app/landing.html +1 -1
  354. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  355. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  356. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  357. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  358. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  359. package/app/.next-cli-build/server/app/login.html +1 -1
  360. package/app/.next-cli-build/server/app/login.rsc +6 -6
  361. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  362. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  363. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  364. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  365. package/app/.next-cli-build/server/app-paths-manifest.json +4 -4
  366. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  367. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  368. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  369. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  370. package/app/.next-cli-build/server/chunks/7478.js +70 -5
  371. package/app/.next-cli-build/server/chunks/7639.js +1 -1
  372. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  373. package/app/.next-cli-build/server/pages/404.html +1 -1
  374. package/app/.next-cli-build/server/pages/500.html +1 -1
  375. package/app/.next-cli-build/static/chunks/{5263-321fc692eb0ca21a.js → 5263-d6ee4d6284abc821.js} +1 -1
  376. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/{template-eecb5d00bb376ac8.js → template-ad7c5f7bdb0dfe45.js} +103 -79
  377. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.10-to-5.3.11-5.3.11-20260817-124500 → upgrade-5.3.13-to-5.3.14-5.3.14-20260817-133504}/data.sqlite +0 -0
  378. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.11-to-5.3.12-5.3.12-20260817-125751 → upgrade-5.3.14-to-5.3.15-5.3.15-20260817-155942}/data.sqlite +0 -0
  379. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
  380. package/app/package.json +1 -1
  381. package/package.json +1 -1
  382. /package/app/.next-cli-build/static/{0nrG16RWAo02V_gcmwi9y → ipwfbIyh2BtaRvddGx6I8}/_buildManifest.js +0 -0
  383. /package/app/.next-cli-build/static/{0nrG16RWAo02V_gcmwi9y → ipwfbIyh2BtaRvddGx6I8}/_ssgManifest.js +0 -0
@@ -1,68 +1,69 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[770],{6202:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>v});var a=t(95155),i=t(12115);let o="button[data-resource-server-id]",n="resource-vllm-metric-guide",s="resource-monitor-live-metrics";function l(e){let r=Number(e)||0;return .001>Math.abs(r-Math.round(r))?String(Math.round(r)):r.toFixed(1)}function c(e){let r=Number(e);return Number.isFinite(r)?Math.max(0,Math.min(100,r)):0}function u(e){let r=Number(e);return Number.isFinite(r)?r:null}function d(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;")}function p(e,r,t,a="primary"){let i=c(r);return`
2
- <div class="resource-live-bar resource-live-bar-${a}">
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[770],{6202:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>x});var o=t(95155),a=t(12115);let n="button[data-resource-server-id]",i="resource-vllm-metric-guide",s="resource-monitor-live-metrics";function l(e){let r=Number(e)||0;return .001>Math.abs(r-Math.round(r))?String(Math.round(r)):r.toFixed(1)}function c(e){let r=Number(e);return Number.isFinite(r)?Math.max(0,Math.min(100,r)):0}function u(e){let r=Number(e);return Number.isFinite(r)?r:null}function d(e){let r=u(e);return null===r?"—":`${r.toFixed(1)} tok/s`}function p(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;")}function m(e,r,t,o="primary"){let a=c(r);return`
2
+ <div class="resource-live-bar resource-live-bar-${o}">
3
3
  <div class="resource-live-bar-head">
4
- <span>${d(e)}</span>
5
- <strong>${d(t)}</strong>
4
+ <span>${p(e)}</span>
5
+ <strong>${p(t)}</strong>
6
6
  </div>
7
7
  <div class="resource-live-bar-track" aria-hidden="true">
8
- <span class="resource-live-bar-fill" style="width:${i.toFixed(1)}%"></span>
8
+ <span class="resource-live-bar-fill" style="width:${a.toFixed(1)}%"></span>
9
9
  </div>
10
10
  </div>
11
- `}function m(e){let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port??"?"}`,t=e.endpoint||"",a=Array.isArray(e.models)?e.models.filter(Boolean):[];if(!1===e.metricsAvailable)return`
11
+ `}function g(e){let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port??"?"}`,t=e.endpoint||"",o=Array.isArray(e.models)?e.models.filter(Boolean):[];if(!1===e.metricsAvailable)return`
12
12
  <div class="resource-vllm-instance resource-vllm-instance-muted">
13
- <div class="resource-vllm-instance-title">${d(r)}</div>
14
- <div class="resource-vllm-instance-sub">${t?`${d(t)} \xb7 `:""}chưa đọc được /metrics</div>
13
+ <div class="resource-vllm-instance-title">${p(r)}</div>
14
+ <div class="resource-vllm-instance-sub">${t?`${p(t)} \xb7 `:""}chưa đọc được /metrics</div>
15
15
  </div>
16
- `;let i=u(e.kvCacheUsagePercent),o=Object.prototype.hasOwnProperty.call(e||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(e||{},"waitingDeferred");return`
16
+ `;let a=u(e.kvCacheUsagePercent),n=d(e.outputTokensPerSecond);return`
17
17
  <div class="resource-vllm-instance">
18
18
  <div class="resource-vllm-instance-head">
19
- <span class="resource-vllm-instance-title">${d(r)}</span>
20
- ${a.length?`<span class="resource-vllm-model">${d(a.join(", "))}</span>`:""}
19
+ <span class="resource-vllm-instance-title">${p(r)}</span>
20
+ ${o.length?`<span class="resource-vllm-model">${p(o.join(", "))}</span>`:""}
21
21
  </div>
22
- ${t?`<div class="resource-vllm-instance-sub">${d(t)}</div>`:""}
23
- <div class="resource-vllm-instance-stats">
24
- <span>R <b>${d(l(e.running))}</b></span>
25
- <span>W <b>${d(l(e.waiting))}</b></span>
26
- ${o?`<span>Cap <b>${d(l(e.waitingCapacity))}</b></span><span>Def <b>${d(l(e.waitingDeferred))}</b></span>`:""}
27
- <span>KV <b>${null===i?"—":`${i.toFixed(1)}%`}</b></span>
28
- <span>Pre <b>${d(l(e.preemptions))}</b></span>
22
+ ${t?`<div class="resource-vllm-instance-sub">${p(t)}</div>`:""}
23
+ <div class="resource-vllm-instance-stats" title="Output l\xe0 throughput token sinh ra trung b\xecnh trượt theo tối đa 3 ph\xfat gần nhất">
24
+ <span>R <b>${p(l(e.running))}</b></span>
25
+ <span>W <b>${p(l(e.waiting))}</b></span>
26
+ <span>KV <b>${null===a?"—":`${a.toFixed(1)}%`}</b></span>
27
+ <span>Pre <b>${p(l(e.preemptions))}</b></span>
28
+ <span class="resource-vllm-throughput">⚡ Out <b>${p(n)}</b></span>
29
29
  </div>
30
30
  </div>
31
- `}function g(){document.getElementById(n)?.remove()}function v({children:e}){let r=(0,i.useRef)([]),t=(0,i.useRef)(new Map);return(0,i.useEffect)(()=>{let e=!1,a=null,i=null,v=()=>{let e=r.current;if(!e.length)return void g();let a=new Map(e.map(e=>[String(e.id),e])),i=Date.now();for(let e of document.querySelectorAll(o)){let r=String(e.dataset.resourceServerId||""),o=a.get(r),n=t.current.get(r),g=function(e,r=0){let t=e?.lastStatus;if(!t)return null;let a=t.vllm;if(!a)return{state:"upgrade",summary:"vLLM metrics \xb7 cần cập nhật agent",detail:"Agent hiện tại chưa c\xf3 vLLM monitor. Mở Sửa server v\xe0 c\xe0i lại agent một lần.",showReasons:!1,instances:[],count:0,metricsCount:0,discoveryLabel:"",pressureDetail:""};let i=Array.isArray(a.instances)?a.instances:[],o=a.summary||{},n=Number(o.instanceCount??i.length)||0,s=Number(o.metricsInstanceCount??n)||0,c=Number(o.running)||0,u=Number(o.waiting)||0,d=Number(o.waitingCapacity)||0,p=Number(o.waitingDeferred)||0,m=Object.prototype.hasOwnProperty.call(o||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(o||{},"waitingDeferred")||i.some(e=>Object.prototype.hasOwnProperty.call(e||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(e||{},"waitingDeferred")),g=Number(o.preemptions)||0,v=Number.isFinite(Number(o.kvCacheUsagePercent))?Number(o.kvCacheUsagePercent):null,b="docker"===a.discovery?"Docker-aware discovery":"Socket fallback discovery";if(!n)return{state:"none",summary:"vLLM \xb7 0 instance đang chạy",detail:"docker"===a.discovery?"Agent đ\xe3 kiểm tra Docker nhưng chưa ph\xe1t hiện container vLLM đang chạy.":"Agent chưa ph\xe1t hiện endpoint /metrics của vLLM tr\xean host.",showReasons:!1,instances:i,count:n,metricsCount:s,running:c,waiting:u,waitingCapacity:d,waitingDeferred:p,preemptions:g,kv:v,discoveryLabel:b,pressureDetail:"Kh\xf4ng c\xf3 queue pressure"};let x=i.map(e=>{let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port}`;if(!1===e.metricsAvailable)return`${r} \xb7 đang chạy nhưng chưa đọc được /metrics`;let t=Number.isFinite(Number(e.kvCacheUsagePercent))?`${Number(e.kvCacheUsagePercent).toFixed(1)}%`:"—",a=Array.isArray(e.models)&&e.models.length?` \xb7 ${e.models.join(", ")}`:"",i=e.endpoint?` \xb7 ${e.endpoint}`:"",o=Object.prototype.hasOwnProperty.call(e,"waitingCapacity")||Object.prototype.hasOwnProperty.call(e,"waitingDeferred")?` \xb7 Capacity ${l(e.waitingCapacity)} \xb7 Deferred ${l(e.waitingDeferred)}`:"";return`${r}${i} \xb7 Running ${l(e.running)} \xb7 Waiting ${l(e.waiting)}${o} \xb7 KV ${t} \xb7 Preempt ${l(e.preemptions)}${a}`}),h=s<n,f=d>0&&r>=8e3,w=d>0&&!f,y=h?"partial":f?"pressure":w?"transient":null!==v&&v>=90?"hot":"active",$=h?`${n} vLLM (${s} metrics)`:`${n} vLLM`,k=m&&u>0,M=k?`
32
- Capacity ${l(d)} \xb7 Deferred ${l(p)}`:"",C=f?`Capacity pressure li\xean tục ${Math.max(1,Math.round(r/1e3))}s`:w?"Capacity waiting mới xuất hiện; chưa coi l\xe0 overload":u>0?"Waiting hiện tại chưa tạo capacity pressure":"Kh\xf4ng c\xf3 queue pressure";return{state:y,summary:`${$} \xb7 Running ${l(c)} \xb7 Waiting ${l(u)}${M}
33
- KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7 ${n} instance`,C,...x].join("\n"),showReasons:k,instances:i,count:n,metricsCount:s,running:c,waiting:u,waitingCapacity:d,waitingDeferred:p,preemptions:g,kv:v,discoveryLabel:b,pressureDetail:C}}(o,n?Math.max(0,i-n):0);if(!o){e.querySelector(`.${s}`)?.remove(),delete e.dataset.vllmState,delete e.dataset.vllmReasons,delete e.dataset.resourceLiveSignature;continue}g?(e.dataset.vllmState=g.state,e.dataset.vllmReasons=g.showReasons?"1":"0"):(delete e.dataset.vllmState,delete e.dataset.vllmReasons),e.dataset.vllmBaseTitle||(e.dataset.vllmBaseTitle=e.title||"Linux host"),e.title=e.dataset.vllmBaseTitle,function(e,r,t){let a,i;if(!r?.lastStatus){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let o=`${function(e){if(!e)return"";if("upgrade"===e.state||"none"===e.state)return`
34
- <section class="resource-live-section resource-vllm-block" data-state="${d(e.state)}">
31
+ `}function v(){document.getElementById(i)?.remove()}function x({children:e}){let r=(0,a.useRef)([]),t=(0,a.useRef)(new Map);return(0,a.useEffect)(()=>{let e=!1,o=null,a=null,x=()=>{let e=r.current;if(!e.length)return void v();let o=new Map(e.map(e=>[String(e.id),e])),a=Date.now();for(let e of document.querySelectorAll(n)){let r=String(e.dataset.resourceServerId||""),n=o.get(r),i=t.current.get(r),v=function(e,r=0){let t=e?.lastStatus;if(!t)return null;let o=t.vllm;if(!o)return{state:"upgrade",summary:"vLLM metrics \xb7 cần cập nhật agent",detail:"Agent hiện tại chưa c\xf3 vLLM monitor. Mở Sửa server v\xe0 c\xe0i lại agent một lần.",showReasons:!1,instances:[],count:0,metricsCount:0,discoveryLabel:"",pressureDetail:"",outputTokensPerSecond:null};let a=Array.isArray(o.instances)?o.instances:[],n=o.summary||{},i=Number(n.instanceCount??a.length)||0,s=Number(n.metricsInstanceCount??i)||0,c=Number(n.running)||0,p=Number(n.waiting)||0,m=Number(n.waitingCapacity)||0,g=Number(n.waitingDeferred)||0,v=Object.prototype.hasOwnProperty.call(n||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(n||{},"waitingDeferred")||a.some(e=>Object.prototype.hasOwnProperty.call(e||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(e||{},"waitingDeferred")),x=Number(n.preemptions)||0,b=u(n.outputTokensPerSecond),h=Number.isFinite(Number(n.kvCacheUsagePercent))?Number(n.kvCacheUsagePercent):null,f="docker"===o.discovery?"Docker-aware discovery":"Socket fallback discovery";if(!i)return{state:"none",summary:"vLLM \xb7 0 instance đang chạy",detail:"docker"===o.discovery?"Agent đ\xe3 kiểm tra Docker nhưng chưa ph\xe1t hiện container vLLM đang chạy.":"Agent chưa ph\xe1t hiện endpoint /metrics của vLLM tr\xean host.",showReasons:!1,instances:a,count:i,metricsCount:s,running:c,waiting:p,waitingCapacity:m,waitingDeferred:g,preemptions:x,kv:h,outputTokensPerSecond:b,discoveryLabel:f,pressureDetail:"Kh\xf4ng c\xf3 queue pressure"};let w=a.map(e=>{let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port}`;if(!1===e.metricsAvailable)return`${r} \xb7 đang chạy nhưng chưa đọc được /metrics`;let t=Number.isFinite(Number(e.kvCacheUsagePercent))?`${Number(e.kvCacheUsagePercent).toFixed(1)}%`:"—",o=Array.isArray(e.models)&&e.models.length?` \xb7 ${e.models.join(", ")}`:"",a=e.endpoint?` \xb7 ${e.endpoint}`:"",n=Object.prototype.hasOwnProperty.call(e,"waitingCapacity")||Object.prototype.hasOwnProperty.call(e,"waitingDeferred")?` \xb7 Capacity ${l(e.waitingCapacity)} \xb7 Deferred ${l(e.waitingDeferred)}`:"";return`${r}${a} \xb7 Running ${l(e.running)} \xb7 Waiting ${l(e.waiting)}${n} \xb7 KV ${t} \xb7 Preempt ${l(e.preemptions)} \xb7 Output ${d(e.outputTokensPerSecond)}${o}`}),y=s<i,$=m>0&&r>=8e3,k=m>0&&!$,M=y?"partial":$?"pressure":k?"transient":null!==h&&h>=90?"hot":"active",S=y?`${i} vLLM (${s} metrics)`:`${i} vLLM`,L=v&&p>0,C=L?`
32
+ Capacity ${l(m)} \xb7 Deferred ${l(g)}`:"",P=$?`Capacity pressure li\xean tục ${Math.max(1,Math.round(r/1e3))}s`:k?"Capacity waiting mới xuất hiện; chưa coi l\xe0 overload":p>0?"Waiting hiện tại chưa tạo capacity pressure":"Kh\xf4ng c\xf3 queue pressure";return{state:M,summary:`${S} \xb7 Running ${l(c)} \xb7 Waiting ${l(p)}${C}
33
+ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}`,detail:[`${f} \xb7 ${i} instance`,P,...w].join("\n"),showReasons:L,instances:a,count:i,metricsCount:s,running:c,waiting:p,waitingCapacity:m,waitingDeferred:g,preemptions:x,kv:h,outputTokensPerSecond:b,discoveryLabel:f,pressureDetail:P}}(n,i?Math.max(0,a-i):0);if(!n){e.querySelector(`.${s}`)?.remove(),delete e.dataset.vllmState,delete e.dataset.vllmReasons,delete e.dataset.resourceLiveSignature;continue}v?(e.dataset.vllmState=v.state,e.dataset.vllmReasons=v.showReasons?"1":"0"):(delete e.dataset.vllmState,delete e.dataset.vllmReasons),e.dataset.vllmBaseTitle||(e.dataset.vllmBaseTitle=e.title||"Linux host"),e.title=e.dataset.vllmBaseTitle,function(e,r,t){let o,a;if(!r?.lastStatus){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let n=`${function(e){if(!e)return"";if("upgrade"===e.state||"none"===e.state)return`
34
+ <section class="resource-live-section resource-vllm-block" data-state="${p(e.state)}">
35
35
  <div class="resource-live-section-head">
36
36
  <span class="resource-live-section-title"><span class="resource-live-state-dot"></span>vLLM</span>
37
- <span class="resource-live-muted">${d(e.summary)}</span>
37
+ <span class="resource-live-muted">${p(e.summary)}</span>
38
38
  </div>
39
- <div class="resource-live-caption">${d(e.detail)}</div>
39
+ <div class="resource-live-caption">${p(e.detail)}</div>
40
40
  </section>
41
- `;let r=e.showReasons?`<span>Capacity <b>${d(l(e.waitingCapacity))}</b></span><span>Deferred <b>${d(l(e.waitingDeferred))}</b></span>`:"";return`
42
- <section class="resource-live-section resource-vllm-block" data-state="${d(e.state)}">
41
+ `;let r=e.showReasons?`<span>Capacity <b>${p(l(e.waitingCapacity))}</b></span><span>Deferred <b>${p(l(e.waitingDeferred))}</b></span>`:"";return`
42
+ <section class="resource-live-section resource-vllm-block" data-state="${p(e.state)}">
43
43
  <div class="resource-live-section-head">
44
44
  <span class="resource-live-section-title"><span class="resource-live-state-dot"></span>vLLM</span>
45
45
  <span class="resource-live-badge">${e.metricsCount<e.count?`${e.metricsCount}/${e.count} metrics`:`${e.count} instance`}</span>
46
46
  </div>
47
47
  <div class="resource-vllm-summary-grid">
48
- <span>Running <b>${d(l(e.running))}</b></span>
49
- <span>Waiting <b>${d(l(e.waiting))}</b></span>
48
+ <span>Running <b>${p(l(e.running))}</b></span>
49
+ <span>Waiting <b>${p(l(e.waiting))}</b></span>
50
50
  ${r}
51
- <span>Preempt <b>${d(l(e.preemptions))}</b></span>
51
+ <span>Preempt <b>${p(l(e.preemptions))}</b></span>
52
+ <span class="resource-vllm-throughput">⚡ Out <b>${p(d(e.outputTokensPerSecond))}</b></span>
52
53
  </div>
53
- ${null===e.kv?"":p("KV cache",e.kv,`${e.kv.toFixed(1)}%`,e.kv>=90?"warning":"emerald")}
54
- <div class="resource-live-caption">${d(e.discoveryLabel)} \xb7 ${d(e.pressureDetail)}</div>
55
- ${e.instances.length?`<div class="resource-vllm-instances">${e.instances.map(m).join("")}</div>`:""}
54
+ ${null===e.kv?"":m("KV cache",e.kv,`${e.kv.toFixed(1)}%`,e.kv>=90?"warning":"emerald")}
55
+ <div class="resource-live-caption">${p(e.discoveryLabel)} \xb7 ${p(e.pressureDetail)}</div>
56
+ ${e.instances.length?`<div class="resource-vllm-instances">${e.instances.map(g).join("")}</div>`:""}
56
57
  </section>
57
- `}(t)}${function(e){let r=Array.isArray(e?.lastStatus?.gpus)?e.lastStatus.gpus:[];if(!r.length)return"";let t=r.map(e=>{let r=c(e.usagePercent),t=c(e.memoryUsagePercent),a=u(e.powerDrawW),i=u(e.powerLimitW),o=null!==a&&i&&i>0?c(a/i*100):0,n=u(e.temperatureC),s=null===a?"—":i&&i>0?`${a.toFixed(+(a<10))} / ${i.toFixed(0)} W`:`${a.toFixed(+(a<10))} W`;return`
58
+ `}(t)}${function(e){let r=Array.isArray(e?.lastStatus?.gpus)?e.lastStatus.gpus:[];if(!r.length)return"";let t=r.map(e=>{let r=c(e.usagePercent),t=c(e.memoryUsagePercent),o=u(e.powerDrawW),a=u(e.powerLimitW),n=null!==o&&a&&a>0?c(o/a*100):0,i=u(e.temperatureC),s=null===o?"—":a&&a>0?`${o.toFixed(+(o<10))} / ${a.toFixed(0)} W`:`${o.toFixed(+(o<10))} W`;return`
58
59
  <div class="resource-gpu-row">
59
60
  <div class="resource-gpu-head">
60
- <span class="resource-gpu-name">GPU ${d(e.index??"?")}</span>
61
- <span class="resource-gpu-temp"><span class="material-symbols-outlined" aria-hidden="true">device_thermostat</span>${null===n?"—":`${n.toFixed(0)}\xb0C`}</span>
61
+ <span class="resource-gpu-name">GPU ${p(e.index??"?")}</span>
62
+ <span class="resource-gpu-temp"><span class="material-symbols-outlined" aria-hidden="true">device_thermostat</span>${null===i?"—":`${i.toFixed(0)}\xb0C`}</span>
62
63
  </div>
63
- ${p("GPU load",r,`${r.toFixed(+(r<10))}%`,r>=90?"warning":"emerald")}
64
- ${p("VRAM",t,`${t.toFixed(1)}%`,t>=95?"warning":"cyan")}
65
- ${i&&i>0?p("Power",o,s,o>=95?"warning":"violet"):`<div class="resource-live-value-row"><span>Power</span><strong>${d(s)}</strong></div>`}
64
+ ${m("GPU load",r,`${r.toFixed(+(r<10))}%`,r>=90?"warning":"emerald")}
65
+ ${m("VRAM",t,`${t.toFixed(1)}%`,t>=95?"warning":"cyan")}
66
+ ${a&&a>0?m("Power",n,s,n>=95?"warning":"violet"):`<div class="resource-live-value-row"><span>Power</span><strong>${p(s)}</strong></div>`}
66
67
  </div>
67
68
  `}).join("");return`
68
69
  <section class="resource-live-section resource-gpu-block">
@@ -72,7 +73,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
72
73
  </div>
73
74
  <div class="resource-gpu-list">${t}</div>
74
75
  </section>
75
- `}(r)}`;if(!o){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let n=(a=((r?.lastStatus||{}).gpus||[]).map(e=>[e.index,e.usagePercent,e.memoryUsagePercent,e.temperatureC,e.powerDrawW,e.powerLimitW]),i=(t?.instances||[]).map(e=>[e.containerName,e.containerId,e.endpoint,e.running,e.waiting,e.waitingCapacity,e.waitingDeferred,e.kvCacheUsagePercent,e.preemptions,e.metricsAvailable,e.models]),JSON.stringify([r?.lastStatusAt,t?.state,t?.running,t?.waiting,t?.waitingCapacity,t?.waitingDeferred,t?.preemptions,t?.kv,t?.pressureDetail,i,a]));if(e.dataset.resourceLiveSignature===n)return;let g=e.querySelector(`.${s}`);g||((g=document.createElement("div")).className=s,g.setAttribute("aria-label","Realtime vLLM v\xe0 GPU metrics"),e.appendChild(g)),g.innerHTML=o,e.dataset.resourceLiveSignature=n}(e,o,g)}!function(){let e=document.querySelector(o),r=e?.closest(".scroll-thin-x");if(!r)return g();let t=document.getElementById(n);if(t){t.previousElementSibling!==r&&r.insertAdjacentElement("afterend",t);return}let a=document.createElement("section");a.id=n,a.className="resource-vllm-metric-guide",a.setAttribute("aria-label","Giải th\xedch chỉ số vLLM"),a.innerHTML=`
76
+ `}(r)}`;if(!n){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let i=(o=((r?.lastStatus||{}).gpus||[]).map(e=>[e.index,e.usagePercent,e.memoryUsagePercent,e.temperatureC,e.powerDrawW,e.powerLimitW]),a=(t?.instances||[]).map(e=>[e.containerName,e.containerId,e.endpoint,e.running,e.waiting,e.waitingCapacity,e.waitingDeferred,e.kvCacheUsagePercent,e.preemptions,e.outputTokensPerSecond,e.metricsAvailable,e.models]),JSON.stringify([r?.lastStatusAt,t?.state,t?.running,t?.waiting,t?.waitingCapacity,t?.waitingDeferred,t?.preemptions,t?.kv,t?.outputTokensPerSecond,t?.pressureDetail,a,o]));if(e.dataset.resourceLiveSignature===i)return;let v=e.querySelector(`.${s}`);v||((v=document.createElement("div")).className=s,v.setAttribute("aria-label","Realtime vLLM v\xe0 GPU metrics"),e.appendChild(v)),v.innerHTML=n,e.dataset.resourceLiveSignature=i}(e,n,v)}!function(){let e=document.querySelector(n),r=e?.closest(".scroll-thin-x");if(!r)return v();let t=document.getElementById(i);if(t){t.previousElementSibling!==r&&r.insertAdjacentElement("afterend",t);return}let o=document.createElement("section");o.id=i,o.className="resource-vllm-metric-guide",o.setAttribute("aria-label","Giải th\xedch chỉ số vLLM"),o.innerHTML=`
76
77
  <div class="resource-vllm-guide-heading">
77
78
  <span class="material-symbols-outlined resource-vllm-guide-icon" aria-hidden="true">info</span>
78
79
  <div>
@@ -105,14 +106,18 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
105
106
  <strong>Preempt</strong>
106
107
  <span>Counter t\xedch lũy số lần request phải nhường t\xe0i nguy\xean; tốc độ tăng quan trọng hơn tổng số.</span>
107
108
  </div>
109
+ <div class="resource-vllm-guide-item">
110
+ <strong>⚡ Output</strong>
111
+ <span>Tổng output token/gi\xe2y theo rolling average tối đa 3 ph\xfat của từng instance; khi agent mới khởi động sẽ d\xf9ng khoảng dữ liệu đ\xe3 c\xf3.</span>
112
+ </div>
108
113
  </div>
109
114
  <div class="resource-vllm-guide-note">
110
115
  <span class="material-symbols-outlined" aria-hidden="true">monitoring</span>
111
- <span><strong>Đọc cảnh b\xe1o:</strong> Waiting tho\xe1ng qua vẫn b\xecnh thường. Dashboard chỉ coi <strong>Capacity &gt; 0 li\xean tục từ 8 gi\xe2y</strong> l\xe0 pressure; KV cao hoặc Preempt tăng li\xean tục cũng cần theo d\xf5i.</span>
116
+ <span><strong>Đọc cảnh b\xe1o:</strong> Waiting tho\xe1ng qua vẫn b\xecnh thường. Dashboard chỉ coi <strong>Capacity &gt; 0 li\xean tục từ 8 gi\xe2y</strong> l\xe0 pressure; KV cao hoặc Preempt tăng li\xean tục cũng cần theo d\xf5i. Output tok/s 3 ph\xfat d\xf9ng để đ\xe1nh gi\xe1 throughput ổn định khi tăng slot/concurrency.</span>
112
117
  </div>
113
- `,r.insertAdjacentElement("afterend",a)}()},b=async()=>{try{let a=await fetch("/api/resource-monitor?snapshot=1",{cache:"no-store"}),i=await a.json().catch(()=>({}));if(!a.ok||e)return;let o=Array.isArray(i.servers)?i.servers:[];r.current=o;let n=Date.now(),s=new Set;for(let e of o){let r=String(e?.id||"");r&&(s.add(r),(Number(e?.lastStatus?.vllm?.summary?.waitingCapacity)||0)>0?t.current.has(r)||t.current.set(r,n):t.current.delete(r))}for(let e of t.current.keys())s.has(e)||t.current.delete(e);v()}catch{}},x=new MutationObserver(()=>{i&&window.clearTimeout(i),i=window.setTimeout(v,80)});x.observe(document.body,{childList:!0,subtree:!0}),a=window.setInterval(b,4e3);let h=window.setTimeout(b,500);return()=>{e=!0,x.disconnect(),window.clearInterval(a),window.clearTimeout(h),i&&window.clearTimeout(i),g(),document.querySelectorAll(`.${s}`).forEach(e=>e.remove())}},[]),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:`
118
+ `,r.insertAdjacentElement("afterend",o)}()},b=async()=>{try{let o=await fetch("/api/resource-monitor?snapshot=1",{cache:"no-store"}),a=await o.json().catch(()=>({}));if(!o.ok||e)return;let n=Array.isArray(a.servers)?a.servers:[];r.current=n;let i=Date.now(),s=new Set;for(let e of n){let r=String(e?.id||"");r&&(s.add(r),(Number(e?.lastStatus?.vllm?.summary?.waitingCapacity)||0)>0?t.current.has(r)||t.current.set(r,i):t.current.delete(r))}for(let e of t.current.keys())s.has(e)||t.current.delete(e);x()}catch{}},h=new MutationObserver(()=>{a&&window.clearTimeout(a),a=window.setTimeout(x,80)});h.observe(document.body,{childList:!0,subtree:!0}),o=window.setInterval(b,4e3);let f=window.setTimeout(b,500);return()=>{e=!0,h.disconnect(),window.clearInterval(o),window.clearTimeout(f),a&&window.clearTimeout(a),v(),document.querySelectorAll(`.${s}`).forEach(e=>e.remove())}},[]),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("style",{children:`
114
119
  .resource-monitor-sortable-host {
115
- min-width: 332px !important;
120
+ min-width: 360px !important;
116
121
  overflow: hidden;
117
122
  }
118
123
  .resource-monitor-live-metrics {
@@ -130,7 +135,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
130
135
  border: 1px solid var(--color-border-subtle);
131
136
  border-radius: 12px;
132
137
  background: color-mix(in srgb, var(--color-surface-2) 62%, var(--color-surface));
133
- padding: 9px 10px;
138
+ padding: 10px 11px;
134
139
  }
135
140
  .resource-live-section-head {
136
141
  display: flex;
@@ -138,7 +143,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
138
143
  align-items: center;
139
144
  justify-content: space-between;
140
145
  gap: 8px;
141
- margin-bottom: 7px;
146
+ margin-bottom: 8px;
142
147
  }
143
148
  .resource-live-section-title {
144
149
  display: inline-flex;
@@ -146,13 +151,13 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
146
151
  align-items: center;
147
152
  gap: 6px;
148
153
  color: var(--color-text-main);
149
- font-size: 11px;
154
+ font-size: 12px;
150
155
  font-weight: 750;
151
156
  letter-spacing: .01em;
152
157
  }
153
158
  .resource-live-section-icon {
154
159
  color: #10b981;
155
- font-size: 15px;
160
+ font-size: 16px;
156
161
  }
157
162
  .resource-live-state-dot {
158
163
  width: 7px;
@@ -183,26 +188,26 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
183
188
  background: var(--color-surface);
184
189
  padding: 2px 7px;
185
190
  color: var(--color-text-muted);
186
- font-size: 9.5px;
191
+ font-size: 10.5px;
187
192
  font-weight: 700;
188
193
  }
189
194
  .resource-live-muted {
190
195
  min-width: 0;
191
196
  overflow: hidden;
192
197
  color: var(--color-text-subtle);
193
- font-size: 9.5px;
198
+ font-size: 10.5px;
194
199
  text-overflow: ellipsis;
195
200
  white-space: nowrap;
196
201
  }
197
202
  .resource-vllm-summary-grid {
198
203
  display: flex;
199
204
  flex-wrap: wrap;
200
- gap: 4px 7px;
201
- margin-bottom: 7px;
205
+ gap: 5px 8px;
206
+ margin-bottom: 8px;
202
207
  color: var(--color-text-muted);
203
208
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
204
- font-size: 9.5px;
205
- line-height: 1.35;
209
+ font-size: 10.5px;
210
+ line-height: 1.4;
206
211
  }
207
212
  .resource-vllm-summary-grid span {
208
213
  white-space: nowrap;
@@ -211,21 +216,32 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
211
216
  color: var(--color-text-main);
212
217
  font-weight: 750;
213
218
  }
219
+ .resource-vllm-throughput {
220
+ color: #7c3aed;
221
+ font-weight: 700;
222
+ }
223
+ .resource-vllm-throughput b {
224
+ color: #6d28d9 !important;
225
+ }
226
+ .dark .resource-vllm-throughput,
227
+ .dark .resource-vllm-throughput b {
228
+ color: #c4b5fd !important;
229
+ }
214
230
  .resource-live-caption {
215
- margin-top: 6px;
231
+ margin-top: 7px;
216
232
  color: var(--color-text-subtle);
217
- font-size: 9px;
218
- line-height: 1.35;
233
+ font-size: 10px;
234
+ line-height: 1.4;
219
235
  }
220
236
  .resource-vllm-instances {
221
237
  display: grid;
222
- gap: 5px;
223
- margin-top: 7px;
238
+ gap: 6px;
239
+ margin-top: 8px;
224
240
  }
225
241
  .resource-vllm-instance {
226
242
  min-width: 0;
227
243
  border-top: 1px dashed var(--color-border-subtle);
228
- padding-top: 6px;
244
+ padding-top: 7px;
229
245
  }
230
246
  .resource-vllm-instance:first-child {
231
247
  border-top: 0;
@@ -243,7 +259,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
243
259
  overflow: hidden;
244
260
  color: var(--color-text-main);
245
261
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
246
- font-size: 9.5px;
262
+ font-size: 10.5px;
247
263
  font-weight: 700;
248
264
  text-overflow: ellipsis;
249
265
  white-space: nowrap;
@@ -255,28 +271,36 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
255
271
  background: color-mix(in srgb, var(--color-brand-500) 8%, transparent);
256
272
  padding: 2px 6px;
257
273
  color: var(--color-primary);
258
- font-size: 8.5px;
274
+ font-size: 9.5px;
259
275
  font-weight: 650;
260
276
  text-overflow: ellipsis;
261
277
  white-space: nowrap;
262
278
  }
263
279
  .resource-vllm-instance-sub {
264
- margin-top: 2px;
280
+ margin-top: 3px;
265
281
  overflow: hidden;
266
282
  color: var(--color-text-subtle);
267
283
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
268
- font-size: 8.5px;
284
+ font-size: 9.5px;
269
285
  text-overflow: ellipsis;
270
286
  white-space: nowrap;
271
287
  }
272
288
  .resource-vllm-instance-stats {
273
289
  display: flex;
274
- flex-wrap: wrap;
275
- gap: 3px 7px;
276
- margin-top: 4px;
290
+ min-width: 0;
291
+ flex-wrap: nowrap;
292
+ align-items: center;
293
+ justify-content: space-between;
294
+ gap: 5px;
295
+ margin-top: 5px;
296
+ overflow: hidden;
277
297
  color: var(--color-text-muted);
278
298
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
279
- font-size: 8.8px;
299
+ font-size: 9.5px;
300
+ white-space: nowrap;
301
+ }
302
+ .resource-vllm-instance-stats span {
303
+ flex: 0 0 auto;
280
304
  }
281
305
  .resource-vllm-instance-stats b {
282
306
  color: var(--color-text-main);
@@ -286,7 +310,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
286
310
  color: var(--color-text-subtle);
287
311
  }
288
312
  .resource-live-bar + .resource-live-bar {
289
- margin-top: 6px;
313
+ margin-top: 7px;
290
314
  }
291
315
  .resource-live-bar-head,
292
316
  .resource-live-value-row {
@@ -294,10 +318,10 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
294
318
  align-items: center;
295
319
  justify-content: space-between;
296
320
  gap: 8px;
297
- margin-bottom: 3px;
321
+ margin-bottom: 4px;
298
322
  color: var(--color-text-muted);
299
- font-size: 9px;
300
- line-height: 1.2;
323
+ font-size: 10px;
324
+ line-height: 1.25;
301
325
  }
302
326
  .resource-live-bar-head strong,
303
327
  .resource-live-value-row strong {
@@ -326,25 +350,25 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
326
350
  .resource-live-bar-warning { --resource-bar-color: #f59e0b; }
327
351
  .resource-gpu-list {
328
352
  display: grid;
329
- gap: 8px;
353
+ gap: 9px;
330
354
  }
331
355
  .resource-gpu-row {
332
356
  min-width: 0;
333
357
  }
334
358
  .resource-gpu-row + .resource-gpu-row {
335
359
  border-top: 1px dashed var(--color-border-subtle);
336
- padding-top: 8px;
360
+ padding-top: 9px;
337
361
  }
338
362
  .resource-gpu-head {
339
363
  display: flex;
340
364
  align-items: center;
341
365
  justify-content: space-between;
342
366
  gap: 8px;
343
- margin-bottom: 6px;
367
+ margin-bottom: 7px;
344
368
  }
345
369
  .resource-gpu-name {
346
370
  color: var(--color-text-main);
347
- font-size: 9.5px;
371
+ font-size: 10.5px;
348
372
  font-weight: 750;
349
373
  }
350
374
  .resource-gpu-temp {
@@ -355,11 +379,11 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
355
379
  background: color-mix(in srgb, #f59e0b 8%, transparent);
356
380
  padding: 2px 6px;
357
381
  color: #b45309;
358
- font-size: 9px;
382
+ font-size: 10px;
359
383
  font-weight: 700;
360
384
  }
361
385
  .resource-gpu-temp .material-symbols-outlined {
362
- font-size: 12px;
386
+ font-size: 13px;
363
387
  }
364
388
  .resource-vllm-metric-guide {
365
389
  margin-top: 10px;
@@ -400,7 +424,7 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
400
424
  }
401
425
  .resource-vllm-guide-grid {
402
426
  display: grid;
403
- grid-template-columns: repeat(6, minmax(0, 1fr));
427
+ grid-template-columns: repeat(7, minmax(0, 1fr));
404
428
  gap: 8px;
405
429
  margin-top: 12px;
406
430
  }
@@ -454,12 +478,12 @@ KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7
454
478
  }
455
479
  @media (max-width: 1400px) {
456
480
  .resource-vllm-guide-grid {
457
- grid-template-columns: repeat(3, minmax(0, 1fr));
481
+ grid-template-columns: repeat(4, minmax(0, 1fr));
458
482
  }
459
483
  }
460
484
  @media (max-width: 760px) {
461
485
  .resource-monitor-sortable-host {
462
- min-width: min(332px, calc(100vw - 48px)) !important;
486
+ min-width: min(340px, calc(100vw - 48px)) !important;
463
487
  }
464
488
  .resource-vllm-guide-grid {
465
489
  grid-template-columns: repeat(2, minmax(0, 1fr));
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "5.3.14",
3
+ "version": "5.3.16",
4
4
  "description": "Router web dashboard",
5
5
  "private": false,
6
6
  "scripts": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jheavenknows/bluerouter",
3
- "version": "5.3.14",
3
+ "version": "5.3.16",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"