@jheavenknows/bluerouter 5.2.18 → 5.2.20
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 +3 -3
- package/app/.next-cli-build/build-manifest.json +2 -2
- 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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +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_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.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/copilot-settings/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/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/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/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/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/import/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/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/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/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/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/translator/console-logs/route.js +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/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/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/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/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/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_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_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/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_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_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/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +3 -3
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/402.js +61 -16
- 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 +28 -0
- package/app/.next-cli-build/server/chunks/8895.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js +28 -0
- 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-56598edd0b9e66c2.js → 5263-8c24fd5eabff1c5a.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/usage/page-6ea6e09d94d5570e.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.56-to-5.2.13-5.2.13-20260722-202514 → 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.55-to-5.1.56-5.1.56-20260721-214906 → 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/backups/upgrade-5.2.18-to-5.2.19-5.2.19-20260723-214046/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/usage/page-b19a726c3b016a28.js +0 -1
- package/app/.next-cli-build/static/css/4e196fc2c3dc0029.css +0 -1
- /package/app/.next-cli-build/static/{8NATkNodjIH5tQqWSrPe3 → ufbLQO6ZO7_9PjYiywNJA}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{8NATkNodjIH5tQqWSrPe3 → ufbLQO6ZO7_9PjYiywNJA}/_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/usage/page-b19a726c3b016a28.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2825],{21007:(e,t,s)=>{Promise.resolve().then(s.bind(s,81772))},81772:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>N});var a=s(95155),l=s(12115),n=s(73321),r=s(35497),i=s(84588),o=s(92542),d=s(31474);function c({isOpen:e,onClose:t,title:s,children:n,width:r="md",className:i}){let o={sm:"w-[400px]",md:"w-[500px]",lg:"w-[600px]",xl:"w-[800px]",full:"w-full"};return((0,l.useEffect)(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[e]),(0,l.useEffect)(()=>{let s=s=>{"Escape"===s.key&&e&&t()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[e,t]),e)?(0,a.jsxs)("div",{className:"fixed inset-0 z-50",children:[(0,a.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in cursor-pointer",onClick:t,"aria-hidden":"true"}),(0,a.jsxs)("div",{className:(0,d.cn)("absolute right-0 top-0 h-full bg-surface flex flex-col","shadow-[var(--shadow-elev)]","slide-in-right","border-l border-border-subtle",o[r]||o.md,i),children:[(0,a.jsxs)("div",{className:"flex items-center justify-between p-6 border-b border-border-subtle flex-shrink-0",children:[(0,a.jsx)("div",{className:"flex items-center gap-3",children:s&&(0,a.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:s})}),(0,a.jsx)("button",{type:"button",onClick:t,className:"p-1.5 rounded-[10px] text-text-muted hover:bg-surface-2 hover:text-text-main transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,a.jsx)("div",{className:"flex-1 overflow-y-auto p-6 custom-scrollbar",children:n})]})]}):null}function x({currentPage:e,pageSize:t,totalItems:s,onPageChange:l,onPageSizeChange:n,className:r}){let i=Math.ceil(s/t),c=s>0?(e-1)*t+1:0,m=Math.min(e*t,s),h=(()=>{let t=[],s=Math.max(1,e-2),a=Math.min(i,s+5-1);a-s+1<5&&(s=Math.max(1,a-5+1));for(let e=s;e<=a;e++)t.push(e);return t})();return(0,a.jsxs)("div",{className:(0,d.cn)("flex flex-col sm:flex-row items-center justify-between gap-4 py-4 px-2",r),children:[s>0&&(0,a.jsxs)("div",{className:"text-sm text-text-muted",children:["Showing ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:c})," to"," ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:m})," of"," ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:s})," results"]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-center gap-2 sm:gap-4",children:[n&&(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-sm text-text-muted",children:"Rows:"}),(0,a.jsx)("select",{value:t,onChange:e=>n(Number(e.target.value)),className:(0,d.cn)("h-9 rounded-lg border border-black/10 dark:border-white/10 bg-surface","text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20","cursor-pointer"),style:{colorScheme:"auto"},children:[10,20,50].map(e=>(0,a.jsx)("option",{value:e,children:e},e))})]}),i>1&&(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(o.default,{variant:"outline",size:"sm",onClick:()=>l(e-1),disabled:1===e,className:"w-9 px-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"chevron_left"})}),h[0]>1&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.default,{variant:"ghost",size:"sm",onClick:()=>l(1),className:"w-9 px-0 hidden sm:inline-flex",children:"1"}),h[0]>2&&(0,a.jsx)("span",{className:"text-text-muted px-1 hidden sm:inline",children:"..."})]}),h.map(t=>(0,a.jsx)(o.default,{variant:e===t?"primary":"ghost",size:"sm",onClick:()=>l(t),className:(0,d.cn)("w-9 px-0",e===t?"inline-flex":"hidden sm:inline-flex"),children:t},t)),h[h.length-1]<i&&(0,a.jsxs)(a.Fragment,{children:[h[h.length-1]<i-1&&(0,a.jsx)("span",{className:"text-text-muted px-1 hidden sm:inline",children:"..."}),(0,a.jsx)(o.default,{variant:"ghost",size:"sm",onClick:()=>l(i),className:"w-9 px-0 hidden sm:inline-flex",children:i})]}),(0,a.jsx)(o.default,{variant:"outline",size:"sm",onClick:()=>l(e+1),disabled:e===i,className:"w-9 px-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"chevron_right"})})]})]})]})}var m=s(52679);let h=null,u=null;async function p({force:e=!1}={}){if(!e&&h&&u)return{providerNameCache:h,providerNodesCache:u};let t=await fetch("/api/provider-nodes",{cache:"no-store"}),s=(await t.json()).nodes||[];for(let e of(u={},s))u[e.id]=e.name;return{providerNameCache:h={...m.Q2,...u},providerNodesCache:u}}function f(e,t){if(!e||!t)return e;let s=t[e];if("string"==typeof s)return s;if(s?.name)return s.name;let a=(0,m.zt)(e)||m.Q2[e];return a?.name||e}function b({title:e,children:t,defaultOpen:s=!1,icon:n=null}){let[r,i]=(0,l.useState)(s);return(0,a.jsxs)("div",{className:"border border-black/5 dark:border-white/5 rounded-lg overflow-hidden",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>i(!r),className:"w-full flex items-center justify-between p-3 bg-black/[0.02] dark:bg-white/[0.02] hover:bg-black/[0.04] dark:hover:bg-white/[0.04] transition-colors",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[n&&(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px] text-text-muted",children:n}),(0,a.jsx)("span",{className:"font-semibold text-sm text-text-main",children:e})]}),(0,a.jsx)("span",{className:(0,d.cn)("material-symbols-outlined text-[20px] text-text-muted transition-transform duration-200",r?"rotate-90":""),children:"chevron_right"})]}),r&&(0,a.jsx)("div",{className:"p-4 border-t border-black/5 dark:border-white/5",children:t})]})}function g(e){let t=e?.prompt_tokens||e?.input_tokens||0,s=e?.cached_tokens||e?.cache_read_input_tokens||0;return t<s?s:t}function j(){let[e,t]=(0,l.useState)([]),[s,n]=(0,l.useState)({page:1,pageSize:20,totalItems:0,totalPages:0}),[r,m]=(0,l.useState)(!1),[h,u]=(0,l.useState)(null),[j,v]=(0,l.useState)(!1),[N,w]=(0,l.useState)([]),[k,y]=(0,l.useState)(null),[S,C]=(0,l.useState)({provider:"",startDate:"",endDate:""}),D=(0,l.useCallback)(async({force:e=!1}={})=>{try{let t=await fetch("/api/usage/providers",{cache:"no-store"}),s=await t.json();w(s.providers||[]);let a=await p({force:e});y(a.providerNameCache)}catch(e){console.error("Failed to fetch providers:",e)}},[]),_=(0,l.useCallback)(async({force:e=!1}={})=>{m(!0);try{let a=new URLSearchParams({page:s.page.toString(),pageSize:s.pageSize.toString()});S.provider&&a.append("provider",S.provider),S.startDate&&a.append("startDate",S.startDate),S.endDate&&a.append("endDate",S.endDate),e&&a.set("_refresh",Date.now().toString());let l=await fetch(`/api/usage/request-details?${a}`,{cache:"no-store"}),r=await l.json();t(r.details||[]),n(e=>({...e,...r.pagination}))}catch(e){console.error("Failed to fetch request details:",e)}finally{m(!1)}},[s.page,s.pageSize,S]);(0,l.useEffect)(()=>{D()},[D]),(0,l.useEffect)(()=>{_()},[_]);let z=(0,l.useCallback)(async()=>{await Promise.all([D({force:!0}),_({force:!0})])},[D,_]);return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-6",children:[(0,a.jsx)(i.default,{padding:"md",children:(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"provider-filter",className:"text-sm font-medium text-text-main",children:"Provider"}),(0,a.jsxs)("select",{id:"provider-filter",value:S.provider,onChange:e=>C({...S,provider:e.target.value}),className:(0,d.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20","w-full min-w-0 cursor-pointer"),style:{colorScheme:"auto"},children:[(0,a.jsx)("option",{value:"",children:"All Providers"}),N.map(e=>(0,a.jsx)("option",{value:e.id,children:e.name},e.id))]})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"start-date-filter",className:"text-sm font-medium text-text-main",children:"Start Date"}),(0,a.jsx)("input",{id:"start-date-filter",type:"datetime-local",value:S.startDate,onChange:e=>C({...S,startDate:e.target.value}),className:(0,d.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20")})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"end-date-filter",className:"text-sm font-medium text-text-main",children:"End Date"}),(0,a.jsx)("input",{id:"end-date-filter",type:"datetime-local",value:S.endDate,onChange:e=>C({...S,endDate:e.target.value}),className:(0,d.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20")})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2 sm:col-span-2 lg:col-span-1",children:[(0,a.jsx)("span",{className:"hidden text-sm font-medium text-text-main opacity-0 lg:block","aria-hidden":"true",children:"Actions"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,a.jsx)(o.default,{variant:"outline",onClick:z,loading:r,className:"w-full",icon:"refresh",children:"Refresh"}),(0,a.jsx)(o.default,{variant:"ghost",onClick:()=>{C({provider:"",startDate:"",endDate:""})},disabled:!S.provider&&!S.startDate&&!S.endDate,className:"w-full",children:"Clear"})]})]})]})}),(0,a.jsxs)(i.default,{padding:"none",children:[(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full min-w-[880px]",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5",children:[(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Timestamp"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Model"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Provider"}),(0,a.jsx)("th",{className:"text-right p-4 text-sm font-semibold text-text-main",children:"Input Tokens"}),(0,a.jsx)("th",{className:"text-right p-4 text-sm font-semibold text-text-main",children:"Output Tokens"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Latency"}),(0,a.jsx)("th",{className:"text-center p-4 text-sm font-semibold text-text-main",children:"Action"})]})}),(0,a.jsx)("tbody",{children:r?(0,a.jsx)("tr",{children:(0,a.jsx)("td",{colSpan:"7",className:"p-8 text-center text-text-muted",children:(0,a.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-[20px]",children:"progress_activity"}),"Loading..."]})})}):0===e.length?(0,a.jsx)("tr",{children:(0,a.jsx)("td",{colSpan:"7",className:"p-8 text-center text-text-muted",children:"No request details found"})}):e.map((e,t)=>(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5 last:border-b-0 hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors",children:[(0,a.jsx)("td",{className:"whitespace-nowrap p-4 text-sm text-text-main",children:new Date(e.timestamp).toLocaleString()}),(0,a.jsx)("td",{className:"max-w-[260px] truncate p-4 font-mono text-sm text-text-main",children:e.model}),(0,a.jsx)("td",{className:"max-w-[180px] truncate p-4 text-sm text-text-main",children:(0,a.jsx)("span",{className:"font-medium",children:f(e.provider,k)})}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-main text-right font-mono",children:g(e.tokens).toLocaleString()}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-main text-right font-mono",children:e.tokens?.completion_tokens?.toLocaleString()||0}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-muted",children:(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[(0,a.jsxs)("div",{children:["TTFT: ",(0,a.jsxs)("span",{className:"font-mono",children:[e.latency?.ttft||0,"ms"]})]}),(0,a.jsxs)("div",{children:["Total: ",(0,a.jsxs)("span",{className:"font-mono",children:[e.latency?.total||0,"ms"]})]})]})}),(0,a.jsx)("td",{className:"p-4 text-center",children:(0,a.jsx)(o.default,{variant:"outline",size:"sm",onClick:()=>{u(e),v(!0)},children:"Detail"})})]},`${e.id}-${t}`))})]})}),!r&&e.length>0&&(0,a.jsx)("div",{className:"border-t border-black/5 dark:border-white/5",children:(0,a.jsx)(x,{currentPage:s.page,pageSize:s.pageSize,totalItems:s.totalItems,onPageChange:e=>{n(t=>({...t,page:e}))},onPageSizeChange:e=>{n(t=>({...t,pageSize:e,page:1}))}})})]}),(0,a.jsx)(c,{isOpen:j,onClose:()=>v(!1),title:"Request Details",width:"lg",children:h&&(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"grid min-w-0 grid-cols-1 gap-4 text-sm sm:grid-cols-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"ID:"})," ",(0,a.jsx)("span",{className:"break-all font-mono text-text-main",children:h.id})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Timestamp:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:new Date(h.timestamp).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Provider:"})," ",(0,a.jsx)("span",{className:"text-text-main font-medium",children:f(h.provider,k)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Model:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:h.model})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Status:"})," ",(0,a.jsx)("span",{className:(0,d.cn)("font-medium","success"===h.status?"text-green-600":"text-red-600"),children:h.status})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Latency:"})," ",(0,a.jsxs)("span",{className:"text-text-main font-mono",children:["TTFT ",h.latency?.ttft||0,"ms / Total ",h.latency?.total||0,"ms"]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Input Tokens:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:g(h.tokens).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Output Tokens:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:h.tokens?.completion_tokens?.toLocaleString()||0})]})]}),(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)(b,{title:"1. Client Request (Input)",defaultOpen:!0,icon:"input",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:JSON.stringify(h.request,null,2)})}),h.providerRequest&&(0,a.jsx)(b,{title:"2. Provider Request (Translated)",icon:"translate",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:JSON.stringify(h.providerRequest,null,2)})}),h.providerResponse&&(0,a.jsx)(b,{title:"3. Provider Response (Raw)",icon:"data_object",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:"object"==typeof h.providerResponse?JSON.stringify(h.providerResponse,null,2):h.providerResponse})}),(0,a.jsxs)(b,{title:"4. Client Response (Final)",defaultOpen:!0,icon:"output",children:[h.response?.thinking&&(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsxs)("h4",{className:"font-semibold text-text-main mb-2 flex items-center gap-2 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"psychology"}),"Thinking Process"]}),(0,a.jsx)("pre",{className:"max-h-[200px] max-w-full overflow-auto rounded-lg border border-amber-200 bg-amber-50 p-3 font-mono text-xs text-amber-900 dark:border-amber-800 dark:bg-amber-950/30 dark:text-amber-100 sm:p-4",children:h.response.thinking})]}),(0,a.jsx)("h4",{className:"font-semibold text-text-main mb-2 text-xs uppercase tracking-wide opacity-70",children:"Content"}),(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:h.response?.content||"[No content]"})]})]})]})})]})}let v=[{value:"today",label:"Today"},{value:"24h",label:"24h"},{value:"7d",label:"7D"},{value:"30d",label:"30D"},{value:"60d",label:"60D"}];function N(){return(0,a.jsx)(l.Suspense,{fallback:(0,a.jsx)(r.Qv,{}),children:(0,a.jsx)(w,{})})}function w(){let e=(0,n.useSearchParams)(),t=(0,n.useRouter)(),[s,i]=(0,l.useState)("today"),o=e.get("tab"),d=o&&["overview","logs","details"].includes(o)?o:"overview";return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-6 px-1 sm:px-0",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)(r.Iz,{options:[{value:"overview",label:"Overview"},{value:"details",label:"Details"}],value:d,onChange:s=>{if(s===d)return;let a=new URLSearchParams(e);a.set("tab",s),t.push(`/dashboard/usage?${a.toString()}`,{scroll:!1})},className:"w-full sm:w-auto"}),"overview"===d&&(0,a.jsx)(r.Iz,{options:v,value:s,onChange:i,size:"sm",className:"w-full sm:w-auto"})]}),"overview"===d&&(0,a.jsx)(l.Suspense,{fallback:(0,a.jsx)(r.Qv,{}),children:(0,a.jsx)(r.jK,{period:s,setPeriod:i,hidePeriodSelector:!0})}),"logs"===d&&(0,a.jsx)(r.gM,{}),"details"===d&&(0,a.jsx)(j,{})]})}}},e=>{e.O(0,[2574,3862,2691,9959,1997,5564,5263,5497,8441,3794,7358],()=>e(e.s=21007)),_N_E=e.O()}]);
|