@jheavenknows/bluerouter 5.1.59 → 5.1.61

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 (580) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +11 -11
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +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.js.nft.json +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +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.js.nft.json +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +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.js.nft.json +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  67. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  70. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  71. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  72. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  73. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  74. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  75. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  76. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  77. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  80. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  81. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  82. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +5 -5
  84. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  85. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  86. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  87. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  155. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  157. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  192. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js +1 -1
  204. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js +3 -3
  206. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  216. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  218. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  249. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  253. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  255. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  257. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  259. package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  261. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  262. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  263. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  264. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  265. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  267. package/app/.next-cli-build/server/app/callback.html +1 -1
  268. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  269. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  270. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  271. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +5 -5
  272. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  273. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  274. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +6 -6
  277. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
  278. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  279. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  281. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +6 -6
  282. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  283. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +5 -5
  284. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +7 -7
  287. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
  288. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  289. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  291. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +7 -7
  292. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +5 -5
  294. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  297. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  298. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  299. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  301. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  302. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +5 -5
  304. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  307. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  308. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  309. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  311. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  312. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  313. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +5 -5
  314. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  317. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster.segment.rsc +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  321. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  322. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_head.segment.rsc +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_index.segment.rsc +5 -5
  324. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  327. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  328. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  329. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  331. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  333. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +5 -5
  334. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  337. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  338. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  339. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  341. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  342. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  343. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +5 -5
  344. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  347. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  348. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  349. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  352. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  353. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  354. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +5 -5
  355. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  357. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  358. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  359. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  362. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  363. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  364. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +5 -5
  365. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  367. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  368. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  369. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  372. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  373. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  374. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +5 -5
  375. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  377. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  378. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  379. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  381. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  382. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  383. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  384. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +5 -5
  385. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  386. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  387. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  388. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  389. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  391. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  392. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  393. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  394. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +5 -5
  395. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  396. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  397. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  398. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  399. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  400. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  402. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  403. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  404. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  405. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +5 -5
  406. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  407. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  408. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  409. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  410. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  411. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  412. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  413. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  414. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  415. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +5 -5
  416. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  417. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  418. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  419. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  420. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  421. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  422. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  423. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  424. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  425. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +5 -5
  426. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  427. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  428. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  429. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  430. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  432. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  433. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  434. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  435. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +5 -5
  436. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  437. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  438. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
  439. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +2 -2
  440. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor.segment.rsc +1 -1
  441. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  442. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  443. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
  444. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_head.segment.rsc +1 -1
  445. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_index.segment.rsc +5 -5
  446. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  447. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  448. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  449. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  450. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
  451. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
  452. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  453. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +5 -5
  454. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  455. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  456. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  457. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  458. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  459. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  460. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  461. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  462. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  463. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  464. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  465. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  466. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  467. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +5 -5
  468. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  469. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  470. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  471. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +1 -1
  472. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  473. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  474. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  475. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  476. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  477. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +5 -5
  478. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  479. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  480. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  481. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  482. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  483. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  484. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  485. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  486. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  487. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +5 -5
  488. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  489. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  490. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  491. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  492. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  493. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  494. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  495. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  496. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  497. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +5 -5
  498. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  499. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  500. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  501. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  502. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  503. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  504. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  505. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  506. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +5 -5
  507. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  508. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  509. package/app/.next-cli-build/server/app/index.html +1 -1
  510. package/app/.next-cli-build/server/app/index.rsc +5 -5
  511. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  512. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  513. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  514. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +5 -5
  515. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  516. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  517. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  518. package/app/.next-cli-build/server/app/landing.html +1 -1
  519. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  520. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  521. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  522. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +5 -5
  523. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  524. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  525. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  526. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  527. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  528. package/app/.next-cli-build/server/app/login.html +1 -1
  529. package/app/.next-cli-build/server/app/login.rsc +6 -6
  530. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  531. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  532. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +5 -5
  533. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  534. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  535. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  536. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  537. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  538. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  539. package/app/.next-cli-build/server/app-paths-manifest.json +11 -11
  540. package/app/.next-cli-build/server/chunks/1340.js +1 -1
  541. package/app/.next-cli-build/server/chunks/2242.js +45 -0
  542. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  543. package/app/.next-cli-build/server/chunks/3248.js +1 -1
  544. package/app/.next-cli-build/server/chunks/{8762.js → 3433.js} +2 -2
  545. package/app/.next-cli-build/server/chunks/3675.js +1 -0
  546. package/app/.next-cli-build/server/chunks/402.js +1 -1
  547. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  548. package/app/.next-cli-build/server/chunks/541.js +11 -0
  549. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  550. package/app/.next-cli-build/server/chunks/6492.js +1 -0
  551. package/app/.next-cli-build/server/chunks/6759.js +1 -0
  552. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  553. package/app/.next-cli-build/server/chunks/689.js +177 -0
  554. package/app/.next-cli-build/server/chunks/6956.js +1 -0
  555. package/app/.next-cli-build/server/chunks/6977.js +245 -0
  556. package/app/.next-cli-build/server/chunks/7753.js +1 -0
  557. package/app/.next-cli-build/server/chunks/8023.js +1 -1
  558. package/app/.next-cli-build/server/chunks/9113.js +6 -0
  559. package/app/.next-cli-build/server/chunks/9479.js +1 -0
  560. package/app/.next-cli-build/server/instrumentation.js +1 -1
  561. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  562. package/app/.next-cli-build/server/middleware.js +1 -1
  563. package/app/.next-cli-build/server/pages/404.html +1 -1
  564. package/app/.next-cli-build/server/pages/500.html +1 -1
  565. package/app/.next-cli-build/static/chunks/{5263-9db207e9283a6052.js → 5263-6e8aebc9d9f9eab1.js} +1 -1
  566. package/app/.next-cli-build/static/chunks/5497-32ea3af0ec2fc57b.js +10 -0
  567. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/page-05d2cd8e11e930dc.js +1 -0
  568. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  569. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  570. package/app/package.json +1 -1
  571. package/package.json +1 -1
  572. package/app/.next-cli-build/server/chunks/12.js +0 -1
  573. package/app/.next-cli-build/server/chunks/1231.js +0 -4
  574. package/app/.next-cli-build/server/chunks/5276.js +0 -165
  575. package/app/.next-cli-build/static/chunks/5497-899b97f873159201.js +0 -10
  576. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/page-cc7b36a0b7cd5b32.js +0 -1
  577. /package/app/.next-cli-build/static/{znb7PoDU3tZezUPVCX5Wo → n0S5P9TEjvJrblx--rrix}/_buildManifest.js +0 -0
  578. /package/app/.next-cli-build/static/{znb7PoDU3tZezUPVCX5Wo → n0S5P9TEjvJrblx--rrix}/_ssgManifest.js +0 -0
  579. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.3-to-5.1.4-5.1.4-20260708-142321 → upgrade-5.1.58-to-5.1.59-5.1.59-20260722-114806}/data.sqlite +0 -0
  580. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.4-to-5.1.5-5.1.5-20260708-143848 → upgrade-5.1.59-to-5.1.60-5.1.60-20260722-123004}/data.sqlite +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1205],{98:(e,t,s)=>{"use strict";s.d(t,{default:()=>l});var r=s(95155),a=s(31474);function l({label:e,options:t=[],value:s,onChange:n,placeholder:i="Select an option",error:d,hint:o,disabled:c=!1,required:x=!1,className:m,selectClassName:u,...h}){return(0,r.jsxs)("div",{className:(0,a.cn)("flex flex-col gap-1.5",m),children:[e&&(0,r.jsxs)("label",{className:"text-sm font-medium text-text-main",children:[e,x&&(0,r.jsx)("span",{className:"text-red-500 ml-1",children:"*"})]}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsxs)("select",{value:s,onChange:n,disabled:c,className:(0,a.cn)("w-full py-2.5 px-3 pr-10 text-sm text-text-main","bg-surface-2 border border-transparent rounded-[10px] appearance-none","focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500/40","transition-all duration-150 disabled:opacity-50 disabled:cursor-not-allowed","text-[16px] sm:text-sm",d&&"ring-1 ring-red-500 focus:ring-2 focus:ring-red-500/40 border-red-500/40",u),...h,children:[(0,r.jsx)("option",{value:"",disabled:!0,children:i}),function(e){let t=new Map,s=[];for(let r of e){if(!r.group){s.push(r);continue}t.has(r.group)||t.set(r.group,[]),t.get(r.group).push(r)}let a=[];for(let[e,s]of t)a.push((0,r.jsx)("optgroup",{label:e,children:s.map(e=>(0,r.jsx)("option",{value:e.value,children:e.label},e.value))},e));for(let e of s)a.push((0,r.jsx)("option",{value:e.value,children:e.label},e.value));return a}(t)]}),(0,r.jsx)("div",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-text-muted",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"expand_more"})})]}),d&&(0,r.jsxs)("p",{className:"text-xs text-red-500 flex items-center gap-1",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"error"}),d]}),o&&!d&&(0,r.jsx)("p",{className:"text-xs text-text-muted",children:o})]})}},11910:(e,t,s)=>{"use strict";s.d(t,{default:()=>l});var r=s(95155),a=s(31474);function l({label:e,type:t="text",placeholder:s,value:n,onChange:i,error:d,hint:o,icon:c,disabled:x=!1,required:m=!1,className:u,inputClassName:h,...p}){return(0,r.jsxs)("div",{className:(0,a.cn)("flex flex-col gap-1.5",u),children:[e&&(0,r.jsxs)("label",{className:"text-sm font-medium text-text-main",children:[e,m&&(0,r.jsx)("span",{className:"text-red-500 ml-1",children:"*"})]}),(0,r.jsxs)("div",{className:"relative",children:[c&&(0,r.jsx)("div",{className:"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none text-text-muted",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:c})}),(0,r.jsx)("input",{type:t,placeholder:s,value:n,onChange:i,disabled:x,className:(0,a.cn)("w-full py-2.5 px-3 text-sm text-text-main bg-surface-2 rounded-[10px]","border border-transparent placeholder-text-muted/70","focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500/40","transition-all duration-150 ease-out disabled:opacity-50 disabled:cursor-not-allowed","text-[16px] sm:text-sm",c&&"pl-10",d&&"ring-1 ring-red-500 focus:ring-2 focus:ring-red-500/40 border-red-500/40",h),...p})]}),d&&(0,r.jsxs)("p",{className:"text-xs text-red-500 flex items-center gap-1",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"error"}),d]}),o&&!d&&(0,r.jsx)("p",{className:"text-xs text-text-muted",children:o})]})}},31474:(e,t,s)=>{"use strict";function r(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}s.d(t,{cn:()=>r})},56061:(e,t,s)=>{"use strict";s.d(t,{default:()=>i});var r=s(95155),a=s(31474);let l={default:"bg-surface-2 text-text-muted",primary:"bg-brand-500/10 text-brand-600 dark:text-brand-300",success:"bg-green-500/10 text-green-600 dark:text-green-400",warning:"bg-yellow-500/10 text-yellow-600 dark:text-yellow-400",error:"bg-red-500/10 text-red-600 dark:text-red-400",info:"bg-blue-500/10 text-blue-600 dark:text-blue-400"},n={sm:"px-2 py-0.5 text-[10px]",md:"px-2.5 py-1 text-xs",lg:"px-3 py-1.5 text-sm"};function i({children:e,variant:t="default",size:s="md",dot:d=!1,icon:o,className:c}){return(0,r.jsxs)("span",{className:(0,a.cn)("inline-flex items-center gap-1.5 rounded-full font-semibold",l[t],n[s],c),children:[d&&(0,r.jsx)("span",{className:(0,a.cn)("size-1.5 rounded-full","success"===t&&"bg-green-500","warning"===t&&"bg-yellow-500","error"===t&&"bg-red-500","info"===t&&"bg-blue-500","primary"===t&&"bg-brand-500","default"===t&&"bg-gray-500")}),o&&(0,r.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:o}),e]})}},81127:(e,t,s)=>{"use strict";s.d(t,{ConfirmModal:()=>m,default:()=>x});var r=s(95155),a=s(12115),l=s(31474),n=s(92542),i=s(97677);let d=[],o="";function c(){1===d.length?(o=document.body.style.overflow,document.body.style.overflow="hidden"):0===d.length&&(document.body.style.overflow=o)}function x({isOpen:e,onClose:t,title:s,children:n,footer:o,size:m="md",closeOnOverlay:u=!0,showTrafficLights:h=!0,busy:p=!1,className:b}){let g=(0,a.useRef)({onClose:t,busy:p});return(g.current.onClose=t,g.current.busy=p,(0,a.useEffect)(()=>{if(!e)return;let t=g.current;d.push(t),c();let s=e=>{if("Escape"!==e.key)return;let s=d[d.length-1];s!==t||s.busy||(e.preventDefault(),s.onClose())};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s);let e=d.indexOf(t);-1!==e&&d.splice(e,1),c()}},[e]),e)?(0,r.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[(0,r.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in",onClick:u&&!p?t:void 0}),(0,r.jsxs)("div",{className:(0,l.cn)("relative w-full bg-surface","border border-border-subtle","rounded-[14px] shadow-[var(--shadow-elev)]","fade-in",{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl",full:"max-w-4xl"}[m],b),children:[(s||h)&&(0,r.jsxs)("div",{className:"flex items-center justify-between p-2 border-b border-border-subtle",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[h&&(0,r.jsxs)("div",{className:"hidden md:flex items-center gap-2 mr-4 ml-2",children:[(0,r.jsx)(i.default,{text:"Close",position:"top",color:"#FF5F56",children:(0,r.jsx)("button",{onClick:t,disabled:p,"aria-label":"Close",title:"Close",className:"w-4 h-4 rounded-full bg-[#FF5F56] hover:brightness-90 transition-all cursor-pointer flex items-center justify-center group/dot disabled:cursor-not-allowed disabled:opacity-50",children:(0,r.jsx)("span",{className:"text-[9px] font-bold text-white opacity-0 group-hover/dot:opacity-100 transition-opacity leading-none",children:"✕"})})}),(0,r.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"}),(0,r.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"})]}),s&&(0,r.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:s})]}),(0,r.jsx)("button",{onClick:t,disabled:p,"aria-label":"Close",className:"md:hidden p-1.5 rounded-[10px] text-text-muted hover:bg-surface-2 hover:text-text-main transition-colors disabled:cursor-not-allowed disabled:opacity-50",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,r.jsx)("div",{className:"p-6 max-h-[calc(85vh-100px)] overflow-y-auto custom-scrollbar",children:n}),o&&(0,r.jsx)("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-border-subtle",children:o})]})]}):null}function m({isOpen:e,onClose:t,onConfirm:s,title:a="Confirm",message:l,confirmText:i="Confirm",cancelText:d="Cancel",variant:o="danger",loading:c=!1}){return(0,r.jsx)(x,{isOpen:e,onClose:t,title:a,size:"sm",busy:c,footer:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.default,{variant:"ghost",onClick:t,disabled:c,children:d}),(0,r.jsx)(n.default,{variant:o,onClick:s,loading:c,children:i})]}),children:(0,r.jsx)("p",{className:"text-text-muted",children:l})})}},86243:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>O});var r=s(95155),a=s(12115),l=s(1728),n=s(90639),i=s(28408),d=s(32539),o=s(59656),c=s(65671),x=s(34122),m=s(16746),u=s(96647),h=s(29010),p=s(56061),b=s(92542),g=s(11910),f=s(81127),j=s(98);let v={name:"",host:"",sshPort:"22",sshUser:"",sshPassword:"",useSudo:!0,sudoPassword:"",agentPort:"19998",installAgent:!0};function y(e){return{name:e?.name||"",host:e?.host||"",sshPort:String(e?.sshPort||22),sshUser:e?.sshUser||"",sshPassword:"",useSudo:e?.useSudo!==!1,sudoPassword:"",agentPort:String(e?.agentPort||19998),installAgent:!0}}function N(e){var t;let s;return!!e?.lastStatus&&(!e.lastError||Date.now()-(Number.isFinite(s=(t=e?.lastStatusAt)?new Date(t).getTime():0)?s:0)<=3e4)}function w(e){return Math.max(0,Math.min(100,Number(e)||0))}function k(e,t=1){let s=Number(e)||0;if(!s)return"0 B";let r=["B","KB","MB","GB","TB","PB"],a=Math.min(r.length-1,Math.floor(Math.log(s)/Math.log(1024)));return`${(s/1024**a).toFixed(a>2?t:0)} ${r[a]}`}function S(e){return e?new Date(e).toLocaleTimeString("vi-VN",{hour12:!1}):"--:--:--"}function C({value:e,label:t,detail:s,color:a="var(--color-brand-500)",icon:l}){let n=w(e),i=2*Math.PI*49;return(0,r.jsxs)("div",{className:"flex min-w-0 flex-col items-center",children:[(0,r.jsxs)("div",{className:"relative h-36 w-36",children:[(0,r.jsxs)("svg",{className:"h-full w-full -rotate-90",viewBox:"0 0 120 120","aria-hidden":"true",children:[(0,r.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:"var(--color-surface-2)",strokeWidth:"8"}),(0,r.jsx)("circle",{cx:"60",cy:"60",r:49,fill:"none",stroke:a,strokeWidth:"8",strokeLinecap:"round",strokeDasharray:i,strokeDashoffset:i*(1-n/100),className:"transition-all duration-700"})]}),(0,r.jsxs)("div",{className:"absolute inset-0 flex flex-col items-center justify-center text-center",children:[l?(0,r.jsx)("span",{className:"material-symbols-outlined mb-0.5 text-[19px] text-text-muted",children:l}):null,(0,r.jsxs)("strong",{className:"text-2xl font-semibold tracking-tight text-text-main",children:[n.toFixed(+(n<10)),"%"]}),(0,r.jsx)("span",{className:"mt-0.5 text-xs font-medium text-text-muted",children:t})]})]}),(0,r.jsx)("div",{className:"mt-2 max-w-full truncate text-center text-xs text-text-subtle",title:s,children:s})]})}function P({online:e}){return(0,r.jsx)("span",{className:`h-2.5 w-2.5 shrink-0 rounded-full ${e?"bg-emerald-500 shadow-[0_0_0_4px_rgba(16,185,129,.12)]":"bg-red-400 shadow-[0_0_0_4px_rgba(248,113,113,.12)]"}`})}function $({servers:e,selectedId:t,onSelect:s}){return(0,r.jsx)("div",{className:"flex gap-3 overflow-x-auto pb-1 scroll-thin-x",children:e.map(e=>{let a=e.id===t,l=N(e);return(0,r.jsxs)("button",{type:"button",onClick:()=>s(e.id),className:`min-w-[240px] rounded-2xl border p-4 text-left transition ${a?"border-primary bg-primary/5 shadow-[var(--shadow-warm)]":"border-border bg-surface hover:border-primary/40"}`,children:[(0,r.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(P,{online:l}),(0,r.jsx)("div",{className:"truncate font-semibold text-text-main",children:e.name})]}),(0,r.jsxs)("div",{className:"mt-1.5 truncate font-mono text-xs text-text-muted",children:[e.host,":",e.agentPort]})]}),(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px] text-text-subtle",children:"dns"})]}),(0,r.jsxs)("div",{className:"mt-3 flex items-center justify-between text-xs text-text-muted",children:[(0,r.jsx)("span",{children:l?"Đang hoạt động":"Mất kết nối"}),(0,r.jsx)("span",{children:S(e.lastStatusAt)})]})]},e.id)})})}function U({icon:e,label:t,value:s,sublabel:a,colorClass:l="text-primary",children:n}){return(0,r.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl bg-surface-2 ${l}`,children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:e})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("div",{className:"text-xs font-medium uppercase tracking-wider text-text-muted",children:t}),(0,r.jsx)("div",{className:"mt-0.5 truncate text-lg font-semibold text-text-main",children:s})]})]}),a?(0,r.jsx)("div",{className:"mt-3 truncate text-xs text-text-subtle",children:a}):null,n]})}function M({data:e,dataKey:t,label:s,color:a,unit:m="%"}){return(0,r.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(0,r.jsx)("h3",{className:"font-semibold text-text-main",children:s}),(0,r.jsx)("span",{className:"text-xs text-text-muted",children:"60 mẫu gần nhất"})]}),(0,r.jsx)("div",{className:"h-44",children:(0,r.jsx)(l.u,{width:"100%",height:"100%",children:(0,r.jsxs)(n.Q,{data:e,margin:{top:6,right:4,left:-22,bottom:0},children:[(0,r.jsx)("defs",{children:(0,r.jsxs)("linearGradient",{id:`fill-${t}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,r.jsx)("stop",{offset:"0%",stopColor:a,stopOpacity:.3}),(0,r.jsx)("stop",{offset:"100%",stopColor:a,stopOpacity:.02})]})}),(0,r.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,r.jsx)(d.W,{dataKey:"time",hide:!0}),(0,r.jsx)(o.h,{domain:[0,"auto"],tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,r.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},formatter:e=>[`${Number(e).toFixed(1)}${m}`,s]}),(0,r.jsx)(x.Gk,{type:"monotone",dataKey:t,stroke:a,fill:`url(#fill-${t})`,strokeWidth:2.2,dot:!1,isAnimationActive:!1})]})})})]})}let A=["#10b981","#06b6d4","#8b5cf6","#f59e0b","#ef4444","#3b82f6","#ec4899","#84cc16"];function T(e){return e?.uuid||`index-${e?.index??0}`}function I({data:e,gpus:t}){let s=(t||[]).map((e,t)=>({id:T(e),dataKey:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:A[t%A.length]})),a=e.map(e=>{let t={time:e.time};return s.forEach(s=>{let r=e.gpus?.find(e=>e.id===s.id);t[s.dataKey]=r?.usagePercent??null}),t});return(0,r.jsxs)("div",{className:"mb-5 rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"mb-4 flex flex-wrap items-start justify-between gap-2",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h4",{className:"font-semibold text-text-main",children:"GPU usage history"}),(0,r.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Mỗi đường biểu diễn mức tải realtime của một NVIDIA GPU."})]}),(0,r.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-medium text-emerald-600 dark:text-emerald-400",children:"60 mẫu gần nhất"})]}),(0,r.jsx)("div",{className:"h-64",children:(0,r.jsx)(l.u,{width:"100%",height:"100%",children:(0,r.jsxs)(m.b,{data:a,margin:{top:8,right:12,left:-16,bottom:2},children:[(0,r.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,r.jsx)(d.W,{dataKey:"time",tickFormatter:S,minTickGap:36,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,r.jsx)(o.h,{domain:[0,100],ticks:[0,25,50,75,100],tickFormatter:e=>`${e}%`,tick:{fill:"var(--color-text-subtle)",fontSize:11},axisLine:!1,tickLine:!1}),(0,r.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>`Thời gian ${S(e)}`,formatter:(e,t)=>[`${Number(e).toFixed(1)}%`,t]}),(0,r.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,r.jsx)("span",{className:"text-text-muted",children:e})}),s.map(e=>(0,r.jsx)(h.N1,{type:"monotone",dataKey:e.dataKey,name:e.name,stroke:e.color,strokeWidth:2.4,dot:!1,connectNulls:!1,isAnimationActive:!1},e.id))]})})})]})}let D=[{value:"1h",label:"1 giờ"},{value:"6h",label:"6 giờ"},{value:"24h",label:"24 giờ"},{value:"7d",label:"7 ng\xe0y"},{value:"30d",label:"30 ng\xe0y"}];function _(e){return e?new Date(e).toLocaleString("vi-VN",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}):"—"}function L({title:e,description:t,data:s,series:a,domain:n=[0,100],valueFormatter:x=e=>`${Number(e).toFixed(1)}%`,axisFormatter:p=e=>`${e}%`}){return(0,r.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-5 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"mb-4",children:[(0,r.jsx)("h4",{className:"font-semibold text-text-main",children:e}),t?(0,r.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:t}):null]}),(0,r.jsx)("div",{className:"h-64",children:(0,r.jsx)(l.u,{width:"100%",height:"100%",children:(0,r.jsxs)(m.b,{data:s,margin:{top:8,right:12,left:-8,bottom:2},children:[(0,r.jsx)(i.d,{stroke:"var(--color-border-subtle)",strokeDasharray:"4 4",vertical:!1}),(0,r.jsx)(d.W,{dataKey:"time",tickFormatter:_,minTickGap:48,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,r.jsx)(o.h,{domain:n,tickFormatter:p,width:58,tick:{fill:"var(--color-text-subtle)",fontSize:10},axisLine:!1,tickLine:!1}),(0,r.jsx)(c.m,{contentStyle:{background:"var(--color-surface)",border:"1px solid var(--color-border)",borderRadius:12,fontSize:12},labelFormatter:e=>_(e),formatter:(e,t)=>[x(e),t]}),(0,r.jsx)(u.s,{iconType:"circle",iconSize:8,wrapperStyle:{fontSize:12,paddingTop:12},formatter:e=>(0,r.jsx)("span",{className:"text-text-muted",children:e})}),a.map(e=>(0,r.jsx)(h.N1,{type:"monotone",dataKey:e.key,name:e.name,stroke:e.color,strokeWidth:2.2,dot:!1,connectNulls:!1,isAnimationActive:!1},e.key))]})})})]})}function F({server:e,data:t,meta:s,period:l,onPeriodChange:n,loading:i,error:d}){let o=(0,a.useMemo)(()=>{let e=new Map;return t.forEach(t=>{(t.gpus||[]).forEach(t=>{e.has(t.id)||e.set(t.id,t)})}),[...e.values()].map((e,t)=>({id:e.id,key:`gpu${t}`,name:`GPU ${e.index} \xb7 ${e.name}`,color:A[t%A.length]}))},[t]),c=(0,a.useCallback)(e=>t.map(t=>{let s={time:t.time};return o.forEach(r=>{let a=t.gpus?.find(e=>e.id===r.id);s[r.key]=a?.[e]??null}),s}),[t,o]);return(0,r.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,r.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"monitoring"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("h3",{className:"truncate text-lg font-semibold text-text-main",children:["Lịch sử \xb7 ",e.name]}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Sample mỗi ph\xfat \xb7 lưu tối đa ",s?.retentionDays||30," ng\xe0y"]})]})]}),(0,r.jsx)("div",{className:"flex flex-wrap gap-1 rounded-xl bg-surface-2 p-1",children:D.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>n(e.value),className:`rounded-lg px-3 py-2 text-xs font-semibold transition ${l===e.value?"bg-surface text-primary shadow-sm":"text-text-muted hover:text-text-main"}`,children:e.label},e.value))})]}),i?(0,r.jsxs)("div",{className:"flex min-h-[420px] items-center justify-center text-sm text-text-muted",children:[(0,r.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải dữ liệu lịch sử..."]}):d?(0,r.jsx)("div",{className:"m-6 rounded-2xl border border-red-500/20 bg-red-500/10 p-5 text-sm text-red-600 dark:text-red-300",children:d}):t.length?(0,r.jsxs)("div",{className:"space-y-5 p-6",children:[(0,r.jsxs)("div",{className:"grid gap-4 sm:grid-cols-3",children:[(0,r.jsx)(U,{icon:"database",label:"Số điểm hiển thị",value:t.length.toLocaleString("vi-VN"),sublabel:`Bucket ${s?.bucketMinutes||1} ph\xfat`,colorClass:"text-violet-500"}),(0,r.jsx)(U,{icon:"date_range",label:"Từ thời điểm",value:_(t[0]?.time),sublabel:"Điểm đầu ti\xean trong khoảng đ\xe3 chọn",colorClass:"text-cyan-500"}),(0,r.jsx)(U,{icon:"memory",label:"NVIDIA GPU",value:`${o.length} card`,sublabel:"Theo d\xf5i ri\xeang bằng GPU UUID",colorClass:"text-emerald-500"})]}),(0,r.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,r.jsx)(L,{title:"CPU, RAM & Disk usage",description:"Tỷ lệ sử dụng t\xe0i nguy\xean hệ thống theo thời gian.",data:t,series:[{key:"cpu",name:"CPU",color:"#3b9dec"},{key:"memory",name:"RAM",color:"#8b5cf6"},{key:"disk",name:"Disk",color:"#f59e0b"}]}),(0,r.jsx)(L,{title:"Network throughput",description:"Tốc độ nhận v\xe0 gửi trung b\xecnh trong mỗi bucket.",data:t,domain:[0,"auto"],series:[{key:"networkRxBps",name:"Download",color:"#06b6d4"},{key:"networkTxBps",name:"Upload",color:"#ec4899"}],valueFormatter:e=>`${k(e)}/s`,axisFormatter:e=>k(e)})]}),o.length?(0,r.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,r.jsx)(L,{title:"NVIDIA GPU usage",description:"Mức tải của từng GPU, ph\xe2n biệt theo UUID.",data:c("usagePercent"),series:o}),(0,r.jsx)(L,{title:"GPU VRAM usage",description:"Phần trăm VRAM đ\xe3 sử dụng tr\xean từng card.",data:c("memoryUsagePercent"),series:o}),(0,r.jsx)(L,{title:"GPU temperature",description:"Nhiệt độ trung b\xecnh của từng card trong mỗi bucket.",data:c("temperatureC"),domain:[0,"auto"],series:o,valueFormatter:e=>`${Number(e).toFixed(1)}\xb0C`,axisFormatter:e=>`${e}\xb0`}),(0,r.jsx)(L,{title:"GPU power draw",description:"C\xf4ng suất ti\xeau thụ trung b\xecnh của từng card.",data:c("powerDrawW"),domain:[0,"auto"],series:o,valueFormatter:e=>`${Number(e).toFixed(1)} W`,axisFormatter:e=>`${e}W`})]}):null]}):(0,r.jsxs)("div",{className:"flex min-h-[420px] flex-col items-center justify-center px-6 text-center",children:[(0,r.jsx)("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-500",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[34px]",children:"hourglass_empty"})}),(0,r.jsx)("h4",{className:"mt-5 font-semibold text-text-main",children:"Chưa c\xf3 dữ liệu lịch sử"}),(0,r.jsx)("p",{className:"mt-2 max-w-md text-sm leading-6 text-text-muted",children:"Collector đ\xe3 được bật v\xe0 sẽ ghi mẫu đầu ti\xean trong v\xf2ng một ph\xfat. Dữ liệu vẫn tiếp tục được thu thập khi kh\xf4ng mở dashboard."})]})]})}function E({gpu:e}){let t=w(e.memoryUsagePercent);return(0,r.jsxs)("div",{className:"overflow-hidden rounded-2xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle bg-gradient-to-r from-emerald-500/8 to-cyan-500/5 px-5 py-4",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,r.jsx)("span",{className:"material-symbols-outlined",children:"memory"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"truncate font-semibold text-text-main",children:["GPU ",e.index," \xb7 ",e.name]}),(0,r.jsxs)("div",{className:"mt-0.5 text-xs text-text-muted",children:["NVIDIA Driver ",e.driverVersion||"—"]})]})]}),(0,r.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-semibold text-emerald-600 dark:text-emerald-400",children:"NVIDIA"})]}),(0,r.jsxs)("div",{className:"grid gap-5 p-5 sm:grid-cols-[150px_1fr]",children:[(0,r.jsx)(C,{value:e.usagePercent,label:"GPU Load",detail:`${e.temperatureC??"—"}\xb0C`,color:"#10b981"}),(0,r.jsxs)("div",{className:"space-y-5",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"mb-2 flex items-center justify-between text-sm",children:[(0,r.jsx)("span",{className:"text-text-muted",children:"VRAM"}),(0,r.jsxs)("span",{className:"font-semibold text-text-main",children:[k(1048576*(e.memoryUsedMb||0))," /"," ",k(1048576*(e.memoryTotalMb||0))]})]}),(0,r.jsx)("div",{className:"h-2.5 overflow-hidden rounded-full bg-surface-2",children:(0,r.jsx)("div",{className:"h-full rounded-full bg-emerald-500 transition-all duration-700",style:{width:`${t}%`}})}),(0,r.jsxs)("div",{className:"mt-1.5 text-right text-xs text-text-subtle",children:[t.toFixed(1),"% đ\xe3 d\xf9ng"]})]}),(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,r.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,r.jsx)("div",{className:"text-xs text-text-muted",children:"Nhiệt độ"}),(0,r.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.temperatureC??"—","\xb0C"]})]}),(0,r.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3",children:[(0,r.jsx)("div",{className:"text-xs text-text-muted",children:"C\xf4ng suất"}),(0,r.jsxs)("div",{className:"mt-1 text-lg font-semibold text-text-main",children:[e.powerDrawW??"—",(0,r.jsxs)("span",{className:"text-xs font-normal text-text-muted",children:[" ","/ ",e.powerLimitW??"—"," W"]})]})]})]})]})]})]})}function K({open:e,onClose:t,onCreated:s}){let[l,n]=(0,a.useState)(v),[i,d]=(0,a.useState)(!1),[o,c]=(0,a.useState)(""),x=(e,t)=>n(s=>({...s,[e]:t}));(0,a.useEffect)(()=>{e&&(n(v),c(""))},[e]);let m=async e=>{e.preventDefault(),d(!0),c("");try{let e=await fetch("/api/resource-monitor",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng thể th\xeam server");await s(r.server,r.install),t()}catch(e){c(e?.message||"Kh\xf4ng thể th\xeam server")}finally{d(!1)}};return(0,r.jsx)(f.default,{isOpen:e,onClose:t,title:"Th\xeam Linux server",size:"xl",busy:i,footer:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(b.default,{variant:"ghost",onClick:t,disabled:i,children:"Hủy"}),(0,r.jsx)(b.default,{onClick:m,loading:i,icon:"rocket_launch",children:"C\xe0i agent & th\xeam server"})]}),children:(0,r.jsxs)("form",{onSubmit:m,className:"space-y-5",children:[(0,r.jsx)("div",{className:"rounded-xl border border-primary/20 bg-primary/5 p-4 text-sm text-text-muted",children:(0,r.jsxs)("div",{className:"flex gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary",children:"auto_fix_high"}),(0,r.jsx)("p",{children:"BlueRouter sẽ SSH v\xe0o m\xe1y, d\xf9ng quyền sudo để c\xe0i Python agent dưới dạng systemd service. Sau lần n\xe0y bạn kh\xf4ng cần thao t\xe1c th\xeam tr\xean Linux."})]})}),(0,r.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,r.jsx)(g.default,{label:"T\xean hiển thị",value:l.name,onChange:e=>x("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,r.jsx)(g.default,{required:!0,label:"Hostname / IP",value:l.host,onChange:e=>x("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,r.jsx)(g.default,{required:!0,label:"SSH user",value:l.sshUser,onChange:e=>x("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,r.jsx)(g.default,{label:"SSH port",type:"number",value:l.sshPort,onChange:e=>x("sshPort",e.target.value)}),(0,r.jsx)(g.default,{label:"SSH password",type:"password",value:l.sshPassword,onChange:e=>x("sshPassword",e.target.value),placeholder:"Để trống nếu d\xf9ng SSH key",hint:"Chỉ d\xf9ng trong l\xfac c\xe0i, kh\xf4ng lưu v\xe0o database."}),(0,r.jsx)(g.default,{label:"Agent port",type:"number",value:l.agentPort,onChange:e=>x("agentPort",e.target.value),hint:"Mặc định 19998; dashboard server phải truy cập được port n\xe0y."})]}),(0,r.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,r.jsx)("input",{type:"checkbox",checked:l.useSudo,onChange:e=>x("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,r.jsxs)("span",{children:[(0,r.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,r.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),l.useSudo?(0,r.jsx)(g.default,{label:"Sudo password",type:"password",value:l.sudoPassword,onChange:e=>x("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,o?(0,r.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:o}):null]})})}function G({open:e,server:t,onClose:s,onUpdated:l}){let[n,i]=(0,a.useState)(y(t)),[d,o]=(0,a.useState)(!1),[c,x]=(0,a.useState)(""),m=(e,t)=>i(s=>({...s,[e]:t}));(0,a.useEffect)(()=>{e&&(i(y(t)),x(""))},[e,t]);let u=async e=>{if(e.preventDefault(),t?.id){o(!0),x("");try{let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n.name,host:n.host,sshPort:n.sshPort,sshUser:n.sshUser,useSudo:n.useSudo,agentPort:n.agentPort})}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng thể lưu server");let a=null;if(n.installAgent){let e=await fetch(`/api/resource-monitor/${t.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sshPassword:n.sshPassword,sudoPassword:n.sudoPassword})}),s=await e.json().catch(()=>({}));a={ok:e.ok&&!1!==s.ok,log:s.log,error:s.error}}await l(r.server,a),s()}catch(e){x(e?.message||"Kh\xf4ng thể cập nhật server")}finally{o(!1)}}};return(0,r.jsx)(f.default,{isOpen:e,onClose:s,title:"Sửa Linux server",size:"xl",busy:d,footer:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(b.default,{variant:"ghost",onClick:s,disabled:d,children:"Hủy"}),(0,r.jsx)(b.default,{onClick:u,loading:d,icon:"save",children:"Lưu & c\xe0i lại agent"})]}),children:(0,r.jsxs)("form",{onSubmit:u,className:"space-y-5",children:[(0,r.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,r.jsx)(g.default,{label:"T\xean hiển thị",value:n.name,onChange:e=>m("name",e.target.value),placeholder:"GPU Worker 01",icon:"dns"}),(0,r.jsx)(g.default,{required:!0,label:"Hostname / IP",value:n.host,onChange:e=>m("host",e.target.value),placeholder:"192.168.1.50",icon:"lan"}),(0,r.jsx)(g.default,{required:!0,label:"SSH user",value:n.sshUser,onChange:e=>m("sshUser",e.target.value),placeholder:"ubuntu",icon:"person"}),(0,r.jsx)(g.default,{label:"SSH port",type:"number",value:n.sshPort,onChange:e=>m("sshPort",e.target.value)}),(0,r.jsx)(g.default,{label:"SSH password",type:"password",value:n.sshPassword,onChange:e=>m("sshPassword",e.target.value),placeholder:"Nhập lại nếu trước đ\xf3 sai",hint:"Chỉ d\xf9ng để c\xe0i lại agent, kh\xf4ng lưu v\xe0o database."}),(0,r.jsx)(g.default,{label:"Agent port",type:"number",value:n.agentPort,onChange:e=>m("agentPort",e.target.value)})]}),(0,r.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,r.jsx)("input",{type:"checkbox",checked:n.useSudo,onChange:e=>m("useSudo",e.target.checked),className:"mt-1 h-4 w-4"}),(0,r.jsxs)("span",{children:[(0,r.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"User cần sudo để c\xe0i service"}),(0,r.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Tắt nếu đăng nhập trực tiếp bằng root."})]})]}),n.useSudo?(0,r.jsx)(g.default,{label:"Sudo password",type:"password",value:n.sudoPassword,onChange:e=>m("sudoPassword",e.target.value),placeholder:"Mặc định d\xf9ng c\xf9ng SSH password"}):null,(0,r.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-surface-2/60 p-4",children:[(0,r.jsx)("input",{type:"checkbox",checked:n.installAgent,onChange:e=>m("installAgent",e.target.checked),className:"mt-1 h-4 w-4"}),(0,r.jsxs)("span",{children:[(0,r.jsx)("span",{className:"block text-sm font-semibold text-text-main",children:"C\xe0i lại agent sau khi lưu"}),(0,r.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:"Bật mục n\xe0y khi cần nhập lại account/password SSH hoặc đổi port."})]})]}),c?(0,r.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:c}):null]})})}let B={normal:{variant:"success",label:"B\xecnh thường"},warning:{variant:"warning",label:"Cảnh b\xe1o"},critical:{variant:"error",label:"Qu\xe1 tải"},unknown:{variant:"default",label:"Kh\xf4ng r\xf5"}};function z({modelOptions:e,selectedModel:t,onSelectModel:s,analysis:a,loading:l,error:n,onAnalyze:i,standby:d}){return(0,r.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,r.jsx)("div",{className:"flex flex-wrap items-center justify-between gap-4 border-b border-border px-6 py-5",children:(0,r.jsxs)("div",{className:"flex items-center gap-4",children:[(0,r.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"neurology"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h3",{className:"text-lg font-semibold text-text-main",children:"Đ\xe1nh gi\xe1 AI t\xecnh trạng server"}),(0,r.jsx)("p",{className:"mt-0.5 text-xs text-text-muted",children:"Ph\xe2n t\xedch giờ l\xe0m việc h\xf4m nay (8:00 - 18:00) tr\xean to\xe0n bộ Linux server."})]})]})}),(0,r.jsxs)("div",{className:"space-y-5 p-6",children:[d?(0,r.jsx)("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:"Standby mode: kết quả ph\xe2n t\xedch được đồng bộ tự động từ Master. Node n\xe0y kh\xf4ng tự chạy ph\xe2n t\xedch AI."}):null,(0,r.jsxs)("div",{className:"flex flex-wrap items-end gap-3",children:[(0,r.jsx)(j.default,{className:"min-w-[280px] flex-1",label:"AI model d\xf9ng để ph\xe2n t\xedch",options:e,value:t,onChange:e=>s(e.target.value),placeholder:e.length?"Chọn model":"Chưa c\xf3 kết nối AI n\xe0o đang hoạt động",disabled:!e.length||d}),(0,r.jsx)(b.default,{icon:"auto_awesome",onClick:i,loading:l,disabled:!t||d,children:"Ph\xe2n t\xedch lại"})]}),n?(0,r.jsx)("div",{className:"rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:n}):null,a?(0,r.jsxs)("div",{className:"space-y-5",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2 text-xs text-text-muted",children:[(0,r.jsxs)("span",{children:["Model: ",(0,r.jsx)("span",{className:"font-semibold",children:a.modelLabel})]}),(0,r.jsxs)("span",{children:["Cập nhật l\xfac ",S(a.generatedAt)]})]}),(0,r.jsx)("div",{className:"whitespace-pre-wrap rounded-2xl border border-border bg-surface-2/40 p-5 text-sm leading-6 text-text-main",children:a.summary}),a.servers?.length?(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,r.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,r.jsx)("h4",{className:"font-semibold text-text-main",children:"Trạng th\xe1i từng server"})]}),(0,r.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-3",children:a.servers.map(e=>{let t=B[e.status]||B.unknown;return(0,r.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface px-4 py-3",children:[(0,r.jsx)("span",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,r.jsx)(p.default,{variant:t.variant,dot:!0,children:t.label})]},e.serverId)})})]}):null]}):l?null:(0,r.jsx)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:'Chưa c\xf3 ph\xe2n t\xedch n\xe0o — bấm "Ph\xe2n t\xedch lại" để bắt đầu.'})]})]})}function O(){let e,t,s,l,[n,i]=(0,a.useState)("realtime"),[d,o]=(0,a.useState)([]),[c,x]=(0,a.useState)(""),[m,u]=(0,a.useState)({}),[h,p]=(0,a.useState)(!0),[g,j]=(0,a.useState)(!1),[v,y]=(0,a.useState)(!1),[A,D]=(0,a.useState)(!1),[_,L]=(0,a.useState)(null),[B,O]=(0,a.useState)(!1),[R,H]=(0,a.useState)(null),[V,W]=(0,a.useState)("24h"),[q,J]=(0,a.useState)([]),[X,Q]=(0,a.useState)(null),[Y,Z]=(0,a.useState)(!1),[ee,et]=(0,a.useState)(""),[es,er]=(0,a.useState)(!1),[ea,el]=(0,a.useState)([]),[en,ei]=(0,a.useState)(""),[ed,eo]=(0,a.useState)(null),[ec,ex]=(0,a.useState)(!1),[em,eu]=(0,a.useState)(""),eh=(0,a.useRef)(0),ep=(0,a.useCallback)(async({quiet:e=!1}={})=>{e||j(!0);try{let e=await fetch("/api/resource-monitor",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được server");let s=t.servers||[];er(!0===t.standby),o(s),x(e=>e&&s.some(t=>t.id===e)?e:s[0]?.id||""),u(e=>{let t={...e};return s.forEach(e=>{if(!N(e))return;let s=e.lastStatus,r={time:s.updatedAt||new Date().toISOString(),cpu:s.cpu?.usagePercent||0,memory:s.memory?.usagePercent||0,disk:s.disks?.[0]?.usagePercent||0,gpu:s.gpus?.length?Math.max(...s.gpus.map(e=>e.usagePercent||0)):0,gpus:(s.gpus||[]).map(e=>({id:T(e),usagePercent:w(e.usagePercent)}))},a=t[e.id]||[];t[e.id]=a.at(-1)?.time===r.time?a:[...a,r].slice(-60)}),t})}catch(t){e||H({type:"error",text:t?.message||"Kh\xf4ng tải được server"})}finally{p(!1),e||j(!1)}},[]),eb=(0,a.useCallback)(async()=>{if(!c)return;let e=++eh.current;Z(!0),et("");try{let t=await fetch(`/api/resource-monitor/history?serverId=${encodeURIComponent(c)}&period=${encodeURIComponent(V)}`,{cache:"no-store"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean");if(eh.current!==e)return;J(s.points||[]),Q(s)}catch(t){if(eh.current!==e)return;et(t?.message||"Kh\xf4ng tải được lịch sử t\xe0i nguy\xean"),J([])}finally{eh.current===e&&Z(!1)}},[V,c]);(0,a.useEffect)(()=>{let e,t=!1;ep();let s=async()=>{await ep({quiet:!0}),t||(e=setTimeout(s,4e3))};return e=setTimeout(s,4e3),()=>{t=!0,clearTimeout(e)}},[ep]),(0,a.useEffect)(()=>{if("history"!==n||!c)return;eb();let e=setInterval(eb,6e4);return()=>clearInterval(e)},[n,eb,c]);let eg=(0,a.useCallback)(e=>{ei(e),fetch("/api/resource-monitor/analyze",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e})}).catch(()=>{})},[]),ef=(0,a.useCallback)(async()=>{if(!en)return;let e=en.indexOf("::"),t=en.slice(0,e),s=en.slice(e+2);ex(!0),eu("");try{let e=await fetch("/api/resource-monitor/analyze",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:t,model:s})}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean");eo(r.analysis)}catch(e){eu(e?.message||"Kh\xf4ng thể ph\xe2n t\xedch t\xe0i nguy\xean")}finally{ex(!1)}},[en]);(0,a.useEffect)(()=>{"ai"===n&&(async()=>{let e="";try{let t=await fetch("/api/resource-monitor/analyze",{cache:"no-store"}),s=await t.json().catch(()=>({}));t.ok&&(eo(s.analysis||null),e=s.selectedModel||"")}catch{}try{let t=await fetch("/api/resource-monitor/ai-models",{cache:"no-store"}),s=(await t.json().catch(()=>({}))).options||[];el(s),ei(t=>{let r=t||e;return r&&s.some(e=>e.value===r)?r:s[0]?.value||""})}catch{el([])}})()},[n]);let ej=(0,a.useMemo)(()=>d.find(e=>e.id===c)||null,[d,c]),ev=ej?.lastStatus,ey=N(ej),eN=ev?.disks?.[0],ew=m[c]||[],ek=async()=>{if(_){O(!0);try{if(!(await fetch(`/api/resource-monitor/${_.id}`,{method:"DELETE"})).ok)throw Error("Kh\xf4ng thể x\xf3a server");L(null),await ep()}catch(e){H({type:"error",text:e.message})}finally{O(!1)}}};return h?(0,r.jsxs)("div",{className:"flex min-h-[50vh] items-center justify-center text-text-muted",children:[(0,r.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin",children:"progress_activity"}),"Đang tải t\xe0i nguy\xean server..."]}):(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Linux Resource Monitor"}),(0,r.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Theo d\xf5i realtime CPU, RAM, disk, network v\xe0 to\xe0n bộ NVIDIA GPU."})]}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(b.default,{variant:"secondary",icon:"refresh",onClick:()=>"history"===n?eb():ep(),loading:"history"===n?Y:g,children:"L\xe0m mới"}),(0,r.jsx)(b.default,{icon:"add",onClick:()=>y(!0),disabled:es,children:"Th\xeam server"})]})]}),es?(0,r.jsx)("div",{className:"rounded-xl border border-blue-500/30 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:"Standby mode: Resource Monitor chỉ hiển thị snapshot từ Master. Node n\xe0y kh\xf4ng polling agent v\xe0 kh\xf4ng cho sửa danh s\xe1ch server."}):null,(0,r.jsxs)("div",{className:"flex w-fit rounded-xl border border-border bg-surface p-1 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>i("realtime"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"realtime"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"monitor_heart"}),"Realtime Monitor"]}),(0,r.jsxs)("button",{type:"button",onClick:()=>i("history"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"history"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"query_stats"}),"History"]}),(0,r.jsxs)("button",{type:"button",onClick:()=>i("ai"),className:`flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold transition ${"ai"===n?"bg-primary text-white shadow-sm":"text-text-muted hover:bg-surface-2 hover:text-text-main"}`,children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-[19px]",children:"neurology"}),"Đ\xe1nh gi\xe1 AI"]})]}),R?(0,r.jsxs)("div",{className:`flex items-center justify-between rounded-xl border px-4 py-3 text-sm ${"error"===R.type?"border-red-500/20 bg-red-500/10 text-red-600 dark:text-red-300":"border-amber-500/20 bg-amber-500/10 text-amber-700 dark:text-amber-300"}`,children:[(0,r.jsx)("span",{children:R.text}),(0,r.jsx)("button",{onClick:()=>H(null),children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"close"})})]}):null,d.length?(0,r.jsxs)(r.Fragment,{children:["ai"!==n?(0,r.jsx)($,{servers:d,selectedId:c,onSelect:x}):null,"ai"===n?(0,r.jsx)(z,{modelOptions:ea,selectedModel:en,onSelectModel:eg,analysis:ed,loading:ec,error:em,onAnalyze:ef,standby:es}):ej?"realtime"===n?(0,r.jsxs)("section",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-4 border-b border-border px-6 py-5",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,r.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[27px]",children:"dns"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(P,{online:ey}),(0,r.jsx)("h3",{className:"truncate text-lg font-semibold text-text-main",children:ej.name})]}),(0,r.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-3 text-xs text-text-muted",children:[(0,r.jsx)("span",{className:"font-mono",children:ej.host}),ev?.os?(0,r.jsx)("span",{children:ev.os}):null,ev?.uptimeSeconds?(0,r.jsxs)("span",{children:["Uptime ",(t=Math.floor((e=Number(ev.uptimeSeconds)||0)/86400),s=Math.floor(e%86400/3600),l=Math.floor(e%3600/60),t?`${t} ng\xe0y ${s} giờ`:s?`${s} giờ ${l} ph\xfat`:`${l} ph\xfat`)]}):null]})]})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:`rounded-full px-3 py-1.5 text-xs font-semibold ${ey?"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400":"bg-red-500/10 text-red-600 dark:text-red-300"}`,children:ey?"Online":"Offline"}),es?null:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{type:"button",onClick:()=>D(!0),className:"rounded-xl p-2 text-text-muted hover:bg-primary/10 hover:text-primary",title:"Sửa server v\xe0 c\xe0i lại agent",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"edit"})}),(0,r.jsx)("button",{type:"button",onClick:()=>L(ej),className:"rounded-xl p-2 text-text-muted hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a khỏi dashboard",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"delete"})})]})]})]}),ey?null:(0,r.jsx)("div",{className:"m-6 rounded-2xl border border-amber-500/20 bg-amber-500/8 p-5",children:(0,r.jsxs)("div",{className:"flex gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-amber-500",children:"cloud_off"}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"font-semibold text-text-main",children:"Kh\xf4ng kết nối được agent"}),(0,r.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:ej.lastError||"Agent chưa gửi dữ liệu. Kiểm tra firewall v\xe0 agent port."}),ej.lastInstallLog?(0,r.jsxs)("details",{className:"mt-3",children:[(0,r.jsx)("summary",{className:"cursor-pointer text-xs font-semibold text-amber-600",children:"Xem log c\xe0i đặt"}),(0,r.jsx)("pre",{className:"mt-2 max-h-48 overflow-auto whitespace-pre-wrap rounded-xl bg-black/80 p-3 text-xs text-white",children:ej.lastInstallLog})]}):null]})]})}),ev?(0,r.jsxs)("div",{className:"space-y-7 p-6",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"mb-5 flex items-center gap-2",children:[(0,r.jsx)("span",{className:"h-5 w-1 rounded-full bg-primary"}),(0,r.jsx)("h3",{className:"font-semibold text-text-main",children:"Tổng quan t\xe0i nguy\xean"}),(0,r.jsxs)("span",{className:"ml-auto text-xs text-text-muted",children:["Cập nhật ",S(ej.lastStatusAt)]})]}),(0,r.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2 xl:grid-cols-4",children:[(0,r.jsx)(C,{value:ev.cpu?.usagePercent,label:"CPU",detail:`${ev.cpu?.cores||0} cores \xb7 Load ${ev.cpu?.load1??0}`,icon:"developer_board"}),(0,r.jsx)(C,{value:ev.memory?.usagePercent,label:"RAM",detail:`${k(ev.memory?.usedBytes)} / ${k(ev.memory?.totalBytes)}`,icon:"memory_alt"}),(0,r.jsx)(C,{value:eN?.usagePercent,label:"Disk /",detail:`${k(eN?.usedBytes)} / ${k(eN?.totalBytes)}`,icon:"hard_drive"}),(0,r.jsx)(C,{value:ev.gpus?.length?Math.max(...ev.gpus.map(e=>e.usagePercent||0)):0,label:ev.gpus?.length?`${ev.gpus.length} NVIDIA GPU`:"GPU",detail:ev.gpus?.length?`${ev.gpus.length} card được ph\xe1t hiện`:"Kh\xf4ng c\xf3 NVIDIA GPU",color:"#10b981",icon:"memory"})]})]}),(0,r.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[(0,r.jsx)(U,{icon:"developer_board",label:"CPU",value:ev.cpu?.model||`${ev.cpu?.cores||0} cores`,sublabel:`Load average ${ev.cpu?.load1??0} / ${ev.cpu?.load5??0} / ${ev.cpu?.load15??0}`}),(0,r.jsx)(U,{icon:"swap_vert",label:"Network realtime",value:`↓ ${k(ev.network?.rxBytesPerSecond)}/s`,sublabel:`↑ ${k(ev.network?.txBytesPerSecond)}/s`,colorClass:"text-cyan-500"}),(0,r.jsx)(U,{icon:"hard_drive",label:"Disk root",value:`${k(eN?.freeBytes)} trống`,sublabel:`${eN?.device||"root"} \xb7 ${eN?.filesystem||"filesystem"}`,colorClass:"text-violet-500"}),(0,r.jsx)(U,{icon:"memory",label:"Swap",value:k(ev.memory?.swapUsedBytes),sublabel:`Tổng ${k(ev.memory?.swapTotalBytes)}`,colorClass:"text-amber-500"})]}),(0,r.jsxs)("div",{className:"grid gap-5 xl:grid-cols-2",children:[(0,r.jsx)(M,{data:ew,dataKey:"cpu",label:"CPU usage",color:"#3b9dec"}),(0,r.jsx)(M,{data:ew,dataKey:"memory",label:"RAM usage",color:"#8b5cf6"})]}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"mb-4 flex items-center gap-2",children:[(0,r.jsx)("span",{className:"h-5 w-1 rounded-full bg-emerald-500"}),(0,r.jsxs)("h3",{className:"font-semibold text-text-main",children:["NVIDIA GPU (",ev.gpus?.length||0,")"]})]}),ev.gpus?.length?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(I,{data:ew,gpus:ev.gpus}),(0,r.jsx)("div",{className:"grid gap-5 xl:grid-cols-2",children:ev.gpus.map(e=>(0,r.jsx)(E,{gpu:e},e.uuid||e.index))})]}):(0,r.jsxs)("div",{className:"rounded-2xl border border-dashed border-border bg-surface-2/40 py-10 text-center text-sm text-text-muted",children:["Kh\xf4ng ph\xe1t hiện NVIDIA GPU hoặc"," ",(0,r.jsx)("span",{className:"font-mono",children:"nvidia-smi"})," chưa sẵn s\xe0ng."]})]})]}):null]}):(0,r.jsx)(F,{server:ej,data:q,meta:X,period:V,onPeriodChange:W,loading:Y,error:ee}):null]}):(0,r.jsxs)("div",{className:"flex min-h-[460px] flex-col items-center justify-center rounded-3xl border border-dashed border-border bg-surface px-6 text-center",children:[(0,r.jsx)("div",{className:"flex h-20 w-20 items-center justify-center rounded-3xl bg-primary/10 text-primary",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[42px]",children:"monitor_heart"})}),(0,r.jsx)("h3",{className:"mt-6 text-xl font-semibold text-text-main",children:"Chưa c\xf3 Linux server"}),(0,r.jsx)("p",{className:"mt-2 max-w-lg text-sm leading-6 text-text-muted",children:"Th\xeam server bằng t\xe0i khoản SSH c\xf3 quyền sudo. BlueRouter sẽ tự c\xe0i agent systemd v\xe0 bắt đầu hiển thị t\xe0i nguy\xean ngay tại đ\xe2y."}),es?null:(0,r.jsx)(b.default,{className:"mt-6",icon:"add",onClick:()=>y(!0),children:"Th\xeam server đầu ti\xean"})]}),(0,r.jsx)(K,{open:v&&!es,onClose:()=>y(!1),onCreated:async(e,t)=>{t&&!t.ok&&H({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,r.jsx)(G,{open:A&&!es,server:ej,onClose:()=>D(!1),onUpdated:async(e,t)=>{t&&!t.ok&&H({type:"warning",text:"Đ\xe3 lưu server nhưng c\xe0i lại agent chưa th\xe0nh c\xf4ng. Mở server để xem log."}),await ep()}}),(0,r.jsx)(f.ConfirmModal,{isOpen:!!_,onClose:()=>L(null),onConfirm:ek,loading:B,variant:"danger",title:"X\xf3a server khỏi dashboard?",confirmText:"X\xf3a server",cancelText:"Hủy",message:"Server sẽ ngừng được theo d\xf5i. Agent systemd tr\xean Linux kh\xf4ng bị gỡ tự động."})]})}},92542:(e,t,s)=>{"use strict";s.d(t,{default:()=>i});var r=s(95155),a=s(31474);let l={primary:"bg-brand-500 hover:bg-brand-600 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted",secondary:"bg-surface-2 hover:bg-surface-3 text-text-main border border-border disabled:opacity-50",outline:"border border-border text-text-main hover:bg-surface-2 hover:border-brand-500/40",ghost:"text-text-muted hover:bg-surface-2 hover:text-text-main",danger:"bg-red-500 hover:bg-red-600 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted",success:"bg-green-600 hover:bg-green-700 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted"},n={sm:"h-7 px-3 text-xs rounded-[8px]",md:"h-9 px-4 text-sm rounded-[10px]",lg:"h-11 px-6 text-sm rounded-[10px]"};function i({children:e,variant:t="primary",size:s="md",icon:d,iconRight:o,disabled:c=!1,loading:x=!1,fullWidth:m=!1,className:u,...h}){return(0,r.jsxs)("button",{className:(0,a.cn)("inline-flex items-center justify-center gap-2 font-semibold transition-all duration-150 ease-out cursor-pointer","active:scale-[0.97] disabled:opacity-50 disabled:cursor-not-allowed disabled:active:scale-100",l[t],n[s],m&&"w-full",u),disabled:c||x,...h,children:[x?(0,r.jsx)("span",{className:"material-symbols-outlined animate-spin text-[18px]",children:"progress_activity"}):d?(0,r.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:d}):null,e,o&&!x&&(0,r.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:o})]})}},96413:(e,t,s)=>{Promise.resolve().then(s.bind(s,86243))},97677:(e,t,s)=>{"use strict";s.d(t,{default:()=>a});var r=s(95155);function a({text:e,children:t,position:s="top",color:l}){let n=l?"":"bg-gray-900";return(0,r.jsxs)("div",{className:"relative inline-flex group",children:[t,(0,r.jsx)("div",{className:`pointer-events-none absolute ${{top:"bottom-full left-1/2 -translate-x-1/2 mb-1.5",bottom:"top-full left-1/2 -translate-x-1/2 mt-1.5",left:"right-full top-1/2 -translate-y-1/2 mr-1.5",right:"left-full top-1/2 -translate-y-1/2 ml-1.5"}[s]} z-50 w-max max-w-56 rounded px-2 py-1 text-[11px] leading-snug ${n} text-white opacity-0 group-hover:opacity-100 transition-opacity duration-150 whitespace-normal`,style:l?{backgroundColor:l}:{},children:e})]})}}},e=>{e.O(0,[506,6483,8441,3794,7358],()=>e(e.s=96413)),_N_E=e.O()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "5.1.59",
3
+ "version": "5.1.61",
4
4
  "description": "Router web dashboard",
5
5
  "private": false,
6
6
  "scripts": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jheavenknows/bluerouter",
3
- "version": "5.1.59",
3
+ "version": "5.1.61",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"
@@ -1 +0,0 @@
1
- "use strict";exports.id=12,exports.ids=[12],exports.modules={80012:(a,b,c)=>{c.d(b,{proxyAwareFetch:()=>p});var d=c(27910);let e=globalThis.fetch,f=new Map,g=new Map,h=["cloudcode-pa.googleapis.com","daily-cloudcode-pa.googleapis.com","api.individual.githubcopilot.com","q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com","api2.cursor.sh"],i=["8.8.8.8","8.8.4.4"];function j(a){return null==a?"":String(a).trim()}async function k(a){let b=g.get(a);if(b&&Date.now()<b.expiry)return b.ip;try{let b=await Promise.resolve().then(c.t.bind(c,14985,23)),{promisify:d}=await Promise.resolve().then(c.t.bind(c,28354,23)),e=new b.Resolver;e.setServers(i);let f=d(e.resolve4.bind(e)),h=await f(a);return g.set(a,{ip:h[0],expiry:Date.now()+3e5}),h[0]}catch(b){return console.warn(`[ProxyFetch] DNS resolve failed for ${a}:`,b.message),null}}function l(a,b){let c,d=j(b);if(!d)return!1;try{c=new URL(a).hostname.toLowerCase()}catch{return!1}return d.split(",").map(a=>a.trim().toLowerCase()).filter(Boolean).some(a=>"*"===a||(a.startsWith(".")?c.endsWith(a)||c===a.slice(1):c===a||c.endsWith(`.${a}`)))}function m(a){let b=j(a);if(!b)return null;try{return new URL(b),b}catch{return`http://${b}`}}async function n(a){let b=m(a);if(!b)return null;if(!f.has(b)){f.size>=20&&f.delete(f.keys().next().value);let{ProxyAgent:a}=await Promise.resolve().then(c.t.bind(c,3433,19));f.set(b,new a({uri:b}))}return f.get(b)}async function o(a,b,e){let f=await Promise.resolve().then(c.t.bind(c,55591,23)),g=await Promise.resolve().then(c.t.bind(c,91645,23)),h=f.default??f,i=g.default??g;return new Promise((c,f)=>{let g=new i.Socket;g.connect(443,b,()=>{let b={socket:g,servername:a.hostname,path:a.pathname+a.search,method:e.method||"POST",headers:{...e.headers,Host:a.hostname}},i=h.request(b,a=>{let b={ok:a.statusCode>=200&&a.statusCode<300,status:a.statusCode,statusText:a.statusMessage,headers:new Map(Object.entries(a.headers)),body:d.Readable.toWeb(a),text:async()=>{let b=[];for await(let c of a)b.push(c);return Buffer.concat(b).toString()},json:async()=>JSON.parse(await b.text())};c(b)});i.on("error",f),e.body&&i.write("string"==typeof e.body?e.body:JSON.stringify(e.body)),i.end()}),g.on("error",f)})}async function p(a,b={},c=null){let d="string"==typeof a?a:a.toString(),f=j(c?.vercelRelayUrl);if(f){let a=new URL(d),c={...b.headers,"x-relay-target":`${a.protocol}//${a.host}`,"x-relay-path":`${a.pathname}${a.search}`};return e(f,{...b,headers:c})}let g=function(a,b){if(b?.enabled!==!0&&b?.connectionProxyEnabled!==!0)return null;let c=j(b?.url??b?.connectionProxyUrl);if(!c)return null;let d=j(b?.noProxy??b?.connectionNoProxy);return d&&l(a,d)?null:m(c)}(d,c),i=g?null:m(function(a){let b;if(l(a,process.env.NO_PROXY||process.env.no_proxy))return null;try{b=new URL(a).protocol}catch{return null}return"https:"===b?process.env.HTTPS_PROXY||process.env.https_proxy||process.env.ALL_PROXY||process.env.all_proxy:process.env.HTTP_PROXY||process.env.http_proxy||process.env.ALL_PROXY||process.env.all_proxy}(d)),q=g||i;if(function(a){try{let b=new URL(a).hostname;return h.some(a=>b.includes(a))}catch{return!1}}(d)){if(q)try{let c=await n(q);return await e(a,{...b,dispatcher:c})}catch(a){if(c?.strictProxy===!0)throw Error(`[ProxyFetch] Proxy required but failed (strictProxy=true): ${a.message}`);console.warn(`[ProxyFetch] Proxy failed, falling back to direct bypass: ${a.message}`)}try{let a=new URL(d),c=await k(a.hostname);if(c)return await o(a,c,b)}catch(a){console.warn(`[ProxyFetch] MITM bypass failed: ${a.message}`)}}if(q)try{let c=await n(q);return await e(a,{...b,dispatcher:c})}catch(a){if(c?.strictProxy===!0)throw Error(`[ProxyFetch] Proxy required but failed (strictProxy=true): ${a.message}`);console.warn(`[ProxyFetch] Proxy failed, falling back to direct: ${a.message}`)}return e(a,b)}async function q(a,b={}){return p(a,b,null)}globalThis.fetch!==q&&(globalThis.fetch=q)}};
@@ -1,4 +0,0 @@
1
- "use strict";exports.id=1231,exports.ids=[1231],exports.modules={11231:(a,b,c)=>{async function d(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()}c.d(b,{ensureResourceMonitorCollector:()=>n}),c(79646);var e=c(14938),f=c(24081),g=c(50743);function h(a){let b=Number(a);return Number.isFinite(b)?b:0}async function i(a,b){var c;if(!a||!b)return!1;let d=new Date(b.updatedAt||Date.now()).getTime(),e=6e4*Math.floor((Number.isFinite(d)?d:Date.now())/6e4),i=b.disks?.find(a=>"/"===a.mount)||b.disks?.[0]||{},j=await (0,f.c)();return j.run(`INSERT OR IGNORE INTO resourceMonitorHistory(
2
- serverId, sampledAt, cpuUsage, memoryUsage, diskUsage, diskUsedBytes,
3
- networkRxBps, networkTxBps, gpus
4
- ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)`,[String(a),e,h(b.cpu?.usagePercent),h(b.memory?.usagePercent),h(i.usagePercent),h(i.usedBytes),h(b.network?.rxBytesPerSecond),h(b.network?.txBytesPerSecond),(0,g.s)((Array.isArray(c=b.gpus)?c:[]).map(a=>({id:String(a?.uuid||`index-${a?.index??0}`),uuid:String(a?.uuid||""),index:h(a?.index),name:String(a?.name||`NVIDIA GPU ${a?.index??0}`),usagePercent:h(a?.usagePercent),memoryUsagePercent:h(a?.memoryUsagePercent),temperatureC:a?.temperatureC==null?null:h(a.temperatureC),powerDrawW:a?.powerDrawW==null?null:h(a.powerDrawW)})))]),(!globalThis.__resourceHistoryLastPruneAt||Date.now()-globalThis.__resourceHistoryLastPruneAt>36e5)&&(globalThis.__resourceHistoryLastPruneAt=Date.now(),j.run("DELETE FROM resourceMonitorHistory WHERE sampledAt < ?",[Date.now()-2592e6])),!0}var j=c(75870);let k="__blueRouterResourceMonitorCollector";function l(){return globalThis[k]||(globalThis[k]={timer:null,running:null,started:!1}),globalThis[k]}async function m(){let a=l();return a.running||(a.running=(async()=>{if(await (0,j.WR)())return;let a=await (0,e.HI)({includeSecrets:!0});await Promise.allSettled(a.filter(a=>!1!==a.enabled).map(async a=>{let b=await d(a);await i(a.id,b)}))})().finally(()=>{a.running=null})),a.running}function n(){let a=l();if(a.started)return;a.started=!0;let b=async()=>{try{await m()}catch(a){console.warn("[resource-monitor] history collector failed:",a?.message||a)}finally{a.timer=setTimeout(b,6e4),a.timer.unref?.()}};a.timer=setTimeout(b,5e3),a.timer.unref?.()}},14938:(a,b,c)=>{c.d(b,{HI:()=>t,x8:()=>u});var d=c(55511),e=c.n(d),f=c(79748),g=c.n(f),h=c(21820),i=c.n(h),j=c(33873),k=c.n(j);let l=process.env.DATA_DIR||process.env.BLUEROUTER_DATA_DIR||k().join(i().homedir(),".bluerouter"),m=k().join(l,"resource-monitor-servers.json");async function n(){await g().mkdir(l,{recursive:!0});try{let a=JSON.parse(await g().readFile(m,"utf8"));return{servers:Array.isArray(a?.servers)?a.servers:[]}}catch{return{servers:[]}}}async function o(a){await g().mkdir(l,{recursive:!0});let b=`${m}.${process.pid}.${e().randomUUID()}.tmp`;try{await g().writeFile(b,JSON.stringify({servers:a.servers||[]},null,2)),await g().rename(b,m)}catch(a){throw await g().unlink(b).catch(()=>{}),a}}function p(){return new Date().toISOString()}function q(a,b,c,d=null){return Object.prototype.hasOwnProperty.call(a,c)?a[c]:Object.prototype.hasOwnProperty.call(b,c)?b[c]:d}function r(a={},b={}){let c=String(a.host??b.host??"").trim();return{id:b.id||a.id||e().randomUUID(),name:String(a.name??b.name??c??"Linux server").trim()||c||"Linux server",host:c,sshPort:Math.max(1,Number(a.sshPort??b.sshPort??22)||22),sshUser:String(a.sshUser??b.sshUser??"root").trim()||"root",useSudo:a.useSudo??b.useSudo??!0,agentPort:Math.max(1,Number(a.agentPort??b.agentPort??19998)||19998),agentToken:String(a.agentToken??b.agentToken??e().randomBytes(24).toString("hex")),enabled:a.enabled??b.enabled??!0,notes:String(a.notes??b.notes??"").trim(),lastStatus:q(a,b,"lastStatus"),lastStatusAt:q(a,b,"lastStatusAt"),lastError:q(a,b,"lastError"),lastErrorAt:q(a,b,"lastErrorAt"),lastInstallAt:q(a,b,"lastInstallAt"),lastInstallOk:q(a,b,"lastInstallOk",!1),lastInstallLog:q(a,b,"lastInstallLog",""),createdAt:b.createdAt||p(),updatedAt:p()}}function s(a){if(!a)return null;let{agentToken:b,...c}=a;return c}async function t({includeSecrets:a=!1}={}){let b=(await n()).servers.map(a=>r(a,a));return a?b:b.map(s)}async function u(a){if(!Array.isArray(a))throw Error("Invalid resource monitor servers payload");let b=new Set,c=a.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor server entry");let c=String(a.id||"").trim();if(!c)throw Error("Resource monitor server ID is required");if(b.has(c))throw Error(`Duplicate resource monitor server ID: ${c}`);return b.add(c),r({...a,id:c},{...a,id:c})});return await o({servers:c}),c}},20437:(a,b,c)=>{c.d(b,{AL:()=>j,HG:()=>i,Jh:()=>m,KQ:()=>k,Or:()=>l});var d=c(76760),e=c.n(d),f=c(73024),g=c.n(f),h=c(53859);let i=e().join(h.n,"db"),j=e().join(i,"data.sqlite"),k=e().join(i,"backups"),l={main:e().join(h.n,"db.json"),usage:e().join(h.n,"usage.json"),disabled:e().join(h.n,"disabledModels.json"),details:e().join(h.n,"request-details.json")};function m(){for(let a of[h.n,i,k])g().existsSync(a)||g().mkdirSync(a,{recursive:!0})}},24081:(a,b,c)=>{c.d(b,{c:()=>k});var d=c(20437);global._dbAdapter||(global._dbAdapter={instance:null,initPromise:null,logged:!1});let e=global._dbAdapter;async function f(){if(!process.versions.bun)return null;try{let{createBunSqliteAdapter:a}=await c.e(8062).then(c.bind(c,38062));return await a(d.AL)}catch(a){return console.warn(`[DB] bun:sqlite unavailable: ${a.message}`),null}}async function g(){if(process.versions.bun)return null;try{let{createBetterSqliteAdapter:a}=await c.e(8469).then(c.bind(c,88469));return a(d.AL)}catch(a){return console.warn(`[DB] better-sqlite3 unavailable: ${a.message}`),null}}async function h(){if(process.versions.bun)return null;let[a,b]=process.versions.node.split(".").map(Number);if(a<22||22===a&&b<5)return null;try{let{createNodeSqliteAdapter:a}=await c.e(4803).then(c.bind(c,54803));return await a(d.AL)}catch(a){return console.warn(`[DB] node:sqlite unavailable: ${a.message}`),null}}async function i(){try{let{createSqlJsAdapter:a}=await c.e(6252).then(c.bind(c,66252));return await a(d.AL)}catch(a){return console.warn(`[DB] sql.js unavailable: ${a.message}`),null}}async function j(){(0,d.Jh)();let a=await f();if(a||(a=await g()),a||(a=await h()),a||(a=await i()),!a)throw Error("[DB] No SQLite driver available (bun/better/node/sql.js all failed)");e.logged||(console.log(`[DB] Driver: ${a.driver} | file: ${d.AL}`),e.logged=!0);let{runMigrationOnce:b}=await c.e(3824).then(c.bind(c,83824));return await b(a),a}async function k(){return e.instance?e.instance:(e.initPromise||(e.initPromise=j().then(a=>(e.instance=a,a))),e.initPromise)}},50743:(a,b,c)=>{function d(a,b=null){if(null==a)return b;if("string"!=typeof a)return a;try{return JSON.parse(a)}catch{return b}}function e(a){return JSON.stringify(a??null)}c.d(b,{q:()=>d,s:()=>e})},53859:(a,b,c)=>{c.d(b,{n:()=>l});var d=c(73024),e=c.n(d),f=c(33873),g=c.n(f),h=c(21820),i=c.n(h);let j="bluerouter";function k(){return"win32"===process.platform?g().join(process.env.APPDATA||g().join(i().homedir(),"AppData","Roaming"),j):g().join(i().homedir(),`.${j}`)}let l=function(){let a=process.env.DATA_DIR;if(!a)return k();try{return e().mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${j}`),k();throw b}}()},75870:(a,b,c)=>{c.d(b,{Jc:()=>r,Q1:()=>s,WR:()=>u,X_:()=>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(53859);let k=i().join(j.n,"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.n,{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(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 u(){return"slave"===(await r({includeSecrets:!0})).role}}};
@@ -1,165 +0,0 @@
1
- "use strict";exports.id=5276,exports.ids=[5276],exports.modules={14938:(a,b,c)=>{c.d(b,{HI:()=>t,x8:()=>u});var d=c(55511),e=c.n(d),f=c(79748),g=c.n(f),h=c(21820),i=c.n(h),j=c(33873),k=c.n(j);let l=process.env.DATA_DIR||process.env.BLUEROUTER_DATA_DIR||k().join(i().homedir(),".bluerouter"),m=k().join(l,"resource-monitor-servers.json");async function n(){await g().mkdir(l,{recursive:!0});try{let a=JSON.parse(await g().readFile(m,"utf8"));return{servers:Array.isArray(a?.servers)?a.servers:[]}}catch{return{servers:[]}}}async function o(a){await g().mkdir(l,{recursive:!0});let b=`${m}.${process.pid}.${e().randomUUID()}.tmp`;try{await g().writeFile(b,JSON.stringify({servers:a.servers||[]},null,2)),await g().rename(b,m)}catch(a){throw await g().unlink(b).catch(()=>{}),a}}function p(){return new Date().toISOString()}function q(a,b,c,d=null){return Object.prototype.hasOwnProperty.call(a,c)?a[c]:Object.prototype.hasOwnProperty.call(b,c)?b[c]:d}function r(a={},b={}){let c=String(a.host??b.host??"").trim();return{id:b.id||a.id||e().randomUUID(),name:String(a.name??b.name??c??"Linux server").trim()||c||"Linux server",host:c,sshPort:Math.max(1,Number(a.sshPort??b.sshPort??22)||22),sshUser:String(a.sshUser??b.sshUser??"root").trim()||"root",useSudo:a.useSudo??b.useSudo??!0,agentPort:Math.max(1,Number(a.agentPort??b.agentPort??19998)||19998),agentToken:String(a.agentToken??b.agentToken??e().randomBytes(24).toString("hex")),enabled:a.enabled??b.enabled??!0,notes:String(a.notes??b.notes??"").trim(),lastStatus:q(a,b,"lastStatus"),lastStatusAt:q(a,b,"lastStatusAt"),lastError:q(a,b,"lastError"),lastErrorAt:q(a,b,"lastErrorAt"),lastInstallAt:q(a,b,"lastInstallAt"),lastInstallOk:q(a,b,"lastInstallOk",!1),lastInstallLog:q(a,b,"lastInstallLog",""),createdAt:b.createdAt||p(),updatedAt:p()}}function s(a){if(!a)return null;let{agentToken:b,...c}=a;return c}async function t({includeSecrets:a=!1}={}){let b=(await n()).servers.map(a=>r(a,a));return a?b:b.map(s)}async function u(a){if(!Array.isArray(a))throw Error("Invalid resource monitor servers payload");let b=new Set,c=a.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor server entry");let c=String(a.id||"").trim();if(!c)throw Error("Resource monitor server ID is required");if(b.has(c))throw Error(`Duplicate resource monitor server ID: ${c}`);return b.add(c),r({...a,id:c},{...a,id:c})});return await o({servers:c}),c}},20437:(a,b,c)=>{c.d(b,{AL:()=>j,HG:()=>i,Jh:()=>m,KQ:()=>k,Or:()=>l});var d=c(76760),e=c.n(d),f=c(73024),g=c.n(f),h=c(53859);let i=e().join(h.n,"db"),j=e().join(i,"data.sqlite"),k=e().join(i,"backups"),l={main:e().join(h.n,"db.json"),usage:e().join(h.n,"usage.json"),disabled:e().join(h.n,"disabledModels.json"),details:e().join(h.n,"request-details.json")};function m(){for(let a of[h.n,i,k])g().existsSync(a)||g().mkdirSync(a,{recursive:!0})}},24081:(a,b,c)=>{c.d(b,{c:()=>k});var d=c(20437);global._dbAdapter||(global._dbAdapter={instance:null,initPromise:null,logged:!1});let e=global._dbAdapter;async function f(){if(!process.versions.bun)return null;try{let{createBunSqliteAdapter:a}=await c.e(8062).then(c.bind(c,38062));return await a(d.AL)}catch(a){return console.warn(`[DB] bun:sqlite unavailable: ${a.message}`),null}}async function g(){if(process.versions.bun)return null;try{let{createBetterSqliteAdapter:a}=await c.e(8469).then(c.bind(c,88469));return a(d.AL)}catch(a){return console.warn(`[DB] better-sqlite3 unavailable: ${a.message}`),null}}async function h(){if(process.versions.bun)return null;let[a,b]=process.versions.node.split(".").map(Number);if(a<22||22===a&&b<5)return null;try{let{createNodeSqliteAdapter:a}=await c.e(4803).then(c.bind(c,54803));return await a(d.AL)}catch(a){return console.warn(`[DB] node:sqlite unavailable: ${a.message}`),null}}async function i(){try{let{createSqlJsAdapter:a}=await c.e(6252).then(c.bind(c,66252));return await a(d.AL)}catch(a){return console.warn(`[DB] sql.js unavailable: ${a.message}`),null}}async function j(){(0,d.Jh)();let a=await f();if(a||(a=await g()),a||(a=await h()),a||(a=await i()),!a)throw Error("[DB] No SQLite driver available (bun/better/node/sql.js all failed)");e.logged||(console.log(`[DB] Driver: ${a.driver} | file: ${d.AL}`),e.logged=!0);let{runMigrationOnce:b}=await c.e(3824).then(c.bind(c,83824));return await b(a),a}async function k(){return e.instance?e.instance:(e.initPromise||(e.initPromise=j().then(a=>(e.instance=a,a))),e.initPromise)}},45874:(a,b,c)=>{c.d(b,{Xx:()=>j,exportSettings:()=>k,getSettings:()=>i});var d=c(24081),e=c(50743);let f={cloudEnabled:!1,tunnelEnabled:!1,tunnelUrl:"",tunnelProvider:"cloudflare",tailscaleEnabled:!1,tailscaleUrl:"",stickyRoundRobinLimit:3,providerStrategies:{},providerSchedules:{},providerHealthChecks:{},comboStrategy:"fallback",comboStickyRoundRobinLimit:1,comboStrategies:{},requireApiKey:!0,requireLogin:!0,tunnelDashboardAccess:!0,authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcClientSecret:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC",ldapMonitorAdminGroupDn:"",enableObservability:!0,observabilityMaxRecords:1e3,observabilityBatchSize:20,observabilityFlushIntervalMs:5e3,observabilityMaxJsonSize:5,outboundProxyEnabled:!1,outboundProxyUrl:"",outboundNoProxy:"",mitmRouterBaseUrl:"http://localhost:20128",dnsToolEnabled:{},rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",sidebarAdvancedToolsVisible:!0,personalOAuthProviderPermissions:{},siteTitle:"",siteShortName:"",siteDescription:"",brandingLogo:null,brandingFavicon:null};async function g(){let a=(await (0,d.c)()).get("SELECT data FROM settings WHERE id = 1");return a?(0,e.q)(a.data,{}):{}}function h(a){let b={...f,...a||{}};for(let[a,c]of Object.entries(f))void 0===b[a]&&("outboundProxyEnabled"===a&&"string"==typeof b.outboundProxyUrl&&b.outboundProxyUrl.trim()?b[a]=!0:b[a]=c);return b.requireApiKey=!0,b.requireLogin=!0,b}async function i(){return h(await g())}async function j(a){let b,c=await (0,d.c)();return c.transaction(()=>{let d=c.get("SELECT data FROM settings WHERE id = 1");b={...d?(0,e.q)(d.data,{}):{},...a,requireApiKey:!0,requireLogin:!0},c.run("INSERT INTO settings(id, data) VALUES(1, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data",[(0,e.s)(b)])}),h(b)}async function k(){return await g()}},50743:(a,b,c)=>{function d(a,b=null){if(null==a)return b;if("string"!=typeof a)return a;try{return JSON.parse(a)}catch{return b}}function e(a){return JSON.stringify(a??null)}c.d(b,{q:()=>d,s:()=>e})},53859:(a,b,c)=>{c.d(b,{n:()=>l});var d=c(73024),e=c.n(d),f=c(33873),g=c.n(f),h=c(21820),i=c.n(h);let j="bluerouter";function k(){return"win32"===process.platform?g().join(process.env.APPDATA||g().join(i().homedir(),"AppData","Roaming"),j):g().join(i().homedir(),`.${j}`)}let l=function(){let a=process.env.DATA_DIR;if(!a)return k();try{return e().mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${j}`),k();throw b}}()},58609:(a,b,c)=>{c.d(b,{U:()=>f});var d=c(24081),e=c(50743);function f(a){return{async get(b,c=null){let f=(await (0,d.c)()).get("SELECT value FROM kv WHERE scope = ? AND key = ?",[a,b]);return f?(0,e.q)(f.value,c):c},async getAll(){let b=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[a]),c={};for(let a of b)c[a.key]=(0,e.q)(a.value);return c},async set(b,c){(await (0,d.c)()).run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,b,(0,e.s)(c)])},async setMany(b){let c=await (0,d.c)();c.transaction(()=>{for(let[d,f]of Object.entries(b))c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,d,(0,e.s)(f)])})},async remove(b){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ? AND key = ?",[a,b])},async clear(){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ?",[a])}}}},76087:(a,b,c)=>{c.d(b,{Mc:()=>z,getProviderConnections:()=>y,rj:()=>A});var d=c(24081),e=c(50743),f=c(77598),g=c.n(f),h=c(73024),i=c.n(h),j=c(76760),k=c.n(j),l=c(53859);let m="enc:v1:",n=k().join(l.n,"credential-encryption-key"),o=null;function p(a){let b=String(a||"").trim();if(!b)return null;if(/^[a-f0-9]{64}$/i.test(b))return Buffer.from(b,"hex");let c=b.replace(/-/g,"+").replace(/_/g,"/"),d=c+"=".repeat((4-c.length%4)%4),e=Buffer.from(d,"base64");return 32===e.length?e:null}function q(a){let b=String(process.env.BLUEROUTER_CREDENTIAL_ENCRYPTION_KEY_ID||"").trim();return b||g().createHash("sha256").update(a).digest("hex").slice(0,12)}function r(a=null){if(a?.key){let b=Buffer.isBuffer(a.key)?a.key:p(a.key);if(!b||32!==b.length)throw Error("Credential encryption key must be exactly 32 bytes");return{key:b,keyId:a.keyId||q(b)}}if(o)return o;let b=process.env.BLUEROUTER_CREDENTIAL_ENCRYPTION_KEY,c=b?p(b):function(){try{let a=p(i().readFileSync(n,"utf8"));if(!a)throw Error("Credential encryption key file is invalid");return a}catch(a){if(a?.code!=="ENOENT")throw a}i().mkdirSync(l.n,{recursive:!0});let a=g().randomBytes(32);try{return i().writeFileSync(n,a.toString("base64"),{flag:"wx",mode:384}),a}catch(b){if(b?.code!=="EEXIST")throw b;let a=p(i().readFileSync(n,"utf8"));if(!a)throw Error("Credential encryption key file is invalid");return a}}();if(!c||32!==c.length)throw Error("BLUEROUTER_CREDENTIAL_ENCRYPTION_KEY must be a 32-byte base64 or 64-character hex value");return o={key:c,keyId:q(c)}}function s(a){return Buffer.from(`bluerouter:credential:v1:${a}`,"utf8")}function t(a){return"string"==typeof a&&a.startsWith(m)}let u=["accessToken","refreshToken","idToken","apiKey"];function v(a){return String(a||"").trim().toLowerCase()}function w(a){return"personal"===a?"personal":"system"}function x(a){if(!a)return null;let b=(0,e.q)(a.data,{});for(let a of u)Object.prototype.hasOwnProperty.call(b,a)&&(b[a]=function(a,b=null){if(!t(a))return a;let c=a.split(":");if(6!==c.length||"enc"!==c[0]||"v1"!==c[1])throw Error("Unsupported encrypted credential format");let d=Buffer.from(c[2],"base64url").toString("utf8"),e=Buffer.from(c[3],"base64url"),f=Buffer.from(c[4],"base64url"),h=Buffer.from(c[5],"base64url");if(12!==e.length||16!==f.length)throw Error("Encrypted credential payload is invalid");let{key:i}=r(b);try{let a=g().createDecipheriv("aes-256-gcm",i,e,{authTagLength:16});return a.setAAD(s(d)),a.setAuthTag(f),Buffer.concat([a.update(h),a.final()]).toString("utf8")}catch{throw Error(`Unable to decrypt credential with key ${d}`)}}(b[a]));let c=v(a.ownerUser||b.ownerUser),d=v(a.createdByUser||b.createdByUser),f=a.visibility||b.visibility||(c?"private":"system"),h="personal"===w(a.scope||b.scope)||c||"private"===f?"personal":"system";return{...b,id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive||!0===a.isActive,scope:h,ownerUser:c,createdByUser:d,visibility:f||("personal"===h?"private":"system"),createdAt:a.createdAt,updatedAt:a.updatedAt}}async function y(a={}){let b=await (0,d.c)(),c=[],e=[];a.provider&&(c.push("provider = ?"),e.push(a.provider)),void 0!==a.isActive&&(c.push("isActive = ?"),e.push(+!!a.isActive)),void 0!==a.scope&&"personal"===w(a.scope)?(c.push("(scope = ? OR visibility = ? OR length(trim(coalesce(ownerUser, ''))) > 0)"),e.push("personal","private")):(void 0!==a.scope||!0!==a.includePersonal)&&(c.push("scope = ?"),e.push("system"),c.push("coalesce(visibility, 'system') <> ?"),e.push("private"),c.push("length(trim(coalesce(ownerUser, ''))) = 0")),void 0!==a.ownerUser&&(c.push("lower(coalesce(ownerUser, '')) = ?"),e.push(v(a.ownerUser)));let f=`SELECT * FROM providerConnections${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,e).map(x);return g.sort((a,b)=>(a.priority||999)-(b.priority||999)),g}async function z(a){return x((await (0,d.c)()).get("SELECT * FROM providerConnections WHERE id = ?",[a]))}async function A(a,b){let c,f=await (0,d.c)();return f.transaction(()=>{let d=f.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!d){c=null;return}let h=x(d),i={...h,...b,updatedAt:new Date().toISOString()},j=new Set(u.filter(a=>Object.prototype.hasOwnProperty.call(b,a)));!function(a,b,c={}){let d=function(a,b={}){let{id:c,provider:d,authType:f,name:h,email:i,priority:j,isActive:k,scope:l,ownerUser:n,createdByUser:o,visibility:p,createdAt:q,updatedAt:x,...y}=a,z=b.storedData&&"object"==typeof b.storedData?b.storedData:null,A=b.encryptFields instanceof Set?b.encryptFields:null;for(let a of u)z&&A&&!A.has(a)&&Object.prototype.hasOwnProperty.call(z,a)?y[a]=z[a]:Object.prototype.hasOwnProperty.call(y,a)&&(y[a]=function(a,b=null){if(null==a||""===a||t(a)||"string"!=typeof a)return a;let{key:c,keyId:d}=r(b),e=Buffer.from(d,"utf8").toString("base64url"),f=g().randomBytes(12),h=g().createCipheriv("aes-256-gcm",c,f,{authTagLength:16});h.setAAD(s(d));let i=Buffer.concat([h.update(a,"utf8"),h.final()]),j=h.getAuthTag();return`${m}${e}:${f.toString("base64url")}:${j.toString("base64url")}:${i.toString("base64url")}`}(y[a]));let B=v(n),C=p||(B?"private":void 0),D="personal"===w(l)||B||"private"===C?"personal":"system";return{id:c,provider:d,authType:f,name:h??null,email:i??null,priority:j??null,isActive:+(!1!==k),scope:D,ownerUser:B,createdByUser:v(o),visibility:C||("personal"===D?"private":"system"),data:(0,e.s)(y),createdAt:q,updatedAt:x}}(b,c);a.run(`INSERT INTO providerConnections(id, provider, authType, name, email, priority, isActive, scope, ownerUser, createdByUser, visibility, data, createdAt, updatedAt)
2
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
3
- ON CONFLICT(id) DO UPDATE SET
4
- provider=excluded.provider, authType=excluded.authType, name=excluded.name,
5
- email=excluded.email, priority=excluded.priority, isActive=excluded.isActive,
6
- scope=excluded.scope, ownerUser=excluded.ownerUser, createdByUser=excluded.createdByUser,
7
- visibility=excluded.visibility, data=excluded.data, updatedAt=excluded.updatedAt`,[d.id,d.provider,d.authType,d.name,d.email,d.priority,d.isActive,d.scope,d.ownerUser,d.createdByUser,d.visibility,d.data,d.createdAt,d.updatedAt])}(f,i,{storedData:(0,e.q)(d.data,{}),encryptFields:j}),void 0!==b.priority&&function(a,b,c="system",d=""){let e=w(c),f=v(d),g=[b,e],h="SELECT * FROM providerConnections WHERE provider = ? AND scope = ?";"personal"===e?(h+=" AND lower(coalesce(ownerUser, '')) = ?",g.push(f)):h+=" AND coalesce(visibility, 'system') <> 'private' AND length(trim(coalesce(ownerUser, ''))) = 0";let i=a.all(h,g).map(x);i.sort((a,b)=>{let c=(a.priority||0)-(b.priority||0);return 0!==c?c:new Date(b.updatedAt||0)-new Date(a.updatedAt||0)}),i.forEach((b,c)=>{a.run("UPDATE providerConnections SET priority = ? WHERE id = ?",[c+1,b.id])})}(f,h.provider,i.scope,i.ownerUser),c=i}),c}},87517:(a,b,c)=>{c.d(b,{getApiKeyByKey:()=>p});var d=c(24081),e=c(50743);let f=Object.freeze({enabled:!0,requestsPerMinute:20,promptCharsMax:12e4,maxOutputTokens:0,forceThinkingOff:!0,allowedIpCidrs:[],expiresAt:""}),g=new Set(Object.keys(f));function h(a,b=0){let c=Number(a);return Number.isFinite(c)?Math.max(0,Math.floor(c)):b}function i(a,b=!0){if(null==a||""===a)return b;if("boolean"==typeof a)return a;if("number"==typeof a)return 0!==a;let c=String(a).trim().toLowerCase();return!["false","0","no","off"].includes(c)&&(!!["true","1","yes","on"].includes(c)||b)}function j(a){return a&&"object"==typeof a&&!Array.isArray(a)}let k=Object.freeze(["inherit","on","off"]),l=Object.freeze(["lite","full","ultra"]),m=!1;function n(a){return String(a||"").trim().toLowerCase()}async function o(a){if(!m)try{let b=a.all("PRAGMA table_info(apiKeys)"),c=new Set(b.map(a=>a.name));c.has("allowedModels")||a.run("ALTER TABLE apiKeys ADD COLUMN allowedModels TEXT DEFAULT '[]'"),c.has("limits")||a.run("ALTER TABLE apiKeys ADD COLUMN limits TEXT DEFAULT '{}'"),c.has("ownerUser")||a.run("ALTER TABLE apiKeys ADD COLUMN ownerUser TEXT DEFAULT ''"),c.has("createdByUser")||a.run("ALTER TABLE apiKeys ADD COLUMN createdByUser TEXT DEFAULT ''"),c.has("adminDisabled")||a.run("ALTER TABLE apiKeys ADD COLUMN adminDisabled INTEGER DEFAULT 0"),c.has("cavemanMode")||a.run("ALTER TABLE apiKeys ADD COLUMN cavemanMode TEXT DEFAULT 'inherit'"),c.has("cavemanLevel")||a.run("ALTER TABLE apiKeys ADD COLUMN cavemanLevel TEXT DEFAULT 'lite'");try{a.run("CREATE INDEX IF NOT EXISTS idx_ak_key ON apiKeys(key)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_owner ON apiKeys(ownerUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_by ON apiKeys(createdByUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_active ON apiKeys(isActive)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_admin_disabled ON apiKeys(adminDisabled)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_at ON apiKeys(createdAt)")}catch{}m=!0}catch(a){console.log("Could not ensure apiKeys columns:",a?.message||a)}}async function p(a){let b;if(!a)return null;let c=await (0,d.c)();await o(c);var m,p=c.get("SELECT * FROM apiKeys WHERE key = ?",[a]);return p?{id:p.id,key:p.key,name:p.name,machineId:p.machineId,isActive:1===p.isActive||!0===p.isActive,adminDisabled:1===p.adminDisabled||!0===p.adminDisabled,allowedModels:Array.isArray(m=(0,e.q)(p.allowedModels,[]))?[...new Set(m.map(a=>String(a||"").trim()).filter(Boolean))]:[],limits:function(a={}){var b;if(!(j(a)&&Object.keys(a).some(a=>g.has(a))))return{};let c=j(a)?a:{};return{enabled:i(c.enabled,f.enabled),requestsPerMinute:h(c.requestsPerMinute,0),promptCharsMax:h(c.promptCharsMax,0),maxOutputTokens:h(c.maxOutputTokens??c.outputTokensMax??c.maxTokens??c.max_tokens??c.max_completion_tokens,0),forceThinkingOff:i(c.forceThinkingOff,f.forceThinkingOff),allowedIpCidrs:Array.isArray(b=c.allowedIpCidrs)?[...new Set(b.map(a=>String(a||"").trim()).filter(Boolean))]:[],expiresAt:String(c.expiresAt||"").trim()}}((0,e.q)(p.limits,{})),ownerUser:n(p.ownerUser),createdByUser:n(p.createdByUser),cavemanMode:(b=String(p.cavemanMode||"inherit").trim().toLowerCase(),k.includes(b)?b:"inherit"),cavemanLevel:function(a,b="lite"){let c=String(a||b).trim().toLowerCase();return l.includes(c)?c:b}(p.cavemanLevel,"lite"),createdAt:p.createdAt}:null}},90181:(a,b,c)=>{c.d(b,{getPricingForModel:()=>g}),c(24081);let d=(0,c(58609).U)("pricing");async function e(){return await d.getAll()}function f(a,b){if(!a||!b)return null;if(a[b])return a[b];let c=String(b).toLowerCase();for(let b of Object.keys(a))if(b.toLowerCase()===c)return a[b];return null}async function g(a,b){if(!b)return null;let d=await e();if(a){let c=f(d,a);if(c){let a=f(c,b);if(a)return a}}let{getPricingForModel:g}=await c.e(7464).then(c.bind(c,87464));return g(a,b)}},95276:(a,b,c)=>{c.d(b,{Mc:()=>h.Mc,P:()=>h.getProviderConnections,hr:()=>i,mt:()=>g.getSettings,K1:()=>W,rj:()=>h.rj,Xx:()=>g.Xx});var d=c(24081),e=c(50743),f=c(14938),g=c(45874),h=c(76087);async function i(a){var b;return(b=(await (0,d.c)()).get("SELECT * FROM proxyPools WHERE id = ?",[a]))?{...(0,e.q)(b.data,{}),id:b.id,isActive:1===b.isActive||!0===b.isActive,testStatus:b.testStatus,createdAt:b.createdAt,updatedAt:b.updatedAt}:null}c(87517);var j=c(58609);(0,j.U)("modelAliases"),(0,j.U)("customModels"),(0,j.U)("mitmAlias"),c(90181);var k=c(94735);c(55511),c(51455),c(76760),c(53859);let l=new Set(["mysql","postgres"]),m={enabled:!1,fileLoggingEnabled:!1,type:"mysql",host:"",port:"",database:"",username:"",password:"",ssl:!1,createDatabase:!1,logClientRequest:!0,logSourceRequest:!0,logTargetRequest:!0,logProviderResponse:!1,logErrors:!0,retentionDays:30};function n(a={},b={}){let c=String(a?.type||b?.type||m.type).trim().toLowerCase(),d=!!c&&!l.has(c),e=d?m.type:c,f={...m,...b||{},...a||{},type:e};f.enabled=!!f.enabled,f.fileLoggingEnabled=!0===f.fileLoggingEnabled,f.ssl=!!f.ssl,f.createDatabase=!!f.createDatabase,f.logClientRequest=!1!==f.logClientRequest,f.logSourceRequest=!1!==f.logSourceRequest,f.logTargetRequest=!1!==f.logTargetRequest,f.logProviderResponse=!0===f.logProviderResponse,f.logErrors=!1!==f.logErrors;let g=Number(f.retentionDays);return f.retentionDays=Number.isFinite(g)&&g>0?Math.floor(g):30,"********"===f.password&&(f.password=b?.password||""),f.host=String(f.host||"").trim(),f.port=String(f.port||("postgres"===f.type?"5432":"3306")).trim(),f.database=String(f.database||"").trim(),f.username=String(f.username||"").trim(),f.password=String(f.password||""),!d||f.host||f.database||f.username||(f.enabled=!1),delete f.sqlitePath,f}async function o(){let a=await (0,g.getSettings)();return n(a?.promptLogDb||{})}let p=Number(process.env.OBSERVABILITY_MYSQL_MAX_JSON_BYTES||262144),q={expiresAt:0,value:null},r=!1,s=new Set;function t(a,b){s.has(a)||(s.add(a),console.warn(b))}function u(a){if(!a)return"";let b=[];return a.code&&b.push(`code=${a.code}`),a.errno&&b.push(`errno=${a.errno}`),a.sqlState&&b.push(`sqlState=${a.sqlState}`),a.sqlMessage?b.push(a.sqlMessage):a.message&&b.push(a.message),b.filter(Boolean).join(" | ")||String(a)}async function v(a,b){let[c]=await a.query("SELECT COLUMN_NAME AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.COLUMN_NAME||"")))}async function w(a,b){let[c]=await a.query("SELECT INDEX_NAME AS name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.INDEX_NAME||"")))}async function x(a,b,c){let d=await v(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD COLUMN ${f}`),d.add(e))}async function y(a,b,c){let d=await w(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD ${f}`),d.add(e))}async function z(a){await x(a,"usage_events",[["dedupe_key","dedupe_key VARCHAR(96) NULL"],["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["api_key_fingerprint","api_key_fingerprint VARCHAR(120) NULL"],["api_key_id","api_key_id VARCHAR(120) NULL"],["api_key_name","api_key_name VARCHAR(255) NULL"],["api_key_owner","api_key_owner VARCHAR(255) NULL"],["endpoint","endpoint TEXT NULL"],["request_id","request_id VARCHAR(120) NULL"],["session_id","session_id VARCHAR(255) NULL"],["client_ip","client_ip VARCHAR(64) NULL"],["client_ip_normalized","client_ip_normalized VARCHAR(64) NULL"],["client_host","client_host TEXT NULL"],["client_user_agent","client_user_agent TEXT NULL"],["source_tool","source_tool VARCHAR(80) NULL"],["source_tool_label","source_tool_label VARCHAR(120) NULL"],["source_host","source_host VARCHAR(255) NULL"],["latency_ms","latency_ms INT DEFAULT 0"],["ttft_ms","ttft_ms INT DEFAULT 0"],["status_code","status_code INT NULL"],["error_code","error_code VARCHAR(160) NULL"],["error_type","error_type VARCHAR(120) NULL"],["error_message_short","error_message_short TEXT NULL"],["is_streaming","is_streaming TINYINT DEFAULT 0"],["is_combo","is_combo TINYINT DEFAULT 0"],["combo_name","combo_name VARCHAR(255) NULL"],["prompt_tokens","prompt_tokens BIGINT DEFAULT 0"],["completion_tokens","completion_tokens BIGINT DEFAULT 0"],["total_tokens","total_tokens BIGINT DEFAULT 0"],["cached_tokens","cached_tokens BIGINT DEFAULT 0"],["reasoning_tokens","reasoning_tokens BIGINT DEFAULT 0"],["thinking_enabled","thinking_enabled TINYINT NULL"],["thinking_auto_off","thinking_auto_off TINYINT DEFAULT 0"],["thinking_auto_off_reason","thinking_auto_off_reason VARCHAR(120) NULL"],["prompt_chars","prompt_chars BIGINT DEFAULT 0"],["force_thinking_off_above_chars","force_thinking_off_above_chars BIGINT DEFAULT 0"],["cost","cost DECIMAL(18,8) DEFAULT 0"],["status","status VARCHAR(80) NULL"],["tokens_json","tokens_json JSON NULL"],["meta_json","meta_json JSON NULL"]]),await a.query("UPDATE usage_events SET dedupe_key = CONCAT('legacy:', id) WHERE dedupe_key IS NULL OR dedupe_key = ''").catch(()=>{}),await a.query("ALTER TABLE usage_events MODIFY COLUMN dedupe_key VARCHAR(96) NOT NULL").catch(()=>{}),await y(a,"usage_events",[["uq_usage_events_dedupe","UNIQUE KEY uq_usage_events_dedupe (dedupe_key)"],["idx_usage_events_ts","INDEX idx_usage_events_ts (timestamp)"],["idx_usage_events_provider_model","INDEX idx_usage_events_provider_model (provider, model, timestamp)"],["idx_usage_events_status","INDEX idx_usage_events_status (status, status_code, timestamp)"],["idx_usage_events_api_key","INDEX idx_usage_events_api_key (api_key_id, api_key_fingerprint, timestamp)"],["idx_usage_events_client_ip","INDEX idx_usage_events_client_ip (client_ip_normalized, timestamp)"],["idx_usage_events_source_tool","INDEX idx_usage_events_source_tool (source_tool, timestamp)"],["idx_usage_events_session","INDEX idx_usage_events_session (session_id, timestamp)"],["idx_usage_events_thinking_auto_off","INDEX idx_usage_events_thinking_auto_off (thinking_auto_off, timestamp)"],["idx_usage_events_prompt_chars","INDEX idx_usage_events_prompt_chars (prompt_chars, timestamp)"]]),await x(a,"request_details",[["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["status","status VARCHAR(80) NULL"],["data_json","data_json JSON NULL"],["data_size_bytes","data_size_bytes BIGINT DEFAULT 0"]]),await y(a,"request_details",[["idx_request_details_ts","INDEX idx_request_details_ts (timestamp)"],["idx_request_details_provider","INDEX idx_request_details_provider (provider, timestamp)"],["idx_request_details_model","INDEX idx_request_details_model (model, timestamp)"],["idx_request_details_connection","INDEX idx_request_details_connection (connection_id, timestamp)"],["idx_request_details_status","INDEX idx_request_details_status (status, timestamp)"]])}function A(a){return String(a??"").trim()}function B(a){if(null==a)return null;if("string"==typeof a)try{return JSON.parse(a),a}catch{return JSON.stringify(a)}return(0,e.s)(a)}function C(a){if(null==a)return{};let b=B(a)||"{}";return Buffer.byteLength(b,"utf8")<=p?a:{_truncated:!0,_originalSizeBytes:Buffer.byteLength(b,"utf8"),_preview:b.slice(0,1e3)}}async function D(){let a=Date.now();if(q.value&&q.expiresAt>a)return q.value;try{let b=n(await o());q={value:!0===b.enabled&&"mysql"===b.type&&"false"!==process.env.OBSERVABILITY_MYSQL_ENABLED?b:null,expiresAt:a+5e3}}catch(b){t("config",`[observability-mysql] Unable to read MySQL log config: ${b?.message||b}`),q={value:null,expiresAt:a+5e3}}return q.value}async function E(a){let b=await c.e(4790).then(c.t.bind(c,94790,19)),d=await b.createConnection({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,multipleStatements:!0,dateStrings:!0,connectTimeout:3e3,timezone:"Z"});return await d.query("SET time_zone = '+00:00'"),d}async function F(a){r||(await a.query(`
8
- CREATE TABLE IF NOT EXISTS usage_events (
9
- id BIGINT AUTO_INCREMENT PRIMARY KEY,
10
- dedupe_key VARCHAR(96) NOT NULL,
11
- created_at DATETIME(3) NOT NULL,
12
- timestamp DATETIME(3) NOT NULL,
13
- provider VARCHAR(120),
14
- model VARCHAR(255),
15
- connection_id VARCHAR(120),
16
- api_key_fingerprint VARCHAR(120),
17
- api_key_id VARCHAR(120),
18
- api_key_name VARCHAR(255),
19
- api_key_owner VARCHAR(255),
20
- endpoint TEXT,
21
- request_id VARCHAR(120),
22
- session_id VARCHAR(255),
23
- client_ip VARCHAR(64),
24
- client_ip_normalized VARCHAR(64),
25
- client_host TEXT,
26
- client_user_agent TEXT,
27
- source_tool VARCHAR(80),
28
- source_tool_label VARCHAR(120),
29
- source_host VARCHAR(255),
30
- latency_ms INT DEFAULT 0,
31
- ttft_ms INT DEFAULT 0,
32
- status_code INT,
33
- error_code VARCHAR(160),
34
- error_type VARCHAR(120),
35
- error_message_short TEXT,
36
- is_streaming TINYINT DEFAULT 0,
37
- is_combo TINYINT DEFAULT 0,
38
- combo_name VARCHAR(255),
39
- prompt_tokens BIGINT DEFAULT 0,
40
- completion_tokens BIGINT DEFAULT 0,
41
- total_tokens BIGINT DEFAULT 0,
42
- cached_tokens BIGINT DEFAULT 0,
43
- reasoning_tokens BIGINT DEFAULT 0,
44
- thinking_enabled TINYINT NULL,
45
- thinking_auto_off TINYINT DEFAULT 0,
46
- thinking_auto_off_reason VARCHAR(120),
47
- prompt_chars BIGINT DEFAULT 0,
48
- force_thinking_off_above_chars BIGINT DEFAULT 0,
49
- cost DECIMAL(18,8) DEFAULT 0,
50
- status VARCHAR(80),
51
- tokens_json JSON,
52
- meta_json JSON,
53
- UNIQUE KEY uq_usage_events_dedupe (dedupe_key),
54
- INDEX idx_usage_events_ts (timestamp),
55
- INDEX idx_usage_events_provider_model (provider, model, timestamp),
56
- INDEX idx_usage_events_status (status, status_code, timestamp),
57
- INDEX idx_usage_events_api_key (api_key_id, api_key_fingerprint, timestamp),
58
- INDEX idx_usage_events_client_ip (client_ip_normalized, timestamp),
59
- INDEX idx_usage_events_source_tool (source_tool, timestamp),
60
- INDEX idx_usage_events_session (session_id, timestamp)
61
- ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
62
-
63
- CREATE TABLE IF NOT EXISTS request_details (
64
- id VARCHAR(180) PRIMARY KEY,
65
- created_at DATETIME(3) NOT NULL,
66
- timestamp DATETIME(3) NOT NULL,
67
- provider VARCHAR(120),
68
- model VARCHAR(255),
69
- connection_id VARCHAR(120),
70
- status VARCHAR(80),
71
- data_json JSON NOT NULL,
72
- data_size_bytes BIGINT DEFAULT 0,
73
- INDEX idx_request_details_ts (timestamp),
74
- INDEX idx_request_details_provider (provider, timestamp),
75
- INDEX idx_request_details_model (model, timestamp),
76
- INDEX idx_request_details_connection (connection_id, timestamp),
77
- INDEX idx_request_details_status (status, timestamp)
78
- ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
79
- `),await z(a),await a.query(`
80
- CREATE OR REPLACE VIEW usageHistory AS
81
- SELECT
82
- id,
83
- timestamp,
84
- provider,
85
- model,
86
- connection_id AS connectionId,
87
- api_key_fingerprint AS apiKey,
88
- api_key_id AS apiKeyId,
89
- api_key_fingerprint AS apiKeyFingerprint,
90
- api_key_name AS apiKeyName,
91
- api_key_owner AS apiKeyOwner,
92
- endpoint,
93
- request_id AS requestId,
94
- session_id AS sessionId,
95
- client_ip AS clientIp,
96
- client_ip_normalized AS clientIpNormalized,
97
- client_host AS clientHost,
98
- client_user_agent AS clientUserAgent,
99
- source_tool AS sourceTool,
100
- source_tool_label AS sourceToolLabel,
101
- source_host AS sourceHost,
102
- latency_ms AS latencyMs,
103
- ttft_ms AS ttftMs,
104
- status_code AS statusCode,
105
- error_code AS errorCode,
106
- error_type AS errorType,
107
- error_message_short AS errorMessageShort,
108
- is_streaming AS isStreaming,
109
- is_combo AS isCombo,
110
- combo_name AS comboName,
111
- prompt_tokens AS promptTokens,
112
- completion_tokens AS completionTokens,
113
- total_tokens AS totalTokens,
114
- cached_tokens AS cachedTokens,
115
- reasoning_tokens AS reasoningTokens,
116
- thinking_enabled AS thinkingEnabled,
117
- thinking_auto_off AS thinkingAutoOff,
118
- thinking_auto_off_reason AS thinkingAutoOffReason,
119
- prompt_chars AS promptChars,
120
- force_thinking_off_above_chars AS forceThinkingOffAboveChars,
121
- cost,
122
- status,
123
- JSON_SET(
124
- COALESCE(tokens_json, JSON_OBJECT()),
125
- '$.prompt_tokens', COALESCE(prompt_tokens, 0),
126
- '$.input_tokens', COALESCE(prompt_tokens, 0),
127
- '$.completion_tokens', COALESCE(completion_tokens, 0),
128
- '$.output_tokens', COALESCE(completion_tokens, 0),
129
- '$.total_tokens', COALESCE(NULLIF(total_tokens, 0), COALESCE(prompt_tokens, 0) + COALESCE(completion_tokens, 0)),
130
- '$.cached_tokens', COALESCE(cached_tokens, 0),
131
- '$.reasoning_tokens', COALESCE(reasoning_tokens, 0)
132
- ) AS tokens,
133
- meta_json AS meta
134
- FROM usage_events;
135
-
136
- CREATE OR REPLACE VIEW requestDetails AS
137
- SELECT
138
- id,
139
- timestamp,
140
- provider,
141
- model,
142
- connection_id AS connectionId,
143
- status,
144
- data_json AS data
145
- FROM request_details;
146
- `).catch(a=>{t("compat-views",`[observability-mysql] Unable to create compatibility views usageHistory/requestDetails: ${a?.message||a}`)}),r=!0)}async function G(a=[]){let b,c=await D();if(!c||!Array.isArray(a)||0===a.length)return!1;try{for(let d of(b=await E(c),await F(b),a)){let a={...d,request:C(d.request),providerRequest:C(d.providerRequest),providerResponse:C(d.providerResponse),response:C(d.response)},c=B(a)||"{}";await b.query(`INSERT INTO request_details (
147
- id, created_at, timestamp, provider, model, connection_id, status, data_json, data_size_bytes
148
- ) VALUES (?, UTC_TIMESTAMP(3), ?, ?, ?, ?, ?, ?, ?)
149
- ON DUPLICATE KEY UPDATE
150
- timestamp = VALUES(timestamp),
151
- provider = VALUES(provider),
152
- model = VALUES(model),
153
- connection_id = VALUES(connection_id),
154
- status = VALUES(status),
155
- data_json = VALUES(data_json),
156
- data_size_bytes = VALUES(data_size_bytes)`,[A(a.id),function(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date().toISOString():b.toISOString()).replace("T"," ").replace("Z","")}(a.timestamp),A(a.provider)||null,A(a.model)||null,A(a.connectionId)||null,A(a.status)||null,c,Buffer.byteLength(c,"utf8")])}return!0}catch(a){return t("request-details-write",`[observability-mysql] Failed to write request_details: ${u(a)}`),!1}finally{b&&await b.end().catch(()=>{})}}let H=0;async function I(a=1e3){let b;if(Date.now()-H<6e4)return;H=Date.now();let c=await D();if(c)try{b=await E(c);let[[d]]=await b.query("SELECT COUNT(*) AS c FROM request_details"),e=Number(d?.c||0)-a;if(e<=0)return;await b.query("DELETE FROM request_details ORDER BY created_at ASC LIMIT ?",[e])}catch(a){t("request-details-purge",`[observability-mysql] Failed to purge request_details: ${u(a)}`)}finally{b&&await b.end().catch(()=>{})}}global._pendingRequests||(global._pendingRequests={byModel:{},byAccount:{}}),global._lastErrorProvider||(global._lastErrorProvider={provider:"",ts:0}),global._statsEmitter||(global._statsEmitter=new k.EventEmitter,global._statsEmitter.setMaxListeners(50)),global._pendingTimers||(global._pendingTimers={}),global._usageStatsCache||(global._usageStatsCache=new Map),global._recentRing||(global._recentRing={items:[],initialized:!1}),global._connectionMapCache||(global._connectionMapCache={map:{},ts:0}),global._pendingRequests,global._usageStatsCache,global._lastErrorProvider,global._pendingTimers,global._recentRing,global._connectionMapCache,global._statsEmitter;let J=null,K=0;async function L(){if(J&&Date.now()-K<5e3)return J;try{let{getSettings:a}=await Promise.resolve().then(c.bind(c,45874)),b=await a(),d="false"!==process.env.OBSERVABILITY_ENABLED;J={enabled:"boolean"==typeof b.enableObservability?b.enableObservability:d,maxRecords:b.observabilityMaxRecords||parseInt(process.env.OBSERVABILITY_MAX_RECORDS||String(200),10),batchSize:b.observabilityBatchSize||parseInt(process.env.OBSERVABILITY_BATCH_SIZE||String(20),10),flushIntervalMs:b.observabilityFlushIntervalMs||parseInt(process.env.OBSERVABILITY_FLUSH_INTERVAL_MS||String(5e3),10),maxJsonSize:1024*(b.observabilityMaxJsonSize||parseInt(process.env.OBSERVABILITY_MAX_JSON_SIZE||"5",10))}}catch{J={enabled:!1,maxRecords:200,batchSize:20,flushIntervalMs:5e3,maxJsonSize:5120}}return K=Date.now(),J}let M=[],N=null,O=!1,P=!1,Q=!1;function R(a,b){if("write"===a){if(P)return;P=!0}else{if(Q)return;Q=!0}console.error(`[requestDetailsRepo] MySQL observability ${a} unavailable; SQLite fallback is disabled.`,b?.message||b||"")}function S(a,b){let c=JSON.stringify(a||{});return c.length>b?{_truncated:!0,_originalSize:c.length,_preview:c.substring(0,200)}:a||{}}async function T(){if(!O&&0!==M.length){O=!0;try{for(;M.length>0;){let a=M.splice(0,M.length),b=await L(),c=[];for(let d of a){d.id||(d.id=function(a){let b=new Date().toISOString(),c=Math.random().toString(36).substring(2,8),d=a?a.replace(/[^a-zA-Z0-9-]/g,"-"):"unknown";return`${b}-${c}-${d}`}(d.model)),d.timestamp||(d.timestamp=new Date().toISOString()),d.request?.headers&&(d.request.headers=function(a){if(!a||"object"!=typeof a)return{};let b=["authorization","x-api-key","cookie","token","api-key"],c={...a};for(let a of Object.keys(c))b.some(b=>a.toLowerCase().includes(b))&&delete c[a];return c}(d.request.headers));let a={id:d.id,provider:d.provider||null,model:d.model||null,connectionId:d.connectionId||null,timestamp:d.timestamp,status:d.status||null,requestId:d.requestId||d.id||null,endpoint:d.endpoint||d.request?.endpoint||null,rtkStats:d.rtkStats||null,latency:d.latency||{},tokens:d.tokens||{},request:S(d.request,b.maxJsonSize),providerRequest:S(d.providerRequest,b.maxJsonSize),providerResponse:S(d.providerResponse,b.maxJsonSize),response:S(d.response,b.maxJsonSize)};c.push(a)}if(!(c.length>0)||await G(c).catch(a=>(R("write",a),!1))){let a=await L();I(a.maxRecords).catch(()=>{})}else R("write","request_details write returned false")}}catch(a){console.error("[requestDetailsRepo] Batch write failed:",a)}finally{O=!1}}}let U=async()=>{N&&(clearTimeout(N),N=null),M.length>0&&await T()};async function V(){let a=await (0,d.c)(),{exportSettings:b}=await Promise.resolve().then(c.bind(c,45874)),{exportBrandingAssets:g}=await c.e(8023).then(c.bind(c,28023)),h={backup:{formatVersion:2,exportedAt:new Date().toISOString()},settings:await b(),providerConnections:a.all("SELECT * FROM providerConnections").map(a=>({...(0,e.q)(a.data,{}),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive,scope:a.scope||"system",ownerUser:String(a.ownerUser||"").trim().toLowerCase(),createdByUser:String(a.createdByUser||"").trim().toLowerCase(),visibility:a.visibility||("personal"===a.scope?"private":"system"),createdAt:a.createdAt,updatedAt:a.updatedAt})),providerNodes:a.all("SELECT * FROM providerNodes").map(a=>({...(0,e.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt})),proxyPools:a.all("SELECT * FROM proxyPools").map(a=>({...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt})),apiKeys:a.all("SELECT * FROM apiKeys").map(a=>({id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive,adminDisabled:1===a.adminDisabled,ownerUser:a.ownerUser||"",createdByUser:a.createdByUser||"",cavemanMode:a.cavemanMode||"inherit",cavemanLevel:a.cavemanLevel||"lite",createdAt:a.createdAt,allowedModels:(0,e.q)(a.allowedModels,[]),limits:(0,e.q)(a.limits,{})})),combos:a.all("SELECT * FROM combos").map(a=>({id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt})),modelAliases:{},customModels:[],mitmAlias:{},pricing:{},resourceMonitor:{servers:await (0,f.HI)({includeSecrets:!0}),history:a.all("SELECT * FROM resourceMonitorHistory ORDER BY serverId, sampledAt").map(a=>({...a,gpus:(0,e.q)(a.gpus,[])}))},branding:await g()};for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'modelAliases'"))h.modelAliases[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'customModels'"))h.customModels.push((0,e.q)(b.value));for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'mitmAlias'"))h.mitmAlias[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'pricing'"))h.pricing[b.key]=(0,e.q)(b.value);return h}async function W(a,{returnExport:b=!0}={}){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid database payload");let g=await (0,d.c)(),{exportSettings:h}=await Promise.resolve().then(c.bind(c,45874)),{exportBrandingAssets:i,restoreBrandingAssets:j,validateBrandingBackup:k}=await c.e(8023).then(c.bind(c,28023)),l=Object.prototype.hasOwnProperty.call(a,"branding");l&&k(a.branding);let m=await h(),n=l?await i():null,o=a.settings&&"object"==typeof a.settings?{...a.settings}:a.settings;!l&&o&&(o.brandingLogo=m.brandingLogo||null,o.brandingFavicon=m.brandingFavicon||null);let p=Object.prototype.hasOwnProperty.call(a,"resourceMonitor"),q=p?a.resourceMonitor:null;if(p&&(!q||"object"!=typeof q||Array.isArray(q)||!Array.isArray(q.servers)||!Array.isArray(q.history)))throw Error("Invalid resource monitor backup payload");let r=p?q.history.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor history entry");let b=String(a.serverId||"").trim(),c=Number(a.sampledAt);if(!b||!Number.isFinite(c))throw Error("Invalid resource monitor history entry");return{serverId:b,sampledAt:c,cpuUsage:Number(a.cpuUsage)||0,memoryUsage:Number(a.memoryUsage)||0,diskUsage:Number(a.diskUsage)||0,diskUsedBytes:Number(a.diskUsedBytes)||0,networkRxBps:Number(a.networkRxBps)||0,networkTxBps:Number(a.networkTxBps)||0,gpus:Array.isArray(a.gpus)?a.gpus:[]}}):[],s=null;p&&(s=await (0,f.HI)({includeSecrets:!0}),await (0,f.x8)(q.servers));try{g.transaction(()=>{for(let b of(g.run("DELETE FROM settings"),g.run("DELETE FROM providerConnections"),g.run("DELETE FROM providerNodes"),g.run("DELETE FROM proxyPools"),g.run("DELETE FROM apiKeys"),g.run("DELETE FROM combos"),g.run("DELETE FROM kv WHERE scope IN ('modelAliases', 'customModels', 'mitmAlias', 'pricing')"),p&&g.run("DELETE FROM resourceMonitorHistory"),o&&g.run(`INSERT INTO settings(id, data) VALUES(1, ?)
157
- ON CONFLICT(id) DO UPDATE SET data = excluded.data`,[(0,e.s)(o)]),a.providerConnections||[])){let{id:a,provider:c,authType:d,name:f,email:h,priority:i,isActive:j,scope:k,ownerUser:l,createdByUser:m,visibility:n,createdAt:o,updatedAt:p,...q}=b,r="personal"===k?"personal":"system";g.run(`INSERT OR REPLACE INTO providerConnections(id, provider, authType, name, email, priority, isActive, scope, ownerUser, createdByUser, visibility, data, createdAt, updatedAt)
158
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[a,c,d||"oauth",f||null,h||null,i||null,+(!1!==j),r,String(l||"").trim().toLowerCase(),String(m||l||"").trim().toLowerCase(),n||("personal"===r?"private":"system"),(0,e.s)(q),o||new Date().toISOString(),p||new Date().toISOString()])}for(let b of a.providerNodes||[]){let{id:a,type:c,name:d,createdAt:f,updatedAt:h,...i}=b;g.run(`INSERT OR REPLACE INTO providerNodes(id, type, name, data, createdAt, updatedAt)
159
- VALUES(?, ?, ?, ?, ?, ?)`,[a,c||null,d||null,(0,e.s)(i),f||new Date().toISOString(),h||new Date().toISOString()])}for(let b of a.proxyPools||[]){let{id:a,isActive:c,testStatus:d,createdAt:f,updatedAt:h,...i}=b;g.run(`INSERT OR REPLACE INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
160
- VALUES(?, ?, ?, ?, ?, ?)`,[a,+(!1!==c),d||"unknown",(0,e.s)(i),f||new Date().toISOString(),h||new Date().toISOString()])}for(let b of a.apiKeys||[])g.run(`INSERT OR REPLACE INTO apiKeys(id, key, name, machineId, isActive, adminDisabled, createdAt, allowedModels, limits, ownerUser, createdByUser, cavemanMode, cavemanLevel)
161
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[b.id,b.key,b.name||null,b.machineId||null,+(!1!==b.isActive),+(!0===b.adminDisabled),b.createdAt||new Date().toISOString(),(0,e.s)(Array.isArray(b.allowedModels)?b.allowedModels:[]),(0,e.s)(b.limits&&"object"==typeof b.limits&&!Array.isArray(b.limits)?b.limits:{}),String(b.ownerUser||"").trim().toLowerCase(),String(b.createdByUser||b.ownerUser||"").trim().toLowerCase(),["inherit","on","off"].includes(b.cavemanMode)?b.cavemanMode:"inherit",["lite","full","ultra"].includes(b.cavemanLevel)?b.cavemanLevel:"lite"]);for(let b of a.combos||[])g.run(`INSERT OR REPLACE INTO combos(id, name, kind, models, createdAt, updatedAt)
162
- VALUES(?, ?, ?, ?, ?, ?)`,[b.id,b.name,b.kind||null,(0,e.s)(b.models||[]),b.createdAt||new Date().toISOString(),b.updatedAt||new Date().toISOString()]);for(let[b,c]of Object.entries(a.modelAliases||{}))g.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('modelAliases', ?, ?)",[b,(0,e.s)(c)]);for(let b of a.customModels||[]){let a=`${b.providerAlias}|${b.id}|${b.type||"llm"}`;g.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[a,(0,e.s)(b)])}for(let[b,c]of Object.entries(a.mitmAlias||{}))g.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('mitmAlias', ?, ?)",[b,(0,e.s)(c||{})]);for(let[b,c]of Object.entries(a.pricing||{}))g.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('pricing', ?, ?)",[b,(0,e.s)(c||{})]);if(p)for(let a of r)g.run(`INSERT OR REPLACE INTO resourceMonitorHistory(
163
- serverId, sampledAt, cpuUsage, memoryUsage, diskUsage,
164
- diskUsedBytes, networkRxBps, networkTxBps, gpus
165
- ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)`,[a.serverId,a.sampledAt,a.cpuUsage,a.memoryUsage,a.diskUsage,a.diskUsedBytes,a.networkRxBps,a.networkTxBps,(0,e.s)(a.gpus)])})}catch(a){throw s&&await (0,f.x8)(s).catch(a=>{console.error("[DB][import] Failed to roll back resource monitor servers:",a)}),a}let t=0;if(l)try{t=await j(a.branding)}catch(a){throw await j(n).catch(a=>{console.error("[DB][import] Failed to roll back branding assets:",a)}),a}return b?await V():{success:!0,resourceMonitorImported:p,resourceMonitorServerCount:q?.servers.length||0,resourceMonitorHistoryCount:r.length,brandingImported:l,brandingAssetCount:t}}process.off("beforeExit",U),process.off("SIGINT",U),process.off("SIGTERM",U),process.off("exit",U),process.on("beforeExit",U),process.on("SIGINT",U),process.on("SIGTERM",U),process.on("exit",U)}};