@jheavenknows/bluerouter 5.3.88 → 5.4.2

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 (423) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +7 -7
  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/audit-proxy/page.js +2 -2
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  54. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  55. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  56. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  57. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  58. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  59. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  60. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  61. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  62. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  63. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  64. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  65. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  130. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  132. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  170. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  189. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  226. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  228. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  230. package/app/.next-cli-build/server/app/callback.html +1 -1
  231. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  232. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  233. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  234. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  235. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  236. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  237. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  238. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  239. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  240. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  241. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  242. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  243. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  244. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  246. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  247. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  248. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  249. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  250. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  251. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +7 -7
  252. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +7 -7
  253. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +7 -7
  254. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  256. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  257. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  258. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  259. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  262. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  263. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  264. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  266. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  267. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  268. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  269. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  272. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  273. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  274. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +6 -6
  277. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +6 -6
  278. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +6 -6
  279. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
  281. package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
  282. package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +6 -6
  283. package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
  284. package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  287. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  288. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  289. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  291. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  292. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  293. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  294. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
  297. package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +7 -7
  298. package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
  299. package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  301. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  302. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  303. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  304. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  307. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  308. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  309. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  311. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  312. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  313. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  314. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  317. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  318. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  319. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
  321. package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
  322. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +7 -7
  323. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
  324. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
  327. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +7 -7
  328. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
  329. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  331. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  333. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  334. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  337. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  338. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  339. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  341. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  342. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  343. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  344. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +6 -6
  347. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +6 -6
  348. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
  349. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/routing-topology.html +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/routing-topology.rsc +7 -7
  352. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology/__PAGE__.segment.rsc +7 -7
  353. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_full.segment.rsc +7 -7
  354. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_tree.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  357. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  358. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  359. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  362. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  363. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  364. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  367. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  368. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  369. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  372. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  373. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  374. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  377. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  378. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  379. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  381. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  382. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  383. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  384. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/index.html +1 -1
  386. package/app/.next-cli-build/server/app/index.rsc +5 -5
  387. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  388. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  389. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  391. package/app/.next-cli-build/server/app/landing.html +1 -1
  392. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  393. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  394. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  395. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  396. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  397. package/app/.next-cli-build/server/app/login.html +1 -1
  398. package/app/.next-cli-build/server/app/login.rsc +6 -6
  399. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  400. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  402. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  403. package/app/.next-cli-build/server/app-paths-manifest.json +7 -7
  404. package/app/.next-cli-build/server/chunks/3399.js +1 -1
  405. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  406. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  407. package/app/.next-cli-build/server/chunks/6992.js +1 -1
  408. package/app/.next-cli-build/server/chunks/9434.js +1 -1
  409. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  410. package/app/.next-cli-build/server/pages/404.html +1 -1
  411. package/app/.next-cli-build/server/pages/500.html +1 -1
  412. package/app/.next-cli-build/static/chunks/{5263-4c6ea3e6229ece76.js → 5263-880b83571dc88427.js} +1 -1
  413. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/{page-e5393bfb3717422a.js → page-43c2a844d20db416.js} +2 -2
  414. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/routing-topology/page-5e0ce0de52dcc940.js +1 -0
  415. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.82-to-5.3.83-5.3.83-20260823-202359 → upgrade-5.3.86-to-5.3.87-5.3.87-20260823-220012}/data.sqlite +0 -0
  416. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.83-to-5.3.84-5.3.84-20260823-203807 → upgrade-5.3.87-to-5.4.0-5.4.0-20260823-220512}/data.sqlite +0 -0
  417. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  418. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  419. package/app/package.json +1 -1
  420. package/package.json +1 -1
  421. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/routing-topology/page-ef8bd09b70e80d75.js +0 -1
  422. /package/app/.next-cli-build/static/{s5MidTiOLA6lh4mkP-NaB → 5Fp4_XJ3FoeJrP4zmMlRv}/_buildManifest.js +0 -0
  423. /package/app/.next-cli-build/static/{s5MidTiOLA6lh4mkP-NaB → 5Fp4_XJ3FoeJrP4zmMlRv}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (()=>{var a={};a.id=7226,a.ids=[7226],a.modules={1932:a=>{"use strict";a.exports=require("url")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},8128:a=>{"use strict";a.exports=require("next/dist/server/runtime-reacts.external.js")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},19771:a=>{"use strict";a.exports=require("process")},20503:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={MutableRequestCookiesAdapter:function(){return o},ReadonlyRequestCookiesError:function(){return j},RequestCookiesAdapter:function(){return k},appendMutableCookies:function(){return n},areCookiesMutableInCurrentPhase:function(){return q},createCookiesWithMutableAccessCheck:function(){return p},getModifiedCookieValues:function(){return m},responseCookiesToRequestCookies:function(){return s}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(91488),g=c(20445),h=c(29294),i=c(43014);class j extends Error{constructor(){super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options"),Object.defineProperty(this,"__NEXT_ERROR_CODE",{value:"E1180",enumerable:!1,configurable:!0})}static callable(){throw new j}}class k{static seal(a){return new Proxy(a,{get(a,b,c){switch(b){case"clear":case"delete":case"set":return j.callable;default:return g.ReflectAdapter.get(a,b,c)}}})}static fresh(a){return new Proxy(a,{get:(a,b,c)=>g.ReflectAdapter.get(a,b,c)})}}let l=Symbol.for("next.mutated.cookies");function m(a){let b=a[l];return b&&Array.isArray(b)&&0!==b.length?b:[]}function n(a,b){let c=m(b);if(0===c.length)return!1;let d=new f.ResponseCookies(a),e=d.getAll();for(let a of c)d.set(a);for(let a of e)d.set(a);return!0}class o{static wrap(a,b){let c=new f.ResponseCookies(new Headers);for(let b of a.getAll())c.set(b);let d=[],e=new Set,j=()=>{let a=h.workAsyncStorage.getStore();if(a&&(a.pathWasRevalidated=i.ActionDidRevalidateStaticAndDynamic),d=c.getAll().filter(a=>e.has(a.name)),b){let a=[];for(let b of d){let c=new f.ResponseCookies(new Headers);c.set(b),a.push(c.toString())}b(a)}},k=new Proxy(c,{get(a,b,c){switch(b){case l:return d;case"delete":return function(...b){e.add("string"==typeof b[0]?b[0]:b[0].name);try{return a.delete(...b),k}finally{j()}};case"set":return function(...b){e.add("string"==typeof b[0]?b[0]:b[0].name);try{return a.set(...b),k}finally{j()}};default:return g.ReflectAdapter.get(a,b,c)}}});return k}}function p(a){let b=new Proxy(a.mutableCookies,{get(c,d,e){switch(d){case"delete":return function(...d){return r(a,"cookies().delete"),c.delete(...d),b};case"set":return function(...d){return r(a,"cookies().set"),c.set(...d),b};default:return g.ReflectAdapter.get(c,d,e)}}});return b}function q(a){return"action"===a.phase}function r(a,b){if(!q(a))throw new j}function s(a){let b=new f.RequestCookies(new Headers);for(let c of a.getAll())b.set(c);return b}},21820:a=>{"use strict";a.exports=require("os")},27910:a=>{"use strict";a.exports=require("stream")},28354:a=>{"use strict";a.exports=require("util")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33873:a=>{"use strict";a.exports=require("path")},34631:a=>{"use strict";a.exports=require("tls")},38522:a=>{"use strict";a.exports=require("node:zlib")},38674:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\bluerouter\\\\src\\\\app\\\\(dashboard)\\\\dashboard\\\\routing-topology\\\\page.js\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\bluerouter\\src\\app\\(dashboard)\\dashboard\\routing-topology\\page.js","default")},41025:a=>{"use strict";a.exports=require("next/dist/server/app-render/dynamic-access-async-storage.external.js")},41204:a=>{"use strict";a.exports=require("string_decoder")},43014:(a,b)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var c={ActionDidNotRevalidate:function(){return e},ActionDidRevalidateDynamicOnly:function(){return g},ActionDidRevalidateStaticAndDynamic:function(){return f}};for(var d in c)Object.defineProperty(b,d,{enumerable:!0,get:c[d]});let e=0,f=1,g=2},46060:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external.js")},46293:a=>{"use strict";a.exports=require("sql.js")},51455:a=>{"use strict";a.exports=require("node:fs/promises")},53053:a=>{"use strict";a.exports=require("node:diagnostics_channel")},55511:a=>{"use strict";a.exports=require("crypto")},58620:(a,b,c)=>{Promise.resolve().then(c.bind(c,94876))},59171:(a,b,c)=>{"use strict";c.r(b),c.d(b,{__next_app__:()=>w,handler:()=>y,routeModule:()=>x});var d=c(21635),e=c(86315),f=c(1020),g=c(61287),h={};for(let a in g)0>["default","__next_app__","routeModule","handler"].indexOf(a)&&(h[a]=()=>g[a]);c.d(b,h);let i=(0,d.p)(()=>Promise.resolve().then(c.bind(c,32059))),j=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),k=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),l=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),m=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),n=(0,d.p)(()=>Promise.resolve().then(c.bind(c,30508))),o=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),p=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),q=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),r=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),s=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),t=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),u={children:["",{children:["(dashboard)",{children:["dashboard",{children:["routing-topology",{children:["__PAGE__",{},{page:[(0,d.p)(()=>Promise.resolve().then(c.bind(c,38674))),"D:\\bluerouter\\src\\app\\(dashboard)\\dashboard\\routing-topology\\page.js"]}]},{"global-error":[t,"next/dist/client/components/builtin/global-error.js"]},[]]},{"global-error":[s,"next/dist/client/components/builtin/global-error.js"]},[]]},{layout:[n,"D:\\bluerouter\\src\\app\\(dashboard)\\layout.js"],"global-error":[o,"next/dist/client/components/builtin/global-error.js"],"not-found":[p,"next/dist/client/components/builtin/not-found.js"],forbidden:[q,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[r,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]},{layout:[i,"D:\\bluerouter\\src\\app\\layout.js"],"global-error":[j,"next/dist/client/components/builtin/global-error.js"],"not-found":[k,"next/dist/client/components/builtin/not-found.js"],forbidden:[l,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[m,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]}.children,v=(0,e.H)({tree:u,page:"/(dashboard)/dashboard/routing-topology/page",pathname:"/dashboard/routing-topology",require:c,loadChunk:()=>Promise.resolve(),interopDefault:f.T}),w=v.__next_app__,x=v.routeModule,y=v.handler},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},64939:a=>{"use strict";a.exports=import("pg")},65244:(a,b,c)=>{Promise.resolve().then(c.bind(c,38674))},66136:a=>{"use strict";a.exports=require("timers")},73024:a=>{"use strict";a.exports=require("node:fs")},74075:a=>{"use strict";a.exports=require("zlib")},76760:a=>{"use strict";a.exports=require("node:path")},77598:a=>{"use strict";a.exports=require("node:crypto")},78474:a=>{"use strict";a.exports=require("node:events")},79428:a=>{"use strict";a.exports=require("buffer")},79748:a=>{"use strict";a.exports=require("fs/promises")},80099:a=>{"use strict";a.exports=require("node:sqlite")},81787:a=>{"use strict";a.exports=require("bun:sqlite")},87550:a=>{"use strict";a.exports=require("better-sqlite3")},89768:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"createDedupedByCallsiteServerErrorLoggerDev",{enumerable:!0,get:function(){return i}});let d=function(a){if(a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var b=e(void 0);if(b&&b.has(a))return b.get(a);var c={__proto__:null},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in a)if("default"!==f&&Object.prototype.hasOwnProperty.call(a,f)){var g=d?Object.getOwnPropertyDescriptor(a,f):null;g&&(g.get||g.set)?Object.defineProperty(c,f,g):c[f]=a[f]}return c.default=a,b&&b.set(a,c),c}(c(91986));function e(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(e=function(a){return a?c:b})(a)}let f={current:null},g="function"==typeof d.cache?d.cache:a=>a,h=console.warn;function i(a){return function(...b){h(a(...b))}}g(a=>{try{h(f.current)}finally{f.current=null}})},91645:a=>{"use strict";a.exports=require("net")},92305:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={isRequestApiAllowedInCurrentPhase:function(){return k},throwForSearchParamsAccessInUseCache:function(){return j},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return i}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(15693),g=c(19121),h=c(3295);function i(a,b){throw Object.defineProperty(new f.StaticGenBailoutError(`Route ${a} with \`dynamic = "error"\` couldn't be rendered statically because it used ${b}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E543",enumerable:!1,configurable:!0})}function j(a,b){let c=Object.defineProperty(Error(`Route ${a.route} used \`searchParams\` inside "use cache". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \`searchParams\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),"__NEXT_ERROR_CODE",{value:"E842",enumerable:!1,configurable:!0});throw Error.captureStackTrace(c,b),a.invalidDynamicUsageError??=c,c}function k(a){switch(a.phase){case"action":case"render":return!0;case"after":{let a=g.actionAsyncStorage.getStore();if(a&&(a.isAppRoute||a.isAction))return!0;let b=h.afterTaskAsyncStorage.getStore();if(b)return"action"===b.rootTaskSpawnPhase;return!1}}}},94735:a=>{"use strict";a.exports=require("events")},94876:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>w});var d=c(48249),e=c(67484),f=c(95145);let g=new Set(["coder","coder-fast","coder-high","translator"]);function h(a,b=1){let c=Number(a);return Number.isFinite(c)?c.toLocaleString("vi-VN",{minimumFractionDigits:b,maximumFractionDigits:b}):"—"}function i(a){if(!a)return"—";let b=new Date(a);return Number.isFinite(b.getTime())?b.toLocaleTimeString("vi-VN",{hour12:!1}):"—"}function j(a){return String(a||"").trim()}function k({name:a,className:b=""}){return(0,d.jsx)("span",{className:`material-symbols-outlined ${b}`,children:a})}function l({icon:a,label:b,value:c,detail:e,tone:f="blue"}){let g={blue:"bg-blue-500/10 text-blue-500",violet:"bg-violet-500/10 text-violet-500",cyan:"bg-cyan-500/10 text-cyan-500",emerald:"bg-emerald-500/10 text-emerald-500",amber:"bg-amber-500/10 text-amber-500"};return(0,d.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl ${g[f]||g.blue}`,children:(0,d.jsx)(k,{name:a,className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-text-subtle",children:b}),(0,d.jsx)("div",{className:"mt-0.5 truncate text-lg font-bold text-text-main",children:c})]})]}),e?(0,d.jsx)("div",{className:"mt-2 truncate text-[11px] text-text-muted",children:e}):null]})}function m({icon:a,label:b,value:c,suffix:e=""}){return(0,d.jsxs)("div",{className:"rounded-xl border border-border-subtle bg-background/60 px-3 py-2.5",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-subtle",children:[(0,d.jsx)(k,{name:a,className:"text-[14px]"}),b]}),(0,d.jsxs)("div",{className:"mt-1 text-sm font-semibold text-text-main",children:[c,e]})]})}function n({status:a="unknown",label:b}){let c={live:"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",stale:"bg-red-500/10 text-red-600 dark:text-red-400",partial:"bg-amber-500/10 text-amber-700 dark:text-amber-300",unknown:"bg-surface-2 text-text-muted"},e={live:"bg-emerald-500",stale:"bg-red-500",partial:"bg-amber-500",unknown:"bg-text-subtle"};return(0,d.jsxs)("span",{className:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold ${c[a]||c.unknown}`,children:[(0,d.jsx)("span",{className:`h-1.5 w-1.5 rounded-full ${e[a]||e.unknown}`}),b]})}function o(a=[]){if(!a.length)return"Chưa c\xf3 GPU telemetry";let b=[...new Set(a.map(a=>j(a.name)).filter(Boolean))];return 1===b.length?`${a.length}\xd7 ${b[0]}`:`${a.length} GPU \xb7 ${b.join(" + ")}`}function p(a,b,c){let d,e=a?.resourceServerId?b.get(a.resourceServerId):null,f=a?.resourceServerId?c.get(a.resourceServerId):null,g=function(a,b){if(!b)return null;let c=b.vllm?.instances||[];if(a?.vllmInstanceKey){let b=c.find(b=>b.key===a.vllmInstanceKey);if(b)return b}if(a?.port){let b=c.filter(b=>Number(b.port||0)===Number(a.port||0));if(1===b.length)return b[0]}return null}(a,f),h=!!(d=f?.lastStatusAt?new Date(f.lastStatusAt).getTime():0)&&Date.now()-d<=3e4&&!f?.lastError&&!!g&&!1!==g.metricsAvailable;return{server:e,liveServer:f,instance:g,online:h}}function q({backend:a,serverMap:b,liveMap:c}){let{server:e,liveServer:f,instance:g,online:i}=p(a,b,c),j=f?.gpus?.length?f.gpus:e?.gpus||[],l=a?.resourceMatch,r=g?.models?.length?g.models:a?.reportedModels||[];return(0,d.jsxs)("div",{className:"group relative overflow-hidden rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)] transition hover:-translate-y-0.5 hover:border-primary/30 hover:shadow-lg",children:[(0,d.jsx)("div",{className:"absolute inset-x-0 top-0 h-0.5 bg-gradient-to-r from-cyan-500 via-primary to-violet-500 opacity-70"}),(0,d.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,d.jsx)(k,{name:"memory",className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsxs)("div",{className:"font-mono text-sm font-bold text-text-main",children:[a?.host||"—",":",a?.port||"—"]}),a?.weight?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-violet-500/10 px-2 py-0.5 text-[10px] font-semibold text-violet-600 dark:text-violet-300",children:[(0,d.jsx)(k,{name:"balance",className:"text-[13px]"}),"weight ",a.weight]}):null]}),(0,d.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:a?.label||e?.name||"Real vLLM endpoint"})]})]}),(0,d.jsx)(n,{status:i?"live":"host"===l?"partial":"unmatched"===l?"unknown":"stale",label:i?"Live vLLM":"host"===l?"Host found \xb7 port unresolved":"unmatched"===l?"Not monitored":"Offline / stale"})]}),(0,d.jsxs)("div",{className:"mt-4 rounded-xl border border-border-subtle bg-surface-2/45 p-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-text-main",children:[(0,d.jsx)(k,{name:"dns",className:"text-[17px] text-primary"}),(0,d.jsx)("span",{className:"truncate",children:e?.name||"Chưa map Resource Monitor"})]}),(0,d.jsx)("div",{className:"mt-1 truncate font-mono text-[11px] text-text-muted",children:e?`${e.host}:${e.agentPort}`:"Kh\xf4ng t\xecm thấy server monitor khớp host"}),(0,d.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-text-muted",children:[(0,d.jsx)(k,{name:"developer_board",className:"text-[16px]"}),(0,d.jsx)("span",{className:"truncate",children:o(j)})]})]}),(0,d.jsxs)("div",{className:"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-4",children:[(0,d.jsx)(m,{icon:"speed",label:"Out tok/s",value:h(g?.outputTokensPerSecond)}),(0,d.jsx)(m,{icon:"play_circle",label:"Running",value:h(g?.running,0)}),(0,d.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:h(g?.waiting,0)}),(0,d.jsx)(m,{icon:"database",label:"KV cache",value:h(g?.kvCacheUsagePercent),suffix:g?.kvCacheUsagePercent==null?"":"%"})]}),r.length?(0,d.jsxs)("div",{className:"mt-3 flex items-start gap-2 text-[11px] text-text-subtle",children:[(0,d.jsx)(k,{name:"neurology",className:"mt-0.5 text-[15px]"}),(0,d.jsx)("span",{className:"min-w-0 break-all",children:r.join(", ")})]}):null]})}function r(a,b,c){let d=0,e=!1,f=0,g=0,h=null,i=0;for(let j of a||[]){let a=p(j,b,c);a.online&&(i+=1);let k=Number(a.instance?.outputTokensPerSecond);Number.isFinite(k)&&(d+=k,e=!0),f+=Number(a.instance?.running||0),g+=Number(a.instance?.waiting||0);let l=Number(a.instance?.kvCacheUsagePercent);Number.isFinite(l)&&(h=null===h?l:Math.max(h,l))}return{output:e?d:null,running:f,waiting:g,maxKv:h,online:i,total:(a||[]).length}}function s({target:a,provider:b,serverMap:c,liveMap:e,onEdit:f}){if(!b)return(0,d.jsx)("div",{className:"rounded-2xl border border-amber-500/25 bg-amber-500/5 p-5",children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-amber-500/10 text-amber-500",children:(0,d.jsx)(k,{name:"link_off",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:a.label||a.model||"Unknown target"}),(0,d.jsx)("div",{className:"mt-1 font-mono text-xs text-text-muted",children:a.model||"—"}),(0,d.jsx)("div",{className:"mt-3 text-xs leading-5 text-amber-700 dark:text-amber-300",children:a.unresolvedReason||"Kh\xf4ng map được target sang local compatible provider."})]})]})});let g="proxy"===b.routeType,i=r(b.backends||[],c,e),j=b.gateway?.resourceServerId?c.get(b.gateway.resourceServerId):null;return(0,d.jsxs)("div",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"relative overflow-hidden border-b border-border bg-gradient-to-r from-primary/8 via-surface to-cyan-500/8 px-5 py-4",children:[(0,d.jsx)("div",{className:"absolute -right-12 -top-16 h-40 w-40 rounded-full bg-primary/5 blur-2xl"}),(0,d.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-4",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,d.jsx)("div",{className:`flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl ${g?"bg-violet-500/10 text-violet-500":"bg-blue-500/10 text-blue-500"}`,children:(0,d.jsx)(k,{name:g?"account_tree":"memory",className:"text-[24px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("div",{className:"text-base font-bold text-text-main",children:b.name}),(0,d.jsx)("span",{className:"rounded-full bg-primary/10 px-2.5 py-1 font-mono text-[10px] font-semibold text-primary",children:b.prefix}),(0,d.jsxs)("span",{className:`inline-flex items-center gap-1 rounded-full px-2.5 py-1 text-[10px] font-semibold ${g?"bg-violet-500/10 text-violet-600 dark:text-violet-300":"bg-blue-500/10 text-blue-600 dark:text-blue-300"}`,children:[(0,d.jsx)(k,{name:g?"hub":"developer_board",className:"text-[13px]"}),g?"Proxy / Load Balancer":"Direct vLLM"]})]}),(0,d.jsx)("div",{className:"mt-1.5 truncate font-mono text-xs text-text-muted",title:b.baseUrl,children:b.baseUrl||"—"}),(0,d.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 text-[11px] text-text-subtle",children:[(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"model_training",className:"text-[14px]"}),a.model||"—"]}),b.topologyConfigured?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 text-emerald-600 dark:text-emerald-400",children:[(0,d.jsx)(k,{name:"verified",className:"text-[14px]"})," custom topology"]}):null]})]})]}),(0,d.jsxs)("button",{type:"button",onClick:()=>f(b),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2 text-xs font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:bg-primary/5 hover:text-primary",children:[(0,d.jsx)(k,{name:"tune",className:"text-[17px]"}),"Edit topology"]})]})]}),(0,d.jsx)("div",{className:"p-5",children:g?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"grid gap-3 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]",children:[(0,d.jsxs)("div",{className:"rounded-2xl border border-violet-500/20 bg-violet-500/5 p-4",children:[(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,d.jsx)(k,{name:"lan",className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-violet-500",children:"Ingress / routing hop"}),(0,d.jsxs)("div",{className:"mt-1 truncate font-mono text-sm font-bold text-text-main",children:[b.gateway?.host||b.endpoint?.host||"—",":",b.gateway?.port||b.endpoint?.port||"—"]}),(0,d.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:j?`${j.name} \xb7 monitored host`:"Nginx / proxy endpoint"})]})]}),(0,d.jsx)("div",{className:"mt-3 rounded-xl bg-background/70 px-3 py-2.5 text-[11px] leading-5 text-text-muted",children:"GPU/vLLM metrics của gateway n\xe0y kh\xf4ng được t\xednh l\xe0 compute. Telemetry b\xean dưới lấy từ c\xe1c real endpoint đ\xe3 khai b\xe1o."})]}),(0,d.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4 lg:grid-cols-2",children:[(0,d.jsx)(m,{icon:"speed",label:"Pool out",value:h(i.output),suffix:null==i.output?"":" tok/s"}),(0,d.jsx)(m,{icon:"memory",label:"Backends live",value:`${i.online}/${i.total}`}),(0,d.jsx)(m,{icon:"play_circle",label:"Running",value:h(i.running,0)}),(0,d.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:h(i.waiting,0)})]})]}),(0,d.jsxs)("div",{className:"my-4 flex items-center gap-3",children:[(0,d.jsx)("div",{className:"h-px flex-1 bg-border"}),(0,d.jsxs)("div",{className:"inline-flex items-center gap-2 rounded-full bg-surface-2 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-muted",children:[(0,d.jsx)(k,{name:"call_split",className:"text-[15px] text-primary"}),"Real vLLM backend pool"]}),(0,d.jsx)("div",{className:"h-px flex-1 bg-border"})]}),b.backends?.length?(0,d.jsx)("div",{className:"grid gap-3 xl:grid-cols-3",children:b.backends.map(a=>(0,d.jsx)(q,{backend:a,serverMap:c,liveMap:e},a.id))}):(0,d.jsx)("div",{className:"rounded-2xl border border-dashed border-amber-500/30 bg-amber-500/5 p-6 text-center text-sm text-amber-700 dark:text-amber-300",children:"Proxy chưa c\xf3 real vLLM endpoint. Bấm Edit topology để khai b\xe1o backend pool."})]}):b.backends?.[0]?(0,d.jsxs)("div",{className:"grid gap-4 lg:grid-cols-[220px_48px_minmax(0,1fr)] lg:items-center",children:[(0,d.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 p-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-blue-600 dark:text-blue-300",children:[(0,d.jsx)(k,{name:"route",className:"text-[18px]"}),"Provider Base URL"]}),(0,d.jsx)("div",{className:"mt-2 break-all font-mono text-xs text-text-main",children:b.baseUrl}),(0,d.jsx)("div",{className:"mt-2 text-[11px] leading-5 text-text-muted",children:"Direct mode: Base URL được coi l\xe0 ch\xednh vLLM compute endpoint."})]}),(0,d.jsx)("div",{className:"hidden items-center lg:flex",children:(0,d.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-blue-400/30 to-primary",children:[(0,d.jsx)("span",{className:"absolute -right-1 -top-[9px] material-symbols-outlined text-[18px] text-primary",children:"arrow_forward"}),(0,d.jsx)("span",{className:"absolute left-1/2 top-1/2 h-2 w-2 -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-full bg-primary"})]})}),(0,d.jsx)(q,{backend:b.backends[0],serverMap:c,liveMap:e})]}):(0,d.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Base URL kh\xf4ng parse được th\xe0nh vLLM endpoint."})})]})}function t(){return(0,d.jsx)("div",{className:"hidden items-center justify-center lg:flex",children:(0,d.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-primary/20 via-primary/70 to-primary",children:[(0,d.jsx)("span",{className:"absolute left-1/3 top-1/2 h-2 w-2 -translate-y-1/2 animate-pulse rounded-full bg-primary shadow-[0_0_0_5px_rgba(59,130,246,.08)]"}),(0,d.jsx)(k,{name:"arrow_forward",className:"absolute -right-1 -top-[9px] text-[18px] text-primary"})]})})}function u({combo:a,providerMap:b,serverMap:c,liveMap:e,onEdit:f}){let h;return(0,d.jsxs)("section",{className:"grid gap-3 rounded-[28px] border border-border bg-surface-2/25 p-3 shadow-[var(--shadow-soft)] lg:grid-cols-[220px_64px_minmax(0,1fr)] lg:items-stretch",children:[(0,d.jsxs)("div",{className:"relative overflow-hidden rounded-3xl border border-primary/20 bg-gradient-to-br from-primary/10 via-background to-cyan-500/5 p-5",children:[(0,d.jsx)("div",{className:"absolute -bottom-10 -right-8 h-28 w-28 rounded-full bg-primary/8 blur-2xl"}),(0,d.jsxs)("div",{className:"relative flex h-full min-h-[150px] flex-col justify-between",children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsx)("div",{className:"flex h-11 w-11 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"translator"===(h=j(a.name).toLowerCase())?"translate":"coder-fast"===h?"bolt":"coder-high"===h?"rocket_launch":"code_blocks",className:"text-[24px]"})}),g.has(j(a.name).toLowerCase())?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2.5 py-1 text-[10px] font-semibold text-primary",children:[(0,d.jsx)(k,{name:"star",className:"text-[13px]"})," main"]}):null]}),(0,d.jsx)("div",{className:"mt-4 text-[10px] font-semibold uppercase tracking-[0.16em] text-primary",children:"Model alias / Combo"}),(0,d.jsxs)("div",{className:"mt-1 text-2xl font-black tracking-tight text-text-main",children:[":",a.name]}),(0,d.jsxs)("div",{className:"mt-2 text-xs text-text-muted",children:[a.targets.length," configured upstream target",1===a.targets.length?"":"s"]})]}),(0,d.jsxs)("div",{className:"mt-5 flex items-center gap-2 text-[11px] text-text-subtle",children:[(0,d.jsx)(k,{name:"route",className:"text-[15px]"}),"Configured routing path"]})]})]}),(0,d.jsx)(t,{}),(0,d.jsx)("div",{className:"space-y-3",children:a.targets.length?a.targets.map(a=>{let g=a.providerId?b.get(a.providerId):null;return(0,d.jsx)(s,{target:a,provider:g,serverMap:c,liveMap:e,onEdit:f},a.id)}):(0,d.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-8 text-center text-sm text-text-muted",children:"Combo chưa c\xf3 upstream model."})})]})}function v({provider:a,topology:b,open:c,onClose:g,onSaved:h}){let[i,l]=(0,e.useState)("direct"),[m,n]=(0,e.useState)([]),[p,q]=(0,e.useState)(!1),[r,s]=(0,e.useState)(!1),[t,u]=(0,e.useState)(""),w=(0,e.useMemo)(()=>{let a=[];for(let c of b?.servers||[]){let b=o(c.gpus||[]);for(let d of c.vllmInstances||[])d.port&&a.push({key:`${c.id}::${d.key||d.port}`,host:c.host,port:Number(d.port),label:c.name||c.host,description:`${c.host}:${d.port} \xb7 ${b}${d.models?.length?` \xb7 ${d.models.join(", ")}`:""}`})}return a},[b]),x=(a,b)=>{n(c=>c.map(c=>c.id===a?{...c,...b}:c))},y=()=>{let a=new Set(m.map(a=>`${j(a.host).toLowerCase()}:${Number(a.port||0)}`)),b=w.find(b=>!a.has(`${b.host.toLowerCase()}:${b.port}`));n(a=>[...a,function(a={}){return{id:`endpoint-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,host:j(a.host),port:a.port?String(a.port):"",weight:void 0===a.weight||null===a.weight?"":String(a.weight),label:j(a.label)}}(b?{host:b.host,port:b.port,label:b.label}:{})])},z=async()=>{if(!a?.id||p)return;u("");let b=m.map(a=>({host:j(a.host),port:Number(a.port),weight:j(a.weight)?Number(a.weight):null,label:j(a.label)}));if("proxy"===i){if(!b.length)return void u("Proxy / Load Balancer cần \xedt nhất một real vLLM endpoint.");if(b.some(a=>!a.host||!Number.isInteger(a.port)||a.port<1||a.port>65535))return void u("Vui l\xf2ng nhập host v\xe0 port hợp lệ cho mọi vLLM endpoint.")}q(!0);try{let c=await fetch("/api/dashboard/routing-topology/config",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:a.id,routeType:i,realEndpoints:"proxy"===i?b:[]})}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error||"Kh\xf4ng lưu được topology config");await h?.(),g?.()}catch(a){u(a?.message||"Kh\xf4ng lưu được topology config")}finally{q(!1)}},A=async()=>{if(a?.id&&!r){s(!0),u("");try{let b=await fetch(`/api/dashboard/routing-topology/config?providerId=${encodeURIComponent(a.id)}`,{method:"DELETE"}),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error||"Kh\xf4ng reset được topology config");await h?.(),g?.()}catch(a){u(a?.message||"Kh\xf4ng reset được topology config")}finally{s(!1)}}};return a?(0,d.jsx)(f.default,{isOpen:c,onClose:g,title:`Routing topology \xb7 ${a.name}`,size:"xl",busy:p||r,footer:(0,d.jsxs)("div",{className:"flex w-full flex-wrap items-center justify-between gap-2",children:[(0,d.jsx)("div",{children:a.topologyConfigured?(0,d.jsxs)("button",{type:"button",onClick:A,disabled:p||r,className:"inline-flex items-center gap-2 rounded-xl px-3 py-2 text-sm font-semibold text-text-muted transition hover:bg-surface-2 hover:text-text-main disabled:opacity-50",children:[(0,d.jsx)(k,{name:"restart_alt",className:`text-[18px] ${r?"animate-spin":""}`}),"X\xf3a override"]}):null}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)("button",{type:"button",onClick:g,disabled:p||r,className:"rounded-xl border border-border bg-surface px-4 py-2 text-sm font-semibold text-text-muted transition hover:text-text-main disabled:opacity-50",children:"Hủy"}),(0,d.jsxs)("button",{type:"button",onClick:z,disabled:p||r,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-50",children:[(0,d.jsx)(k,{name:p?"progress_activity":"save",className:`text-[18px] ${p?"animate-spin":""}`}),"Lưu topology"]})]})]}),children:(0,d.jsxs)("div",{className:"space-y-5",children:[(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface-2/50 p-4",children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"link",className:"text-[21px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Provider Base URL"}),(0,d.jsx)("div",{className:"mt-1 break-all font-mono text-xs text-text-muted",children:a.baseUrl}),(0,d.jsx)("div",{className:"mt-2 text-xs leading-5 text-text-subtle",children:"Cấu h\xecnh tại đ\xe2y chỉ phục vụ sơ đồ v\xe0 telemetry. Kh\xf4ng sửa Provider, Combo, Nginx hay routing production."})]})]})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"mb-2 text-xs font-semibold uppercase tracking-[0.13em] text-text-subtle",children:"Base URL thực chất l\xe0"}),(0,d.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,d.jsx)("button",{type:"button",onClick:()=>l("direct"),className:`rounded-2xl border p-4 text-left transition ${"direct"===i?"border-blue-500/50 bg-blue-500/8 ring-2 ring-blue-500/10":"border-border bg-surface hover:border-blue-500/25"}`,children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-blue-500/10 text-blue-500",children:(0,d.jsx)(k,{name:"memory",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:"Direct vLLM"}),(0,d.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL ch\xednh l\xe0 vLLM endpoint. Hardware v\xe0 realtime metric lấy trực tiếp từ host/port n\xe0y."})]})]})}),(0,d.jsx)("button",{type:"button",onClick:()=>l("proxy"),className:`rounded-2xl border p-4 text-left transition ${"proxy"===i?"border-violet-500/50 bg-violet-500/8 ring-2 ring-violet-500/10":"border-border bg-surface hover:border-violet-500/25"}`,children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,d.jsx)(k,{name:"account_tree",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:"Proxy / Load Balancer"}),(0,d.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL l\xe0 Nginx/HAProxy/LB. Khai b\xe1o c\xe1c real vLLM endpoint ph\xeda sau để topology v\xe0 metric đ\xfang compute node."})]})]})})]})]}),"proxy"===i?(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Real vLLM endpoints"}),(0,d.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"C\xf3 thể chọn instance Resource Monitor đ\xe3 discover hoặc nhập IP:port thủ c\xf4ng. Weight chỉ l\xe0 metadata m\xf4 tả LB, kh\xf4ng phải % traffic cố định."})]}),(0,d.jsxs)("button",{type:"button",onClick:y,className:"inline-flex items-center gap-2 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2 text-xs font-semibold text-primary transition hover:bg-primary/10",children:[(0,d.jsx)(k,{name:"add_circle",className:"text-[17px]"}),"Th\xeam endpoint"]})]}),m.length?(0,d.jsx)("div",{className:"space-y-3",children:m.map((a,b)=>{let c;return(0,d.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-sm font-semibold text-text-main",children:[(0,d.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-500/10 text-xs font-bold text-emerald-600 dark:text-emerald-400",children:b+1}),"vLLM backend"]}),(0,d.jsx)("button",{type:"button",onClick:()=>n(b=>b.filter(b=>b.id!==a.id)),className:"flex h-8 w-8 items-center justify-center rounded-lg text-text-subtle transition hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a endpoint",children:(0,d.jsx)(k,{name:"delete",className:"text-[18px]"})})]}),(0,d.jsxs)("div",{className:"mt-3 grid gap-3 lg:grid-cols-2",children:[(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Chọn từ Resource Monitor"}),(0,d.jsxs)("select",{value:(c=w.find(b=>j(b.host).toLowerCase()===j(a.host).toLowerCase()&&Number(b.port)===Number(a.port)),c?.key||""),onChange:b=>((a,b)=>{if(!b)return;let c=w.find(a=>a.key===b);c&&x(a,{host:c.host,port:String(c.port),label:c.label})})(a.id,b.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition focus:border-primary",children:[(0,d.jsx)("option",{value:"",children:"Manual / giữ gi\xe1 trị b\xean dưới"}),w.map(a=>(0,d.jsxs)("option",{value:a.key,children:[a.label," \xb7 ",a.description]},a.key))]})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Nh\xe3n hiển thị"}),(0,d.jsx)("input",{value:a.label,onChange:b=>x(a.id,{label:b.target.value}),placeholder:"2\xd7 RTX 5090 TP2",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]}),(0,d.jsxs)("div",{className:"mt-3 grid gap-3 sm:grid-cols-[minmax(0,1fr)_140px_140px]",children:[(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Host / IP"}),(0,d.jsx)("input",{value:a.host,onChange:b=>x(a.id,{host:b.target.value}),placeholder:"172.16.0.71",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Port"}),(0,d.jsx)("input",{type:"number",min:"1",max:"65535",value:a.port,onChange:b=>x(a.id,{port:b.target.value}),placeholder:"8000",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Weight"}),(0,d.jsx)("input",{type:"number",min:"0",value:a.weight,onChange:b=>x(a.id,{weight:b.target.value}),placeholder:"50",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]})]},a.id)})}):(0,d.jsxs)("button",{type:"button",onClick:y,className:"flex w-full flex-col items-center justify-center rounded-2xl border border-dashed border-border bg-surface-2/30 px-6 py-10 text-center transition hover:border-primary/30 hover:bg-primary/5",children:[(0,d.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"add_link",className:"text-[25px]"})}),(0,d.jsx)("div",{className:"mt-3 text-sm font-semibold text-text-main",children:"Th\xeam real vLLM endpoint đầu ti\xean"}),(0,d.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chọn từ Resource Monitor hoặc nhập IP:port thủ c\xf4ng."})]})]}):(0,d.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 px-4 py-3 text-xs leading-5 text-blue-700 dark:text-blue-300",children:["Direct mode sẽ tiếp tục map ",(0,d.jsx)("span",{className:"font-mono font-semibold",children:a.baseUrl})," trực tiếp tới Resource Monitor host/port tương ứng."]}),t?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"error",className:"mt-0.5 text-[18px]"}),(0,d.jsx)("span",{children:t})]}):null]})}):null}function w(){let[a,b]=(0,e.useState)(null),[c,f]=(0,e.useState)(null),[g,m]=(0,e.useState)(!0),[n,o]=(0,e.useState)(!1),[p,q]=(0,e.useState)(""),[s,t]=(0,e.useState)(""),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(null),A=(0,e.useCallback)(async({force:a=!1}={})=>{t(""),a&&o(!0);try{let c=await fetch(`/api/dashboard/routing-topology${a?"?refresh=1":""}`,{cache:"no-store"}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error||"Kh\xf4ng tải được routing topology");return b(d),d}catch(a){return t(a?.message||"Kh\xf4ng tải được routing topology"),null}finally{m(!1),o(!1)}},[]),B=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/dashboard/routing-topology/live",{cache:"no-store"}),b=await a.json().catch(()=>({}));if(!a.ok)throw Error(b.error||"Kh\xf4ng tải được realtime telemetry");f(b),q("")}catch(a){q(a?.message||"Kh\xf4ng tải được realtime telemetry")}},[]),C=(0,e.useMemo)(()=>new Map((a?.providers||[]).map(a=>[a.id,a])),[a]),D=(0,e.useMemo)(()=>new Map((a?.servers||[]).map(a=>[a.id,a])),[a]),E=(0,e.useMemo)(()=>new Map((c?.servers||[]).map(a=>[a.id,a])),[c]),F=(0,e.useMemo)(()=>(a?.combos||[]).filter(a=>a.isFocus),[a]),G=w||!F.length?a?.combos||[]:F,H=(0,e.useMemo)(()=>{let b=new Set,c=[];for(let d of a?.providers||[])for(let a of d.backends||[]){let d=a.vllmInstanceKey&&a.resourceServerId?`${a.resourceServerId}::${a.vllmInstanceKey}`:`${j(a.host).toLowerCase()}:${Number(a.port||0)}`;!d||b.has(d)||(b.add(d),c.push(a))}return c},[a]),I=(0,e.useMemo)(()=>r(H,D,E),[H,D,E]),J=(0,e.useCallback)(async()=>{await Promise.all([A({force:!0}),B()])},[B,A]);return g?(0,d.jsxs)("div",{className:"flex min-h-[55vh] flex-col items-center justify-center text-sm text-text-muted",children:[(0,d.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"account_tree",className:"animate-pulse text-[30px]"})}),(0,d.jsx)("div",{className:"mt-4",children:"Đang compile routing topology..."})]}):s&&!a?(0,d.jsxs)("div",{className:"rounded-3xl border border-red-500/20 bg-red-500/10 p-6 text-red-600 dark:text-red-300",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 font-semibold",children:[(0,d.jsx)(k,{name:"error"})," Kh\xf4ng tải được Routing Topology"]}),(0,d.jsx)("div",{className:"mt-2 text-sm",children:s}),(0,d.jsxs)("button",{type:"button",onClick:()=>A({force:!0}),className:"mt-4 inline-flex items-center gap-2 rounded-xl bg-red-500 px-4 py-2 text-sm font-semibold text-white",children:[(0,d.jsx)(k,{name:"refresh",className:"text-[18px]"})," Thử lại"]})]}):(0,d.jsxs)("div",{className:"space-y-6",children:[(0,d.jsxs)("section",{className:"relative overflow-hidden rounded-[30px] border border-border bg-gradient-to-br from-primary/8 via-surface to-cyan-500/7 p-6 shadow-[var(--shadow-soft)]",children:[(0,d.jsx)("div",{className:"absolute -right-20 -top-24 h-64 w-64 rounded-full bg-primary/8 blur-3xl"}),(0,d.jsx)("div",{className:"absolute -bottom-24 left-1/3 h-48 w-48 rounded-full bg-cyan-500/6 blur-3xl"}),(0,d.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-5",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-4",children:[(0,d.jsx)("div",{className:"flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-primary text-white shadow-lg shadow-primary/15",children:(0,d.jsx)(k,{name:"account_tree",className:"text-[31px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("h1",{className:"text-2xl font-black tracking-tight text-text-main",children:"Routing Topology"}),(0,d.jsx)("span",{className:"rounded-full bg-red-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-red-600 dark:text-red-400",children:"Admin only"}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full bg-emerald-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-emerald-600 dark:text-emerald-400",children:[(0,d.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-500"})," Live telemetry"]})]}),(0,d.jsx)("p",{className:"mt-2 max-w-3xl text-sm leading-6 text-text-muted",children:"Combos → local compatible providers → Direct vLLM hoặc Proxy/LB → real vLLM compute. Topology tĩnh được cache; realtime metric cập nhật ri\xeang v\xe0 tự dừng khi tab bị ẩn."}),(0,d.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-[11px] text-text-subtle",children:[(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"fingerprint",className:"text-[14px]"})," rev ",a?.revision||"—"]}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"schema",className:"text-[14px]"})," topology ",i(a?.generatedAt)]}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"monitor_heart",className:"text-[14px]"})," telemetry ",i(c?.generatedAt)]})]})]})]}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(a?.combos||[]).length>F.length&&F.length?(0,d.jsxs)("button",{type:"button",onClick:()=>x(a=>!a),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2.5 text-sm font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:text-primary",children:[(0,d.jsx)(k,{name:w?"filter_alt":"view_list",className:"text-[18px]"}),w?"Chỉ combo ch\xednh":"Hiện tất cả combo"]}):null,(0,d.jsxs)("button",{type:"button",onClick:()=>A({force:!0}),disabled:n,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-60",children:[(0,d.jsx)(k,{name:"refresh",className:`text-[18px] ${n?"animate-spin":""}`}),"Rebuild topology"]})]})]})]}),s?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"warning",className:"mt-0.5 text-[18px]"})," ",s]}):null,p?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"wifi_off",className:"mt-0.5 text-[18px]"})," Realtime: ",p]}):null,a?.standby||c?.standby?(0,d.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-blue-500/20 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:[(0,d.jsx)(k,{name:"pause_circle",className:"mt-0.5 text-[18px]"})," Standby node: topology chỉ đọc snapshot đ\xe3 c\xf3 v\xe0 kh\xf4ng cho sửa override."]}):null,(0,d.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-5",children:[(0,d.jsx)(l,{icon:"layers",label:"Combos",value:a?.summary?.comboCount??0,detail:`${a?.summary?.focusComboCount??0} main combos`,tone:"blue"}),(0,d.jsx)(l,{icon:"hub",label:"Proxy / LB",value:a?.summary?.proxyProviderCount??0,detail:`${a?.summary?.localProviderCount??0} local providers`,tone:"violet"}),(0,d.jsx)(l,{icon:"memory",label:"vLLM backends",value:`${I.online}/${I.total}`,detail:"live / configured",tone:"emerald"}),(0,d.jsx)(l,{icon:"hourglass_top",label:"Running / Waiting",value:`${h(I.running,0)} / ${h(I.waiting,0)}`,detail:"unique compute endpoints",tone:"amber"}),(0,d.jsx)(l,{icon:"speed",label:"Aggregate out",value:`${h(I.output)}${null==I.output?"":" tok/s"}`,detail:"wall-clock vLLM throughput",tone:"cyan"})]}),(0,d.jsxs)("div",{className:"grid gap-3 lg:grid-cols-2",children:[(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,d.jsxs)("div",{className:"flex items-start gap-2",children:[(0,d.jsx)(k,{name:"route",className:"mt-0.5 text-[18px] text-primary"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"font-semibold text-text-main",children:"Configured routing:"})," đường nối m\xf4 tả cấu h\xecnh Combo/Provider. Đ\xe2y kh\xf4ng phải per-request trace, n\xean trang kh\xf4ng giả request cụ thể đ\xe3 đi qua edge n\xe0o."]})]})}),(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,d.jsxs)("div",{className:"flex items-start gap-2",children:[(0,d.jsx)(k,{name:"edit_square",className:"mt-0.5 text-[18px] text-violet-500"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"font-semibold text-text-main",children:"Topology override:"})," bấm ",(0,d.jsx)("span",{className:"font-semibold",children:"Edit topology"})," ngay tr\xean provider để khai b\xe1o Direct vLLM hoặc Proxy/LB v\xe0 real endpoints. Kh\xf4ng thay đổi `/dashboard/providers`."]})]})})]}),a?.summary?.unresolvedTargets||a?.summary?.unresolvedBackends?(0,d.jsxs)("div",{className:"flex items-start gap-3 rounded-2xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:[(0,d.jsx)(k,{name:"warning",className:"mt-0.5 text-[20px]"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold",children:"Topology cần admin kiểm tra"}),(0,d.jsxs)("div",{className:"mt-1 text-xs leading-5",children:[a?.summary?.unresolvedTargets||0," combo target chưa resolve provider \xb7 ",a?.summary?.unresolvedBackends||0," compute endpoint chưa map ch\xednh x\xe1c tới vLLM instance trong Resource Monitor."]})]})]}):null,(0,d.jsx)("div",{className:"space-y-4",children:G.length?G.map(a=>(0,d.jsx)(u,{combo:a,providerMap:C,serverMap:D,liveMap:E,onEdit:z},a.id||a.name)):(0,d.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-10 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 combo n\xe0o để hiển thị."})}),(0,d.jsx)(v,{provider:y,topology:a,open:!!y,onClose:()=>z(null),onSaved:J})]})}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,2430,8316,8946,402,5681,4404,6064,6328,8640],()=>b(b.s=59171));module.exports=c})();
