@jheavenknows/bluerouter 5.2.63 → 5.2.65

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 (457) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +9 -9
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/prerender-manifest.json +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js.nft.json +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page.js.nft.json +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +108 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  76. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  78. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  79. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  80. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  81. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  82. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  85. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  86. package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
  87. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
  88. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -6
  89. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  90. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  164. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  166. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  198. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  202. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js +1 -215
  213. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/resource-monitor/route.js +2 -216
  218. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  226. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  228. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  249. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  253. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  255. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  257. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  259. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  261. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  263. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  265. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  267. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  269. package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
  270. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  271. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  272. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  273. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  274. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  275. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  276. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  277. package/app/.next-cli-build/server/app/callback.html +1 -1
  278. package/app/.next-cli-build/server/app/callback.rsc +6 -6
  279. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
  280. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  281. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +6 -6
  282. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  283. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +7 -7
  284. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +7 -7
  285. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +7 -7
  286. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +2 -2
  287. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  288. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +7 -7
  289. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +7 -7
  290. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +7 -7
  291. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +2 -2
  292. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  294. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  295. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  296. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +2 -2
  297. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  298. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +8 -8
  299. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +8 -8
  300. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +8 -8
  301. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  302. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
  304. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +8 -8
  305. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
  306. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +2 -2
  307. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  308. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +8 -8
  309. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +8 -8
  310. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +8 -8
  311. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  312. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  313. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +7 -7
  314. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +7 -7
  315. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +7 -7
  316. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +2 -2
  317. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/combos.rsc +8 -8
  319. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +8 -8
  320. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +8 -8
  321. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  322. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
  324. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +8 -8
  325. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
  326. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  327. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  328. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +7 -7
  329. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +7 -7
  330. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +7 -7
  331. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +2 -2
  332. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  333. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +8 -8
  334. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +8 -8
  335. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +8 -8
  336. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  337. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  338. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +8 -8
  339. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +8 -8
  340. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +8 -8
  341. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  342. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  343. package/app/.next-cli-build/server/app/dashboard/profile.rsc +8 -8
  344. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +8 -8
  345. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +8 -8
  346. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  347. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  348. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +7 -7
  349. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +7 -7
  350. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +7 -7
  351. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
  352. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  353. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +7 -7
  354. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +7 -7
  355. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +7 -7
  356. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
  357. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  358. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +8 -8
  359. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +8 -8
  360. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +8 -8
  361. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  362. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  363. package/app/.next-cli-build/server/app/dashboard/providers.rsc +8 -8
  364. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +8 -8
  365. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +8 -8
  366. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  367. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  368. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +8 -8
  369. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +8 -8
  370. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +8 -8
  371. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  372. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  373. package/app/.next-cli-build/server/app/dashboard/quota.rsc +9 -9
  374. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +9 -9
  375. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +9 -9
  376. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  377. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  378. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +27 -23
  379. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +22 -17
  380. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +27 -23
  381. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +2 -2
  382. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  383. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +7 -7
  384. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +7 -7
  385. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +7 -7
  386. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  387. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  388. package/app/.next-cli-build/server/app/dashboard/skills.rsc +8 -8
  389. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +8 -8
  390. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +8 -8
  391. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  392. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  393. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +7 -7
  394. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +7 -7
  395. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
  396. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  397. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  398. package/app/.next-cli-build/server/app/dashboard/translator.rsc +8 -8
  399. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +8 -8
  400. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +8 -8
  401. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  402. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  403. package/app/.next-cli-build/server/app/dashboard/usage.rsc +8 -8
  404. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +8 -8
  405. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +8 -8
  406. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  407. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  408. package/app/.next-cli-build/server/app/dashboard.rsc +8 -8
  409. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +8 -8
  410. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +8 -8
  411. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  412. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  413. package/app/.next-cli-build/server/app/index.html +1 -1
  414. package/app/.next-cli-build/server/app/index.rsc +6 -6
  415. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +6 -6
  416. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
  417. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  418. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  419. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  420. package/app/.next-cli-build/server/app/landing.html +1 -1
  421. package/app/.next-cli-build/server/app/landing.rsc +6 -6
  422. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
  423. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  424. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +6 -6
  425. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  426. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  427. package/app/.next-cli-build/server/app/login.html +1 -1
  428. package/app/.next-cli-build/server/app/login.rsc +7 -7
  429. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
  430. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  431. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +7 -7
  432. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  433. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  434. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  435. package/app/.next-cli-build/server/app-paths-manifest.json +9 -9
  436. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  437. package/app/.next-cli-build/server/chunks/402.js +1 -1
  438. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  439. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  440. package/app/.next-cli-build/server/chunks/6759.js +1 -1
  441. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  442. package/app/.next-cli-build/server/chunks/7478.js +617 -0
  443. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  444. package/app/.next-cli-build/server/pages/404.html +1 -1
  445. package/app/.next-cli-build/server/pages/500.html +1 -1
  446. package/app/.next-cli-build/static/chunks/{5263-62c3ac90235b4dab.js → 5263-1b6ad5baa46745ff.js} +1 -1
  447. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/layout-72bbbf044b982b3d.js +72 -0
  448. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/template-f267b3715dc5cdd9.js +40 -0
  449. package/app/.next-cli-build/static/css/515412bc5cdf9cc2.css +1 -0
  450. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.2.62-to-5.2.63-5.2.63-20260813-144033/data.sqlite +0 -0
  451. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.2.63-to-5.2.64-5.2.64-20260813-155705/data.sqlite +0 -0
  452. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
  453. package/app/package.json +1 -1
  454. package/package.json +1 -1
  455. package/app/.next-cli-build/static/css/f79c29b028017e25.css +0 -1
  456. /package/app/.next-cli-build/static/{hU0bJzcql1Pc4g3hzZRSk → -Ekus-uCsaI18fBUeojkR}/_buildManifest.js +0 -0
  457. /package/app/.next-cli-build/static/{hU0bJzcql1Pc4g3hzZRSk → -Ekus-uCsaI18fBUeojkR}/_ssgManifest.js +0 -0
