@jheavenknows/bluerouter 5.2.17 → 5.2.19
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 +26 -26
- package/app/.next-cli-build/build-manifest.json +2 -2
- 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.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/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.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/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.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.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.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.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 +15 -15
- 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.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.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.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.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.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.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/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.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.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.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.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.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.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.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/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.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.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/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.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.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.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.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/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.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.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/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- 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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +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-tools/all-statuses/route.js.nft.json +1 -1
- 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.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js +121 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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 +5 -5
- 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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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/pricing/recalculate/route.js.nft.json +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.nft.json +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/route.js.nft.json +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.nft.json +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.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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- 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.nft.json +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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +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.nft.json +1 -1
- 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.nft.json +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 +1 -1
- 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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.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/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/_index.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 +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- 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 +2 -2
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- 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/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +2 -2
- 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 +8 -8
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- 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 +1 -1
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_index.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.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/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/_index.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 +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +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/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +6 -6
- 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 +2 -2
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +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 +26 -26
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/402.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/6328.js +1 -1
- package/app/.next-cli-build/server/chunks/6759.js +1 -1
- package/app/.next-cli-build/server/chunks/6811.js +1 -1
- package/app/.next-cli-build/server/chunks/689.js +1 -1
- package/app/.next-cli-build/server/chunks/7242.js +12 -1
- package/app/.next-cli-build/server/chunks/814.js +97 -0
- package/app/.next-cli-build/server/instrumentation.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.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/chunks/{5263-fa418d2c64257ce2.js → 5263-e36af1d5221fda83.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/local-ai-report/page-167ae2f35cbf97e2.js +18 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-d835e66683d8d489.js +1 -0
- package/app/.next-cli-build/static/css/7687f39ebae1ff66.css +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.54-to-5.1.55-5.1.55-20260721-212946 → upgrade-5.2.13-to-5.2.17-5.2.17-20260723-194835}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.55-to-5.1.56-5.1.56-20260721-214906 → upgrade-5.2.17-to-5.2.18-5.2.18-20260723-212148}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.53-to-5.1.54-5.1.54-20260721-204242 → upgrade-5.2.17-to-5.2.18-5.2.18-20260723-212149}/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/static/chunks/app/(dashboard)/dashboard/local-ai-report/page-9c1fb41255bbe9cb.js +0 -18
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-a2adbf34a91441f3.js +0 -1
- package/app/.next-cli-build/static/css/1365f140ecea0b6a.css +0 -1
- /package/app/.next-cli-build/static/{OVdfSYEKXta_2gTGCXxge → MvFJzlJx3ghMWTWrXL6eh}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{OVdfSYEKXta_2gTGCXxge → MvFJzlJx3ghMWTWrXL6eh}/_ssgManifest.js +0 -0
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7179],{14051:(e,t,r)=>{e.exports=r(34701)()},30238:(e,t,r)=>{"use strict";r.d(t,{default:()=>M});var a=r(95155),s=r(12115),n=r(94027);let l={normal:{label:"Ổn định",badge:"border-emerald-400/25 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300",dot:"bg-emerald-500"},warning:{label:"Cần theo d\xf5i",badge:"border-amber-400/25 bg-amber-500/10 text-amber-700 dark:text-amber-300",dot:"bg-amber-500"},critical:{label:"Nghi\xeam trọng",badge:"border-red-400/25 bg-red-500/10 text-red-700 dark:text-red-300",dot:"bg-red-500"},no_traffic:{label:"Kh\xf4ng c\xf3 lưu lượng",badge:"border-slate-400/25 bg-slate-500/10 text-slate-700 dark:text-slate-300",dot:"bg-slate-400"}},i={P0:"border-red-500/25 bg-red-500/10 text-red-700 dark:text-red-300",P1:"border-amber-500/25 bg-amber-500/10 text-amber-700 dark:text-amber-300",P2:"border-blue-500/25 bg-blue-500/10 text-blue-700 dark:text-blue-300"};function o(...e){return e.filter(Boolean).join(" ")}function d(e,t=0){return Number(e||0).toLocaleString("vi-VN",{maximumFractionDigits:t})}function c(e){return Intl.NumberFormat("vi-VN",{notation:"compact",maximumFractionDigits:1}).format(Number(e||0))}function x(e,t=1){return`${(100*Number(e||0)).toLocaleString("vi-VN",{maximumFractionDigits:t})}%`}function m(e){if(null==e||!Number.isFinite(Number(e)))return"-";let t=Number(e);return t>=1e3?`${(t/1e3).toLocaleString("vi-VN",{maximumFractionDigits:2})}s`:`${Math.round(t).toLocaleString("vi-VN")}ms`}function h(e){if(!e)return"-";let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toLocaleString("vi-VN",{timeZone:"Asia/Ho_Chi_Minh",day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1})}function u(e){let t=Number(e||0);if(!t)return"-";let r=["B","KiB","MiB","GiB","TiB"],a=Math.min(Math.floor(Math.log(t)/Math.log(1024)),r.length-1);return`${(t/1024**a).toLocaleString("vi-VN",{maximumFractionDigits:1})} ${r[a]}`}function p({status:e}){let t=l[e]||l.no_traffic;return(0,a.jsxs)("span",{className:o("inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs font-semibold",t.badge),children:[(0,a.jsx)("span",{className:o("h-2 w-2 rounded-full",t.dot)}),t.label]})}function b({value:e}){return(0,a.jsx)("span",{className:o("inline-flex rounded-full border px-2.5 py-1 text-[11px] font-bold",i[e]||i.P2),children:e||"P2"})}function g({eyebrow:e,title:t,description:r,icon:s}){return(0,a.jsxs)("div",{className:"mb-5 flex items-start justify-between gap-4",children:[(0,a.jsxs)("div",{children:[e?(0,a.jsx)("div",{className:"mb-1 text-[11px] font-bold uppercase tracking-[0.18em] text-primary",children:e}):null,(0,a.jsx)("h2",{className:"text-xl font-bold tracking-tight text-text-main",children:t}),r?(0,a.jsx)("p",{className:"mt-1 max-w-3xl text-sm leading-6 text-text-muted",children:r}):null]}),s?(0,a.jsx)("span",{className:"material-symbols-outlined rounded-2xl bg-primary/10 p-3 text-[24px] text-primary",children:s}):null]})}function v({children:e,className:t=""}){return(0,a.jsx)("section",{className:o("rounded-[28px] border border-border bg-surface p-5 shadow-sm md:p-7",t),children:e})}function f({icon:e,label:t,value:r,hint:s,tone:n="blue"}){let l={blue:"from-blue-500/15 to-cyan-500/5 text-blue-600 dark:text-blue-300",emerald:"from-emerald-500/15 to-teal-500/5 text-emerald-600 dark:text-emerald-300",violet:"from-violet-500/15 to-fuchsia-500/5 text-violet-600 dark:text-violet-300",amber:"from-amber-500/15 to-orange-500/5 text-amber-600 dark:text-amber-300",rose:"from-rose-500/15 to-red-500/5 text-rose-600 dark:text-rose-300",slate:"from-slate-500/15 to-slate-500/5 text-slate-600 dark:text-slate-300"}[n]||"from-blue-500/15 to-cyan-500/5 text-blue-600 dark:text-blue-300";return(0,a.jsxs)("div",{className:"relative overflow-hidden rounded-2xl border border-border bg-background p-4",children:[(0,a.jsx)("div",{className:o("absolute inset-0 bg-gradient-to-br opacity-80",l)}),(0,a.jsxs)("div",{className:"relative flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-xs font-semibold uppercase tracking-[0.12em] text-text-muted",children:t}),(0,a.jsx)("div",{className:"mt-2 text-2xl font-black tracking-tight text-text-main",children:r}),s?(0,a.jsx)("div",{className:"mt-1.5 text-xs text-text-muted",children:s}):null]}),(0,a.jsx)("span",{className:o("material-symbols-outlined rounded-xl bg-background/70 p-2 text-[21px]",l),children:e})]})]})}function y({value:e,max:t=100,label:r,tone:s="bg-primary"}){let n=Math.max(0,Math.min(100,Number(e||0)/t*100));return(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-1.5 flex items-center justify-between text-xs text-text-muted",children:[(0,a.jsx)("span",{children:r}),(0,a.jsx)("span",{children:d(e,1)})]}),(0,a.jsx)("div",{className:"h-2 overflow-hidden rounded-full bg-surface-2",children:(0,a.jsx)("div",{className:o("h-full rounded-full transition-all",s),style:{width:`${n}%`}})})]})}function j({rows:e=[]}){let t=Math.max(1,...e.map(e=>Number(e.requests||0)));return(0,a.jsx)("div",{className:"overflow-x-auto pb-2",children:(0,a.jsx)("div",{className:"flex min-w-[760px] items-end gap-3 pt-8",children:e.map(e=>{let r=Math.max(8,Number(e.requests||0)/t*180);return(0,a.jsxs)("div",{className:"group flex flex-1 flex-col items-center gap-2",children:[(0,a.jsxs)("div",{className:"relative flex h-[205px] w-full items-end justify-center",children:[(0,a.jsxs)("div",{className:"absolute bottom-full left-1/2 z-10 mb-2 hidden w-52 -translate-x-1/2 rounded-xl border border-border bg-background p-3 text-xs shadow-xl group-hover:block",children:[(0,a.jsx)("div",{className:"font-bold text-text-main",children:e.date}),(0,a.jsxs)("div",{className:"mt-1 text-text-muted",children:["Request: ",d(e.requests)]}),(0,a.jsxs)("div",{className:"text-text-muted",children:["Token: ",d(e.totalTokens)]}),(0,a.jsxs)("div",{className:"text-text-muted",children:["Lỗi: ",d(e.errors)," (",x(e.errorRate),")"]})]}),(0,a.jsx)("div",{className:"w-full max-w-[54px] rounded-t-2xl bg-gradient-to-t from-primary to-cyan-400 shadow-[0_10px_24px_rgba(59,130,246,0.2)] transition group-hover:brightness-110",style:{height:r}})]}),(0,a.jsxs)("div",{className:"text-center",children:[(0,a.jsx)("div",{className:"text-xs font-bold text-text-main",children:c(e.requests)}),(0,a.jsx)("div",{className:"text-[10px] text-text-muted",children:e.date.slice(5)})]})]},e.date)})})})}function N({model:e,rank:t}){return(0,a.jsxs)("article",{className:"rounded-2xl border border-border bg-background p-5",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"flex h-7 w-7 items-center justify-center rounded-lg bg-primary/10 text-xs font-black text-primary",children:["#",t]}),(0,a.jsx)("h3",{className:"truncate text-base font-bold text-text-main",children:e.model})]}),(0,a.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:[e.providerLabel||e.provider," \xb7 ",d(e.requests)," request \xb7 ",x(e.trafficShare)," traffic"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:o("rounded-full px-2.5 py-1 text-[11px] font-bold","high"===e.sampleQuality?"bg-emerald-500/10 text-emerald-600":"medium"===e.sampleQuality?"bg-amber-500/10 text-amber-600":"bg-slate-500/10 text-slate-500"),children:"high"===e.sampleQuality?"Mẫu tốt":"medium"===e.sampleQuality?"Mẫu vừa":"\xcdt mẫu"}),null!=e.score?(0,a.jsxs)("span",{className:"rounded-full bg-primary/10 px-2.5 py-1 text-[11px] font-bold text-primary",children:[d(e.score),"/100"]}):null]})]}),(0,a.jsxs)("div",{className:"mt-5 grid gap-3 sm:grid-cols-2 xl:grid-cols-4",children:[(0,a.jsx)(w,{label:"Success",value:x(1-e.errorRate,2)}),(0,a.jsx)(w,{label:"Latency p95",value:m(e.p95LatencyMs)}),(0,a.jsx)(w,{label:"TTFT p95",value:m(e.p95TtftMs)}),(0,a.jsx)(w,{label:"Output speed",value:null==e.outputTokensPerSecond?"-":`${d(e.outputTokensPerSecond,1)} tok/s`}),(0,a.jsx)(w,{label:"Input avg / p95",value:`${c(e.avgPromptTokens)} / ${c(e.p95PromptTokens)}`}),(0,a.jsx)(w,{label:"Cache share",value:x(e.cacheShare)}),(0,a.jsx)(w,{label:"Slow request",value:x(e.slowRequestRate)}),(0,a.jsx)(w,{label:"Context >=50k",value:x(e.hugeInputRate)})]}),(0,a.jsxs)("div",{className:"mt-5 grid gap-3 md:grid-cols-3",children:[(0,a.jsx)(y,{value:(1-e.errorRate)*100,label:"Tỷ lệ th\xe0nh c\xf4ng",tone:"bg-emerald-500"}),(0,a.jsx)(y,{value:100*e.cacheShare,label:"Cached input",tone:"bg-cyan-500"}),(0,a.jsx)(y,{value:Math.min(100,100*e.reasoningShare),label:"Reasoning/output",tone:"bg-violet-500"})]})]})}function w({label:e,value:t}){return(0,a.jsxs)("div",{className:"rounded-xl border border-border/70 bg-surface px-3 py-2.5",children:[(0,a.jsx)("div",{className:"text-[10px] font-bold uppercase tracking-[0.12em] text-text-muted",children:e}),(0,a.jsx)("div",{className:"mt-1 text-sm font-bold text-text-main",children:t})]})}function k({node:e}){return(0,a.jsxs)("article",{className:"rounded-2xl border border-border bg-background p-5",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-bold text-text-main",children:e.name}),(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:e.host||e.hostname||"Chưa c\xf3 host"})]}),(0,a.jsx)("span",{className:o("rounded-full px-2.5 py-1 text-[11px] font-bold",e.reachable?"bg-emerald-500/10 text-emerald-600":"bg-red-500/10 text-red-600"),children:e.reachable?"Online snapshot":"No telemetry"})]}),e.reachable?(0,a.jsxs)("div",{className:"mt-5 space-y-4",children:[(0,a.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,a.jsx)(w,{label:"CPU",value:`${e.cpu?.model||"-"} \xb7 ${d(e.cpu?.cores)} cores`}),(0,a.jsx)(w,{label:"RAM",value:`${u(e.memory?.usedBytes)} / ${u(e.memory?.totalBytes)}`})]}),(0,a.jsx)(y,{value:e.cpu?.usagePercent||0,label:"CPU snapshot (%)",tone:"bg-blue-500"}),(0,a.jsx)(y,{value:e.memory?.usagePercent||0,label:"RAM snapshot (%)",tone:"bg-violet-500"}),(e.gpus||[]).map(t=>(0,a.jsxs)("div",{className:"rounded-xl border border-border/70 bg-surface p-4",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,a.jsxs)("div",{className:"font-semibold text-text-main",children:["GPU ",t.index," \xb7 ",t.name]}),(0,a.jsxs)("div",{className:"text-xs text-text-muted",children:[null==t.temperatureC?"-":`${d(t.temperatureC,0)}\xb0C`," \xb7 ",null==t.powerDrawW?"-":`${d(t.powerDrawW)}W`]})]}),(0,a.jsxs)("div",{className:"mt-3 grid gap-3 sm:grid-cols-2",children:[(0,a.jsx)(y,{value:t.usagePercent||0,label:"GPU utilization (%)",tone:"bg-emerald-500"}),(0,a.jsx)(y,{value:t.memoryUsagePercent||0,label:`VRAM ${d((t.memoryUsedMb||0)/1024,1)} / ${d((t.memoryTotalMb||0)/1024,1)} GiB`,tone:"bg-cyan-500"})]})]},`${e.id}-${t.index}`)),(0,a.jsxs)("p",{className:"text-[11px] text-text-muted",children:["Snapshot: ",h(e.statusAt)," \xb7 OS: ",e.os||"-"," \xb7 Kernel: ",e.kernel||"-"]})]}):(0,a.jsx)("div",{className:"mt-4 rounded-xl border border-red-500/15 bg-red-500/5 p-3 text-sm text-red-600 dark:text-red-300",children:e.error||"Resource Monitor chưa c\xf3 snapshot cho node n\xe0y."})]})}function $(e){return String(e??"").replace(/[&<>'"]/g,e=>({"&":"&","<":"<",">":">","'":"'",'"':"""})[e])}function T(e,t){return(e||[]).map(t).join("")}function C(e){let t=l[e.status]?.label||e.status,r=[["Request",d(e.overview?.requests)],["Success rate",x(e.overview?.successRate,2)],["Total tokens",d(e.overview?.totalTokens)],["Latency p95",m(e.experience?.p95LatencyMs)],["TTFT p95",m(e.experience?.p95TtftMs)],["Operational score",null==e.score?"N/A":`${e.score}/100`]];return`<!doctype html>
|
|
2
|
-
<html lang="vi"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Local AI Report - ${$(e.generatedAt?.slice(0,10))}</title>
|
|
3
|
-
<style>
|
|
4
|
-
:root{--ink:#102038;--muted:#607087;--line:#dbe5f0;--paper:#f4f7fb;--card:#fff;--blue:#2563eb;--cyan:#06b6d4;--green:#059669;--amber:#d97706;--red:#dc2626}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:14px/1.55 Inter,Segoe UI,Arial,sans-serif}.page{max-width:1240px;margin:auto;padding:36px}.hero{padding:38px;border-radius:28px;color:white;background:radial-gradient(circle at 90% 10%,rgba(34,211,238,.38),transparent 35%),linear-gradient(135deg,#0f2d58,#1d4ed8 65%,#0891b2);box-shadow:0 24px 70px rgba(29,78,216,.22)}.hero h1{margin:10px 0 8px;font-size:34px}.eyebrow{text-transform:uppercase;letter-spacing:.18em;font-weight:800;font-size:11px;opacity:.78}.meta{opacity:.8}.badge{display:inline-block;padding:6px 12px;border-radius:999px;background:rgba(255,255,255,.16);font-weight:800}.grid{display:grid;gap:16px}.kpis{grid-template-columns:repeat(3,1fr);margin:22px 0}.card{background:var(--card);border:1px solid var(--line);border-radius:22px;padding:22px;box-shadow:0 8px 30px rgba(16,32,56,.05);break-inside:avoid}.card h2{margin:0 0 14px;font-size:20px}.card h3{margin:0 0 6px;font-size:15px}.kpi strong{display:block;font-size:25px;margin-top:6px}.muted{color:var(--muted)}.section{margin-top:20px}.two{grid-template-columns:1fr 1fr}.three{grid-template-columns:repeat(3,1fr)}table{width:100%;border-collapse:collapse;font-size:12px}th,td{padding:10px 8px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}th{text-transform:uppercase;letter-spacing:.08em;font-size:10px;color:var(--muted)}ul{padding-left:20px}.priority{font-weight:900}.P0{color:var(--red)}.P1{color:var(--amber)}.P2{color:var(--blue)}.score{font-size:50px;font-weight:900}.footer{margin:28px 0 10px;text-align:center;color:var(--muted);font-size:11px}@media(max-width:800px){.page{padding:16px}.kpis,.two,.three{grid-template-columns:1fr}.hero h1{font-size:26px}}@media print{body{background:white}.page{max-width:none;padding:0}.hero,.card{box-shadow:none}.section{page-break-inside:auto}}
|
|
5
|
-
</style></head><body><main class="page">
|
|
6
|
-
<header class="hero"><div class="eyebrow">BlueRouter \xb7 Local AI Operations</div><h1>B\xe1o c\xe1o hoạt động Local AI — 7 ng\xe0y gần nhất</h1><div class="meta">${$(h(e.range?.startIso))} → ${$(h(e.range?.endIso))} \xb7 Asia/Ho_Chi_Minh</div><p><span class="badge">${$(t)}</span> Confidence: ${$(e.confidence)} Generated: ${$(h(e.generatedAt))}</p></header>
|
|
7
|
-
<section class="grid kpis">${T(r,([e,t])=>`<div class="card kpi"><span class="muted">${$(e)}</span><strong>${$(t)}</strong></div>`)}</section>
|
|
8
|
-
<section class="card section"><h2>T\xf3m tắt điều h\xe0nh</h2><ul>${T(e.narrative?.executiveSummary,e=>`<li>${$(e)}</li>`)}</ul></section>
|
|
9
|
-
<section class="grid two section"><div class="card"><h2>Điểm mạnh</h2>${T(e.narrative?.strengths,e=>`<div><h3>${$(e.title)}</h3><p>${$(e.evidence)}</p></div>`)||'<p class="muted">Chưa đủ dữ liệu.</p>'}</div><div class="card"><h2>Điểm yếu & rủi ro</h2>${T(e.narrative?.weaknesses,e=>`<div><h3><span class="priority ${$(e.priority)}">${$(e.priority)}</span> ${$(e.title)}</h3><p>${$(e.evidence)} ${$(e.impact)}</p></div>`)||'<p class="muted">Chưa ph\xe1t hiện điểm yếu nổi bật.</p>'}</div></section>
|
|
10
|
-
<section class="card section"><h2>Hiệu năng theo model</h2><table><thead><tr><th>Model</th><th>Requests</th><th>Success</th><th>Latency p95</th><th>TTFT p95</th><th>Tok/s</th><th>Cache</th><th>Context >=50k</th></tr></thead><tbody>${T(e.models,e=>`<tr><td><strong>${$(e.model)}</strong><br><span class="muted">${$(e.providerLabel)}</span></td><td>${$(d(e.requests))}</td><td>${$(x(1-e.errorRate,2))}</td><td>${$(m(e.p95LatencyMs))}</td><td>${$(m(e.p95TtftMs))}</td><td>${$(null==e.outputTokensPerSecond?"-":d(e.outputTokensPerSecond,1))}</td><td>${$(x(e.cacheShare))}</td><td>${$(x(e.hugeInputRate))}</td></tr>`)}</tbody></table></section>
|
|
11
|
-
<section class="card section"><h2>Xu hướng theo ng\xe0y</h2><table><thead><tr><th>Ng\xe0y</th><th>Request</th><th>Success</th><th>Error</th><th>Total tokens</th><th>Cached</th></tr></thead><tbody>${T(e.daily,e=>`<tr><td>${$(e.date)}</td><td>${$(d(e.requests))}</td><td>${$(d(e.success))}</td><td>${$(`${d(e.errors)} (${x(e.errorRate)})`)}</td><td>${$(d(e.totalTokens))}</td><td>${$(d(e.cachedTokens))}</td></tr>`)}</tbody></table></section>
|
|
12
|
-
<section class="grid two section"><div class="card"><h2>Context, cache & thinking</h2><table><tbody><tr><th>Cached / input</th><td>${$(x(e.overview?.cacheShare))}</td></tr><tr><th>Reasoning / output</th><td>${$(x(e.overview?.reasoningShare))}</td></tr><tr><th>Context >=50k</th><td>${$(x(e.contextAndThinking?.largeContext?.gte50kRate))}</td></tr><tr><th>Thinking auto-off</th><td>${$(x(e.contextAndThinking?.thinking?.autoOffRate))}</td></tr></tbody></table></div><div class="card"><h2>Ph\xe2n loại lỗi</h2><table><tbody><tr><th>Gateway</th><td>${$(d(e.errors?.summary?.gateway))}</td></tr><tr><th>Upstream</th><td>${$(d(e.errors?.summary?.upstream))}</td></tr><tr><th>Client</th><td>${$(d(e.errors?.summary?.client))}</td></tr><tr><th>Rate limit</th><td>${$(d(e.errors?.summary?.rateLimit))}</td></tr></tbody></table></div></section>
|
|
13
|
-
<section class="card section"><h2>Top lỗi gateway / upstream</h2><table><thead><tr><th>Owner / lỗi</th><th>Model</th><th>Endpoint</th><th>Count</th></tr></thead><tbody>${T(e.errors?.topServerErrors,e=>`<tr><td><strong>${$(`${e.faultOwner||"unknown"} \xb7 ${e.errorType||e.status||"error"}`)}</strong><br><span class="muted">${$(e.sample||e.errorCode||"-")}</span></td><td>${$(e.model||"-")}</td><td>${$(e.endpoint||"-")}</td><td>${$(d(e.requests))}</td></tr>`)||'<tr><td colspan="4" class="muted">Kh\xf4ng c\xf3 lỗi gateway/upstream đ\xe1ng ch\xfa \xfd.</td></tr>'}</tbody></table></section>
|
|
14
|
-
<section class="grid two section"><div class="card"><h2>Top API keys theo token</h2><table><thead><tr><th>API key</th><th>Owner</th><th>Token</th><th>Share</th></tr></thead><tbody>${T((e.workload?.apiKeys||[]).slice(0,10),e=>`<tr><td>${$(e.label)}</td><td>${$(e.ownerUser||e.fingerprint||"-")}</td><td>${$(d(e.totalTokens))}</td><td>${$(x(e.tokenShare))}</td></tr>`)}</tbody></table></div><div class="card"><h2>Top endpoints</h2><table><thead><tr><th>Endpoint</th><th>Request</th><th>Error</th></tr></thead><tbody>${T((e.workload?.endpoints||[]).slice(0,10),e=>`<tr><td>${$(e.label)}</td><td>${$(d(e.requests))}</td><td>${$(x(e.errorRate))}</td></tr>`)}</tbody></table></div></section>
|
|
15
|
-
<section class="grid two section"><div class="card"><h2>Đ\xe1nh gi\xe1 hạ tầng</h2><p>${$(e.narrative?.infrastructureAssessment)}</p>${T(e.hardware,e=>`<div><h3>${$(e.name)} \xb7 ${$(e.reachable?"Snapshot available":"No telemetry")}</h3><p class="muted">CPU ${$(e.cpu?.model||"-")} \xb7 ${$(d(e.cpu?.cores))} cores \xb7 RAM ${$(u(e.memory?.totalBytes))} \xb7 GPU ${$((e.gpus||[]).map(e=>`${e.name} ${(e.memoryTotalMb/1024).toFixed(1)} GiB`).join(", ")||"-")}</p></div>`)}</div><div class="card"><h2>Dự b\xe1o ngắn hạn</h2><p>${$(e.narrative?.forecast)}</p><h3>Giới hạn dữ liệu</h3><ul>${T(e.dataQuality,e=>`<li>${$(e)}</li>`)}</ul></div></section>
|
|
16
|
-
<section class="card section"><h2>Kế hoạch h\xe0nh động</h2><table><thead><tr><th>Priority</th><th>Action</th><th>Owner</th><th>Validation metric</th></tr></thead><tbody>${T(e.narrative?.actions,e=>`<tr><td class="priority ${$(e.priority)}">${$(e.priority)}</td><td>${$(e.action)}</td><td>${$(e.owner)}</td><td>${$(e.validationMetric)}</td></tr>`)}</tbody></table></section>
|
|
17
|
-
<div class="footer">BlueRouter Local AI Report \xb7 Internal operational document \xb7 ${$(e.id)}</div>
|
|
18
|
-
</main></body></html>`}function A(e,t,r){let a=new Blob([e],{type:t}),s=URL.createObjectURL(a),n=document.createElement("a");n.href=s,n.download=r,document.body.appendChild(n),n.click(),n.remove(),URL.revokeObjectURL(s)}function M(){let{isAdmin:e,loading:t}=(0,n.s)(),[r,i]=(0,s.useState)(null),[u,$]=(0,s.useState)([]),[T,M]=(0,s.useState)(""),[S,R]=(0,s.useState)(!1),[P,_]=(0,s.useState)(!0),[L,I]=(0,s.useState)(!1),[O,q]=(0,s.useState)(""),[E,U]=(0,s.useState)(!1);(0,s.useEffect)(()=>{if(t||!e)return;let r=!1;return(async()=>{_(!0),q("");try{let[e,t]=await Promise.all([fetch("/api/dashboard/local-ai-report",{cache:"no-store"}),fetch("/api/dashboard/analytics/ai-models",{cache:"no-store"})]),a=await e.json().catch(()=>({})),s=await t.json().catch(()=>({}));if(!e.ok)throw Error(a.error||"Kh\xf4ng tải được b\xe1o c\xe1o");if(r)return;let n=s.options||[];i(a.report||null),R(!0===a.standby),$(n),M(a.selectedModel&&n.some(e=>e.value===a.selectedModel)?a.selectedModel:n[0]?.value||"")}catch(e){r||q(e?.message||"Kh\xf4ng tải được b\xe1o c\xe1o")}finally{r||_(!1)}})(),()=>{r=!0}},[t,e]);let K=(0,s.useCallback)(e=>{M(e),fetch("/api/dashboard/analytics/analyze",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e})}).catch(()=>{})},[]),B=(0,s.useCallback)(async()=>{I(!0),q("");try{let e=T.indexOf("::"),t=e>=0?T.slice(0,e):"",r=e>=0?T.slice(e+2):"",a=await fetch("/api/dashboard/local-ai-report",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:t,model:r})}),s=await a.json().catch(()=>({}));if(!a.ok)throw Error(s.error||"Kh\xf4ng thể tạo b\xe1o c\xe1o");i(s.report||null)}catch(e){q(e?.message||"Kh\xf4ng thể tạo b\xe1o c\xe1o")}finally{I(!1)}},[T]),F=(0,s.useCallback)(()=>{r&&A(C(r),"text/html;charset=utf-8",`local-ai-report-7d-${r.generatedAt.slice(0,10)}.html`)},[r]),G=(0,s.useCallback)(()=>{r&&A(JSON.stringify(r,null,2),"application/json;charset=utf-8",`local-ai-report-7d-${r.generatedAt.slice(0,10)}.json`)},[r]),z=(0,s.useCallback)(()=>{if(!r)return;let e=new Blob([C(r)],{type:"text/html;charset=utf-8"}),t=URL.createObjectURL(e),a=window.open(t,"_blank");if(!a){URL.revokeObjectURL(t),q("Tr\xecnh duyệt đ\xe3 chặn cửa sổ in. H\xe3y cho ph\xe9p pop-up hoặc tải file HTML.");return}try{a.opener=null}catch{}a.addEventListener("load",()=>{a.focus(),a.print(),setTimeout(()=>URL.revokeObjectURL(t),3e4)},{once:!0})},[r]),D=(0,s.useCallback)(async()=>{if(!r)return;let e=["B\xc1O C\xc1O LOCAL AI — 7 NG\xc0Y GẦN NHẤT",`Trạng th\xe1i: ${l[r.status]?.label||r.status}`,`Điểm vận h\xe0nh: ${null==r.score?"N/A":`${r.score}/100`}`,"",...(r.narrative?.executiveSummary||[]).map(e=>`- ${e}`)].join("\n");await navigator.clipboard.writeText(e),U(!0),setTimeout(()=>U(!1),1800)},[r]),V=(0,s.useMemo)(()=>r?.daily?.length?[...r.daily].sort((e,t)=>t.requests-e.requests)[0]:null,[r]);return t||P?(0,a.jsx)("div",{className:"flex min-h-[60vh] items-center justify-center",children:(0,a.jsxs)("div",{className:"flex items-center gap-3 rounded-2xl border border-border bg-surface px-5 py-4 text-sm text-text-muted shadow-sm",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),"Đang chuẩn bị Local AI Report..."]})}):e?(0,a.jsxs)("div",{className:"mx-auto max-w-[1500px] space-y-6 pb-12",children:[(0,a.jsxs)("header",{className:"relative overflow-hidden rounded-[34px] border border-blue-400/20 bg-gradient-to-br from-[#071b35] via-[#123d78] to-[#087f9c] p-6 text-white shadow-[0_28px_90px_rgba(30,86,160,0.25)] md:p-9",children:[(0,a.jsx)("div",{className:"absolute -right-24 -top-24 h-72 w-72 rounded-full bg-cyan-300/20 blur-3xl"}),(0,a.jsx)("div",{className:"absolute bottom-0 left-1/3 h-44 w-72 rounded-full bg-blue-300/15 blur-3xl"}),(0,a.jsxs)("div",{className:"relative grid gap-8 xl:grid-cols-[minmax(0,1fr)_430px] xl:items-end",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-[11px] font-black uppercase tracking-[0.24em] text-cyan-200",children:"BlueRouter \xb7 AI Operations Intelligence"}),(0,a.jsx)("h1",{className:"mt-3 max-w-4xl text-3xl font-black tracking-tight md:text-5xl",children:"B\xe1o c\xe1o hoạt động Local AI"}),(0,a.jsx)("p",{className:"mt-3 max-w-3xl text-sm leading-6 text-blue-100 md:text-base",children:"Bức tranh vận h\xe0nh local vLLM trong 7 ng\xe0y gần nhất: lưu lượng, hiệu năng, context, cache, lỗi, tải theo model v\xe0 snapshot hạ tầng."}),(0,a.jsxs)("div",{className:"mt-5 flex flex-wrap items-center gap-3",children:[r?(0,a.jsx)(p,{status:r.status}):(0,a.jsx)("span",{className:"rounded-full border border-white/15 bg-white/10 px-3 py-1.5 text-xs font-semibold",children:"Chưa c\xf3 b\xe1o c\xe1o"}),r?(0,a.jsxs)("span",{className:"rounded-full border border-white/15 bg-white/10 px-3 py-1.5 text-xs font-semibold",children:["Confidence: ",r.confidence]}):null,r?.generatedAt?(0,a.jsxs)("span",{className:"text-xs text-blue-100",children:["Cập nhật ",h(r.generatedAt)]}):null]})]}),(0,a.jsxs)("div",{className:"rounded-2xl border border-white/15 bg-white/10 p-4 backdrop-blur-xl",children:[(0,a.jsx)("label",{className:"text-[11px] font-bold uppercase tracking-[0.14em] text-blue-100",children:"AI model viết nhận định"}),(0,a.jsxs)("select",{value:T,onChange:e=>K(e.target.value),className:"mt-2 h-11 w-full rounded-xl border border-white/20 bg-[#0b2b53] px-3 text-sm text-white outline-none focus:border-cyan-300",children:[u.length?null:(0,a.jsx)("option",{value:"",children:"Kh\xf4ng c\xf3 AI model khả dụng"}),u.map(e=>(0,a.jsx)("option",{value:e.value,children:e.label},e.value))]}),(0,a.jsxs)("button",{type:"button",onClick:B,disabled:L||S,className:"mt-3 flex h-11 w-full items-center justify-center gap-2 rounded-xl bg-white font-bold text-[#123d78] shadow-lg transition hover:-translate-y-0.5 hover:bg-cyan-50 disabled:cursor-not-allowed disabled:opacity-60",children:[(0,a.jsx)("span",{className:o("material-symbols-outlined text-[20px]",L&&"animate-spin"),children:L?"progress_activity":"auto_awesome"}),L?"Đang ph\xe2n t\xedch dữ liệu 7 ng\xe0y...":"Tạo b\xe1o c\xe1o mới"]}),S?(0,a.jsx)("p",{className:"mt-2 text-xs text-amber-200",children:"Standby chỉ hiển thị report được đồng bộ từ Master."}):null]})]})]}),O?(0,a.jsxs)("div",{className:"flex items-start gap-3 rounded-2xl border border-red-500/20 bg-red-500/10 p-4 text-sm text-red-700 dark:text-red-300",children:[(0,a.jsx)("span",{className:"material-symbols-outlined",children:"error"}),(0,a.jsx)("div",{children:O})]}):null,r?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-border bg-surface px-4 py-3 shadow-sm",children:[(0,a.jsxs)("div",{className:"text-xs text-text-muted",children:["Phạm vi: ",(0,a.jsxs)("span",{className:"font-semibold text-text-main",children:[h(r.range?.startIso)," → ",h(r.range?.endIso)]})," \xb7 Asia/Ho_Chi_Minh \xb7 ",r.providers?.length||0," local provider"]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsxs)("button",{type:"button",onClick:D,className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background px-3 py-2 text-xs font-semibold text-text-main hover:border-primary/40",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"content_copy"}),E?"Đ\xe3 sao ch\xe9p":"Copy summary"]}),(0,a.jsxs)("button",{type:"button",onClick:G,className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background px-3 py-2 text-xs font-semibold text-text-main hover:border-primary/40",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"data_object"}),"JSON"]}),(0,a.jsxs)("button",{type:"button",onClick:F,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-3 py-2 text-xs font-bold text-white shadow-sm hover:brightness-110",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"download"}),"Tải HTML full"]}),(0,a.jsxs)("button",{type:"button",onClick:z,className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background px-3 py-2 text-xs font-semibold text-text-main hover:border-primary/40",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"print"}),"In / PDF"]})]})]}),(0,a.jsxs)("section",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-6",children:[(0,a.jsx)(f,{icon:"conversion_path",label:"Requests",value:c(r.overview?.requests),hint:`${c(r.overview?.totalTokens)} tokens`}),(0,a.jsx)(f,{icon:"verified",label:"Success rate",value:x(r.overview?.successRate,2),hint:`${d(r.overview?.errors)} usage errors`,tone:"emerald"}),(0,a.jsx)(f,{icon:"speed",label:"Latency p95",value:m(r.experience?.p95LatencyMs),hint:`p50 ${m(r.experience?.p50LatencyMs)}`,tone:"violet"}),(0,a.jsx)(f,{icon:"bolt",label:"TTFT p95",value:m(r.experience?.p95TtftMs),hint:`${d(r.experience?.outputTokensPerSecond,1)} tok/s`,tone:"amber"}),(0,a.jsx)(f,{icon:"cached",label:"Cached input",value:x(r.overview?.cacheShare),hint:`${c(r.overview?.cachedTokens)} tokens`,tone:"blue"}),(0,a.jsx)(f,{icon:"health_metrics",label:"Operational score",value:null==r.score?"N/A":`${r.score}/100`,hint:`Confidence ${r.confidence}`,tone:"critical"===r.status?"rose":"warning"===r.status?"amber":"emerald"})]}),(0,a.jsxs)(v,{className:"overflow-hidden bg-gradient-to-br from-surface to-primary/[0.035]",children:[(0,a.jsx)(g,{eyebrow:"Executive Brief",title:"T\xf3m tắt điều h\xe0nh",description:"Những t\xedn hiệu quan trọng nhất, kết hợp analytics local-only, lỗi v\xe0 snapshot hạ tầng.",icon:"summarize"}),(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,1fr)_340px]",children:[(0,a.jsx)("div",{className:"space-y-3",children:(r.narrative?.executiveSummary||[]).map((e,t)=>(0,a.jsxs)("div",{className:"flex gap-3 rounded-2xl border border-border bg-background p-4",children:[(0,a.jsx)("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-xs font-black text-primary",children:t+1}),(0,a.jsx)("p",{className:"text-sm leading-6 text-text-main",children:e})]},`${t}-${e}`))}),(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-5",children:[(0,a.jsx)("div",{className:"text-xs font-bold uppercase tracking-[0.14em] text-text-muted",children:"Điểm vận h\xe0nh"}),(0,a.jsx)("div",{className:"mt-2 text-6xl font-black tracking-tighter text-text-main",children:null==r.score?"—":r.score}),(0,a.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Thang 100 \xb7 heuristic SRE từ error, p95 latency, TTFT v\xe0 snapshot telemetry"}),(0,a.jsx)("div",{className:"mt-5 space-y-2",children:(r.operationalSignals||[]).slice(0,5).map(e=>(0,a.jsxs)("div",{className:"flex gap-2 text-xs leading-5 text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mt-0.5 text-[16px] text-primary",children:"arrow_right"}),(0,a.jsx)("span",{children:e})]},e))})]})]})]}),(0,a.jsxs)("div",{className:"grid gap-6 xl:grid-cols-[minmax(0,1.35fr)_minmax(360px,0.65fr)]",children:[(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Traffic",title:"Xu hướng 7 ng\xe0y",description:"Request theo ng\xe0y ở m\xfai giờ Asia/Ho_Chi_Minh; hover từng cột để xem token v\xe0 lỗi.",icon:"finance_mode"}),(0,a.jsx)(j,{rows:r.daily||[]}),V?(0,a.jsxs)("div",{className:"mt-4 grid gap-3 sm:grid-cols-3",children:[(0,a.jsx)(w,{label:"Peak day",value:`${V.date} \xb7 ${d(V.requests)} req`}),(0,a.jsx)(w,{label:"Peak error rate",value:x(V.errorRate)}),(0,a.jsx)(w,{label:"Peak tokens",value:c(V.totalTokens)})]}):null]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Context Economics",title:"Token, cache & thinking",description:"Ph\xe2n t\xedch theo usage do provider b\xe1o; cached token kh\xf4ng mặc định l\xe0 GPU KV cache.",icon:"memory"}),(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)(y,{value:r.overview?.cacheShare*100,label:"Cached / input (%)",tone:"bg-cyan-500"}),(0,a.jsx)(y,{value:Math.min(100,r.overview?.reasoningShare*100),label:"Reasoning / output (%)",tone:"bg-violet-500"}),(0,a.jsx)(y,{value:100*(r.contextAndThinking?.largeContext?.gte50kRate||0),label:"Request context >=50k (%)",tone:"bg-amber-500"}),(0,a.jsx)(y,{value:100*(r.contextAndThinking?.thinking?.autoOffRate||0),label:"Thinking auto-off (%)",tone:"bg-rose-500"})]}),(0,a.jsxs)("div",{className:"mt-5 grid gap-3 sm:grid-cols-2 xl:grid-cols-1 2xl:grid-cols-2",children:[(0,a.jsx)(w,{label:"Input tokens",value:c(r.overview?.promptTokens)}),(0,a.jsx)(w,{label:"Output tokens",value:c(r.overview?.completionTokens)}),(0,a.jsx)(w,{label:"Avg token/request",value:c(r.overview?.averageTokensPerRequest)}),(0,a.jsx)(w,{label:"Extreme context",value:x(r.experience?.extremeInputRate)})]})]})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Model Intelligence",title:"Đ\xe1nh gi\xe1 theo từng local model",description:"So s\xe1nh trong bối cảnh workload thực tế. Model \xedt hơn 20 request được đ\xe1nh dấu \xedt mẫu.",icon:"model_training"}),(0,a.jsxs)("div",{className:"grid gap-4 xl:grid-cols-2",children:[(r.models||[]).map((e,t)=>(0,a.jsx)(N,{model:e,rank:t+1},e.key)),r.models?.length?null:(0,a.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-10 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 model local n\xe0o ph\xe1t sinh traffic trong khoảng b\xe1o c\xe1o."})]})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Infrastructure Snapshot",title:"Hạ tầng Local AI",description:"Inventory v\xe0 snapshot tại thời điểm tạo b\xe1o c\xe1o. Kh\xf4ng được diễn giải th\xe0nh lịch sử GPU 7 ng\xe0y.",icon:"developer_board"}),(0,a.jsxs)("div",{className:"grid gap-4 xl:grid-cols-2",children:[(r.hardware||[]).map(e=>(0,a.jsx)(k,{node:e},e.id)),r.hardware?.length?null:(0,a.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-10 text-center text-sm text-text-muted",children:"Chưa cấu h\xecnh Linux Resources."})]}),(0,a.jsxs)("div",{className:"mt-5 rounded-2xl border border-primary/15 bg-primary/5 p-4 text-sm leading-6 text-text-muted",children:[(0,a.jsx)("strong",{className:"text-text-main",children:"Nhận định hạ tầng:"})," ",r.narrative?.infrastructureAssessment]})]}),(0,a.jsxs)("div",{className:"grid gap-6 xl:grid-cols-2",children:[(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Strengths",title:"Điểm mạnh",icon:"workspace_premium"}),(0,a.jsx)("div",{className:"space-y-3",children:(r.narrative?.strengths||[]).map((e,t)=>(0,a.jsxs)("div",{className:"rounded-2xl border border-emerald-500/15 bg-emerald-500/5 p-4",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsx)("h3",{className:"font-bold text-text-main",children:e.title}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-500/10 px-2 py-1 text-[10px] font-bold uppercase text-emerald-600",children:e.confidence})]}),(0,a.jsx)("p",{className:"mt-2 text-sm leading-6 text-text-muted",children:e.evidence})]},`${t}-${e.title}`))})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Risks",title:"Điểm yếu & rủi ro",icon:"crisis_alert"}),(0,a.jsx)("div",{className:"space-y-3",children:(r.narrative?.weaknesses||[]).map((e,t)=>(0,a.jsxs)("div",{className:"rounded-2xl border border-amber-500/15 bg-amber-500/5 p-4",children:[(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)(b,{value:e.priority}),(0,a.jsx)("h3",{className:"font-bold text-text-main",children:e.title})]}),(0,a.jsx)("p",{className:"mt-2 text-sm leading-6 text-text-muted",children:e.evidence}),e.impact?(0,a.jsxs)("p",{className:"mt-2 text-xs font-medium text-amber-700 dark:text-amber-300",children:["Ảnh hưởng: ",e.impact]}):null]},`${t}-${e.title}`))})]})]}),(0,a.jsxs)("div",{className:"grid gap-6 xl:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]",children:[(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Reliability",title:"Lỗi ảnh hưởng Local AI",description:"Ph\xe2n loại gateway, upstream, client v\xe0 rate-limit từ request_error_events đ\xe3 scope theo local provider.",icon:"bug_report"}),(0,a.jsxs)("div",{className:"grid gap-3 sm:grid-cols-4",children:[(0,a.jsx)(w,{label:"Gateway",value:d(r.errors?.summary?.gateway)}),(0,a.jsx)(w,{label:"Upstream",value:d(r.errors?.summary?.upstream)}),(0,a.jsx)(w,{label:"Client",value:d(r.errors?.summary?.client)}),(0,a.jsx)(w,{label:"Rate limit",value:d(r.errors?.summary?.rateLimit)})]}),(0,a.jsxs)("div",{className:"mt-5 overflow-x-auto",children:[(0,a.jsxs)("table",{className:"w-full min-w-[720px] text-left text-xs",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-border text-[10px] uppercase tracking-[0.1em] text-text-muted",children:[(0,a.jsx)("th",{className:"pb-3",children:"Owner / Error"}),(0,a.jsx)("th",{className:"pb-3",children:"Model"}),(0,a.jsx)("th",{className:"pb-3",children:"Endpoint"}),(0,a.jsx)("th",{className:"pb-3 text-right",children:"Count"})]})}),(0,a.jsx)("tbody",{children:(r.errors?.topServerErrors||[]).map((e,t)=>(0,a.jsxs)("tr",{className:"border-b border-border/60",children:[(0,a.jsxs)("td",{className:"py-3",children:[(0,a.jsxs)("div",{className:"font-semibold text-text-main",children:[e.faultOwner||"unknown"," \xb7 ",e.errorType||e.status]}),(0,a.jsx)("div",{className:"mt-1 max-w-md truncate text-text-muted",title:e.sample,children:e.sample||e.errorCode||"-"})]}),(0,a.jsx)("td",{className:"py-3 text-text-muted",children:e.model||"-"}),(0,a.jsx)("td",{className:"py-3 text-text-muted",children:e.endpoint||"-"}),(0,a.jsx)("td",{className:"py-3 text-right font-bold text-text-main",children:d(e.requests)})]},`${t}-${e.label}`))})]}),r.errors?.topServerErrors?.length?null:(0,a.jsx)("div",{className:"py-8 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 lỗi gateway/upstream đ\xe1ng ch\xfa \xfd."})]})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Workload",title:"Nguồn tải ch\xednh",description:"API key v\xe0 endpoint đ\xe3 aggregate; kh\xf4ng đưa raw bearer token v\xe0o report.",icon:"account_tree"}),(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"mb-2 text-xs font-bold uppercase tracking-[0.12em] text-text-muted",children:"Top API keys"}),(0,a.jsx)("div",{className:"space-y-2",children:(r.workload?.apiKeys||[]).slice(0,6).map(e=>(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background px-3 py-2.5",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"truncate text-sm font-semibold text-text-main",children:e.label}),(0,a.jsx)("div",{className:"text-[11px] text-text-muted",children:e.ownerUser||e.fingerprint||"-"})]}),(0,a.jsxs)("div",{className:"text-right",children:[(0,a.jsx)("div",{className:"text-sm font-bold text-text-main",children:c(e.totalTokens)}),(0,a.jsxs)("div",{className:"text-[10px] text-text-muted",children:[x(e.tokenShare)," token"]})]})]},e.key))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"mb-2 text-xs font-bold uppercase tracking-[0.12em] text-text-muted",children:"Top endpoints"}),(0,a.jsx)("div",{className:"space-y-2",children:(r.workload?.endpoints||[]).slice(0,6).map(e=>(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background px-3 py-2.5",children:[(0,a.jsx)("div",{className:"min-w-0 truncate text-sm font-semibold text-text-main",children:e.label}),(0,a.jsxs)("div",{className:"text-right text-xs text-text-muted",children:[d(e.requests)," req \xb7 ",x(e.errorRate)," error"]})]},e.key))})]})]})]})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Execution Plan",title:"Kế hoạch h\xe0nh động",description:"Ưu ti\xean theo t\xe1c động vận h\xe0nh; mỗi h\xe0nh động c\xf3 owner gợi \xfd v\xe0 chỉ số x\xe1c nhận sau khi triển khai.",icon:"checklist"}),(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full min-w-[900px] text-left text-sm",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-border text-[10px] uppercase tracking-[0.12em] text-text-muted",children:[(0,a.jsx)("th",{className:"pb-3",children:"Priority"}),(0,a.jsx)("th",{className:"pb-3",children:"H\xe0nh động"}),(0,a.jsx)("th",{className:"pb-3",children:"Owner"}),(0,a.jsx)("th",{className:"pb-3",children:"Chỉ số kiểm chứng"})]})}),(0,a.jsx)("tbody",{children:(r.narrative?.actions||[]).map((e,t)=>(0,a.jsxs)("tr",{className:"border-b border-border/60 align-top",children:[(0,a.jsx)("td",{className:"py-4",children:(0,a.jsx)(b,{value:e.priority})}),(0,a.jsx)("td",{className:"py-4 pr-6 font-medium leading-6 text-text-main",children:e.action}),(0,a.jsx)("td",{className:"py-4 pr-6 text-text-muted",children:e.owner||"-"}),(0,a.jsx)("td",{className:"py-4 text-text-muted",children:e.validationMetric||"-"})]},`${t}-${e.action}`))})]})})]}),(0,a.jsxs)(v,{children:[(0,a.jsx)(g,{eyebrow:"Forecast & Methodology",title:"Dự b\xe1o v\xe0 giới hạn b\xe1o c\xe1o",icon:"policy"}),(0,a.jsxs)("div",{className:"grid gap-5 lg:grid-cols-2",children:[(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-5",children:[(0,a.jsx)("h3",{className:"font-bold text-text-main",children:"Dự b\xe1o ngắn hạn"}),(0,a.jsx)("p",{className:"mt-2 text-sm leading-6 text-text-muted",children:r.narrative?.forecast})]}),(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-5",children:[(0,a.jsx)("h3",{className:"font-bold text-text-main",children:"Độ tin cậy dữ liệu"}),(0,a.jsx)("ul",{className:"mt-3 space-y-2",children:(r.dataQuality||[]).map(e=>(0,a.jsxs)("li",{className:"flex gap-2 text-sm leading-6 text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mt-1 text-[16px] text-primary",children:"info"}),(0,a.jsx)("span",{children:e})]},e))})]})]}),r.aiWarning?(0,a.jsxs)("div",{className:"mt-4 rounded-xl border border-amber-500/20 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:["AI narrative fallback được sử dụng v\xec: ",r.aiWarning]}):null,(0,a.jsxs)("div",{className:"mt-4 text-[11px] text-text-muted",children:["Report ID: ",r.id," \xb7 Analytics ",r.analyticsVersion," \xb7 Compute ",d(r.computeMs)," ms \xb7 Requested by ",r.requestedBy||"Admin"]})]})]}):(0,a.jsxs)(v,{className:"flex min-h-[340px] flex-col items-center justify-center text-center",children:[(0,a.jsx)("span",{className:"material-symbols-outlined rounded-3xl bg-primary/10 p-5 text-5xl text-primary",children:"analytics"}),(0,a.jsx)("h2",{className:"mt-5 text-2xl font-black text-text-main",children:"Chưa c\xf3 Local AI Report"}),(0,a.jsx)("p",{className:"mt-2 max-w-xl text-sm leading-6 text-text-muted",children:"Chọn AI model v\xe0 tạo b\xe1o c\xe1o. Hệ thống chỉ lấy traffic từ Provider Node c\xf3 runtime vLLM; dữ liệu cloud kh\xf4ng được trộn v\xe0o KPI local."})]})]}):null}},34701:(e,t,r)=>{"use strict";var a=r(82114);function s(){}function n(){}n.resetWarningCache=s,e.exports=function(){function e(e,t,r,s,n,l){if(l!==a){var i=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:n,resetWarningCache:s};return r.PropTypes=r,r}},82114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},84175:(e,t,r)=>{Promise.resolve().then(r.bind(r,30238))},94027:(e,t,r)=>{"use strict";r.d(t,{Y:()=>o,s:()=>d});var a=r(95155),s=r(12115),n=r(14051),l=r.n(n);let i=(0,s.createContext)(null);function o({children:e}){let[t,r]=(0,s.useState)(null),[n,l]=(0,s.useState)(!0),[d,c]=(0,s.useState)(""),x=(0,s.useCallback)(async()=>{l(!0),c("");try{let e=await fetch("/api/auth/status",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t?.error||"Kh\xf4ng tải được trạng th\xe1i đăng nhập");return r(t||{}),t||{}}catch(e){return c(e?.message||"Kh\xf4ng tải được trạng th\xe1i đăng nhập"),r({}),{}}finally{l(!1)}},[]);(0,s.useEffect)(()=>{let e=!1;return(async()=>{l(!0),c("");try{let t=await fetch("/api/auth/status",{cache:"no-store"}),a=await t.json().catch(()=>({}));if(e)return;if(!t.ok)throw Error(a?.error||"Kh\xf4ng tải được trạng th\xe1i đăng nhập");r(a||{})}catch(t){e||(c(t?.message||"Kh\xf4ng tải được trạng th\xe1i đăng nhập"),r({}))}finally{e||l(!1)}})(),()=>{e=!0}},[]);let m=(0,s.useMemo)(()=>{let e,r,a,s,n;return r=(e=t&&"object"==typeof t?t:{}).displayName||e.oidcName||e.oidcEmail||e.userId||"",a=!0===e.isAdmin,s=!0===e.isMonitorAdmin,n=!0===e.isAiGatewaysMonitor,{status:e,displayName:r,userId:e.userId||"",loginMethod:e.loginMethod||"",role:e.role||"guest",isAdmin:a,isMonitorAdmin:s,isAiGatewaysMonitor:n,canManageApiKeys:!0===e.canManageApiKeys||a||s,canUseMonitorAdminTabs:!0===e.canUseMonitorAdminTabs||a||s,canViewAllAnalytics:!0===e.canViewAllAnalytics||a||s||n}},[t]),h=(0,s.useMemo)(()=>({...m,loading:n,error:d,reload:x}),[m,n,d,x]);return(0,a.jsx)(i.Provider,{value:h,children:e})}function d(){let e=(0,s.useContext)(i);return e||{status:{},displayName:"",userId:"",loginMethod:"",role:"admin",isAdmin:!0,isMonitorAdmin:!1,isAiGatewaysMonitor:!1,canManageApiKeys:!0,canUseMonitorAdminTabs:!0,canViewAllAnalytics:!0,loading:!1,error:"",reload:async()=>({})}}o.propTypes={children:l().node}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=84175)),_N_E=e.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-a2adbf34a91441f3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,s)=>{Promise.resolve().then(s.bind(s,38658))},38658:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>v});var t=s(95155),r=s(12115),l=s(44656),o=s(35497);let d={enabled:!1,fileLoggingEnabled:!1,type:"mysql",host:"",port:"",database:"",username:"",password:"",ssl:!1,createDatabase:!1,logClientRequest:!0,logSourceRequest:!0,logTargetRequest:!0,logProviderResponse:!1,logErrors:!0,retentionDays:30};function n({label:e,value:a,onChange:s,type:r="text",placeholder:l="",disabled:o=!1}){return(0,t.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)("span",{className:"text-text-muted",children:e}),(0,t.jsx)("input",{type:r,value:a||"",placeholder:l,disabled:o,onChange:e=>s(e.target.value),className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50"})]})}function i({label:e,checked:a,onChange:s,disabled:r=!1}){return(0,t.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main",children:[(0,t.jsx)("input",{type:"checkbox",checked:!!a,disabled:r,onChange:e=>s(e.target.checked)}),e]})}function c(){let[e,a]=(0,r.useState)(d),[s,l]=(0,r.useState)(!1),[c,p]=(0,r.useState)(null),[u,m]=(0,r.useState)(null),x=e=>a(a=>({...a,...e})),b=async()=>{l(!0),m(null);try{let e=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db"),s=await e.json();if(!e.ok)throw Error(s.error||"Failed to load config");a({...d,...s.config||{}})}catch(e){m(e.message||"Failed to load config")}finally{l(!1)}};(0,r.useEffect)(()=>{b()},[]);let g=async()=>{l(!0),m(null),p(null);try{let s=await fetch("/api/cli-tools/antigravity-mitm/prompt-log-db",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:e})}),t=await s.json();if(!s.ok)throw Error(t.error||"Failed to save config");a({...d,...t.config||{}}),p("Saved")}catch(e){m(e.message||"Failed to save config")}finally{l(!1)}},h=async a=>{l(!0),m(null),p(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})}),t=await s.json();if(!s.ok)throw Error(t.error||"Action failed");p(t.message||t.init?.message||"OK")}catch(e){m(e.message||"Action failed")}finally{l(!1)}},y="postgres"===e.type||"mysql"===e.type;return(0,t.jsx)(o.Zp,{title:"Request Logging",subtitle:"Control local request files and database-backed prompt logs",icon:"receipt_long",children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)(o.Ex,{variant:e.fileLoggingEnabled?"success":"default",children:["Local files: ",e.fileLoggingEnabled?"Enabled":"Disabled"]}),(0,t.jsxs)(o.Ex,{variant:e.enabled?"success":"default",children:["Database: ",e.enabled?"Enabled":"Disabled"]})]}),(0,t.jsx)("div",{className:"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-3 text-xs text-yellow-700 dark:text-yellow-300",children:'Prompt logs may contain source code, selected code, internal URLs, user prompts, and provider responses. Checked stages store full raw JSON; prompt/response text columns keep only short previews. Per-combo "hide content" still redacts raw JSON.'}),(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,t.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)("span",{className:"text-text-muted",children:"Database type"}),(0,t.jsxs)("select",{value:e.type,disabled:s,onChange:a=>{let s=a.target.value;x({type:s,port:"postgres"===s?e.port||"5432":"mysql"===s?e.port||"3306":e.port})},className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50",children:[(0,t.jsx)("option",{value:"mysql",children:"MySQL / MariaDB"}),(0,t.jsx)("option",{value:"postgres",children:"PostgreSQL"})]})]}),(0,t.jsx)(n,{label:"Retention days",type:"number",value:String(e.retentionDays||30),onChange:e=>x({retentionDays:Number(e)||30}),disabled:s})]}),y&&(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,t.jsx)(n,{label:"Host",value:e.host,placeholder:"127.0.0.1",onChange:e=>x({host:e}),disabled:s}),(0,t.jsx)(n,{label:"Port",value:e.port,placeholder:"postgres"===e.type?"5432":"3306",onChange:e=>x({port:e}),disabled:s}),(0,t.jsx)(n,{label:"Database",value:e.database,placeholder:"bluerouter_logs",onChange:e=>x({database:e}),disabled:s}),(0,t.jsx)(n,{label:"Username",value:e.username,placeholder:"bluerouter",onChange:e=>x({username:e}),disabled:s}),(0,t.jsx)(n,{label:"Password",type:"password",value:e.password,placeholder:"Leave as ******** to keep existing password",onChange:e=>x({password:e}),disabled:s}),(0,t.jsxs)("div",{className:"flex flex-col justify-end gap-2",children:[(0,t.jsx)(i,{label:"Use SSL",checked:e.ssl,onChange:e=>x({ssl:e}),disabled:s}),(0,t.jsx)(i,{label:"Create database if missing",checked:e.createDatabase,onChange:e=>x({createDatabase:e}),disabled:s})]})]}),(0,t.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-surface/40 p-3 md:grid-cols-2",children:[(0,t.jsx)(i,{label:"Save request/response to local files",checked:e.fileLoggingEnabled,onChange:e=>x({fileLoggingEnabled:e}),disabled:s}),(0,t.jsx)(i,{label:"Save request/response to Prompt Log Database",checked:e.enabled,onChange:e=>x({enabled:e}),disabled:s}),(0,t.jsx)(i,{label:"Log client request JSON",checked:e.logClientRequest,onChange:e=>x({logClientRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log normalized/source request JSON",checked:e.logSourceRequest,onChange:e=>x({logSourceRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log target/provider request JSON",checked:e.logTargetRequest,onChange:e=>x({logTargetRequest:e}),disabled:s}),(0,t.jsx)(i,{label:"Log provider response JSON",checked:e.logProviderResponse,onChange:e=>x({logProviderResponse:e}),disabled:s}),(0,t.jsx)(i,{label:"Log errors",checked:e.logErrors,onChange:e=>x({logErrors:e}),disabled:s})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-border bg-background p-3 text-xs text-text-muted",children:["Local files are written under ",(0,t.jsx)("code",{children:"DATA_DIR/logs/requests"}),". Disabling local files stops new request/response dump files; existing files are kept."]}),y&&(0,t.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["Prompt logs now support MySQL/MariaDB and PostgreSQL only. MySQL/MariaDB requires ",(0,t.jsx)("code",{children:"mysql2"}),"; PostgreSQL requires ",(0,t.jsx)("code",{children:"pg"}),"."]}),c&&(0,t.jsx)("div",{className:"rounded-lg border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600",children:c}),u&&(0,t.jsx)("div",{className:"rounded-lg border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-500",children:u}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:b,loading:s,children:"Reload"}),(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>h("test"),loading:s,children:"Test connection"}),(0,t.jsx)(o.$n,{size:"sm",variant:"secondary",onClick:()=>h("init"),loading:s,children:"Initialize schema"}),(0,t.jsx)(o.$n,{size:"sm",onClick:g,loading:s,children:"Save"}),(0,t.jsx)(o.$n,{size:"sm",variant:"success",onClick:()=>h("save-and-init"),loading:s,children:"Save & initialize"})]})]})})}let p="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",u="image/svg+xml,image/png,image/webp,image/jpeg,image/gif",m=`${u},image/x-icon,image/vnd.microsoft.icon,.ico`;function x({status:e}){if(!e?.message)return null;let a="error"===e.type?"text-red-600 bg-red-50 border-red-200":"text-green-700 bg-green-50 border-green-200";return(0,t.jsx)("div",{className:`mt-3 rounded-xl border px-4 py-3 text-sm ${a}`,children:e.message})}function b({icon:e,title:a,desc:s,children:r}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,t.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),s&&(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:s})]})]}),r]})}function g({label:e,hint:a,children:s}){return(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),s,a&&(0,t.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function h(e){return(0,t.jsx)("input",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function y(e){return(0,t.jsx)("textarea",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function f({title:e,desc:a,checked:s,onChange:r,disabled:l}){return(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,t.jsx)("button",{type:"button",disabled:l,onClick:()=>r(!s),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${s?"bg-primary":"bg-border"}`,children:(0,t.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${s?"left-5":"left-0.5"}`})})]})}function v(){let[e,a]=(0,r.useState)({}),[s,o]=(0,r.useState)(!0),[d,n]=(0,r.useState)({current:"",new:"",confirm:""}),[i,v]=(0,r.useState)({type:"",message:""}),[j,w]=(0,r.useState)(!1),[N,D]=(0,r.useState)(!1),[C,A]=(0,r.useState)({type:"",message:""}),S=(0,r.useRef)(null),[L,U]=(0,r.useState)("admin"),[k,P]=(0,r.useState)({type:"",message:""}),[G,M]=(0,r.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:p,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapAiGatewaysMonitorsGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[I,E]=(0,r.useState)({type:"",message:""}),[O,R]=(0,r.useState)(!1),[B,T]=(0,r.useState)(!1),[F,q]=(0,r.useState)(""),[$,_]=(0,r.useState)([]),[z,J]=(0,r.useState)(!1),[V,Q]=(0,r.useState)({authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC"}),[H,K]=(0,r.useState)(""),[W,Z]=(0,r.useState)({type:"",message:""}),[X,Y]=(0,r.useState)(!1),[ee,ea]=(0,r.useState)(!1),[es,et]=(0,r.useState)({type:"",message:""}),er=(0,l.useBranding)(),[el,eo]=(0,r.useState)(""),[ed,en]=(0,r.useState)(""),[ei,ec]=(0,r.useState)(""),[ep,eu]=(0,r.useState)({type:"",message:""}),[em,ex]=(0,r.useState)(!1),[eb,eg]=(0,r.useState)(!1),[eh,ey]=(0,r.useState)(!1),[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"}),s=await e.json();a(s),U(s.localLoginUsername||"admin"),M({ldapEnabled:!0===s.ldapEnabled,ldapUrl:s.ldapUrl||"",ldapBindDn:s.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:s.ldapUserBaseDn||s.ldapBaseDn||"",ldapUserSearchFilter:s.ldapUserSearchFilter||p,ldapUserNameAttribute:s.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:s.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:s.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:s.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:s.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:s.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:s.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==s.ldapNestedGroups,ldapAllowedUsers:Array.isArray(s.ldapAllowedUsers)?s.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==s.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:s.ldapConnectTimeoutMs||8e3}),Q({authMode:s.authMode||"password",oidcIssuerUrl:s.oidcIssuerUrl||"",oidcClientId:s.oidcClientId||"",oidcScopes:s.oidcScopes||"openid profile email",oidcLoginLabel:s.oidcLoginLabel||"Sign in with OIDC"}),eo(s.siteTitle||""),en(s.siteShortName||""),ec(s.siteDescription||""),("oidc"===s.authMode||"both"===s.authMode)&&ea(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{o(!1)}};(0,r.useEffect)(()=>{eN()},[]);let eD=async e=>{let s=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Failed to save settings");return a(e=>({...e,...t})),t},eC=async s=>{et({type:"",message:""});let t=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:s}));try{let e=await eD({sidebarAdvancedToolsVisible:s}),t=!1!==e.sidebarAdvancedToolsVisible;a(e=>({...e,sidebarAdvancedToolsVisible:t})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:t}})),et({type:"success",message:t?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){a(e=>({...e,sidebarAdvancedToolsVisible:t})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:t}})),et({type:"error",message:e.message||"Failed to save sidebar setting."})}},eA=async e=>{e.preventDefault(),P({type:"",message:""});try{let e=await eD({localLoginUsername:L});U(e.localLoginUsername||L||"admin"),P({type:"success",message:"Local account name saved."})}catch(e){P({type:"error",message:e.message})}},eS=async e=>{if(e.preventDefault(),d.new!==d.confirm)return void v({type:"error",message:"Passwords do not match"});w(!0),v({type:"",message:""});try{await eD({currentPassword:d.current,newPassword:d.new}),v({type:"success",message:"Password updated successfully"}),n({current:"",new:"",confirm:""})}catch(e){v({type:"error",message:e.message||"Failed to update password"})}finally{w(!1)}},eL=async()=>{D(!0),A({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let a=await e.json().catch(()=>({}));throw Error(a.error||"Failed to export database")}let a=await e.json(),s=JSON.stringify(a,null,2),t=new Blob([s],{type:"application/json"}),r=URL.createObjectURL(t),l=document.createElement("a"),o=new Date().toISOString().replace(/[.:]/g,"-");l.href=r,l.download=`bluerouter-backup-${o}.json`,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(r),A({type:"success",message:"Database backup downloaded."})}catch(e){A({type:"error",message:e.message||"Failed to export database."})}finally{D(!1)}},eU=async e=>{let a=e.target.files?.[0];if(a){D(!0),A({type:"",message:""});try{let e=await a.text(),s=JSON.parse(e),t=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Failed to import database");await eN();let l=r.resourceMonitorImported?`Restored ${r.resourceMonitorServerCount||0} Resource Monitor server(s) and ${r.resourceMonitorHistoryCount||0} history sample(s).`:"Legacy backup: current Resource Monitor data was kept.",o=r.brandingImported?`Restored ${r.brandingAssetCount||0} branding asset(s).`:"Current logo and favicon were kept.";A({type:"success",message:`Database imported successfully. ${l} ${o}`})}catch(e){A({type:"error",message:e.message||"Invalid backup file."})}finally{S.current&&(S.current.value=""),D(!1)}}},ek=(e,a)=>M(s=>({...s,[e]:a})),eP=async e=>{e?.preventDefault?.(),R(!0),E({type:"",message:""});try{let e={...G,ldapBaseDn:G.ldapUserBaseDn,ldapAllowedUsers:G.ldapAllowedUsers};e.ldapBindPassword||delete e.ldapBindPassword;let a=await eD(e);M(e=>({...e,ldapBindPassword:"",ldapEnabled:!0===a.ldapEnabled,ldapUserBaseDn:a.ldapUserBaseDn||a.ldapBaseDn||e.ldapUserBaseDn,ldapLoginAllowedGroupDn:a.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:a.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:a.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:a.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==a.ldapNestedGroups,ldapAllowedUsers:Array.isArray(a.ldapAllowedUsers)?a.ldapAllowedUsers:e.ldapAllowedUsers})),E({type:"success",message:"LDAP settings saved."})}catch(e){E({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{R(!1)}},eG=async()=>{T(!0),E({type:"",message:""});try{await eP();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?E({type:"success",message:a.message||"LDAP connection OK."}):E({type:"error",message:a.error||"LDAP test failed."})}catch(e){E({type:"error",message:e.message||"LDAP test failed."})}finally{T(!1)}},eM=async()=>{J(!0),E({type:"",message:""});try{await eP();let e=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(F)}`,{cache:"no-store"}),a=await e.json().catch(()=>({}));e.ok?(_(a.users||[]),E({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):E({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){E({type:"error",message:e.message||"Failed to load LDAP users."})}finally{J(!1)}},eI=e=>{let a=String(e||"").trim();a&&M(e=>{let s=new Set(e.ldapAllowedUsers||[]);return s.has(a)?s.delete(a):s.add(a),{...e,ldapAllowedUsers:[...s]}})},eE=async(a=V.authMode||"password")=>{let s=V.oidcIssuerUrl.trim(),t=V.oidcClientId.trim(),r=V.oidcScopes.trim(),l=V.oidcLoginLabel.trim(),o=H.trim();if("password"!==a&&(!s||!t||!o)&&!e.oidcConfigured)return void Z({type:"error",message:"Issuer URL, client ID, and client secret are required to enable OIDC."});Y(!0),Z({type:"",message:""});try{let e={authMode:a,oidcIssuerUrl:s,oidcClientId:t,oidcScopes:r||"openid profile email",oidcLoginLabel:l||"Sign in with OIDC"};o&&(e.oidcClientSecret=o);let d=await eD(e);Q({authMode:d.authMode||a,oidcIssuerUrl:d.oidcIssuerUrl||s,oidcClientId:d.oidcClientId||t,oidcScopes:d.oidcScopes||r||"openid profile email",oidcLoginLabel:d.oidcLoginLabel||l||"Sign in with OIDC"}),K(""),Z({type:"success",message:"OIDC settings saved."})}catch(e){Z({type:"error",message:e.message||"Failed to save OIDC settings"})}finally{Y(!1)}},eO=async(e,a)=>{if(!a)return;if(a.size>1048576)return void eu({type:"error",message:"File exceeds 1 MB limit."});let s="logo"===e?eg:ey;s(!0),eu({type:"",message:""});try{let s=new FormData;s.append("asset",e),s.append("file",a);let t=await fetch("/api/branding/upload",{method:"POST",body:s}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Upload failed");(0,l.notifyBrandingChanged)(),eu({type:"success",message:`${"logo"===e?"Logo":"Favicon"} uploaded.`})}catch(e){eu({type:"error",message:e.message||"Upload failed."})}finally{s(!1)}},eR=async e=>{let a=e.target.files?.[0];await eO("logo",a),ej.current&&(ej.current.value="")},eB=async e=>{let a=e.target.files?.[0];await eO("favicon",a),ew.current&&(ew.current.value="")},eT=async e=>{e.preventDefault(),ex(!0),eu({type:"",message:""});try{await eD({siteTitle:el.trim(),siteShortName:ed.trim(),siteDescription:ei.trim()}),(0,l.notifyBrandingChanged)(),eu({type:"success",message:"Branding text saved."})}catch(e){eu({type:"error",message:e.message||"Failed to save branding."})}finally{ex(!1)}},eF=async e=>{eu({type:"",message:""});try{let a=await fetch(`/api/branding?asset=${e}`,{method:"DELETE"}),s=await a.json().catch(()=>({}));if(!a.ok)throw Error(s.error||"Failed to remove asset");(0,l.notifyBrandingChanged)(),eu({type:"success",message:`${"logo"===e?"Logo":"Favicon"} removed.`})}catch(e){eu({type:"error",message:e.message||"Failed to remove asset."})}},eq=async()=>{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(""),en(""),ec(""),(0,l.notifyBrandingChanged)(),eu({type:"success",message:"Branding reset to defaults."})}catch(e){eu({type:"error",message:e.message||"Failed to reset branding."})}finally{ev(!1)}};return s?(0,t.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,t.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,t.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure dashboard preferences, request logging, database backup, and authentication."})]}),(0,t.jsxs)(b,{icon:"view_sidebar",title:"Sidebar tools",desc:"Show or hide advanced dashboard tools to keep the sidebar clean.",children:[(0,t.jsx)(f,{title:"Show Advanced tools",desc:"When disabled, Media / Web, AI Traffic Gateway, CLI Tools, Proxy Pools, Skills, Console Log and Translator are hidden from the sidebar. Core admin pages remain visible.",checked:!1!==e.sidebarAdvancedToolsVisible,onChange:eC}),(0,t.jsx)(x,{status:es})]}),(0,t.jsxs)(b,{icon:"palette",title:"Branding",desc:"Customize site title, logo and favicon shown in the dashboard, browser tab and login page. Max 1 MB per file.",children:[(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Logo"}),(0,t.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,t.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:er?.logoUrl?(0,t.jsx)("img",{src:er.logoUrl,alt:"Current logo",className:"max-h-full max-w-full object-contain"}):(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"hub"})}),(0,t.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,t.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the dashboard sidebar and login page. SVG, PNG, WebP, JPEG, GIF."}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"button",disabled:eb,onClick:()=>ej.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eb?"Uploading...":er?.logoUrl?"Replace logo":"Upload logo"}),er?.logoUrl?(0,t.jsx)("button",{type:"button",onClick:()=>eF("logo"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,t.jsx)("input",{ref:ej,type:"file",accept:u,className:"hidden",onChange:eR})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Favicon"}),(0,t.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,t.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:er?.faviconUrl?(0,t.jsx)("img",{src:er.faviconUrl,alt:"Current favicon",className:"max-h-10 max-w-10 object-contain"}):(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"public"})}),(0,t.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,t.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the browser tab. ICO, SVG, PNG, WebP, JPEG, GIF."}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"button",disabled:eh,onClick:()=>ew.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eh?"Uploading...":er?.faviconUrl?"Replace favicon":"Upload favicon"}),er?.faviconUrl?(0,t.jsx)("button",{type:"button",onClick:()=>eF("favicon"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,t.jsx)("input",{ref:ew,type:"file",accept:m,className:"hidden",onChange:eB})]})]})]}),(0,t.jsxs)("form",{onSubmit:eT,className:"space-y-3",children:[(0,t.jsx)(g,{label:"Site title",hint:"Shown in browser tab and login page. Leave blank for default.",children:(0,t.jsx)(h,{value:el,onChange:e=>eo(e.target.value),placeholder:"AI Router Gateway"})}),(0,t.jsx)(g,{label:"Company short name",hint:"Shown in dashboard sidebar and login hero text. Defaults to site title/sidebar default or 'Fujinet' on login.",children:(0,t.jsx)(h,{value:ed,onChange:e=>en(e.target.value),placeholder:"Fujinet"})}),(0,t.jsx)(g,{label:"Description",hint:"Used for browser metadata.",children:(0,t.jsx)(y,{rows:3,value:ei,onChange:e=>ec(e.target.value),placeholder:"AI Infrastructure Management"})}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"submit",disabled:em,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:em?"Saving...":"Save branding text"}),(0,t.jsx)("button",{type:"button",disabled: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,t.jsx)(x,{status:ep})]}),(0,t.jsx)(b,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("form",{onSubmit:eA,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,t.jsx)(g,{label:"Local username",children:(0,t.jsx)(h,{value:L,onChange:e=>U(e.target.value)})}),(0,t.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,t.jsx)(x,{status:k})]}),(0,t.jsxs)("form",{onSubmit:eS,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,t.jsx)(g,{label:"Current password",children:(0,t.jsx)(h,{type:"password",value:d.current,onChange:e=>n({...d,current:e.target.value}),required:!0})}),(0,t.jsx)(g,{label:"New password",children:(0,t.jsx)(h,{type:"password",value:d.new,onChange:e=>n({...d,new:e.target.value}),required:!0})}),(0,t.jsx)(g,{label:"Confirm password",children:(0,t.jsx)(h,{type:"password",value:d.confirm,onChange:e=>n({...d,confirm:e.target.value}),required:!0})}),(0,t.jsx)("button",{disabled:j,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:e.hasPassword?"Update Password":"Set Password"}),(0,t.jsx)(x,{status:i})]})]})}),(0,t.jsx)("div",{id:"request-logging",className:"scroll-mt-6",children:(0,t.jsx)(c,{})}),(0,t.jsxs)(b,{icon:"database",title:"Database Backup",desc:"Export or restore configuration, Linux Resource Monitor data, logo and favicon.",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsx)("button",{onClick: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,t.jsx)("button",{onClick:()=>S.current?.click(),disabled:N,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-primary/50 disabled:opacity-50",children:"Import Backup"}),(0,t.jsx)("input",{ref:S,type:"file",accept:"application/json",className:"hidden",onChange:eU})]}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Backup files contain API credentials, Resource Monitor agent tokens and embedded branding images. Store them securely. Legacy backups keep current Resource Monitor and branding files."}),(0,t.jsx)(x,{status:C})]}),(0,t.jsx)(b,{icon:"corporate_fare",title:"LDAP / Active Directory Login",desc:"Search users from a User Base DN, restrict login by group DN, and grant admin by group DN. The old Selected LDAP users list is kept as a manual admin list.",children:(0,t.jsxs)("form",{onSubmit:eP,className:"space-y-5",children:[(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,t.jsx)("button",{type:"button",onClick:()=>ek("ldapEnabled",!G.ldapEnabled),className:`rounded-xl px-3 py-2 text-sm font-semibold ${G.ldapEnabled?"bg-primary text-white":"border border-border text-text-muted"}`,children:G.ldapEnabled?"Enabled":"Disabled"})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"LDAP URL",children:(0,t.jsx)(h,{value:G.ldapUrl,onChange:e=>ek("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,t.jsx)(g,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,t.jsx)(h,{value:G.ldapUserBaseDn,onChange:e=>ek("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Bind DN",children:(0,t.jsx)(h,{value:G.ldapBindDn,onChange:e=>ek("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,t.jsx)(g,{label:"LDAP Bind Password",children:(0,t.jsx)(h,{type:"password",value:G.ldapBindPassword,onChange:e=>ek("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,t.jsx)(g,{label:"LDAP Login Allowed Group DN",hint:"Only members of this group can log in. Leave blank to allow any valid LDAP user.",children:(0,t.jsx)(h,{value:G.ldapLoginAllowedGroupDn,onChange:e=>ek("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,t.jsx)(h,{value:G.ldapAdminGroupDn,onChange:e=>ek("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP Monitor Admin Group DN",hint:"Members can use only Endpoint, API Keys, Usage, Analytics, Quota Tracker and Prompt Logs with admin-like permissions inside those tabs.",children:(0,t.jsx)(h,{value:G.ldapMonitorAdminGroupDn,onChange:e=>ek("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(g,{label:"LDAP AI Gateways Monitors Group DN",hint:"Members log in as regular users but the Analytics page aggregates statistics for every API key that has an owner, instead of only their own keys.",children:(0,t.jsx)(h,{value:G.ldapAiGatewaysMonitorsGroupDn,onChange:e=>ek("ldapAiGatewaysMonitorsGroupDn",e.target.value),placeholder:"CN=BlueRouter_AI_Gateways_Monitors,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})})]}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,t.jsx)(h,{value:G.ldapUserSearchFilter,onChange:e=>ek("ldapUserSearchFilter",e.target.value)})}),(0,t.jsx)(g,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,t.jsx)(f,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:G.ldapNestedGroups,onChange:e=>ek("ldapNestedGroups",e)})}),(0,t.jsx)(g,{label:"Username attribute",children:(0,t.jsx)(h,{value:G.ldapUserNameAttribute,onChange:e=>ek("ldapUserNameAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Display attribute",children:(0,t.jsx)(h,{value:G.ldapUserDisplayAttribute,onChange:e=>ek("ldapUserDisplayAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Email attribute",children:(0,t.jsx)(h,{value:G.ldapUserEmailAttribute,onChange:e=>ek("ldapUserEmailAttribute",e.target.value)})}),(0,t.jsx)(g,{label:"Connect timeout ms",children:(0,t.jsx)(h,{type:"number",value:G.ldapConnectTimeoutMs,onChange:e=>ek("ldapConnectTimeoutMs",e.target.value)})})]}),(0,t.jsx)(f,{title:"Reject invalid TLS certificates",desc:"Disable only for test/self-signed LDAP TLS.",checked:G.ldapTlsRejectUnauthorized,onChange:e=>ek("ldapTlsRejectUnauthorized",e)}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Users loaded here come from Login Allowed Group DN when set. Selected users are also treated as manual admins for backward compatibility."})]}),(0,t.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,t.jsx)(h,{value:F,onChange:e=>q(e.target.value),placeholder:"Search users..."}),(0,t.jsx)("button",{type:"button",onClick:eM,disabled:z,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:z?"Loading...":"Load users"})]}),$.length>0&&(0,t.jsx)("div",{className:"max-h-72 overflow-auto rounded-xl border border-border",children:$.map(e=>{let a=G.ldapAllowedUsers.includes(e.username);return(0,t.jsxs)("button",{type:"button",onClick:()=>eI(e.username),className:`flex w-full items-center justify-between gap-3 border-b border-border px-3 py-2 text-left text-sm last:border-b-0 ${a?"bg-primary/10":"bg-background hover:bg-surface"}`,children:[(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,t.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:["Selected manual admin users (",G.ldapAllowedUsers.length,")"]}),0===G.ldapAllowedUsers.length?(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:G.ldapAllowedUsers.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>eI(e),className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs text-primary",children:[e," \xd7"]},e))})]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:eG,disabled:B,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:B?"Testing...":"Save & test LDAP"}),(0,t.jsx)("button",{type:"submit",disabled:O,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:O?"Saving...":"Save LDAP settings"})]}),(0,t.jsx)(x,{status:I})]})}),(0,t.jsxs)(b,{icon:"lock_open",title:"OIDC Dashboard Login",desc:"oidc"===e.authMode?"OIDC active":"both"===e.authMode?"Password + OIDC active":"Optional SSO via Authentik/Keycloak/Google",children:[(0,t.jsx)("button",{type:"button",onClick:()=>ea(e=>!e),className:"mb-4 rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main",children:ee?"Hide OIDC settings":"Show OIDC settings"}),ee&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:[{value:"password",title:"Password/LDAP",desc:"Keep local and LDAP login."},{value:"oidc",title:"OIDC only",desc:"Disable local/LDAP login when configured."},{value:"both",title:"Both",desc:"Allow either OIDC or local/LDAP."}].map(e=>{let a=V.authMode===e.value;return(0,t.jsxs)("button",{type:"button",onClick:()=>Q(a=>({...a,authMode:e.value})),className:`rounded-xl border p-3 text-left ${a?"border-primary bg-primary/10":"border-border bg-background hover:border-primary/40"}`,children:[(0,t.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(g,{label:"Issuer URL",children:(0,t.jsx)(h,{value:V.oidcIssuerUrl,onChange:e=>Q({...V,oidcIssuerUrl:e.target.value})})}),(0,t.jsx)(g,{label:"Client ID",children:(0,t.jsx)(h,{value:V.oidcClientId,onChange:e=>Q({...V,oidcClientId:e.target.value})})}),(0,t.jsx)(g,{label:"Client Secret",children:(0,t.jsx)(h,{type:"password",value:H,onChange:e=>K(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,t.jsx)(g,{label:"Scopes",children:(0,t.jsx)(h,{value:V.oidcScopes,onChange:e=>Q({...V,oidcScopes:e.target.value})})}),(0,t.jsx)(g,{label:"Login label",children:(0,t.jsx)(h,{value:V.oidcLoginLabel,onChange:e=>Q({...V,oidcLoginLabel:e.target.value})})})]}),(0,t.jsx)("button",{type:"button",onClick:()=>eE(),disabled:X,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:X?"Saving...":"Save OIDC settings"}),(0,t.jsx)(x,{status:W})]})]})]})}}},e=>{e.O(0,[2574,3862,2691,9959,1997,5564,5263,5497,8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|