@jheavenknows/bluerouter 5.2.45 → 5.2.47

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 (628) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +26 -26
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js +5 -5
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page.js.nft.json +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  75. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  77. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  78. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  79. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  80. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  81. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  82. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  84. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  85. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  87. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  88. package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
  89. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
  90. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  91. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +6 -6
  92. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  93. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  94. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  95. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/auth/login/route.js +2 -2
  98. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
  101. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js +34 -68
  112. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js +1 -1
  154. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
  157. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/keys/route.js +2 -2
  159. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  173. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  175. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  177. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js +1 -1
  190. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js +1 -1
  192. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js +1 -1
  194. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js +1 -1
  196. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js +1 -1
  198. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js +1 -1
  200. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js +1 -1
  202. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js +1 -1
  204. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js +1 -1
  206. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  218. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  222. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  244. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  246. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  249. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  253. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  255. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  257. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  259. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  261. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  263. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  265. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  267. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  269. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  270. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  271. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  272. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  273. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  274. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  275. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  276. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  277. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  278. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  279. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
  280. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  281. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  282. package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  283. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  284. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  285. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  286. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  287. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  288. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  289. package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  290. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  291. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  292. package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  293. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  294. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  295. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  296. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  297. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  298. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  299. package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
  300. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  301. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  302. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  303. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  304. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  305. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  306. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  307. package/app/.next-cli-build/server/app/callback.html +1 -1
  308. package/app/.next-cli-build/server/app/callback.rsc +6 -6
  309. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
  310. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  311. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +6 -6
  312. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  313. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  314. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +7 -7
  317. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index.segment.rsc +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  321. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +7 -7
  322. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_head.segment.rsc +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_index.segment.rsc +6 -6
  324. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +2 -2
  325. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +7 -7
  327. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
  328. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  329. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  331. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  333. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +6 -6
  334. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +2 -2
  335. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +8 -8
  337. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
  338. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  339. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  341. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +8 -8
  342. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  343. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +6 -6
  344. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +2 -2
  345. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +8 -8
  347. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  348. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  349. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  351. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +8 -8
  352. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  353. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +6 -6
  354. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  355. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +8 -8
  357. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  358. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  359. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  361. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +8 -8
  362. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  363. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +6 -6
  364. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  365. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +7 -7
  367. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +1 -1
  368. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster.segment.rsc +1 -1
  369. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  371. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +7 -7
  372. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_head.segment.rsc +1 -1
  373. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_index.segment.rsc +6 -6
  374. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +2 -2
  375. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/combos.rsc +8 -8
  377. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  378. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  379. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  381. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +8 -8
  382. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  383. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +6 -6
  384. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  385. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  386. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
  387. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  388. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  389. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  391. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
  392. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  393. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +6 -6
  394. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  395. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  396. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +7 -7
  397. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +1 -1
  398. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report.segment.rsc +1 -1
  399. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  400. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  401. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +7 -7
  402. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_head.segment.rsc +1 -1
  403. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_index.segment.rsc +6 -6
  404. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +2 -2
  405. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  406. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +8 -8
  407. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  408. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  409. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  410. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  411. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  412. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +8 -8
  413. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  414. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +6 -6
  415. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  416. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  417. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +8 -8
  418. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  419. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  420. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  421. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  422. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +8 -8
  423. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  424. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +6 -6
  425. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  426. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  427. package/app/.next-cli-build/server/app/dashboard/profile.rsc +8 -8
  428. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  429. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  430. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  432. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +8 -8
  433. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  434. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +6 -6
  435. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  436. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  437. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +7 -7
  438. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  439. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  440. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  441. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  442. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +7 -7
  443. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  444. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +6 -6
  445. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
  446. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  447. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +7 -7
  448. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  449. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  450. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  451. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  452. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +7 -7
  453. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  454. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +6 -6
  455. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
  456. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  457. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +8 -8
  458. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  459. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  460. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  461. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  462. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  463. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +8 -8
  464. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  465. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +6 -6
  466. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  467. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  468. package/app/.next-cli-build/server/app/dashboard/providers.rsc +8 -8
  469. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  470. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  471. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  472. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  473. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +8 -8
  474. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  475. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +6 -6
  476. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  477. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  478. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +8 -8
  479. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  480. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  481. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  482. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  483. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +8 -8
  484. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  485. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +6 -6
  486. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  487. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  488. package/app/.next-cli-build/server/app/dashboard/quota.rsc +9 -9
  489. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  490. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  491. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  492. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  493. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +9 -9
  494. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  495. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +6 -6
  496. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  497. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  498. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
  499. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +1 -1
  500. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor.segment.rsc +1 -1
  501. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  502. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  503. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
  504. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_head.segment.rsc +1 -1
  505. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_index.segment.rsc +6 -6
  506. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +2 -2
  507. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  508. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +7 -7
  509. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  510. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
  511. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
  512. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  513. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  514. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +7 -7
  515. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  516. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +6 -6
  517. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  518. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  519. package/app/.next-cli-build/server/app/dashboard/skills.rsc +8 -8
  520. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  521. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  522. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  523. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  524. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +8 -8
  525. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  526. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +6 -6
  527. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  528. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  529. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +7 -7
  530. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +1 -1
  531. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  532. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  533. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  534. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
  535. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  536. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +6 -6
  537. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  538. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  539. package/app/.next-cli-build/server/app/dashboard/translator.rsc +8 -8
  540. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  541. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  542. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  543. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  544. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +8 -8
  545. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  546. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +6 -6
  547. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  548. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  549. package/app/.next-cli-build/server/app/dashboard/usage.rsc +8 -8
  550. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  551. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  552. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  553. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  554. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +8 -8
  555. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  556. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +6 -6
  557. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  558. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  559. package/app/.next-cli-build/server/app/dashboard.rsc +8 -8
  560. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  561. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  562. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  563. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +8 -8
  564. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  565. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +6 -6
  566. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  567. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  568. package/app/.next-cli-build/server/app/index.html +1 -1
  569. package/app/.next-cli-build/server/app/index.rsc +6 -6
  570. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  571. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
  572. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  573. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +6 -6
  574. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  575. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  576. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  577. package/app/.next-cli-build/server/app/landing.html +1 -1
  578. package/app/.next-cli-build/server/app/landing.rsc +6 -6
  579. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
  580. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  581. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +6 -6
  582. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  583. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  584. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  585. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  586. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  587. package/app/.next-cli-build/server/app/login.html +1 -1
  588. package/app/.next-cli-build/server/app/login.rsc +7 -7
  589. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
  590. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  591. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +6 -6
  592. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  593. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  594. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  595. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  596. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  597. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  598. package/app/.next-cli-build/server/app-paths-manifest.json +26 -26
  599. package/app/.next-cli-build/server/chunks/3104.js +1 -1
  600. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  601. package/app/.next-cli-build/server/chunks/402.js +1 -1
  602. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  603. package/app/.next-cli-build/server/chunks/4778.js +1 -1
  604. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  605. package/app/.next-cli-build/server/chunks/6759.js +1 -1
  606. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  607. package/app/.next-cli-build/server/chunks/689.js +1 -1
  608. package/app/.next-cli-build/server/chunks/7812.js +1 -0
  609. package/app/.next-cli-build/server/chunks/814.js +19 -57
  610. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  611. package/app/.next-cli-build/server/middleware.js +1 -1
  612. package/app/.next-cli-build/server/pages/404.html +1 -1
  613. package/app/.next-cli-build/server/pages/500.html +1 -1
  614. package/app/.next-cli-build/static/chunks/{5263-033eb911050db7b1.js → 5263-7d13e869791f7fbf.js} +1 -1
  615. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/api-keys/{page-a6b75a906cff96a9.js → page-4ff2bd46a87509d4.js} +6 -6
  616. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/page-94c543b226d457bc.js +1 -0
  617. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-c2e8fed4e2e83357.js +1 -0
  618. package/app/.next-cli-build/static/css/{53140f3ce3036378.css → d24b605b5d04dccc.css} +1 -1
  619. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  620. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  621. package/app/package.json +1 -1
  622. package/package.json +1 -1
  623. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/page-6faeef5fad177292.js +0 -1
  624. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-7c800c66fb61c0e5.js +0 -1
  625. /package/app/.next-cli-build/static/{V4GvTUs7kanQeyCtjhOjX → 4c8vVaX5rzGoHElnR-Xuy}/_buildManifest.js +0 -0
  626. /package/app/.next-cli-build/static/{V4GvTUs7kanQeyCtjhOjX → 4c8vVaX5rzGoHElnR-Xuy}/_ssgManifest.js +0 -0
  627. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.2.40-to-5.2.41-5.2.41-20260805-104609 → upgrade-5.2.44-to-5.2.45-5.2.45-20260805-160154}/data.sqlite +0 -0
  628. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.2.41-to-5.2.42-5.2.42-20260805-105010 → upgrade-5.2.45-to-5.2.46-5.2.46-20260805-161544}/data.sqlite +0 -0
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "5.2.45",
3
+ "version": "5.2.47",
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.2.45",
3
+ "version": "5.2.47",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3538],{43503:(e,t,s)=>{"use strict";s.d(t,{default:()=>c});var n=s(95155),r=s(12115),a=s(35497),l=s(57250);function i(e,t){return t.find(t=>t.id===e)?.name||e}function d(e){return String(e||"").trim().toLowerCase()}function o(e){return Array.isArray(e?.importedModels)?e.importedModels:[]}function c(){let[e,t]=(0,r.useState)(!0),[s,c]=(0,r.useState)(!1),[x,m]=(0,r.useState)(""),[h,u]=(0,r.useState)(""),[p,g]=(0,r.useState)(""),[b,j]=(0,r.useState)(!1),[v,f]=(0,r.useState)([]),[y,N]=(0,r.useState)([]),[k,w]=(0,r.useState)(null),[C,A]=(0,r.useState)(null),[I,S]=(0,r.useState)(null),[M,O]=(0,r.useState)(""),[$,T]=(0,r.useState)(null),[R,E]=(0,r.useState)([]),[K,q]=(0,r.useState)(!1),[P,U]=(0,r.useState)(""),[z,F]=(0,r.useState)([]),[B,L]=(0,r.useState)(!1),[_,D]=(0,r.useState)(!1),[H,G]=(0,r.useState)({}),[J,X]=(0,r.useState)({}),[Z,V]=(0,r.useState)(""),[W,Q]=(0,r.useState)({}),[Y,ee]=(0,r.useState)(""),[et,es]=(0,r.useState)(null),[en,er]=(0,r.useState)({}),[ea,el]=(0,r.useState)(""),[ei,ed]=(0,r.useState)(""),[eo,ec]=(0,r.useState)({}),[ex,em]=(0,r.useState)({}),[eh,eu]=(0,r.useState)(""),[ep,eg]=(0,r.useState)(!1),[eb,ej]=(0,r.useState)(!0),ev=(0,r.useCallback)(async()=>{t(!0),m("");try{let e=await fetch("/api/personal-cloud-providers",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được personal cloud providers");g(t.userId||""),j(!0===t.isAdmin),f(t.providers||[]),N(t.connections||[]),ej(!1!==t.globalRtkEnabled),ec(t.routing||{}),em(e=>{let s={...e};for(let[e,n]of Object.entries(t.routing||{}))s[e]={...n};return s}),V(e=>e||t.userId||"")}catch(e){m(e.message||"Kh\xf4ng tải được personal cloud providers")}finally{t(!1)}},[]),ef=(0,r.useCallback)(async()=>{if(b){D(!0);try{let e=await fetch("/api/personal-cloud-providers/permissions",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được quyền OAuth");G(t.permissions||{}),X(t.connectionsByUser||{})}catch(e){m(e.message||"Kh\xf4ng tải được quyền OAuth")}finally{D(!1)}}},[b]);(0,r.useEffect)(()=>{ev()},[ev]),(0,r.useEffect)(()=>{b&&ef()},[b,ef]),(0,r.useEffect)(()=>{let e=H[d(Z)]||{},t={};for(let s of v)t[s.id]=!0===e[s.id];Q(t)},[Z,H,v]);let ey=(0,r.useMemo)(()=>{let e=d($?.ownerUser||p);return e?R.filter(t=>d(t.ownerUser||t.createdByUser||p)===e):[]},[R,$,p]),eN=(0,r.useMemo)(()=>{let e=new Map;for(let t of R){let s=String(t.id||"").slice(0,8);e.set(t.id,`${t.name||"API key"}${s?` \xb7 ${s}`:""}`)}return e},[R]),ek=(0,r.useMemo)(()=>Array.from(new Set([...Object.keys(H||{}),...Object.keys(J||{})])).map(e=>{let t=H[e]||{},s=J[e]||{},n=v.filter(e=>t?.[e.id]===!0),r=v.some(e=>(s[e.id]||0)>0);return{userId:e,providerState:t,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:r}}).filter(e=>e.enabledProviders.length>0||e.hasAnyConnection).sort((e,t)=>e.userId.localeCompare(t.userId)),[H,J,v]),ew=async()=>{w(null),u("OAuth account đ\xe3 được th\xeam. Model sẽ được import tự động nếu provider hỗ trợ."),await ev()},eC=async(e,t)=>{m(""),u("");try{let s=await fetch(`/api/personal-cloud-providers/${encodeURIComponent(e)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng cập nhật được connection");await ev()}catch(e){m(e.message||"Kh\xf4ng cập nhật được connection")}},eA=async e=>{m(""),u(""),O(e.id);try{let t=await fetch(`/api/personal-cloud-providers/${encodeURIComponent(e.id)}/import-models`,{method:"POST"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng import được model");N(t=>t.map(t=>t.id===e.id?{...t,availableModels:s.models||[],importedModels:s.importedModels||[],modelImport:s.modelImport||t.modelImport}:t)),es(t=>t?.id===e.id?{...t,availableModels:s.models||[],importedModels:s.importedModels||[],modelImport:s.modelImport||t.modelImport}:t);let n=s.modelImport?.source==="provider"?"provider":"catalog fallback";u(`Đ\xe3 cập nhật ${s.models?.length||0} model từ ${n}.`)}catch(e){m(e.message||"Kh\xf4ng import được model")}finally{O("")}},eI=(0,r.useCallback)(async()=>{let e=d(p);if(e){q(!0);try{let t=`&ownerUser=${encodeURIComponent(e)}`,s=await fetch(`/api/keys?pageSize=100&status=active${t}`,{cache:"no-store"}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng tải được API keys");E(Array.isArray(n.keys)?n.keys:[])}catch(e){m(e.message||"Kh\xf4ng tải được API keys")}finally{q(!1)}}},[p]),eS=async e=>{q(!0);try{let t=d(e?.ownerUser||p),s=t?`&ownerUser=${encodeURIComponent(t)}`:"",n=await fetch(`/api/keys?pageSize=100&status=active${s}`,{cache:"no-store"}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error||"Kh\xf4ng tải được API keys");let a=Array.isArray(r.keys)?r.keys:[];E(a);let l=d(r.userId),i=a.find(e=>d(e.ownerUser||e.createdByUser||l)===t);U(e=>e||i?.id||"")}catch(e){m(e.message||"Kh\xf4ng tải được API keys")}finally{q(!1)}};(0,r.useEffect)(()=>{p&&eI()},[p,eI]);let eM=async e=>{let t,s;m(""),u(""),T(e),F((s=(t=o(e)).filter(e=>"llm"===(e.type||"llm")).slice(0,3).map(e=>e.routeModel).filter(Boolean)).length>0?s:t.slice(0,3).map(e=>e.routeModel).filter(Boolean)),U(""),await eS(e)},eO=async()=>{if(!$)return;if(!P)return void m("Chọn API key cần th\xeam model.");let e=Array.from(new Set((Array.isArray(z)?z:[]).map(e=>String(e||"").trim()).filter(Boolean)));if(0===e.length)return void m("Chọn \xedt nhất một model.");L(!0),m(""),u("");try{let t=await fetch(`/api/personal-cloud-providers/${encodeURIComponent($.id)}/api-key-models`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKeyId:P,models:e})}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng th\xeam được model v\xe0o API key");T(null),u(`Đ\xe3 th\xeam ${s.addedModels?.length||e.length} model v\xe0o API key ${s.key?.name||""}.`)}catch(e){m(e.message||"Kh\xf4ng th\xeam được model v\xe0o API key")}finally{L(!1)}},e$=async()=>{if(I){m(""),u("");try{let e=await fetch(`/api/personal-cloud-providers/${encodeURIComponent(I.id)}`,{method:"DELETE"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng x\xf3a được connection");u(function(e,t="OAuth connection"){let s=e?.revocation||{};return!0===s.upstreamRevoked?`Đ\xe3 revoke token tại provider v\xe0 x\xf3a ${t} khỏi gateway.`:"unsupported"===s.status?`Đ\xe3 x\xf3a token v\xe0 ${t} khỏi gateway. Provider chưa hỗ trợ revoke tự động; h\xe3y thu hồi thủ c\xf4ng trong phần Security/Connected Apps của provider.`:`Đ\xe3 x\xf3a token v\xe0 ${t} khỏi gateway, nhưng kh\xf4ng x\xe1c nhận được revoke tại provider (${s.error||"unknown error"}). H\xe3y thu hồi thủ c\xf4ng trong phần Security/Connected Apps.`}(t.disconnect,I.name||I.id)),S(null),await ev()}catch(e){m(e.message||"Kh\xf4ng x\xf3a được connection")}}},eT=async(e,t)=>{if(e?.id&&t?.routeModel){m(""),el(t.routeModel),er(e=>({...e,[t.routeModel]:{...e[t.routeModel]||{},loading:!0}}));try{let s=`/api/personal-cloud-providers/${encodeURIComponent(e.id)}/models/${t.routeModel.split("/").map(encodeURIComponent).join("/")}`,n=await fetch(s,{method:"POST"}),r=await n.json().catch(()=>({})),a={ok:r?.ok===!0,status:r?.status||n.status,text:r?.text||"",error:r?.error||(n.ok?"":"Test failed"),latencyMs:r?.latencyMs||0};er(e=>({...e,[t.routeModel]:a}))}catch(e){er(s=>({...s,[t.routeModel]:{ok:!1,error:e.message||"Test failed"}}))}finally{el("")}}},eR=async(e,t)=>{if(e?.id&&t?.routeModel&&window.confirm(`X\xf3a model ${t.routeModel} khỏi connection ${e.name||e.id}?`)){m(""),u(""),ed(t.routeModel);try{let s=`/api/personal-cloud-providers/${encodeURIComponent(e.id)}/models/${t.routeModel.split("/").map(encodeURIComponent).join("/")}`,n=await fetch(s,{method:"DELETE"}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r?.error||"Kh\xf4ng x\xf3a được model");(e=>{if(!e?.connectionId&&!e?.id)return;let t=e.connectionId||e.id;N(s=>s.map(s=>s.id===t?{...s,importedModels:Array.isArray(e.importedModels)?e.importedModels:s.importedModels,availableModels:Array.isArray(e.models)?e.models:Array.isArray(e.availableModels)?e.availableModels:s.availableModels,modelImport:e.modelImport||s.modelImport}:s)),es(s=>s?.id===t?{...s,importedModels:Array.isArray(e.importedModels)?e.importedModels:s.importedModels,availableModels:Array.isArray(e.models)?e.models:Array.isArray(e.availableModels)?e.availableModels:s.availableModels,modelImport:e.modelImport||s.modelImport}:s)})(r),er(e=>{let s={...e};return delete s[t.routeModel],s}),u(`Đ\xe3 x\xf3a model ${t.routeModel}.`)}catch(e){m(e.message||"Kh\xf4ng x\xf3a được model")}finally{ed("")}}},eE=(e,t)=>{em(s=>{let n={...s[e]||{},...t};for(let e of Object.keys(n))(""===n[e]||void 0===n[e])&&delete n[e];return{...s,[e]:n}})},eK=async e=>{m(""),u(""),eu(e);try{let t=ex[e]||{},s={providerId:e,override:{fallbackStrategy:t.fallbackStrategy||"",stickyRoundRobinLimit:t.stickyRoundRobinLimit,stickyScope:t.stickyScope||"",stickyTtlMinutes:t.stickyTtlMinutes,stickyFallbackToClientIp:t.stickyFallbackToClientIp,stickyRebindOnFailure:t.stickyRebindOnFailure,stickyRebindFailureThreshold:t.stickyRebindFailureThreshold}},n=await fetch("/api/personal-cloud-providers/routing",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r?.error||"Kh\xf4ng lưu được routing");ec(r.routing||{}),u(`Đ\xe3 cập nhật routing cho ${e}.`)}catch(e){m(e.message||"Kh\xf4ng lưu được routing")}finally{eu("")}},eq=async e=>{m(""),u(""),eu(e);try{let t=await fetch(`/api/personal-cloud-providers/routing?providerId=${encodeURIComponent(e)}`,{method:"DELETE"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s?.error||"Kh\xf4ng reset được routing");ec(s.routing||{}),em(t=>{let s={...t};return delete s[e],s}),u(`Đ\xe3 reset ${e} về ch\xednh s\xe1ch mặc định.`)}catch(e){m(e.message||"Kh\xf4ng reset được routing")}finally{eu("")}},eP=async()=>{let e=d(Z);if(!e)return void m("Nhập username/email cần cấp quyền.");c(!0),m(""),u("");try{let t=await fetch("/api/personal-cloud-providers/permissions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:e,providers:W})}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng lưu được quyền OAuth");G(s.permissions||{}),X(s.connectionsByUser||{});let n=s.user?.id||e;n!==e&&V(n),u(`Đ\xe3 lưu quyền OAuth cho ${n}.`),await ev()}catch(e){m(e.message||"Kh\xf4ng lưu được quyền OAuth")}finally{c(!1)}},eU=async e=>{let t=d(e);if(t){c(!0),m(""),u("");try{let e=await fetch(`/api/personal-cloud-providers/permissions?userId=${encodeURIComponent(t)}`,{method:"DELETE"}),s=await e.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Kh\xf4ng thu hồi được quyền OAuth");G(s.permissions||{}),X(s.connectionsByUser||{}),d(Z)===t&&V("");let n=s.disconnectSummary||{},r=Number(n.manualActionRequired)||0;u(`Đ\xe3 x\xf3a ${n.deletedCount||0} OAuth connection của ${t} khỏi gateway; ${n.upstreamRevokedCount||0} token đ\xe3 được revoke tại provider.${r>0?` ${r} connection cần kiểm tra/thu hồi thủ c\xf4ng tại provider.`:""}`),ee(""),await ev()}catch(e){m(e.message||"Kh\xf4ng thu hồi được quyền OAuth")}finally{c(!1)}}},ez=k?function(e={}){return{id:e.id,name:e.name||e.id,icon:e.icon||"cloud",color:e.color||"#64748b",website:e.website||"",notice:e.notice||null,deprecationNotice:e.deprecationNotice||"",serviceKinds:e.serviceKinds||["llm"]}}(k):null,eF=b?v:v.filter(e=>e.enabled),eB=o($),eL=$?.modelImport||{},e_=o(et),eD=ek.find(e=>e.userId===d(Y)),eH=v.reduce((e,t)=>e+Number(eD?.connectionsByProvider?.[t.id]||0),0);return(0,n.jsxs)("div",{className:"space-y-6",children:[(0,n.jsx)("div",{children:(0,n.jsxs)("div",{className:"flex flex-col gap-3 md:flex-row md:items-start md:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"text-2xl font-semibold text-text-main",children:"Personal Cloud Providers"}),(0,n.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Kết nối OAuth c\xe1 nh\xe2n cho Claude Code, OpenAI Codex v\xe0 Antigravity. Account c\xe1 nh\xe2n chỉ owner v\xe0 quản trị vi\xean c\xf3 thẩm quyền nh\xecn thấy; chỉ API key của owner được d\xf9ng. Tắt Active chỉ tạm ngưng v\xe0 vẫn giữ token. Delete sẽ thử revoke tại provider rồi x\xf3a token/connection local. Cột RTK cho ph\xe9p override ri\xeang từng account (Lu\xf4n ON / Lu\xf4n OFF) bất kể cấu h\xecnh RTK global ở /dashboard/endpoint đang on hay off — để trống th\xec theo global."})]}),(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-sm",children:[(0,n.jsx)("div",{className:"text-xs uppercase tracking-wide text-text-muted",children:"Current user"}),(0,n.jsx)("div",{className:"mt-1 break-all font-mono text-text-main",children:p||"—"})]})]})}),x?(0,n.jsx)("div",{className:"rounded-2xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-700 dark:text-red-300",children:x}):null,h?(0,n.jsx)("div",{className:"rounded-2xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm text-green-700 dark:text-green-300",children:h}):null,(0,n.jsx)("div",{className:"grid gap-4 lg:grid-cols-3",children:0===v.length?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-8 text-center text-sm text-text-muted lg:col-span-3",children:"Admin chưa cấp quyền personal OAuth provider n\xe0o cho user n\xe0y."}):v.map(e=>(0,n.jsxs)(a.Zp,{className:"space-y-4",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3",children:[(0,n.jsx)("span",{className:"inline-flex size-10 shrink-0 items-center justify-center rounded-xl",style:{backgroundColor:`${e.color||"#64748b"}22`},children:(0,n.jsx)(l.A,{src:`/providers/${e.id}.png`,alt:e.name,size:34,className:"max-h-[34px] max-w-[34px] rounded-lg object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"})}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("h2",{className:"font-semibold text-text-main",children:e.name}),e.enabled?(0,n.jsx)(a.Ex,{variant:"success",size:"sm",children:"Enabled"}):(0,n.jsx)(a.Ex,{variant:"warning",size:"sm",children:"Locked"})]}),(0,n.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:e.enabled?"Được admin cấp quyền, c\xf3 thể add OAuth account c\xe1 nh\xe2n.":"Admin chưa cấp quyền cho user n\xe0y."})]})]}),e.deprecationNotice?(0,n.jsx)("p",{className:"rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:e.deprecationNotice}):null,(0,n.jsxs)(a.$n,{fullWidth:!0,disabled:!e.enabled,onClick:()=>{e.enabled&&A(e)},icon:"add_link",children:["Add ",e.name," account"]})]},e.id))}),(0,n.jsxs)(a.Zp,{className:"space-y-4",children:[(0,n.jsxs)("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"My personal accounts"}),(0,n.jsx)("p",{className:"text-sm text-text-muted",children:"OAuth xong sẽ tự import model nếu provider hỗ trợ. Nếu kh\xf4ng gọi được endpoint model, hệ thống d\xf9ng catalog fallback để user vẫn chọn được model."})]}),(0,n.jsx)(a.$n,{variant:"outline",size:"sm",onClick:ev,loading:e,icon:"refresh",children:"Refresh"})]}),e?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-8 text-center text-sm text-text-muted",children:"Đang tải..."}):0===y.length?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-8 text-center text-sm text-text-muted",children:"Chưa c\xf3 personal OAuth account n\xe0o."}):(0,n.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,n.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,n.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Connection"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Provider"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Account"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Models"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Created"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"API key routing"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",title:"Tắt = tạm ngưng sử dụng, token vẫn được giữ",children:"Active (tạm ngưng)"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:(0,n.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["RTK (Token Savings)",(0,n.jsxs)(a.Ex,{variant:eb?"success":"default",size:"sm",className:"normal-case",children:["Global: ",eb?"ON":"OFF"]}),(0,n.jsx)("button",{type:"button",onClick:()=>eg(!0),title:"RTK l\xe0 g\xec? Bấm để xem giải th\xedch",className:"inline-flex size-4 shrink-0 items-center justify-center rounded-full border border-border text-[10px] font-bold normal-case text-text-muted transition-colors hover:border-brand-500 hover:text-brand-600",children:"?"})]})}),(0,n.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,n.jsx)("tbody",{className:"divide-y divide-border bg-background",children:y.map(e=>{let t=Array.isArray(e?.availableModels)?e.availableModels:[],s=e.modelImport||{};return(0,n.jsxs)("tr",{className:"align-top hover:bg-surface/50",children:[(0,n.jsxs)("td",{className:"px-4 py-4",children:[(0,n.jsx)("div",{className:"font-medium text-text-main",children:e.name||e.id}),(0,n.jsx)("div",{className:"mt-1 font-mono text-xs text-text-muted",children:e.id})]}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(l.A,{src:`/providers/${e.provider}.png`,alt:e.provider,size:24,className:"max-h-[24px] max-w-[24px] rounded object-contain",fallbackText:e.provider.slice(0,2).toUpperCase()}),(0,n.jsx)("span",{children:i(e.provider,v)})]})}),(0,n.jsxs)("td",{className:"px-4 py-4",children:[(0,n.jsx)("div",{className:"break-all text-text-main",children:function(e={}){let t=e.providerSpecificData&&"object"==typeof e.providerSpecificData?e.providerSpecificData:{};return e.email||t.email||t.preferredUsername||e.displayName||t.sub||t.accountId||t.claudeAccountId||t.chatgptAccountId||"—"}(e)}),(0,n.jsxs)("div",{className:"mt-1 break-all text-xs text-text-muted",children:["Owner: ",e.ownerUser||p||"—"]})]}),(0,n.jsxs)("td",{className:"px-4 py-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[function(e={}){return"provider"===(e.source||"catalog")?(0,n.jsx)(a.Ex,{variant:"success",size:"sm",children:"Imported"}):(0,n.jsx)(a.Ex,{variant:"warning",size:"sm",children:"Catalog"})}(s),(0,n.jsxs)("span",{className:"text-xs text-text-muted",children:[t.length," model(s)"]})]}),s.warning?(0,n.jsx)("div",{className:"mt-1 max-w-[320px] truncate text-xs text-amber-600 dark:text-amber-300",title:s.warning,children:s.warning}):null,t.length>0?(0,n.jsxs)("div",{className:"mt-2 flex max-w-[360px] flex-wrap gap-1",children:[t.slice(0,4).map(e=>(0,n.jsx)("span",{className:"rounded-full border border-border bg-surface px-2 py-0.5 font-mono text-[11px] text-text-muted",children:e.routeModel},e.routeModel)),t.length>4?(0,n.jsxs)("span",{className:"rounded-full border border-border bg-surface px-2 py-0.5 text-[11px] text-text-muted",children:["+",t.length-4]}):null]}):null]}),(0,n.jsx)("td",{className:"px-4 py-4 text-xs text-text-muted",children:function(e){if(!e)return"—";try{return new Intl.DateTimeFormat("vi-VN",{dateStyle:"short",timeStyle:"short"}).format(new Date(e))}catch{return e}}(e.createdAt)}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("div",{className:"min-w-[220px] space-y-1",children:[(0,n.jsxs)("select",{value:e.routeApiKeyId||"",onChange:t=>eC(e.id,{routeApiKeyId:t.target.value||null}),disabled:K||d(e.ownerUser||p)!==d(p),className:"h-9 w-full rounded-xl border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-brand-500 disabled:opacity-60",children:[(0,n.jsx)("option",{value:"",children:"Shared across my API keys"}),R.filter(t=>d(t.ownerUser||t.createdByUser||p)===d(e.ownerUser||p)).map(e=>(0,n.jsx)("option",{value:e.id,children:e.name||e.id},e.id))]}),(0,n.jsx)("div",{className:"text-[11px] text-text-muted",children:e.routeApiKeyId?`Only ${eN.get(e.routeApiKeyId)||"selected API key"} can use this account.`:"Unassigned accounts remain shared fallback for your eligible API keys."})]})}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsx)(a.lM,{checked:!1!==e.isActive,onChange:t=>eC(e.id,{isActive:t})})}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("select",{value:!0===e.rtkEnabled?"on":!1===e.rtkEnabled?"off":"inherit",onChange:t=>{let s=t.target.value;eC(e.id,{rtkEnabled:"inherit"===s?null:"on"===s})},className:"h-9 w-full min-w-[140px] rounded-xl border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-brand-500",children:[(0,n.jsx)("option",{value:"inherit",children:"Theo global"}),(0,n.jsx)("option",{value:"on",children:"Lu\xf4n ON"}),(0,n.jsx)("option",{value:"off",children:"Lu\xf4n OFF"})]})}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,n.jsx)(a.$n,{variant:"outline",size:"sm",loading:M===e.id,onClick:()=>eA(e),children:"Import models"}),(0,n.jsx)(a.$n,{variant:"outline",size:"sm",disabled:0===o(e).length,onClick:()=>{m(""),u(""),es(e),er({}),el(""),ed("")},children:"Manage models"}),(0,n.jsx)(a.$n,{variant:"secondary",size:"sm",disabled:0===o(e).length,onClick:()=>eM(e),children:"Add to API key"}),(0,n.jsx)(a.$n,{variant:"outline",size:"sm",onClick:()=>{let t;return t=window.prompt("T\xean connection mới",e.name||""),void(t?.trim()&&eC(e.id,{name:t.trim()}))},children:"Rename"}),(0,n.jsx)(a.$n,{variant:"danger",size:"sm",onClick:()=>S(e),children:"Revoke & delete"})]})})]},e.id)})})]})})]}),(0,n.jsxs)(a.Zp,{className:"space-y-4",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Routing strategy"}),(0,n.jsxs)("p",{className:"text-sm text-text-muted",children:["Khi bạn c\xf3 nhiều personal account cho c\xf9ng provider, đ\xe2y l\xe0 ch\xednh s\xe1ch chọn account cho từng request. Để trống = kế thừa ch\xednh s\xe1ch của admin ở ",(0,n.jsx)("span",{className:"font-mono",children:"/dashboard/providers/<provider>"}),"."]})]}),(0,n.jsx)("div",{className:"grid gap-4 lg:grid-cols-3",children:0===eF.length?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted lg:col-span-3",children:"Bạn chưa được cấp quyền provider n\xe0o, n\xean chưa cần thiết lập routing."}):eF.map(e=>{let t=ex[e.id]||{},s=eo[e.id]||null,r=!s,l=t.fallbackStrategy||"",i="round-robin"===l,d=eh===e.id;return(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 space-y-3",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"font-semibold text-text-main",children:e.name}),(0,n.jsx)("div",{className:"text-xs text-text-muted",children:r?"Đang kế thừa policy global":`Override active: ${s.fallbackStrategy||"inherit"}`})]}),r?(0,n.jsx)(a.Ex,{variant:"default",size:"sm",children:"Inherit"}):(0,n.jsx)(a.Ex,{variant:"success",size:"sm",children:"Override"})]}),(0,n.jsxs)("label",{className:"block text-sm",children:[(0,n.jsx)("span",{className:"mb-1 block font-medium text-text-main",children:"Strategy"}),(0,n.jsxs)("select",{value:l,onChange:t=>eE(e.id,{fallbackStrategy:t.target.value}),className:"h-10 w-full rounded-xl border border-border bg-background px-3 text-sm text-text-main outline-none focus:border-brand-500",disabled:d,children:[(0,n.jsx)("option",{value:"",children:"Inherit (use global)"}),(0,n.jsx)("option",{value:"fill-first",children:"fill-first — chạy hết account 1 mới sang account 2"}),(0,n.jsx)("option",{value:"round-robin",children:"round-robin — lu\xe2n phi\xean theo sticky limit"}),(0,n.jsx)("option",{value:"least-latency",children:"least-latency — chọn account nhanh nhất"}),(0,n.jsx)("option",{value:"p2c",children:"p2c — power-of-two-choices"})]})]}),i?(0,n.jsxs)("div",{className:"space-y-2 rounded-xl border border-border/50 bg-background/50 p-3",children:[(0,n.jsx)("div",{className:"text-xs text-text-muted",children:"Round-robin sticky params (để trống = d\xf9ng gi\xe1 trị global)"}),(0,n.jsxs)("label",{className:"block text-xs",children:[(0,n.jsx)("span",{className:"mb-1 block text-text-muted",children:"Sticky limit (số request li\xean tiếp trước khi rotate)"}),(0,n.jsx)(a.pd,{type:"number",min:1,value:t.stickyRoundRobinLimit??"",onChange:t=>eE(e.id,{stickyRoundRobinLimit:t.target.value?Number(t.target.value):void 0}),placeholder:"v\xed dụ 3",disabled:d})]}),(0,n.jsxs)("label",{className:"block text-xs",children:[(0,n.jsx)("span",{className:"mb-1 block text-text-muted",children:"Sticky scope"}),(0,n.jsxs)("select",{value:t.stickyScope||"",onChange:t=>eE(e.id,{stickyScope:t.target.value}),className:"h-9 w-full rounded-xl border border-border bg-background px-3 text-xs text-text-main outline-none focus:border-brand-500",disabled:d,children:[(0,n.jsx)("option",{value:"",children:"(inherit)"}),(0,n.jsx)("option",{value:"global",children:"global — rotate cho mọi request"}),(0,n.jsx)("option",{value:"client_ip",children:"client_ip — sticky theo IP"}),(0,n.jsx)("option",{value:"client_session",children:"client_session — sticky theo CLI session"})]})]}),(0,n.jsxs)("label",{className:"block text-xs",children:[(0,n.jsx)("span",{className:"mb-1 block text-text-muted",children:"Sticky TTL (ph\xfat)"}),(0,n.jsx)(a.pd,{type:"number",min:1,value:t.stickyTtlMinutes??"",onChange:t=>eE(e.id,{stickyTtlMinutes:t.target.value?Number(t.target.value):void 0}),placeholder:"v\xed dụ 120",disabled:d})]})]}):null,(0,n.jsxs)("div",{className:"flex flex-wrap gap-2 pt-1",children:[(0,n.jsx)(a.$n,{size:"sm",loading:d,onClick:()=>eK(e.id),children:"Save"}),(0,n.jsx)(a.$n,{size:"sm",variant:"ghost",disabled:d||r,onClick:()=>eq(e.id),children:"Reset to inherit"})]})]},e.id)})})]}),b?(0,n.jsxs)(a.Zp,{className:"space-y-4",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Admin: OAuth provider access"}),(0,n.jsx)("p",{className:"text-sm text-text-muted",children:"Default l\xe0 kh\xf4ng c\xf3 quyền. Tắt provider chỉ tạm ngưng connection v\xe0 giữ token để c\xf3 thể bật lại. N\xfat Revoke all sẽ thử revoke upstream rồi x\xf3a to\xe0n bộ connection/token local của user."})]}),(0,n.jsxs)("div",{className:"grid gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end",children:[(0,n.jsx)(a.pd,{label:"User ID / Email",value:Z,onChange:e=>V(e.target.value),placeholder:"anh-tct hoặc anh-tct@fujinet.net"}),(0,n.jsx)(a.$n,{onClick:eP,loading:s,icon:"save",children:"Save permissions"})]}),(0,n.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:v.map(e=>(0,n.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:(0,n.jsx)(a.lM,{checked:!0===W[e.id],onChange:t=>Q(s=>({...s,[e.id]:t})),label:e.name,description:W[e.id]?"User được ph\xe9p add account":"User chưa được cấp quyền"})},e.id))}),(0,n.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,n.jsxs)("div",{className:"mb-3 flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"font-semibold text-text-main",children:"Granted OAuth Access"}),(0,n.jsx)("p",{className:"text-xs text-text-muted",children:"Danh s\xe1ch user hiện đang được cấp quyền add personal OAuth account."})]}),(0,n.jsx)(a.$n,{variant:"outline",size:"sm",onClick:ef,loading:_,icon:"refresh",children:"Refresh list"})]}),_?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Đang tải quyền..."}):0===ek.length?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Chưa c\xf3 user n\xe0o được cấp quyền OAuth provider."}):(0,n.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,n.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,n.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"User"}),v.map(e=>(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:e.name},e.id)),(0,n.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,n.jsx)("tbody",{className:"divide-y divide-border bg-background",children:ek.map(e=>(0,n.jsxs)("tr",{className:"hover:bg-surface/50",children:[(0,n.jsxs)("td",{className:"px-4 py-4",children:[(0,n.jsx)("div",{className:"break-all font-mono text-text-main",children:e.userId}),d(Z)===e.userId?(0,n.jsx)("div",{className:"mt-1 text-xs text-brand-600 dark:text-brand-300",children:"Đang edit ở form ph\xeda tr\xean"}):null]}),v.map(t=>{let s=!0===e.providerState[t.id],r=e.connectionsByProvider?.[t.id]||0,i=r>0;return(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("div",{className:"flex items-center gap-1.5",children:[s?(0,n.jsx)(a.Ex,{variant:"success",size:"sm",children:"ON"}):(0,n.jsx)(a.Ex,{variant:"default",size:"sm",children:"OFF"}),i?(0,n.jsxs)("span",{className:"inline-flex items-center gap-0.5",title:`User đ\xe3 add ${r} ${t.name} account${r>1?"s":""}`,children:[(0,n.jsx)(l.A,{src:`/providers/${t.id}.png`,alt:t.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:t.id.slice(0,2).toUpperCase(),fallbackColor:t.color||"#64748b"}),r>1?(0,n.jsxs)("span",{className:"text-[10px] font-semibold text-text-muted",children:["\xd7",r]}):null]}):null]})},t.id)}),(0,n.jsx)("td",{className:"px-4 py-4",children:(0,n.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,n.jsx)(a.$n,{variant:"outline",size:"sm",onClick:()=>(e=>{let t=d(e);V(t);let s=H[t]||{},n={};for(let e of v)n[e.id]=!0===s[e.id];Q(n)})(e.userId),children:"Edit"}),(0,n.jsx)(a.$n,{variant:"danger",size:"sm",loading:s&&Y===e.userId,onClick:()=>ee(e.userId),children:"Revoke all & delete"})]})})]},e.userId))})]})})]})]}):null,$?(0,n.jsx)(a.aF,{isOpen:!!$,onClose:()=>T(null),title:"Add models to API key",size:"full",footer:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.$n,{variant:"ghost",onClick:()=>T(null),disabled:B,children:"Cancel"}),(0,n.jsx)(a.$n,{onClick:eO,loading:B,disabled:!P||0===z.length,children:"Add selected models"})]}),children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 text-sm",children:[(0,n.jsx)("div",{className:"font-semibold text-text-main",children:$.name||$.id}),(0,n.jsxs)("div",{className:"mt-1 text-text-muted",children:[i($.provider,v)," \xb7 ",eB.length," imported model(s)"]}),eL.warning?(0,n.jsx)("div",{className:"mt-2 text-xs text-amber-600 dark:text-amber-300",children:eL.warning}):null,0===eB.length?(0,n.jsx)("div",{className:"mt-2 rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:'Chưa import được model n\xe0o từ provider. Bấm "Import models" tr\xean d\xf2ng connection trước khi g\xe1n v\xe0o API key.'}):null]}),(0,n.jsxs)("label",{className:"block text-sm",children:[(0,n.jsx)("span",{className:"mb-1 block font-medium text-text-main",children:"API key"}),(0,n.jsxs)("select",{value:P,onChange:e=>U(e.target.value),className:"h-10 w-full rounded-xl border border-border bg-background px-3 text-sm text-text-main outline-none focus:border-brand-500",disabled:K,children:[(0,n.jsx)("option",{value:"",children:K?"Đang tải API keys...":"Chọn API key"}),ey.map(e=>(0,n.jsxs)("option",{value:e.id,children:[e.name," \xb7 ",e.ownerUser||p]},e.id))]})]}),0!==ey.length||K?null:(0,n.jsx)("div",{className:"rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-sm text-amber-700 dark:text-amber-300",children:"User n\xe0y chưa c\xf3 API key active để th\xeam model."}),(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"font-semibold text-text-main",children:"Models"}),(0,n.jsx)("p",{className:"text-xs text-text-muted",children:"Model được lưu v\xe0o allowedModels của API key. Request sẽ route qua personal OAuth account của owner."})]}),(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsx)(a.$n,{variant:"outline",size:"sm",onClick:()=>F(eB.map(e=>e.routeModel).filter(Boolean)),children:"Select all"}),(0,n.jsx)(a.$n,{variant:"ghost",size:"sm",onClick:()=>F([]),children:"Clear"})]})]}),(0,n.jsx)("div",{className:"grid gap-2 md:grid-cols-2",children:eB.map(e=>(0,n.jsxs)("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-border bg-background p-3 hover:bg-surface",children:[(0,n.jsx)("input",{type:"checkbox",className:"mt-1",checked:z.includes(e.routeModel),onChange:()=>{var t;return t=e.routeModel,void F(e=>e.includes(t)?e.filter(e=>e!==t):[...e,t])}}),(0,n.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,n.jsx)("span",{className:"block font-medium text-text-main",children:e.name||e.id}),(0,n.jsx)("span",{className:"mt-1 block break-all font-mono text-xs text-text-muted",children:e.routeModel}),e.type&&"llm"!==e.type?(0,n.jsx)("span",{className:"mt-2 inline-flex rounded-full bg-surface px-2 py-0.5 text-[11px] text-text-muted",children:e.type}):null]})]},e.routeModel))})]})}):null,et?(0,n.jsx)(a.aF,{isOpen:!!et,onClose:()=>es(null),title:"Manage imported models",size:"full",footer:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.$n,{variant:"ghost",onClick:()=>es(null),children:"Close"}),(0,n.jsx)(a.$n,{variant:"outline",loading:M===et.id,onClick:()=>eA(et),icon:"refresh",children:"Re-import from provider"})]}),children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 text-sm",children:[(0,n.jsx)("div",{className:"font-semibold text-text-main",children:et.name||et.id}),(0,n.jsxs)("div",{className:"mt-1 text-text-muted",children:[i(et.provider,v)," \xb7 ",e_.length," imported model(s)"]}),(0,n.jsx)("div",{className:"mt-2 text-xs text-text-muted",children:'Test gửi 1 prompt "Say hello in five words" qua ch\xednh OAuth account của bạn, qua đ\xfang proxy của connection. X\xf3a model sẽ bỏ n\xf3 khỏi list importable; c\xe1c API key đ\xe3 gắn model n\xe0y kh\xf4ng bị thay đổi (request đến model đ\xf3 sẽ do provider ph\xeda tr\xean quyết định chấp nhận hay kh\xf4ng).'})]}),0===e_.length?(0,n.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-8 text-center text-sm text-text-muted",children:'Chưa c\xf3 model n\xe0o được import. Bấm "Re-import from provider".'}):(0,n.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,n.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,n.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Model"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Route ID"}),(0,n.jsx)("th",{className:"px-4 py-3 font-medium",children:"Test result"}),(0,n.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,n.jsx)("tbody",{className:"divide-y divide-border bg-background",children:e_.map(e=>{let t=en[e.routeModel],s=ea===e.routeModel,r=ei===e.routeModel;return(0,n.jsxs)("tr",{className:"align-top",children:[(0,n.jsxs)("td",{className:"px-4 py-3",children:[(0,n.jsx)("div",{className:"font-medium text-text-main",children:e.name||e.id}),e.type&&"llm"!==e.type?(0,n.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.type}):null]}),(0,n.jsx)("td",{className:"px-4 py-3 font-mono text-xs text-text-muted break-all",children:e.routeModel}),(0,n.jsx)("td",{className:"px-4 py-3 text-xs",children:s?(0,n.jsx)("span",{className:"text-text-muted",children:"Đang test..."}):t?t.ok?(0,n.jsxs)("div",{className:"space-y-1",children:[(0,n.jsxs)("div",{className:"text-green-700 dark:text-green-300",children:["OK \xb7 ",t.latencyMs||0,"ms"]}),(0,n.jsx)("div",{className:"break-all text-text-muted",children:(t.text||"").slice(0,200)})]}):(0,n.jsxs)("div",{className:"space-y-1",children:[(0,n.jsxs)("div",{className:"text-red-700 dark:text-red-300",children:["FAIL \xb7 status ",t.status||"?"]}),(0,n.jsx)("div",{className:"break-all text-text-muted",children:(t.error||"").slice(0,200)})]}):(0,n.jsx)("span",{className:"text-text-muted",children:"—"})}),(0,n.jsx)("td",{className:"px-4 py-3",children:(0,n.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,n.jsx)(a.$n,{variant:"outline",size:"sm",loading:s,disabled:r,onClick:()=>eT(et,e),children:"Say hello"}),(0,n.jsx)(a.$n,{variant:"danger",size:"sm",loading:r,disabled:s,onClick:()=>eR(et,e),children:"Delete"})]})})]},e.routeModel)})})]})})]})}):null,ep?(0,n.jsx)(a.aF,{isOpen:ep,onClose:()=>eg(!1),title:"RTK (Token Savings) l\xe0 g\xec?",size:"xl",footer:(0,n.jsx)(a.$n,{onClick:()=>eg(!1),children:"Đ\xe3 hiểu"}),children:(0,n.jsxs)("div",{className:"space-y-5 text-sm text-text-main",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 rounded-xl border border-border bg-surface px-3 py-2",children:[(0,n.jsx)("span",{className:"text-xs text-text-muted",children:"Global RTK hiện đang:"}),(0,n.jsx)(a.Ex,{variant:eb?"success":"default",size:"sm",children:eb?"ON":"OFF"}),(0,n.jsx)("span",{className:"text-xs text-text-muted",children:'— \xe1p dụng cho mọi account chọn "Theo global"'})]}),(0,n.jsx)("p",{className:"text-text-muted",children:"RTK l\xe0 bộ lọc n\xe9n output của tool (Bash, Grep, Glob, Read...) ngay trong request trước khi gửi l\xean model, gi\xfap giảm số token phải gửi m\xe0 kh\xf4ng l\xe0m mất th\xf4ng tin quan trọng — chỉ t\xe1c động tới phần tool output, kh\xf4ng đụng v\xe0o nội dung chat."}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"mb-2 font-semibold text-text-main",children:"Hoạt động ra sao với CLI tool"}),(0,n.jsx)("p",{className:"text-text-muted",children:"Mỗi khi Claude Code / Codex CLI / OpenCode... gọi tool v\xe0 nhận lại output, RTK tự nhận diện định dạng quen thuộc rồi r\xfat gọn theo đ\xfang cấu tr\xfac của n\xf3:"}),(0,n.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-text-muted",children:[(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"font-mono text-text-main",children:"git diff"})," — giữ v\xe0i d\xf2ng context quanh thay đổi, cắt phần hunk qu\xe1 d\xe0i"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"font-mono text-text-main",children:"git status"})," / ",(0,n.jsx)("span",{className:"font-mono text-text-main",children:"git log"})," — gom gọn danh s\xe1ch file thay đổi, danh s\xe1ch commit"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"font-mono text-text-main",children:"grep"})," / ",(0,n.jsx)("span",{className:"font-mono text-text-main",children:"find"})," — giới hạn số match hiển thị mỗi file/thư mục"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"font-mono text-text-main",children:"ls -la"})," / ",(0,n.jsx)("span",{className:"font-mono text-text-main",children:"tree"})," — t\xf3m tắt theo loại file, cắt c\xe2y thư mục qu\xe1 s\xe2u"]}),(0,n.jsx)("li",{children:"Build log (npm/yarn/cargo...) — chỉ giữ d\xf2ng quan trọng (lỗi, kết quả build)"}),(0,n.jsx)("li",{children:"Output d\xe0i chung kh\xf4ng r\xf5 định dạng — fallback dedup d\xf2ng lặp hoặc smart-truncate (giữ đầu + cuối)"})]})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"mb-2 font-semibold text-text-main",children:"Hiệu quả thực tế"}),(0,n.jsx)("div",{className:"overflow-x-auto rounded-xl border border-border",children:(0,n.jsxs)("table",{className:"min-w-full text-xs",children:[(0,n.jsx)("thead",{className:"bg-surface/80 text-left uppercase tracking-wide text-text-muted",children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{className:"px-3 py-2 font-medium",children:"Loại output"}),(0,n.jsx)("th",{className:"px-3 py-2 font-medium",children:"Trước"}),(0,n.jsx)("th",{className:"px-3 py-2 font-medium",children:"Sau"}),(0,n.jsx)("th",{className:"px-3 py-2 font-medium",children:"Tiết kiệm"})]})}),(0,n.jsxs)("tbody",{className:"divide-y divide-border",children:[(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"px-3 py-2 font-mono",children:"git diff"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"7384B"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"3894B"}),(0,n.jsx)("td",{className:"px-3 py-2 text-green-600 dark:text-green-400",children:"47.3%"})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"px-3 py-2 font-mono",children:"grep -n"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"3723B"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"1447B"}),(0,n.jsx)("td",{className:"px-3 py-2 text-green-600 dark:text-green-400",children:"61.1%"})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"px-3 py-2 font-mono",children:"find"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"729B"}),(0,n.jsx)("td",{className:"px-3 py-2",children:"264B"}),(0,n.jsx)("td",{className:"px-3 py-2 text-green-600 dark:text-green-400",children:"63.8%"})]})]})]})})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"mb-2 font-semibold text-text-main",children:"Khi n\xe0o KH\xd4NG bị n\xe9n"}),(0,n.jsxs)("ul",{className:"list-disc space-y-1 pl-5 text-text-muted",children:[(0,n.jsx)("li",{children:"Chat thường kh\xf4ng gọi tool — kh\xf4ng c\xf3 g\xec để n\xe9n"}),(0,n.jsx)("li",{children:"Output nhỏ hơn 500B — kh\xf4ng đ\xe1ng n\xe9n"}),(0,n.jsxs)("li",{children:["Output b\xe1o lỗi (",(0,n.jsx)("span",{className:"font-mono text-text-main",children:"is_error"}),") — lu\xf4n giữ nguy\xean để debug"]}),(0,n.jsx)("li",{children:"Output lớn hơn 10MB — bỏ qua để tr\xe1nh tốn CPU xử l\xfd"})]})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{className:"mb-2 font-semibold text-text-main",children:"Global vs từng account"}),(0,n.jsxs)("p",{className:"text-text-muted",children:["Dropdown RTK ở bảng tr\xean cho ph\xe9p override ri\xeang từng account:",(0,n.jsx)("span",{className:"font-semibold text-text-main",children:" Theo global"})," (mặc định, d\xf9ng đ\xfang setting global),",(0,n.jsx)("span",{className:"font-semibold text-text-main",children:" Lu\xf4n ON"})," hoặc",(0,n.jsx)("span",{className:"font-semibold text-text-main",children:" Lu\xf4n OFF"})," — override lu\xf4n thắng global theo cả 2 chiều, n\xean c\xf3 thể để global OFF v\xe0 chỉ bật cho account d\xf9ng CLI tool, hoặc ngược lại."]})]})]})}):null,(0,n.jsx)(a.v9,{isOpen:!!C,provider:C,onAccept:()=>{A(null),C&&w(C)},onCancel:()=>{A(null)}}),ez?(0,n.jsx)(a.LF,{isOpen:!!k,provider:k.id,providerInfo:ez,connectionScope:"personal",onSuccess:ew,onClose:()=>w(null)}):null,I?(0,n.jsx)(a.uo,{isOpen:!!I,onClose:()=>S(null),onConfirm:e$,title:"Revoke and delete personal account",message:`Gateway sẽ thử revoke token của ${I.name||I.id} tại provider, sau đ\xf3 x\xf3a token v\xe0 connection local. ${"claude"===I.provider?"Claude chưa c\xf3 endpoint revoke tự động được c\xf4ng bố; bạn c\xf3 thể cần thu hồi thủ c\xf4ng trong t\xe0i khoản Claude.":"Nếu provider kh\xf4ng x\xe1c nhận revoke, hệ thống sẽ th\xf4ng b\xe1o để bạn thu hồi thủ c\xf4ng."}`,confirmText:"Revoke & delete",cancelText:"Cancel",variant:"danger"}):null,Y?(0,n.jsx)(a.aF,{isOpen:!!Y,onClose:()=>ee(""),title:"Thu hồi to\xe0n bộ quyền OAuth",size:"lg",busy:s,closeOnOverlay:!s,footer:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.$n,{variant:"ghost",onClick:()=>ee(""),disabled:s,children:"Hủy"}),(0,n.jsx)(a.$n,{variant:"danger",icon:"delete_forever",loading:s,onClick:()=>eU(Y),children:"Thu hồi v\xe0 x\xf3a to\xe0n bộ"})]}),children:(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsxs)("div",{className:"flex items-start gap-4 rounded-2xl border border-red-500/30 bg-gradient-to-br from-red-500/15 to-orange-500/5 p-4",children:[(0,n.jsx)("div",{className:"flex size-12 shrink-0 items-center justify-center rounded-2xl bg-red-500 text-white shadow-lg shadow-red-500/20",children:(0,n.jsx)("span",{className:"material-symbols-outlined text-[28px]",children:"warning"})}),(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"text-sm font-medium text-red-700 dark:text-red-300",children:"H\xe0nh động nguy hiểm, kh\xf4ng thể ho\xe0n t\xe1c"}),(0,n.jsx)("div",{className:"mt-1 break-all text-lg font-semibold text-text-main",children:Y}),(0,n.jsxs)("p",{className:"mt-2 text-sm leading-6 text-text-muted",children:["Thu hồi to\xe0n bộ quyền OAuth provider của ",(0,n.jsx)("span",{className:"font-semibold text-text-main",children:Y}),"? OAuth account của user n\xe0y sẽ bị ",(0,n.jsx)("span",{className:"font-semibold text-red-600 dark:text-red-300",children:"X\xd3A HẲN"})," khỏi gateway."]})]})]}),(0,n.jsx)("div",{className:"grid gap-3 sm:grid-cols-3",children:[["key_off","Token OAuth","Thử revoke upstream rồi x\xf3a token local"],["deployed_code","Model đ\xe3 import","X\xf3a dữ liệu model của connection"],["vpn_key_off","API key đ\xe3 g\xe1n","Gỡ model tương ứng khỏi API key"]].map(([e,t,s])=>(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,n.jsx)("span",{className:"material-symbols-outlined text-[22px] text-red-500",children:e}),(0,n.jsx)("div",{className:"mt-2 text-sm font-semibold text-text-main",children:t}),(0,n.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:s})]},t))}),(0,n.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/70 p-4",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,n.jsx)("span",{className:"text-sm text-text-muted",children:"Connection t\xecm thấy"}),(0,n.jsx)(a.Ex,{variant:eH>0?"warning":"default",size:"sm",children:eH})]}),eD?(0,n.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:v.map(e=>{let t=Number(eD.connectionsByProvider?.[e.id]||0);return t>0?(0,n.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-2.5 py-1 text-xs text-text-muted",children:[(0,n.jsx)(l.A,{src:`/providers/${e.id}.png`,alt:e.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase()}),e.name," \xd7",t]},e.id):null})}):null]}),(0,n.jsx)("p",{className:"text-xs leading-5 text-text-muted",children:"Nếu provider kh\xf4ng hỗ trợ revoke tự động hoặc kh\xf4ng phản hồi, gateway vẫn x\xf3a token local v\xe0 sẽ th\xf4ng b\xe1o để quản trị vi\xean thu hồi thủ c\xf4ng trong Security/Connected Apps của provider."})]})}):null]})}},47584:(e,t,s)=>{Promise.resolve().then(s.bind(s,43503))}},e=>{e.O(0,[2574,3862,506,9959,1997,5564,5263,5497,8441,3794,7358],()=>e(e.s=47584)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,s)=>{Promise.resolve().then(s.bind(s,38658))},38658:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>f});var t=s(95155),r=s(12115),l=s(44656),o=s(35497);let d={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,payloadRotationEnabled:!1,payloadRetentionDays:60,payloadRotationIntervalHours:24,payloadRotationBatchSize:500,payloadRotationMaxBatches:20};function n({label:e,value:a,onChange:s,type:r="text",placeholder:l="",disabled:o=!1,min:d,max:i,step:c}){return(0,t.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)("span",{className:"text-text-muted",children:e}),(0,t.jsx)("input",{type:r,value:a||"",placeholder:l,disabled:o,min:d,max:i,step:c,onChange:e=>s(e.target.value),className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50"})]})}function i({label:e,checked:a,onChange:s,disabled:r=!1}){return(0,t.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main",children:[(0,t.jsx)("input",{type:"checkbox",checked:!!a,disabled:r,onChange:e=>s(e.target.checked)}),e]})}function c(){let[e,a]=(0,r.useState)(d),[s,l]=(0,r.useState)(!1),[c,p]=(0,r.useState)(null),[u,m]=(0,r.useState)(null),[x,b]=(0,r.useState)(null),g=e=>a(a=>({...a,...e})),h=async()=>{l(!0),m(null);try{let e=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db"),s=await e.json();if(!e.ok)throw Error(s.error||"Failed to load config");a({...d,...s.config||{}})}catch(e){m(e.message||"Failed to load config")}finally{l(!1)}};(0,r.useEffect)(()=>{h()},[]);let y=async()=>{l(!0),m(null),p(null);try{let s=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:e})}),t=await s.json();if(!s.ok)throw Error(t.error||"Failed to save config");a({...d,...t.config||{}}),p("Saved")}catch(e){m(e.message||"Failed to save config")}finally{l(!1)}},v=async(a,s={})=>{if(!s.confirm||window.confirm("Delete expired full request/response payloads now? Prompt log rows, previews, token/model/provider metadata, and analytics are kept. This action cannot restore deleted payload JSON.")){l(!0),m(null),p(null),a.includes("payload-rotation")&&b(null);try{let t=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,config:e,confirm:!0===s.confirm})}),r=await t.text(),l={};try{l=r?JSON.parse(r):{}}catch{let e=r.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,200),a=504===t.status?"Rotation took too long and the server timed out. Try lowering 'Max transactions per run' and run again.":`HTTP ${t.status}: ${e||t.statusText||"non-JSON response"}`;throw Error(a)}if(!t.ok)throw Error(l.error||`HTTP ${t.status}`);a.includes("payload-rotation")&&b(l),p(l.message||l.init?.message||"OK")}catch(e){m(e.message||"Action failed")}finally{l(!1)}}},f="postgres"===e.type||"mysql"===e.type;return(0,t.jsx)(o.Zp,{title:"Request Logging",subtitle:"Control local request files and database-backed prompt logs",icon:"receipt_long",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)(o.Ex,{variant:e.fileLoggingEnabled?"success":"default",children:["Local files: ",e.fileLoggingEnabled?"Enabled":"Disabled"]}),(0,t.jsxs)(o.Ex,{variant:e.enabled?"success":"default",children:["Database: ",e.enabled?"Enabled":"Disabled"]})]}),(0,t.jsx)("div",{className:"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-3 text-xs text-yellow-700 dark:text-yellow-300",children:'Prompt logs may contain source code, selected code, internal URLs, user prompts, and provider responses. Checked stages store full raw JSON; prompt/response text columns keep only short previews. Per-combo "hide content" still redacts raw JSON.'}),(0,t.jsx)("div",{className:"grid gap-3 md:grid-cols-2",children:(0,t.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)("span",{className:"text-text-muted",children:"Database type"}),(0,t.jsxs)("select",{value:e.type,disabled:s,onChange:a=>{let s=a.target.value;g({type:s,port:"postgres"===s?e.port||"5432":"mysql"===s?e.port||"3306":e.port})},className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50",children:[(0,t.jsx)("option",{value:"mysql",children:"MySQL / MariaDB"}),(0,t.jsx)("option",{value:"postgres",children:"PostgreSQL"})]})]})}),f&&(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,t.jsx)(n,{label:"Host",value:e.host,placeholder:"127.0.0.1",onChange:e=>g({host:e}),disabled:s}),(0,t.jsx)(n,{label:"Port",value:e.port,placeholder:"postgres"===e.type?"5432":"3306",onChange:e=>g({port:e}),disabled:s}),(0,t.jsx)(n,{label:"Database",value:e.database,placeholder:"bluerouter_logs",onChange:e=>g({database:e}),disabled:s}),(0,t.jsx)(n,{label:"Username",value:e.username,placeholder:"bluerouter",onChange:e=>g({username:e}),disabled:s}),(0,t.jsx)(n,{label:"Password",type:"password",value:e.password,placeholder:"Leave as ******** to keep existing password",onChange:e=>g({password:e}),disabled:s}),(0,t.jsxs)("div",{className:"flex flex-col justify-end gap-2",children:[(0,t.jsx)(i,{label:"Use SSL",checked:e.ssl,onChange:e=>g({ssl:e}),disabled:s}),(0,t.jsx)(i,{label:"Create database if missing",checked:e.createDatabase,onChange:e=>g({createDatabase:e}),disabled:s})]})]}),(0,t.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-surface/40 p-3 md:grid-cols-2",children:[(0,t.jsx)(i,{label:"Save request/response to local files",checked:e.fileLoggingEnabled,onChange:e=>g({fileLoggingEnabled:e}),disabled:s}),(0,t.jsx)(i,{label:"Save request/response to Prompt Log Database",checked:e.enabled,onChange:e=>g({enabled:e}),disabled:s}),(0,t.jsx)(i,{label:"Log client request JSON",checked:e.logClientRequest,onChange:e=>g({logClientRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log normalized/source request JSON",checked:e.logSourceRequest,onChange:e=>g({logSourceRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log target/provider request JSON",checked:e.logTargetRequest,onChange:e=>g({logTargetRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log provider response JSON",checked:e.logProviderResponse,onChange:e=>g({logProviderResponse:e}),disabled:s}),(0,t.jsx)(i,{label:"Log errors",checked:e.logErrors,onChange:e=>g({logErrors:e}),disabled:s})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-background p-3 text-xs text-text-muted",children:["Local files are written under ",(0,t.jsx)("code",{children:"DATA_DIR/logs/requests"}),". Disabling local files stops new request/response dump files; existing files are kept."]}),(0,t.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-surface/40 p-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Full payload rotation"}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Deletes expired full request/response JSON only. Rows in ",(0,t.jsx)("code",{children:"prompt_logs"}),", short previews, model/provider/token metadata, and dashboard analytics remain available."]})]}),(0,t.jsx)(i,{label:"Enable automatic payload rotation",checked:e.payloadRotationEnabled,onChange:e=>g({payloadRotationEnabled:e}),disabled:s}),(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,t.jsx)(n,{label:"Keep full payload for (days)",type:"number",min:1,max:3650,step:1,value:String(e.payloadRetentionDays||60),onChange:e=>g({payloadRetentionDays:Number(e)||60}),disabled:s}),(0,t.jsx)(n,{label:"Automatic run interval (hours)",type:"number",min:1,max:168,step:1,value:String(e.payloadRotationIntervalHours||24),onChange:e=>g({payloadRotationIntervalHours:Number(e)||24}),disabled:s}),(0,t.jsx)(n,{label:"Prompt-log rows per transaction",type:"number",min:50,max:5e3,step:50,value:String(e.payloadRotationBatchSize||500),onChange:e=>g({payloadRotationBatchSize:Number(e)||500}),disabled:s}),(0,t.jsx)(n,{label:"Max transactions per run",type:"number",min:1,max:200,step:1,value:String(e.payloadRotationMaxBatches||20),onChange:e=>g({payloadRotationMaxBatches:Number(e)||20}),disabled:s})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["MySQL: payload hashes are detached from expired ",(0,t.jsx)("code",{children:"prompt_logs"})," rows, then rows in ",(0,t.jsx)("code",{children:"prompt_log_payloads"})," are deleted only when no prompt log still references them. Each batch uses a transaction and a database advisory lock to prevent overlapping rotation jobs."]}),(0,t.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:["Deleting rows frees reusable space inside InnoDB, but ",(0,t.jsx)("code",{children:"prompt_log_payloads.ibd"})," normally does not shrink immediately. Do not run ",(0,t.jsx)("code",{children:"OPTIMIZE TABLE"})," on a very large table without checking temporary disk space and a maintenance window."]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("preview-payload-rotation"),loading:s,children:"Preview expired payloads"}),(0,t.jsx)(o.$n,{size:"sm",variant:"danger",onClick:()=>v("run-payload-rotation",{confirm:!0}),loading:s,children:"Delete expired payloads now"})]}),x&&(0,t.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-background p-3 text-xs md:grid-cols-2 lg:grid-cols-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-text-muted",children:"Cutoff:"})," ",(0,t.jsx)("span",{className:"text-text-main",children:x.cutoff?new Date(x.cutoff).toLocaleString():"-"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-text-muted",children:"Prompt-log rows:"})," ",(0,t.jsx)("span",{className:"text-text-main",children:Number(x.promptLogRows??x.promptLogRowsUpdated??0).toLocaleString()})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-text-muted",children:void 0===x.payloadRowsDeleted?"Payload rows past retention:":"Payload rows deleted:"})," ",(0,t.jsx)("span",{className:"text-text-main",children:Number(x.payloadRowsDeleted??x.payloadRowsPastRetention??0).toLocaleString()})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"text-text-muted",children:void 0===x.payloadBytesDeleted?"Estimated payload size:":"Payload size deleted:"})," ",(0,t.jsx)("span",{className:"text-text-main",children:function(e){let a=Number(e||0);if(!Number.isFinite(a)||a<=0)return"0 B";let s=["B","KB","MB","GB","TB"],t=Math.min(s.length-1,Math.floor(Math.log(a)/Math.log(1024))),r=a/1024**t;return`${r.toFixed(r>=10||0===t?1:2)} ${s[t]}`}(x.payloadBytesDeleted??x.payloadBytesPastRetention??x.referencedPayloadBytes)})]}),x.hasMore?(0,t.jsx)("div",{className:"md:col-span-2 lg:col-span-4 text-amber-600",children:"More expired rows remain because the per-run batch limit was reached."}):null]}),(0,t.jsx)("div",{className:"text-[11px] text-text-muted",children:"Save the settings after enabling automatic rotation. Preview and manual deletion use the values currently shown in this form."})]}),f&&(0,t.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["Prompt logs now support MySQL/MariaDB and PostgreSQL only. MySQL/MariaDB requires ",(0,t.jsx)("code",{children:"mysql2"}),"; PostgreSQL requires ",(0,t.jsx)("code",{children:"pg"}),"."]}),c&&(0,t.jsx)("div",{className:"rounded-lg border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600",children:c}),u&&(0,t.jsx)("div",{className:"rounded-lg border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-500",children:u}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:h,loading:s,children:"Reload"}),(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("test"),loading:s,children:"Test connection"}),(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("init"),loading:s,children:"Initialize schema"}),(0,t.jsx)(o.$n,{size:"sm",onClick:y,loading:s,children:"Save"}),(0,t.jsx)(o.$n,{size:"sm",variant:"success",onClick:()=>v("save-and-init"),loading:s,children:"Save & initialize"})]})]})})}let p="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",u="image/svg+xml,image/png,image/webp,image/jpeg,image/gif",m=`${u},image/x-icon,image/vnd.microsoft.icon,.ico`;function x({status:e}){if(!e?.message)return null;let a="error"===e.type?"text-red-600 bg-red-50 border-red-200":"text-green-700 bg-green-50 border-green-200";return(0,t.jsx)("div",{className:`mt-3 rounded-xl border px-4 py-3 text-sm ${a}`,children:e.message})}function b({icon:e,title:a,desc:s,children:r}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,t.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),s&&(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:s})]})]}),r]})}function g({label:e,hint:a,children:s}){return(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),s,a&&(0,t.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function h(e){return(0,t.jsx)("input",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function y(e){return(0,t.jsx)("textarea",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function v({title:e,desc:a,checked:s,onChange:r,disabled:l}){return(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,t.jsx)("button",{type:"button",disabled:l,onClick:()=>r(!s),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${s?"bg-primary":"bg-border"}`,children:(0,t.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${s?"left-5":"left-0.5"}`})})]})}function f(){let[e,a]=(0,r.useState)({}),[s,o]=(0,r.useState)(!0),[d,n]=(0,r.useState)({current:"",new:"",confirm:""}),[i,f]=(0,r.useState)({type:"",message:""}),[j,w]=(0,r.useState)(!1),[N,D]=(0,r.useState)(!1),[C,S]=(0,r.useState)({type:"",message:""}),A=(0,r.useRef)(null),[k,L]=(0,r.useState)("admin"),[U,P]=(0,r.useState)({type:"",message:""}),[M,R]=(0,r.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:p,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapAiGatewaysMonitorsGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[B,E]=(0,r.useState)({type:"",message:""}),[G,I]=(0,r.useState)(!1),[O,T]=(0,r.useState)(!1),[F,q]=(0,r.useState)(""),[$,_]=(0,r.useState)([]),[z,J]=(0,r.useState)(!1),[H,V]=(0,r.useState)({authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC"}),[Q,K]=(0,r.useState)(""),[W,Z]=(0,r.useState)({type:"",message:""}),[X,Y]=(0,r.useState)(!1),[ee,ea]=(0,r.useState)(!1),[es,et]=(0,r.useState)({type:"",message:""}),er=(0,l.useBranding)(),[el,eo]=(0,r.useState)(""),[ed,en]=(0,r.useState)(""),[ei,ec]=(0,r.useState)(""),[ep,eu]=(0,r.useState)({type:"",message:""}),[em,ex]=(0,r.useState)(!1),[eb,eg]=(0,r.useState)(!1),[eh,ey]=(0,r.useState)(!1),[ev,ef]=(0,r.useState)(!1),ej=(0,r.useRef)(null),ew=(0,r.useRef)(null),eN=async()=>{o(!0);try{let e=await fetch("/api/settings",{cache:"no-store"}),s=await e.json();a(s),L(s.localLoginUsername||"admin"),R({ldapEnabled:!0===s.ldapEnabled,ldapUrl:s.ldapUrl||"",ldapBindDn:s.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:s.ldapUserBaseDn||s.ldapBaseDn||"",ldapUserSearchFilter:s.ldapUserSearchFilter||p,ldapUserNameAttribute:s.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:s.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:s.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:s.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:s.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:s.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:s.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==s.ldapNestedGroups,ldapAllowedUsers:Array.isArray(s.ldapAllowedUsers)?s.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==s.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:s.ldapConnectTimeoutMs||8e3}),V({authMode:s.authMode||"password",oidcIssuerUrl:s.oidcIssuerUrl||"",oidcClientId:s.oidcClientId||"",oidcScopes:s.oidcScopes||"openid profile email",oidcLoginLabel:s.oidcLoginLabel||"Sign in with OIDC"}),eo(s.siteTitle||""),en(s.siteShortName||""),ec(s.siteDescription||""),("oidc"===s.authMode||"both"===s.authMode)&&ea(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{o(!1)}};(0,r.useEffect)(()=>{eN()},[]);let eD=async e=>{let s=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Failed to save settings");return a(e=>({...e,...t})),t},eC=async s=>{et({type:"",message:""});let t=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:s}));try{let e=await eD({sidebarAdvancedToolsVisible:s}),t=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:t})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:t}})),et({type:"success",message:t?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){a(e=>({...e,sidebarAdvancedToolsVisible:t})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:t}})),et({type:"error",message:e.message||"Failed to save sidebar setting."})}},eS=async e=>{e.preventDefault(),P({type:"",message:""});try{let e=await eD({localLoginUsername:k});L(e.localLoginUsername||k||"admin"),P({type:"success",message:"Local account name saved."})}catch(e){P({type:"error",message:e.message})}},eA=async e=>{if(e.preventDefault(),d.new!==d.confirm)return void f({type:"error",message:"Passwords do not match"});w(!0),f({type:"",message:""});try{await eD({currentPassword:d.current,newPassword:d.new}),f({type:"success",message:"Password updated successfully"}),n({current:"",new:"",confirm:""})}catch(e){f({type:"error",message:e.message||"Failed to update password"})}finally{w(!1)}},ek=async()=>{D(!0),S({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let a=await e.json().catch(()=>({}));throw Error(a.error||"Failed to export database")}let a=await e.json(),s=JSON.stringify(a,null,2),t=new Blob([s],{type:"application/json"}),r=URL.createObjectURL(t),l=document.createElement("a"),o=new Date().toISOString().replace(/[.:]/g,"-");l.href=r,l.download=`bluerouter-backup-${o}.json`,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(r),S({type:"success",message:"Database backup downloaded."})}catch(e){S({type:"error",message:e.message||"Failed to export database."})}finally{D(!1)}},eL=async e=>{let a=e.target.files?.[0];if(a){D(!0),S({type:"",message:""});try{let e=await a.text(),s=JSON.parse(e),t=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Failed to import database");await eN();let l=r.resourceMonitorImported?`Restored ${r.resourceMonitorServerCount||0} Resource Monitor server(s) and ${r.resourceMonitorHistoryCount||0} history sample(s).`:"Legacy backup: current Resource Monitor data was kept.",o=r.brandingImported?`Restored ${r.brandingAssetCount||0} branding asset(s).`:"Current logo and favicon were kept.";S({type:"success",message:`Database imported successfully. ${l} ${o}`})}catch(e){S({type:"error",message:e.message||"Invalid backup file."})}finally{A.current&&(A.current.value=""),D(!1)}}},eU=(e,a)=>R(s=>({...s,[e]:a})),eP=async e=>{e?.preventDefault?.(),I(!0),E({type:"",message:""});try{let e={...M,ldapBaseDn:M.ldapUserBaseDn,ldapAllowedUsers:M.ldapAllowedUsers};e.ldapBindPassword||delete e.ldapBindPassword;let a=await eD(e);R(e=>({...e,ldapBindPassword:"",ldapEnabled:!0===a.ldapEnabled,ldapUserBaseDn:a.ldapUserBaseDn||a.ldapBaseDn||e.ldapUserBaseDn,ldapLoginAllowedGroupDn:a.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:a.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:a.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:a.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==a.ldapNestedGroups,ldapAllowedUsers:Array.isArray(a.ldapAllowedUsers)?a.ldapAllowedUsers:e.ldapAllowedUsers})),E({type:"success",message:"LDAP settings saved."})}catch(e){E({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{I(!1)}},eM=async()=>{T(!0),E({type:"",message:""});try{await eP();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?E({type:"success",message:a.message||"LDAP connection OK."}):E({type:"error",message:a.error||"LDAP test failed."})}catch(e){E({type:"error",message:e.message||"LDAP test failed."})}finally{T(!1)}},eR=async()=>{J(!0),E({type:"",message:""});try{await eP();let e=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(F)}`,{cache:"no-store"}),a=await e.json().catch(()=>({}));e.ok?(_(a.users||[]),E({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):E({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){E({type:"error",message:e.message||"Failed to load LDAP users."})}finally{J(!1)}},eB=e=>{let a=String(e||"").trim();a&&R(e=>{let s=new Set(e.ldapAllowedUsers||[]);return s.has(a)?s.delete(a):s.add(a),{...e,ldapAllowedUsers:[...s]}})},eE=async(a=H.authMode||"password")=>{let s=H.oidcIssuerUrl.trim(),t=H.oidcClientId.trim(),r=H.oidcScopes.trim(),l=H.oidcLoginLabel.trim(),o=Q.trim();if("password"!==a&&(!s||!t||!o)&&!e.oidcConfigured)return void Z({type:"error",message:"Issuer URL, client ID, and client secret are required to enable OIDC."});Y(!0),Z({type:"",message:""});try{let e={authMode:a,oidcIssuerUrl:s,oidcClientId:t,oidcScopes:r||"openid profile email",oidcLoginLabel:l||"Sign in with OIDC"};o&&(e.oidcClientSecret=o);let d=await eD(e);V({authMode:d.authMode||a,oidcIssuerUrl:d.oidcIssuerUrl||s,oidcClientId:d.oidcClientId||t,oidcScopes:d.oidcScopes||r||"openid profile email",oidcLoginLabel:d.oidcLoginLabel||l||"Sign in with OIDC"}),K(""),Z({type:"success",message:"OIDC settings saved."})}catch(e){Z({type:"error",message:e.message||"Failed to save OIDC settings"})}finally{Y(!1)}},eG=async(e,a)=>{if(!a)return;if(a.size>1048576)return void eu({type:"error",message:"File exceeds 1 MB limit."});let s="logo"===e?eg:ey;s(!0),eu({type:"",message:""});try{let s=new FormData;s.append("asset",e),s.append("file",a);let t=await fetch("/api/branding/upload",{method:"POST",body:s}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Upload failed");(0,l.notifyBrandingChanged)(),eu({type:"success",message:`${"logo"===e?"Logo":"Favicon"} uploaded.`})}catch(e){eu({type:"error",message:e.message||"Upload failed."})}finally{s(!1)}},eI=async e=>{let a=e.target.files?.[0];await eG("logo",a),ej.current&&(ej.current.value="")},eO=async e=>{let a=e.target.files?.[0];await eG("favicon",a),ew.current&&(ew.current.value="")},eT=async e=>{e.preventDefault(),ex(!0),eu({type:"",message:""});try{await eD({siteTitle:el.trim(),siteShortName:ed.trim(),siteDescription:ei.trim()}),(0,l.notifyBrandingChanged)(),eu({type:"success",message:"Branding text saved."})}catch(e){eu({type:"error",message:e.message||"Failed to save branding."})}finally{ex(!1)}},eF=async e=>{eu({type:"",message:""});try{let a=await fetch(`/api/branding?asset=${e}`,{method:"DELETE"}),s=await a.json().catch(()=>({}));if(!a.ok)throw Error(s.error||"Failed to remove asset");(0,l.notifyBrandingChanged)(),eu({type:"success",message:`${"logo"===e?"Logo":"Favicon"} removed.`})}catch(e){eu({type:"error",message:e.message||"Failed to remove asset."})}},eq=async()=>{ef(!0),eu({type:"",message:""});try{let e=await fetch("/api/branding",{method:"DELETE"});if(!e.ok){let a=await e.json().catch(()=>({}));throw Error(a.error||"Failed to reset branding")}await eD({siteTitle:"",siteShortName:"",siteDescription:""}),eo(""),en(""),ec(""),(0,l.notifyBrandingChanged)(),eu({type:"success",message:"Branding reset to defaults."})}catch(e){eu({type:"error",message:e.message||"Failed to reset branding."})}finally{ef(!1)}};return s?(0,t.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,t.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,t.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure dashboard preferences, request logging, database backup, and authentication."})]}),(0,t.jsxs)(b,{icon:"view_sidebar",title:"Sidebar tools",desc:"Show or hide advanced dashboard tools to keep the sidebar clean.",children:[(0,t.jsx)(v,{title:"Show Advanced tools",desc:"When disabled, Media / Web, AI Traffic Gateway, CLI Tools, Proxy Pools, Skills, Console Log and Translator are hidden from the sidebar. Core admin pages remain visible.",checked:!1!==e.sidebarAdvancedToolsVisible,onChange:eC}),(0,t.jsx)(x,{status:es})]}),(0,t.jsxs)(b,{icon:"palette",title:"Branding",desc:"Customize site title, logo and favicon shown in the dashboard, browser tab and login page. Max 1 MB per file.",children:[(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Logo"}),(0,t.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,t.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:er?.logoUrl?(0,t.jsx)("img",{src:er.logoUrl,alt:"Current logo",className:"max-h-full max-w-full object-contain"}):(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"hub"})}),(0,t.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,t.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the dashboard sidebar and login page. SVG, PNG, WebP, JPEG, GIF."}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"button",disabled:eb,onClick:()=>ej.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eb?"Uploading...":er?.logoUrl?"Replace logo":"Upload logo"}),er?.logoUrl?(0,t.jsx)("button",{type:"button",onClick:()=>eF("logo"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,t.jsx)("input",{ref:ej,type:"file",accept:u,className:"hidden",onChange:eI})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Favicon"}),(0,t.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,t.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:er?.faviconUrl?(0,t.jsx)("img",{src:er.faviconUrl,alt:"Current favicon",className:"max-h-10 max-w-10 object-contain"}):(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"public"})}),(0,t.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,t.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the browser tab. ICO, SVG, PNG, WebP, JPEG, GIF."}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"button",disabled:eh,onClick:()=>ew.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eh?"Uploading...":er?.faviconUrl?"Replace favicon":"Upload favicon"}),er?.faviconUrl?(0,t.jsx)("button",{type:"button",onClick:()=>eF("favicon"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,t.jsx)("input",{ref:ew,type:"file",accept:m,className:"hidden",onChange:eO})]})]})]}),(0,t.jsxs)("form",{onSubmit:eT,className:"space-y-3",children:[(0,t.jsx)(g,{label:"Site title",hint:"Shown in browser tab and login page. Leave blank for default.",children:(0,t.jsx)(h,{value:el,onChange:e=>eo(e.target.value),placeholder:"AI Router Gateway"})}),(0,t.jsx)(g,{label:"Company short name",hint:"Shown in dashboard sidebar and login hero text. Defaults to site title/sidebar default or 'Fujinet' on login.",children:(0,t.jsx)(h,{value:ed,onChange:e=>en(e.target.value),placeholder:"Fujinet"})}),(0,t.jsx)(g,{label:"Description",hint:"Used for browser metadata.",children:(0,t.jsx)(y,{rows:3,value:ei,onChange:e=>ec(e.target.value),placeholder:"AI Infrastructure Management"})}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"submit",disabled:em,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:em?"Saving...":"Save branding text"}),(0,t.jsx)("button",{type:"button",disabled:ev,onClick:eq,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-red-300 hover:text-red-600 disabled:opacity-50",children:ev?"Resetting...":"Reset to defaults"})]})]})]}),(0,t.jsx)(x,{status:ep})]}),(0,t.jsx)(b,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("form",{onSubmit:eS,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,t.jsx)(g,{label:"Local username",children:(0,t.jsx)(h,{value:k,onChange:e=>L(e.target.value)})}),(0,t.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,t.jsx)(x,{status:U})]}),(0,t.jsxs)("form",{onSubmit:eA,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,t.jsx)(g,{label:"Current password",children:(0,t.jsx)(h,{type:"password",value:d.current,onChange:e=>n({...d,current:e.target.value}),required:!0})}),(0,t.jsx)(g,{label:"New password",children:(0,t.jsx)(h,{type:"password",value:d.new,onChange:e=>n({...d,new:e.target.value}),required:!0})}),(0,t.jsx)(g,{label:"Confirm password",children:(0,t.jsx)(h,{type:"password",value:d.confirm,onChange:e=>n({...d,confirm:e.target.value}),required:!0})}),(0,t.jsx)("button",{disabled:j,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:e.hasPassword?"Update Password":"Set Password"}),(0,t.jsx)(x,{status:i})]})]})}),(0,t.jsx)("div",{id:"request-logging",className:"scroll-mt-6",children:(0,t.jsx)(c,{})}),(0,t.jsxs)(b,{icon:"database",title:"Database Backup",desc:"Export or restore configuration, Linux Resource Monitor data, logo and favicon.",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsx)("button",{onClick:ek,disabled:N,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Backup"}),(0,t.jsx)("button",{onClick:()=>A.current?.click(),disabled:N,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-primary/50 disabled:opacity-50",children:"Import Backup"}),(0,t.jsx)("input",{ref:A,type:"file",accept:"application/json",className:"hidden",onChange:eL})]}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Backup files contain API credentials, Resource Monitor agent tokens and embedded branding images. Store them securely. Legacy backups keep current Resource Monitor and branding files."}),(0,t.jsx)(x,{status:C})]}),(0,t.jsx)(b,{icon:"corporate_fare",title:"LDAP / Active Directory Login",desc:"Search users from a User Base DN, restrict login by group DN, and grant admin by group DN. The old Selected LDAP users list is kept as a manual admin list.",children:(0,t.jsxs)("form",{onSubmit:eP,className:"space-y-5",children:[(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,t.jsx)("button",{type:"button",onClick:()=>eU("ldapEnabled",!M.ldapEnabled),className:`rounded-xl px-3 py-2 text-sm font-semibold ${M.ldapEnabled?"bg-primary text-white":"border border-border text-text-muted"}`,children:M.ldapEnabled?"Enabled":"Disabled"})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"LDAP URL",children:(0,t.jsx)(h,{value:M.ldapUrl,onChange:e=>eU("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,t.jsx)(g,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,t.jsx)(h,{value:M.ldapUserBaseDn,onChange:e=>eU("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Bind DN",children:(0,t.jsx)(h,{value:M.ldapBindDn,onChange:e=>eU("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,t.jsx)(g,{label:"LDAP Bind Password",children:(0,t.jsx)(h,{type:"password",value:M.ldapBindPassword,onChange:e=>eU("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,t.jsx)(g,{label:"LDAP Login Allowed Group DN",hint:"Only members of this group can log in. Leave blank to allow any valid LDAP user.",children:(0,t.jsx)(h,{value:M.ldapLoginAllowedGroupDn,onChange:e=>eU("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,t.jsx)(h,{value:M.ldapAdminGroupDn,onChange:e=>eU("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Monitor Admin Group DN",hint:"Members can use only Endpoint, API Keys, Usage, Analytics, Quota Tracker and Prompt Logs with admin-like permissions inside those tabs.",children:(0,t.jsx)(h,{value:M.ldapMonitorAdminGroupDn,onChange:e=>eU("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP AI Gateways Monitors Group DN",hint:"Members log in as regular users but the Analytics page aggregates statistics for every API key that has an owner, instead of only their own keys.",children:(0,t.jsx)(h,{value:M.ldapAiGatewaysMonitorsGroupDn,onChange:e=>eU("ldapAiGatewaysMonitorsGroupDn",e.target.value),placeholder:"CN=BlueRouter_AI_Gateways_Monitors,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})})]}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,t.jsx)(h,{value:M.ldapUserSearchFilter,onChange:e=>eU("ldapUserSearchFilter",e.target.value)})}),(0,t.jsx)(g,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,t.jsx)(v,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:M.ldapNestedGroups,onChange:e=>eU("ldapNestedGroups",e)})}),(0,t.jsx)(g,{label:"Username attribute",children:(0,t.jsx)(h,{value:M.ldapUserNameAttribute,onChange:e=>eU("ldapUserNameAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Display attribute",children:(0,t.jsx)(h,{value:M.ldapUserDisplayAttribute,onChange:e=>eU("ldapUserDisplayAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Email attribute",children:(0,t.jsx)(h,{value:M.ldapUserEmailAttribute,onChange:e=>eU("ldapUserEmailAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Connect timeout ms",children:(0,t.jsx)(h,{type:"number",value:M.ldapConnectTimeoutMs,onChange:e=>eU("ldapConnectTimeoutMs",e.target.value)})})]}),(0,t.jsx)(v,{title:"Reject invalid TLS certificates",desc:"Disable only for test/self-signed LDAP TLS.",checked:M.ldapTlsRejectUnauthorized,onChange:e=>eU("ldapTlsRejectUnauthorized",e)}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Users loaded here come from Login Allowed Group DN when set. Selected users are also treated as manual admins for backward compatibility."})]}),(0,t.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,t.jsx)(h,{value:F,onChange:e=>q(e.target.value),placeholder:"Search users..."}),(0,t.jsx)("button",{type:"button",onClick:eR,disabled:z,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:z?"Loading...":"Load users"})]}),$.length>0&&(0,t.jsx)("div",{className:"max-h-72 overflow-auto rounded-xl border border-border",children:$.map(e=>{let a=M.ldapAllowedUsers.includes(e.username);return(0,t.jsxs)("button",{type:"button",onClick:()=>eB(e.username),className:`flex w-full items-center justify-between gap-3 border-b border-border px-3 py-2 text-left text-sm last:border-b-0 ${a?"bg-primary/10":"bg-background hover:bg-surface"}`,children:[(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,t.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:["Selected manual admin users (",M.ldapAllowedUsers.length,")"]}),0===M.ldapAllowedUsers.length?(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:M.ldapAllowedUsers.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>eB(e),className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs text-primary",children:[e," \xd7"]},e))})]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:eM,disabled:O,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:O?"Testing...":"Save & test LDAP"}),(0,t.jsx)("button",{type:"submit",disabled:G,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:G?"Saving...":"Save LDAP settings"})]}),(0,t.jsx)(x,{status:B})]})}),(0,t.jsxs)(b,{icon:"lock_open",title:"OIDC Dashboard Login",desc:"oidc"===e.authMode?"OIDC active":"both"===e.authMode?"Password + OIDC active":"Optional SSO via Authentik/Keycloak/Google",children:[(0,t.jsx)("button",{type:"button",onClick:()=>ea(e=>!e),className:"mb-4 rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main",children:ee?"Hide OIDC settings":"Show OIDC settings"}),ee&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:[{value:"password",title:"Password/LDAP",desc:"Keep local and LDAP login."},{value:"oidc",title:"OIDC only",desc:"Disable local/LDAP login when configured."},{value:"both",title:"Both",desc:"Allow either OIDC or local/LDAP."}].map(e=>{let a=H.authMode===e.value;return(0,t.jsxs)("button",{type:"button",onClick:()=>V(a=>({...a,authMode:e.value})),className:`rounded-xl border p-3 text-left ${a?"border-primary bg-primary/10":"border-border bg-background hover:border-primary/40"}`,children:[(0,t.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"Issuer URL",children:(0,t.jsx)(h,{value:H.oidcIssuerUrl,onChange:e=>V({...H,oidcIssuerUrl:e.target.value})})}),(0,t.jsx)(g,{label:"Client ID",children:(0,t.jsx)(h,{value:H.oidcClientId,onChange:e=>V({...H,oidcClientId:e.target.value})})}),(0,t.jsx)(g,{label:"Client Secret",children:(0,t.jsx)(h,{type:"password",value:Q,onChange:e=>K(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,t.jsx)(g,{label:"Scopes",children:(0,t.jsx)(h,{value:H.oidcScopes,onChange:e=>V({...H,oidcScopes:e.target.value})})}),(0,t.jsx)(g,{label:"Login label",children:(0,t.jsx)(h,{value:H.oidcLoginLabel,onChange:e=>V({...H,oidcLoginLabel:e.target.value})})})]}),(0,t.jsx)("button",{type:"button",onClick:()=>eE(),disabled:X,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:X?"Saving...":"Save OIDC settings"}),(0,t.jsx)(x,{status:W})]})]})]})}}},e=>{e.O(0,[2574,3862,506,9959,1997,5564,5263,5497,8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);