@@ -0,0 +1,617 @@
1
+ "use strict";exports.id=7478,exports.ids=[7478],exports.modules={60592:(a,b,c)=>{c.d(b,{P:()=>g,h:()=>h});var d=c(79646);function e(a){return`'${String(a??"").replace(/'/g,"'\"'\"'")}'`}function f(a,b,{input:c="",timeoutMs:e=12e4,env:g={}}={}){return new Promise(f=>{let h=(0,d.spawn)(a,b,{stdio:["pipe","pipe","pipe"],env:{...process.env,...g}}),i="",j="",k=!1,l=setTimeout(()=>{k||h.kill("SIGKILL")},e);h.stdout.on("data",a=>{i+=a.toString()}),h.stderr.on("data",a=>{j+=a.toString()}),h.on("error",a=>{k=!0,clearTimeout(l),f({ok:!1,code:-1,stdout:i,stderr:a.message})}),h.on("close",a=>{k||(k=!0,clearTimeout(l),f({ok:0===a,code:a,stdout:i,stderr:j}))}),c&&h.stdin.write(c),h.stdin.end()})}async function g(a,b={}){let c,d=`${a.sshUser||"root"}@${a.host}`,h=!0===a.useSudo&&"root"!==a.sshUser,i=String(b.sshPassword||""),j=String(b.sudoPassword||i),k=(c="/opt/bluerouter-resource-agent",`#!/usr/bin/env bash
2
+ set -euo pipefail
3
+ command -v python3 >/dev/null 2>&1 || { echo "python3 is required"; exit 1; }
4
+ mkdir -p ${e(c)}
5
+ cat > ${e(`${c}/agent.py`)} <<'PY_AGENT'
6
+ ${String.raw`#!/usr/bin/env python3
7
+ import json
8
+ import math
9
+ import os
10
+ import platform
11
+ import re
12
+ import shutil
13
+ import socket
14
+ import subprocess
15
+ import time
16
+ from concurrent.futures import ThreadPoolExecutor, as_completed
17
+ from datetime import datetime, timezone
18
+ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
19
+ from urllib.request import ProxyHandler, Request, build_opener
20
+
21
+ PORT = int(os.environ.get("AGENT_PORT", "19998"))
22
+ TOKEN = os.environ.get("AGENT_TOKEN", "")
23
+ AGENT_VERSION = "2.1.0"
24
+ NETWORK_SAMPLE = None
25
+ VLLM_DISCOVERY_AT = 0.0
26
+ VLLM_TARGETS = []
27
+ VLLM_DISCOVERY_MODE = "none"
28
+ VLLM_DISCOVERY_INTERVAL = 30.0
29
+ VLLM_MAX_DISCOVERY_PORTS = 64
30
+ HTTP_OPENER = build_opener(ProxyHandler({}))
31
+ MODEL_LABEL_RE = re.compile(r'(?:model_name|model)="((?:\\.|[^"\\])*)"')
32
+
33
+
34
+ def cmd(args, timeout=4):
35
+ try:
36
+ return subprocess.check_output(args, stderr=subprocess.DEVNULL, text=True, timeout=timeout).strip()
37
+ except Exception:
38
+ return ""
39
+
40
+
41
+ def cpu_times():
42
+ try:
43
+ values = [int(x) for x in open("/proc/stat").readline().split()[1:]]
44
+ return sum(values), values[3] + (values[4] if len(values) > 4 else 0)
45
+ except Exception:
46
+ return 0, 0
47
+
48
+
49
+ def cpu_status():
50
+ total1, idle1 = cpu_times()
51
+ time.sleep(0.15)
52
+ total2, idle2 = cpu_times()
53
+ delta = total2 - total1
54
+ usage = ((delta - (idle2 - idle1)) / delta * 100) if delta else 0
55
+ model = ""
56
+ try:
57
+ for line in open("/proc/cpuinfo", errors="ignore"):
58
+ if line.lower().startswith("model name"):
59
+ model = line.split(":", 1)[1].strip(); break
60
+ except Exception:
61
+ pass
62
+ load = os.getloadavg()
63
+ return {"usagePercent": round(usage, 2), "cores": os.cpu_count() or 1, "model": model,
64
+ "load1": round(load[0], 2), "load5": round(load[1], 2), "load15": round(load[2], 2)}
65
+
66
+
67
+ def memory_status():
68
+ values = {}
69
+ try:
70
+ for line in open("/proc/meminfo"):
71
+ key, raw = line.split(":", 1)
72
+ values[key] = int(raw.strip().split()[0]) * 1024
73
+ except Exception:
74
+ pass
75
+ total = values.get("MemTotal", 0)
76
+ available = values.get("MemAvailable", values.get("MemFree", 0))
77
+ used = max(0, total - available)
78
+ swap_total = values.get("SwapTotal", 0)
79
+ swap_used = max(0, swap_total - values.get("SwapFree", 0))
80
+ return {"totalBytes": total, "usedBytes": used, "availableBytes": available,
81
+ "usagePercent": round(used / total * 100, 2) if total else 0,
82
+ "swapTotalBytes": swap_total, "swapUsedBytes": swap_used}
83
+
84
+
85
+ def disk_status():
86
+ disks = []
87
+ seen = set()
88
+ try:
89
+ for line in open("/proc/mounts", errors="ignore"):
90
+ parts = line.split()
91
+ if len(parts) < 3: continue
92
+ device, mount, fs_type = parts[:3]
93
+ if not device.startswith("/dev/") or mount in seen: continue
94
+ seen.add(mount)
95
+ try:
96
+ usage = shutil.disk_usage(mount)
97
+ disks.append({"device": device, "mount": mount, "filesystem": fs_type,
98
+ "totalBytes": usage.total, "usedBytes": usage.used, "freeBytes": usage.free,
99
+ "usagePercent": round(usage.used / usage.total * 100, 2) if usage.total else 0})
100
+ except Exception: pass
101
+ except Exception: pass
102
+ if not disks:
103
+ usage = shutil.disk_usage("/")
104
+ disks.append({"device": "root", "mount": "/", "filesystem": "",
105
+ "totalBytes": usage.total, "usedBytes": usage.used, "freeBytes": usage.free,
106
+ "usagePercent": round(usage.used / usage.total * 100, 2) if usage.total else 0})
107
+ return disks
108
+
109
+
110
+ def read_network():
111
+ rows = {}; total_rx = total_tx = 0
112
+ try:
113
+ for line in open("/proc/net/dev").readlines()[2:]:
114
+ name, raw = line.split(":", 1); values = raw.split()
115
+ name = name.strip()
116
+ if name == "lo": continue
117
+ rx, tx = int(values[0]), int(values[8])
118
+ rows[name] = {"rxBytes": rx, "txBytes": tx}; total_rx += rx; total_tx += tx
119
+ except Exception: pass
120
+ return rows, total_rx, total_tx
121
+
122
+
123
+ def network_status():
124
+ global NETWORK_SAMPLE
125
+ interfaces, rx, tx = read_network(); current = time.time()
126
+ rx_rate = tx_rate = 0
127
+ if NETWORK_SAMPLE:
128
+ elapsed = max(0.001, current - NETWORK_SAMPLE[0])
129
+ rx_rate = max(0, (rx - NETWORK_SAMPLE[1]) / elapsed)
130
+ tx_rate = max(0, (tx - NETWORK_SAMPLE[2]) / elapsed)
131
+ NETWORK_SAMPLE = (current, rx, tx)
132
+ return {"rxBytes": rx, "txBytes": tx, "rxBytesPerSecond": round(rx_rate),
133
+ "txBytesPerSecond": round(tx_rate), "interfaces": interfaces}
134
+
135
+
136
+ def number(value):
137
+ try: return round(float(value), 2)
138
+ except Exception: return None
139
+
140
+
141
+ def gpu_status():
142
+ query = "index,uuid,name,driver_version,utilization.gpu,memory.total,memory.used,memory.free,temperature.gpu,power.draw,power.limit"
143
+ output = cmd(["nvidia-smi", "--query-gpu=" + query, "--format=csv,noheader,nounits"], 6)
144
+ gpus = []
145
+ for line in output.splitlines():
146
+ parts = [part.strip() for part in line.split(",")]
147
+ if len(parts) < 11: continue
148
+ index, uuid, name, driver, util, total, used, free, temp, power, limit = parts[:11]
149
+ total_n, used_n = number(total) or 0, number(used) or 0
150
+ gpus.append({"index": int(number(index) or 0), "uuid": uuid, "name": name, "driverVersion": driver,
151
+ "usagePercent": number(util) or 0, "memoryTotalMb": total_n, "memoryUsedMb": used_n,
152
+ "memoryFreeMb": number(free) or 0, "memoryUsagePercent": round(used_n / total_n * 100, 2) if total_n else 0,
153
+ "temperatureC": number(temp), "powerDrawW": number(power), "powerLimitW": number(limit)})
154
+ return gpus
155
+
156
+
157
+ def decode_proc_address(value, ipv6=False):
158
+ try:
159
+ raw = bytes.fromhex(value)
160
+ if ipv6:
161
+ raw = b"".join(raw[index:index + 4][::-1] for index in range(0, 16, 4))
162
+ return socket.inet_ntop(socket.AF_INET6, raw)
163
+ return socket.inet_ntop(socket.AF_INET, raw[::-1])
164
+ except Exception:
165
+ return "::1" if ipv6 else "127.0.0.1"
166
+
167
+
168
+ def listening_targets():
169
+ targets = {}
170
+ for filename, ipv6 in (("/proc/net/tcp", False), ("/proc/net/tcp6", True)):
171
+ try:
172
+ for line in open(filename, errors="ignore").readlines()[1:]:
173
+ parts = line.split()
174
+ if len(parts) < 4 or parts[3] != "0A":
175
+ continue
176
+ address_hex, port_hex = parts[1].split(":", 1)
177
+ port = int(port_hex, 16)
178
+ if port <= 0 or port == PORT:
179
+ continue
180
+ address = decode_proc_address(address_hex, ipv6)
181
+ if address == "0.0.0.0": address = "127.0.0.1"
182
+ if address == "::": address = "::1"
183
+ hosts = targets.setdefault(port, [])
184
+ if address not in hosts:
185
+ hosts.append(address)
186
+ except Exception:
187
+ pass
188
+ return targets
189
+
190
+
191
+ def metric_float(value):
192
+ try:
193
+ parsed = float(value)
194
+ return parsed if math.isfinite(parsed) else None
195
+ except Exception:
196
+ return None
197
+
198
+
199
+ def parse_vllm_metrics(text):
200
+ values = {
201
+ "running": [],
202
+ "waiting": [],
203
+ "kv": [],
204
+ "preemptions": [],
205
+ }
206
+ models = set()
207
+ found_vllm = False
208
+ aliases = {
209
+ "vllm:num_requests_running": "running",
210
+ "vllm:num_requests_waiting": "waiting",
211
+ "vllm:kv_cache_usage_perc": "kv",
212
+ "vllm:gpu_cache_usage_perc": "kv",
213
+ "vllm:num_preemptions_total": "preemptions",
214
+ "vllm:num_preemptions": "preemptions",
215
+ }
216
+ for raw_line in text.splitlines():
217
+ line = raw_line.strip()
218
+ if not line or line.startswith("#"):
219
+ continue
220
+ columns = line.split()
221
+ if len(columns) < 2:
222
+ continue
223
+ token = columns[0]
224
+ name = token.split("{", 1)[0]
225
+ if name.startswith("vllm:"):
226
+ found_vllm = True
227
+ key = aliases.get(name)
228
+ if not key:
229
+ continue
230
+ value = metric_float(columns[1])
231
+ if value is None:
232
+ continue
233
+ values[key].append(value)
234
+ match = MODEL_LABEL_RE.search(token)
235
+ if match:
236
+ models.add(match.group(1).replace('\\"', '"').replace('\\\\', '\\'))
237
+ if not found_vllm:
238
+ return None
239
+ running = sum(values["running"]) if values["running"] else 0
240
+ waiting = sum(values["waiting"]) if values["waiting"] else 0
241
+ kv = max(values["kv"]) if values["kv"] else None
242
+ preemptions = sum(values["preemptions"]) if values["preemptions"] else 0
243
+ return {
244
+ "running": round(running, 2),
245
+ "waiting": round(waiting, 2),
246
+ "kvCacheUsagePercent": round(kv * 100, 1) if kv is not None else None,
247
+ "preemptions": round(preemptions, 2),
248
+ "models": sorted(models),
249
+ }
250
+
251
+
252
+ def http_vllm_metrics(host, port, timeout=0.6):
253
+ url_host = "[%s]" % host if ":" in host else host
254
+ try:
255
+ request = Request(
256
+ "http://%s:%d/metrics" % (url_host, int(port)),
257
+ headers={"User-Agent": "BlueRouter-Resource-Agent/%s" % AGENT_VERSION},
258
+ )
259
+ with HTTP_OPENER.open(request, timeout=timeout) as response:
260
+ if response.status != 200:
261
+ return None
262
+ text = response.read(6 * 1024 * 1024).decode("utf-8", errors="ignore")
263
+ return parse_vllm_metrics(text)
264
+ except Exception:
265
+ return None
266
+
267
+
268
+ def probe_socket_target(port, hosts, timeout=0.45):
269
+ for host in hosts or ["127.0.0.1", "::1"]:
270
+ metrics = http_vllm_metrics(host, port, timeout)
271
+ if metrics is None:
272
+ continue
273
+ metrics.update({
274
+ "port": int(port),
275
+ "endpoint": "%s:%d" % (host, int(port)),
276
+ "metricsAvailable": True,
277
+ "discovery": "socket",
278
+ })
279
+ return metrics
280
+ return None
281
+
282
+
283
+ def scrape_socket_targets(targets, timeout):
284
+ if not targets:
285
+ return []
286
+ items = list(targets.items())
287
+ results = []
288
+ with ThreadPoolExecutor(max_workers=min(8, len(items))) as pool:
289
+ futures = {
290
+ pool.submit(probe_socket_target, port, hosts, timeout): (port, hosts)
291
+ for port, hosts in items
292
+ }
293
+ for future in as_completed(futures):
294
+ try:
295
+ result = future.result()
296
+ if result:
297
+ results.append(result)
298
+ except Exception:
299
+ pass
300
+ return sorted(results, key=lambda item: item.get("port", 0))
301
+
302
+
303
+ def docker_command_tokens(config):
304
+ tokens = []
305
+ for value in (config.get("Entrypoint"), config.get("Cmd")):
306
+ if isinstance(value, list):
307
+ tokens.extend(str(item) for item in value if item is not None)
308
+ elif value:
309
+ tokens.append(str(value))
310
+ return tokens
311
+
312
+
313
+ def docker_service_port(config):
314
+ tokens = docker_command_tokens(config)
315
+ for index, token in enumerate(tokens):
316
+ if token == "--port" and index + 1 < len(tokens):
317
+ try: return int(tokens[index + 1])
318
+ except Exception: pass
319
+ if token.startswith("--port="):
320
+ try: return int(token.split("=", 1)[1])
321
+ except Exception: pass
322
+ return 8000
323
+
324
+
325
+ def add_endpoint(endpoints, seen, host, port, kind):
326
+ try:
327
+ port = int(port)
328
+ except Exception:
329
+ return
330
+ host = str(host or "").strip()
331
+ if not host or port <= 0 or port > 65535:
332
+ return
333
+ key = (host, port)
334
+ if key in seen:
335
+ return
336
+ seen.add(key)
337
+ endpoints.append({"host": host, "port": port, "kind": kind})
338
+
339
+
340
+ def docker_vllm_targets():
341
+ if not shutil.which("docker"):
342
+ return []
343
+ container_ids = [item.strip() for item in cmd(["docker", "ps", "-q"], 5).splitlines() if item.strip()]
344
+ if not container_ids:
345
+ return []
346
+ raw = cmd(["docker", "inspect"] + container_ids[:128], 10)
347
+ if not raw:
348
+ return []
349
+ try:
350
+ containers = json.loads(raw)
351
+ except Exception:
352
+ return []
353
+
354
+ targets = []
355
+ for item in containers:
356
+ config = item.get("Config") or {}
357
+ host_config = item.get("HostConfig") or {}
358
+ network = item.get("NetworkSettings") or {}
359
+ name = str(item.get("Name") or "").lstrip("/")
360
+ image = str(config.get("Image") or "")
361
+ labels = config.get("Labels") or {}
362
+ tokens = docker_command_tokens(config)
363
+ identity = " ".join([
364
+ name,
365
+ image,
366
+ " ".join(tokens),
367
+ " ".join("%s=%s" % (key, value) for key, value in labels.items()),
368
+ ]).lower()
369
+ if "vllm" not in identity:
370
+ continue
371
+
372
+ service_port = docker_service_port(config)
373
+ internal_ports = {service_port}
374
+ for key in (config.get("ExposedPorts") or {}).keys():
375
+ try: internal_ports.add(int(str(key).split("/", 1)[0]))
376
+ except Exception: pass
377
+ for key in (network.get("Ports") or {}).keys():
378
+ try: internal_ports.add(int(str(key).split("/", 1)[0]))
379
+ except Exception: pass
380
+
381
+ endpoints = []
382
+ seen = set()
383
+ network_mode = str(host_config.get("NetworkMode") or "")
384
+
385
+ if network_mode == "host":
386
+ add_endpoint(endpoints, seen, "127.0.0.1", service_port, "host-network")
387
+
388
+ for port_key, bindings in (network.get("Ports") or {}).items():
389
+ if not bindings:
390
+ continue
391
+ for binding in bindings:
392
+ host_port = binding.get("HostPort")
393
+ host_ip = str(binding.get("HostIp") or "127.0.0.1")
394
+ if host_ip in ("0.0.0.0", "::", ""):
395
+ host_ip = "127.0.0.1"
396
+ add_endpoint(endpoints, seen, host_ip, host_port, "published")
397
+
398
+ for network_info in (network.get("Networks") or {}).values():
399
+ ip = str((network_info or {}).get("IPAddress") or "").strip()
400
+ if not ip:
401
+ continue
402
+ for internal_port in sorted(internal_ports):
403
+ add_endpoint(endpoints, seen, ip, internal_port, "container-ip")
404
+
405
+ add_endpoint(endpoints, seen, "127.0.0.1", service_port, "localhost-fallback")
406
+ targets.append({
407
+ "containerId": str(item.get("Id") or "")[:12],
408
+ "containerName": name or str(item.get("Id") or "")[:12],
409
+ "image": image,
410
+ "servicePort": service_port,
411
+ "endpoints": endpoints,
412
+ })
413
+
414
+ return targets
415
+
416
+
417
+ def probe_docker_target(target, timeout=0.7):
418
+ result = {
419
+ "containerId": target.get("containerId"),
420
+ "containerName": target.get("containerName"),
421
+ "image": target.get("image"),
422
+ "port": target.get("servicePort") or 8000,
423
+ "metricsAvailable": False,
424
+ "discovery": "docker",
425
+ "running": 0,
426
+ "waiting": 0,
427
+ "kvCacheUsagePercent": None,
428
+ "preemptions": 0,
429
+ "models": [],
430
+ }
431
+ for endpoint in target.get("endpoints") or []:
432
+ metrics = http_vllm_metrics(endpoint.get("host"), endpoint.get("port"), timeout)
433
+ if metrics is None:
434
+ continue
435
+ result.update(metrics)
436
+ result.update({
437
+ "port": int(endpoint.get("port") or target.get("servicePort") or 8000),
438
+ "endpoint": "%s:%d" % (endpoint.get("host"), int(endpoint.get("port"))),
439
+ "endpointKind": endpoint.get("kind"),
440
+ "metricsAvailable": True,
441
+ })
442
+ break
443
+ return result
444
+
445
+
446
+ def scrape_docker_targets(targets, timeout=0.7):
447
+ if not targets:
448
+ return []
449
+ results = []
450
+ with ThreadPoolExecutor(max_workers=min(8, len(targets))) as pool:
451
+ futures = [pool.submit(probe_docker_target, target, timeout) for target in targets]
452
+ for future in as_completed(futures):
453
+ try:
454
+ results.append(future.result())
455
+ except Exception:
456
+ pass
457
+ return sorted(results, key=lambda item: (item.get("containerName") or "", item.get("containerId") or ""))
458
+
459
+
460
+ def vllm_status():
461
+ global VLLM_DISCOVERY_AT, VLLM_TARGETS, VLLM_DISCOVERY_MODE
462
+ current = time.monotonic()
463
+ full_discovery = current - VLLM_DISCOVERY_AT >= VLLM_DISCOVERY_INTERVAL
464
+
465
+ if full_discovery:
466
+ docker_targets = docker_vllm_targets()
467
+ if docker_targets:
468
+ VLLM_TARGETS = docker_targets
469
+ VLLM_DISCOVERY_MODE = "docker"
470
+ instances = scrape_docker_targets(VLLM_TARGETS, 0.7)
471
+ else:
472
+ candidates = listening_targets()
473
+ ordered = sorted(
474
+ candidates.items(),
475
+ key=lambda item: (0 if 7000 <= item[0] <= 9999 else 1, item[0]),
476
+ )[:VLLM_MAX_DISCOVERY_PORTS]
477
+ VLLM_TARGETS = [
478
+ {"port": port, "hosts": hosts}
479
+ for port, hosts in ordered
480
+ ]
481
+ VLLM_DISCOVERY_MODE = "socket"
482
+ instances = scrape_socket_targets(
483
+ {target["port"]: target["hosts"] for target in VLLM_TARGETS},
484
+ 0.35,
485
+ )
486
+ VLLM_TARGETS = [
487
+ {"port": instance.get("port"), "hosts": [str(instance.get("endpoint") or "127.0.0.1").rsplit(":", 1)[0]]}
488
+ for instance in instances
489
+ if instance.get("port")
490
+ ]
491
+ VLLM_DISCOVERY_AT = current
492
+ elif VLLM_DISCOVERY_MODE == "docker":
493
+ instances = scrape_docker_targets(VLLM_TARGETS, 0.7)
494
+ elif VLLM_DISCOVERY_MODE == "socket":
495
+ instances = scrape_socket_targets(
496
+ {target["port"]: target.get("hosts") or ["127.0.0.1"] for target in VLLM_TARGETS},
497
+ 0.7,
498
+ )
499
+ else:
500
+ instances = []
501
+
502
+ available = [instance for instance in instances if instance.get("metricsAvailable") is not False]
503
+ running = sum(float(instance.get("running") or 0) for instance in available)
504
+ waiting = sum(float(instance.get("waiting") or 0) for instance in available)
505
+ preemptions = sum(float(instance.get("preemptions") or 0) for instance in available)
506
+ kv_values = [
507
+ float(instance["kvCacheUsagePercent"])
508
+ for instance in available
509
+ if instance.get("kvCacheUsagePercent") is not None
510
+ ]
511
+ return {
512
+ "instances": instances,
513
+ "summary": {
514
+ "instanceCount": len(instances),
515
+ "metricsInstanceCount": len(available),
516
+ "running": round(running, 2),
517
+ "waiting": round(waiting, 2),
518
+ "kvCacheUsagePercent": round(max(kv_values), 1) if kv_values else None,
519
+ "preemptions": round(preemptions, 2),
520
+ },
521
+ "discovery": VLLM_DISCOVERY_MODE,
522
+ "discoveryIntervalSeconds": int(VLLM_DISCOVERY_INTERVAL),
523
+ }
524
+
525
+
526
+ def status():
527
+ uptime = 0
528
+ try: uptime = float(open("/proc/uptime").read().split()[0])
529
+ except Exception: pass
530
+ os_name = cmd(["sh", "-c", ". /etc/os-release 2>/dev/null; printf '%s' \"$PRETTY_NAME\""]) or platform.platform()
531
+ with ThreadPoolExecutor(max_workers=2) as pool:
532
+ gpu_future = pool.submit(gpu_status)
533
+ vllm_future = pool.submit(vllm_status)
534
+ gpus = gpu_future.result()
535
+ vllm = vllm_future.result()
536
+ return {"ok": True, "agentVersion": AGENT_VERSION, "hostname": platform.node(), "os": os_name, "kernel": platform.release(),
537
+ "uptimeSeconds": round(uptime), "cpu": cpu_status(), "memory": memory_status(), "disks": disk_status(),
538
+ "network": network_status(), "gpus": gpus, "vllm": vllm,
539
+ "updatedAt": datetime.now(timezone.utc).isoformat()}
540
+
541
+
542
+ class Handler(BaseHTTPRequestHandler):
543
+ def send_json(self, code, payload):
544
+ body = json.dumps(payload, ensure_ascii=False).encode()
545
+ self.send_response(code); self.send_header("Content-Type", "application/json; charset=utf-8")
546
+ self.send_header("Cache-Control", "no-store"); self.send_header("Content-Length", str(len(body)))
547
+ self.end_headers(); self.wfile.write(body)
548
+ def authorized(self):
549
+ return (not TOKEN) or self.headers.get("Authorization", "") == "Bearer " + TOKEN
550
+ def do_GET(self):
551
+ if self.path == "/health": return self.send_json(200, {"ok": True, "agentVersion": AGENT_VERSION})
552
+ if self.path != "/status": return self.send_json(404, {"ok": False, "error": "not_found"})
553
+ if not self.authorized(): return self.send_json(401, {"ok": False, "error": "unauthorized"})
554
+ try: self.send_json(200, status())
555
+ except Exception as error: self.send_json(500, {"ok": False, "error": str(error)})
556
+ def log_message(self, fmt, *args): pass
557
+
558
+
559
+ if __name__ == "__main__":
560
+ ThreadingHTTPServer(("0.0.0.0", PORT), Handler).serve_forever()
561
+ `}
562
+ PY_AGENT
563
+ chmod 700 ${e(`${c}/agent.py`)}
564
+ cat > /etc/systemd/system/bluerouter-resource-agent.service <<'SERVICE'
565
+ [Unit]
566
+ Description=BlueRouter Linux Resource Monitor Agent
567
+ After=network.target
568
+
569
+ [Service]
570
+ Type=simple
571
+ Environment="AGENT_PORT=${Number(a.agentPort)}"
572
+ Environment="AGENT_TOKEN=${a.agentToken}"
573
+ ExecStart=/usr/bin/python3 ${c}/agent.py
574
+ Restart=always
575
+ RestartSec=3
576
+ NoNewPrivileges=true
577
+
578
+ [Install]
579
+ WantedBy=multi-user.target
580
+ SERVICE
581
+ systemctl daemon-reload
582
+ systemctl enable bluerouter-resource-agent
583
+ systemctl restart bluerouter-resource-agent
584
+ if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q "Status: active"; then
585
+ ufw allow ${Number(a.agentPort)}/tcp >/dev/null || true
586
+ fi
587
+ if command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
588
+ firewall-cmd --permanent --add-port=${Number(a.agentPort)}/tcp >/dev/null || true
589
+ firewall-cmd --reload >/dev/null || true
590
+ fi
591
+ systemctl is-active bluerouter-resource-agent
592
+ python3 - <<'PY_VERIFY'
593
+ import os
594
+ import sys
595
+ import time
596
+ from urllib.request import Request, urlopen
597
+
598
+ port = os.environ.get("AGENT_PORT", "${Number(a.agentPort)}")
599
+ token = os.environ.get("AGENT_TOKEN", "${a.agentToken}")
600
+ url = "http://127.0.0.1:%s/status" % port
601
+ for _ in range(20):
602
+ try:
603
+ req = Request(url, headers={"Authorization": "Bearer " + token})
604
+ with urlopen(req, timeout=3) as res:
605
+ if res.status == 200:
606
+ payload = res.read().decode("utf-8", errors="ignore")
607
+ if '"agentVersion": "2.1.0"' in payload:
608
+ print("Agent local token + Docker-aware vLLM monitor check: ok")
609
+ sys.exit(0)
610
+ except Exception:
611
+ time.sleep(0.5)
612
+ print("Agent local token + Docker-aware vLLM monitor check: failed", file=sys.stderr)
613
+ sys.exit(1)
614
+ PY_VERIFY
615
+ echo "BlueRouter Resource Agent v2.1.0 installed on port ${Number(a.agentPort)}"
616
+ `),l=h?`${j}
617
+ ${k}`:k,m=["-p",String(a.sshPort||22),"-o","StrictHostKeyChecking=accept-new","-o","ConnectTimeout=12",d,h?"sudo -S -p '' bash -s":"bash -s"];return i?f("sshpass",["-e","ssh","-o","PreferredAuthentications=password,keyboard-interactive","-o","PubkeyAuthentication=no","-o","NumberOfPasswordPrompts=1",...m],{input:l,env:{SSHPASS:i}}):f("ssh",m,{input:l})}async function h(a){let b=await fetch(`http://${a.host}:${a.agentPort}/status`,{headers:{Authorization:`Bearer ${a.agentToken}`},cache:"no-store",signal:AbortSignal.timeout(7e3)});if(!b.ok){let a=await b.text().catch(()=>"");if(401===b.status)throw Error("Agent returned HTTP 401: token dashboard kh\xf4ng khớp với token agent. H\xe3y c\xe0i lại agent từ n\xfat sửa server.");throw Error(`Agent returned HTTP ${b.status}${a?`: ${a.slice(0,200)}`:""}`)}return b.json()}},62763:(a,b,c)=>{c.d(b,{Jc:()=>r,NY:()=>w,Q1:()=>s,WR:()=>v,X_:()=>u,gX:()=>t});var d=c(77598),e=c.n(d),f=c(51455),g=c.n(f),h=c(76760),i=c.n(h),j=c(49120);let k=i().join(j.DATA_DIR,"cluster-config.json"),l=new Set(["standalone","master","slave"]),m="__blueRouterClusterConfigMutation",n={version:1,nodeId:"",role:"standalone",enabled:!1,masterUrl:"",syncToken:"",intervalMinutes:5,lastAttemptAt:null,lastSyncAt:null,lastSnapshotHash:"",lastError:"",lastResult:null,commandAck:null};function o(a={}){let b=l.has(a.role)?a.role:"standalone";return{...n,...a,version:1,nodeId:String(a.nodeId||"").trim()||e().randomUUID(),role:b,enabled:!0===a.enabled,masterUrl:function(a){let b=String(a||"").trim().replace(/\/+$/,"");if(!b)return"";let c=new URL(b);if(!["http:","https:"].includes(c.protocol))throw Error("Master URL must use http:// or https://");if(c.username||c.password)throw Error("Master URL must not contain credentials");return c.toString().replace(/\/+$/,"")}(a.masterUrl),syncToken:String(a.syncToken||"").trim(),intervalMinutes:Math.min(1440,Math.max(1,Number(a.intervalMinutes)||5))}}async function p(a){await g().mkdir(j.DATA_DIR,{recursive:!0});let b=`${k}.${process.pid}.${e().randomUUID()}.tmp`;try{await g().writeFile(b,JSON.stringify(a,null,2),{mode:384}),await g().rename(b,k)}catch(a){throw await g().unlink(b).catch(()=>{}),a}}function q(a){let b=(globalThis[m]||Promise.resolve()).then(a,a);return globalThis[m]=b.catch(()=>{}),b}async function r({includeSecrets:a=!1}={}){let b={};try{b=JSON.parse(await g().readFile(k,"utf8"))}catch(a){a?.code!=="ENOENT"&&console.warn("[cluster] failed to read config:",a?.message||a)}let c=o(b);if(b.nodeId||await p(c),a)return c;let{syncToken:d,...e}=c;return{...e,hasSyncToken:!!c.syncToken}}async function s(a={}){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid cluster config payload");return q(async()=>{let b=await r({includeSecrets:!0}),c={};for(let b of["role","enabled","masterUrl","syncToken","intervalMinutes"])Object.prototype.hasOwnProperty.call(a,b)&&(c[b]=a[b]);let d=o({...b,...c});if("master"!==d.role||d.syncToken||(d.syncToken=e().randomBytes(32).toString("base64url")),d.enabled&&"slave"===d.role){if(!d.masterUrl)throw Error("Master URL is required for Standby mode");if(!d.syncToken)throw Error("Sync token is required for Standby mode")}return await p(d),d})}async function t(){return q(async()=>{let a={...await r({includeSecrets:!0}),syncToken:e().randomBytes(32).toString("base64url")};return await p(a),a})}async function u(a={}){return q(async()=>{let b=await r({includeSecrets:!0}),c=o({...b,...a,nodeId:b.nodeId,role:b.role,enabled:b.enabled,masterUrl:b.masterUrl,syncToken:b.syncToken,intervalMinutes:b.intervalMinutes});return await p(c),c})}async function v(){return"slave"===(await r({includeSecrets:!0})).role}function w(a,b){let c=Buffer.from(String(a||"")),d=Buffer.from(String(b||""));return c.length>0&&c.length===d.length&&e().timingSafeEqual(c,d)}}};
@@ -1 +1 @@
1
- globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/hU0bJzcql1Pc4g3hzZRSk/_buildManifest.js","static/hU0bJzcql1Pc4g3hzZRSk/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-7f2a8541ddb15fce.js","static/chunks/4bd1b696-8a4ab4fdf0ae305a.js","static/chunks/3794-d7cddff008311ab3.js","static/chunks/main-app-eacc433ef218cf40.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
1
+ globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/-Ekus-uCsaI18fBUeojkR/_buildManifest.js","static/-Ekus-uCsaI18fBUeojkR/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-7f2a8541ddb15fce.js","static/chunks/4bd1b696-8a4ab4fdf0ae305a.js","static/chunks/3794-d7cddff008311ab3.js","static/chunks/main-app-eacc433ef218cf40.js"],rootMainFilesTree:{},pages:{"/_app":[]}};