@jheavenknows/bluerouter 5.3.60 → 5.3.62
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.
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +13 -12
- package/app/.next-cli-build/build-manifest.json +3 -3
- package/app/.next-cli-build/prerender-manifest.json +1 -1
- package/app/.next-cli-build/routes-manifest.json +6 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js +2 -2
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/view-mode/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js +2 -2
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js +2 -2
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js +2 -2
- package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js +2 -2
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js +2 -2
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js +2 -2
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js +2 -2
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js +2 -2
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js +2 -2
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js +2 -2
- package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js +3 -3
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js +1 -1
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +11 -11
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +11 -11
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +11 -11
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.rsc +22 -24
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +22 -24
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/routing-topology.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/routing-topology.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/favicon.ico/route.js +1 -1
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/login/page.js +1 -1
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +2 -2
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js +1 -1
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +13 -12
- package/app/.next-cli-build/server/chunks/3767.js +1 -1
- package/app/.next-cli-build/server/chunks/3958.js +3 -3
- package/app/.next-cli-build/server/chunks/4594.js +1 -0
- package/app/.next-cli-build/server/chunks/4696.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/4790.js +2 -2
- package/app/.next-cli-build/server/chunks/5210.js +9 -9
- package/app/.next-cli-build/server/chunks/541.js +1 -1
- package/app/.next-cli-build/server/chunks/607.js +1 -1
- package/app/.next-cli-build/server/chunks/6328.js +1 -1
- package/app/.next-cli-build/server/chunks/6811.js +1 -1
- package/app/.next-cli-build/server/chunks/6992.js +1 -1
- package/app/.next-cli-build/server/chunks/7142.js +1 -0
- package/app/.next-cli-build/server/chunks/7639.js +1 -1
- package/app/.next-cli-build/server/chunks/7812.js +1 -1
- package/app/.next-cli-build/server/chunks/8352.js +1 -1
- package/app/.next-cli-build/server/chunks/8640.js +2 -2
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/OvJK_UdNOS0vJSr9JO4J4/_buildManifest.js +1 -0
- package/app/.next-cli-build/static/chunks/{5263-370057dd375df5fd.js → 5263-5edbd7b3aa9dfb9e.js} +1 -1
- package/app/.next-cli-build/static/chunks/{5497-e7a491e584d8e889.js → 5497-a3cadef0038fbc54.js} +2 -2
- package/app/.next-cli-build/static/chunks/{5478-b8434ac09db5465f.js → 9705-9912c0535c058c02.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/api-keys/{page-69abc960e895e371.js → page-8c2da5b95b0920e1.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/{page-b4d366816efccb83.js → page-08bcacabfb4016a8.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/{page-cf60b5c7ef98268e.js → page-a9ff54e851d2ee6b.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/model-profiles/{page-565eec37a6b1e43e.js → page-514941d4d89828f3.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-4d03de73b87070b7.js → page-6af3a74f988fa9a3.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/combos/{page-9125d5791390ecd1.js → page-b484d39ac1824239.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/page-20db329e00f2d625.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/{page-aaf1ae8b36169705.js → page-1abcaccf45c4d975.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-9117c57680c9a427.js → page-9a1c2c9d6bc4319c.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{providers/tts/page-cc5320ebd1a7e502.js → media-providers/[kind]/page-154eed6f10067283.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/combo/[id]/{page-c17bde6fb00334f8.js → page-2bcd21fc09c38461.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/web/{page-7910b58d0aedaa0f.js → page-c01afc3879e58b71.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/mitm/{page-1ec588c770711f10.js → page-b40045309a980f35.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{page-aaf1ae8b36169705.js → page-1abcaccf45c4d975.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personal/{page-41e959b6a32f2dcd.js → page-ebc28879d4aba11d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/{layout-e6352e14327c0403.js → layout-72251d3e2b178c64.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/{page-b0752e76d649652c.js → page-89c84b2666538769.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovidermonitor/{page-01cc90c62e5b5082.js → page-2366c1492c09d740.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/{page-f08bb6e259b2c163.js → page-99b518e5b6d81643.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/prompt-logs/page-a3741fba3051df50.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-47131b1112d369af.js → page-d3d1b8d6916c6050.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/new/{page-a767336a177c4006.js → page-23d57f0cd3caa5a4.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-96ab6806712c81a9.js → page-d278b9c2099a88c8.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/stt/{page-cc5320ebd1a7e502.js → page-154eed6f10067283.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{media-providers/[kind]/page-cc5320ebd1a7e502.js → providers/tts/page-154eed6f10067283.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-905744d22c273a69.js → page-9a6e31f87d838029.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/{page-2fd66044b1fd1c69.js → page-d22d38cc4a97d13d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/{page-5d3a88a800c01ca2.js → page-efedba92d6e02c82.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/translator/{page-8d752b6befd00f90.js → page-089032ee4ac431a5.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/{page-9fd8ba9f4423ea62.js → page-6f197758e96ec272.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/{layout-ff68f7f7cf22bcac.js → layout-e5f8b9540dd02062.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/_global-error/page-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/audit-proxy/ca/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/audit-proxy/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/users/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/view-mode/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/[asset]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/upload/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-model-profiles/cloud-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-model-profiles/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/autostart/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/prompt-log-db/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/root-ca/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/qwen-settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/config/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/heartbeat/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/command/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/snapshot/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/sync/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/ai-power-index/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/ai-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/analyze/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/combos/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/endpoint/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/local-ai-report/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/options/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/config/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/live/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/token-saver/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/init/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/caveman-test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/rotate/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/locale/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/grok-cli/device-code/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/grok-cli/poll/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/api-key-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/import-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/move/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/usage/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/client/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/monitor/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/permissions/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/routing/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/shares/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/visibility/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/catalog/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/recalculate/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-health/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/openai-compatible/manage/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/[id]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/ai-models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/analyze/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/history/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tags/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-login/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-start-daemon/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/restart/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/app/page-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-a48c4c9356e97886.js +1 -0
- package/app/.next-cli-build/static/chunks/{webpack-e43d42d9ffe5099b.js → webpack-7223ab98c3aee1a6.js} +1 -1
- package/app/.next-cli-build/static/css/2efd59dd4cc5acfe.css +1 -0
- package/app/.next-cli-build/static/css/{6b035d23410f8c74.css → d235ea8456abe03c.css} +1 -1
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.56-to-5.3.57-5.3.57-20260823-091335 → upgrade-5.3.58-to-5.3.59-5.3.59-20260823-093629}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.57-to-5.3.58-5.3.58-20260823-092724 → upgrade-5.3.59-to-5.3.60-5.3.60-20260823-094446}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.55-to-5.3.56-5.3.56-20260823-085719 → upgrade-5.3.59-to-5.3.60-5.3.60-20260823-094447}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next-cli-build/server/chunks/7859.js +0 -1
- package/app/.next-cli-build/static/-YTKQW02vkwwrrMAHMqfh/_buildManifest.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/page-46eb716c240403a9.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/prompt-logs/page-6b922c193b4831e7.js +0 -1
- package/app/.next-cli-build/static/chunks/app/_global-error/page-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/audit-proxy/ca/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/audit-proxy/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/users/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/view-mode/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/[asset]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/upload/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-model-profiles/cloud-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-model-profiles/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/autostart/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/prompt-log-db/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/root-ca/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/qwen-settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/config/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/heartbeat/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/command/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/snapshot/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/sync/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/ai-power-index/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/ai-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/analyze/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/combos/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/endpoint/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/local-ai-report/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/options/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/config/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/live/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/routing-topology/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/token-saver/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/health/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/init/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/caveman-test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/rotate/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/locale/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/grok-cli/device-code/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/grok-cli/poll/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/api-key-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/import-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/move/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/usage/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/client/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/monitor/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/permissions/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/routing/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/shares/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/visibility/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/catalog/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/recalculate/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-health/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/openai-compatible/manage/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/[id]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/ai-models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/analyze/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/history/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tags/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-login/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-start-daemon/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/restart/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/app/page-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-61d53eae35c05114.js +0 -1
- package/app/.next-cli-build/static/css/ca15e2e7ae86ace9.css +0 -1
- /package/app/.next-cli-build/static/{-YTKQW02vkwwrrMAHMqfh → OvJK_UdNOS0vJSr9JO4J4}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8334],{22662:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>b});var a=s(95155),l=s(73321),r=s(12115),i=s(98500),n=s.n(i),o=s(35497),c=s(57250),d=s(52679);let m=/^[a-zA-Z0-9_.\-]+$/,x={webSearch:"Web Search",webFetch:"Web Fetch",image:"Text to Image",tts:"Text To Speech"},h={webSearch:"/v1/search",webFetch:"/v1/web/fetch",image:"/v1/images/generations",tts:"/v1/audio/speech"},u={webSearch:e=>({model:e,query:"What is the latest news about AI?",search_type:"web",max_results:5}),webFetch:e=>({model:e,url:"https://example.com",format:"markdown"}),image:e=>({model:e,prompt:"A cute cat playing piano",n:1,size:"1024x1024"}),tts:e=>({model:e,input:"Hello, this is a test.",voice:"alloy"})};function p(e){return"webSearch"===e||"webFetch"===e?"/dashboard/media-providers/web":`/dashboard/media-providers/${e}`}function b(){let{id:e}=(0,l.useParams)(),t=(0,l.useRouter)(),[s,i]=(0,r.useState)(null),[b,f]=(0,r.useState)(!0),[j,g]=(0,r.useState)(""),[w,y]=(0,r.useState)(""),[v,N]=(0,r.useState)([]),[k,S]=(0,r.useState)(!1),[U,$]=(0,r.useState)(!1),[C,O]=(0,r.useState)([]),[_,T]=(0,r.useState)(!1),[R,A]=(0,r.useState)(null),[L,P]=(0,r.useState)(""),[E,z]=(0,r.useState)(""),[D,F]=(0,r.useState)([]),[M,I]=(0,r.useState)({}),J=async()=>{try{let[t,s,a,l,r,n]=await Promise.all([fetch(`/api/combos/${e}`,{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"}),fetch("/api/usage/logs",{cache:"no-store"}),fetch("/api/keys",{cache:"no-store"}),fetch("/api/providers",{cache:"no-store"}),fetch("/api/models/alias",{cache:"no-store"})]);if(n.ok&&I((await n.json()).aliases||{}),l.ok){let e=await l.json();z((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}if(r.ok&&F((await r.json()).connections||[]),!t.ok){i(null),f(!1);return}let o=await t.json();i(o),g(o.name),N(o.models||[]);let c=s.ok?await s.json():{};S(c.comboStrategies?.[o.name]?.fallbackStrategy==="round-robin");let d=a.ok?await a.json():[];O(d.filter(e=>"string"==typeof e&&e.includes(o.name)).slice(0,50))}catch{}f(!1)};(0,r.useEffect)(()=>{J()},[e]);let W=e=>e.trim()?m.test(e)?(y(""),!0):(y("Only letters, numbers, -, _ and ."),!1):(y("Name is required"),!1),H=async t=>{let s=await fetch(`/api/combos/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return!!s.ok||(alert((await s.json()).error||"Failed to save"),!1)},Z=async()=>{!W(j)||j===s.name||await H({name:j})&&await J()},q=async e=>{let t=e?.value||e;if(!t||v.includes(t))return;let s=[...v,t];N(s),await H({models:s})},B=async e=>{let t=e?.value||e;if(!t||!v.includes(t))return;let s=v.filter(e=>e!==t);N(s),await H({models:s})},Y=async e=>{let t=v.filter((t,s)=>s!==e);N(t),await H({models:t})},G=async(e,t)=>{let s=[...v],a=e+t;a<0||a>=s.length||([s[e],s[a]]=[s[a],s[e]],N(s),await H({models:s}))},K=async e=>{S(e);let t=await fetch("/api/settings",{cache:"no-store"}),a={...(t.ok?await t.json():{}).comboStrategies||{}};e?a[s.name]={fallbackStrategy:"round-robin"}:delete a[s.name],await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:a})})},Q=async()=>{!confirm(`Delete combo "${s.name}"?`)||(await fetch(`/api/combos/${e}`,{method:"DELETE"})).ok&&t.push(p(s.kind))},V=async()=>{if(T(!0),A(null),P(""),R?.audioUrl)try{URL.revokeObjectURL(R.audioUrl)}catch{}if(R?.imageUrl?.startsWith("blob:"))try{URL.revokeObjectURL(R.imageUrl)}catch{}let e=Date.now();try{let t=h[s.kind],a=u[s.kind](s.name),l={"Content-Type":"application/json"};E&&(l.Authorization=`Bearer ${E}`);let r=await fetch(`/api${t}`,{method:"POST",headers:l,body:JSON.stringify(a)}),i=Date.now()-e;if(!r.ok){let e=await r.json().catch(()=>({}));P(e?.error?.message||e?.error||`HTTP ${r.status}`),A({json:JSON.stringify(e,null,2),latencyMs:i});return}let n=r.headers.get("content-type")||"";if(n.startsWith("image/")){let e=await r.blob();A({imageUrl:URL.createObjectURL(e),latencyMs:i});return}if(n.startsWith("audio/")||"application/octet-stream"===n){let e=await r.blob();A({audioUrl:URL.createObjectURL(e),latencyMs:i});return}let o=await r.json(),c=o?.data?.[0],d=c?.b64_json?`data:image/png;base64,${c.b64_json}`:c?.url||"";A({json:JSON.stringify(function e(t){if(!t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(e);let s={};for(let[a,l]of Object.entries(t))s[a]="b64_json"===a&&"string"==typeof l&&l.length>100?`<${l.length} chars base64>`:e(l);return s}(o),null,2),imageUrl:d,latencyMs:i})}catch(e){P(e.message||"Network error")}T(!1)};if(b)return(0,a.jsx)("div",{className:"text-text-muted text-sm",children:"Loading..."});if(!s)return(0,l.notFound)();let X=x[s.kind]||d.rj.find(e=>e.id===s.kind)?.label||"Combo",ee=h[s.kind],et=s.kind&&u[s.kind]?u[s.kind](s.name):null,es=ee?`curl -X POST http://localhost:20128${ee} \\
|
|
2
2
|
-H "Content-Type: application/json" \\
|
|
3
3
|
-H "Authorization: Bearer ${E||"YOUR_KEY"}" \\
|
|
4
|
-
-d '${JSON.stringify(et)}'`:"",ea=p(s.kind);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)(n(),{href:ea,className:"text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"arrow_back"})}),(0,a.jsx)("div",{className:"size-10 rounded-lg bg-primary/10 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"layers"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("p",{className:"text-xs text-text-muted",children:[X," Combo"]}),(0,a.jsx)("code",{className:"text-lg font-semibold font-mono",children:s.name})]})]}),(0,a.jsx)(o.$n,{variant:"outline",icon:"delete",onClick:Q,className:"text-red-500 border-red-200 hover:bg-red-50",children:"Delete"})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Settings"}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.pd,{label:"Combo Name",value:j,onChange:e=>{g(e.target.value),W(e.target.value)},onBlur:Z,error:w}),(0,a.jsx)("p",{className:"text-[10px] text-text-muted mt-0.5",children:"Only letters, numbers, -, _ and ."})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Rotate providers across requests instead of strict fallback order."})]}),(0,a.jsx)(o.lM,{checked:k,onChange:K})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Providers"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Tried in order (top-down) or rotated when round-robin is on."})]}),(0,a.jsx)(o.$n,{size:"sm",icon:"add",onClick:()=>$(!0),children:"Add Provider"})]}),0===v.length?(0,a.jsx)("div",{className:"text-center py-6 border border-dashed border-border rounded-lg text-text-muted text-sm",children:"No providers yet."}):(0,a.jsx)("div",{className:"flex flex-col gap-2",children:v.map((e,t)=>{let{providerId:s,model:l}=function(e){if("string"!=typeof e)return{providerId:"",model:""};let t=e.indexOf("/");return t<0?{providerId:e,model:""}:{providerId:e.slice(0,t),model:e.slice(t+1)}}(e),r=d.Q2[s];return(0,a.jsxs)("div",{className:"flex items-center gap-3 p-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02]",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-5 text-center",children:t+1}),(0,a.jsx)(c.A,{src:`/providers/${s}.png`,alt:r?.name||s,size:24,className:"object-contain rounded shrink-0",fallbackText:r?.textIcon||s.slice(0,2).toUpperCase(),fallbackColor:r?.color}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"text-sm font-medium truncate",children:r?.name||s}),l&&(0,a.jsx)("code",{className:"text-[10px] text-text-muted font-mono truncate block",children:l})]}),(0,a.jsxs)("div",{className:"flex items-center gap-0.5",children:[(0,a.jsx)("button",{onClick:()=>G(t,-1),disabled:0===t,className:`p-1 rounded ${0===t?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move up",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,a.jsx)("button",{onClick:()=>G(t,1),disabled:t===v.length-1,className:`p-1 rounded ${t===v.length-1?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move down",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,a.jsx)("button",{onClick:()=>Y(t),className:"p-1 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:"Remove",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]})]},`${e}-${t}`)})})]}),s.kind&&ee&&(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Test Example"}),(0,a.jsx)(o.$n,{size:"sm",icon:"play_arrow",onClick:V,disabled:_||0===v.length,children:_?"Running...":"Run"})]}),(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-x-auto whitespace-pre-wrap break-all",children:es}),L&&(0,a.jsx)("p",{className:"mt-3 text-xs text-red-500 break-words",children:L}),R&&(0,a.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[null!=R.latencyMs&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted",children:["⚡ ",R.latencyMs,"ms"]}),R.imageUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.imageUrl,download:"image.png",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("img",{src:R.imageUrl,alt:"Generated",className:"max-w-full rounded-lg border border-border"})]}),R.audioUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.audioUrl,download:"speech.mp3",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("audio",{controls:!0,src:R.audioUrl,className:"w-full"})]}),R.json&&(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[300px] whitespace-pre-wrap break-all",children:R.json})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Usage Logs"}),0===C.length?(0,a.jsx)("p",{className:"text-xs text-text-muted italic",children:"No usage yet."}):(0,a.jsx)("pre",{className:"text-[11px] font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[400px] whitespace-pre-wrap",children:C.join("\n")})]}),(0,a.jsx)(o.rq,{isOpen:U,onClose:()=>$(!1),onSelect:q,onDeselect:B,activeProviders:D,modelAliases:M,title:`Add ${X} Model`,kindFilter:s.kind,addedModelValues:v,closeOnSelect:!1})]})}},70878:(e,t,s)=>{Promise.resolve().then(s.bind(s,22662))}},e=>{e.O(0,[
|
|
4
|
+
-d '${JSON.stringify(et)}'`:"",ea=p(s.kind);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)(n(),{href:ea,className:"text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"arrow_back"})}),(0,a.jsx)("div",{className:"size-10 rounded-lg bg-primary/10 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"layers"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("p",{className:"text-xs text-text-muted",children:[X," Combo"]}),(0,a.jsx)("code",{className:"text-lg font-semibold font-mono",children:s.name})]})]}),(0,a.jsx)(o.$n,{variant:"outline",icon:"delete",onClick:Q,className:"text-red-500 border-red-200 hover:bg-red-50",children:"Delete"})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Settings"}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.pd,{label:"Combo Name",value:j,onChange:e=>{g(e.target.value),W(e.target.value)},onBlur:Z,error:w}),(0,a.jsx)("p",{className:"text-[10px] text-text-muted mt-0.5",children:"Only letters, numbers, -, _ and ."})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Rotate providers across requests instead of strict fallback order."})]}),(0,a.jsx)(o.lM,{checked:k,onChange:K})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Providers"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Tried in order (top-down) or rotated when round-robin is on."})]}),(0,a.jsx)(o.$n,{size:"sm",icon:"add",onClick:()=>$(!0),children:"Add Provider"})]}),0===v.length?(0,a.jsx)("div",{className:"text-center py-6 border border-dashed border-border rounded-lg text-text-muted text-sm",children:"No providers yet."}):(0,a.jsx)("div",{className:"flex flex-col gap-2",children:v.map((e,t)=>{let{providerId:s,model:l}=function(e){if("string"!=typeof e)return{providerId:"",model:""};let t=e.indexOf("/");return t<0?{providerId:e,model:""}:{providerId:e.slice(0,t),model:e.slice(t+1)}}(e),r=d.Q2[s];return(0,a.jsxs)("div",{className:"flex items-center gap-3 p-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02]",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-5 text-center",children:t+1}),(0,a.jsx)(c.A,{src:`/providers/${s}.png`,alt:r?.name||s,size:24,className:"object-contain rounded shrink-0",fallbackText:r?.textIcon||s.slice(0,2).toUpperCase(),fallbackColor:r?.color}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"text-sm font-medium truncate",children:r?.name||s}),l&&(0,a.jsx)("code",{className:"text-[10px] text-text-muted font-mono truncate block",children:l})]}),(0,a.jsxs)("div",{className:"flex items-center gap-0.5",children:[(0,a.jsx)("button",{onClick:()=>G(t,-1),disabled:0===t,className:`p-1 rounded ${0===t?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move up",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,a.jsx)("button",{onClick:()=>G(t,1),disabled:t===v.length-1,className:`p-1 rounded ${t===v.length-1?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move down",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,a.jsx)("button",{onClick:()=>Y(t),className:"p-1 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:"Remove",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]})]},`${e}-${t}`)})})]}),s.kind&&ee&&(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Test Example"}),(0,a.jsx)(o.$n,{size:"sm",icon:"play_arrow",onClick:V,disabled:_||0===v.length,children:_?"Running...":"Run"})]}),(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-x-auto whitespace-pre-wrap break-all",children:es}),L&&(0,a.jsx)("p",{className:"mt-3 text-xs text-red-500 break-words",children:L}),R&&(0,a.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[null!=R.latencyMs&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted",children:["⚡ ",R.latencyMs,"ms"]}),R.imageUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.imageUrl,download:"image.png",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("img",{src:R.imageUrl,alt:"Generated",className:"max-w-full rounded-lg border border-border"})]}),R.audioUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.audioUrl,download:"speech.mp3",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("audio",{controls:!0,src:R.audioUrl,className:"w-full"})]}),R.json&&(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[300px] whitespace-pre-wrap break-all",children:R.json})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Usage Logs"}),0===C.length?(0,a.jsx)("p",{className:"text-xs text-text-muted italic",children:"No usage yet."}):(0,a.jsx)("pre",{className:"text-[11px] font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[400px] whitespace-pre-wrap",children:C.join("\n")})]}),(0,a.jsx)(o.rq,{isOpen:U,onClose:()=>$(!1),onSelect:q,onDeselect:B,activeProviders:D,modelAliases:M,title:`Add ${X} Model`,kindFilter:s.kind,addedModelValues:v,closeOnSelect:!1})]})}},70878:(e,t,s)=>{Promise.resolve().then(s.bind(s,22662))}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=70878)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9260],{41347:(e,s,t)=>{Promise.resolve().then(t.bind(t,71088))},71088:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>b});var r=t(95155),a=t(98500),i=t.n(a),l=t(12115),o=t(73321),c=t(35497),n=t(57250),d=t(52679);function m(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function x({provider:e,kind:s,connections:t}){let a=d.Q2[e.id],l=!!a?.noAuth,o=t.filter(s=>s.provider===e.id),h=o.filter(e=>{let s=m(e);return"active"===s||"success"===s}).length,p=o.filter(e=>{let s=m(e);return"error"===s||"expired"===s||"unavailable"===s}).length,b=o.length,u=b>0&&o.every(e=>!1===e.isActive);return(0,r.jsx)(i(),{href:`/dashboard/media-providers/${s}/${e.id}`,className:"group",children:(0,r.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${u?"opacity-50":""}`,children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,r.jsx)(n.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,r.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:l?(0,r.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):u?(0,r.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===b?(0,r.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,r.jsxs)(r.Fragment,{children:[h>0&&(0,r.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[h," Connected"]}),p>0&&(0,r.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[p," Error"]}),0===h&&0===p&&(0,r.jsxs)(c.Ex,{variant:"default",size:"sm",children:[b," Added"]})]})})]})]})})})}function h({combos:e}){return 0===e.length?(0,r.jsx)("p",{className:"text-xs text-text-muted italic",children:"No combos yet."}):(0,r.jsx)("div",{className:"flex flex-col gap-2",children:e.map(e=>(0,r.jsx)(i(),{href:`/dashboard/media-providers/combo/${e.id}`,children:(0,r.jsx)(c.Zp,{padding:"xs",className:"hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors cursor-pointer",children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"layers"}),(0,r.jsx)("code",{className:"text-sm font-mono font-medium flex-1 truncate",children:e.name}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1 sm:shrink-0",children:[e.models.slice(0,6).map((e,s)=>{let t="string"==typeof e?e.split("/")[0]:"",a=d.Q2[t];return(0,r.jsx)("div",{title:a?.name||e,className:"size-5 rounded flex items-center justify-center",style:{backgroundColor:`${a?.color??"#888"}15`},children:(0,r.jsx)(n.A,{src:`/providers/${t}.png`,alt:a?.name||t,size:18,className:"object-contain rounded max-w-[18px] max-h-[18px]",fallbackText:a?.textIcon||t.slice(0,2).toUpperCase(),fallbackColor:a?.color})},`${e}-${s}`)}),e.models.length>6&&(0,r.jsxs)("span",{className:"text-[10px] text-text-muted ml-1",children:["+",e.models.length-6]})]}),(0,r.jsx)("span",{className:"text-[11px] text-text-muted shrink-0",children:e.models.length}),(0,r.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[16px]",children:"chevron_right"})]})})},e.id))})}function p({title:e,icon:s,kind:t,providers:a,connections:i,combos:l,onCreateCombo:o}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary",children:s}),(0,r.jsx)("h2",{className:"text-base font-semibold",children:e}),(0,r.jsxs)("span",{className:"text-xs text-text-muted",children:["(",a.length," providers \xb7 ",l.length," combos)"]})]}),(0,r.jsx)(c.$n,{size:"sm",icon:"add",onClick:o,children:"Create Combo"})]}),l.length>0&&(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsx)(h,{combos:l})}),0===a.length?(0,r.jsx)("div",{className:"text-center py-8 border border-dashed border-border rounded-xl text-text-muted text-sm",children:"No providers."}):(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:a.map(e=>(0,r.jsx)(x,{provider:e,kind:t,connections:i},e.id))})]})}function b(){let e=(0,o.useRouter)(),[s,t]=(0,l.useState)([]),[a,i]=(0,l.useState)([]),c=async()=>{try{let[e,s]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/combos",{cache:"no-store"})]);e.ok&&t((await e.json()).connections||[]),s.ok&&i((await s.json()).combos||[])}catch{}};(0,l.useEffect)(()=>{c()},[]);let n=(0,d.o5)("webSearch"),m=(0,d.o5)("webFetch"),x=a.filter(e=>"webSearch"===e.kind),h=a.filter(e=>"webFetch"===e.kind),b=async s=>{let t="webSearch"===s?"search-combo":"fetch-combo",r=t,i=1,l=new Set(a.map(e=>e.name));for(;l.has(r);)r=`${t}-${i++}`;let o=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,models:[],kind:s})});if(o.ok){let s=await o.json();e.push(`/dashboard/media-providers/combo/${s.id}`)}else alert((await o.json()).error||"Failed to create combo")};return(0,r.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,r.jsx)(p,{title:"Web Search",icon:"search",kind:"webSearch",providers:n,connections:s,combos:x,onCreateCombo:()=>b("webSearch")}),(0,r.jsx)("div",{className:"border-t border-border"}),(0,r.jsx)(p,{title:"Web Fetch",icon:"travel_explore",kind:"webFetch",providers:m,connections:s,combos:h,onCreateCombo:()=>b("webFetch")})]})}}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9260],{41347:(e,s,t)=>{Promise.resolve().then(t.bind(t,71088))},71088:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>b});var r=t(95155),a=t(98500),i=t.n(a),l=t(12115),o=t(73321),c=t(35497),n=t(57250),d=t(52679);function m(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function x({provider:e,kind:s,connections:t}){let a=d.Q2[e.id],l=!!a?.noAuth,o=t.filter(s=>s.provider===e.id),h=o.filter(e=>{let s=m(e);return"active"===s||"success"===s}).length,p=o.filter(e=>{let s=m(e);return"error"===s||"expired"===s||"unavailable"===s}).length,b=o.length,u=b>0&&o.every(e=>!1===e.isActive);return(0,r.jsx)(i(),{href:`/dashboard/media-providers/${s}/${e.id}`,className:"group",children:(0,r.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${u?"opacity-50":""}`,children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,r.jsx)(n.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,r.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:l?(0,r.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):u?(0,r.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===b?(0,r.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,r.jsxs)(r.Fragment,{children:[h>0&&(0,r.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[h," Connected"]}),p>0&&(0,r.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[p," Error"]}),0===h&&0===p&&(0,r.jsxs)(c.Ex,{variant:"default",size:"sm",children:[b," Added"]})]})})]})]})})})}function h({combos:e}){return 0===e.length?(0,r.jsx)("p",{className:"text-xs text-text-muted italic",children:"No combos yet."}):(0,r.jsx)("div",{className:"flex flex-col gap-2",children:e.map(e=>(0,r.jsx)(i(),{href:`/dashboard/media-providers/combo/${e.id}`,children:(0,r.jsx)(c.Zp,{padding:"xs",className:"hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors cursor-pointer",children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"layers"}),(0,r.jsx)("code",{className:"text-sm font-mono font-medium flex-1 truncate",children:e.name}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1 sm:shrink-0",children:[e.models.slice(0,6).map((e,s)=>{let t="string"==typeof e?e.split("/")[0]:"",a=d.Q2[t];return(0,r.jsx)("div",{title:a?.name||e,className:"size-5 rounded flex items-center justify-center",style:{backgroundColor:`${a?.color??"#888"}15`},children:(0,r.jsx)(n.A,{src:`/providers/${t}.png`,alt:a?.name||t,size:18,className:"object-contain rounded max-w-[18px] max-h-[18px]",fallbackText:a?.textIcon||t.slice(0,2).toUpperCase(),fallbackColor:a?.color})},`${e}-${s}`)}),e.models.length>6&&(0,r.jsxs)("span",{className:"text-[10px] text-text-muted ml-1",children:["+",e.models.length-6]})]}),(0,r.jsx)("span",{className:"text-[11px] text-text-muted shrink-0",children:e.models.length}),(0,r.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[16px]",children:"chevron_right"})]})})},e.id))})}function p({title:e,icon:s,kind:t,providers:a,connections:i,combos:l,onCreateCombo:o}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary",children:s}),(0,r.jsx)("h2",{className:"text-base font-semibold",children:e}),(0,r.jsxs)("span",{className:"text-xs text-text-muted",children:["(",a.length," providers \xb7 ",l.length," combos)"]})]}),(0,r.jsx)(c.$n,{size:"sm",icon:"add",onClick:o,children:"Create Combo"})]}),l.length>0&&(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsx)(h,{combos:l})}),0===a.length?(0,r.jsx)("div",{className:"text-center py-8 border border-dashed border-border rounded-xl text-text-muted text-sm",children:"No providers."}):(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:a.map(e=>(0,r.jsx)(x,{provider:e,kind:t,connections:i},e.id))})]})}function b(){let e=(0,o.useRouter)(),[s,t]=(0,l.useState)([]),[a,i]=(0,l.useState)([]),c=async()=>{try{let[e,s]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/combos",{cache:"no-store"})]);e.ok&&t((await e.json()).connections||[]),s.ok&&i((await s.json()).combos||[])}catch{}};(0,l.useEffect)(()=>{c()},[]);let n=(0,d.o5)("webSearch"),m=(0,d.o5)("webFetch"),x=a.filter(e=>"webSearch"===e.kind),h=a.filter(e=>"webFetch"===e.kind),b=async s=>{let t="webSearch"===s?"search-combo":"fetch-combo",r=t,i=1,l=new Set(a.map(e=>e.name));for(;l.has(r);)r=`${t}-${i++}`;let o=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,models:[],kind:s})});if(o.ok){let s=await o.json();e.push(`/dashboard/media-providers/combo/${s.id}`)}else alert((await o.json()).error||"Failed to create combo")};return(0,r.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,r.jsx)(p,{title:"Web Search",icon:"search",kind:"webSearch",providers:n,connections:s,combos:x,onCreateCombo:()=>b("webSearch")}),(0,r.jsx)("div",{className:"border-t border-border"}),(0,r.jsx)(p,{title:"Web Fetch",icon:"travel_explore",kind:"webFetch",providers:m,connections:s,combos:h,onCreateCombo:()=>b("webFetch")})]})}}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=41347)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6607],{2276:(e,s,t)=>{Promise.resolve().then(t.bind(t,23879))},23879:(e,s,t)=>{"use strict";t.d(s,{default:()=>u});var a=t(95155),r=t(12115),i=t(98500),n=t.n(i),o=t(3534),d=t(28777),l=t(52679),c=t(61082);function u(){let[e,s]=(0,r.useState)([]),[t,i]=(0,r.useState)([]),[u,p]=(0,r.useState)({}),[h,m]=(0,r.useState)(!1),[x,y]=(0,r.useState)(null),[f,g]=(0,r.useState)({running:!1,certExists:!1,dnsStatus:{},hasCachedPassword:!1});(0,r.useEffect)(()=>{v(),w(),b(),j()},[]);let v=async()=>{try{let e=await fetch("/api/providers");if(e.ok){let t=await e.json();s(t.connections||[])}}catch{}},w=async()=>{try{let e=await fetch("/api/keys");if(e.ok){let s=await e.json();i(s.keys||[])}}catch{}},b=async()=>{try{let e=await fetch("/api/models/alias");if(e.ok){let s=await e.json();p(s.aliases||{})}}catch{}},j=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();m(s.cloudEnabled||!1)}}catch{}},S=()=>e.filter(e=>!1!==e.isActive),C=Object.entries(o.wn);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n(),{href:"/dashboard/audit-proxy",className:"group flex items-start justify-between gap-4 rounded-xl border border-primary/25 bg-primary/5 p-4 transition hover:border-primary/50 hover:bg-primary/10",children:[(0,a.jsxs)("div",{className:"flex min-w-0 gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mt-0.5 text-primary",children:"policy"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Enterprise AI Audit Proxy"}),(0,a.jsx)("p",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Admin GUI for explicit HTTP CONNECT proxy mode: official Claude Code/Codex credentials stay on each client; BlueRouter only inspects approved TLS traffic, redacts secrets, and records audit logs."})]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined shrink-0 text-primary transition-transform group-hover:translate-x-0.5",children:"arrow_forward"})]}),(0,a.jsxs)("div",{className:"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-4 text-sm text-yellow-700 dark:text-yellow-300",children:[(0,a.jsx)("span",{className:"material-symbols-rounded align-middle text-base",children:"warning"})," ","⚠️ MITM intercepts HTTPS traffic of IDE tools (Antigravity, GitHub Copilot, Kiro) via local CA to redirect requests to your providers. May violate ToS → account ban. Use at your own risk."]}),(0,a.jsx)(c.tA,{apiKeys:t,cloudEnabled:h,onStatusChange:g}),(0,a.jsx)(c.k0,{serverRunning:f.running,onChanged:e=>g(s=>({...s,certExists:e?.certExists??s.certExists}))}),C.map(([e,s])=>(0,a.jsx)(c.kn,{tool:{...s,id:e},isExpanded:x===e,onToggle:()=>y(x===e?null:e),serverRunning:f.running,dnsActive:f.dnsStatus?.[e]||!1,hasCachedPassword:f.hasCachedPassword||!1,needsSudoPassword:!1!==f.needsSudoPassword,isWin:!0===f.isWin,apiKeys:t,activeProviders:S(),hasActiveProviders:S().some(e=>(0,d.KC)(e.provider).length>0||(0,l.mq)(e.provider)||(0,l.gb)(e.provider)),modelAliases:u,cloudEnabled:h,onDnsChange:e=>g(s=>({...s,dnsStatus:e.dnsStatus??s.dnsStatus}))},e))]})}}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6607],{2276:(e,s,t)=>{Promise.resolve().then(t.bind(t,23879))},23879:(e,s,t)=>{"use strict";t.d(s,{default:()=>u});var a=t(95155),r=t(12115),i=t(98500),n=t.n(i),o=t(3534),d=t(28777),l=t(52679),c=t(61082);function u(){let[e,s]=(0,r.useState)([]),[t,i]=(0,r.useState)([]),[u,p]=(0,r.useState)({}),[h,m]=(0,r.useState)(!1),[x,y]=(0,r.useState)(null),[f,g]=(0,r.useState)({running:!1,certExists:!1,dnsStatus:{},hasCachedPassword:!1});(0,r.useEffect)(()=>{v(),w(),b(),j()},[]);let v=async()=>{try{let e=await fetch("/api/providers");if(e.ok){let t=await e.json();s(t.connections||[])}}catch{}},w=async()=>{try{let e=await fetch("/api/keys");if(e.ok){let s=await e.json();i(s.keys||[])}}catch{}},b=async()=>{try{let e=await fetch("/api/models/alias");if(e.ok){let s=await e.json();p(s.aliases||{})}}catch{}},j=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();m(s.cloudEnabled||!1)}}catch{}},S=()=>e.filter(e=>!1!==e.isActive),C=Object.entries(o.wn);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n(),{href:"/dashboard/audit-proxy",className:"group flex items-start justify-between gap-4 rounded-xl border border-primary/25 bg-primary/5 p-4 transition hover:border-primary/50 hover:bg-primary/10",children:[(0,a.jsxs)("div",{className:"flex min-w-0 gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mt-0.5 text-primary",children:"policy"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Enterprise AI Audit Proxy"}),(0,a.jsx)("p",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Admin GUI for explicit HTTP CONNECT proxy mode: official Claude Code/Codex credentials stay on each client; BlueRouter only inspects approved TLS traffic, redacts secrets, and records audit logs."})]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined shrink-0 text-primary transition-transform group-hover:translate-x-0.5",children:"arrow_forward"})]}),(0,a.jsxs)("div",{className:"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-4 text-sm text-yellow-700 dark:text-yellow-300",children:[(0,a.jsx)("span",{className:"material-symbols-rounded align-middle text-base",children:"warning"})," ","⚠️ MITM intercepts HTTPS traffic of IDE tools (Antigravity, GitHub Copilot, Kiro) via local CA to redirect requests to your providers. May violate ToS → account ban. Use at your own risk."]}),(0,a.jsx)(c.tA,{apiKeys:t,cloudEnabled:h,onStatusChange:g}),(0,a.jsx)(c.k0,{serverRunning:f.running,onChanged:e=>g(s=>({...s,certExists:e?.certExists??s.certExists}))}),C.map(([e,s])=>(0,a.jsx)(c.kn,{tool:{...s,id:e},isExpanded:x===e,onToggle:()=>y(x===e?null:e),serverRunning:f.running,dnsActive:f.dnsStatus?.[e]||!1,hasCachedPassword:f.hasCachedPassword||!1,needsSudoPassword:!1!==f.needsSudoPassword,isWin:!0===f.isWin,apiKeys:t,activeProviders:S(),hasActiveProviders:S().some(e=>(0,d.KC)(e.provider).length>0||(0,l.mq)(e.provider)||(0,l.gb)(e.provider)),modelAliases:u,cloudEnabled:h,onDnsChange:e=>g(s=>({...s,dnsStatus:e.dnsStatus??s.dnsStatus}))},e))]})}}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5772,5564,5263,7033,5497,4525,8441,3794,7358],()=>e(e.s=2276)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099,6337],{18032:(e,t,s)=>{Promise.resolve().then(s.bind(s,95907))},95907:(e,t,s)=>{"use strict";s.d(t,{default:()=>m});var a=s(95155),l=s(12115),n=s(14051),i=s.n(n),r=s(35497),d=s(11059);let o=[{id:"lite",label:"Lite",desc:"N\xe9n nhẹ, vẫn giữ ngữ ph\xe1p dễ đọc."},{id:"full",label:"Full",desc:"N\xe9n c\xe2n bằng, giảm token r\xf5 hơn."},{id:"ultra",label:"Ultra",desc:"N\xe9n tối đa, c\xe2u cực ngắn."}];function c({label:e,value:t,copiedKey:s,copied:l,copy:n}){return(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3",children:[(0,a.jsx)("div",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-text-muted",children:e}),(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,a.jsx)("code",{className:"min-w-0 flex-1 truncate rounded-lg bg-surface px-3 py-2 font-mono text-xs text-text-main",children:t}),(0,a.jsx)("button",{type:"button",onClick:()=>n(t,s),className:"rounded-lg border border-border px-2 py-2 text-text-muted transition hover:border-primary hover:text-primary",title:"Copy",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:l===s?"check":"content_copy"})})]})]})}function m({machineId:e}){let[t,s]=(0,l.useState)(!0),[n,i]=(0,l.useState)(""),[x,p]=(0,l.useState)(""),[h,u]=(0,l.useState)({hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:b,copy:v}=(0,d.C)(),y=(0,l.useMemo)(()=>(function(e=""){let t=e?`${e.replace(/\/$/,"")}/v1`:"/v1";return{base:t,chat:`${t}/chat/completions`,models:`${t}/models`,health:e?`${e.replace(/\/$/,"")}/api/health`:"/api/health"}})(x),[x]);(0,l.useEffect)(()=>{p(window.location.origin),j()},[]);let j=async()=>{s(!0);try{let e=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),t=await e.json();e.ok&&u(e=>({...e,...t}))}catch(e){console.log("Error loading endpoint settings:",e)}finally{s(!1)}},g=async(e,t="")=>{i(t);try{let t=await fetch("/api/dashboard/endpoint",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json();t.ok?u(e=>({...e,...s})):alert(s.error||"Cập nhật thiết lập thất bại")}catch(e){console.log("Error updating endpoint settings:",e),alert("Cập nhật thiết lập thất bại")}finally{i("")}};return t?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsx)(r.Qv,{}),(0,a.jsx)(r.Qv,{})]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-text-main",children:"Endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Endpoint nội bộ để tool gọi BlueRouter theo chuẩn OpenAI-compatible. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,a.jsxs)(r.$n,{onClick:j,variant:"ghost",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"hub"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Th\xf4ng tin API endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"D\xf9ng c\xe1c URL dưới đ\xe2y cho LibreChat, VSCode, Copilot proxy, Antigravity hoặc tool OpenAI-compatible kh\xe1c."})]})]}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(c,{label:"Base URL",value:y.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:y.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:y.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:y.health,copiedKey:"health",copied:b,copy:v})]}),(0,a.jsxs)("p",{className:"mt-4 text-xs text-text-muted",children:["Machine ID: ",(0,a.jsx)("code",{className:"rounded bg-surface px-1.5 py-0.5",children:e||"unknown"})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"bolt"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Token Saver"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Giảm token cho output từ tool v\xe0 phản hồi model. Bật/tắt tại đ\xe2y kh\xf4ng cần load API keys, provider hay tunnel status."})]})]}),(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"RTK tool output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"N\xe9n output của git/grep/ls/tree/logs trước khi gửi v\xe0o model."})]}),(0,a.jsx)(r.lM,{checked:!1!==h.rtkEnabled,onChange:e=>g({rtkEnabled:e},"rtkEnabled"),disabled:"rtkEnabled"===n})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Caveman output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Th\xeam style prompt để model trả lời ngắn hơn, giảm output token."})]}),(0,a.jsx)(r.lM,{checked:!!h.cavemanEnabled,onChange:e=>g({cavemanEnabled:e},"cavemanEnabled"),disabled:"cavemanEnabled"===n})]}),h.cavemanEnabled&&(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:o.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>g({cavemanLevel:e.id},"cavemanLevel"),title:e.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${h.cavemanLevel===e.id?"border-primary bg-primary text-white":"border-border text-text-muted hover:border-primary hover:text-primary"}`,children:e.label},e.id))})]})]})]})]})}c.propTypes={label:i().string.isRequired,value:i().string.isRequired,copiedKey:i().string.isRequired,copied:i().string,copy:i().func.isRequired},m.propTypes={machineId:i().string}}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099,6337],{18032:(e,t,s)=>{Promise.resolve().then(s.bind(s,95907))},95907:(e,t,s)=>{"use strict";s.d(t,{default:()=>m});var a=s(95155),l=s(12115),n=s(14051),i=s.n(n),r=s(35497),d=s(11059);let o=[{id:"lite",label:"Lite",desc:"N\xe9n nhẹ, vẫn giữ ngữ ph\xe1p dễ đọc."},{id:"full",label:"Full",desc:"N\xe9n c\xe2n bằng, giảm token r\xf5 hơn."},{id:"ultra",label:"Ultra",desc:"N\xe9n tối đa, c\xe2u cực ngắn."}];function c({label:e,value:t,copiedKey:s,copied:l,copy:n}){return(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3",children:[(0,a.jsx)("div",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-text-muted",children:e}),(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,a.jsx)("code",{className:"min-w-0 flex-1 truncate rounded-lg bg-surface px-3 py-2 font-mono text-xs text-text-main",children:t}),(0,a.jsx)("button",{type:"button",onClick:()=>n(t,s),className:"rounded-lg border border-border px-2 py-2 text-text-muted transition hover:border-primary hover:text-primary",title:"Copy",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:l===s?"check":"content_copy"})})]})]})}function m({machineId:e}){let[t,s]=(0,l.useState)(!0),[n,i]=(0,l.useState)(""),[x,p]=(0,l.useState)(""),[h,u]=(0,l.useState)({hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:b,copy:v}=(0,d.C)(),y=(0,l.useMemo)(()=>(function(e=""){let t=e?`${e.replace(/\/$/,"")}/v1`:"/v1";return{base:t,chat:`${t}/chat/completions`,models:`${t}/models`,health:e?`${e.replace(/\/$/,"")}/api/health`:"/api/health"}})(x),[x]);(0,l.useEffect)(()=>{p(window.location.origin),j()},[]);let j=async()=>{s(!0);try{let e=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),t=await e.json();e.ok&&u(e=>({...e,...t}))}catch(e){console.log("Error loading endpoint settings:",e)}finally{s(!1)}},g=async(e,t="")=>{i(t);try{let t=await fetch("/api/dashboard/endpoint",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json();t.ok?u(e=>({...e,...s})):alert(s.error||"Cập nhật thiết lập thất bại")}catch(e){console.log("Error updating endpoint settings:",e),alert("Cập nhật thiết lập thất bại")}finally{i("")}};return t?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsx)(r.Qv,{}),(0,a.jsx)(r.Qv,{})]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-text-main",children:"Endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Endpoint nội bộ để tool gọi BlueRouter theo chuẩn OpenAI-compatible. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,a.jsxs)(r.$n,{onClick:j,variant:"ghost",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"hub"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Th\xf4ng tin API endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"D\xf9ng c\xe1c URL dưới đ\xe2y cho LibreChat, VSCode, Copilot proxy, Antigravity hoặc tool OpenAI-compatible kh\xe1c."})]})]}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(c,{label:"Base URL",value:y.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:y.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:y.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:y.health,copiedKey:"health",copied:b,copy:v})]}),(0,a.jsxs)("p",{className:"mt-4 text-xs text-text-muted",children:["Machine ID: ",(0,a.jsx)("code",{className:"rounded bg-surface px-1.5 py-0.5",children:e||"unknown"})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"bolt"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Token Saver"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Giảm token cho output từ tool v\xe0 phản hồi model. Bật/tắt tại đ\xe2y kh\xf4ng cần load API keys, provider hay tunnel status."})]})]}),(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"RTK tool output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"N\xe9n output của git/grep/ls/tree/logs trước khi gửi v\xe0o model."})]}),(0,a.jsx)(r.lM,{checked:!1!==h.rtkEnabled,onChange:e=>g({rtkEnabled:e},"rtkEnabled"),disabled:"rtkEnabled"===n})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Caveman output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Th\xeam style prompt để model trả lời ngắn hơn, giảm output token."})]}),(0,a.jsx)(r.lM,{checked:!!h.cavemanEnabled,onChange:e=>g({cavemanEnabled:e},"cavemanEnabled"),disabled:"cavemanEnabled"===n})]}),h.cavemanEnabled&&(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:o.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>g({cavemanLevel:e.id},"cavemanLevel"),title:e.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${h.cavemanLevel===e.id?"border-primary bg-primary text-white":"border-border text-text-muted hover:border-primary hover:text-primary"}`,children:e.label},e.id))})]})]})]})]})}c.propTypes={label:i().string.isRequired,value:i().string.isRequired,copiedKey:i().string.isRequired,copied:i().string,copy:i().func.isRequired},m.propTypes={machineId:i().string}}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=18032)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3674],{17:(e,r,t)=>{"use strict";t.d(r,{A:()=>o});var s=t(95155),n=t(98500),i=t.n(n),a=t(14051),d=t.n(a),l=t(31474);function o({tabs:e,activeId:r,onChange:t,className:n=""}){return(0,s.jsx)("div",{className:(0,l.cn)("mb-5 overflow-x-auto border-b border-border",n),children:(0,s.jsx)("div",{className:"flex min-w-max items-center gap-1",children:e.map(e=>{let n=e.id===r,a=(0,l.cn)("inline-flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-semibold transition-colors",n?"border-primary text-primary":"border-transparent text-text-muted hover:border-border-strong hover:text-text-main"),d=(0,s.jsxs)(s.Fragment,{children:[e.icon?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:e.icon}):null,(0,s.jsx)("span",{children:e.label})]});return e.href?(0,s.jsx)(i(),{href:e.href,className:a,"aria-current":n?"page":void 0,children:d},e.id):(0,s.jsx)("button",{type:"button",onClick:()=>t?.(e.id),className:a,"aria-pressed":n,children:d},e.id)})})})}o.propTypes={tabs:d().arrayOf(d().shape({id:d().string.isRequired,label:d().string.isRequired,icon:d().string,href:d().string})).isRequired,activeId:d().string.isRequired,onChange:d().func,className:d().string}},15100:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>y});var s=t(95155),n=t(12115),i=t(25086),a=t(94027),d=t(17),l=t(17173),o=t(6945),c=t(35497),u=t(57250),m=t(31458);function x(e){return String(e||"").trim().toLowerCase()}function h(){let{isAdmin:e}=(0,a.s)(),[r,t]=(0,n.useState)([]),[i,d]=(0,n.useState)({}),[l,o]=(0,n.useState)({}),[h,p]=(0,n.useState)(""),[b,g]=(0,n.useState)({}),[v,f]=(0,n.useState)(""),[j,y]=(0,n.useState)({}),[N,k]=(0,n.useState)(3),[w,A]=(0,n.useState)("3"),[C,S]=(0,n.useState)(!0),[O,P]=(0,n.useState)(!1),[q,$]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[L,T]=(0,n.useState)(""),[K,_]=(0,n.useState)(""),z=(0,n.useCallback)(e=>{d(e.permissions||{}),o(e.connectionsByUser||{}),"number"==typeof e.globalConnectionsPerProviderLimit&&e.globalConnectionsPerProviderLimit>0&&(k(e.globalConnectionsPerProviderLimit),A(String(e.globalConnectionsPerProviderLimit))),e.connectionsPerProviderLimitOverrides&&"object"==typeof e.connectionsPerProviderLimitOverrides&&y(e.connectionsPerProviderLimitOverrides)},[]),R=(0,n.useCallback)(async()=>{if(e){S(!0),T("");try{let[e,r]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-providers/permissions",{cache:"no-store"})]),s=await e.json().catch(()=>({})),n=await r.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Kh\xf4ng tải được personal OAuth providers");if(!r.ok)throw Error(n.error||"Kh\xf4ng tải được quyền OAuth");t(Array.isArray(s.providers)?s.providers:[]),p(e=>e||s.userId||""),z(n)}catch(e){T(e?.message||"Kh\xf4ng tải được cấu h\xecnh OAuth access")}finally{S(!1)}}},[z,e]);(0,n.useEffect)(()=>{R()},[R]),(0,n.useEffect)(()=>{let e=x(h),t=i[e]||{},s={};for(let e of r)s[e.id]=!0===t[e.id];g(s);let n=j[e];f(n>0?String(n):"")},[h,i,r,j]);let U=(0,n.useMemo)(()=>Array.from(new Set([...Object.keys(i||{}),...Object.keys(l||{})])).map(e=>{let t=i[e]||{},s=l[e]||{},n=r.filter(e=>t?.[e.id]===!0),a=r.some(e=>Number(s[e.id]||0)>0);return{userId:e,providerState:t,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:a}}).filter(e=>e.enabledProviders.length>0||e.hasAnyConnection).sort((e,r)=>e.userId.localeCompare(r.userId)),[l,i,r]),H=async()=>{let e,r=x(h);if(!r)return void T("Nhập username/email cần cấp quyền.");let t=String(v||"").trim();if(""===t)e=null;else{let r=Number.parseInt(t,10);if(!Number.isFinite(r)||r<=0)return void T("Per-user override phải l\xe0 số nguy\xean dương hoặc bỏ trống.");e=r}P(!0),T(""),_("");try{let t=await fetch("/api/personal-cloud-providers/permissions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:r,providers:b,connectionsPerProviderLimit:e})}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng lưu được quyền OAuth");z(s);let n=s.user?.id||r;p(n),_(`Đ\xe3 lưu quyền OAuth cho ${n}.`)}catch(e){T(e?.message||"Kh\xf4ng lưu được quyền OAuth")}finally{P(!1)}},F=async()=>{let e=Number.parseInt(w,10);if(!Number.isFinite(e)||e<=0)return void T("Global limit phải l\xe0 số nguy\xean dương.");$(!0),T(""),_("");try{let r=await fetch("/api/personal-cloud-providers/permissions",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({globalConnectionsPerProviderLimit:e})}),t=await r.json().catch(()=>({}));if(!r.ok)throw Error(t.error||"Kh\xf4ng lưu được global limit");z(t),_(`Đ\xe3 đặt global limit = ${e} account / provider / user.`)}catch(e){T(e?.message||"Kh\xf4ng lưu được global limit")}finally{$(!1)}},B=async e=>{let r=x(e);if(r){P(!0),T(""),_("");try{let e=await fetch(`/api/personal-cloud-providers/permissions?userId=${encodeURIComponent(r)}`,{method:"DELETE"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng thu hồi được quyền OAuth");z(t),x(h)===r&&p("");let s=t.disconnectSummary||{},n=Number(s.manualActionRequired)||0;_(`Đ\xe3 x\xf3a ${s.deletedCount||0} OAuth connection của ${r}; ${s.upstreamRevokedCount||0} token đ\xe3 revoke upstream.${n>0?` ${n} connection cần thu hồi thủ c\xf4ng tại provider.`:""}`),E("")}catch(e){T(e?.message||"Kh\xf4ng thu hồi được quyền OAuth")}finally{P(!1)}}};if(!e)return null;let G=U.find(e=>e.userId===x(I)),M=r.reduce((e,r)=>e+Number(G?.connectionsByProvider?.[r.id]||0),0);return(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main",children:"Admin: OAuth provider access"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Quản l\xfd provider n\xe0o user được ph\xe9p d\xf9ng, giới hạn số account OAuth c\xe1 nh\xe2n v\xe0 thu hồi to\xe0n bộ quyền/token khi cần. C\xe1c thao t\xe1c trong tab n\xe0y chỉ d\xe0nh cho admin."})]}),(0,s.jsx)(m.default,{}),L?(0,s.jsx)("div",{className:"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-700 dark:text-red-300",children:L}):null,K?(0,s.jsx)("div",{className:"rounded-xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm text-green-700 dark:text-green-300",children:K}):null,(0,s.jsxs)(c.Zp,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Access policy"}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Default l\xe0 kh\xf4ng c\xf3 quyền. Tắt provider giữ nguy\xean connection/token để c\xf3 thể bật lại; Revoke all sẽ thử revoke upstream rồi x\xf3a connection/token local."})]}),(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:R,loading:C,icon:"refresh",children:"Refresh"})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Global limit — số account OAuth c\xe1 nh\xe2n / provider / user thường"}),(0,s.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"\xc1p dụng cho user kh\xf4ng c\xf3 per-user override. Admin kh\xf4ng bị chặn bởi limit n\xe0y."}),(0,s.jsxs)("div",{className:"mt-3 flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,s.jsx)(c.pd,{type:"number",min:1,value:w,onChange:e=>A(e.target.value),className:"sm:w-48"}),(0,s.jsx)(c.$n,{onClick:F,loading:q,disabled:q||Number.parseInt(w,10)===N,children:"Lưu global"}),(0,s.jsxs)("span",{className:"text-xs text-text-muted",children:["Đang lưu: ",N]})]})]}),(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end",children:[(0,s.jsx)(c.pd,{label:"User ID / Email",value:h,onChange:e=>p(e.target.value),placeholder:"anh-tct hoặc anh-tct@fujinet.net"}),(0,s.jsx)(c.$n,{onClick:H,loading:O,icon:"save",children:"Save permissions"})]}),(0,s.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:r.map(e=>(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:(0,s.jsx)(c.lM,{checked:!0===b[e.id],onChange:r=>g(t=>({...t,[e.id]:r})),label:e.name,description:b[e.id]?"User được ph\xe9p add account":"User chưa được cấp quyền"})},e.id))}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Per-user override — account / provider"}),(0,s.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Ghi đ\xe8 global cho ",(0,s.jsx)("span",{className:"font-mono",children:x(h)||"user đang chọn"}),". Để trống rồi Save permissions để quay lại global (",N,")."]}),(0,s.jsx)("div",{className:"mt-3 max-w-xs",children:(0,s.jsx)(c.pd,{type:"number",min:1,value:v,onChange:e=>f(e.target.value),placeholder:`Để trống = d\xf9ng global (${N})`})})]}),(0,s.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Granted OAuth Access"}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:"Danh s\xe1ch user đang được cấp quyền hoặc vẫn c\xf2n OAuth connection cần quản l\xfd."})]}),C?(0,s.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===U.length?(0,s.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,s.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,s.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,s.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"User"}),r.map(e=>(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:e.name},e.id)),(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"Limit / provider"}),(0,s.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,s.jsx)("tbody",{className:"divide-y divide-border bg-background",children:U.map(e=>(0,s.jsxs)("tr",{className:"hover:bg-surface/50",children:[(0,s.jsxs)("td",{className:"px-4 py-4",children:[(0,s.jsx)("div",{className:"break-all font-mono text-text-main",children:e.userId}),x(h)===e.userId?(0,s.jsx)("div",{className:"mt-1 text-xs text-brand-600 dark:text-brand-300",children:"Đang edit ở form ph\xeda tr\xean"}):null]}),r.map(r=>{let t=!0===e.providerState[r.id],n=Number(e.connectionsByProvider?.[r.id]||0);return(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)(c.Ex,{variant:t?"success":"default",size:"sm",children:t?"ON":"OFF"}),n>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-0.5",title:`User đ\xe3 add ${n} ${r.name} account`,children:[(0,s.jsx)(u.A,{src:`/providers/${r.id}.png`,alt:r.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:r.id.slice(0,2).toUpperCase(),fallbackColor:r.color||"#64748b"}),n>1?(0,s.jsxs)("span",{className:"text-[10px] font-semibold text-text-muted",children:["\xd7",n]}):null]}):null]})},r.id)}),(0,s.jsx)("td",{className:"px-4 py-4 text-xs",children:j[e.userId]>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,s.jsx)(c.Ex,{variant:"warning",size:"sm",children:"Override"}),(0,s.jsx)("span",{className:"font-mono",children:j[e.userId]})]}):(0,s.jsxs)("span",{className:"text-text-muted",children:["Global \xb7 ",N]})}),(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:()=>(e=>{let t=x(e);p(t);let s=i[t]||{},n={};for(let e of r)n[e.id]=!0===s[e.id];g(n)})(e.userId),children:"Edit"}),(0,s.jsx)(c.$n,{variant:"danger",size:"sm",loading:O&&I===e.userId,onClick:()=>E(e.userId),children:"Revoke all & delete"})]})})]},e.userId))})]})})]})]}),I?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>E(""),title:"Thu hồi to\xe0n bộ quyền OAuth",size:"lg",busy:O,closeOnOverlay:!O,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>E(""),disabled:O,children:"Hủy"}),(0,s.jsx)(c.$n,{variant:"danger",icon:"delete_forever",loading:O,onClick:()=>B(I),children:"Thu hồi v\xe0 x\xf3a to\xe0n bộ"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-red-500/30 bg-red-500/10 p-4",children:[(0,s.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,s.jsx)("div",{className:"mt-1 break-all text-lg font-semibold text-text-main",children:I}),(0,s.jsx)("p",{className:"mt-2 text-sm text-text-muted",children:"To\xe0n bộ quyền OAuth provider v\xe0 connection/token local của user n\xe0y sẽ bị x\xf3a; gateway sẽ thử revoke upstream trước."})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface p-3 text-sm",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Connection t\xecm thấy"}),(0,s.jsx)(c.Ex,{variant:M>0?"warning":"default",size:"sm",children:M})]}),G?(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:r.map(e=>{let r=Number(G.connectionsByProvider?.[e.id]||0);return r>0?(0,s.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,s.jsx)(u.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",r]},e.id):null})}):null]})}):null]})}var p=t(43503),b=t(78867),g=t(67673),v=t(14796),f=t.n(v);function j(){let e=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>{let r=e.current;if(!r)return;let t=null,s=()=>{let e=Array.from(r.querySelectorAll("h2")).find(e=>e.textContent?.trim()==="Admin: OAuth provider access"),s=e?.closest(".bg-surface.border.border-border");s&&s!==t&&(t&&t.style.removeProperty("display"),(t=s).style.setProperty("display","none"))};s();let n=new MutationObserver(s);return n.observe(r,{childList:!0,subtree:!0}),()=>{n.disconnect(),t&&t.style.removeProperty("display")}},[]),(0,s.jsxs)("div",{ref:e,className:f().page,children:[(0,s.jsx)(p.default,{}),(0,s.jsx)(g.default,{}),(0,s.jsx)(b.default,{})]})}function y(){let{isAdmin:e}=(0,a.s)(),[r,t]=(0,n.useState)("oauth"),c=(0,n.useMemo)(()=>[{id:"oauth",label:"Personal OAuth",icon:"cloud_sync"},...e?[{id:"monitor",label:"OAuth Monitor",icon:"manage_accounts"}]:[],{id:"quota",label:"Personal Quota",icon:"data_usage"},...e?[{id:"admin-access",label:"Admin: OAuth Access",icon:"admin_panel_settings"}]:[]],[e]),u=c.some(e=>e.id===r)?r:"oauth";return(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)(d.A,{tabs:c,activeId:u,onChange:t}),"oauth"===u?(0,s.jsx)(j,{}):null,"monitor"===u&&e?(0,s.jsx)(l.default,{}):null,"quota"===u?(0,s.jsx)(n.Suspense,{fallback:(0,s.jsx)(i.CardSkeleton,{}),children:(0,s.jsx)(o.default,{})}):null,"admin-access"===u&&e?(0,s.jsx)(h,{}):null]})}},31458:(e,r,t)=>{"use strict";t.d(r,{default:()=>l});var s=t(95155),n=t(12115),i=t(35497),a=t(57250),d=t(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,t]=(0,n.useState)([]),[l,o]=(0,n.useState)(!1),[c,u]=(0,n.useState)(""),[m,x]=(0,n.useState)(""),[h,p]=(0,n.useState)(""),b=(0,n.useCallback)(async()=>{if(e){o(!0),x("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");t(Array.isArray(r.providers)?r.providers:[])}catch(e){x(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,n.useEffect)(()=>{b()},[b]),!e)return null;let g=async(e,r)=>{u(e.id),x(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng cập nhật được visibility provider");t(Array.isArray(n.providers)?n.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){x(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{u("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(i.$n,{size:"sm",variant:"outline",onClick:b,loading:l,icon:"refresh",children:"Refresh"})]}),m?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:m}):null,h?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:h}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,t=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(i.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(i.$n,{size:"sm",variant:r?"outline":"secondary",disabled:t,loading:t,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},96928:(e,r,t)=>{Promise.resolve().then(t.bind(t,15100))}},e=>{e.O(0,[8991,3862,8500,9893,9959,7050,5564,5263,7033,5497,7413,912,6945,7173,8441,3794,7358],()=>e(e.s=96928)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3674],{17:(e,r,t)=>{"use strict";t.d(r,{A:()=>o});var s=t(95155),n=t(98500),i=t.n(n),a=t(14051),d=t.n(a),l=t(31474);function o({tabs:e,activeId:r,onChange:t,className:n=""}){return(0,s.jsx)("div",{className:(0,l.cn)("mb-5 overflow-x-auto border-b border-border",n),children:(0,s.jsx)("div",{className:"flex min-w-max items-center gap-1",children:e.map(e=>{let n=e.id===r,a=(0,l.cn)("inline-flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-semibold transition-colors",n?"border-primary text-primary":"border-transparent text-text-muted hover:border-border-strong hover:text-text-main"),d=(0,s.jsxs)(s.Fragment,{children:[e.icon?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:e.icon}):null,(0,s.jsx)("span",{children:e.label})]});return e.href?(0,s.jsx)(i(),{href:e.href,className:a,"aria-current":n?"page":void 0,children:d},e.id):(0,s.jsx)("button",{type:"button",onClick:()=>t?.(e.id),className:a,"aria-pressed":n,children:d},e.id)})})})}o.propTypes={tabs:d().arrayOf(d().shape({id:d().string.isRequired,label:d().string.isRequired,icon:d().string,href:d().string})).isRequired,activeId:d().string.isRequired,onChange:d().func,className:d().string}},15100:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>y});var s=t(95155),n=t(12115),i=t(25086),a=t(94027),d=t(17),l=t(17173),o=t(6945),c=t(35497),u=t(57250),m=t(31458);function x(e){return String(e||"").trim().toLowerCase()}function h(){let{isAdmin:e}=(0,a.s)(),[r,t]=(0,n.useState)([]),[i,d]=(0,n.useState)({}),[l,o]=(0,n.useState)({}),[h,p]=(0,n.useState)(""),[b,g]=(0,n.useState)({}),[v,f]=(0,n.useState)(""),[j,y]=(0,n.useState)({}),[N,k]=(0,n.useState)(3),[w,A]=(0,n.useState)("3"),[C,S]=(0,n.useState)(!0),[O,P]=(0,n.useState)(!1),[q,$]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[L,T]=(0,n.useState)(""),[K,_]=(0,n.useState)(""),z=(0,n.useCallback)(e=>{d(e.permissions||{}),o(e.connectionsByUser||{}),"number"==typeof e.globalConnectionsPerProviderLimit&&e.globalConnectionsPerProviderLimit>0&&(k(e.globalConnectionsPerProviderLimit),A(String(e.globalConnectionsPerProviderLimit))),e.connectionsPerProviderLimitOverrides&&"object"==typeof e.connectionsPerProviderLimitOverrides&&y(e.connectionsPerProviderLimitOverrides)},[]),R=(0,n.useCallback)(async()=>{if(e){S(!0),T("");try{let[e,r]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-providers/permissions",{cache:"no-store"})]),s=await e.json().catch(()=>({})),n=await r.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Kh\xf4ng tải được personal OAuth providers");if(!r.ok)throw Error(n.error||"Kh\xf4ng tải được quyền OAuth");t(Array.isArray(s.providers)?s.providers:[]),p(e=>e||s.userId||""),z(n)}catch(e){T(e?.message||"Kh\xf4ng tải được cấu h\xecnh OAuth access")}finally{S(!1)}}},[z,e]);(0,n.useEffect)(()=>{R()},[R]),(0,n.useEffect)(()=>{let e=x(h),t=i[e]||{},s={};for(let e of r)s[e.id]=!0===t[e.id];g(s);let n=j[e];f(n>0?String(n):"")},[h,i,r,j]);let U=(0,n.useMemo)(()=>Array.from(new Set([...Object.keys(i||{}),...Object.keys(l||{})])).map(e=>{let t=i[e]||{},s=l[e]||{},n=r.filter(e=>t?.[e.id]===!0),a=r.some(e=>Number(s[e.id]||0)>0);return{userId:e,providerState:t,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:a}}).filter(e=>e.enabledProviders.length>0||e.hasAnyConnection).sort((e,r)=>e.userId.localeCompare(r.userId)),[l,i,r]),H=async()=>{let e,r=x(h);if(!r)return void T("Nhập username/email cần cấp quyền.");let t=String(v||"").trim();if(""===t)e=null;else{let r=Number.parseInt(t,10);if(!Number.isFinite(r)||r<=0)return void T("Per-user override phải l\xe0 số nguy\xean dương hoặc bỏ trống.");e=r}P(!0),T(""),_("");try{let t=await fetch("/api/personal-cloud-providers/permissions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:r,providers:b,connectionsPerProviderLimit:e})}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng lưu được quyền OAuth");z(s);let n=s.user?.id||r;p(n),_(`Đ\xe3 lưu quyền OAuth cho ${n}.`)}catch(e){T(e?.message||"Kh\xf4ng lưu được quyền OAuth")}finally{P(!1)}},F=async()=>{let e=Number.parseInt(w,10);if(!Number.isFinite(e)||e<=0)return void T("Global limit phải l\xe0 số nguy\xean dương.");$(!0),T(""),_("");try{let r=await fetch("/api/personal-cloud-providers/permissions",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({globalConnectionsPerProviderLimit:e})}),t=await r.json().catch(()=>({}));if(!r.ok)throw Error(t.error||"Kh\xf4ng lưu được global limit");z(t),_(`Đ\xe3 đặt global limit = ${e} account / provider / user.`)}catch(e){T(e?.message||"Kh\xf4ng lưu được global limit")}finally{$(!1)}},B=async e=>{let r=x(e);if(r){P(!0),T(""),_("");try{let e=await fetch(`/api/personal-cloud-providers/permissions?userId=${encodeURIComponent(r)}`,{method:"DELETE"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng thu hồi được quyền OAuth");z(t),x(h)===r&&p("");let s=t.disconnectSummary||{},n=Number(s.manualActionRequired)||0;_(`Đ\xe3 x\xf3a ${s.deletedCount||0} OAuth connection của ${r}; ${s.upstreamRevokedCount||0} token đ\xe3 revoke upstream.${n>0?` ${n} connection cần thu hồi thủ c\xf4ng tại provider.`:""}`),E("")}catch(e){T(e?.message||"Kh\xf4ng thu hồi được quyền OAuth")}finally{P(!1)}}};if(!e)return null;let G=U.find(e=>e.userId===x(I)),M=r.reduce((e,r)=>e+Number(G?.connectionsByProvider?.[r.id]||0),0);return(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main",children:"Admin: OAuth provider access"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Quản l\xfd provider n\xe0o user được ph\xe9p d\xf9ng, giới hạn số account OAuth c\xe1 nh\xe2n v\xe0 thu hồi to\xe0n bộ quyền/token khi cần. C\xe1c thao t\xe1c trong tab n\xe0y chỉ d\xe0nh cho admin."})]}),(0,s.jsx)(m.default,{}),L?(0,s.jsx)("div",{className:"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-700 dark:text-red-300",children:L}):null,K?(0,s.jsx)("div",{className:"rounded-xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm text-green-700 dark:text-green-300",children:K}):null,(0,s.jsxs)(c.Zp,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Access policy"}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Default l\xe0 kh\xf4ng c\xf3 quyền. Tắt provider giữ nguy\xean connection/token để c\xf3 thể bật lại; Revoke all sẽ thử revoke upstream rồi x\xf3a connection/token local."})]}),(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:R,loading:C,icon:"refresh",children:"Refresh"})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Global limit — số account OAuth c\xe1 nh\xe2n / provider / user thường"}),(0,s.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"\xc1p dụng cho user kh\xf4ng c\xf3 per-user override. Admin kh\xf4ng bị chặn bởi limit n\xe0y."}),(0,s.jsxs)("div",{className:"mt-3 flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,s.jsx)(c.pd,{type:"number",min:1,value:w,onChange:e=>A(e.target.value),className:"sm:w-48"}),(0,s.jsx)(c.$n,{onClick:F,loading:q,disabled:q||Number.parseInt(w,10)===N,children:"Lưu global"}),(0,s.jsxs)("span",{className:"text-xs text-text-muted",children:["Đang lưu: ",N]})]})]}),(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end",children:[(0,s.jsx)(c.pd,{label:"User ID / Email",value:h,onChange:e=>p(e.target.value),placeholder:"anh-tct hoặc anh-tct@fujinet.net"}),(0,s.jsx)(c.$n,{onClick:H,loading:O,icon:"save",children:"Save permissions"})]}),(0,s.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:r.map(e=>(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:(0,s.jsx)(c.lM,{checked:!0===b[e.id],onChange:r=>g(t=>({...t,[e.id]:r})),label:e.name,description:b[e.id]?"User được ph\xe9p add account":"User chưa được cấp quyền"})},e.id))}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Per-user override — account / provider"}),(0,s.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Ghi đ\xe8 global cho ",(0,s.jsx)("span",{className:"font-mono",children:x(h)||"user đang chọn"}),". Để trống rồi Save permissions để quay lại global (",N,")."]}),(0,s.jsx)("div",{className:"mt-3 max-w-xs",children:(0,s.jsx)(c.pd,{type:"number",min:1,value:v,onChange:e=>f(e.target.value),placeholder:`Để trống = d\xf9ng global (${N})`})})]}),(0,s.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Granted OAuth Access"}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:"Danh s\xe1ch user đang được cấp quyền hoặc vẫn c\xf2n OAuth connection cần quản l\xfd."})]}),C?(0,s.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===U.length?(0,s.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,s.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,s.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,s.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"User"}),r.map(e=>(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:e.name},e.id)),(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"Limit / provider"}),(0,s.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,s.jsx)("tbody",{className:"divide-y divide-border bg-background",children:U.map(e=>(0,s.jsxs)("tr",{className:"hover:bg-surface/50",children:[(0,s.jsxs)("td",{className:"px-4 py-4",children:[(0,s.jsx)("div",{className:"break-all font-mono text-text-main",children:e.userId}),x(h)===e.userId?(0,s.jsx)("div",{className:"mt-1 text-xs text-brand-600 dark:text-brand-300",children:"Đang edit ở form ph\xeda tr\xean"}):null]}),r.map(r=>{let t=!0===e.providerState[r.id],n=Number(e.connectionsByProvider?.[r.id]||0);return(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)(c.Ex,{variant:t?"success":"default",size:"sm",children:t?"ON":"OFF"}),n>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-0.5",title:`User đ\xe3 add ${n} ${r.name} account`,children:[(0,s.jsx)(u.A,{src:`/providers/${r.id}.png`,alt:r.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:r.id.slice(0,2).toUpperCase(),fallbackColor:r.color||"#64748b"}),n>1?(0,s.jsxs)("span",{className:"text-[10px] font-semibold text-text-muted",children:["\xd7",n]}):null]}):null]})},r.id)}),(0,s.jsx)("td",{className:"px-4 py-4 text-xs",children:j[e.userId]>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,s.jsx)(c.Ex,{variant:"warning",size:"sm",children:"Override"}),(0,s.jsx)("span",{className:"font-mono",children:j[e.userId]})]}):(0,s.jsxs)("span",{className:"text-text-muted",children:["Global \xb7 ",N]})}),(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:()=>(e=>{let t=x(e);p(t);let s=i[t]||{},n={};for(let e of r)n[e.id]=!0===s[e.id];g(n)})(e.userId),children:"Edit"}),(0,s.jsx)(c.$n,{variant:"danger",size:"sm",loading:O&&I===e.userId,onClick:()=>E(e.userId),children:"Revoke all & delete"})]})})]},e.userId))})]})})]})]}),I?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>E(""),title:"Thu hồi to\xe0n bộ quyền OAuth",size:"lg",busy:O,closeOnOverlay:!O,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>E(""),disabled:O,children:"Hủy"}),(0,s.jsx)(c.$n,{variant:"danger",icon:"delete_forever",loading:O,onClick:()=>B(I),children:"Thu hồi v\xe0 x\xf3a to\xe0n bộ"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-red-500/30 bg-red-500/10 p-4",children:[(0,s.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,s.jsx)("div",{className:"mt-1 break-all text-lg font-semibold text-text-main",children:I}),(0,s.jsx)("p",{className:"mt-2 text-sm text-text-muted",children:"To\xe0n bộ quyền OAuth provider v\xe0 connection/token local của user n\xe0y sẽ bị x\xf3a; gateway sẽ thử revoke upstream trước."})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface p-3 text-sm",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Connection t\xecm thấy"}),(0,s.jsx)(c.Ex,{variant:M>0?"warning":"default",size:"sm",children:M})]}),G?(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:r.map(e=>{let r=Number(G.connectionsByProvider?.[e.id]||0);return r>0?(0,s.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,s.jsx)(u.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",r]},e.id):null})}):null]})}):null]})}var p=t(43503),b=t(78867),g=t(67673),v=t(14796),f=t.n(v);function j(){let e=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>{let r=e.current;if(!r)return;let t=null,s=()=>{let e=Array.from(r.querySelectorAll("h2")).find(e=>e.textContent?.trim()==="Admin: OAuth provider access"),s=e?.closest(".bg-surface.border.border-border");s&&s!==t&&(t&&t.style.removeProperty("display"),(t=s).style.setProperty("display","none"))};s();let n=new MutationObserver(s);return n.observe(r,{childList:!0,subtree:!0}),()=>{n.disconnect(),t&&t.style.removeProperty("display")}},[]),(0,s.jsxs)("div",{ref:e,className:f().page,children:[(0,s.jsx)(p.default,{}),(0,s.jsx)(g.default,{}),(0,s.jsx)(b.default,{})]})}function y(){let{isAdmin:e}=(0,a.s)(),[r,t]=(0,n.useState)("oauth"),c=(0,n.useMemo)(()=>[{id:"oauth",label:"Personal OAuth",icon:"cloud_sync"},...e?[{id:"monitor",label:"OAuth Monitor",icon:"manage_accounts"}]:[],{id:"quota",label:"Personal Quota",icon:"data_usage"},...e?[{id:"admin-access",label:"Admin: OAuth Access",icon:"admin_panel_settings"}]:[]],[e]),u=c.some(e=>e.id===r)?r:"oauth";return(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)(d.A,{tabs:c,activeId:u,onChange:t}),"oauth"===u?(0,s.jsx)(j,{}):null,"monitor"===u&&e?(0,s.jsx)(l.default,{}):null,"quota"===u?(0,s.jsx)(n.Suspense,{fallback:(0,s.jsx)(i.CardSkeleton,{}),children:(0,s.jsx)(o.default,{})}):null,"admin-access"===u&&e?(0,s.jsx)(h,{}):null]})}},31458:(e,r,t)=>{"use strict";t.d(r,{default:()=>l});var s=t(95155),n=t(12115),i=t(35497),a=t(57250),d=t(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,t]=(0,n.useState)([]),[l,o]=(0,n.useState)(!1),[c,u]=(0,n.useState)(""),[m,x]=(0,n.useState)(""),[h,p]=(0,n.useState)(""),b=(0,n.useCallback)(async()=>{if(e){o(!0),x("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");t(Array.isArray(r.providers)?r.providers:[])}catch(e){x(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,n.useEffect)(()=>{b()},[b]),!e)return null;let g=async(e,r)=>{u(e.id),x(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng cập nhật được visibility provider");t(Array.isArray(n.providers)?n.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){x(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{u("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(i.$n,{size:"sm",variant:"outline",onClick:b,loading:l,icon:"refresh",children:"Refresh"})]}),m?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:m}):null,h?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:h}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,t=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(i.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(i.$n,{size:"sm",variant:r?"outline":"secondary",disabled:t,loading:t,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},96928:(e,r,t)=>{Promise.resolve().then(t.bind(t,15100))}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,7413,912,6945,7173,8441,3794,7358],()=>e(e.s=96928)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9645],{31458:(e,r,i)=>{"use strict";i.d(r,{default:()=>l});var s=i(95155),t=i(12115),n=i(35497),a=i(57250),d=i(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,i]=(0,t.useState)([]),[l,o]=(0,t.useState)(!1),[c,h]=(0,t.useState)(""),[x,m]=(0,t.useState)(""),[u,p]=(0,t.useState)(""),v=(0,t.useCallback)(async()=>{if(e){o(!0),m("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");i(Array.isArray(r.providers)?r.providers:[])}catch(e){m(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,t.useEffect)(()=>{v()},[v]),!e)return null;let g=async(e,r)=>{h(e.id),m(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Kh\xf4ng cập nhật được visibility provider");i(Array.isArray(t.providers)?t.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){m(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{h("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(n.$n,{size:"sm",variant:"outline",onClick:v,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,u?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:u}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,i=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(n.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(n.$n,{size:"sm",variant:r?"outline":"secondary",disabled:i,loading:i,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},76333:(e,r,i)=>{Promise.resolve().then(i.bind(i,31458))}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9645],{31458:(e,r,i)=>{"use strict";i.d(r,{default:()=>l});var s=i(95155),t=i(12115),n=i(35497),a=i(57250),d=i(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,i]=(0,t.useState)([]),[l,o]=(0,t.useState)(!1),[c,h]=(0,t.useState)(""),[x,m]=(0,t.useState)(""),[u,p]=(0,t.useState)(""),v=(0,t.useCallback)(async()=>{if(e){o(!0),m("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");i(Array.isArray(r.providers)?r.providers:[])}catch(e){m(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,t.useEffect)(()=>{v()},[v]),!e)return null;let g=async(e,r)=>{h(e.id),m(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Kh\xf4ng cập nhật được visibility provider");i(Array.isArray(t.providers)?t.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){m(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{h("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(n.$n,{size:"sm",variant:"outline",onClick:v,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,u?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:u}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,i=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(n.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(n.$n,{size:"sm",variant:r?"outline":"secondary",disabled:i,loading:i,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},76333:(e,r,i)=>{Promise.resolve().then(i.bind(i,31458))}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=76333)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3538],{2823:(e,s,n)=>{Promise.resolve().then(n.bind(n,67673)),Promise.resolve().then(n.t.bind(n,14796,23)),Promise.resolve().then(n.bind(n,43503)),Promise.resolve().then(n.bind(n,78867))}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3538],{2823:(e,s,n)=>{Promise.resolve().then(n.bind(n,67673)),Promise.resolve().then(n.t.bind(n,14796,23)),Promise.resolve().then(n.bind(n,43503)),Promise.resolve().then(n.bind(n,78867))}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,912,8441,3794,7358],()=>e(e.s=2823)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3864],{74064:(e,s,_)=>{Promise.resolve().then(_.bind(_,17173))}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3864],{74064:(e,s,_)=>{Promise.resolve().then(_.bind(_,17173))}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,7173,8441,3794,7358],()=>e(e.s=74064)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,t)=>{Promise.resolve().then(t.bind(t,38658))},38658:(e,a,t)=>{"use strict";t.r(a),t.d(a,{default:()=>j});var s=t(95155),r=t(12115),l=t(44656),o=t(35497);let n={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,payloadRotationScheduleTime:"21:00",payloadRotationMaxRuntimeMinutes:60,payloadRotationIntervalHours:24,payloadRotationBatchSize:500,payloadRotationMaxBatches:20},d=[{value:60,label:"1 hour"},{value:120,label:"2 hours"},{value:180,label:"3 hours"},{value:240,label:"4 hours"},{value:360,label:"6 hours"},{value:480,label:"8 hours"},{value:720,label:"12 hours"},{value:0,label:"Until finished"}];function i({label:e,value:a,onChange:t,type:r="text",placeholder:l="",disabled:o=!1,min:n,max:d,step:c}){return(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:e}),(0,s.jsx)("input",{type:r,value:a||"",placeholder:l,disabled:o,min:n,max:d,step:c,onChange:e=>t(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 c({label:e,checked:a,onChange:t,disabled:r=!1}){return(0,s.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main",children:[(0,s.jsx)("input",{type:"checkbox",checked:!!a,disabled:r,onChange:e=>t(e.target.checked)}),e]})}function p(){let[e,a]=(0,r.useState)(n),[t,l]=(0,r.useState)(!1),[p,u]=(0,r.useState)(null),[m,x]=(0,r.useState)(null),[g,b]=(0,r.useState)(null),h=e=>a(a=>({...a,...e})),y=async()=>{l(!0),x(null);try{let e=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db"),t=await e.json();if(!e.ok)throw Error(t.error||"Failed to load config");a({...n,...t.config||{}})}catch(e){x(e.message||"Failed to load config")}finally{l(!1)}};(0,r.useEffect)(()=>{y()},[]);let f=async()=>{l(!0),x(null),u(null);try{let t=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:e})}),s=await t.json();if(!t.ok)throw Error(s.error||"Failed to save config");a({...n,...s.config||{}}),u("Saved")}catch(e){x(e.message||"Failed to save config")}finally{l(!1)}},v=async(a,t={})=>{if(!t.confirm||window.confirm("Delete all prompt_logs rows and their payloads older than the retention cutoff? Both the rows in prompt_logs (previews, model/provider/token metadata) and the referenced payloads will be removed. This cannot be undone.")){l(!0),x(null),u(null),a.includes("payload-rotation")&&b(null);try{let s=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===t.confirm})}),r=await s.text(),l={};try{l=r?JSON.parse(r):{}}catch{let e=r.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,200),a=504===s.status?"Manual rotation exceeded the request timeout. Use automatic rotation for long-running cleanup.":`HTTP ${s.status}: ${e||s.statusText||"non-JSON response"}`;throw Error(a)}if(!s.ok)throw Error(l.error||`HTTP ${s.status}`);a.includes("payload-rotation")&&b(l),u(l.message||l.init?.message||"OK")}catch(e){x(e.message||"Action failed")}finally{l(!1)}}},j="postgres"===e.type||"mysql"===e.type;return(0,s.jsx)(o.Zp,{title:"Request Logging",subtitle:"Control local request files and database-backed prompt logs",icon:"receipt_long",children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsxs)(o.Ex,{variant:e.fileLoggingEnabled?"success":"default",children:["Local files: ",e.fileLoggingEnabled?"Enabled":"Disabled"]}),(0,s.jsxs)(o.Ex,{variant:e.enabled?"success":"default",children:["Database: ",e.enabled?"Enabled":"Disabled"]})]}),(0,s.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,s.jsx)("div",{className:"grid gap-3 md:grid-cols-2",children:(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Database type"}),(0,s.jsxs)("select",{value:e.type,disabled:t,onChange:a=>{let t=a.target.value;h({type:t,port:"postgres"===t?e.port||"5432":"mysql"===t?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,s.jsx)("option",{value:"mysql",children:"MySQL / MariaDB"}),(0,s.jsx)("option",{value:"postgres",children:"PostgreSQL"})]})]})}),j&&(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,s.jsx)(i,{label:"Host",value:e.host,placeholder:"127.0.0.1",onChange:e=>h({host:e}),disabled:t}),(0,s.jsx)(i,{label:"Port",value:e.port,placeholder:"postgres"===e.type?"5432":"3306",onChange:e=>h({port:e}),disabled:t}),(0,s.jsx)(i,{label:"Database",value:e.database,placeholder:"bluerouter_logs",onChange:e=>h({database:e}),disabled:t}),(0,s.jsx)(i,{label:"Username",value:e.username,placeholder:"bluerouter",onChange:e=>h({username:e}),disabled:t}),(0,s.jsx)(i,{label:"Password",type:"password",value:e.password,placeholder:"Leave as ******** to keep existing password",onChange:e=>h({password:e}),disabled:t}),(0,s.jsxs)("div",{className:"flex flex-col justify-end gap-2",children:[(0,s.jsx)(c,{label:"Use SSL",checked:e.ssl,onChange:e=>h({ssl:e}),disabled:t}),(0,s.jsx)(c,{label:"Create database if missing",checked:e.createDatabase,onChange:e=>h({createDatabase:e}),disabled:t})]})]}),(0,s.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-surface/40 p-3 md:grid-cols-2",children:[(0,s.jsx)(c,{label:"Save request/response to local files",checked:e.fileLoggingEnabled,onChange:e=>h({fileLoggingEnabled:e}),disabled:t}),(0,s.jsx)(c,{label:"Save request/response to Prompt Log Database",checked:e.enabled,onChange:e=>h({enabled:e}),disabled:t}),(0,s.jsx)(c,{label:"Log client request JSON",checked:e.logClientRequest,onChange:e=>h({logClientRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log normalized/source request JSON",checked:e.logSourceRequest,onChange:e=>h({logSourceRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log target/provider request JSON",checked:e.logTargetRequest,onChange:e=>h({logTargetRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log provider response JSON",checked:e.logProviderResponse,onChange:e=>h({logProviderResponse:e}),disabled:t}),(0,s.jsx)(c,{label:"Log errors",checked:e.logErrors,onChange:e=>h({logErrors:e}),disabled:t})]}),(0,s.jsxs)("div",{className:"rounded-lg border border-border bg-background p-3 text-xs text-text-muted",children:["Local files are written under ",(0,s.jsx)("code",{children:"DATA_DIR/logs/requests"}),". Disabling local files stops new request/response dump files; existing files are kept."]}),(0,s.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-surface/40 p-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Prompt log rotation"}),(0,s.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Deletes ",(0,s.jsx)("code",{children:"prompt_logs"})," rows AND their referenced payloads older than the retention cutoff. After a full run, only logs from the last N days remain — analytics/metadata for older rows are removed as well."]})]}),(0,s.jsx)(c,{label:"Enable automatic rotation",checked:e.payloadRotationEnabled,onChange:e=>h({payloadRotationEnabled:e}),disabled:t}),(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,s.jsx)(i,{label:"Keep logs for (days)",type:"number",min:1,max:3650,step:1,value:String(e.payloadRetentionDays||60),onChange:e=>h({payloadRetentionDays:Number(e)||60}),disabled:t}),(0,s.jsx)(i,{label:"Daily start time (Vietnam, UTC+7)",type:"time",step:60,value:String(e.payloadRotationScheduleTime||"21:00"),onChange:e=>h({payloadRotationScheduleTime:e||"21:00"}),disabled:t}),(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Maximum automatic run time"}),(0,s.jsx)("select",{value:String(Number(e.payloadRotationMaxRuntimeMinutes??60)),disabled:t,onChange:e=>h({payloadRotationMaxRuntimeMinutes:Number(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",children:d.map(e=>(0,s.jsx)("option",{value:String(e.value),children:e.label},e.value))})]}),(0,s.jsx)(i,{label:"Prompt-log rows per transaction",type:"number",min:50,max:5e3,step:50,value:String(e.payloadRotationBatchSize||500),onChange:e=>h({payloadRotationBatchSize:Number(e)||500}),disabled:t})]}),(0,s.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:["Automatic rotation runs once per day at the selected Vietnam time. It deletes expired ",(0,s.jsx)("code",{children:"prompt_logs"})," in small transactions and checks the run-time budget between cleanup passes. If the budget is reached, remaining rows continue at the next daily run. Choose ",(0,s.jsx)("strong",{children:"Until finished"})," to keep running until no expired rows remain. On MySQL, orphan ",(0,s.jsx)("code",{children:"prompt_log_payloads"})," rows are reaped as part of the cleanup."]}),(0,s.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:["Deletion is permanent: previews, model/provider/token metadata, and analytics for older rows go away too. Freed space stays inside InnoDB — ",(0,s.jsx)("code",{children:"OPTIMIZE TABLE"})," is needed to shrink the .ibd file (only during a maintenance window, with enough free disk)."]}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("preview-payload-rotation"),loading:t,children:"Preview expired logs"}),(0,s.jsx)(o.$n,{size:"sm",variant:"danger",onClick:()=>v("run-payload-rotation",{confirm:!0}),loading:t,children:"Delete expired logs now"})]}),g&&(0,s.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,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Cutoff:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:g.cutoff?new Date(g.cutoff).toLocaleString():"-"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.promptLogRowsUpdated?"Prompt-log rows past retention:":"Prompt-log rows deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:Number(g.promptLogRowsUpdated??g.promptLogRows??0).toLocaleString()})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.payloadRowsDeleted?"Payload rows to delete:":"Payload rows deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:Number(g.payloadRowsDeleted??g.payloadRowsPastRetention??0).toLocaleString()})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.payloadBytesDeleted?"Estimated payload size:":"Payload size deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:function(e){let a=Number(e||0);if(!Number.isFinite(a)||a<=0)return"0 B";let t=["B","KB","MB","GB","TB"],s=Math.min(t.length-1,Math.floor(Math.log(a)/Math.log(1024))),r=a/1024**s;return`${r.toFixed(r>=10||0===s?1:2)} ${t[s]}`}(g.payloadBytesDeleted??g.payloadBytesPastRetention??g.referencedPayloadBytes)})]}),g.hasMore?(0,s.jsx)("div",{className:"md:col-span-2 lg:col-span-4 text-amber-600",children:"More expired rows remain. Automatic rotation will continue them at the next scheduled run."}):null]}),(0,s.jsx)("div",{className:"text-[11px] text-text-muted",children:"Save to apply the automatic schedule immediately. Preview uses the values currently shown. Manual deletion is a bounded maintenance pass; use automatic rotation for multi-hour cleanup."})]}),j&&(0,s.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,s.jsx)("code",{children:"mysql2"}),"; PostgreSQL requires ",(0,s.jsx)("code",{children:"pg"}),"."]}),p&&(0,s.jsx)("div",{className:"rounded-lg border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600",children:p}),m&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-500",children:m}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:y,loading:t,children:"Reload"}),(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("test"),loading:t,children:"Test connection"}),(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("init"),loading:t,children:"Initialize schema"}),(0,s.jsx)(o.$n,{size:"sm",onClick:f,loading:t,children:"Save"}),(0,s.jsx)(o.$n,{size:"sm",variant:"success",onClick:()=>v("save-and-init"),loading:t,children:"Save & initialize"})]})]})})}let u="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",m="image/svg+xml,image/png,image/webp,image/jpeg,image/gif",x=`${m},image/x-icon,image/vnd.microsoft.icon,.ico`;function g({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,s.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:t,children:r}){return(0,s.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,s.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),t&&(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:t})]})]}),r]})}function h({label:e,hint:a,children:t}){return(0,s.jsxs)("label",{className:"block",children:[(0,s.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),t,a&&(0,s.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function y(e){return(0,s.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 f(e){return(0,s.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:t,onChange:r,disabled:l}){return(0,s.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,s.jsx)("button",{type:"button",disabled:l,onClick:()=>r(!t),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${t?"bg-primary":"bg-border"}`,children:(0,s.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${t?"left-5":"left-0.5"}`})})]})}function j(){let[e,a]=(0,r.useState)({}),[t,o]=(0,r.useState)(!0),[n,d]=(0,r.useState)({current:"",new:"",confirm:""}),[i,c]=(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),[L,k]=(0,r.useState)("admin"),[U,P]=(0,r.useState)({type:"",message:""}),[M,R]=(0,r.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:u,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapAiGatewaysMonitorsGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[B,G]=(0,r.useState)({type:"",message:""}),[E,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),[V,H]=(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),[et,es]=(0,r.useState)({type:"",message:""}),er=(0,l.useBranding)(),[el,eo]=(0,r.useState)(""),[en,ed]=(0,r.useState)(""),[ei,ec]=(0,r.useState)(""),[ep,eu]=(0,r.useState)({type:"",message:""}),[em,ex]=(0,r.useState)(!1),[eg,eb]=(0,r.useState)(!1),[eh,ey]=(0,r.useState)(!1),[ef,ev]=(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"}),t=await e.json();a(t),k(t.localLoginUsername||"admin"),R({ldapEnabled:!0===t.ldapEnabled,ldapUrl:t.ldapUrl||"",ldapBindDn:t.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:t.ldapUserBaseDn||t.ldapBaseDn||"",ldapUserSearchFilter:t.ldapUserSearchFilter||u,ldapUserNameAttribute:t.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:t.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:t.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:t.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:t.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:t.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:t.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==t.ldapNestedGroups,ldapAllowedUsers:Array.isArray(t.ldapAllowedUsers)?t.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==t.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:t.ldapConnectTimeoutMs||8e3}),H({authMode:t.authMode||"password",oidcIssuerUrl:t.oidcIssuerUrl||"",oidcClientId:t.oidcClientId||"",oidcScopes:t.oidcScopes||"openid profile email",oidcLoginLabel:t.oidcLoginLabel||"Sign in with OIDC"}),eo(t.siteTitle||""),ed(t.siteShortName||""),ec(t.siteDescription||""),("oidc"===t.authMode||"both"===t.authMode)&&ea(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{o(!1)}};(0,r.useEffect)(()=>{eN()},[]);let eD=async e=>{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Failed to save settings");return a(e=>({...e,...s})),s},eC=async t=>{es({type:"",message:""});let s=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:t}));try{let e=await eD({sidebarAdvancedToolsVisible:t}),s=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:s})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:s}})),es({type:"success",message:s?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){a(e=>({...e,sidebarAdvancedToolsVisible:s})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:s}})),es({type:"error",message:e.message||"Failed to save sidebar setting."})}},eS=async e=>{e.preventDefault(),P({type:"",message:""});try{let e=await eD({localLoginUsername:L});k(e.localLoginUsername||L||"admin"),P({type:"success",message:"Local account name saved."})}catch(e){P({type:"error",message:e.message})}},eA=async e=>{if(e.preventDefault(),n.new!==n.confirm)return void c({type:"error",message:"Passwords do not match"});w(!0),c({type:"",message:""});try{await eD({currentPassword:n.current,newPassword:n.new}),c({type:"success",message:"Password updated successfully"}),d({current:"",new:"",confirm:""})}catch(e){c({type:"error",message:e.message||"Failed to update password"})}finally{w(!1)}},eL=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(),t=JSON.stringify(a,null,2),s=new Blob([t],{type:"application/json"}),r=URL.createObjectURL(s),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)}},ek=async e=>{let a=e.target.files?.[0];if(a){D(!0),S({type:"",message:""});try{let e=await a.text(),t=JSON.parse(e),s=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),r=await s.json().catch(()=>({}));if(!s.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(t=>({...t,[e]:a})),eP=async e=>{e?.preventDefault?.(),I(!0),G({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})),G({type:"success",message:"LDAP settings saved."})}catch(e){G({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{I(!1)}},eM=async()=>{T(!0),G({type:"",message:""});try{await eP();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?G({type:"success",message:a.message||"LDAP connection OK."}):G({type:"error",message:a.error||"LDAP test failed."})}catch(e){G({type:"error",message:e.message||"LDAP test failed."})}finally{T(!1)}},eR=async()=>{J(!0),G({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||[]),G({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):G({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){G({type:"error",message:e.message||"Failed to load LDAP users."})}finally{J(!1)}},eB=e=>{let a=String(e||"").trim();a&&R(e=>{let t=new Set(e.ldapAllowedUsers||[]);return t.has(a)?t.delete(a):t.add(a),{...e,ldapAllowedUsers:[...t]}})},eG=async(a=V.authMode||"password")=>{let t=V.oidcIssuerUrl.trim(),s=V.oidcClientId.trim(),r=V.oidcScopes.trim(),l=V.oidcLoginLabel.trim(),o=Q.trim();if("password"!==a&&(!t||!s||!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:t,oidcClientId:s,oidcScopes:r||"openid profile email",oidcLoginLabel:l||"Sign in with OIDC"};o&&(e.oidcClientSecret=o);let n=await eD(e);H({authMode:n.authMode||a,oidcIssuerUrl:n.oidcIssuerUrl||t,oidcClientId:n.oidcClientId||s,oidcScopes:n.oidcScopes||r||"openid profile email",oidcLoginLabel:n.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)}},eE=async(e,a)=>{if(!a)return;if(a.size>1048576)return void eu({type:"error",message:"File exceeds 1 MB limit."});let t="logo"===e?eb:ey;t(!0),eu({type:"",message:""});try{let t=new FormData;t.append("asset",e),t.append("file",a);let s=await fetch("/api/branding/upload",{method:"POST",body:t}),r=await s.json().catch(()=>({}));if(!s.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{t(!1)}},eI=async e=>{let a=e.target.files?.[0];await eE("logo",a),ej.current&&(ej.current.value="")},eO=async e=>{let a=e.target.files?.[0];await eE("favicon",a),ew.current&&(ew.current.value="")},eT=async e=>{e.preventDefault(),ex(!0),eu({type:"",message:""});try{await eD({siteTitle:el.trim(),siteShortName:en.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"}),t=await a.json().catch(()=>({}));if(!a.ok)throw Error(t.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()=>{ev(!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(""),ed(""),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{ev(!1)}};return t?(0,s.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,s.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,s.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure dashboard preferences, request logging, database backup, and authentication."})]}),(0,s.jsxs)(b,{icon:"view_sidebar",title:"Sidebar tools",desc:"Show or hide advanced dashboard tools to keep the sidebar clean.",children:[(0,s.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,s.jsx)(g,{status:et})]}),(0,s.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,s.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Logo"}),(0,s.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,s.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,s.jsx)("img",{src:er.logoUrl,alt:"Current logo",className:"max-h-full max-w-full object-contain"}):(0,s.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"hub"})}),(0,s.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,s.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the dashboard sidebar and login page. SVG, PNG, WebP, JPEG, GIF."}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)("button",{type:"button",disabled:eg,onClick:()=>ej.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eg?"Uploading...":er?.logoUrl?"Replace logo":"Upload logo"}),er?.logoUrl?(0,s.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,s.jsx)("input",{ref:ej,type:"file",accept:m,className:"hidden",onChange:eI})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Favicon"}),(0,s.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,s.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,s.jsx)("img",{src:er.faviconUrl,alt:"Current favicon",className:"max-h-10 max-w-10 object-contain"}):(0,s.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"public"})}),(0,s.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,s.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the browser tab. ICO, SVG, PNG, WebP, JPEG, GIF."}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.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,s.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,s.jsx)("input",{ref:ew,type:"file",accept:x,className:"hidden",onChange:eO})]})]})]}),(0,s.jsxs)("form",{onSubmit:eT,className:"space-y-3",children:[(0,s.jsx)(h,{label:"Site title",hint:"Shown in browser tab and login page. Leave blank for default.",children:(0,s.jsx)(y,{value:el,onChange:e=>eo(e.target.value),placeholder:"AI Router Gateway"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:en,onChange:e=>ed(e.target.value),placeholder:"Fujinet"})}),(0,s.jsx)(h,{label:"Description",hint:"Used for browser metadata.",children:(0,s.jsx)(f,{rows:3,value:ei,onChange:e=>ec(e.target.value),placeholder:"AI Infrastructure Management"})}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.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,s.jsx)("button",{type:"button",disabled:ef,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:ef?"Resetting...":"Reset to defaults"})]})]})]}),(0,s.jsx)(g,{status:ep})]}),(0,s.jsx)(b,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,s.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,s.jsxs)("form",{onSubmit:eS,className:"space-y-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,s.jsx)(h,{label:"Local username",children:(0,s.jsx)(y,{value:L,onChange:e=>k(e.target.value)})}),(0,s.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,s.jsx)(g,{status:U})]}),(0,s.jsxs)("form",{onSubmit:eA,className:"space-y-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,s.jsx)(h,{label:"Current password",children:(0,s.jsx)(y,{type:"password",value:n.current,onChange:e=>d({...n,current:e.target.value}),required:!0})}),(0,s.jsx)(h,{label:"New password",children:(0,s.jsx)(y,{type:"password",value:n.new,onChange:e=>d({...n,new:e.target.value}),required:!0})}),(0,s.jsx)(h,{label:"Confirm password",children:(0,s.jsx)(y,{type:"password",value:n.confirm,onChange:e=>d({...n,confirm:e.target.value}),required:!0})}),(0,s.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,s.jsx)(g,{status:i})]})]})}),(0,s.jsx)("div",{id:"request-logging",className:"scroll-mt-6",children:(0,s.jsx)(p,{})}),(0,s.jsxs)(b,{icon:"database",title:"Database Backup",desc:"Export or restore configuration, Linux Resource Monitor data, logo and favicon.",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,s.jsx)("button",{onClick:eL,disabled:N,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Backup"}),(0,s.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,s.jsx)("input",{ref:A,type:"file",accept:"application/json",className:"hidden",onChange:ek})]}),(0,s.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,s.jsx)(g,{status:C})]}),(0,s.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,s.jsxs)("form",{onSubmit:eP,className:"space-y-5",children:[(0,s.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,s.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,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"LDAP URL",children:(0,s.jsx)(y,{value:M.ldapUrl,onChange:e=>eU("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,s.jsx)(h,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,s.jsx)(y,{value:M.ldapUserBaseDn,onChange:e=>eU("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{label:"LDAP Bind DN",children:(0,s.jsx)(y,{value:M.ldapBindDn,onChange:e=>eU("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,s.jsx)(h,{label:"LDAP Bind Password",children:(0,s.jsx)(y,{type:"password",value:M.ldapBindPassword,onChange:e=>eU("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:M.ldapLoginAllowedGroupDn,onChange:e=>eU("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,s.jsx)(y,{value:M.ldapAdminGroupDn,onChange:e=>eU("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:M.ldapMonitorAdminGroupDn,onChange:e=>eU("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{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,s.jsx)(y,{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,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,s.jsx)(y,{value:M.ldapUserSearchFilter,onChange:e=>eU("ldapUserSearchFilter",e.target.value)})}),(0,s.jsx)(h,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,s.jsx)(v,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:M.ldapNestedGroups,onChange:e=>eU("ldapNestedGroups",e)})}),(0,s.jsx)(h,{label:"Username attribute",children:(0,s.jsx)(y,{value:M.ldapUserNameAttribute,onChange:e=>eU("ldapUserNameAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Display attribute",children:(0,s.jsx)(y,{value:M.ldapUserDisplayAttribute,onChange:e=>eU("ldapUserDisplayAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Email attribute",children:(0,s.jsx)(y,{value:M.ldapUserEmailAttribute,onChange:e=>eU("ldapUserEmailAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Connect timeout ms",children:(0,s.jsx)(y,{type:"number",value:M.ldapConnectTimeoutMs,onChange:e=>eU("ldapConnectTimeoutMs",e.target.value)})})]}),(0,s.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,s.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,s.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,s.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,s.jsx)(y,{value:F,onChange:e=>q(e.target.value),placeholder:"Search users..."}),(0,s.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,s.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,s.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,s.jsxs)("span",{children:[(0,s.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,s.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,s.jsxs)("div",{className:"mt-3",children:[(0,s.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,s.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:M.ldapAllowedUsers.map(e=>(0,s.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,s.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,s.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,s.jsx)("button",{type:"submit",disabled:E,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:E?"Saving...":"Save LDAP settings"})]}),(0,s.jsx)(g,{status:B})]})}),(0,s.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,s.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,s.jsxs)("div",{className:"space-y-4",children:[(0,s.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=V.authMode===e.value;return(0,s.jsxs)("button",{type:"button",onClick:()=>H(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,s.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"Issuer URL",children:(0,s.jsx)(y,{value:V.oidcIssuerUrl,onChange:e=>H({...V,oidcIssuerUrl:e.target.value})})}),(0,s.jsx)(h,{label:"Client ID",children:(0,s.jsx)(y,{value:V.oidcClientId,onChange:e=>H({...V,oidcClientId:e.target.value})})}),(0,s.jsx)(h,{label:"Client Secret",children:(0,s.jsx)(y,{type:"password",value:Q,onChange:e=>K(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,s.jsx)(h,{label:"Scopes",children:(0,s.jsx)(y,{value:V.oidcScopes,onChange:e=>H({...V,oidcScopes:e.target.value})})}),(0,s.jsx)(h,{label:"Login label",children:(0,s.jsx)(y,{value:V.oidcLoginLabel,onChange:e=>H({...V,oidcLoginLabel:e.target.value})})})]}),(0,s.jsx)("button",{type:"button",onClick:()=>eG(),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,s.jsx)(g,{status:W})]})]})]})}}},e=>{e.O(0,[8991,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,t)=>{Promise.resolve().then(t.bind(t,38658))},38658:(e,a,t)=>{"use strict";t.r(a),t.d(a,{default:()=>j});var s=t(95155),r=t(12115),l=t(44656),o=t(35497);let n={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,payloadRotationScheduleTime:"21:00",payloadRotationMaxRuntimeMinutes:60,payloadRotationIntervalHours:24,payloadRotationBatchSize:500,payloadRotationMaxBatches:20},d=[{value:60,label:"1 hour"},{value:120,label:"2 hours"},{value:180,label:"3 hours"},{value:240,label:"4 hours"},{value:360,label:"6 hours"},{value:480,label:"8 hours"},{value:720,label:"12 hours"},{value:0,label:"Until finished"}];function i({label:e,value:a,onChange:t,type:r="text",placeholder:l="",disabled:o=!1,min:n,max:d,step:c}){return(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:e}),(0,s.jsx)("input",{type:r,value:a||"",placeholder:l,disabled:o,min:n,max:d,step:c,onChange:e=>t(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 c({label:e,checked:a,onChange:t,disabled:r=!1}){return(0,s.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main",children:[(0,s.jsx)("input",{type:"checkbox",checked:!!a,disabled:r,onChange:e=>t(e.target.checked)}),e]})}function p(){let[e,a]=(0,r.useState)(n),[t,l]=(0,r.useState)(!1),[p,u]=(0,r.useState)(null),[m,x]=(0,r.useState)(null),[g,b]=(0,r.useState)(null),h=e=>a(a=>({...a,...e})),y=async()=>{l(!0),x(null);try{let e=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db"),t=await e.json();if(!e.ok)throw Error(t.error||"Failed to load config");a({...n,...t.config||{}})}catch(e){x(e.message||"Failed to load config")}finally{l(!1)}};(0,r.useEffect)(()=>{y()},[]);let f=async()=>{l(!0),x(null),u(null);try{let t=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:e})}),s=await t.json();if(!t.ok)throw Error(s.error||"Failed to save config");a({...n,...s.config||{}}),u("Saved")}catch(e){x(e.message||"Failed to save config")}finally{l(!1)}},v=async(a,t={})=>{if(!t.confirm||window.confirm("Delete all prompt_logs rows and their payloads older than the retention cutoff? Both the rows in prompt_logs (previews, model/provider/token metadata) and the referenced payloads will be removed. This cannot be undone.")){l(!0),x(null),u(null),a.includes("payload-rotation")&&b(null);try{let s=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===t.confirm})}),r=await s.text(),l={};try{l=r?JSON.parse(r):{}}catch{let e=r.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,200),a=504===s.status?"Manual rotation exceeded the request timeout. Use automatic rotation for long-running cleanup.":`HTTP ${s.status}: ${e||s.statusText||"non-JSON response"}`;throw Error(a)}if(!s.ok)throw Error(l.error||`HTTP ${s.status}`);a.includes("payload-rotation")&&b(l),u(l.message||l.init?.message||"OK")}catch(e){x(e.message||"Action failed")}finally{l(!1)}}},j="postgres"===e.type||"mysql"===e.type;return(0,s.jsx)(o.Zp,{title:"Request Logging",subtitle:"Control local request files and database-backed prompt logs",icon:"receipt_long",children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsxs)(o.Ex,{variant:e.fileLoggingEnabled?"success":"default",children:["Local files: ",e.fileLoggingEnabled?"Enabled":"Disabled"]}),(0,s.jsxs)(o.Ex,{variant:e.enabled?"success":"default",children:["Database: ",e.enabled?"Enabled":"Disabled"]})]}),(0,s.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,s.jsx)("div",{className:"grid gap-3 md:grid-cols-2",children:(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Database type"}),(0,s.jsxs)("select",{value:e.type,disabled:t,onChange:a=>{let t=a.target.value;h({type:t,port:"postgres"===t?e.port||"5432":"mysql"===t?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,s.jsx)("option",{value:"mysql",children:"MySQL / MariaDB"}),(0,s.jsx)("option",{value:"postgres",children:"PostgreSQL"})]})]})}),j&&(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,s.jsx)(i,{label:"Host",value:e.host,placeholder:"127.0.0.1",onChange:e=>h({host:e}),disabled:t}),(0,s.jsx)(i,{label:"Port",value:e.port,placeholder:"postgres"===e.type?"5432":"3306",onChange:e=>h({port:e}),disabled:t}),(0,s.jsx)(i,{label:"Database",value:e.database,placeholder:"bluerouter_logs",onChange:e=>h({database:e}),disabled:t}),(0,s.jsx)(i,{label:"Username",value:e.username,placeholder:"bluerouter",onChange:e=>h({username:e}),disabled:t}),(0,s.jsx)(i,{label:"Password",type:"password",value:e.password,placeholder:"Leave as ******** to keep existing password",onChange:e=>h({password:e}),disabled:t}),(0,s.jsxs)("div",{className:"flex flex-col justify-end gap-2",children:[(0,s.jsx)(c,{label:"Use SSL",checked:e.ssl,onChange:e=>h({ssl:e}),disabled:t}),(0,s.jsx)(c,{label:"Create database if missing",checked:e.createDatabase,onChange:e=>h({createDatabase:e}),disabled:t})]})]}),(0,s.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-surface/40 p-3 md:grid-cols-2",children:[(0,s.jsx)(c,{label:"Save request/response to local files",checked:e.fileLoggingEnabled,onChange:e=>h({fileLoggingEnabled:e}),disabled:t}),(0,s.jsx)(c,{label:"Save request/response to Prompt Log Database",checked:e.enabled,onChange:e=>h({enabled:e}),disabled:t}),(0,s.jsx)(c,{label:"Log client request JSON",checked:e.logClientRequest,onChange:e=>h({logClientRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log normalized/source request JSON",checked:e.logSourceRequest,onChange:e=>h({logSourceRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log target/provider request JSON",checked:e.logTargetRequest,onChange:e=>h({logTargetRequest:e}),disabled:t}),(0,s.jsx)(c,{label:"Log provider response JSON",checked:e.logProviderResponse,onChange:e=>h({logProviderResponse:e}),disabled:t}),(0,s.jsx)(c,{label:"Log errors",checked:e.logErrors,onChange:e=>h({logErrors:e}),disabled:t})]}),(0,s.jsxs)("div",{className:"rounded-lg border border-border bg-background p-3 text-xs text-text-muted",children:["Local files are written under ",(0,s.jsx)("code",{children:"DATA_DIR/logs/requests"}),". Disabling local files stops new request/response dump files; existing files are kept."]}),(0,s.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-surface/40 p-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Prompt log rotation"}),(0,s.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Deletes ",(0,s.jsx)("code",{children:"prompt_logs"})," rows AND their referenced payloads older than the retention cutoff. After a full run, only logs from the last N days remain — analytics/metadata for older rows are removed as well."]})]}),(0,s.jsx)(c,{label:"Enable automatic rotation",checked:e.payloadRotationEnabled,onChange:e=>h({payloadRotationEnabled:e}),disabled:t}),(0,s.jsxs)("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,s.jsx)(i,{label:"Keep logs for (days)",type:"number",min:1,max:3650,step:1,value:String(e.payloadRetentionDays||60),onChange:e=>h({payloadRetentionDays:Number(e)||60}),disabled:t}),(0,s.jsx)(i,{label:"Daily start time (Vietnam, UTC+7)",type:"time",step:60,value:String(e.payloadRotationScheduleTime||"21:00"),onChange:e=>h({payloadRotationScheduleTime:e||"21:00"}),disabled:t}),(0,s.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Maximum automatic run time"}),(0,s.jsx)("select",{value:String(Number(e.payloadRotationMaxRuntimeMinutes??60)),disabled:t,onChange:e=>h({payloadRotationMaxRuntimeMinutes:Number(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",children:d.map(e=>(0,s.jsx)("option",{value:String(e.value),children:e.label},e.value))})]}),(0,s.jsx)(i,{label:"Prompt-log rows per transaction",type:"number",min:50,max:5e3,step:50,value:String(e.payloadRotationBatchSize||500),onChange:e=>h({payloadRotationBatchSize:Number(e)||500}),disabled:t})]}),(0,s.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:["Automatic rotation runs once per day at the selected Vietnam time. It deletes expired ",(0,s.jsx)("code",{children:"prompt_logs"})," in small transactions and checks the run-time budget between cleanup passes. If the budget is reached, remaining rows continue at the next daily run. Choose ",(0,s.jsx)("strong",{children:"Until finished"})," to keep running until no expired rows remain. On MySQL, orphan ",(0,s.jsx)("code",{children:"prompt_log_payloads"})," rows are reaped as part of the cleanup."]}),(0,s.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:["Deletion is permanent: previews, model/provider/token metadata, and analytics for older rows go away too. Freed space stays inside InnoDB — ",(0,s.jsx)("code",{children:"OPTIMIZE TABLE"})," is needed to shrink the .ibd file (only during a maintenance window, with enough free disk)."]}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("preview-payload-rotation"),loading:t,children:"Preview expired logs"}),(0,s.jsx)(o.$n,{size:"sm",variant:"danger",onClick:()=>v("run-payload-rotation",{confirm:!0}),loading:t,children:"Delete expired logs now"})]}),g&&(0,s.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,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Cutoff:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:g.cutoff?new Date(g.cutoff).toLocaleString():"-"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.promptLogRowsUpdated?"Prompt-log rows past retention:":"Prompt-log rows deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:Number(g.promptLogRowsUpdated??g.promptLogRows??0).toLocaleString()})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.payloadRowsDeleted?"Payload rows to delete:":"Payload rows deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:Number(g.payloadRowsDeleted??g.payloadRowsPastRetention??0).toLocaleString()})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"text-text-muted",children:void 0===g.payloadBytesDeleted?"Estimated payload size:":"Payload size deleted:"})," ",(0,s.jsx)("span",{className:"text-text-main",children:function(e){let a=Number(e||0);if(!Number.isFinite(a)||a<=0)return"0 B";let t=["B","KB","MB","GB","TB"],s=Math.min(t.length-1,Math.floor(Math.log(a)/Math.log(1024))),r=a/1024**s;return`${r.toFixed(r>=10||0===s?1:2)} ${t[s]}`}(g.payloadBytesDeleted??g.payloadBytesPastRetention??g.referencedPayloadBytes)})]}),g.hasMore?(0,s.jsx)("div",{className:"md:col-span-2 lg:col-span-4 text-amber-600",children:"More expired rows remain. Automatic rotation will continue them at the next scheduled run."}):null]}),(0,s.jsx)("div",{className:"text-[11px] text-text-muted",children:"Save to apply the automatic schedule immediately. Preview uses the values currently shown. Manual deletion is a bounded maintenance pass; use automatic rotation for multi-hour cleanup."})]}),j&&(0,s.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,s.jsx)("code",{children:"mysql2"}),"; PostgreSQL requires ",(0,s.jsx)("code",{children:"pg"}),"."]}),p&&(0,s.jsx)("div",{className:"rounded-lg border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600",children:p}),m&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-500",children:m}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:y,loading:t,children:"Reload"}),(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("test"),loading:t,children:"Test connection"}),(0,s.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>v("init"),loading:t,children:"Initialize schema"}),(0,s.jsx)(o.$n,{size:"sm",onClick:f,loading:t,children:"Save"}),(0,s.jsx)(o.$n,{size:"sm",variant:"success",onClick:()=>v("save-and-init"),loading:t,children:"Save & initialize"})]})]})})}let u="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",m="image/svg+xml,image/png,image/webp,image/jpeg,image/gif",x=`${m},image/x-icon,image/vnd.microsoft.icon,.ico`;function g({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,s.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:t,children:r}){return(0,s.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,s.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),t&&(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:t})]})]}),r]})}function h({label:e,hint:a,children:t}){return(0,s.jsxs)("label",{className:"block",children:[(0,s.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),t,a&&(0,s.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function y(e){return(0,s.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 f(e){return(0,s.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:t,onChange:r,disabled:l}){return(0,s.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,s.jsx)("button",{type:"button",disabled:l,onClick:()=>r(!t),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${t?"bg-primary":"bg-border"}`,children:(0,s.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${t?"left-5":"left-0.5"}`})})]})}function j(){let[e,a]=(0,r.useState)({}),[t,o]=(0,r.useState)(!0),[n,d]=(0,r.useState)({current:"",new:"",confirm:""}),[i,c]=(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),[L,k]=(0,r.useState)("admin"),[U,P]=(0,r.useState)({type:"",message:""}),[M,R]=(0,r.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:u,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapAiGatewaysMonitorsGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[B,G]=(0,r.useState)({type:"",message:""}),[E,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),[V,H]=(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),[et,es]=(0,r.useState)({type:"",message:""}),er=(0,l.useBranding)(),[el,eo]=(0,r.useState)(""),[en,ed]=(0,r.useState)(""),[ei,ec]=(0,r.useState)(""),[ep,eu]=(0,r.useState)({type:"",message:""}),[em,ex]=(0,r.useState)(!1),[eg,eb]=(0,r.useState)(!1),[eh,ey]=(0,r.useState)(!1),[ef,ev]=(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"}),t=await e.json();a(t),k(t.localLoginUsername||"admin"),R({ldapEnabled:!0===t.ldapEnabled,ldapUrl:t.ldapUrl||"",ldapBindDn:t.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:t.ldapUserBaseDn||t.ldapBaseDn||"",ldapUserSearchFilter:t.ldapUserSearchFilter||u,ldapUserNameAttribute:t.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:t.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:t.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:t.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:t.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:t.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:t.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==t.ldapNestedGroups,ldapAllowedUsers:Array.isArray(t.ldapAllowedUsers)?t.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==t.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:t.ldapConnectTimeoutMs||8e3}),H({authMode:t.authMode||"password",oidcIssuerUrl:t.oidcIssuerUrl||"",oidcClientId:t.oidcClientId||"",oidcScopes:t.oidcScopes||"openid profile email",oidcLoginLabel:t.oidcLoginLabel||"Sign in with OIDC"}),eo(t.siteTitle||""),ed(t.siteShortName||""),ec(t.siteDescription||""),("oidc"===t.authMode||"both"===t.authMode)&&ea(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{o(!1)}};(0,r.useEffect)(()=>{eN()},[]);let eD=async e=>{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Failed to save settings");return a(e=>({...e,...s})),s},eC=async t=>{es({type:"",message:""});let s=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:t}));try{let e=await eD({sidebarAdvancedToolsVisible:t}),s=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:s})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:s}})),es({type:"success",message:s?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){a(e=>({...e,sidebarAdvancedToolsVisible:s})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:s}})),es({type:"error",message:e.message||"Failed to save sidebar setting."})}},eS=async e=>{e.preventDefault(),P({type:"",message:""});try{let e=await eD({localLoginUsername:L});k(e.localLoginUsername||L||"admin"),P({type:"success",message:"Local account name saved."})}catch(e){P({type:"error",message:e.message})}},eA=async e=>{if(e.preventDefault(),n.new!==n.confirm)return void c({type:"error",message:"Passwords do not match"});w(!0),c({type:"",message:""});try{await eD({currentPassword:n.current,newPassword:n.new}),c({type:"success",message:"Password updated successfully"}),d({current:"",new:"",confirm:""})}catch(e){c({type:"error",message:e.message||"Failed to update password"})}finally{w(!1)}},eL=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(),t=JSON.stringify(a,null,2),s=new Blob([t],{type:"application/json"}),r=URL.createObjectURL(s),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)}},ek=async e=>{let a=e.target.files?.[0];if(a){D(!0),S({type:"",message:""});try{let e=await a.text(),t=JSON.parse(e),s=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),r=await s.json().catch(()=>({}));if(!s.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(t=>({...t,[e]:a})),eP=async e=>{e?.preventDefault?.(),I(!0),G({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})),G({type:"success",message:"LDAP settings saved."})}catch(e){G({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{I(!1)}},eM=async()=>{T(!0),G({type:"",message:""});try{await eP();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?G({type:"success",message:a.message||"LDAP connection OK."}):G({type:"error",message:a.error||"LDAP test failed."})}catch(e){G({type:"error",message:e.message||"LDAP test failed."})}finally{T(!1)}},eR=async()=>{J(!0),G({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||[]),G({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):G({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){G({type:"error",message:e.message||"Failed to load LDAP users."})}finally{J(!1)}},eB=e=>{let a=String(e||"").trim();a&&R(e=>{let t=new Set(e.ldapAllowedUsers||[]);return t.has(a)?t.delete(a):t.add(a),{...e,ldapAllowedUsers:[...t]}})},eG=async(a=V.authMode||"password")=>{let t=V.oidcIssuerUrl.trim(),s=V.oidcClientId.trim(),r=V.oidcScopes.trim(),l=V.oidcLoginLabel.trim(),o=Q.trim();if("password"!==a&&(!t||!s||!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:t,oidcClientId:s,oidcScopes:r||"openid profile email",oidcLoginLabel:l||"Sign in with OIDC"};o&&(e.oidcClientSecret=o);let n=await eD(e);H({authMode:n.authMode||a,oidcIssuerUrl:n.oidcIssuerUrl||t,oidcClientId:n.oidcClientId||s,oidcScopes:n.oidcScopes||r||"openid profile email",oidcLoginLabel:n.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)}},eE=async(e,a)=>{if(!a)return;if(a.size>1048576)return void eu({type:"error",message:"File exceeds 1 MB limit."});let t="logo"===e?eb:ey;t(!0),eu({type:"",message:""});try{let t=new FormData;t.append("asset",e),t.append("file",a);let s=await fetch("/api/branding/upload",{method:"POST",body:t}),r=await s.json().catch(()=>({}));if(!s.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{t(!1)}},eI=async e=>{let a=e.target.files?.[0];await eE("logo",a),ej.current&&(ej.current.value="")},eO=async e=>{let a=e.target.files?.[0];await eE("favicon",a),ew.current&&(ew.current.value="")},eT=async e=>{e.preventDefault(),ex(!0),eu({type:"",message:""});try{await eD({siteTitle:el.trim(),siteShortName:en.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"}),t=await a.json().catch(()=>({}));if(!a.ok)throw Error(t.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()=>{ev(!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(""),ed(""),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{ev(!1)}};return t?(0,s.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,s.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,s.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure dashboard preferences, request logging, database backup, and authentication."})]}),(0,s.jsxs)(b,{icon:"view_sidebar",title:"Sidebar tools",desc:"Show or hide advanced dashboard tools to keep the sidebar clean.",children:[(0,s.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,s.jsx)(g,{status:et})]}),(0,s.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,s.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Logo"}),(0,s.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,s.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,s.jsx)("img",{src:er.logoUrl,alt:"Current logo",className:"max-h-full max-w-full object-contain"}):(0,s.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"hub"})}),(0,s.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,s.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the dashboard sidebar and login page. SVG, PNG, WebP, JPEG, GIF."}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)("button",{type:"button",disabled:eg,onClick:()=>ej.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eg?"Uploading...":er?.logoUrl?"Replace logo":"Upload logo"}),er?.logoUrl?(0,s.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,s.jsx)("input",{ref:ej,type:"file",accept:m,className:"hidden",onChange:eI})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Favicon"}),(0,s.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,s.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,s.jsx)("img",{src:er.faviconUrl,alt:"Current favicon",className:"max-h-10 max-w-10 object-contain"}):(0,s.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"public"})}),(0,s.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,s.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the browser tab. ICO, SVG, PNG, WebP, JPEG, GIF."}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.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,s.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,s.jsx)("input",{ref:ew,type:"file",accept:x,className:"hidden",onChange:eO})]})]})]}),(0,s.jsxs)("form",{onSubmit:eT,className:"space-y-3",children:[(0,s.jsx)(h,{label:"Site title",hint:"Shown in browser tab and login page. Leave blank for default.",children:(0,s.jsx)(y,{value:el,onChange:e=>eo(e.target.value),placeholder:"AI Router Gateway"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:en,onChange:e=>ed(e.target.value),placeholder:"Fujinet"})}),(0,s.jsx)(h,{label:"Description",hint:"Used for browser metadata.",children:(0,s.jsx)(f,{rows:3,value:ei,onChange:e=>ec(e.target.value),placeholder:"AI Infrastructure Management"})}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.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,s.jsx)("button",{type:"button",disabled:ef,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:ef?"Resetting...":"Reset to defaults"})]})]})]}),(0,s.jsx)(g,{status:ep})]}),(0,s.jsx)(b,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,s.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,s.jsxs)("form",{onSubmit:eS,className:"space-y-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,s.jsx)(h,{label:"Local username",children:(0,s.jsx)(y,{value:L,onChange:e=>k(e.target.value)})}),(0,s.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,s.jsx)(g,{status:U})]}),(0,s.jsxs)("form",{onSubmit:eA,className:"space-y-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,s.jsx)(h,{label:"Current password",children:(0,s.jsx)(y,{type:"password",value:n.current,onChange:e=>d({...n,current:e.target.value}),required:!0})}),(0,s.jsx)(h,{label:"New password",children:(0,s.jsx)(y,{type:"password",value:n.new,onChange:e=>d({...n,new:e.target.value}),required:!0})}),(0,s.jsx)(h,{label:"Confirm password",children:(0,s.jsx)(y,{type:"password",value:n.confirm,onChange:e=>d({...n,confirm:e.target.value}),required:!0})}),(0,s.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,s.jsx)(g,{status:i})]})]})}),(0,s.jsx)("div",{id:"request-logging",className:"scroll-mt-6",children:(0,s.jsx)(p,{})}),(0,s.jsxs)(b,{icon:"database",title:"Database Backup",desc:"Export or restore configuration, Linux Resource Monitor data, logo and favicon.",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,s.jsx)("button",{onClick:eL,disabled:N,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Backup"}),(0,s.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,s.jsx)("input",{ref:A,type:"file",accept:"application/json",className:"hidden",onChange:ek})]}),(0,s.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,s.jsx)(g,{status:C})]}),(0,s.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,s.jsxs)("form",{onSubmit:eP,className:"space-y-5",children:[(0,s.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,s.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,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"LDAP URL",children:(0,s.jsx)(y,{value:M.ldapUrl,onChange:e=>eU("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,s.jsx)(h,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,s.jsx)(y,{value:M.ldapUserBaseDn,onChange:e=>eU("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{label:"LDAP Bind DN",children:(0,s.jsx)(y,{value:M.ldapBindDn,onChange:e=>eU("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,s.jsx)(h,{label:"LDAP Bind Password",children:(0,s.jsx)(y,{type:"password",value:M.ldapBindPassword,onChange:e=>eU("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:M.ldapLoginAllowedGroupDn,onChange:e=>eU("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,s.jsx)(y,{value:M.ldapAdminGroupDn,onChange:e=>eU("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{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,s.jsx)(y,{value:M.ldapMonitorAdminGroupDn,onChange:e=>eU("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,s.jsx)(h,{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,s.jsx)(y,{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,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,s.jsx)(y,{value:M.ldapUserSearchFilter,onChange:e=>eU("ldapUserSearchFilter",e.target.value)})}),(0,s.jsx)(h,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,s.jsx)(v,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:M.ldapNestedGroups,onChange:e=>eU("ldapNestedGroups",e)})}),(0,s.jsx)(h,{label:"Username attribute",children:(0,s.jsx)(y,{value:M.ldapUserNameAttribute,onChange:e=>eU("ldapUserNameAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Display attribute",children:(0,s.jsx)(y,{value:M.ldapUserDisplayAttribute,onChange:e=>eU("ldapUserDisplayAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Email attribute",children:(0,s.jsx)(y,{value:M.ldapUserEmailAttribute,onChange:e=>eU("ldapUserEmailAttribute",e.target.value)})}),(0,s.jsx)(h,{label:"Connect timeout ms",children:(0,s.jsx)(y,{type:"number",value:M.ldapConnectTimeoutMs,onChange:e=>eU("ldapConnectTimeoutMs",e.target.value)})})]}),(0,s.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,s.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,s.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,s.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,s.jsx)(y,{value:F,onChange:e=>q(e.target.value),placeholder:"Search users..."}),(0,s.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,s.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,s.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,s.jsxs)("span",{children:[(0,s.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,s.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,s.jsxs)("div",{className:"mt-3",children:[(0,s.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,s.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:M.ldapAllowedUsers.map(e=>(0,s.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,s.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,s.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,s.jsx)("button",{type:"submit",disabled:E,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:E?"Saving...":"Save LDAP settings"})]}),(0,s.jsx)(g,{status:B})]})}),(0,s.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,s.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,s.jsxs)("div",{className:"space-y-4",children:[(0,s.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=V.authMode===e.value;return(0,s.jsxs)("button",{type:"button",onClick:()=>H(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,s.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,s.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,s.jsx)(h,{label:"Issuer URL",children:(0,s.jsx)(y,{value:V.oidcIssuerUrl,onChange:e=>H({...V,oidcIssuerUrl:e.target.value})})}),(0,s.jsx)(h,{label:"Client ID",children:(0,s.jsx)(y,{value:V.oidcClientId,onChange:e=>H({...V,oidcClientId:e.target.value})})}),(0,s.jsx)(h,{label:"Client Secret",children:(0,s.jsx)(y,{type:"password",value:Q,onChange:e=>K(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,s.jsx)(h,{label:"Scopes",children:(0,s.jsx)(y,{value:V.oidcScopes,onChange:e=>H({...V,oidcScopes:e.target.value})})}),(0,s.jsx)(h,{label:"Login label",children:(0,s.jsx)(y,{value:V.oidcLoginLabel,onChange:e=>H({...V,oidcLoginLabel:e.target.value})})})]}),(0,s.jsx)("button",{type:"button",onClick:()=>eG(),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,s.jsx)(g,{status:W})]})]})]})}}},e=>{e.O(0,[6373,3862,8500,9893,9959,7050,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7692],{},_=>{_.O(0,[9705,8441,3794,7358],()=>_(_.s=79705)),_N_E=_.O()}]);
|