1
+ (()=>{var a={};a.id=7226,a.ids=[7226],a.modules={1932:a=>{"use strict";a.exports=require("url")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},8128:a=>{"use strict";a.exports=require("next/dist/server/runtime-reacts.external.js")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},19771:a=>{"use strict";a.exports=require("process")},20503:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={MutableRequestCookiesAdapter:function(){return o},ReadonlyRequestCookiesError:function(){return j},RequestCookiesAdapter:function(){return k},appendMutableCookies:function(){return n},areCookiesMutableInCurrentPhase:function(){return q},createCookiesWithMutableAccessCheck:function(){return p},getModifiedCookieValues:function(){return m},responseCookiesToRequestCookies:function(){return s}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(91488),g=c(20445),h=c(29294),i=c(43014);class j extends Error{constructor(){super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options"),Object.defineProperty(this,"__NEXT_ERROR_CODE",{value:"E1180",enumerable:!1,configurable:!0})}static callable(){throw new j}}class k{static seal(a){return new Proxy(a,{get(a,b,c){switch(b){case"clear":case"delete":case"set":return j.callable;default:return g.ReflectAdapter.get(a,b,c)}}})}static fresh(a){return new Proxy(a,{get:(a,b,c)=>g.ReflectAdapter.get(a,b,c)})}}let l=Symbol.for("next.mutated.cookies");function m(a){let b=a[l];return b&&Array.isArray(b)&&0!==b.length?b:[]}function n(a,b){let c=m(b);if(0===c.length)return!1;let d=new f.ResponseCookies(a),e=d.getAll();for(let a of c)d.set(a);for(let a of e)d.set(a);return!0}class o{static wrap(a,b){let c=new f.ResponseCookies(new Headers);for(let b of a.getAll())c.set(b);let d=[],e=new Set,j=()=>{let a=h.workAsyncStorage.getStore();if(a&&(a.pathWasRevalidated=i.ActionDidRevalidateStaticAndDynamic),d=c.getAll().filter(a=>e.has(a.name)),b){let a=[];for(let b of d){let c=new f.ResponseCookies(new Headers);c.set(b),a.push(c.toString())}b(a)}},k=new Proxy(c,{get(a,b,c){switch(b){case l:return d;case"delete":return function(...b){e.add("string"==typeof b[0]?b[0]:b[0].name);try{return a.delete(...b),k}finally{j()}};case"set":return function(...b){e.add("string"==typeof b[0]?b[0]:b[0].name);try{return a.set(...b),k}finally{j()}};default:return g.ReflectAdapter.get(a,b,c)}}});return k}}function p(a){let b=new Proxy(a.mutableCookies,{get(c,d,e){switch(d){case"delete":return function(...d){return r(a,"cookies().delete"),c.delete(...d),b};case"set":return function(...d){return r(a,"cookies().set"),c.set(...d),b};default:return g.ReflectAdapter.get(c,d,e)}}});return b}function q(a){return"action"===a.phase}function r(a,b){if(!q(a))throw new j}function s(a){let b=new f.RequestCookies(new Headers);for(let c of a.getAll())b.set(c);return b}},21820:a=>{"use strict";a.exports=require("os")},27910:a=>{"use strict";a.exports=require("stream")},28354:a=>{"use strict";a.exports=require("util")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33873:a=>{"use strict";a.exports=require("path")},34631:a=>{"use strict";a.exports=require("tls")},38522:a=>{"use strict";a.exports=require("node:zlib")},38674:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\bluerouter\\\\src\\\\app\\\\(dashboard)\\\\dashboard\\\\routing-topology\\\\page.js\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\bluerouter\\src\\app\\(dashboard)\\dashboard\\routing-topology\\page.js","default")},41025:a=>{"use strict";a.exports=require("next/dist/server/app-render/dynamic-access-async-storage.external.js")},41204:a=>{"use strict";a.exports=require("string_decoder")},43014:(a,b)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var c={ActionDidNotRevalidate:function(){return e},ActionDidRevalidateDynamicOnly:function(){return g},ActionDidRevalidateStaticAndDynamic:function(){return f}};for(var d in c)Object.defineProperty(b,d,{enumerable:!0,get:c[d]});let e=0,f=1,g=2},46060:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external.js")},46293:a=>{"use strict";a.exports=require("sql.js")},51455:a=>{"use strict";a.exports=require("node:fs/promises")},53053:a=>{"use strict";a.exports=require("node:diagnostics_channel")},55511:a=>{"use strict";a.exports=require("crypto")},58620:(a,b,c)=>{Promise.resolve().then(c.bind(c,94876))},59171:(a,b,c)=>{"use strict";c.r(b),c.d(b,{__next_app__:()=>w,handler:()=>y,routeModule:()=>x});var d=c(21635),e=c(86315),f=c(1020),g=c(61287),h={};for(let a in g)0>["default","__next_app__","routeModule","handler"].indexOf(a)&&(h[a]=()=>g[a]);c.d(b,h);let i=(0,d.p)(()=>Promise.resolve().then(c.bind(c,32059))),j=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),k=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),l=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),m=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),n=(0,d.p)(()=>Promise.resolve().then(c.bind(c,30508))),o=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),p=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),q=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),r=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),s=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),t=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),u={children:["",{children:["(dashboard)",{children:["dashboard",{children:["routing-topology",{children:["__PAGE__",{},{page:[(0,d.p)(()=>Promise.resolve().then(c.bind(c,38674))),"D:\\bluerouter\\src\\app\\(dashboard)\\dashboard\\routing-topology\\page.js"]}]},{"global-error":[t,"next/dist/client/components/builtin/global-error.js"]},[]]},{"global-error":[s,"next/dist/client/components/builtin/global-error.js"]},[]]},{layout:[n,"D:\\bluerouter\\src\\app\\(dashboard)\\layout.js"],"global-error":[o,"next/dist/client/components/builtin/global-error.js"],"not-found":[p,"next/dist/client/components/builtin/not-found.js"],forbidden:[q,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[r,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]},{layout:[i,"D:\\bluerouter\\src\\app\\layout.js"],"global-error":[j,"next/dist/client/components/builtin/global-error.js"],"not-found":[k,"next/dist/client/components/builtin/not-found.js"],forbidden:[l,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[m,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]}.children,v=(0,e.H)({tree:u,page:"/(dashboard)/dashboard/routing-topology/page",pathname:"/dashboard/routing-topology",require:c,loadChunk:()=>Promise.resolve(),interopDefault:f.T}),w=v.__next_app__,x=v.routeModule,y=v.handler},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},64939:a=>{"use strict";a.exports=import("pg")},65244:(a,b,c)=>{Promise.resolve().then(c.bind(c,38674))},66136:a=>{"use strict";a.exports=require("timers")},73024:a=>{"use strict";a.exports=require("node:fs")},74075:a=>{"use strict";a.exports=require("zlib")},76760:a=>{"use strict";a.exports=require("node:path")},77598:a=>{"use strict";a.exports=require("node:crypto")},78474:a=>{"use strict";a.exports=require("node:events")},79428:a=>{"use strict";a.exports=require("buffer")},79748:a=>{"use strict";a.exports=require("fs/promises")},80099:a=>{"use strict";a.exports=require("node:sqlite")},81787:a=>{"use strict";a.exports=require("bun:sqlite")},87550:a=>{"use strict";a.exports=require("better-sqlite3")},89768:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"createDedupedByCallsiteServerErrorLoggerDev",{enumerable:!0,get:function(){return i}});let d=function(a){if(a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var b=e(void 0);if(b&&b.has(a))return b.get(a);var c={__proto__:null},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in a)if("default"!==f&&Object.prototype.hasOwnProperty.call(a,f)){var g=d?Object.getOwnPropertyDescriptor(a,f):null;g&&(g.get||g.set)?Object.defineProperty(c,f,g):c[f]=a[f]}return c.default=a,b&&b.set(a,c),c}(c(91986));function e(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(e=function(a){return a?c:b})(a)}let f={current:null},g="function"==typeof d.cache?d.cache:a=>a,h=console.warn;function i(a){return function(...b){h(a(...b))}}g(a=>{try{h(f.current)}finally{f.current=null}})},91645:a=>{"use strict";a.exports=require("net")},92305:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={isRequestApiAllowedInCurrentPhase:function(){return k},throwForSearchParamsAccessInUseCache:function(){return j},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return i}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(15693),g=c(19121),h=c(3295);function i(a,b){throw Object.defineProperty(new f.StaticGenBailoutError(`Route ${a} with \`dynamic = "error"\` couldn't be rendered statically because it used ${b}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E543",enumerable:!1,configurable:!0})}function j(a,b){let c=Object.defineProperty(Error(`Route ${a.route} used \`searchParams\` inside "use cache". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \`searchParams\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),"__NEXT_ERROR_CODE",{value:"E842",enumerable:!1,configurable:!0});throw Error.captureStackTrace(c,b),a.invalidDynamicUsageError??=c,c}function k(a){switch(a.phase){case"action":case"render":return!0;case"after":{let a=g.actionAsyncStorage.getStore();if(a&&(a.isAppRoute||a.isAction))return!0;let b=h.afterTaskAsyncStorage.getStore();if(b)return"action"===b.rootTaskSpawnPhase;return!1}}}},94735:a=>{"use strict";a.exports=require("events")},94876:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>w});var d=c(48249),e=c(67484),f=c(95145);let g=new Set(["coder","coder-fast","coder-high","translator"]);function h(a,b=1){let c=Number(a);return Number.isFinite(c)?c.toLocaleString("vi-VN",{minimumFractionDigits:b,maximumFractionDigits:b}):"—"}function i(a){if(!a)return"—";let b=new Date(a);return Number.isFinite(b.getTime())?b.toLocaleTimeString("vi-VN",{hour12:!1}):"—"}function j(a){return String(a||"").trim()}function k({name:a,className:b=""}){return(0,d.jsx)("span",{className:`material-symbols-outlined ${b}`,children:a})}function l({icon:a,label:b,value:c,detail:e,tone:f="blue"}){let g={blue:"bg-blue-500/10 text-blue-500",violet:"bg-violet-500/10 text-violet-500",cyan:"bg-cyan-500/10 text-cyan-500",emerald:"bg-emerald-500/10 text-emerald-500",amber:"bg-amber-500/10 text-amber-500"};return(0,d.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl ${g[f]||g.blue}`,children:(0,d.jsx)(k,{name:a,className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-text-subtle",children:b}),(0,d.jsx)("div",{className:"mt-0.5 truncate text-lg font-bold text-text-main",children:c})]})]}),e?(0,d.jsx)("div",{className:"mt-2 truncate text-[11px] text-text-muted",children:e}):null]})}function m({icon:a,label:b,value:c,suffix:e=""}){return(0,d.jsxs)("div",{className:"rounded-xl border border-border-subtle bg-background/60 px-3 py-2.5",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-subtle",children:[(0,d.jsx)(k,{name:a,className:"text-[14px]"}),b]}),(0,d.jsxs)("div",{className:"mt-1 text-sm font-semibold text-text-main",children:[c,e]})]})}function n({status:a="unknown",label:b}){let c={live:"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",stale:"bg-red-500/10 text-red-600 dark:text-red-400",partial:"bg-amber-500/10 text-amber-700 dark:text-amber-300",unknown:"bg-surface-2 text-text-muted"},e={live:"bg-emerald-500",stale:"bg-red-500",partial:"bg-amber-500",unknown:"bg-text-subtle"};return(0,d.jsxs)("span",{className:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold ${c[a]||c.unknown}`,children:[(0,d.jsx)("span",{className:`h-1.5 w-1.5 rounded-full ${e[a]||e.unknown}`}),b]})}function o(a=[]){if(!a.length)return"Chưa c\xf3 GPU telemetry";let b=[...new Set(a.map(a=>j(a.name)).filter(Boolean))];return 1===b.length?`${a.length}\xd7 ${b[0]}`:`${a.length} GPU \xb7 ${b.join(" + ")}`}function p(a,b,c){let d,e=a?.resourceServerId?b.get(a.resourceServerId):null,f=a?.resourceServerId?c.get(a.resourceServerId):null,g=function(a,b){if(!b)return null;let c=b.vllm?.instances||[];if(a?.vllmInstanceKey){let b=c.find(b=>b.key===a.vllmInstanceKey);if(b)return b}if(a?.port){let b=c.filter(b=>Number(b.port||0)===Number(a.port||0));if(1===b.length)return b[0]}return null}(a,f),h=!!(d=f?.lastStatusAt?new Date(f.lastStatusAt).getTime():0)&&Date.now()-d<=3e4&&!f?.lastError&&!!g&&!1!==g.metricsAvailable;return{server:e,liveServer:f,instance:g,online:h}}function q({backend:a,serverMap:b,liveMap:c}){let{server:e,liveServer:f,instance:g,online:i}=p(a,b,c),j=f?.gpus?.length?f.gpus:e?.gpus||[],l=a?.resourceMatch,r=g?.models?.length?g.models:a?.reportedModels||[];return(0,d.jsxs)("div",{className:"group relative overflow-hidden rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)] transition hover:-translate-y-0.5 hover:border-primary/30 hover:shadow-lg",children:[(0,d.jsx)("div",{className:"absolute inset-x-0 top-0 h-0.5 bg-gradient-to-r from-cyan-500 via-primary to-violet-500 opacity-70"}),(0,d.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,d.jsx)(k,{name:"memory",className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsxs)("div",{className:"font-mono text-sm font-bold text-text-main",children:[a?.host||"—",":",a?.port||"—"]}),a?.weight?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-violet-500/10 px-2 py-0.5 text-[10px] font-semibold text-violet-600 dark:text-violet-300",children:[(0,d.jsx)(k,{name:"balance",className:"text-[13px]"}),"weight ",a.weight]}):null]}),(0,d.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:a?.label||e?.name||"Real vLLM endpoint"})]})]}),(0,d.jsx)(n,{status:i?"live":"host"===l?"partial":"unmatched"===l?"unknown":"stale",label:i?"Live vLLM":"host"===l?"Host found \xb7 port unresolved":"unmatched"===l?"Not monitored":"Offline / stale"})]}),(0,d.jsxs)("div",{className:"mt-4 rounded-xl border border-border-subtle bg-surface-2/45 p-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-text-main",children:[(0,d.jsx)(k,{name:"dns",className:"text-[17px] text-primary"}),(0,d.jsx)("span",{className:"truncate",children:e?.name||"Chưa map Resource Monitor"})]}),(0,d.jsx)("div",{className:"mt-1 truncate font-mono text-[11px] text-text-muted",children:e?`${e.host}:${e.agentPort}`:"Kh\xf4ng t\xecm thấy server monitor khớp host"}),(0,d.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-text-muted",children:[(0,d.jsx)(k,{name:"developer_board",className:"text-[16px]"}),(0,d.jsx)("span",{className:"truncate",children:o(j)})]})]}),(0,d.jsxs)("div",{className:"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-4",children:[(0,d.jsx)(m,{icon:"speed",label:"Out tok/s",value:h(g?.outputTokensPerSecond)}),(0,d.jsx)(m,{icon:"play_circle",label:"Running",value:h(g?.running,0)}),(0,d.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:h(g?.waiting,0)}),(0,d.jsx)(m,{icon:"database",label:"KV cache",value:h(g?.kvCacheUsagePercent),suffix:g?.kvCacheUsagePercent==null?"":"%"})]}),r.length?(0,d.jsxs)("div",{className:"mt-3 flex items-start gap-2 text-[11px] text-text-subtle",children:[(0,d.jsx)(k,{name:"neurology",className:"mt-0.5 text-[15px]"}),(0,d.jsx)("span",{className:"min-w-0 break-all",children:r.join(", ")})]}):null]})}function r(a,b,c){let d=0,e=!1,f=0,g=0,h=null,i=0;for(let j of a||[]){let a=p(j,b,c);a.online&&(i+=1);let k=Number(a.instance?.outputTokensPerSecond);Number.isFinite(k)&&(d+=k,e=!0),f+=Number(a.instance?.running||0),g+=Number(a.instance?.waiting||0);let l=Number(a.instance?.kvCacheUsagePercent);Number.isFinite(l)&&(h=null===h?l:Math.max(h,l))}return{output:e?d:null,running:f,waiting:g,maxKv:h,online:i,total:(a||[]).length}}function s({target:a,provider:b,serverMap:c,liveMap:e,onEdit:f}){if(!b)return(0,d.jsx)("div",{className:"rounded-2xl border border-amber-500/25 bg-amber-500/5 p-5",children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-amber-500/10 text-amber-500",children:(0,d.jsx)(k,{name:"link_off",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:a.label||a.model||"Unknown target"}),(0,d.jsx)("div",{className:"mt-1 font-mono text-xs text-text-muted",children:a.model||"—"}),(0,d.jsx)("div",{className:"mt-3 text-xs leading-5 text-amber-700 dark:text-amber-300",children:a.unresolvedReason||"Kh\xf4ng map được target sang local compatible provider."})]})]})});let g="proxy"===b.routeType,i=r(b.backends||[],c,e),j=b.gateway?.resourceServerId?c.get(b.gateway.resourceServerId):null;return(0,d.jsxs)("div",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"relative overflow-hidden border-b border-border bg-gradient-to-r from-primary/8 via-surface to-cyan-500/8 px-5 py-4",children:[(0,d.jsx)("div",{className:"absolute -right-12 -top-16 h-40 w-40 rounded-full bg-primary/5 blur-2xl"}),(0,d.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-4",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,d.jsx)("div",{className:`flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl ${g?"bg-violet-500/10 text-violet-500":"bg-blue-500/10 text-blue-500"}`,children:(0,d.jsx)(k,{name:g?"account_tree":"memory",className:"text-[24px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("div",{className:"text-base font-bold text-text-main",children:b.name}),(0,d.jsx)("span",{className:"rounded-full bg-primary/10 px-2.5 py-1 font-mono text-[10px] font-semibold text-primary",children:b.prefix}),(0,d.jsxs)("span",{className:`inline-flex items-center gap-1 rounded-full px-2.5 py-1 text-[10px] font-semibold ${g?"bg-violet-500/10 text-violet-600 dark:text-violet-300":"bg-blue-500/10 text-blue-600 dark:text-blue-300"}`,children:[(0,d.jsx)(k,{name:g?"hub":"developer_board",className:"text-[13px]"}),g?"Proxy / Load Balancer":"Direct vLLM"]})]}),(0,d.jsx)("div",{className:"mt-1.5 truncate font-mono text-xs text-text-muted",title:b.baseUrl,children:b.baseUrl||"—"}),(0,d.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 text-[11px] text-text-subtle",children:[(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"model_training",className:"text-[14px]"}),a.model||"—"]}),b.topologyConfigured?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 text-emerald-600 dark:text-emerald-400",children:[(0,d.jsx)(k,{name:"verified",className:"text-[14px]"})," custom topology"]}):null]})]})]}),(0,d.jsxs)("button",{type:"button",onClick:()=>f(b),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2 text-xs font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:bg-primary/5 hover:text-primary",children:[(0,d.jsx)(k,{name:"tune",className:"text-[17px]"}),"Edit topology"]})]})]}),(0,d.jsx)("div",{className:"p-5",children:g?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"grid gap-3 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]",children:[(0,d.jsxs)("div",{className:"rounded-2xl border border-violet-500/20 bg-violet-500/5 p-4",children:[(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,d.jsx)(k,{name:"lan",className:"text-[22px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-violet-500",children:"Ingress / routing hop"}),(0,d.jsxs)("div",{className:"mt-1 truncate font-mono text-sm font-bold text-text-main",children:[b.gateway?.host||b.endpoint?.host||"—",":",b.gateway?.port||b.endpoint?.port||"—"]}),(0,d.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:j?`${j.name} \xb7 monitored host`:"Nginx / proxy endpoint"})]})]}),(0,d.jsx)("div",{className:"mt-3 rounded-xl bg-background/70 px-3 py-2.5 text-[11px] leading-5 text-text-muted",children:"GPU/vLLM metrics của gateway n\xe0y kh\xf4ng được t\xednh l\xe0 compute. Telemetry b\xean dưới lấy từ c\xe1c real endpoint đ\xe3 khai b\xe1o."})]}),(0,d.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4 lg:grid-cols-2",children:[(0,d.jsx)(m,{icon:"speed",label:"Pool out",value:h(i.output),suffix:null==i.output?"":" tok/s"}),(0,d.jsx)(m,{icon:"memory",label:"Backends live",value:`${i.online}/${i.total}`}),(0,d.jsx)(m,{icon:"play_circle",label:"Running",value:h(i.running,0)}),(0,d.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:h(i.waiting,0)})]})]}),(0,d.jsxs)("div",{className:"my-4 flex items-center gap-3",children:[(0,d.jsx)("div",{className:"h-px flex-1 bg-border"}),(0,d.jsxs)("div",{className:"inline-flex items-center gap-2 rounded-full bg-surface-2 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-muted",children:[(0,d.jsx)(k,{name:"call_split",className:"text-[15px] text-primary"}),"Real vLLM backend pool"]}),(0,d.jsx)("div",{className:"h-px flex-1 bg-border"})]}),b.backends?.length?(0,d.jsx)("div",{className:"grid gap-3 xl:grid-cols-3",children:b.backends.map(a=>(0,d.jsx)(q,{backend:a,serverMap:c,liveMap:e},a.id))}):(0,d.jsx)("div",{className:"rounded-2xl border border-dashed border-amber-500/30 bg-amber-500/5 p-6 text-center text-sm text-amber-700 dark:text-amber-300",children:"Proxy chưa c\xf3 real vLLM endpoint. Bấm Edit topology để khai b\xe1o backend pool."})]}):b.backends?.[0]?(0,d.jsxs)("div",{className:"grid gap-4 lg:grid-cols-[220px_48px_minmax(0,1fr)] lg:items-center",children:[(0,d.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 p-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-blue-600 dark:text-blue-300",children:[(0,d.jsx)(k,{name:"route",className:"text-[18px]"}),"Provider Base URL"]}),(0,d.jsx)("div",{className:"mt-2 break-all font-mono text-xs text-text-main",children:b.baseUrl}),(0,d.jsx)("div",{className:"mt-2 text-[11px] leading-5 text-text-muted",children:"Direct mode: Base URL được coi l\xe0 ch\xednh vLLM compute endpoint."})]}),(0,d.jsx)("div",{className:"hidden items-center lg:flex",children:(0,d.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-blue-400/30 to-primary",children:[(0,d.jsx)("span",{className:"absolute -right-1 -top-[9px] material-symbols-outlined text-[18px] text-primary",children:"arrow_forward"}),(0,d.jsx)("span",{className:"absolute left-1/2 top-1/2 h-2 w-2 -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-full bg-primary"})]})}),(0,d.jsx)(q,{backend:b.backends[0],serverMap:c,liveMap:e})]}):(0,d.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Base URL kh\xf4ng parse được th\xe0nh vLLM endpoint."})})]})}function t(){return(0,d.jsx)("div",{className:"hidden items-center justify-center lg:flex",children:(0,d.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-primary/20 via-primary/70 to-primary",children:[(0,d.jsx)("span",{className:"absolute left-1/3 top-1/2 h-2 w-2 -translate-y-1/2 animate-pulse rounded-full bg-primary shadow-[0_0_0_5px_rgba(59,130,246,.08)]"}),(0,d.jsx)(k,{name:"arrow_forward",className:"absolute -right-1 -top-[9px] text-[18px] text-primary"})]})})}function u({combo:a,providerMap:b,serverMap:c,liveMap:e,onEdit:f}){let h;return(0,d.jsxs)("section",{className:"grid gap-3 rounded-[28px] border border-border bg-surface-2/25 p-3 shadow-[var(--shadow-soft)] lg:grid-cols-[220px_64px_minmax(0,1fr)] lg:items-stretch",children:[(0,d.jsxs)("div",{className:"relative overflow-hidden rounded-3xl border border-primary/20 bg-gradient-to-br from-primary/10 via-background to-cyan-500/5 p-5",children:[(0,d.jsx)("div",{className:"absolute -bottom-10 -right-8 h-28 w-28 rounded-full bg-primary/8 blur-2xl"}),(0,d.jsxs)("div",{className:"relative flex h-full min-h-[150px] flex-col justify-between",children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsx)("div",{className:"flex h-11 w-11 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"translator"===(h=j(a.name).toLowerCase())?"translate":"coder-fast"===h?"bolt":"coder-high"===h?"rocket_launch":"code_blocks",className:"text-[24px]"})}),g.has(j(a.name).toLowerCase())?(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2.5 py-1 text-[10px] font-semibold text-primary",children:[(0,d.jsx)(k,{name:"star",className:"text-[13px]"})," main"]}):null]}),(0,d.jsx)("div",{className:"mt-4 text-[10px] font-semibold uppercase tracking-[0.16em] text-primary",children:"Model alias / Combo"}),(0,d.jsxs)("div",{className:"mt-1 text-2xl font-black tracking-tight text-text-main",children:[":",a.name]}),(0,d.jsxs)("div",{className:"mt-2 text-xs text-text-muted",children:[a.targets.length," configured upstream target",1===a.targets.length?"":"s"]})]}),(0,d.jsxs)("div",{className:"mt-5 flex items-center gap-2 text-[11px] text-text-subtle",children:[(0,d.jsx)(k,{name:"route",className:"text-[15px]"}),"Configured routing path"]})]})]}),(0,d.jsx)(t,{}),(0,d.jsx)("div",{className:"space-y-3",children:a.targets.length?a.targets.map(a=>{let g=a.providerId?b.get(a.providerId):null;return(0,d.jsx)(s,{target:a,provider:g,serverMap:c,liveMap:e,onEdit:f},a.id)}):(0,d.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-8 text-center text-sm text-text-muted",children:"Combo chưa c\xf3 upstream model."})})]})}function v({provider:a,topology:b,open:c,onClose:g,onSaved:h}){let[i,l]=(0,e.useState)("direct"),[m,n]=(0,e.useState)([]),[p,q]=(0,e.useState)(!1),[r,s]=(0,e.useState)(!1),[t,u]=(0,e.useState)(!1),[w,x]=(0,e.useState)(""),[y,z]=(0,e.useState)(""),A=(0,e.useMemo)(()=>{let a=[];for(let c of b?.servers||[]){let b=o(c.gpus||[]);for(let d of c.vllmInstances||[])d.port&&a.push({key:`${c.id}::${d.key||d.port}`,host:c.host,port:Number(d.port),label:c.name||c.host,description:`${c.host}:${d.port} \xb7 ${b}${d.models?.length?` \xb7 ${d.models.join(", ")}`:""}`})}return a},[b]),B=(a,b)=>{n(c=>c.map(c=>c.id===a?{...c,...b}:c))},C=()=>{let a=new Set(m.map(a=>`${j(a.host).toLowerCase()}:${Number(a.port||0)}`)),b=A.find(b=>!a.has(`${b.host.toLowerCase()}:${b.port}`));n(a=>[...a,function(a={}){return{id:`endpoint-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,host:j(a.host),port:a.port?String(a.port):"",weight:void 0===a.weight||null===a.weight?"":String(a.weight),label:j(a.label)}}(b?{host:b.host,port:b.port,label:b.label}:{})])},D=async()=>{if(!a?.id||p)return;x("");let b=m.map(a=>({host:j(a.host),port:Number(a.port),weight:j(a.weight)?Number(a.weight):null,label:j(a.label)}));if("proxy"===i){if(!b.length)return void x("Proxy / Load Balancer cần \xedt nhất một real vLLM endpoint.");if(b.some(a=>!a.host||!Number.isInteger(a.port)||a.port<1||a.port>65535))return void x("Vui l\xf2ng nhập host v\xe0 port hợp lệ cho mọi vLLM endpoint.")}q(!0);try{let c=await fetch("/api/dashboard/routing-topology/config",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:a.id,routeType:i,realEndpoints:"proxy"===i?b:[]})}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error||"Kh\xf4ng lưu được topology config");await h?.(),g?.()}catch(a){x(a?.message||"Kh\xf4ng lưu được topology config")}finally{q(!1)}},E=async()=>{if(a?.id&&!r&&!p){s(!0),x(""),z("");try{let b=await fetch(`/api/dashboard/routing-topology/config?providerId=${encodeURIComponent(a.id)}`,{method:"DELETE"}),c=await b.json().catch(()=>({}));if(!b.ok)throw Error(c.error||"Kh\xf4ng x\xf3a được topology config");let d=await h?.();if(null===d)throw Error("Đ\xe3 x\xf3a cấu h\xecnh nhưng kh\xf4ng dựng lại được sơ đồ - xem lỗi ở đầu trang.");z(c.deleted?"Đ\xe3 x\xf3a cấu h\xecnh topology. Sơ đồ b\xean dưới l\xe0 kết quả tự nhận diện mới nhất.":"Provider n\xe0y kh\xf4ng c\xf3 cấu h\xecnh n\xe0o để x\xf3a. Đ\xe3 nhận diện lại từ đầu.")}catch(a){x(a?.message||"Kh\xf4ng x\xf3a được topology config")}finally{s(!1)}}},F=async()=>{if(!t&&!p&&!r){u(!0),x(""),z("");try{let a=await h?.();if(null===a)throw Error("Kh\xf4ng dựng lại được sơ đồ - xem lỗi ở đầu trang.");z("Đ\xe3 nhận diện lại topology.")}catch(a){x(a?.message||"Kh\xf4ng nhận diện lại được topology")}finally{u(!1)}}};return a?(0,d.jsx)(f.default,{isOpen:c,onClose:g,title:`Routing topology \xb7 ${a.name}`,size:"xl",busy:p||r||t,footer:(0,d.jsxs)("div",{className:"flex w-full flex-wrap items-center justify-between gap-2",children:[(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsxs)("button",{type:"button",onClick:E,disabled:p||r||t||!a.topologyConfigured,title:a.topologyConfigured?"X\xf3a cấu h\xecnh đ\xe3 lưu của provider n\xe0y v\xe0 nhận diện lại":"Provider n\xe0y chưa c\xf3 cấu h\xecnh lưu — sơ đồ đang l\xe0 kết quả tự nhận diện",className:"inline-flex items-center gap-2 rounded-xl border border-red-500/30 px-3 py-2 text-sm font-semibold text-red-600 transition hover:bg-red-500/10 disabled:opacity-40 dark:text-red-400",children:[(0,d.jsx)(k,{name:"delete",className:`text-[18px] ${r?"animate-spin":""}`}),"X\xf3a topology"]}),(0,d.jsxs)("button",{type:"button",onClick:F,disabled:p||r||t,title:"Bỏ cache v\xe0 dựng lại sơ đồ từ Resource Monitor, kh\xf4ng đụng cấu h\xecnh đ\xe3 lưu",className:"inline-flex items-center gap-2 rounded-xl border border-border px-3 py-2 text-sm font-semibold text-text-muted transition hover:border-primary/30 hover:text-primary disabled:opacity-50",children:[(0,d.jsx)(k,{name:"restart_alt",className:`text-[18px] ${t?"animate-spin":""}`}),"Nhận diện lại"]})]}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)("button",{type:"button",onClick:g,disabled:p||r||t,className:"rounded-xl border border-border bg-surface px-4 py-2 text-sm font-semibold text-text-muted transition hover:text-text-main disabled:opacity-50",children:"Hủy"}),(0,d.jsxs)("button",{type:"button",onClick:D,disabled:p||r||t,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-50",children:[(0,d.jsx)(k,{name:p?"progress_activity":"save",className:`text-[18px] ${p?"animate-spin":""}`}),"Lưu topology"]})]})]}),children:(0,d.jsxs)("div",{className:"space-y-5",children:[(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface-2/50 p-4",children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"link",className:"text-[21px]"})}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Provider Base URL"}),(0,d.jsx)("div",{className:"mt-1 break-all font-mono text-xs text-text-muted",children:a.baseUrl}),(0,d.jsx)("div",{className:"mt-2 text-xs leading-5 text-text-subtle",children:"Cấu h\xecnh tại đ\xe2y chỉ phục vụ sơ đồ v\xe0 telemetry. Kh\xf4ng sửa Provider, Combo, Nginx hay routing production."})]})]})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"mb-2 text-xs font-semibold uppercase tracking-[0.13em] text-text-subtle",children:"Base URL thực chất l\xe0"}),(0,d.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,d.jsx)("button",{type:"button",onClick:()=>l("direct"),className:`rounded-2xl border p-4 text-left transition ${"direct"===i?"border-blue-500/50 bg-blue-500/8 ring-2 ring-blue-500/10":"border-border bg-surface hover:border-blue-500/25"}`,children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-blue-500/10 text-blue-500",children:(0,d.jsx)(k,{name:"memory",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:"Direct vLLM"}),(0,d.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL ch\xednh l\xe0 vLLM endpoint. Hardware v\xe0 realtime metric lấy trực tiếp từ host/port n\xe0y."})]})]})}),(0,d.jsx)("button",{type:"button",onClick:()=>l("proxy"),className:`rounded-2xl border p-4 text-left transition ${"proxy"===i?"border-violet-500/50 bg-violet-500/8 ring-2 ring-violet-500/10":"border-border bg-surface hover:border-violet-500/25"}`,children:(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,d.jsx)(k,{name:"account_tree",className:"text-[22px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold text-text-main",children:"Proxy / Load Balancer"}),(0,d.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL l\xe0 Nginx/HAProxy/LB. Khai b\xe1o c\xe1c real vLLM endpoint ph\xeda sau để topology v\xe0 metric đ\xfang compute node."})]})]})})]})]}),"proxy"===i?(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Real vLLM endpoints"}),(0,d.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"C\xf3 thể chọn instance Resource Monitor đ\xe3 discover hoặc nhập IP:port thủ c\xf4ng. Weight chỉ l\xe0 metadata m\xf4 tả LB, kh\xf4ng phải % traffic cố định."})]}),(0,d.jsxs)("button",{type:"button",onClick:C,className:"inline-flex items-center gap-2 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2 text-xs font-semibold text-primary transition hover:bg-primary/10",children:[(0,d.jsx)(k,{name:"add_circle",className:"text-[17px]"}),"Th\xeam endpoint"]})]}),m.length?(0,d.jsx)("div",{className:"space-y-3",children:m.map((a,b)=>{let c;return(0,d.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 text-sm font-semibold text-text-main",children:[(0,d.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-500/10 text-xs font-bold text-emerald-600 dark:text-emerald-400",children:b+1}),"vLLM backend"]}),(0,d.jsx)("button",{type:"button",onClick:()=>n(b=>b.filter(b=>b.id!==a.id)),className:"flex h-8 w-8 items-center justify-center rounded-lg text-text-subtle transition hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a endpoint",children:(0,d.jsx)(k,{name:"delete",className:"text-[18px]"})})]}),(0,d.jsxs)("div",{className:"mt-3 grid gap-3 lg:grid-cols-2",children:[(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Chọn từ Resource Monitor"}),(0,d.jsxs)("select",{value:(c=A.find(b=>j(b.host).toLowerCase()===j(a.host).toLowerCase()&&Number(b.port)===Number(a.port)),c?.key||""),onChange:b=>((a,b)=>{if(!b)return;let c=A.find(a=>a.key===b);c&&B(a,{host:c.host,port:String(c.port),label:c.label})})(a.id,b.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition focus:border-primary",children:[(0,d.jsx)("option",{value:"",children:"Manual / giữ gi\xe1 trị b\xean dưới"}),A.map(a=>(0,d.jsxs)("option",{value:a.key,children:[a.label," \xb7 ",a.description]},a.key))]})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Nh\xe3n hiển thị"}),(0,d.jsx)("input",{value:a.label,onChange:b=>B(a.id,{label:b.target.value}),placeholder:"2\xd7 RTX 5090 TP2",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]}),(0,d.jsxs)("div",{className:"mt-3 grid gap-3 sm:grid-cols-[minmax(0,1fr)_140px_140px]",children:[(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Host / IP"}),(0,d.jsx)("input",{value:a.host,onChange:b=>B(a.id,{host:b.target.value}),placeholder:"172.16.0.71",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Port"}),(0,d.jsx)("input",{type:"number",min:"1",max:"65535",value:a.port,onChange:b=>B(a.id,{port:b.target.value}),placeholder:"8000",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,d.jsxs)("label",{className:"block",children:[(0,d.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Weight"}),(0,d.jsx)("input",{type:"number",min:"0",value:a.weight,onChange:b=>B(a.id,{weight:b.target.value}),placeholder:"50",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]})]},a.id)})}):(0,d.jsxs)("button",{type:"button",onClick:C,className:"flex w-full flex-col items-center justify-center rounded-2xl border border-dashed border-border bg-surface-2/30 px-6 py-10 text-center transition hover:border-primary/30 hover:bg-primary/5",children:[(0,d.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"add_link",className:"text-[25px]"})}),(0,d.jsx)("div",{className:"mt-3 text-sm font-semibold text-text-main",children:"Th\xeam real vLLM endpoint đầu ti\xean"}),(0,d.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chọn từ Resource Monitor hoặc nhập IP:port thủ c\xf4ng."})]})]}):(0,d.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 px-4 py-3 text-xs leading-5 text-blue-700 dark:text-blue-300",children:["Direct mode sẽ tiếp tục map ",(0,d.jsx)("span",{className:"font-mono font-semibold",children:a.baseUrl})," trực tiếp tới Resource Monitor host/port tương ứng."]}),w?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"error",className:"mt-0.5 text-[18px]"}),(0,d.jsx)("span",{children:w})]}):null,y?(0,d.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-emerald-500/20 bg-emerald-500/10 px-4 py-3 text-sm text-emerald-600 dark:text-emerald-300",children:[(0,d.jsx)(k,{name:"check_circle",className:"mt-0.5 text-[18px]"}),(0,d.jsx)("span",{children:y})]}):null]})}):null}function w(){let[a,b]=(0,e.useState)(null),[c,f]=(0,e.useState)(null),[g,m]=(0,e.useState)(!0),[n,o]=(0,e.useState)(!1),[p,q]=(0,e.useState)(""),[s,t]=(0,e.useState)(""),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(null),A=(0,e.useCallback)(async({force:a=!1}={})=>{t(""),a&&o(!0);try{let c=await fetch(`/api/dashboard/routing-topology${a?"?refresh=1":""}`,{cache:"no-store"}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d.error||"Kh\xf4ng tải được routing topology");return b(d),d}catch(a){return t(a?.message||"Kh\xf4ng tải được routing topology"),null}finally{m(!1),o(!1)}},[]),B=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/dashboard/routing-topology/live",{cache:"no-store"}),b=await a.json().catch(()=>({}));if(!a.ok)throw Error(b.error||"Kh\xf4ng tải được realtime telemetry");f(b),q("")}catch(a){q(a?.message||"Kh\xf4ng tải được realtime telemetry")}},[]),C=(0,e.useMemo)(()=>new Map((a?.providers||[]).map(a=>[a.id,a])),[a]),D=(0,e.useMemo)(()=>new Map((a?.servers||[]).map(a=>[a.id,a])),[a]),E=(0,e.useMemo)(()=>new Map((c?.servers||[]).map(a=>[a.id,a])),[c]),F=(0,e.useMemo)(()=>(a?.combos||[]).filter(a=>a.isFocus),[a]),G=w||!F.length?a?.combos||[]:F,H=(0,e.useMemo)(()=>{let b=new Set,c=[];for(let d of a?.providers||[])for(let a of d.backends||[]){let d=a.vllmInstanceKey&&a.resourceServerId?`${a.resourceServerId}::${a.vllmInstanceKey}`:`${j(a.host).toLowerCase()}:${Number(a.port||0)}`;!d||b.has(d)||(b.add(d),c.push(a))}return c},[a]),I=(0,e.useMemo)(()=>r(H,D,E),[H,D,E]),J=(0,e.useCallback)(async()=>{let[a]=await Promise.all([A({force:!0}),B()]);return a},[B,A]),K=(0,e.useMemo)(()=>y?C.get(y.id)||y:null,[y,C]);return g?(0,d.jsxs)("div",{className:"flex min-h-[55vh] flex-col items-center justify-center text-sm text-text-muted",children:[(0,d.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,d.jsx)(k,{name:"account_tree",className:"animate-pulse text-[30px]"})}),(0,d.jsx)("div",{className:"mt-4",children:"Đang compile routing topology..."})]}):s&&!a?(0,d.jsxs)("div",{className:"rounded-3xl border border-red-500/20 bg-red-500/10 p-6 text-red-600 dark:text-red-300",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 font-semibold",children:[(0,d.jsx)(k,{name:"error"})," Kh\xf4ng tải được Routing Topology"]}),(0,d.jsx)("div",{className:"mt-2 text-sm",children:s}),(0,d.jsxs)("button",{type:"button",onClick:()=>A({force:!0}),className:"mt-4 inline-flex items-center gap-2 rounded-xl bg-red-500 px-4 py-2 text-sm font-semibold text-white",children:[(0,d.jsx)(k,{name:"refresh",className:"text-[18px]"})," Thử lại"]})]}):(0,d.jsxs)("div",{className:"space-y-6",children:[(0,d.jsxs)("section",{className:"relative overflow-hidden rounded-[30px] border border-border bg-gradient-to-br from-primary/8 via-surface to-cyan-500/7 p-6 shadow-[var(--shadow-soft)]",children:[(0,d.jsx)("div",{className:"absolute -right-20 -top-24 h-64 w-64 rounded-full bg-primary/8 blur-3xl"}),(0,d.jsx)("div",{className:"absolute -bottom-24 left-1/3 h-48 w-48 rounded-full bg-cyan-500/6 blur-3xl"}),(0,d.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-5",children:[(0,d.jsxs)("div",{className:"flex min-w-0 items-start gap-4",children:[(0,d.jsx)("div",{className:"flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-primary text-white shadow-lg shadow-primary/15",children:(0,d.jsx)(k,{name:"account_tree",className:"text-[31px]"})}),(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("h1",{className:"text-2xl font-black tracking-tight text-text-main",children:"Routing Topology"}),(0,d.jsx)("span",{className:"rounded-full bg-red-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-red-600 dark:text-red-400",children:"Admin only"}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full bg-emerald-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-emerald-600 dark:text-emerald-400",children:[(0,d.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-500"})," Live telemetry"]})]}),(0,d.jsx)("p",{className:"mt-2 max-w-3xl text-sm leading-6 text-text-muted",children:"Combos → local compatible providers → Direct vLLM hoặc Proxy/LB → real vLLM compute. Topology tĩnh được cache; realtime metric cập nhật ri\xeang v\xe0 tự dừng khi tab bị ẩn."}),(0,d.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-[11px] text-text-subtle",children:[(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"fingerprint",className:"text-[14px]"})," rev ",a?.revision||"—"]}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"schema",className:"text-[14px]"})," topology ",i(a?.generatedAt)]}),(0,d.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,d.jsx)(k,{name:"monitor_heart",className:"text-[14px]"})," telemetry ",i(c?.generatedAt)]})]})]})]}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(a?.combos||[]).length>F.length&&F.length?(0,d.jsxs)("button",{type:"button",onClick:()=>x(a=>!a),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2.5 text-sm font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:text-primary",children:[(0,d.jsx)(k,{name:w?"filter_alt":"view_list",className:"text-[18px]"}),w?"Chỉ combo ch\xednh":"Hiện tất cả combo"]}):null,(0,d.jsxs)("button",{type:"button",onClick:()=>A({force:!0}),disabled:n,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-60",children:[(0,d.jsx)(k,{name:"refresh",className:`text-[18px] ${n?"animate-spin":""}`}),"Rebuild topology"]})]})]})]}),s?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"warning",className:"mt-0.5 text-[18px]"})," ",s]}):null,p?(0,d.jsxs)("div",{className:"flex items-start gap-2 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:[(0,d.jsx)(k,{name:"wifi_off",className:"mt-0.5 text-[18px]"})," Realtime: ",p]}):null,a?.standby||c?.standby?(0,d.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-blue-500/20 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:[(0,d.jsx)(k,{name:"pause_circle",className:"mt-0.5 text-[18px]"})," Standby node: topology chỉ đọc snapshot đ\xe3 c\xf3 v\xe0 kh\xf4ng cho sửa override."]}):null,(0,d.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-5",children:[(0,d.jsx)(l,{icon:"layers",label:"Combos",value:a?.summary?.comboCount??0,detail:`${a?.summary?.focusComboCount??0} main combos`,tone:"blue"}),(0,d.jsx)(l,{icon:"hub",label:"Proxy / LB",value:a?.summary?.proxyProviderCount??0,detail:`${a?.summary?.localProviderCount??0} local providers`,tone:"violet"}),(0,d.jsx)(l,{icon:"memory",label:"vLLM backends",value:`${I.online}/${I.total}`,detail:"live / configured",tone:"emerald"}),(0,d.jsx)(l,{icon:"hourglass_top",label:"Running / Waiting",value:`${h(I.running,0)} / ${h(I.waiting,0)}`,detail:"unique compute endpoints",tone:"amber"}),(0,d.jsx)(l,{icon:"speed",label:"Aggregate out",value:`${h(I.output)}${null==I.output?"":" tok/s"}`,detail:"wall-clock vLLM throughput",tone:"cyan"})]}),(0,d.jsxs)("div",{className:"grid gap-3 lg:grid-cols-2",children:[(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,d.jsxs)("div",{className:"flex items-start gap-2",children:[(0,d.jsx)(k,{name:"route",className:"mt-0.5 text-[18px] text-primary"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"font-semibold text-text-main",children:"Configured routing:"})," đường nối m\xf4 tả cấu h\xecnh Combo/Provider. Đ\xe2y kh\xf4ng phải per-request trace, n\xean trang kh\xf4ng giả request cụ thể đ\xe3 đi qua edge n\xe0o."]})]})}),(0,d.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,d.jsxs)("div",{className:"flex items-start gap-2",children:[(0,d.jsx)(k,{name:"edit_square",className:"mt-0.5 text-[18px] text-violet-500"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"font-semibold text-text-main",children:"Topology override:"})," bấm ",(0,d.jsx)("span",{className:"font-semibold",children:"Edit topology"})," ngay tr\xean provider để khai b\xe1o Direct vLLM hoặc Proxy/LB v\xe0 real endpoints. Kh\xf4ng thay đổi `/dashboard/providers`."]})]})})]}),a?.summary?.unresolvedTargets||a?.summary?.unresolvedBackends?(0,d.jsxs)("div",{className:"flex items-start gap-3 rounded-2xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:[(0,d.jsx)(k,{name:"warning",className:"mt-0.5 text-[20px]"}),(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:"font-semibold",children:"Topology cần admin kiểm tra"}),(0,d.jsxs)("div",{className:"mt-1 text-xs leading-5",children:[a?.summary?.unresolvedTargets||0," combo target chưa resolve provider \xb7 ",a?.summary?.unresolvedBackends||0," compute endpoint chưa map ch\xednh x\xe1c tới vLLM instance trong Resource Monitor."]})]})]}):null,(0,d.jsx)("div",{className:"space-y-4",children:G.length?G.map(a=>(0,d.jsx)(u,{combo:a,providerMap:C,serverMap:D,liveMap:E,onEdit:z},a.id||a.name)):(0,d.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-10 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 combo n\xe0o để hiển thị."})}),(0,d.jsx)(v,{provider:K,topology:a,open:!!y,onClose:()=>z(null),onSaved:J})]})}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,2430,8316,8946,402,5681,4404,6064,6328,8640],()=>b(b.s=59171));module.exports=c})();