@jheavenknows/bluerouter 5.3.27 → 5.3.28

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 (550) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +23 -23
  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 +49 -49
  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/routing-topology/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  47. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  48. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  49. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  50. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  51. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  56. package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
  57. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
  58. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  59. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +6 -6
  60. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  61. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  62. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  63. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  124. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  126. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  160. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  163. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  181. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  218. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  220. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  222. package/app/.next-cli-build/server/app/callback.html +1 -1
  223. package/app/.next-cli-build/server/app/callback.rsc +6 -6
  224. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
  225. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  226. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +6 -6
  227. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  228. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  229. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  230. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  231. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +8 -8
  232. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +1 -1
  233. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index.segment.rsc +1 -1
  234. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  235. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  236. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +8 -8
  237. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_head.segment.rsc +1 -1
  238. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_index.segment.rsc +6 -6
  239. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +3 -3
  240. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  241. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +8 -8
  242. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
  243. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  244. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  246. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +8 -8
  247. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  248. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +6 -6
  249. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +3 -3
  250. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  251. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +11 -11
  252. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +4 -4
  253. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  254. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  256. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +11 -11
  257. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  258. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +6 -6
  259. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +3 -3
  260. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +9 -9
  262. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  263. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  264. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  266. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +9 -9
  267. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  268. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +6 -6
  269. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +3 -3
  270. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +9 -9
  272. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +2 -2
  273. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles.segment.rsc +1 -1
  274. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  277. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +9 -9
  278. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_head.segment.rsc +1 -1
  279. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_index.segment.rsc +6 -6
  280. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +3 -3
  281. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  282. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +9 -9
  283. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  284. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  287. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +9 -9
  288. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  289. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +6 -6
  290. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +3 -3
  291. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  292. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +8 -8
  293. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +1 -1
  294. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  297. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +8 -8
  298. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_head.segment.rsc +1 -1
  299. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_index.segment.rsc +6 -6
  300. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +3 -3
  301. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  302. package/app/.next-cli-build/server/app/dashboard/combos.rsc +9 -9
  303. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  304. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  307. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +9 -9
  308. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  309. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +6 -6
  310. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +3 -3
  311. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  312. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +9 -9
  313. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  314. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  317. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +9 -9
  318. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +6 -6
  320. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +3 -3
  321. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  322. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +8 -8
  323. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +1 -1
  324. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report.segment.rsc +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  327. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +8 -8
  328. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_head.segment.rsc +1 -1
  329. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_index.segment.rsc +6 -6
  330. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +3 -3
  331. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  332. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +9 -9
  333. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  334. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  338. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +9 -9
  339. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +6 -6
  341. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +3 -3
  342. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  343. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +9 -9
  344. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  345. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  347. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  348. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +9 -9
  349. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +6 -6
  351. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +3 -3
  352. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  353. package/app/.next-cli-build/server/app/dashboard/profile.rsc +9 -9
  354. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  355. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  357. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  358. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +9 -9
  359. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +6 -6
  361. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +3 -3
  362. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  363. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +8 -8
  364. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  367. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  368. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +8 -8
  369. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +6 -6
  371. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +3 -3
  372. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  373. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +8 -8
  374. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  377. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  378. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +8 -8
  379. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +6 -6
  381. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +3 -3
  382. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  383. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +9 -9
  384. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  385. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  386. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  387. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  388. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  389. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +9 -9
  390. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  391. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +6 -6
  392. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +3 -3
  393. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  394. package/app/.next-cli-build/server/app/dashboard/providers.rsc +9 -9
  395. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  396. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  397. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  398. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  399. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +9 -9
  400. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +6 -6
  402. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +3 -3
  403. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  404. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +9 -9
  405. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  406. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  407. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  408. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  409. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +9 -9
  410. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  411. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +6 -6
  412. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +3 -3
  413. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  414. package/app/.next-cli-build/server/app/dashboard/quota.rsc +10 -10
  415. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  416. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  417. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  418. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  419. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +10 -10
  420. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  421. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +6 -6
  422. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +3 -3
  423. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  424. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +10 -10
  425. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +2 -2
  426. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor.segment.rsc +2 -2
  427. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  428. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  429. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +10 -10
  430. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_head.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_index.segment.rsc +6 -6
  432. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +3 -3
  433. package/app/.next-cli-build/server/app/dashboard/routing-topology.html +1 -1
  434. package/app/.next-cli-build/server/app/dashboard/routing-topology.rsc +8 -8
  435. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology/__PAGE__.segment.rsc +1 -1
  436. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology.segment.rsc +1 -1
  437. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  438. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  439. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_full.segment.rsc +8 -8
  440. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_head.segment.rsc +1 -1
  441. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_index.segment.rsc +6 -6
  442. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_tree.segment.rsc +3 -3
  443. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  444. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +8 -8
  445. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  446. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
  447. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  448. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  449. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  450. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +8 -8
  451. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  452. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +6 -6
  453. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +3 -3
  454. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  455. package/app/.next-cli-build/server/app/dashboard/skills.rsc +9 -9
  456. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  457. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  458. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  459. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  460. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +9 -9
  461. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  462. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +6 -6
  463. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +3 -3
  464. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  465. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +8 -8
  466. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +1 -1
  467. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  468. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  469. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  470. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +8 -8
  471. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  472. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +6 -6
  473. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +3 -3
  474. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  475. package/app/.next-cli-build/server/app/dashboard/translator.rsc +9 -9
  476. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  477. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  478. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  479. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  480. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +9 -9
  481. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  482. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +6 -6
  483. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +3 -3
  484. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  485. package/app/.next-cli-build/server/app/dashboard/usage.rsc +9 -9
  486. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  487. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  488. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  489. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  490. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +9 -9
  491. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  492. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +6 -6
  493. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +3 -3
  494. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  495. package/app/.next-cli-build/server/app/dashboard.rsc +9 -9
  496. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  497. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  498. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  499. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +9 -9
  500. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  501. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +6 -6
  502. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +3 -3
  503. package/app/.next-cli-build/server/app/index.html +1 -1
  504. package/app/.next-cli-build/server/app/index.rsc +6 -6
  505. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  506. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
  507. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  508. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +6 -6
  509. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  510. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  511. package/app/.next-cli-build/server/app/landing.html +1 -1
  512. package/app/.next-cli-build/server/app/landing.rsc +6 -6
  513. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
  514. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  515. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +6 -6
  516. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  517. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  518. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  519. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  520. package/app/.next-cli-build/server/app/login.html +1 -1
  521. package/app/.next-cli-build/server/app/login.rsc +7 -7
  522. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
  523. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  524. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +6 -6
  525. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  526. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  527. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  528. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  529. package/app/.next-cli-build/server/app-paths-manifest.json +23 -23
  530. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  531. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  532. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  533. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  534. package/app/.next-cli-build/server/chunks/7639.js +1 -1
  535. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  536. package/app/.next-cli-build/server/pages/404.html +1 -1
  537. package/app/.next-cli-build/server/pages/500.html +1 -1
  538. package/app/.next-cli-build/static/chunks/{5263-9747c56f713b116a.js → 5263-49b0b85668a7316a.js} +1 -1
  539. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/{page-51e7c0ded4453f6f.js → page-d75f2e5c5698c084.js} +1 -1
  540. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/{template-ad7c5f7bdb0dfe45.js → template-d6c81c3c190cb2f9.js} +48 -48
  541. package/app/.next-cli-build/static/css/e4ad73a263b53984.css +1 -0
  542. package/app/.next-cli-build/static/css/{639d4a48b2d6e62f.css → e8800f71ff503308.css} +1 -1
  543. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  544. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  545. package/app/package.json +1 -1
  546. package/package.json +1 -1
  547. package/app/.next-cli-build/static/css/bed5b5f55f67bdb5.css +0 -1
  548. /package/app/.next-cli-build/static/{l6yKjnNavsdcaWaXkgVRO → -mJSBIx8qaWS9UDtYL5UR}/_buildManifest.js +0 -0
  549. /package/app/.next-cli-build/static/{l6yKjnNavsdcaWaXkgVRO → -mJSBIx8qaWS9UDtYL5UR}/_ssgManifest.js +0 -0
  550. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.2.77-to-5.2.78-5.2.78-20260814-161855 → upgrade-5.3.22-to-5.3.27-5.3.27-20260819-113252}/data.sqlite +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1205],{86243:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>H});var a=s(95155),r=s(12115),l=s(1728),n=s(90639),i=s(28408),o=s(32539),d=s(59656),c=s(65671),x=s(34122),m=s(16746),u=s(96647),h=s(29010),p=s(56061),g=s(92542),b=s(11910),f=s(81127),j=s(98);let v={name:"",host:"",sshPort:"22",sshUser:"",sshPassword:"",useSudo:!0,sudoPassword:"",agentPort:"19998",installAgent:!0};function y(e){return{name:e?.name||"",host:e?.host||"",sshPort:String(e?.sshPort||22),sshUser:e?.sshUser||"",sshPassword:"",useSudo:e?.useSudo!==!1,sudoPassword:"",agentPort:String(e?.agentPort||19998),installAgent:!0}}function N(e){var t;let s;return!!e?.lastStatus&&(!e.lastError||Date.now()-(Number.isFinite(s=(t=e?.lastStatusAt)?new Date(t).getTime():0)?s:0)<=3e4)}function w(e){return Math.max(0,Math.min(100,Number(e)||0))}function k(e,t=1){let s=Number(e)||0;if(!s)return"0 B";let a=["B","KB","MB","GB","TB","PB"],r=Math.min(a.length-1,Math.floor(Math.log(s)/Math.log(1024)));return`${(s/1024**r).toFixed(r>2?t:0)} ${a[r]}`}function S(e){return e?new Date(e).toLocaleTimeString("vi-VN",{hour12:!1}):"--:--:--"}function P({value:e,label:t,detail:s,color:r="var(--color-brand-500)",icon:l}){let n=w(e),i=2*Math.PI*49;return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col items-center",children:[(0,a.jsxs)("div",{className:"relative h-36 w-36",children:[(0,a.jsxs)("svg",{className:"h-full w-full -rotate-90",viewBox:"0 0 120 120","aria-hidden":"true",children:[(0,a.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:"var(--color-surface-2)",strokeWidth:"8"}),(0,a.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:r,strokeWidth:"8",strokeLinecap:"round",strokeDasharray:i,strokeDashoffset:i*(1-n/100),className:"transition-all duration-700"})]}),(0,a.jsxs)("div",{className:"absolute inset-0 flex flex-col items-center justify-center text-center",children:[l?(0,a.jsx)("span",{className:"material-symbols-outlined mb-0.5 text-[19px] text-text-muted",children:l}):null,(0,a.jsxs)("strong",{className:"text-2xl font-semibold tracking-tight text-text-main",children:[n.toFixed(+(n<10)),"%"]}),(0,a.jsx)("span",{className:"mt-0.5 text-xs font-medium text-text-muted",children:t})]})]}),(0,a.jsx)("div",{className:"mt-2 max-w-full truncate text-center text-xs text-text-subtle",title:s,children:s})]})}function C({online:e}){return(0,a.jsx)("span",{className:`h-2.5 w-2.5 shrink-0 rounded-full ${e?"bg-emerald-500 shadow-[0_0_0_4px_rgba(16,185,129,.12)]":"bg-red-400 shadow-[0_0_0_4px_rgba(248,113,113,.12)]"}`})}function $({servers:e,selectedId:t,onSelect:s}){return(0,a.jsx)("div",{className:"flex gap-3 overflow-x-auto pb-1 scroll-thin-x",children:e.map(e=>{let r=e.id===t,l=N(e);return(0,a.jsxs)("button",{type:"button",onClick:()=>s(e.id),className:`min-w-[280px] rounded-2xl border p-5 text-left transition ${r?"border-primary bg-primary/5 shadow-[var(--shadow-warm)]":"border-border bg-surface hover:border-primary/40"}`,children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(C,{online:l}),(0,a.jsx)("div",{className:"truncate text-base font-semibold text-text-main",children:e.name})]}),(0,a.jsxs)("div",{className:"mt-1.5 truncate font-mono text-sm text-text-muted",children:[e.host,":",e.agentPort]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px] text-text-subtle",children:"dns"})]}),(0,a.jsxs)("div",{className:"mt-3 flex items-center justify-between text-sm text-text-muted",children:[(0,a.jsx)("span",{children:l?"Đang hoạt động":"Mất kết nối"}),(0,a.jsx)("span",{children:S(e.lastStatusAt)})]})]},e.id)})})}function U({icon:e,label:t,value:s,sublabel:r,colorClass:l="text-primary",children:n}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl bg-surface-2 ${l}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:e})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"text-xs font-medium uppercase tracking-wider text-text-muted",children:t}),(0,a.jsx)("div",{className:"mt-0.5 truncate text-lg font-semibold text-text-main",children:s})]})]}),r?(0,a.jsx)("div",{className:"mt-3 truncate text-xs text-text-subtle",children:r}):null,n]})}function M({data:e,dataKey:t,label:s,color:r,unit:m="%"}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:s}),(0,a.jsx)("span",{className:"text-xs text-text-muted",children:"60 mẫu gần nhất"})]}),(0,a.jsx)("div",{className:"h-44",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(n.Q,{data:e,margin:{top:6,right:4,left:-22,bottom:0},children:[(0,a.jsx)("defs",{children:(0,a.jsxs)("linearGradient",{id:`fill-${t}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:r,stopOpacity:.3}),(0,a.jsx)("stop",{offset:"100%",stopColor:r,stopOpacity:.02})]})}),(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",hide:!0}),(0,a.jsx)(d.h,{domain:[0,"auto"],tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},formatter:e=>[`${Number(e).toFixed(1)}${m}`,s]}),(0,a.jsx)(x.Gk,{type:"monotone",dataKey:t,stroke:r,fill:`url(#fill-${t})`,strokeWidth:2.2,dot:!1,isAnimationActive:!1})]})})})]})}let T=["#10b981","#06b6d4","#8b5cf6","#f59e0b","#ef4444","#3b82f6","#ec4899","#84cc16"];function A(e){return e?.uuid||`index-${e?.index??0}`}function I({data:e,gpus:t}){let s=(t||[]).map((e,t)=>({id:A(e),dataKey:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:T[t%T.length]})),r=e.map(e=>{let t={time:e.time};return s.forEach(s=>{let a=e.gpus?.find(e=>e.id===s.id);t[s.dataKey]=a?.usagePercent??null}),t});return(0,a.jsxs)("div",{className:"mb-5 rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4 flex flex-wrap items-start justify-between gap-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:"GPU usage history"}),(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Mỗi đường biểu diễn mức tải realtime của một NVIDIA GPU."})]}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-medium text-emerald-600 dark:text-emerald-400",children:"60 mẫu gần nhất"})]}),(0,a.jsx)("div",{className:"h-64",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(m.b,{data:r,margin:{top:8,right:12,left:-16,bottom:2},children:[(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",tickFormatter:S,minTickGap:36,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(d.h,{domain:[0,100],ticks:[0,25,50,75,100],tickFormatter:e=>`${e}%`,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>`Thời gian ${S(e)}`,formatter:(e,t)=>[`${Number(e).toFixed(1)}%`,t]}),(0,a.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,a.jsx)("span",{className:"text-text-muted",children:e})}),s.map(e=>(0,a.jsx)(h.N1,{type:"monotone",dataKey:e.dataKey,name:e.name,stroke:e.color,strokeWidth:2.4,dot:!1,connectNulls:!1,isAnimationActive:!1},e.id))]})})})]})}let D=[{value:"1h",label:"1 giờ"},{value:"6h",label:"6 giờ"},{value:"24h",label:"24 giờ"},{value:"7d",label:"7 ng\xe0y"},{value:"30d",label:"30 ng\xe0y"}];function _(e){return e?new Date(e).toLocaleString("vi-VN",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}):"—"}function L({title:e,description:t,data:s,series:r,domain:n=[0,100],valueFormatter:x=e=>`${Number(e).toFixed(1)}%`,axisFormatter:p=e=>`${e}%`}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:e}),t?(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:t}):null]}),(0,a.jsx)("div",{className:"h-64",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(m.b,{data:s,margin:{top:8,right:12,left:-8,bottom:2},children:[(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",tickFormatter:_,minTickGap:48,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,a.jsx)(d.h,{domain:n,tickFormatter:p,width:58,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>_(e),formatter:(e,t)=>[x(e),t]}),(0,a.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,a.jsx)("span",{className:"text-text-muted",children:e})}),r.map(e=>(0,a.jsx)(h.N1,{type:"monotone",dataKey:e.key,name:e.name,stroke:e.color,strokeWidth:2.2,dot:!1,connectNulls:!1,isAnimationActive:!1},e.key))]})})})]})}function K({server:e,data:t,meta:s,period:l,onPeriodChange:n,loading:i,error:o}){let d=(0,r.useMemo)(()=>{let e=new Map;return t.forEach(t=>{(t.gpus||[]).forEach(t=>{e.has(t.id)||e.set(t.id,t)})}),[...e.values()].map((e,t)=>({id:e.id,key:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:T[t%T.length]}))},[t]),c=(0,r.useCallback)(e=>t.map(t=>{let s={time:t.time};return d.forEach(a=>{let r=t.gpus?.find(e=>e.id===a.id);s[a.key]=r?.[e]??null}),s}),[t,d]);return(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"monitoring"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("h3",{className:"truncate text-lg font-semibold text-text-main",children:["Lịch sử \xb7 ",e.name]}),(0,a.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Sample mỗi ph\xfat \xb7 lưu tối đa ",s?.retentionDays||30," ng\xe0y"]})]})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1 rounded-xl bg-surface-2 p-1",children:D.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>n(e.value),className:`rounded-lg px-3 py-2 text-xs font-semibold transition ${l===e.value?"bg-surface text-primary shadow-sm":"text-text-muted hover:text-text-main"}`,children:e.label},e.value))})]}),i?(0,a.jsxs)("div",{className:"flex min-h-[420px] items-center justify-center text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải dữ liệu lịch sử..."]}):o?(0,a.jsx)("div",{className:"m-6 rounded-2xl border border-red-500/20 bg-red-500/10 p-5 text-sm text-red-600 dark:text-red-300",children:o}):t.length?(0,a.jsxs)("div",{className:"space-y-5 p-6",children:[(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-3",children:[(0,a.jsx)(U,{icon:"database",label:"Số điểm hiển thị",value:t.length.toLocaleString("vi-VN"),sublabel:`Bucket ${s?.bucketMinutes||1} ph\xfat`,colorClass:"text-violet-500"}),(0,a.jsx)(U,{icon:"date_range",label:"Từ thời điểm",value:_(t[0]?.time),sublabel:"Điểm đầu ti\xean trong khoảng đ\xe3 chọn",colorClass:"text-cyan-500"}),(0,a.jsx)(U,{icon:"memory",label:"NVIDIA GPU",value:`${d.length} card`,sublabel:"Theo d\xf5i ri\xeang bằng GPU UUID",colorClass:"text-emerald-500"})]}),(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(L,{title:"CPU, RAM & Disk usage",description:"Tỷ lệ sử dụng t\xe0i nguy\xean hệ thống theo thời gian.",data:t,series:[{key:"cpu",name:"CPU",color:"#3b9dec"},{key:"memory",name:"RAM",color:"#8b5cf6"},{key:"disk",name:"Disk",color:"#f59e0b"}]}),(0,a.jsx)(L,{title:"Network throughput",description:"Tốc độ nhận v\xe0 gửi trung b\xecnh trong mỗi bucket.",data:t,domain:[0,"auto"],series:[{key:"networkRxBps",name:"Download",color:"#06b6d4"},{key:"networkTxBps",name:"Upload",color:"#ec4899"}],valueFormatter:e=>`${k(e)}/s`,axisFormatter:e=>k(e)})]}),d.length?(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(L,{title:"NVIDIA GPU usage",description:"Mức tải của từng GPU, ph\xe2n biệt theo UUID.",data:c("usagePercent"),series:d}),(0,a.jsx)(L,{title:"GPU VRAM usage",description:"Phần trăm VRAM đ\xe3 sử dụng tr\xean từng card.",data:c("memoryUsagePercent"),series:d}),(0,a.jsx)(L,{title:"GPU temperature",description:"Nhiệt độ trung b\xecnh của từng card trong mỗi bucket.",data:c("temperatureC"),domain:[0,"auto"],series:d,valueFormatter:e=>`${Number(e).toFixed(1)}\xb0C`,axisFormatter:e=>`${e}\xb0`}),(0,a.jsx)(L,{title:"GPU power draw",description:"C\xf4ng suất ti\xeau thụ trung b\xecnh của từng card.",data:c("powerDrawW"),domain:[0,"auto"],series:d,valueFormatter:e=>`${Number(e).toFixed(1)} W`,axisFormatter:e=>`${e}W`})]}):null]}):(0,a.jsxs)("div",{className:"flex min-h-[420px] flex-col items-center justify-center px-6 text-center",children:[(0,a.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[34px]",children:"hourglass_empty"})}),(0,a.jsx)("h4",{className:"mt-5 font-semibold text-text-main",children:"Chưa c\xf3 dữ liệu lịch sử"}),(0,a.jsx)("p",{className:"mt-2 max-w-md text-sm leading-6 text-text-muted",children:"Collector đ\xe3 được bật v\xe0 sẽ ghi mẫu đầu ti\xean trong v\xf2ng một ph\xfat. Dữ liệu vẫn tiếp tục được thu thập khi kh\xf4ng mở dashboard."})]})]})}function E({gpu:e}){let t=w(e.memoryUsagePercent);return(0,a.jsxs)("div",{className:"overflow-hidden rounded-2xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle bg-gradient-to-r from-emerald-500/8 to-cyan-500/5 px-5 py-4",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"memory"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"truncate font-semibold text-text-main",children:["GPU ",e.index," \xb7 ",e.name]}),(0,a.jsxs)("div",{className:"mt-0.5 text-xs text-text-muted",children:["NVIDIA Driver ",e.driverVersion||"—"]})]})]}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-semibold text-emerald-600 dark:text-emerald-400",children:"NVIDIA"})]}),(0,a.jsxs)("div",{className:"grid gap-5 p-5 sm:grid-cols-[150px_1fr]",children:[(0,a.jsx)(P,{value:e.usagePercent,label:"GPU Load",detail:`${e.temperatureC??"—"}\xb0C`,color:"#10b981"}),(0,a.jsxs)("div",{className:"space-y-5",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-2 flex items-center justify-between text-sm",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"VRAM"}),(0,a.jsxs)("span",{className:"font-semibold text-text-main",children:[k(1048576*(e.memoryUsedMb||0))," /"," ",k(1048576*(e.memoryTotalMb||0))]})]}),(0,a.jsx)("div",{className:"h-2.5 overflow-hidden rounded-full bg-surface-2",children:(0,a.jsx)("div",{className:"h-full rounded-full bg-emerald-500 transition-all duration-700",style:{width:`${t}%`}})}),(0,a.jsxs)("div",{className:"mt-1.5 text-right text-xs text-text-subtle",children:[t.toFixed(1),"% đ\xe3 d\xf9ng"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"Nhiệt độ"}),(0,a.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.temperatureC??"—","\xb0C"]})]}),(0,a.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"C\xf4ng suất"}),(0,a.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.powerDrawW??"—",(0,a.jsxs)("span",{className:"text-xs font-normal text-text-muted",children:[" ","/ ",e.powerLimitW??"—"," W"]})]})]})]})]})]})]})}function F({open:e,onClose:t,onCreated:s}){let[l,n]=(0,r.useState)(v),[i,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(""),x=(e,t)=>n(s=>({...s,[e]:t}));(0,r.useEffect)(()=>{e&&(n(v),c(""))},[e]);let m=async e=>{e.preventDefault(),o(!0),c("");try{let e=await fetch("/api/resource-monitor",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể th\xeam server");await s(a.server,a.install),t()}catch(e){c(e?.message||"Kh\xf4ng thể th\xeam server")}finally{o(!1)}};return(0,a.jsx)(f.default,{isOpen:e,onClose:t,title:"Th\xeam Linux server",size:"xl",busy:i,footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g.default,{variant:"ghost",onClick:t,disabled:i,children:"Hủy"}),(0,a.jsx)(g.default,{onClick:m,loading:i,icon:"rocket_launch",children:"C\xe0i agent & th\xeam server"})]}),children:(0,a.jsxs)("form",{onSubmit:m,className:"space-y-5",children:[(0,a.jsx)("div",{className:"rounded-xl border border-primary/20 bg-primary/5 p-4 text-sm text-text-muted",children:(0,a.jsxs)("div",{className:"flex gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"auto_fix_high"}),(0,a.jsx)("p",{children:"BlueRouter sẽ SSH v\xe0o m\xe1y, d\xf9ng quyền sudo để c\xe0i Python agent dưới dạng systemd service. Sau lần n\xe0y bạn kh\xf4ng cần thao t\xe1c th\xeam tr\xean Linux."})]})}),(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,a.jsx)(b.default,{label:"T\xean hiển thị",value:l.name,onChange:e=>x("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,a.jsx)(b.default,{required:!0,label:"Hostname / IP",value:l.host,onChange:e=>x("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,a.jsx)(b.default,{required:!0,label:"SSH user",value:l.sshUser,onChange:e=>x("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,a.jsx)(b.default,{label:"SSH port",type:"number",value:l.sshPort,onChange:e=>x("sshPort",e.target.value)}),(0,a.jsx)(b.default,{label:"SSH password",type:"password",value:l.sshPassword,onChange:e=>x("sshPassword",e.target.value),placeholder:"Để trống nếu d\xf9ng SSH key",hint:"Chỉ d\xf9ng trong l\xfac c\xe0i, kh\xf4ng lưu v\xe0o database."}),(0,a.jsx)(b.default,{label:"Agent port",type:"number",value:l.agentPort,onChange:e=>x("agentPort",e.target.value),hint:"Mặc định 19998; dashboard server phải truy cập được port n\xe0y."})]}),(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:l.useSudo,onChange:e=>x("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),l.useSudo?(0,a.jsx)(b.default,{label:"Sudo password",type:"password",value:l.sudoPassword,onChange:e=>x("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,d?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:d}):null]})})}function G({open:e,server:t,onClose:s,onUpdated:l}){let[n,i]=(0,r.useState)(y(t)),[o,d]=(0,r.useState)(!1),[c,x]=(0,r.useState)(""),m=(e,t)=>i(s=>({...s,[e]:t}));(0,r.useEffect)(()=>{e&&(i(y(t)),x(""))},[e,t]);let u=async e=>{if(e.preventDefault(),t?.id){d(!0),x("");try{let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n.name,host:n.host,sshPort:n.sshPort,sshUser:n.sshUser,useSudo:n.useSudo,agentPort:n.agentPort})}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể lưu server");let r=null;if(n.installAgent){let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sshPassword:n.sshPassword,sudoPassword:n.sudoPassword})}),s=await e.json().catch(()=>({}));r={ok:e.ok&&!1!==s.ok,log:s.log,error:s.error}}await l(a.server,r),s()}catch(e){x(e?.message||"Kh\xf4ng thể cập nhật server")}finally{d(!1)}}};return(0,a.jsx)(f.default,{isOpen:e,onClose:s,title:"Sửa Linux server",size:"xl",busy:o,footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g.default,{variant:"ghost",onClick:s,disabled:o,children:"Hủy"}),(0,a.jsx)(g.default,{onClick:u,loading:o,icon:"save",children:"Lưu & c\xe0i lại agent"})]}),children:(0,a.jsxs)("form",{onSubmit:u,className:"space-y-5",children:[(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,a.jsx)(b.default,{label:"T\xean hiển thị",value:n.name,onChange:e=>m("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,a.jsx)(b.default,{required:!0,label:"Hostname / IP",value:n.host,onChange:e=>m("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,a.jsx)(b.default,{required:!0,label:"SSH user",value:n.sshUser,onChange:e=>m("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,a.jsx)(b.default,{label:"SSH port",type:"number",value:n.sshPort,onChange:e=>m("sshPort",e.target.value)}),(0,a.jsx)(b.default,{label:"SSH password",type:"password",value:n.sshPassword,onChange:e=>m("sshPassword",e.target.value),placeholder:"Nhập lại nếu trước đ\xf3 sai",hint:"Chỉ d\xf9ng để c\xe0i lại agent, kh\xf4ng lưu v\xe0o database."}),(0,a.jsx)(b.default,{label:"Agent port",type:"number",value:n.agentPort,onChange:e=>m("agentPort",e.target.value)})]}),(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:n.useSudo,onChange:e=>m("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),n.useSudo?(0,a.jsx)(b.default,{label:"Sudo password",type:"password",value:n.sudoPassword,onChange:e=>m("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:n.installAgent,onChange:e=>m("installAgent",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"C\xe0i lại agent sau khi lưu"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Bật mục n\xe0y khi cần nhập lại account/password SSH hoặc đổi port."})]})]}),c?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:c}):null]})})}let B={normal:{variant:"success",label:"B\xecnh thường"},warning:{variant:"warning",label:"Cảnh b\xe1o"},critical:{variant:"error",label:"Qu\xe1 tải"},unknown:{variant:"default",label:"Kh\xf4ng r\xf5"}};function R({modelOptions:e,selectedModel:t,onSelectModel:s,analysis:r,loading:l,error:n,onAnalyze:i,standby:o}){return(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsx)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"neurology"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"text-lg font-semibold text-text-main",children:"Đ\xe1nh gi\xe1 AI t\xecnh trạng server"}),(0,a.jsx)("p",{className:"mt-0.5 text-xs text-text-muted",children:"Ph\xe2n t\xedch giờ l\xe0m việc h\xf4m nay (8:00 - 18:00) tr\xean to\xe0n bộ Linux server."})]})]})}),(0,a.jsxs)("div",{className:"space-y-5 p-6",children:[o?(0,a.jsx)("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:"Standby mode: kết quả ph\xe2n t\xedch được đồng bộ tự động từ Master. Node n\xe0y kh\xf4ng tự chạy ph\xe2n t\xedch AI."}):null,(0,a.jsxs)("div",{className:"flex flex-wrap items-end gap-3",children:[(0,a.jsx)(j.default,{className:"min-w-[280px] flex-1",label:"AI model d\xf9ng để ph\xe2n t\xedch",options:e,value:t,onChange:e=>s(e.target.value),placeholder:e.length?"Chọn model":"Chưa c\xf3 kết nối AI n\xe0o đang hoạt động",disabled:!e.length||o}),(0,a.jsx)(g.default,{icon:"auto_awesome",onClick:i,loading:l,disabled:!t||o,children:"Ph\xe2n t\xedch lại"})]}),n?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:n}):null,r?(0,a.jsxs)("div",{className:"space-y-5",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2 text-xs text-text-muted",children:[(0,a.jsxs)("span",{children:["Model: ",(0,a.jsx)("span",{className:"font-semibold",children:r.modelLabel})]}),(0,a.jsxs)("span",{children:["Cập nhật l\xfac ",S(r.generatedAt)]})]}),(0,a.jsx)("div",{className:"whitespace-pre-wrap rounded-2xl border border-border bg-surface-2/40 p-5 text-sm leading-6 text-text-main",children:r.summary}),r.servers?.length?(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:"Trạng th\xe1i từng server"})]}),(0,a.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-3",children:r.servers.map(e=>{let t=B[e.status]||B.unknown;return(0,a.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface px-4 py-3",children:[(0,a.jsx)("span",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,a.jsx)(p.default,{variant:t.variant,dot:!0,children:t.label})]},e.serverId)})})]}):null]}):l?null:(0,a.jsx)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:'Chưa c\xf3 ph\xe2n t\xedch n\xe0o — bấm "Ph\xe2n t\xedch lại" để bắt đầu.'})]})]})}function H(){let e,t,s,l,[n,i]=(0,r.useState)("realtime"),[o,d]=(0,r.useState)([]),[c,x]=(0,r.useState)(""),[m,u]=(0,r.useState)({}),[h,p]=(0,r.useState)(!0),[b,j]=(0,r.useState)(!1),[v,y]=(0,r.useState)(!1),[T,D]=(0,r.useState)(!1),[_,L]=(0,r.useState)(null),[B,H]=(0,r.useState)(!1),[O,z]=(0,r.useState)(null),[V,W]=(0,r.useState)("24h"),[q,J]=(0,r.useState)([]),[X,Q]=(0,r.useState)(null),[Y,Z]=(0,r.useState)(!1),[ee,et]=(0,r.useState)(""),[es,ea]=(0,r.useState)(!1),[er,el]=(0,r.useState)([]),[en,ei]=(0,r.useState)(""),[eo,ed]=(0,r.useState)(null),[ec,ex]=(0,r.useState)(!1),[em,eu]=(0,r.useState)(""),eh=(0,r.useRef)(0),ep=(0,r.useCallback)(async({quiet:e=!1}={})=>{e||j(!0);try{let e=await fetch("/api/resource-monitor",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được server");let s=t.servers||[];ea(!0===t.standby),d(s),x(e=>e&&s.some(t=>t.id===e)?e:s[0]?.id||""),u(e=>{let t={...e};return s.forEach(e=>{if(!N(e))return;let s=e.lastStatus,a={time:s.updatedAt||new Date().toISOString(),cpu:s.cpu?.usagePercent||0,memory:s.memory?.usagePercent||0,disk:s.disks?.[0]?.usagePercent||0,gpu:s.gpus?.length?Math.max(...s.gpus.map(e=>e.usagePercent||0)):0,gpus:(s.gpus||[]).map(e=>({id:A(e),usagePercent:w(e.usagePercent)}))},r=t[e.id]||[];t[e.id]=r.at(-1)?.time===a.time?r:[...r,a].slice(-60)}),t})}catch(t){e||z({type:"error",text:t?.message||"Kh\xf4ng tải được server"})}finally{p(!1),e||j(!1)}},[]),eg=(0,r.useCallback)(async()=>{if(!c)return;let e=++eh.current;Z(!0),et("");try{let t=await fetch(`/api/resource-monitor/history?serverId=${encodeURIComponent(c)}&period=${encodeURIComponent(V)}`,{cache:"no-store"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean");if(eh.current!==e)return;J(s.points||[]),Q(s)}catch(t){if(eh.current!==e)return;et(t?.message||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean"),J([])}finally{eh.current===e&&Z(!1)}},[V,c]);(0,r.useEffect)(()=>{let e,t=!1;ep();let s=async()=>{await ep({quiet:!0}),t||(e=setTimeout(s,4e3))};return e=setTimeout(s,4e3),()=>{t=!0,clearTimeout(e)}},[ep]),(0,r.useEffect)(()=>{if("history"!==n||!c)return;eg();let e=setInterval(eg,6e4);return()=>clearInterval(e)},[n,eg,c]),(0,r.useEffect)(()=>{let e=localStorage.getItem("blueRouterResourceMonitorTab");e&&i(e)},[]),(0,r.useEffect)(()=>{localStorage.setItem("blueRouterResourceMonitorTab",n)},[n]);let eb=(0,r.useCallback)(e=>{ei(e),fetch("/api/resource-monitor/analyze",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e})}).catch(()=>{})},[]),ef=(0,r.useCallback)(async()=>{if(!en)return;let e=en.indexOf("::"),t=en.slice(0,e),s=en.slice(e+2);ex(!0),eu("");try{let e=await fetch("/api/resource-monitor/analyze",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:t,model:s})}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean");ed(a.analysis)}catch(e){eu(e?.message||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean")}finally{ex(!1)}},[en]);(0,r.useEffect)(()=>{"ai"===n&&(async()=>{let e="";try{let t=await fetch("/api/resource-monitor/analyze",{cache:"no-store"}),s=await t.json().catch(()=>({}));t.ok&&(ed(s.analysis||null),e=s.selectedModel||"")}catch{}try{let t=await fetch("/api/resource-monitor/ai-models",{cache:"no-store"}),s=(await t.json().catch(()=>({}))).options||[];el(s),ei(t=>{let a=t||e;return a&&s.some(e=>e.value===a)?a:s[0]?.value||""})}catch{el([])}})()},[n]);let ej=(0,r.useMemo)(()=>o.find(e=>e.id===c)||null,[o,c]),ev=ej?.lastStatus,ey=N(ej),eN=ev?.disks?.[0],ew=m[c]||[],ek=async()=>{if(_){H(!0);try{if(!(await fetch(`/api/resource-monitor/${_.id}`,{method:"DELETE"})).ok)throw Error("Kh\xf4ng thể x\xf3a server");L(null),await ep()}catch(e){z({type:"error",text:e.message})}finally{H(!1)}}};return h?(0,a.jsxs)("div",{className:"flex min-h-[50vh] items-center justify-center text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải t\xe0i nguy\xean server..."]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Linux Resource Monitor"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Theo d\xf5i realtime CPU, RAM, disk, network v\xe0 to\xe0n bộ NVIDIA GPU."})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(g.default,{variant:"secondary",icon:"refresh",onClick:()=>"history"===n?eg():ep(),loading:"history"===n?Y:b,children:"L\xe0m mới"}),(0,a.jsx)(g.default,{icon:"add",onClick:()=>y(!0),disabled:es,children:"Th\xeam server"})]})]}),es?(0,a.jsx)("div",{className:"rounded-xl border border-blue-500/30 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:"Standby mode: Resource Monitor chỉ hiển thị snapshot từ Master. Node n\xe0y kh\xf4ng polling agent v\xe0 kh\xf4ng cho sửa danh s\xe1ch server."}):null,(0,a.jsxs)("div",{className:"flex w-fit rounded-xl border border-border bg-surface p-1 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>i("realtime"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"realtime"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"monitor_heart"}),"Realtime Monitor"]}),(0,a.jsxs)("button",{type:"button",onClick:()=>i("history"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"history"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"query_stats"}),"History"]}),(0,a.jsxs)("button",{type:"button",onClick:()=>i("ai"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"ai"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"neurology"}),"Đ\xe1nh gi\xe1 AI"]})]}),O?(0,a.jsxs)("div",{className:`flex items-center justify-between rounded-xl border px-4 py-3 text-sm ${"error"===O.type?"border-red-500/20 bg-red-500/10 text-red-600 dark:text-red-300":"border-amber-500/20 bg-amber-500/10 text-amber-700 dark:text-amber-300"}`,children:[(0,a.jsx)("span",{children:O.text}),(0,a.jsx)("button",{onClick:()=>z(null),children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"close"})})]}):null,o.length?(0,a.jsxs)(a.Fragment,{children:["ai"!==n?(0,a.jsx)($,{servers:o,selectedId:c,onSelect:x}):null,"ai"===n?(0,a.jsx)(R,{modelOptions:er,selectedModel:en,onSelectModel:eb,analysis:eo,loading:ec,error:em,onAnalyze:ef,standby:es}):ej?"realtime"===n?(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-4 border-b border-border px-6 py-5",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"dns"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(C,{online:ey}),(0,a.jsx)("h3",{className:"truncate text-lg font-semibold text-text-main",children:ej.name})]}),(0,a.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-3 text-xs text-text-muted",children:[(0,a.jsx)("span",{className:"font-mono",children:ej.host}),ev?.os?(0,a.jsx)("span",{children:ev.os}):null,ev?.uptimeSeconds?(0,a.jsxs)("span",{children:["Uptime ",(t=Math.floor((e=Number(ev.uptimeSeconds)||0)/86400),s=Math.floor(e%86400/3600),l=Math.floor(e%3600/60),t?`${t} ng\xe0y ${s} giờ`:s?`${s} giờ ${l} ph\xfat`:`${l} ph\xfat`)]}):null]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:`rounded-full px-3 py-1.5 text-xs font-semibold ${ey?"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400":"bg-red-500/10 text-red-600 dark:text-red-300"}`,children:ey?"Online":"Offline"}),es?null:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{type:"button",onClick:()=>D(!0),className:"rounded-xl p-2 text-text-muted hover:bg-primary/10 hover:text-primary",title:"Sửa server v\xe0 c\xe0i lại agent",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"edit"})}),(0,a.jsx)("button",{type:"button",onClick:()=>L(ej),className:"rounded-xl p-2 text-text-muted hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a khỏi dashboard",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"delete"})})]})]})]}),ey?null:(0,a.jsx)("div",{className:"m-6 rounded-2xl border border-amber-500/20 bg-amber-500/8 p-5",children:(0,a.jsxs)("div",{className:"flex gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-amber-500",children:"cloud_off"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Kh\xf4ng kết nối được agent"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:ej.lastError||"Agent chưa gửi dữ liệu. Kiểm tra firewall v\xe0 agent port."}),ej.lastInstallLog?(0,a.jsxs)("details",{className:"mt-3",children:[(0,a.jsx)("summary",{className:"cursor-pointer text-xs font-semibold text-amber-600",children:"Xem log c\xe0i đặt"}),(0,a.jsx)("pre",{className:"mt-2 max-h-48 overflow-auto whitespace-pre-wrap rounded-xl bg-black/80 p-3 text-xs text-white",children:ej.lastInstallLog})]}):null]})]})}),ev?(0,a.jsxs)("div",{className:"space-y-7 p-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-5 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Tổng quan t\xe0i nguy\xean"}),(0,a.jsxs)("span",{className:"ml-auto text-xs text-text-muted",children:["Cập nhật ",S(ej.lastStatusAt)]})]}),(0,a.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2 xl:grid-cols-4",children:[(0,a.jsx)(P,{value:ev.cpu?.usagePercent,label:"CPU",detail:`${ev.cpu?.cores||0} cores \xb7 Load ${ev.cpu?.load1??0}`,icon:"developer_board"}),(0,a.jsx)(P,{value:ev.memory?.usagePercent,label:"RAM",detail:`${k(ev.memory?.usedBytes)} / ${k(ev.memory?.totalBytes)}`,icon:"memory_alt"}),(0,a.jsx)(P,{value:eN?.usagePercent,label:"Disk /",detail:`${k(eN?.usedBytes)} / ${k(eN?.totalBytes)}`,icon:"hard_drive"}),(0,a.jsx)(P,{value:ev.gpus?.length?Math.max(...ev.gpus.map(e=>e.usagePercent||0)):0,label:ev.gpus?.length?`${ev.gpus.length} NVIDIA GPU`:"GPU",detail:ev.gpus?.length?`${ev.gpus.length} card được ph\xe1t hiện`:"Kh\xf4ng c\xf3 NVIDIA GPU",color:"#10b981",icon:"memory"})]})]}),(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[(0,a.jsx)(U,{icon:"developer_board",label:"CPU",value:ev.cpu?.model||`${ev.cpu?.cores||0} cores`,sublabel:`Load average ${ev.cpu?.load1??0} / ${ev.cpu?.load5??0} / ${ev.cpu?.load15??0}`}),(0,a.jsx)(U,{icon:"swap_vert",label:"Network realtime",value:`↓ ${k(ev.network?.rxBytesPerSecond)}/s`,sublabel:`↑ ${k(ev.network?.txBytesPerSecond)}/s`,colorClass:"text-cyan-500"}),(0,a.jsx)(U,{icon:"hard_drive",label:"Disk root",value:`${k(eN?.freeBytes)} trống`,sublabel:`${eN?.device||"root"} \xb7 ${eN?.filesystem||"filesystem"}`,colorClass:"text-violet-500"}),(0,a.jsx)(U,{icon:"memory",label:"Swap",value:k(ev.memory?.swapUsedBytes),sublabel:`Tổng ${k(ev.memory?.swapTotalBytes)}`,colorClass:"text-amber-500"})]}),(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(M,{data:ew,dataKey:"cpu",label:"CPU usage",color:"#3b9dec"}),(0,a.jsx)(M,{data:ew,dataKey:"memory",label:"RAM usage",color:"#8b5cf6"})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-emerald-500"}),(0,a.jsxs)("h3",{className:"font-semibold text-text-main",children:["NVIDIA GPU (",ev.gpus?.length||0,")"]})]}),ev.gpus?.length?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(I,{data:ew,gpus:ev.gpus}),(0,a.jsx)("div",{className:"grid gap-5 xl:grid-cols-2",children:ev.gpus.map(e=>(0,a.jsx)(E,{gpu:e},e.uuid||e.index))})]}):(0,a.jsxs)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:["Kh\xf4ng ph\xe1t hiện NVIDIA GPU hoặc"," ",(0,a.jsx)("span",{className:"font-mono",children:"nvidia-smi"})," chưa sẵn s\xe0ng."]})]})]}):null]}):(0,a.jsx)(K,{server:ej,data:q,meta:X,period:V,onPeriodChange:W,loading:Y,error:ee}):null]}):(0,a.jsxs)("div",{className:"flex min-h-[460px] flex-col items-center justify-center rounded-3xl border border-dashed border-border bg-surface px-6 text-center",children:[(0,a.jsx)("div",{className:"flex h-20 w-20 items-center justify-center rounded-3xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[42px]",children:"monitor_heart"})}),(0,a.jsx)("h3",{className:"mt-6 text-xl font-semibold text-text-main",children:"Chưa c\xf3 Linux server"}),(0,a.jsx)("p",{className:"mt-2 max-w-lg text-sm leading-6 text-text-muted",children:"Th\xeam server bằng t\xe0i khoản SSH c\xf3 quyền sudo. BlueRouter sẽ tự c\xe0i agent systemd v\xe0 bắt đầu hiển thị t\xe0i nguy\xean ngay tại đ\xe2y."}),es?null:(0,a.jsx)(g.default,{className:"mt-6",icon:"add",onClick:()=>y(!0),children:"Th\xeam server đầu ti\xean"})]}),(0,a.jsx)(F,{open:v&&!es,onClose:()=>y(!1),onCreated:async(e,t)=>{t&&!t.ok&&z({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,a.jsx)(G,{open:T&&!es,server:ej,onClose:()=>D(!1),onUpdated:async(e,t)=>{t&&!t.ok&&z({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i lại agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,a.jsx)(f.ConfirmModal,{isOpen:!!_,onClose:()=>L(null),onConfirm:ek,loading:B,variant:"danger",title:"X\xf3a server khỏi dashboard?",confirmText:"X\xf3a server",cancelText:"Hủy",message:"Server sẽ ngừng được theo d\xf5i. Agent systemd tr\xean Linux kh\xf4ng bị gỡ tự động."})]})}},96413:(e,t,s)=>{Promise.resolve().then(s.bind(s,86243))}},e=>{e.O(0,[506,6483,7033,8441,3794,7358],()=>e(e.s=96413)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1205],{86243:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>H});var a=s(95155),r=s(12115),l=s(1728),n=s(90639),i=s(28408),o=s(32539),d=s(59656),c=s(65671),x=s(34122),m=s(16746),u=s(96647),h=s(29010),p=s(56061),g=s(92542),b=s(11910),f=s(81127),j=s(98);let v={name:"",host:"",sshPort:"22",sshUser:"",sshPassword:"",useSudo:!0,sudoPassword:"",agentPort:"19998",installAgent:!0};function y(e){return{name:e?.name||"",host:e?.host||"",sshPort:String(e?.sshPort||22),sshUser:e?.sshUser||"",sshPassword:"",useSudo:e?.useSudo!==!1,sudoPassword:"",agentPort:String(e?.agentPort||19998),installAgent:!0}}function N(e){var t;let s;return!!e?.lastStatus&&(!e.lastError||Date.now()-(Number.isFinite(s=(t=e?.lastStatusAt)?new Date(t).getTime():0)?s:0)<=3e4)}function w(e){return Math.max(0,Math.min(100,Number(e)||0))}function k(e,t=1){let s=Number(e)||0;if(!s)return"0 B";let a=["B","KB","MB","GB","TB","PB"],r=Math.min(a.length-1,Math.floor(Math.log(s)/Math.log(1024)));return`${(s/1024**r).toFixed(r>2?t:0)} ${a[r]}`}function S(e){return e?new Date(e).toLocaleTimeString("vi-VN",{hour12:!1}):"--:--:--"}function P({value:e,label:t,detail:s,color:r="var(--color-brand-500)",icon:l}){let n=w(e),i=2*Math.PI*49;return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col items-center",children:[(0,a.jsxs)("div",{className:"relative h-36 w-36",children:[(0,a.jsxs)("svg",{className:"h-full w-full -rotate-90",viewBox:"0 0 120 120","aria-hidden":"true",children:[(0,a.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:"var(--color-surface-2)",strokeWidth:"8"}),(0,a.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:r,strokeWidth:"8",strokeLinecap:"round",strokeDasharray:i,strokeDashoffset:i*(1-n/100),className:"transition-all duration-700"})]}),(0,a.jsxs)("div",{className:"absolute inset-0 flex flex-col items-center justify-center text-center",children:[l?(0,a.jsx)("span",{className:"material-symbols-outlined mb-0.5 text-[19px] text-text-muted",children:l}):null,(0,a.jsxs)("strong",{className:"text-2xl font-semibold tracking-tight text-text-main",children:[n.toFixed(+(n<10)),"%"]}),(0,a.jsx)("span",{className:"mt-0.5 text-xs font-medium text-text-muted",children:t})]})]}),(0,a.jsx)("div",{className:"mt-2 max-w-full truncate text-center text-xs text-text-subtle",title:s,children:s})]})}function C({online:e}){return(0,a.jsx)("span",{className:`h-2.5 w-2.5 shrink-0 rounded-full ${e?"bg-emerald-500 shadow-[0_0_0_4px_rgba(16,185,129,.12)]":"bg-red-400 shadow-[0_0_0_4px_rgba(248,113,113,.12)]"}`})}function $({servers:e,selectedId:t,onSelect:s}){return(0,a.jsx)("div",{className:"flex gap-3 overflow-x-auto pb-1 scroll-thin-x",children:e.map(e=>{let r=e.id===t,l=N(e);return(0,a.jsxs)("button",{type:"button",onClick:()=>s(e.id),className:`min-w-[420px] rounded-2xl border p-5 text-left transition ${r?"border-primary bg-primary/5 shadow-[var(--shadow-warm)]":"border-border bg-surface hover:border-primary/40"}`,children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(C,{online:l}),(0,a.jsx)("div",{className:"truncate text-base font-semibold text-text-main",children:e.name})]}),(0,a.jsxs)("div",{className:"mt-1.5 truncate font-mono text-sm text-text-muted",children:[e.host,":",e.agentPort]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px] text-text-subtle",children:"dns"})]}),(0,a.jsxs)("div",{className:"mt-3 flex items-center justify-between text-sm text-text-muted",children:[(0,a.jsx)("span",{children:l?"Đang hoạt động":"Mất kết nối"}),(0,a.jsx)("span",{children:S(e.lastStatusAt)})]})]},e.id)})})}function U({icon:e,label:t,value:s,sublabel:r,colorClass:l="text-primary",children:n}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl bg-surface-2 ${l}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:e})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"text-xs font-medium uppercase tracking-wider text-text-muted",children:t}),(0,a.jsx)("div",{className:"mt-0.5 truncate text-lg font-semibold text-text-main",children:s})]})]}),r?(0,a.jsx)("div",{className:"mt-3 truncate text-xs text-text-subtle",children:r}):null,n]})}function M({data:e,dataKey:t,label:s,color:r,unit:m="%"}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:s}),(0,a.jsx)("span",{className:"text-xs text-text-muted",children:"60 mẫu gần nhất"})]}),(0,a.jsx)("div",{className:"h-44",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(n.Q,{data:e,margin:{top:6,right:4,left:-22,bottom:0},children:[(0,a.jsx)("defs",{children:(0,a.jsxs)("linearGradient",{id:`fill-${t}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:r,stopOpacity:.3}),(0,a.jsx)("stop",{offset:"100%",stopColor:r,stopOpacity:.02})]})}),(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",hide:!0}),(0,a.jsx)(d.h,{domain:[0,"auto"],tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},formatter:e=>[`${Number(e).toFixed(1)}${m}`,s]}),(0,a.jsx)(x.Gk,{type:"monotone",dataKey:t,stroke:r,fill:`url(#fill-${t})`,strokeWidth:2.2,dot:!1,isAnimationActive:!1})]})})})]})}let T=["#10b981","#06b6d4","#8b5cf6","#f59e0b","#ef4444","#3b82f6","#ec4899","#84cc16"];function A(e){return e?.uuid||`index-${e?.index??0}`}function I({data:e,gpus:t}){let s=(t||[]).map((e,t)=>({id:A(e),dataKey:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:T[t%T.length]})),r=e.map(e=>{let t={time:e.time};return s.forEach(s=>{let a=e.gpus?.find(e=>e.id===s.id);t[s.dataKey]=a?.usagePercent??null}),t});return(0,a.jsxs)("div",{className:"mb-5 rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4 flex flex-wrap items-start justify-between gap-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:"GPU usage history"}),(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Mỗi đường biểu diễn mức tải realtime của một NVIDIA GPU."})]}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-medium text-emerald-600 dark:text-emerald-400",children:"60 mẫu gần nhất"})]}),(0,a.jsx)("div",{className:"h-64",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(m.b,{data:r,margin:{top:8,right:12,left:-16,bottom:2},children:[(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",tickFormatter:S,minTickGap:36,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(d.h,{domain:[0,100],ticks:[0,25,50,75,100],tickFormatter:e=>`${e}%`,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>`Thời gian ${S(e)}`,formatter:(e,t)=>[`${Number(e).toFixed(1)}%`,t]}),(0,a.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,a.jsx)("span",{className:"text-text-muted",children:e})}),s.map(e=>(0,a.jsx)(h.N1,{type:"monotone",dataKey:e.dataKey,name:e.name,stroke:e.color,strokeWidth:2.4,dot:!1,connectNulls:!1,isAnimationActive:!1},e.id))]})})})]})}let D=[{value:"1h",label:"1 giờ"},{value:"6h",label:"6 giờ"},{value:"24h",label:"24 giờ"},{value:"7d",label:"7 ng\xe0y"},{value:"30d",label:"30 ng\xe0y"}];function _(e){return e?new Date(e).toLocaleString("vi-VN",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}):"—"}function L({title:e,description:t,data:s,series:r,domain:n=[0,100],valueFormatter:x=e=>`${Number(e).toFixed(1)}%`,axisFormatter:p=e=>`${e}%`}){return(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:e}),t?(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:t}):null]}),(0,a.jsx)("div",{className:"h-64",children:(0,a.jsx)(l.u,{width:"100%",height:"100%",children:(0,a.jsxs)(m.b,{data:s,margin:{top:8,right:12,left:-8,bottom:2},children:[(0,a.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,a.jsx)(o.W,{dataKey:"time",tickFormatter:_,minTickGap:48,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,a.jsx)(d.h,{domain:n,tickFormatter:p,width:58,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,a.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>_(e),formatter:(e,t)=>[x(e),t]}),(0,a.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,a.jsx)("span",{className:"text-text-muted",children:e})}),r.map(e=>(0,a.jsx)(h.N1,{type:"monotone",dataKey:e.key,name:e.name,stroke:e.color,strokeWidth:2.2,dot:!1,connectNulls:!1,isAnimationActive:!1},e.key))]})})})]})}function K({server:e,data:t,meta:s,period:l,onPeriodChange:n,loading:i,error:o}){let d=(0,r.useMemo)(()=>{let e=new Map;return t.forEach(t=>{(t.gpus||[]).forEach(t=>{e.has(t.id)||e.set(t.id,t)})}),[...e.values()].map((e,t)=>({id:e.id,key:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:T[t%T.length]}))},[t]),c=(0,r.useCallback)(e=>t.map(t=>{let s={time:t.time};return d.forEach(a=>{let r=t.gpus?.find(e=>e.id===a.id);s[a.key]=r?.[e]??null}),s}),[t,d]);return(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"monitoring"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("h3",{className:"truncate text-lg font-semibold text-text-main",children:["Lịch sử \xb7 ",e.name]}),(0,a.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Sample mỗi ph\xfat \xb7 lưu tối đa ",s?.retentionDays||30," ng\xe0y"]})]})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1 rounded-xl bg-surface-2 p-1",children:D.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>n(e.value),className:`rounded-lg px-3 py-2 text-xs font-semibold transition ${l===e.value?"bg-surface text-primary shadow-sm":"text-text-muted hover:text-text-main"}`,children:e.label},e.value))})]}),i?(0,a.jsxs)("div",{className:"flex min-h-[420px] items-center justify-center text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải dữ liệu lịch sử..."]}):o?(0,a.jsx)("div",{className:"m-6 rounded-2xl border border-red-500/20 bg-red-500/10 p-5 text-sm text-red-600 dark:text-red-300",children:o}):t.length?(0,a.jsxs)("div",{className:"space-y-5 p-6",children:[(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-3",children:[(0,a.jsx)(U,{icon:"database",label:"Số điểm hiển thị",value:t.length.toLocaleString("vi-VN"),sublabel:`Bucket ${s?.bucketMinutes||1} ph\xfat`,colorClass:"text-violet-500"}),(0,a.jsx)(U,{icon:"date_range",label:"Từ thời điểm",value:_(t[0]?.time),sublabel:"Điểm đầu ti\xean trong khoảng đ\xe3 chọn",colorClass:"text-cyan-500"}),(0,a.jsx)(U,{icon:"memory",label:"NVIDIA GPU",value:`${d.length} card`,sublabel:"Theo d\xf5i ri\xeang bằng GPU UUID",colorClass:"text-emerald-500"})]}),(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(L,{title:"CPU, RAM & Disk usage",description:"Tỷ lệ sử dụng t\xe0i nguy\xean hệ thống theo thời gian.",data:t,series:[{key:"cpu",name:"CPU",color:"#3b9dec"},{key:"memory",name:"RAM",color:"#8b5cf6"},{key:"disk",name:"Disk",color:"#f59e0b"}]}),(0,a.jsx)(L,{title:"Network throughput",description:"Tốc độ nhận v\xe0 gửi trung b\xecnh trong mỗi bucket.",data:t,domain:[0,"auto"],series:[{key:"networkRxBps",name:"Download",color:"#06b6d4"},{key:"networkTxBps",name:"Upload",color:"#ec4899"}],valueFormatter:e=>`${k(e)}/s`,axisFormatter:e=>k(e)})]}),d.length?(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(L,{title:"NVIDIA GPU usage",description:"Mức tải của từng GPU, ph\xe2n biệt theo UUID.",data:c("usagePercent"),series:d}),(0,a.jsx)(L,{title:"GPU VRAM usage",description:"Phần trăm VRAM đ\xe3 sử dụng tr\xean từng card.",data:c("memoryUsagePercent"),series:d}),(0,a.jsx)(L,{title:"GPU temperature",description:"Nhiệt độ trung b\xecnh của từng card trong mỗi bucket.",data:c("temperatureC"),domain:[0,"auto"],series:d,valueFormatter:e=>`${Number(e).toFixed(1)}\xb0C`,axisFormatter:e=>`${e}\xb0`}),(0,a.jsx)(L,{title:"GPU power draw",description:"C\xf4ng suất ti\xeau thụ trung b\xecnh của từng card.",data:c("powerDrawW"),domain:[0,"auto"],series:d,valueFormatter:e=>`${Number(e).toFixed(1)} W`,axisFormatter:e=>`${e}W`})]}):null]}):(0,a.jsxs)("div",{className:"flex min-h-[420px] flex-col items-center justify-center px-6 text-center",children:[(0,a.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[34px]",children:"hourglass_empty"})}),(0,a.jsx)("h4",{className:"mt-5 font-semibold text-text-main",children:"Chưa c\xf3 dữ liệu lịch sử"}),(0,a.jsx)("p",{className:"mt-2 max-w-md text-sm leading-6 text-text-muted",children:"Collector đ\xe3 được bật v\xe0 sẽ ghi mẫu đầu ti\xean trong v\xf2ng một ph\xfat. Dữ liệu vẫn tiếp tục được thu thập khi kh\xf4ng mở dashboard."})]})]})}function E({gpu:e}){let t=w(e.memoryUsagePercent);return(0,a.jsxs)("div",{className:"overflow-hidden rounded-2xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle bg-gradient-to-r from-emerald-500/8 to-cyan-500/5 px-5 py-4",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"memory"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"truncate font-semibold text-text-main",children:["GPU ",e.index," \xb7 ",e.name]}),(0,a.jsxs)("div",{className:"mt-0.5 text-xs text-text-muted",children:["NVIDIA Driver ",e.driverVersion||"—"]})]})]}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-semibold text-emerald-600 dark:text-emerald-400",children:"NVIDIA"})]}),(0,a.jsxs)("div",{className:"grid gap-5 p-5 sm:grid-cols-[150px_1fr]",children:[(0,a.jsx)(P,{value:e.usagePercent,label:"GPU Load",detail:`${e.temperatureC??"—"}\xb0C`,color:"#10b981"}),(0,a.jsxs)("div",{className:"space-y-5",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-2 flex items-center justify-between text-sm",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"VRAM"}),(0,a.jsxs)("span",{className:"font-semibold text-text-main",children:[k(1048576*(e.memoryUsedMb||0))," /"," ",k(1048576*(e.memoryTotalMb||0))]})]}),(0,a.jsx)("div",{className:"h-2.5 overflow-hidden rounded-full bg-surface-2",children:(0,a.jsx)("div",{className:"h-full rounded-full bg-emerald-500 transition-all duration-700",style:{width:`${t}%`}})}),(0,a.jsxs)("div",{className:"mt-1.5 text-right text-xs text-text-subtle",children:[t.toFixed(1),"% đ\xe3 d\xf9ng"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"Nhiệt độ"}),(0,a.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.temperatureC??"—","\xb0C"]})]}),(0,a.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"C\xf4ng suất"}),(0,a.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.powerDrawW??"—",(0,a.jsxs)("span",{className:"text-xs font-normal text-text-muted",children:[" ","/ ",e.powerLimitW??"—"," W"]})]})]})]})]})]})]})}function F({open:e,onClose:t,onCreated:s}){let[l,n]=(0,r.useState)(v),[i,o]=(0,r.useState)(!1),[d,c]=(0,r.useState)(""),x=(e,t)=>n(s=>({...s,[e]:t}));(0,r.useEffect)(()=>{e&&(n(v),c(""))},[e]);let m=async e=>{e.preventDefault(),o(!0),c("");try{let e=await fetch("/api/resource-monitor",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể th\xeam server");await s(a.server,a.install),t()}catch(e){c(e?.message||"Kh\xf4ng thể th\xeam server")}finally{o(!1)}};return(0,a.jsx)(f.default,{isOpen:e,onClose:t,title:"Th\xeam Linux server",size:"xl",busy:i,footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g.default,{variant:"ghost",onClick:t,disabled:i,children:"Hủy"}),(0,a.jsx)(g.default,{onClick:m,loading:i,icon:"rocket_launch",children:"C\xe0i agent & th\xeam server"})]}),children:(0,a.jsxs)("form",{onSubmit:m,className:"space-y-5",children:[(0,a.jsx)("div",{className:"rounded-xl border border-primary/20 bg-primary/5 p-4 text-sm text-text-muted",children:(0,a.jsxs)("div",{className:"flex gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"auto_fix_high"}),(0,a.jsx)("p",{children:"BlueRouter sẽ SSH v\xe0o m\xe1y, d\xf9ng quyền sudo để c\xe0i Python agent dưới dạng systemd service. Sau lần n\xe0y bạn kh\xf4ng cần thao t\xe1c th\xeam tr\xean Linux."})]})}),(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,a.jsx)(b.default,{label:"T\xean hiển thị",value:l.name,onChange:e=>x("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,a.jsx)(b.default,{required:!0,label:"Hostname / IP",value:l.host,onChange:e=>x("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,a.jsx)(b.default,{required:!0,label:"SSH user",value:l.sshUser,onChange:e=>x("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,a.jsx)(b.default,{label:"SSH port",type:"number",value:l.sshPort,onChange:e=>x("sshPort",e.target.value)}),(0,a.jsx)(b.default,{label:"SSH password",type:"password",value:l.sshPassword,onChange:e=>x("sshPassword",e.target.value),placeholder:"Để trống nếu d\xf9ng SSH key",hint:"Chỉ d\xf9ng trong l\xfac c\xe0i, kh\xf4ng lưu v\xe0o database."}),(0,a.jsx)(b.default,{label:"Agent port",type:"number",value:l.agentPort,onChange:e=>x("agentPort",e.target.value),hint:"Mặc định 19998; dashboard server phải truy cập được port n\xe0y."})]}),(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:l.useSudo,onChange:e=>x("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),l.useSudo?(0,a.jsx)(b.default,{label:"Sudo password",type:"password",value:l.sudoPassword,onChange:e=>x("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,d?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:d}):null]})})}function G({open:e,server:t,onClose:s,onUpdated:l}){let[n,i]=(0,r.useState)(y(t)),[o,d]=(0,r.useState)(!1),[c,x]=(0,r.useState)(""),m=(e,t)=>i(s=>({...s,[e]:t}));(0,r.useEffect)(()=>{e&&(i(y(t)),x(""))},[e,t]);let u=async e=>{if(e.preventDefault(),t?.id){d(!0),x("");try{let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n.name,host:n.host,sshPort:n.sshPort,sshUser:n.sshUser,useSudo:n.useSudo,agentPort:n.agentPort})}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể lưu server");let r=null;if(n.installAgent){let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sshPassword:n.sshPassword,sudoPassword:n.sudoPassword})}),s=await e.json().catch(()=>({}));r={ok:e.ok&&!1!==s.ok,log:s.log,error:s.error}}await l(a.server,r),s()}catch(e){x(e?.message||"Kh\xf4ng thể cập nhật server")}finally{d(!1)}}};return(0,a.jsx)(f.default,{isOpen:e,onClose:s,title:"Sửa Linux server",size:"xl",busy:o,footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g.default,{variant:"ghost",onClick:s,disabled:o,children:"Hủy"}),(0,a.jsx)(g.default,{onClick:u,loading:o,icon:"save",children:"Lưu & c\xe0i lại agent"})]}),children:(0,a.jsxs)("form",{onSubmit:u,className:"space-y-5",children:[(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,a.jsx)(b.default,{label:"T\xean hiển thị",value:n.name,onChange:e=>m("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,a.jsx)(b.default,{required:!0,label:"Hostname / IP",value:n.host,onChange:e=>m("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,a.jsx)(b.default,{required:!0,label:"SSH user",value:n.sshUser,onChange:e=>m("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,a.jsx)(b.default,{label:"SSH port",type:"number",value:n.sshPort,onChange:e=>m("sshPort",e.target.value)}),(0,a.jsx)(b.default,{label:"SSH password",type:"password",value:n.sshPassword,onChange:e=>m("sshPassword",e.target.value),placeholder:"Nhập lại nếu trước đ\xf3 sai",hint:"Chỉ d\xf9ng để c\xe0i lại agent, kh\xf4ng lưu v\xe0o database."}),(0,a.jsx)(b.default,{label:"Agent port",type:"number",value:n.agentPort,onChange:e=>m("agentPort",e.target.value)})]}),(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:n.useSudo,onChange:e=>m("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),n.useSudo?(0,a.jsx)(b.default,{label:"Sudo password",type:"password",value:n.sudoPassword,onChange:e=>m("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,(0,a.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,a.jsx)("input",{type:"checkbox",checked:n.installAgent,onChange:e=>m("installAgent",e.target.checked),className:"mt-1 h-4 w-4"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"C\xe0i lại agent sau khi lưu"}),(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Bật mục n\xe0y khi cần nhập lại account/password SSH hoặc đổi port."})]})]}),c?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:c}):null]})})}let B={normal:{variant:"success",label:"B\xecnh thường"},warning:{variant:"warning",label:"Cảnh b\xe1o"},critical:{variant:"error",label:"Qu\xe1 tải"},unknown:{variant:"default",label:"Kh\xf4ng r\xf5"}};function R({modelOptions:e,selectedModel:t,onSelectModel:s,analysis:r,loading:l,error:n,onAnalyze:i,standby:o}){return(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsx)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"neurology"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"text-lg font-semibold text-text-main",children:"Đ\xe1nh gi\xe1 AI t\xecnh trạng server"}),(0,a.jsx)("p",{className:"mt-0.5 text-xs text-text-muted",children:"Ph\xe2n t\xedch giờ l\xe0m việc h\xf4m nay (8:00 - 18:00) tr\xean to\xe0n bộ Linux server."})]})]})}),(0,a.jsxs)("div",{className:"space-y-5 p-6",children:[o?(0,a.jsx)("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:"Standby mode: kết quả ph\xe2n t\xedch được đồng bộ tự động từ Master. Node n\xe0y kh\xf4ng tự chạy ph\xe2n t\xedch AI."}):null,(0,a.jsxs)("div",{className:"flex flex-wrap items-end gap-3",children:[(0,a.jsx)(j.default,{className:"min-w-[280px] flex-1",label:"AI model d\xf9ng để ph\xe2n t\xedch",options:e,value:t,onChange:e=>s(e.target.value),placeholder:e.length?"Chọn model":"Chưa c\xf3 kết nối AI n\xe0o đang hoạt động",disabled:!e.length||o}),(0,a.jsx)(g.default,{icon:"auto_awesome",onClick:i,loading:l,disabled:!t||o,children:"Ph\xe2n t\xedch lại"})]}),n?(0,a.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:n}):null,r?(0,a.jsxs)("div",{className:"space-y-5",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2 text-xs text-text-muted",children:[(0,a.jsxs)("span",{children:["Model: ",(0,a.jsx)("span",{className:"font-semibold",children:r.modelLabel})]}),(0,a.jsxs)("span",{children:["Cập nhật l\xfac ",S(r.generatedAt)]})]}),(0,a.jsx)("div",{className:"whitespace-pre-wrap rounded-2xl border border-border bg-surface-2/40 p-5 text-sm leading-6 text-text-main",children:r.summary}),r.servers?.length?(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,a.jsx)("h4",{className:"font-semibold text-text-main",children:"Trạng th\xe1i từng server"})]}),(0,a.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-3",children:r.servers.map(e=>{let t=B[e.status]||B.unknown;return(0,a.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface px-4 py-3",children:[(0,a.jsx)("span",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,a.jsx)(p.default,{variant:t.variant,dot:!0,children:t.label})]},e.serverId)})})]}):null]}):l?null:(0,a.jsx)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:'Chưa c\xf3 ph\xe2n t\xedch n\xe0o — bấm "Ph\xe2n t\xedch lại" để bắt đầu.'})]})]})}function H(){let e,t,s,l,[n,i]=(0,r.useState)("realtime"),[o,d]=(0,r.useState)([]),[c,x]=(0,r.useState)(""),[m,u]=(0,r.useState)({}),[h,p]=(0,r.useState)(!0),[b,j]=(0,r.useState)(!1),[v,y]=(0,r.useState)(!1),[T,D]=(0,r.useState)(!1),[_,L]=(0,r.useState)(null),[B,H]=(0,r.useState)(!1),[O,z]=(0,r.useState)(null),[V,W]=(0,r.useState)("24h"),[q,J]=(0,r.useState)([]),[X,Q]=(0,r.useState)(null),[Y,Z]=(0,r.useState)(!1),[ee,et]=(0,r.useState)(""),[es,ea]=(0,r.useState)(!1),[er,el]=(0,r.useState)([]),[en,ei]=(0,r.useState)(""),[eo,ed]=(0,r.useState)(null),[ec,ex]=(0,r.useState)(!1),[em,eu]=(0,r.useState)(""),eh=(0,r.useRef)(0),ep=(0,r.useCallback)(async({quiet:e=!1}={})=>{e||j(!0);try{let e=await fetch("/api/resource-monitor",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được server");let s=t.servers||[];ea(!0===t.standby),d(s),x(e=>e&&s.some(t=>t.id===e)?e:s[0]?.id||""),u(e=>{let t={...e};return s.forEach(e=>{if(!N(e))return;let s=e.lastStatus,a={time:s.updatedAt||new Date().toISOString(),cpu:s.cpu?.usagePercent||0,memory:s.memory?.usagePercent||0,disk:s.disks?.[0]?.usagePercent||0,gpu:s.gpus?.length?Math.max(...s.gpus.map(e=>e.usagePercent||0)):0,gpus:(s.gpus||[]).map(e=>({id:A(e),usagePercent:w(e.usagePercent)}))},r=t[e.id]||[];t[e.id]=r.at(-1)?.time===a.time?r:[...r,a].slice(-60)}),t})}catch(t){e||z({type:"error",text:t?.message||"Kh\xf4ng tải được server"})}finally{p(!1),e||j(!1)}},[]),eg=(0,r.useCallback)(async()=>{if(!c)return;let e=++eh.current;Z(!0),et("");try{let t=await fetch(`/api/resource-monitor/history?serverId=${encodeURIComponent(c)}&period=${encodeURIComponent(V)}`,{cache:"no-store"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean");if(eh.current!==e)return;J(s.points||[]),Q(s)}catch(t){if(eh.current!==e)return;et(t?.message||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean"),J([])}finally{eh.current===e&&Z(!1)}},[V,c]);(0,r.useEffect)(()=>{let e,t=!1;ep();let s=async()=>{await ep({quiet:!0}),t||(e=setTimeout(s,4e3))};return e=setTimeout(s,4e3),()=>{t=!0,clearTimeout(e)}},[ep]),(0,r.useEffect)(()=>{if("history"!==n||!c)return;eg();let e=setInterval(eg,6e4);return()=>clearInterval(e)},[n,eg,c]),(0,r.useEffect)(()=>{let e=localStorage.getItem("blueRouterResourceMonitorTab");e&&i(e)},[]),(0,r.useEffect)(()=>{localStorage.setItem("blueRouterResourceMonitorTab",n)},[n]);let eb=(0,r.useCallback)(e=>{ei(e),fetch("/api/resource-monitor/analyze",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e})}).catch(()=>{})},[]),ef=(0,r.useCallback)(async()=>{if(!en)return;let e=en.indexOf("::"),t=en.slice(0,e),s=en.slice(e+2);ex(!0),eu("");try{let e=await fetch("/api/resource-monitor/analyze",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:t,model:s})}),a=await e.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean");ed(a.analysis)}catch(e){eu(e?.message||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean")}finally{ex(!1)}},[en]);(0,r.useEffect)(()=>{"ai"===n&&(async()=>{let e="";try{let t=await fetch("/api/resource-monitor/analyze",{cache:"no-store"}),s=await t.json().catch(()=>({}));t.ok&&(ed(s.analysis||null),e=s.selectedModel||"")}catch{}try{let t=await fetch("/api/resource-monitor/ai-models",{cache:"no-store"}),s=(await t.json().catch(()=>({}))).options||[];el(s),ei(t=>{let a=t||e;return a&&s.some(e=>e.value===a)?a:s[0]?.value||""})}catch{el([])}})()},[n]);let ej=(0,r.useMemo)(()=>o.find(e=>e.id===c)||null,[o,c]),ev=ej?.lastStatus,ey=N(ej),eN=ev?.disks?.[0],ew=m[c]||[],ek=async()=>{if(_){H(!0);try{if(!(await fetch(`/api/resource-monitor/${_.id}`,{method:"DELETE"})).ok)throw Error("Kh\xf4ng thể x\xf3a server");L(null),await ep()}catch(e){z({type:"error",text:e.message})}finally{H(!1)}}};return h?(0,a.jsxs)("div",{className:"flex min-h-[50vh] items-center justify-center text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải t\xe0i nguy\xean server..."]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Linux Resource Monitor"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Theo d\xf5i realtime CPU, RAM, disk, network v\xe0 to\xe0n bộ NVIDIA GPU."})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(g.default,{variant:"secondary",icon:"refresh",onClick:()=>"history"===n?eg():ep(),loading:"history"===n?Y:b,children:"L\xe0m mới"}),(0,a.jsx)(g.default,{icon:"add",onClick:()=>y(!0),disabled:es,children:"Th\xeam server"})]})]}),es?(0,a.jsx)("div",{className:"rounded-xl border border-blue-500/30 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:"Standby mode: Resource Monitor chỉ hiển thị snapshot từ Master. Node n\xe0y kh\xf4ng polling agent v\xe0 kh\xf4ng cho sửa danh s\xe1ch server."}):null,(0,a.jsxs)("div",{className:"flex w-fit rounded-xl border border-border bg-surface p-1 shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>i("realtime"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"realtime"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"monitor_heart"}),"Realtime Monitor"]}),(0,a.jsxs)("button",{type:"button",onClick:()=>i("history"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"history"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"query_stats"}),"History"]}),(0,a.jsxs)("button",{type:"button",onClick:()=>i("ai"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"ai"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"neurology"}),"Đ\xe1nh gi\xe1 AI"]})]}),O?(0,a.jsxs)("div",{className:`flex items-center justify-between rounded-xl border px-4 py-3 text-sm ${"error"===O.type?"border-red-500/20 bg-red-500/10 text-red-600 dark:text-red-300":"border-amber-500/20 bg-amber-500/10 text-amber-700 dark:text-amber-300"}`,children:[(0,a.jsx)("span",{children:O.text}),(0,a.jsx)("button",{onClick:()=>z(null),children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"close"})})]}):null,o.length?(0,a.jsxs)(a.Fragment,{children:["ai"!==n?(0,a.jsx)($,{servers:o,selectedId:c,onSelect:x}):null,"ai"===n?(0,a.jsx)(R,{modelOptions:er,selectedModel:en,onSelectModel:eb,analysis:eo,loading:ec,error:em,onAnalyze:ef,standby:es}):ej?"realtime"===n?(0,a.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-4 border-b border-border px-6 py-5",children:[(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,a.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"dns"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(C,{online:ey}),(0,a.jsx)("h3",{className:"truncate text-lg font-semibold text-text-main",children:ej.name})]}),(0,a.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-3 text-xs text-text-muted",children:[(0,a.jsx)("span",{className:"font-mono",children:ej.host}),ev?.os?(0,a.jsx)("span",{children:ev.os}):null,ev?.uptimeSeconds?(0,a.jsxs)("span",{children:["Uptime ",(t=Math.floor((e=Number(ev.uptimeSeconds)||0)/86400),s=Math.floor(e%86400/3600),l=Math.floor(e%3600/60),t?`${t} ng\xe0y ${s} giờ`:s?`${s} giờ ${l} ph\xfat`:`${l} ph\xfat`)]}):null]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:`rounded-full px-3 py-1.5 text-xs font-semibold ${ey?"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400":"bg-red-500/10 text-red-600 dark:text-red-300"}`,children:ey?"Online":"Offline"}),es?null:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{type:"button",onClick:()=>D(!0),className:"rounded-xl p-2 text-text-muted hover:bg-primary/10 hover:text-primary",title:"Sửa server v\xe0 c\xe0i lại agent",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"edit"})}),(0,a.jsx)("button",{type:"button",onClick:()=>L(ej),className:"rounded-xl p-2 text-text-muted hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a khỏi dashboard",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"delete"})})]})]})]}),ey?null:(0,a.jsx)("div",{className:"m-6 rounded-2xl border border-amber-500/20 bg-amber-500/8 p-5",children:(0,a.jsxs)("div",{className:"flex gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-amber-500",children:"cloud_off"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Kh\xf4ng kết nối được agent"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:ej.lastError||"Agent chưa gửi dữ liệu. Kiểm tra firewall v\xe0 agent port."}),ej.lastInstallLog?(0,a.jsxs)("details",{className:"mt-3",children:[(0,a.jsx)("summary",{className:"cursor-pointer text-xs font-semibold text-amber-600",children:"Xem log c\xe0i đặt"}),(0,a.jsx)("pre",{className:"mt-2 max-h-48 overflow-auto whitespace-pre-wrap rounded-xl bg-black/80 p-3 text-xs text-white",children:ej.lastInstallLog})]}):null]})]})}),ev?(0,a.jsxs)("div",{className:"space-y-7 p-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-5 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Tổng quan t\xe0i nguy\xean"}),(0,a.jsxs)("span",{className:"ml-auto text-xs text-text-muted",children:["Cập nhật ",S(ej.lastStatusAt)]})]}),(0,a.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2 xl:grid-cols-4",children:[(0,a.jsx)(P,{value:ev.cpu?.usagePercent,label:"CPU",detail:`${ev.cpu?.cores||0} cores \xb7 Load ${ev.cpu?.load1??0}`,icon:"developer_board"}),(0,a.jsx)(P,{value:ev.memory?.usagePercent,label:"RAM",detail:`${k(ev.memory?.usedBytes)} / ${k(ev.memory?.totalBytes)}`,icon:"memory_alt"}),(0,a.jsx)(P,{value:eN?.usagePercent,label:"Disk /",detail:`${k(eN?.usedBytes)} / ${k(eN?.totalBytes)}`,icon:"hard_drive"}),(0,a.jsx)(P,{value:ev.gpus?.length?Math.max(...ev.gpus.map(e=>e.usagePercent||0)):0,label:ev.gpus?.length?`${ev.gpus.length} NVIDIA GPU`:"GPU",detail:ev.gpus?.length?`${ev.gpus.length} card được ph\xe1t hiện`:"Kh\xf4ng c\xf3 NVIDIA GPU",color:"#10b981",icon:"memory"})]})]}),(0,a.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[(0,a.jsx)(U,{icon:"developer_board",label:"CPU",value:ev.cpu?.model||`${ev.cpu?.cores||0} cores`,sublabel:`Load average ${ev.cpu?.load1??0} / ${ev.cpu?.load5??0} / ${ev.cpu?.load15??0}`}),(0,a.jsx)(U,{icon:"swap_vert",label:"Network realtime",value:`↓ ${k(ev.network?.rxBytesPerSecond)}/s`,sublabel:`↑ ${k(ev.network?.txBytesPerSecond)}/s`,colorClass:"text-cyan-500"}),(0,a.jsx)(U,{icon:"hard_drive",label:"Disk root",value:`${k(eN?.freeBytes)} trống`,sublabel:`${eN?.device||"root"} \xb7 ${eN?.filesystem||"filesystem"}`,colorClass:"text-violet-500"}),(0,a.jsx)(U,{icon:"memory",label:"Swap",value:k(ev.memory?.swapUsedBytes),sublabel:`Tổng ${k(ev.memory?.swapTotalBytes)}`,colorClass:"text-amber-500"})]}),(0,a.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,a.jsx)(M,{data:ew,dataKey:"cpu",label:"CPU usage",color:"#3b9dec"}),(0,a.jsx)(M,{data:ew,dataKey:"memory",label:"RAM usage",color:"#8b5cf6"})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"h-5 w-1 rounded-full bg-emerald-500"}),(0,a.jsxs)("h3",{className:"font-semibold text-text-main",children:["NVIDIA GPU (",ev.gpus?.length||0,")"]})]}),ev.gpus?.length?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(I,{data:ew,gpus:ev.gpus}),(0,a.jsx)("div",{className:"grid gap-5 xl:grid-cols-2",children:ev.gpus.map(e=>(0,a.jsx)(E,{gpu:e},e.uuid||e.index))})]}):(0,a.jsxs)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:["Kh\xf4ng ph\xe1t hiện NVIDIA GPU hoặc"," ",(0,a.jsx)("span",{className:"font-mono",children:"nvidia-smi"})," chưa sẵn s\xe0ng."]})]})]}):null]}):(0,a.jsx)(K,{server:ej,data:q,meta:X,period:V,onPeriodChange:W,loading:Y,error:ee}):null]}):(0,a.jsxs)("div",{className:"flex min-h-[460px] flex-col items-center justify-center rounded-3xl border border-dashed border-border bg-surface px-6 text-center",children:[(0,a.jsx)("div",{className:"flex h-20 w-20 items-center justify-center rounded-3xl bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[42px]",children:"monitor_heart"})}),(0,a.jsx)("h3",{className:"mt-6 text-xl font-semibold text-text-main",children:"Chưa c\xf3 Linux server"}),(0,a.jsx)("p",{className:"mt-2 max-w-lg text-sm leading-6 text-text-muted",children:"Th\xeam server bằng t\xe0i khoản SSH c\xf3 quyền sudo. BlueRouter sẽ tự c\xe0i agent systemd v\xe0 bắt đầu hiển thị t\xe0i nguy\xean ngay tại đ\xe2y."}),es?null:(0,a.jsx)(g.default,{className:"mt-6",icon:"add",onClick:()=>y(!0),children:"Th\xeam server đầu ti\xean"})]}),(0,a.jsx)(F,{open:v&&!es,onClose:()=>y(!1),onCreated:async(e,t)=>{t&&!t.ok&&z({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,a.jsx)(G,{open:T&&!es,server:ej,onClose:()=>D(!1),onUpdated:async(e,t)=>{t&&!t.ok&&z({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i lại agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,a.jsx)(f.ConfirmModal,{isOpen:!!_,onClose:()=>L(null),onConfirm:ek,loading:B,variant:"danger",title:"X\xf3a server khỏi dashboard?",confirmText:"X\xf3a server",cancelText:"Hủy",message:"Server sẽ ngừng được theo d\xf5i. Agent systemd tr\xean Linux kh\xf4ng bị gỡ tự động."})]})}},96413:(e,t,s)=>{Promise.resolve().then(s.bind(s,86243))}},e=>{e.O(0,[506,6483,7033,8441,3794,7358],()=>e(e.s=96413)),_N_E=e.O()}]);
@@ -117,15 +117,15 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
117
117
  </div>
118
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:`
119
119
  .resource-monitor-sortable-host {
120
- min-width: 360px !important;
120
+ min-width: 420px !important;
121
121
  overflow: hidden;
122
122
  }
123
123
  .resource-monitor-live-metrics {
124
124
  display: grid;
125
- gap: 10px;
126
- margin-top: 12px;
125
+ gap: 12px;
126
+ margin-top: 14px;
127
127
  border-top: 1px solid var(--color-border-subtle);
128
- padding-top: 10px;
128
+ padding-top: 12px;
129
129
  padding-right: 2px;
130
130
  pointer-events: none;
131
131
  text-align: left;
@@ -133,9 +133,9 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
133
133
  .resource-live-section {
134
134
  min-width: 0;
135
135
  border: 1px solid var(--color-border-subtle);
136
- border-radius: 12px;
136
+ border-radius: 14px;
137
137
  background: color-mix(in srgb, var(--color-surface-2) 62%, var(--color-surface));
138
- padding: 10px 11px;
138
+ padding: 13px 14px;
139
139
  }
140
140
  .resource-live-section-head {
141
141
  display: flex;
@@ -143,25 +143,25 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
143
143
  align-items: center;
144
144
  justify-content: space-between;
145
145
  gap: 8px;
146
- margin-bottom: 8px;
146
+ margin-bottom: 10px;
147
147
  }
148
148
  .resource-live-section-title {
149
149
  display: inline-flex;
150
150
  min-width: 0;
151
151
  align-items: center;
152
- gap: 6px;
152
+ gap: 7px;
153
153
  color: var(--color-text-main);
154
- font-size: 12px;
154
+ font-size: 14px;
155
155
  font-weight: 750;
156
156
  letter-spacing: .01em;
157
157
  }
158
158
  .resource-live-section-icon {
159
159
  color: #10b981;
160
- font-size: 16px;
160
+ font-size: 18px;
161
161
  }
162
162
  .resource-live-state-dot {
163
- width: 7px;
164
- height: 7px;
163
+ width: 8px;
164
+ height: 8px;
165
165
  flex: 0 0 auto;
166
166
  border-radius: 999px;
167
167
  background: #10b981;
@@ -186,28 +186,28 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
186
186
  flex: 0 0 auto;
187
187
  border-radius: 999px;
188
188
  background: var(--color-surface);
189
- padding: 2px 7px;
189
+ padding: 3px 9px;
190
190
  color: var(--color-text-muted);
191
- font-size: 10.5px;
191
+ font-size: 12px;
192
192
  font-weight: 700;
193
193
  }
194
194
  .resource-live-muted {
195
195
  min-width: 0;
196
196
  overflow: hidden;
197
197
  color: var(--color-text-subtle);
198
- font-size: 10.5px;
198
+ font-size: 12px;
199
199
  text-overflow: ellipsis;
200
200
  white-space: nowrap;
201
201
  }
202
202
  .resource-vllm-summary-grid {
203
203
  display: flex;
204
204
  flex-wrap: wrap;
205
- gap: 5px 8px;
206
- margin-bottom: 8px;
205
+ gap: 6px 10px;
206
+ margin-bottom: 10px;
207
207
  color: var(--color-text-muted);
208
208
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
209
- font-size: 10.5px;
210
- line-height: 1.4;
209
+ font-size: 12.5px;
210
+ line-height: 1.45;
211
211
  }
212
212
  .resource-vllm-summary-grid span {
213
213
  white-space: nowrap;
@@ -228,20 +228,20 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
228
228
  color: #c4b5fd !important;
229
229
  }
230
230
  .resource-live-caption {
231
- margin-top: 7px;
231
+ margin-top: 9px;
232
232
  color: var(--color-text-subtle);
233
- font-size: 10px;
234
- line-height: 1.4;
233
+ font-size: 11.5px;
234
+ line-height: 1.45;
235
235
  }
236
236
  .resource-vllm-instances {
237
237
  display: grid;
238
- gap: 6px;
239
- margin-top: 8px;
238
+ gap: 8px;
239
+ margin-top: 10px;
240
240
  }
241
241
  .resource-vllm-instance {
242
242
  min-width: 0;
243
243
  border-top: 1px dashed var(--color-border-subtle);
244
- padding-top: 7px;
244
+ padding-top: 9px;
245
245
  }
246
246
  .resource-vllm-instance:first-child {
247
247
  border-top: 0;
@@ -252,14 +252,14 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
252
252
  min-width: 0;
253
253
  align-items: center;
254
254
  justify-content: space-between;
255
- gap: 7px;
255
+ gap: 8px;
256
256
  }
257
257
  .resource-vllm-instance-title {
258
258
  min-width: 0;
259
259
  overflow: hidden;
260
260
  color: var(--color-text-main);
261
261
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
262
- font-size: 10.5px;
262
+ font-size: 12.5px;
263
263
  font-weight: 700;
264
264
  text-overflow: ellipsis;
265
265
  white-space: nowrap;
@@ -269,19 +269,19 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
269
269
  overflow: hidden;
270
270
  border-radius: 999px;
271
271
  background: color-mix(in srgb, var(--color-brand-500) 8%, transparent);
272
- padding: 2px 6px;
272
+ padding: 3px 8px;
273
273
  color: var(--color-primary);
274
- font-size: 9.5px;
274
+ font-size: 11px;
275
275
  font-weight: 650;
276
276
  text-overflow: ellipsis;
277
277
  white-space: nowrap;
278
278
  }
279
279
  .resource-vllm-instance-sub {
280
- margin-top: 3px;
280
+ margin-top: 4px;
281
281
  overflow: hidden;
282
282
  color: var(--color-text-subtle);
283
283
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
284
- font-size: 9.5px;
284
+ font-size: 11.5px;
285
285
  text-overflow: ellipsis;
286
286
  white-space: nowrap;
287
287
  }
@@ -291,12 +291,12 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
291
291
  flex-wrap: nowrap;
292
292
  align-items: center;
293
293
  justify-content: space-between;
294
- gap: 5px;
295
- margin-top: 5px;
294
+ gap: 6px;
295
+ margin-top: 6px;
296
296
  overflow: hidden;
297
297
  color: var(--color-text-muted);
298
298
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
299
- font-size: 9.5px;
299
+ font-size: 11.5px;
300
300
  white-space: nowrap;
301
301
  }
302
302
  .resource-vllm-instance-stats span {
@@ -310,7 +310,7 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
310
310
  color: var(--color-text-subtle);
311
311
  }
312
312
  .resource-live-bar + .resource-live-bar {
313
- margin-top: 7px;
313
+ margin-top: 9px;
314
314
  }
315
315
  .resource-live-bar-head,
316
316
  .resource-live-value-row {
@@ -318,10 +318,10 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
318
318
  align-items: center;
319
319
  justify-content: space-between;
320
320
  gap: 8px;
321
- margin-bottom: 4px;
321
+ margin-bottom: 5px;
322
322
  color: var(--color-text-muted);
323
- font-size: 10px;
324
- line-height: 1.25;
323
+ font-size: 12px;
324
+ line-height: 1.3;
325
325
  }
326
326
  .resource-live-bar-head strong,
327
327
  .resource-live-value-row strong {
@@ -330,7 +330,7 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
330
330
  white-space: nowrap;
331
331
  }
332
332
  .resource-live-bar-track {
333
- height: 4px;
333
+ height: 5px;
334
334
  overflow: hidden;
335
335
  border-radius: 999px;
336
336
  background: color-mix(in srgb, var(--color-border) 58%, transparent);
@@ -350,40 +350,40 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
350
350
  .resource-live-bar-warning { --resource-bar-color: #f59e0b; }
351
351
  .resource-gpu-list {
352
352
  display: grid;
353
- gap: 9px;
353
+ gap: 11px;
354
354
  }
355
355
  .resource-gpu-row {
356
356
  min-width: 0;
357
357
  }
358
358
  .resource-gpu-row + .resource-gpu-row {
359
359
  border-top: 1px dashed var(--color-border-subtle);
360
- padding-top: 9px;
360
+ padding-top: 11px;
361
361
  }
362
362
  .resource-gpu-head {
363
363
  display: flex;
364
364
  align-items: center;
365
365
  justify-content: space-between;
366
366
  gap: 8px;
367
- margin-bottom: 7px;
367
+ margin-bottom: 8px;
368
368
  }
369
369
  .resource-gpu-name {
370
370
  color: var(--color-text-main);
371
- font-size: 10.5px;
371
+ font-size: 13px;
372
372
  font-weight: 750;
373
373
  }
374
374
  .resource-gpu-temp {
375
375
  display: inline-flex;
376
376
  align-items: center;
377
- gap: 2px;
377
+ gap: 3px;
378
378
  border-radius: 999px;
379
379
  background: color-mix(in srgb, #f59e0b 8%, transparent);
380
- padding: 2px 6px;
380
+ padding: 3px 8px;
381
381
  color: #b45309;
382
- font-size: 10px;
382
+ font-size: 12px;
383
383
  font-weight: 700;
384
384
  }
385
385
  .resource-gpu-temp .material-symbols-outlined {
386
- font-size: 13px;
386
+ font-size: 15px;
387
387
  }
388
388
  .resource-vllm-metric-guide {
389
389
  margin-top: 10px;
@@ -483,7 +483,7 @@ KV ${null===h?"—":`${h.toFixed(1)}%`} \xb7 Preempt ${l(x)} \xb7 Output ${d(b)}
483
483
  }
484
484
  @media (max-width: 760px) {
485
485
  .resource-monitor-sortable-host {
486
- min-width: min(340px, calc(100vw - 48px)) !important;
486
+ min-width: min(380px, calc(100vw - 48px)) !important;
487
487
  }
488
488
  .resource-vllm-guide-grid {
489
489
  grid-template-columns: repeat(2, minmax(0, 1fr));