@jheavenknows/bluerouter 5.1.62 → 5.2.3
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 +15 -13
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/routes-manifest.json +12 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +3 -3
- 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 +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
- 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/media-providers/[kind]/[id]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js +2 -2
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js +2 -2
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 +5 -5
- 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 +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js +2 -2
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +3 -3
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js +2 -2
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js +1 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js +47 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +1 -329
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js +2 -2
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js +2 -2
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js +2 -2
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +2 -2
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js +2 -2
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js +2 -2
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
- 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 +3 -3
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js +3 -3
- 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 +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 +3 -3
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js +2 -2
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +2 -2
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js +2 -2
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js +2 -2
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
- 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 +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- 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 +2 -2
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- 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 +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
- 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 +8 -8
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- 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 +2 -2
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- 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 +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/favicon.ico/route.js +1 -1
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +5 -5
- 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 +5 -5
- 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 +5 -5
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing/page.js +2 -2
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +5 -5
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
- 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 +5 -5
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login/page.js +2 -2
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +6 -6
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
- 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 +5 -5
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +2 -2
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js +2 -2
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +15 -13
- package/app/.next-cli-build/server/chunks/2664.js +1 -0
- package/app/.next-cli-build/server/chunks/2731.js +375 -0
- package/app/.next-cli-build/server/chunks/{3248.js → 3031.js} +2 -2
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/402.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/4790.js +1 -1
- package/app/.next-cli-build/server/chunks/5434.js +329 -0
- package/app/.next-cli-build/server/chunks/5810.js +384 -0
- package/app/.next-cli-build/server/chunks/{9479.js → 6118.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 +6 -6
- package/app/.next-cli-build/server/chunks/6977.js +4 -233
- package/app/.next-cli-build/server/chunks/8352.js +2 -2
- package/app/.next-cli-build/server/chunks/8491.js +2 -2
- package/app/.next-cli-build/server/instrumentation.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js +3 -3
- 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/0Jimn3HyjTisxjaNXbz5E/_buildManifest.js +1 -0
- package/app/.next-cli-build/static/chunks/{5263-750f758e19269333.js → 5263-44fa80304458b0ea.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-7a66013a838a63bf.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/{page-05d2cd8e11e930dc.js → page-5f479cc10bd09c16.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/_global-error/page-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/users/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/[asset]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/branding/upload/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/autostart/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/prompt-log-db/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/root-ca/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/qwen-settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/config/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/heartbeat/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/command/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/snapshot/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/sync/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cluster/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/ai-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/analyze/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/combos/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/endpoint/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/options/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/token-saver/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/init/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/caveman-test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/rotate/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/locale/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/api-key-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/import-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/usage/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/client/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/monitor/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/permissions/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/routing/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/recalculate/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-health/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/[id]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/ai-models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/analyze/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/history/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tags/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-login/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-start-daemon/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/restart/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/app/page-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-9dd8e15354833c59.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-9dd8e15354833c59.js +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next-cli-build/static/bnvY5yHUWbTyTB23sa7Ba/_buildManifest.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-c63cf50756d71ffe.js +0 -1
- package/app/.next-cli-build/static/chunks/app/_global-error/page-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/ldap/users/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/[asset]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/branding/upload/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/autostart/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/prompt-log-db/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/root-ca/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/qwen-settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/config/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/heartbeat/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/command/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/peers/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/snapshot/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/sync/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cluster/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/analytics/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/combos/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/endpoint/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/options/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/prompt-logs/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/token-saver/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/health/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/init/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/caveman-test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/rotate/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/locale/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/api-key-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/import-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/[id]/usage/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/client/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/monitor/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/permissions/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/personal-cloud-providers/routing/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/recalculate/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-health/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/[id]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/ai-models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/analyze/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/history/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/resource-monitor/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tags/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-login/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-start-daemon/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/restart/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/app/page-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-4e0a15ae7b98e3a3.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-4e0a15ae7b98e3a3.js +0 -1
- /package/app/.next-cli-build/static/{bnvY5yHUWbTyTB23sa7Ba → 0Jimn3HyjTisxjaNXbz5E}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.57-to-5.1.58-5.1.58-20260722-113541 → upgrade-5.1.61-to-5.1.62-5.1.62-20260722-130430}/data.sqlite +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.1.58-to-5.1.59-5.1.59-20260722-114806 → upgrade-5.1.62-to-5.2.2-5.2.2-20260722-133208}/data.sqlite +0 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"use strict";exports.id=2731,exports.ids=[2731],exports.modules={26738:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Q:()=>m});var e=c(70321),f=c(80408),g=c(64013),h=a([g]);function i(a){return null==a||Number.isNaN(a)?"n/a":`${Math.round(a).toLocaleString("vi-VN")}ms`}function j(a){return null==a||Number.isNaN(a)?"n/a":`${(100*a).toFixed(1)}%`}function k(a,b=0){return null==a||Number.isNaN(a)?"n/a":Number(a).toLocaleString("vi-VN",{maximumFractionDigits:b})}async function l(){let a=await (0,e.Fh)(),b=new Map;for(let c of a)"openai-compatible"===c.type&&"vllm"===c.openAICompatibleRuntime&&b.set(c.id,c.name||c.id);return b}async function m(a,{requestedBy:b="Hệ thống (tự động)"}={}){let c,d,h,n,o,p,q,r,s,t,u,v,{connectionId:w,model:x}=(0,g.M1)(a);if(!w||!x)throw Error("Chưa chọn AI model để ph\xe2n t\xedch");let[y,z]=await Promise.all([(0,f.b2)({period:"todayWorking",timeZone:"Asia/Ho_Chi_Minh"}),l()]),A=(c=y.overview||{},d=y.experience||{},h=y.groups||{},n=y.requestErrors||{},o=y.anomalies||[],q=(p=d.byModel||[]).filter(a=>z.has(a.provider)),r=p.filter(a=>!z.has(a.provider)),s=a=>{let b=z.has(a.provider)?`${a.model} @ vLLM local server "${z.get(a.provider)}"`:`${a.model} (${a.provider})`;return` - ${b}: ${a.samples} request, latency avg ${i(a.avgLatencyMs)} / p50 ${i(a.p50LatencyMs)} / p95 ${i(a.p95LatencyMs)} / max ${i(a.maxLatencyMs)}, TTFT avg ${i(a.avgTtftMs)} / p95 ${i(a.p95TtftMs)}, prompt tokens avg ${k(a.avgPromptTokens)} / max ${k(a.maxPromptTokens)}, completion tokens avg ${k(a.avgCompletionTokens)}, request chậm (>=45s): ${a.slowRequests}, TTFT chậm (>=20s): ${a.slowTtftRequests}, input d\xe0i (>=30k token): ${a.longInputRequests}, input rất lớn (>=50k token): ${a.hugeInputRequests}`},t=(n.topServerErrors||n.topErrors||[]).slice(0,8).map(a=>` - ${a.label||a.provider||a.status}: ${a.requests} lần, model ${a.model||"?"}, endpoint ${a.endpoint||"?"}${a.sample?`, v\xed dụ: ${String(a.sample).slice(0,200)}`:""}`),u=o.map(a=>` - [${a.level}] ${a.title}: ${a.detail}`),v=(h.providers||[]).slice(0,10).map(a=>` - ${a.label}: ${a.requests} request, ${k(a.totalTokens)} token, lỗi ${j(a.errorRate)}, cost ${a.cost?a.cost.toFixed(4):0}`),`Bạn l\xe0 chuy\xean gia SRE/MLOps vận h\xe0nh hạ tầng AI Gateway (BlueRouter). Dưới đ\xe2y l\xe0 số liệu thống k\xea usage/API trong giờ l\xe0m việc h\xf4m nay (8:00 - 18:00):
|
|
2
|
+
|
|
3
|
+
## Tổng quan
|
|
4
|
+
- Tổng request: ${c.requests}, th\xe0nh c\xf4ng: ${c.success}, lỗi: ${c.errors}, đang xử l\xfd: ${c.pending}
|
|
5
|
+
- Tỷ lệ lỗi tổng: ${j(c.errorRate)}, lỗi server-impacting: ${j(c.serverErrorRate)}, lỗi client: ${j(c.clientErrorRate)}, lỗi rate-limit: ${j(c.rateLimitErrorRate)}
|
|
6
|
+
- Tổng token: ${k(c.totalTokens)} (prompt ${k(c.promptTokens)}, completion ${k(c.completionTokens)}), cost ước t\xednh: ${c.cost?c.cost.toFixed(4):0}
|
|
7
|
+
- Request/ph\xfat: ${k(c.requestsPerMinute,2)}, token/ph\xfat: ${k(c.tokensPerMinute,1)}
|
|
8
|
+
- Provider đang hoạt động: ${c.activeProviders}, model: ${c.activeModels}, API key: ${c.activeApiKeys}, endpoint: ${c.activeEndpoints}
|
|
9
|
+
- Điểm trải nghiệm người d\xf9ng hiện tại (userExperienceScore): ${c.userExperienceScore??"n/a"} (${c.userExperienceLabel||"n/a"})
|
|
10
|
+
|
|
11
|
+
## Trải nghiệm (tab "Trải nghiệm") — chi tiết
|
|
12
|
+
- Số mẫu: ${d.samples}, đ\xe1nh gi\xe1 tổng thể: ${d.label} (score ${d.score})
|
|
13
|
+
- Latency: avg ${i(d.avgLatencyMs)}, p50 ${i(d.p50LatencyMs)}, p95 ${i(d.p95LatencyMs)}, p99 ${i(d.p99LatencyMs)}
|
|
14
|
+
- TTFT (time-to-first-token): avg ${i(d.avgTtftMs)}, p95 ${i(d.p95TtftMs)}, p99 ${i(d.p99TtftMs)}
|
|
15
|
+
- Tốc độ sinh token (decode): ${k(d.decodeTokensPerSecond,1)} tok/s, output tổng: ${k(d.outputTokensPerSecond,1)} tok/s
|
|
16
|
+
- Latency quy đổi tr\xean mỗi 10k input token: ${i(d.latencyMsPer10kInputTokens)}
|
|
17
|
+
- Tỷ lệ request chậm (>=45s): ${j(d.slowRequestRate)}, rất chậm (>=90s): ${j(d.verySlowRequestRate)}, TTFT chậm (>=20s): ${j(d.slowTtftRate)}
|
|
18
|
+
- Tỷ lệ input d\xe0i (>=30k token): ${j(d.longInputRate)}, input rất lớn (>=50k token): ${j(d.hugeInputRate)}, input cực lớn (>=70k token): ${j(d.extremeInputRate)}
|
|
19
|
+
|
|
20
|
+
### Chi tiết theo từng model — VLLM LOCAL SERVER (ưu ti\xean ph\xe2n t\xedch kỹ nhất)
|
|
21
|
+
${q.length?q.map(s).join("\n"):" (Kh\xf4ng c\xf3 traffic n\xe0o đi qua vLLM local server trong khung giờ n\xe0y)"}
|
|
22
|
+
|
|
23
|
+
### Chi tiết theo từng model — Provider kh\xe1c (cloud/API)
|
|
24
|
+
${r.length?r.map(s).join("\n"):" (Kh\xf4ng c\xf3 dữ liệu)"}
|
|
25
|
+
|
|
26
|
+
## Provider (top theo request)
|
|
27
|
+
${v.length?v.join("\n"):" (Kh\xf4ng c\xf3 dữ liệu)"}
|
|
28
|
+
|
|
29
|
+
## Lỗi nổi bật
|
|
30
|
+
${t.length?t.join("\n"):" (Kh\xf4ng c\xf3 lỗi đ\xe1ng ch\xfa \xfd)"}
|
|
31
|
+
|
|
32
|
+
## Bất thường hệ thống đ\xe3 ph\xe1t hiện tự động
|
|
33
|
+
${u.length?u.join("\n"):" (Kh\xf4ng ph\xe1t hiện bất thường)"}
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
H\xe3y viết một bản đ\xe1nh gi\xe1 bằng tiếng Việt, chi tiết v\xe0 cụ thể, gồm c\xe1c phần:
|
|
37
|
+
1. **Đ\xe1nh gi\xe1 tổng qu\xe1t** về t\xecnh trạng hệ thống h\xf4m nay (hiệu năng, độ ổn định, chi ph\xed).
|
|
38
|
+
2. **Đ\xe1nh gi\xe1 ri\xeang cho c\xe1c vLLM local AI server** (nếu c\xf3 traffic): ph\xe2n t\xedch s\xe2u về độ trễ, TTFT, tốc độ sinh token, khả năng chịu tải, dấu hiệu qu\xe1 tải GPU/nghẽn cổ (bottleneck), so s\xe1nh với c\xe1c model cloud kh\xe1c nếu c\xf3; nếu kh\xf4ng c\xf3 traffic th\xec ghi r\xf5.
|
|
39
|
+
3. **Ph\xe2n t\xedch lỗi v\xe0 bất thường** — nguy\xean nh\xe2n khả dĩ v\xe0 mức độ ưu ti\xean xử l\xfd.
|
|
40
|
+
4. **Dự b\xe1o xu hướng** cho c\xe1c giờ/ng\xe0y tới dựa tr\xean xu hướng hiện tại (tải tăng/giảm, nguy cơ qu\xe1 tải, nhu cầu scale th\xeam vLLM instance...).
|
|
41
|
+
5. **Đề xuất h\xe0nh động cụ thể** (ngắn gọn, c\xf3 thể thực thi ngay).
|
|
42
|
+
|
|
43
|
+
Sau phần đ\xe1nh gi\xe1, kết th\xfac bằng một khối JSON hợp lệ duy nhất (kh\xf4ng c\xf3 text n\xe0o kh\xe1c trong khối n\xe0y) theo định dạng:
|
|
44
|
+
|
|
45
|
+
\`\`\`json
|
|
46
|
+
{"status":"normal|warning|critical","vllmStatus":"normal|warning|critical|no_traffic"}
|
|
47
|
+
\`\`\``),{content:B,connection:C,isCombo:D}=await (0,g.sn)(a,A),{status:E,vllmStatus:F}=function(a){let b=a.match(/```json\s*([\s\S]*?)\s*```/)||a.match(/(\{[\s\S]*\})\s*$/);if(!b)return{status:"unknown",vllmStatus:"unknown"};try{let a=JSON.parse(b[1]);return{status:String(a.status||"unknown"),vllmStatus:String(a.vllmStatus||"unknown")}}catch{return{status:"unknown",vllmStatus:"unknown"}}}(B),G=B.replace(/```json[\s\S]*?```/,"").trim(),H={connectionId:D?"combo":C.id,provider:D?"combo":C.provider,model:x,modelLabel:(0,g.XA)(D,C,x),generatedAt:Date.now(),rangeStart:y.filters?.startIso?Date.parse(y.filters.startIso):null,rangeEnd:y.filters?.endIso?Date.parse(y.filters.endIso):null,summary:G,status:E,vllmStatus:F,vllmServerCount:z.size,requestedBy:b};return await (0,e.Xx)({dashboardAnalyticsAiAnalysis:H}),H}g=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},80408:(a,b,c)=>{c.d(b,{b2:()=>a_});var d=c(24081),e=c(50743),f=c(41170);async function g(){return(0,f.I6)(await (0,f.L7)())}async function h(a){let b=new(await Promise.resolve().then(c.bind(c,64939))).Client({host:a.host,port:Number(a.port||5432),database:a.database,user:a.username,password:a.password,ssl:!!a.ssl&&{rejectUnauthorized:!1}});return await b.connect(),{type:"postgres",query:async(a,c=[])=>(await b.query(a,c)).rows,queryOne:async(a,c=[])=>(await b.query(a,c)).rows[0]||null,async exec(a,c=[]){await b.query(a,c)},async close(){await b.end()}}}async function i(a){let b=await c.e(4790).then(c.t.bind(c,94790,19)),d=await b.createConnection({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,dateStrings:!0,connectTimeout:3e3});return{type:"mysql",async query(a,b=[]){let[c]=await d.query(a,b);return c},async queryOne(a,b=[]){let[c]=await d.query(a,b);return c[0]||null},async exec(a,b=[]){await d.query(a,b)},async close(){await d.end()}}}async function j(a){if("postgres"===a.type)return h(a);if("mysql"===a.type)return i(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}async function k(a){let b=await j(a);try{var c;let d=(await b.query("SELECT DISTINCT COALESCE(NULLIF(display_model, ''), model) AS model FROM prompt_logs WHERE model IS NOT NULL AND model <> '' ORDER BY model LIMIT 300")).map(a=>a.model),e=(await b.query("SELECT DISTINCT stage FROM prompt_logs WHERE stage IS NOT NULL AND stage <> '' ORDER BY stage LIMIT 100")).map(a=>a.stage),f=(c=a.type,"postgres"===c?"(meta_json->>'combo_name')":"combo_name"),g=(await b.query(`SELECT DISTINCT ${f} AS combo_name FROM prompt_logs WHERE ${f} IS NOT NULL AND ${f} <> '' ORDER BY combo_name LIMIT 300`)).map(a=>a.combo_name);return{models:d,stages:e,combos:g,dbInfo:{type:a.type,host:a.host,database:a.database}}}finally{await b.close()}}async function l(){let a=await g();if(!a.enabled)return{disabled:!0,models:[],stages:[],combos:[],dbInfo:{type:a.type}};if("postgres"===a.type||"mysql"===a.type)return k(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}let m=new Set;function n(a){return String(a||"").trim()}function o(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}async function p(){return(0,f.I6)(await (0,f.L7)())}async function q(a){let b=new(await Promise.resolve().then(c.bind(c,64939))).Client({host:a.host,port:Number(a.port||5432),database:a.database,user:a.username,password:a.password,ssl:!!a.ssl&&{rejectUnauthorized:!1}});return await b.connect(),{type:"postgres",query:async(a,c=[])=>(await b.query(a,c)).rows,queryOne:async(a,c=[])=>(await b.query(a,c)).rows[0]||null,async exec(a,c=[]){await b.query(a,c)},async close(){await b.end()}}}function r(a){if("string"!=typeof a||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(a))return a;let b=new Date(a);return Number.isNaN(b.getTime())?a:b.toISOString().slice(0,23).replace("T"," ")}async function s(a){let b=await c.e(4790).then(c.t.bind(c,94790,19)),d=await b.createConnection({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,dateStrings:!0,connectTimeout:3e3});return{type:"mysql",async query(a,b=[]){let[c]=await d.query(a,((a=[])=>a.map(r))(b));return c},async queryOne(a,b=[]){let[c]=await d.query(a,((a=[])=>a.map(r))(b));return c[0]||null},async exec(a,b=[]){await d.query(a,((a=[])=>a.map(r))(b))},async close(){await d.end()}}}async function t(a){if("postgres"===a.type)return q(a);if("mysql"===a.type)return s(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}async function u(a){let b=await t(a);try{if("mysql"===a.type){let a=await b.query("SHOW INDEX FROM prompt_logs WHERE Key_name = 'idx_prompt_logs_created_at'").catch(()=>[]);a&&0!==a.length||await b.exec("CREATE INDEX idx_prompt_logs_created_at ON prompt_logs (created_at)")}else await b.exec("CREATE INDEX IF NOT EXISTS idx_prompt_logs_created_at ON prompt_logs (created_at)")}finally{await b.close()}}async function v(a){if(!a.enabled)return;let b=`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!m.has(b))try{await u(a),m.add(b)}catch(a){console.warn("[prompt-log-analytics] Unable to ensure indexes:",a?.message||a)}}async function w(a,b,c,d,e=50){let f=Math.max(1,Math.min(500,Number(e)||50));return await a.query(`SELECT ${c},
|
|
48
|
+
COUNT(*) AS requests,
|
|
49
|
+
SUM(CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 1
|
|
50
|
+
WHEN status_code IS NOT NULL AND CONCAT('', status_code) NOT LIKE '2%' THEN 1
|
|
51
|
+
ELSE 0 END) AS errors,
|
|
52
|
+
SUM(CASE WHEN (error_text IS NULL OR error_text = '') AND (status_code IS NULL OR CONCAT('', status_code) LIKE '2%') THEN 1 ELSE 0 END) AS success,
|
|
53
|
+
MAX(created_at) AS lastSeen
|
|
54
|
+
FROM prompt_logs
|
|
55
|
+
${b.clause}
|
|
56
|
+
GROUP BY ${d}
|
|
57
|
+
ORDER BY requests DESC, errors DESC, lastSeen DESC
|
|
58
|
+
LIMIT ${f}`,b.params)}function x(a,b=null){return(a||[]).map(a=>(function(a={},b={}){let c=o(a.requests,0),d=o(a.errors,0),e=o(a.success,Math.max(0,c-d));return{key:n(a.key??a.metric_key)||"unknown",label:n(a.label||a.key||a.metric_key)||"unknown",requests:c,success:e,errors:d,errorRate:c?d/c:0,promptTokens:0,completionTokens:0,totalTokens:0,cost:0,lastSeen:n(a.lastSeen),topModels:[],topTools:[],topIps:[],...b}})(a,b?b(a):{}))}let y={createdAt:0,data:null,promise:null};async function z(){return y.promise?y.promise:y.data&&Date.now()-y.createdAt<6e5?y.data:(y.promise=l().then(a=>(y={createdAt:Date.now(),data:a,promise:null},a)).catch(()=>(y.promise=null,y.data||{models:[],stages:[]})),y.promise)}async function A(a,b){let c=a.type,d=[await t(a)];try{let e=await Promise.all(Array.from({length:3},()=>t(a).catch(()=>null)));d.push(...e.filter(Boolean));let f=a=>d[a%d.length],g=function(a={},b){let c=function(a={}){return{keyword:n(a.keyword),model:n(a.model),stage:n(a.stage),sessionId:n(a.sessionId),clientIp:n(a.clientIp||a.sourceIp),sourceTool:n(a.sourceTool),dateFrom:n(a.dateFrom||a.startStored||a.startIso),dateTo:n(a.dateTo||a.endStored||a.endIso),workingTimeRanges:Array.isArray(a.workingTimeRanges)?a.workingTimeRanges:[]}}(a),d=[],e=[],f=a=>(e.push(a),"postgres"===b?`$${e.length}`:"?"),g="postgres"===b?"ILIKE":"LIKE";if(c.keyword){let a=`%${c.keyword}%`;d.push(`(${["prompt_text","response_text","error_text","model","endpoint","provider","account_name","connection_id","display_model","session_id","client_ip","client_host","client_user_agent","source_tool","source_tool_label","source_host"].map(b=>`${b} ${g} ${f(a)}`).join(" OR ")})`)}if(c.model&&d.push(`(model = ${f(c.model)} OR display_model = ${f(c.model)})`),c.stage&&d.push(`stage = ${f(c.stage)}`),c.sessionId&&d.push(`session_id = ${f(c.sessionId)}`),c.clientIp&&d.push(`client_ip ${g} ${f(`%${c.clientIp}%`)}`),c.sourceTool){let a=`%${c.sourceTool}%`;d.push(`(source_tool ${g} ${f(a)} OR source_tool_label ${g} ${f(a)} OR source_host ${g} ${f(a)})`)}let h=c.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso);return h.length?d.push(`(${h.map(a=>`(created_at >= ${f(a.startIso)} AND created_at < ${f(a.endIso)})`).join(" OR ")})`):(c.dateFrom&&d.push(`created_at >= ${f(c.dateFrom)}`),c.dateTo&&d.push(`created_at < ${f(c.dateTo)}`)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e,add:f}}(b,c),[h,i,j,k,l,m,p,q,r]=await Promise.all([f(0).queryOne(`SELECT COUNT(*) AS count FROM prompt_logs ${g.clause}`,g.params),w(f(1),g,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS metric_key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')"),w(f(2),g,"COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS metric_key, COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS label","COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown')"),w(f(3),g,"COALESCE(NULLIF(session_id, ''), 'unknown') AS metric_key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')"),w(f(0),g,"COALESCE(NULLIF(stage, ''), 'unknown') AS metric_key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')"),w(f(1),g,"COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS metric_key, COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS label","COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown')"),w(f(2),g,"COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS metric_key, COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown')"),w(f(3),g,"CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS metric_key, CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS label","CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END"),z()]),s=o(h?.count,0),u=x(i),v=x(j),y=x(k),A=x(l),B=x(m),C=x(p),D=x(q);return{total:s,sampled:s,disabled:!1,missing:!1,dbInfo:{type:a.type,host:a.host,database:a.database},models:r.models||[],stages:r.stages||[],topClientIps:u,topSourceTools:v,topSessions:y,topStages:A,topModels:B,topAccounts:C,topStatuses:D}}finally{await Promise.all(d.map(a=>a.close().catch(()=>{})))}}async function B(a={}){let b=await p();if(!b.enabled)return{disabled:!0,missing:!1,total:0,sampled:0,dbInfo:{type:b.type},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]};if(await v(b),"postgres"===b.type||"mysql"===b.type)return A(b,a);throw Error(`Unsupported prompt log database type: ${b.type}`)}var C=c(42352),D=c(689);let E=new Set(["today","todayWorking","yesterday","yesterdayWorking","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),F="today",G=process.env.DASHBOARD_ANALYTICS_TIME_ZONE||"Asia/Saigon",H=["Token Destroyer","Context Monarch","Prompt Titan","Output Overlord","Quota Crusher"],I="lower(trim(COALESCE(CAST(status AS TEXT), '')))",J=`(
|
|
59
|
+
${I} GLOB 'error*'
|
|
60
|
+
OR ${I} GLOB 'fail*'
|
|
61
|
+
OR ${I} GLOB 'failed*'
|
|
62
|
+
OR ${I} GLOB 'timeout*'
|
|
63
|
+
OR ${I} GLOB 'network*'
|
|
64
|
+
OR ${I} GLOB 'aborted*'
|
|
65
|
+
OR ${I} GLOB 'abort*'
|
|
66
|
+
OR ${I} GLOB 'rate_limited*'
|
|
67
|
+
OR ${I} GLOB 'provider_error*'
|
|
68
|
+
OR ${I} GLOB 'gateway_error*'
|
|
69
|
+
OR ${I} GLOB 'parse_error*'
|
|
70
|
+
OR ${I} GLOB 'model_error*'
|
|
71
|
+
)`,K=`(
|
|
72
|
+
(COALESCE(statusCode, 0) BETWEEN 200 AND 299 AND NOT ${J})
|
|
73
|
+
OR ${I} = ''
|
|
74
|
+
OR ${I} IN ('ok', 'success', 'succeeded', 'complete', 'completed', 'done', '200')
|
|
75
|
+
OR ${I} GLOB '2[0-9][0-9]*'
|
|
76
|
+
OR ${I} GLOB 'ok*'
|
|
77
|
+
OR ${I} GLOB 'success*'
|
|
78
|
+
OR ${I} GLOB 'succeeded*'
|
|
79
|
+
OR ${I} GLOB 'complete*'
|
|
80
|
+
OR ${I} GLOB 'completed*'
|
|
81
|
+
OR ${I} GLOB 'done*'
|
|
82
|
+
)`,L=`(
|
|
83
|
+
${I} IN ('pending', 'running', 'in_progress', 'queued', 'processing')
|
|
84
|
+
)`,M=`(NOT ${L})`,N=`
|
|
85
|
+
SUM(CASE WHEN ${M} THEN 1 ELSE 0 END) AS requests,
|
|
86
|
+
SUM(CASE WHEN ${M} AND ${K} THEN 1 ELSE 0 END) AS success,
|
|
87
|
+
SUM(CASE WHEN ${M} AND NOT ${K} THEN 1 ELSE 0 END) AS errors,
|
|
88
|
+
SUM(CASE WHEN ${L} THEN 1 ELSE 0 END) AS pending,
|
|
89
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(promptTokens, 0) ELSE 0 END), 0) AS promptTokens,
|
|
90
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(completionTokens, 0) ELSE 0 END), 0) AS completionTokens,
|
|
91
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
|
|
92
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(cachedTokens, 0) ELSE 0 END), 0) AS cachedTokens,
|
|
93
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(reasoningTokens, 0) ELSE 0 END), 0) AS reasoningTokens,
|
|
94
|
+
COALESCE(SUM(CASE WHEN ${M} THEN COALESCE(cost, 0) ELSE 0 END), 0) AS cost,
|
|
95
|
+
MAX(timestamp) AS lastSeen
|
|
96
|
+
`;function O(a){return String(a||"").trim()}function P(a){return O(a).toLowerCase()}function Q(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function R(a){let b=O(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function S(a,b){let c=new Intl.DateTimeFormat("en-CA",{timeZone:b,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(a),d={};for(let a of c)"literal"!==a.type&&(d[a.type]=Number(a.value));return d}function T(a,b){let c=S(a,b);return Date.UTC(c.year,c.month-1,c.day,c.hour,c.minute,c.second||0)-a.getTime()}function U(a,b,c,d,e=0,f=0,g=0,h=0){let i=new Date(Date.UTC(b,c-1,d,e,f,g,h)),j=T(i,a);return j=T(i=new Date(i.getTime()-j),a),new Date(Date.UTC(b,c-1,d,e,f,g,h)-j)}function V(a,b){let c=S(a,b);return{year:c.year,month:c.month,day:c.day}}function W(a,b){return[{from:[8,0],to:[12,0]},{from:[13,15],to:[17,15]}].map(c=>{let d=U(b,a.year,a.month,a.day,c.from[0],c.from[1]),e=U(b,a.year,a.month,a.day,c.to[0],c.to[1]);return{start:d,end:e,startIso:d.toISOString(),endIso:e.toISOString()}})}function X(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}function Y(a,b){let c=new Date(a);return c.setDate(c.getDate()+b),c}function Z(a=new Date){let b=X(a),c=b.getDay();return Y(b,0===c?-6:1-c)}function $(a=new Date){let b=new Date(a);return b.setDate(1),b.setHours(0,0,0,0),b}function _(a={}){var b;return{...function(a={}){let b=E.has(a.period)?a.period:"24h",c=function(a){let b=O(a);if(!b)return"UTC";try{return new Intl.DateTimeFormat("en-US",{timeZone:b}).format(new Date),b}catch{return"UTC"}}(a.timeZone),d=new Date(3e4*Math.floor(Date.now()/3e4)),e=null,f=d,g=[];if("custom"===b){let b=R(a.dateFrom),c=R(a.dateTo);e=new Date(b||d.getTime()-864e5),f=c?new Date(c):d}else if("today"===b)e=X(d);else if("todayWorking"===b)g=W(V(d,c),c),e=g[0]?.start||X(d),f=g[g.length-1]?.end||d;else if("yesterday"===b){let a=X(d);e=Y(a,-1),f=a}else if("yesterdayWorking"===b)g=W(function({year:a,month:b,day:c}){let d=new Date(Date.UTC(a,b-1,c));return d.setUTCDate(d.getUTCDate()+-1),{year:d.getUTCFullYear(),month:d.getUTCMonth()+1,day:d.getUTCDate()}}(V(d,c)),c),e=g[0]?.start||Y(X(d),-1),f=g[g.length-1]?.end||X(d);else if("24h"===b)e=new Date(d.getTime()-864e5);else if("thisWeek"===b)e=Z(d);else if("lastWeek"===b){let a=Z(d);e=Y(a,-7),f=a}else if("7d"===b)e=new Date(d.getTime()-6048e5);else if("thisMonth"===b)e=$(d);else if("lastMonth"===b){let a=$(d);(e=new Date(a)).setMonth(e.getMonth()-1),f=a}else e="30d"===b?new Date(d.getTime()-2592e6):new Date(d.getTime()-5184e6);if(e&&f&&e>f){let a=e;e=f,f=a}return{period:b,timeZone:c,start:e,end:f,startIso:e?e.toISOString():"",endIso:f?f.toISOString():"",workingTimeRanges:g}}(a),provider:O(a.provider),model:O(a.model),connectionId:O(a.connectionId),status:O(a.status),endpoint:O(a.endpoint),apiKey:O(a.apiKey),clientIp:O(a.clientIp||a.sourceIp),sourceTool:O(a.sourceTool),sessionId:O(a.sessionId),keyword:O(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(Q(a.maxPromptLogRows,1500)))),userOwnedOnly:!0===a.userOwnedOnly||"1"===a.userOwnedOnly||"true"===a.userOwnedOnly,ownerCandidates:Array.isArray(b=a.ownerCandidates)?[...new Set(b.map(a=>P(a)).filter(Boolean))]:[...new Set(String(b||"").split(/[,\s]+/).map(a=>P(a)).filter(Boolean))],ownedAnyUserOnly:!0===a.ownedAnyUserOnly||"1"===a.ownedAnyUserOnly||"true"===a.ownedAnyUserOnly}}function aa(a){let b,c=O(a);return c?(b=O(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function ab(a){try{let b=await a.all("SELECT * FROM apiKeys ORDER BY createdAt DESC")||[],c=new Map,d=new Map,e=[];for(let a of b){let b=function(a={}){let b=O(a.key),c=aa(b);return{id:O(a.id),key:b,fingerprint:c,masked:c,name:O(a.name)||c,ownerUser:O(a.ownerUser||a.owner_user),createdByUser:O(a.createdByUser||a.created_by_user),machineId:O(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:O(a.createdAt||a.created_at)}}(a);e.push(b),b.key&&c.set(b.key,b),d.set(b.fingerprint,b)}return{rows:b,all:e,byKey:c,byFingerprint:d}}catch{return{rows:[],all:[],byKey:new Map,byFingerprint:new Map}}}async function ac(a){let b=new Map;try{for(let c of await a.all("SELECT id, provider, name, email, isActive FROM providerConnections")||[])b.set(c.id,{id:c.id,provider:c.provider||"",name:c.name||c.email||c.id,email:c.email||"",isActive:1===c.isActive||!0===c.isActive})}catch{}try{for(let c of await a.all("SELECT id, type, name FROM providerNodes")||[]){let a=O(c.id);if(!a)continue;let d=O(c.name)||a;b.set(a,{id:a,provider:a,type:O(c.type),name:d,isProviderNode:!0})}}catch{}return b}function ad(a,b=new Map){let c=O(a);if(!c)return"unknown";let d=b.get(c);if(d?.name)return d.name;let e=[...b.values()].filter(a=>a.provider===c&&a.name&&a.name!==c);return 1===e.length?e[0].name:c}function ae(a){let b=Q(a.errors,0),c=Q(a.success,0),d=Q(a.pending,0),e=Q(a.requests,c+b),f=Q(a.promptTokens,0),g=Q(a.completionTokens,0),h=Q(a.totalTokens,f+g),i=c+b||e;return{...a,requests:e,success:c,errors:b,pending:d,totalTokens:h,errorRate:i?b/i:0,avgPromptTokens:e?f/e:0,avgCompletionTokens:e?g/e:0,avgTokens:e?h/e:0}}function af(a,b,c,d,e=!1){let f=Array.isArray(d.workingTimeRanges)?d.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso):[];if(f.length){let d=e?"<=":"<";for(let e of(a.push(`(${f.map(()=>`(${c} >= ? AND ${c} ${d} ?)`).join(" OR ")})`),f))b.push(e.startIso,e.endIso);return}d.startIso&&(a.push(`${c} >= ?`),b.push(d.startIso)),d.endIso&&(a.push(`${c} ${e?"<=":"<"} ?`),b.push(d.endIso))}function ag(a,b=null,c={}){let d=[],e=[];if(af(d,e,"timestamp",a,!1),a.provider&&"provider"!==c.skip&&(d.push("provider = ?"),e.push(a.provider)),a.model&&"model"!==c.skip&&(d.push("model = ?"),e.push(a.model)),a.connectionId&&"connectionId"!==c.skip&&(d.push("connectionId = ?"),e.push(a.connectionId)),a.status&&"status"!==c.skip&&(d.push("status = ?"),e.push(a.status)),a.endpoint&&"endpoint"!==c.skip&&(d.push("endpoint = ?"),e.push(a.endpoint)),b&&"apiKey"!==c.skip)if(b.noMatch)d.push("1 = 0");else{let a=[];if((b.keys||[]).length>0){let c=b.keys.map(()=>"?").join(", ");a.push(`(apiKey IN (${c}) OR apiKeyFingerprint IN (${c}) OR apiKeyId IN (${c}))`),e.push(...b.keys,...b.keys,...b.keys)}if(b.filter){a.push("(apiKeyFingerprint LIKE ? OR apiKeyName LIKE ? OR apiKeyOwner LIKE ? OR apiKeyId LIKE ?)");let c=`%${b.filter}%`;e.push(c,c,c,c)}b.includeLocal&&a.push("(apiKey IS NULL OR apiKey = '' OR apiKeyFingerprint = 'local-no-key')"),a.length&&d.push(`(${a.join(" OR ")})`)}let f=a.ownerScope;if(f?.enabled&&"apiKey"!==c.skip)if(f.noMatch)d.push("1 = 0");else{let a=[];if((f.identifiers||[]).length>0){let b=f.identifiers.map(()=>"?").join(", ");a.push(`(apiKey IN (${b}) OR apiKeyFingerprint IN (${b}) OR apiKeyId IN (${b}))`),e.push(...f.identifiers,...f.identifiers,...f.identifiers)}if((f.owners||[]).length>0){let b=f.owners.map(()=>"?").join(", ");a.push(`lower(COALESCE(apiKeyOwner, '')) IN (${b})`),e.push(...f.owners)}d.push(a.length?`(${a.join(" OR ")})`:"1 = 0")}if(a.clientIp&&"clientIp"!==c.skip&&(d.push("clientIpNormalized LIKE ?"),e.push(`%${a.clientIp}%`)),a.sourceTool&&"sourceTool"!==c.skip){d.push("(sourceTool LIKE ? OR sourceToolLabel LIKE ? OR sourceHost LIKE ?)");let b=`%${a.sourceTool}%`;e.push(b,b,b)}return a.sessionId&&"sessionId"!==c.skip&&(d.push("sessionId = ?"),e.push(a.sessionId)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e}}function ah(a,b){return Math.floor(a/b)*b}async function ai(a,b,c){let d=ag(b,c);return await a.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${d.clause}`,d.params)||{}}async function aj(a,b,c){let d=ag(b,c),e=await a.get(`SELECT
|
|
97
|
+
${N},
|
|
98
|
+
COUNT(DISTINCT COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''))) AS activeApiKeys,
|
|
99
|
+
COUNT(DISTINCT NULLIF(provider, '')) AS activeProviders,
|
|
100
|
+
COUNT(DISTINCT NULLIF(model, '')) AS activeModels,
|
|
101
|
+
COUNT(DISTINCT NULLIF(endpoint, '')) AS activeEndpoints
|
|
102
|
+
FROM usageHistory
|
|
103
|
+
${d.clause}`,d.params)||{},f=function(a={}){return ae({requests:Q(a.requests,0),success:Q(a.success,0),errors:Q(a.errors,0),pending:Q(a.pending,0),promptTokens:Q(a.promptTokens,0),completionTokens:Q(a.completionTokens,0),totalTokens:Q(a.totalTokens,0),cachedTokens:Q(a.cachedTokens,0),reasoningTokens:Q(a.reasoningTokens,0),cost:Q(a.cost,0),lastSeen:a.lastSeen||""})}(e),g=b.start&&b.end?Math.max(1,(b.end.getTime()-b.start.getTime())/6e4):1;return{...f,activeApiKeys:Q(e.activeApiKeys,0),activeProviders:Q(e.activeProviders,0),activeModels:Q(e.activeModels,0),activeEndpoints:Q(e.activeEndpoints,0),requestsPerMinute:f.requests/g,tokensPerMinute:f.totalTokens/g,inputOutputRatio:f.completionTokens?f.promptTokens/f.completionTokens:f.promptTokens?null:0}}function ak(a,b={}){return ae({key:O(a.key)||"unknown",label:O(a.label||a.key)||"unknown",requests:Q(a.requests,0),success:Q(a.success,0),errors:Q(a.errors,0),pending:Q(a.pending,0),promptTokens:Q(a.promptTokens,0),completionTokens:Q(a.completionTokens,0),totalTokens:Q(a.totalTokens,0),cachedTokens:Q(a.cachedTokens,0),reasoningTokens:Q(a.reasoningTokens,0),cost:Q(a.cost,0),lastSeen:a.lastSeen||"",...b})}async function al(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=ag(b,c);return await a.all(`SELECT
|
|
104
|
+
${d},
|
|
105
|
+
${N}
|
|
106
|
+
FROM usageHistory
|
|
107
|
+
${i.clause}
|
|
108
|
+
GROUP BY ${e}
|
|
109
|
+
ORDER BY ${h}
|
|
110
|
+
LIMIT ?`,[...f,...i.params,g])||[]}async function am(a,b,c,d,e=new Map){let f=ag(b,c),g=f.clause?`${f.clause} AND ${M}`:`WHERE ${M}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=await a.all(`SELECT
|
|
111
|
+
COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyGroupKey,
|
|
112
|
+
${h} AS itemKey,
|
|
113
|
+
COUNT(*) AS requests,
|
|
114
|
+
COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
|
|
115
|
+
MAX(timestamp) AS lastSeen
|
|
116
|
+
FROM usageHistory
|
|
117
|
+
${g}
|
|
118
|
+
GROUP BY COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key'), ${h}
|
|
119
|
+
ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=O(a.itemKey)||"unknown",c="provider"===d?ad(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(j,a.apiKeyGroupKey,{key:b,label:c,requests:Q(a.requests,0),totalTokens:Q(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}async function an(a,b,c,d,e){let f=Array.isArray(a)?a:[a],g=ag(b,e),[h,i,j,k,l,m,n,o,p,q]=await Promise.all([al(aV(f,0),b,e,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),al(aV(f,1),b,e,`
|
|
120
|
+
COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') AS key,
|
|
121
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
|
|
122
|
+
COALESCE(NULLIF(model, ''), 'unknown') AS model,
|
|
123
|
+
COALESCE(NULLIF(model, ''), 'unknown') || ' (' || COALESCE(NULLIF(provider, ''), 'unknown') || ')' AS label
|
|
124
|
+
`,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),al(aV(f,2),b,e,`
|
|
125
|
+
COALESCE(NULLIF(connectionId, ''), 'unknown') AS key,
|
|
126
|
+
COALESCE(NULLIF(connectionId, ''), 'unknown') AS connectionId,
|
|
127
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
|
|
128
|
+
COALESCE(NULLIF(connectionId, ''), 'unknown') AS label
|
|
129
|
+
`,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),al(aV(f,3),b,e,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),al(aV(f,4),b,e,"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS key, COALESCE(NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey, COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName, COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner, COALESCE(NULLIF(apiKeyId, ''), '') AS apiKeyId","COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"),am(aV(f,6),b,e,"model",d),am(aV(f,7),b,e,"provider",d),am(aV(f,8),b,e,"endpoint",d),al(aV(f,5),b,e,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),aV(f,9).all(`SELECT
|
|
130
|
+
COALESCE(NULLIF(status, ''), 'error') AS status,
|
|
131
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
|
|
132
|
+
COALESCE(NULLIF(model, ''), 'unknown') AS model,
|
|
133
|
+
COALESCE(NULLIF(endpoint, ''), 'unknown') AS endpoint,
|
|
134
|
+
COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey,
|
|
135
|
+
COALESCE(NULLIF(status, ''), 'error') || '|' || COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') || '|' || COALESCE(NULLIF(endpoint, ''), 'unknown') AS key,
|
|
136
|
+
${N}
|
|
137
|
+
FROM usageHistory
|
|
138
|
+
${g.clause?`${g.clause} AND NOT ${K} AND NOT ${L}`:`WHERE NOT ${K} AND NOT ${L}`}
|
|
139
|
+
GROUP BY COALESCE(NULLIF(status, ''), 'error'), COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown'), COALESCE(NULLIF(endpoint, ''), 'unknown'), COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')
|
|
140
|
+
ORDER BY errors DESC, requests DESC, lastSeen DESC
|
|
141
|
+
LIMIT ?`,[...g.params,100]).then(a=>a||[])]),r=h.map(a=>ak(a,{label:ad(a.key||a.label,d),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),s=i.map(a=>ak(a,{provider:a.provider||"",providerLabel:ad(a.provider,d),model:a.model||"",label:`${a.model||"unknown"} (${ad(a.provider,d)})`,topApiKeys:[]})),t=j.map(a=>{let b=d.get(a.connectionId);return ak(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:ad(b?.provider||a.provider,d),connectionId:a.connectionId||"",topModels:[]})}),u=k.map(a=>ak(a)),v=l.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,d=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(b=>b.id===a.apiKeyId||b.id===a.key),e=d?.fingerprint||aa(b),f=a.apiKeyName||d?.name||(b?e:"Local / kh\xf4ng d\xf9ng API key");return ak(a,{key:a.apiKeyId||e,label:f,name:f,fingerprint:e,apiKeyId:a.apiKeyId||d?.id||"",ownerUser:a.apiKeyOwner||d?.ownerUser||"",createdByUser:d?.createdByUser||"",isActive:d?.isActive??null,topModels:m.get(a.key)||[],topProviders:n.get(a.key)||[],topEndpoints:o.get(a.key)||[]})});return{providers:r,models:s,providerAccounts:t,endpoints:u,apiKeys:v,statuses:p.map(a=>ak(a)),errors:q.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,e=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(a=>a.id===b);return ak(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:ad(a.provider,d),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:e?.fingerprint||aa(b)})})}}async function ao(a,b,c,d={}){let e=function(a,b,c){let d=a.start?a.start.getTime():NaN,e=a.end?a.end.getTime():Date.now();if(!Number.isFinite(d)){let a=b?new Date(b).getTime():NaN,f=c?new Date(c).getTime():NaN;Number.isFinite(a)&&(d=a),Number.isFinite(f)&&(e=f)}Number.isFinite(d)||(d=e-864e5);let f=Math.max(1,e-d);return f<=216e5?3e5:f<=1296e5?36e5:f<=6912e5?216e5:f<=648e7?864e5:6048e5}(b,d.minTs,d.maxTs),f=Math.max(60,Math.floor(e/1e3)),g=b.start?b.start.getTime():new Date(d.minTs||Date.now()-864e5).getTime(),h=b.end?b.end.getTime():new Date(d.maxTs||Date.now()).getTime();Number.isFinite(g)||(g=Date.now()-864e5),Number.isFinite(h)||(h=Date.now());let i=Math.floor(((h=Math.max(g=ah(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=ag(b,c),m=await a.all(`SELECT
|
|
142
|
+
((CAST(strftime('%s', timestamp) AS INTEGER) / ?) * ?) AS bucketSec,
|
|
143
|
+
${N}
|
|
144
|
+
FROM usageHistory
|
|
145
|
+
${l.clause}
|
|
146
|
+
GROUP BY bucketSec
|
|
147
|
+
HAVING bucketSec IS NOT NULL
|
|
148
|
+
ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=ah(g,k);a<=h;a+=k)n.set(a,{ts:a,label:new Date(a).toISOString(),requests:0,success:0,errors:0,pending:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,reasoningTokens:0,cost:0});for(let a of m){let b=1e3*Q(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:Q(a.requests,0),success:Q(a.success,0),errors:Q(a.errors,0),pending:Q(a.pending,0),promptTokens:Q(a.promptTokens,0),completionTokens:Q(a.completionTokens,0),totalTokens:Q(a.totalTokens,0),cachedTokens:Q(a.cachedTokens,0),reasoningTokens:Q(a.reasoningTokens,0),cost:Q(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}function ap(a,b){if(!a.length)return null;let c=[...a].sort((a,b)=>a-b),d=Math.min(c.length-1,Math.max(0,Math.ceil(b/100*c.length)-1));return c[d]}async function aq(a,b,c){try{let d=ag(b,c),e=await a.all(`SELECT latencyMs
|
|
149
|
+
FROM usageHistory
|
|
150
|
+
${d.clause?`${d.clause} AND`:"WHERE"} latencyMs IS NOT NULL AND latencyMs > 0`,d.params)||[],f=[],g=0;for(let a of e){let b=Number(a.latencyMs);Number.isFinite(b)&&b>0&&(f.push(b),g+=b)}if(f.length>0)return f.sort((a,b)=>a-b),{samples:f.length,avgMs:g/f.length,p50Ms:as(f,50),p95Ms:as(f,95),p99Ms:as(f,99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],af(c,e,"timestamp",b,!1),b.provider&&(c.push("provider = ?"),e.push(b.provider)),b.model&&(c.push("model = ?"),e.push(b.model)),b.connectionId&&(c.push("connectionId = ?"),e.push(b.connectionId)),b.status&&(c.push("status = ?"),e.push(b.status)),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:e});d=await a.all(`SELECT data FROM requestDetails ${f.clause} ORDER BY timestamp DESC LIMIT ?`,[...f.params,3e3])||[]}catch{d=[]}let f=[];for(let a of d){let b=function(a){let b=a?.latency||{};for(let c of[b.totalMs,b.total_ms,b.durationMs,b.duration_ms,b.elapsedMs,b.elapsed_ms,b.responseMs,b.response_ms,b.ms,b.total,a?.durationMs,a?.latencyMs]){let a=Number(c);if(Number.isFinite(a)&&a>=0)return a}return null}((0,e.q)(a.data,{})||{});Number.isFinite(b)&&f.push(b)}let g=f.reduce((a,b)=>a+b,0);return{samples:f.length,avgMs:f.length?g/f.length:null,p50Ms:ap(f,50),p95Ms:ap(f,95),p99Ms:ap(f,99)}}function ar(a,b,c={}){let d=ag(a,b,c),e=[M,K,"(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) > 0"];c.latencyOnly&&e.push("latencyMs IS NOT NULL AND latencyMs > 0"),c.ttftOnly&&e.push("ttftMs IS NOT NULL AND ttftMs > 0");let f=e.join(" AND ");return{clause:d.clause?`${d.clause} AND ${f}`:`WHERE ${f}`,params:d.params}}function as(a,b){if(!a.length)return null;let c=Math.min(a.length-1,Math.max(0,Math.ceil(b/100*a.length)-1));return a[c]}async function at(a,b){let c=[];try{c=await a.all(`SELECT latencyMs, ttftMs, promptTokens, completionTokens
|
|
151
|
+
FROM usageHistory
|
|
152
|
+
${b.clause}`,b.params)||[]}catch{return{latency:[],ttft:[],prompt:[],completion:[]}}let d=[],e=[],f=[],g=[];for(let a of c){let b=Number(a.latencyMs);Number.isFinite(b)&&b>0&&d.push(b);let c=Number(a.ttftMs);Number.isFinite(c)&&c>0&&e.push(c);let h=Number(a.promptTokens);Number.isFinite(h)&&h>0&&f.push(h);let i=Number(a.completionTokens);Number.isFinite(i)&&i>0&&g.push(i)}let h=(a,b)=>a-b;return d.sort(h),e.sort(h),f.sort(h),g.sort(h),{latency:d,ttft:e,prompt:f,completion:g}}function au({samples:a=0,p95LatencyMs:b=0,p95TtftMs:c=0,slowRequestRate:d=0,errorRate:e=0}={}){if(!a)return{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate",score:null};if(a<10)return{level:"low_sample",label:"\xcdt mẫu",tone:"amber",score:null};let f=100;return(b>0&&(b>9e4?f-=35:b>45e3?f-=20:b>15e3&&(f-=8)),c>0&&(c>45e3?f-=30:c>2e4?f-=16:c>8e3&&(f-=6)),f-=Math.min(30,Math.round(100*d)),f-=Math.min(25,Math.round(100*e)),(f=Math.max(0,Math.min(100,f)))>=85)?{level:"fast",label:"Nhanh",tone:"green",score:f}:f>=70?{level:"ok",label:"Ổn",tone:"blue",score:f}:f>=50?{level:"slow",label:"Chậm",tone:"amber",score:f}:{level:"very_slow",label:"Rất chậm",tone:"red",score:f}}async function av(a,b,c,d={}){let e=ar(b,c,{latencyOnly:!0}),f={};try{f=await a.get(`SELECT
|
|
153
|
+
COUNT(*) AS samples,
|
|
154
|
+
AVG(latencyMs) AS avgLatencyMs,
|
|
155
|
+
MIN(latencyMs) AS minLatencyMs,
|
|
156
|
+
MAX(latencyMs) AS maxLatencyMs,
|
|
157
|
+
AVG(CASE WHEN ttftMs > 0 THEN ttftMs END) AS avgTtftMs,
|
|
158
|
+
MAX(ttftMs) AS maxTtftMs,
|
|
159
|
+
AVG(promptTokens) AS avgPromptTokens,
|
|
160
|
+
MAX(promptTokens) AS maxPromptTokens,
|
|
161
|
+
AVG(completionTokens) AS avgCompletionTokens,
|
|
162
|
+
MAX(completionTokens) AS maxCompletionTokens,
|
|
163
|
+
SUM(promptTokens) AS totalPromptTokens,
|
|
164
|
+
SUM(completionTokens) AS totalCompletionTokens,
|
|
165
|
+
SUM(latencyMs) AS totalLatencyMs,
|
|
166
|
+
SUM(CASE WHEN ttftMs > 0 THEN ttftMs ELSE 0 END) AS totalTtftMs,
|
|
167
|
+
SUM(CASE WHEN ttftMs > 0 THEN promptTokens ELSE 0 END) AS promptTokensWithTtft,
|
|
168
|
+
SUM(CASE WHEN completionTokens > 0 THEN completionTokens ELSE 0 END) AS completionTokensWithLatency,
|
|
169
|
+
SUM(CASE WHEN completionTokens > 0 THEN latencyMs ELSE 0 END) AS latencyMsWithOutput,
|
|
170
|
+
SUM(CASE WHEN completionTokens > 0 AND latencyMs > ttftMs THEN completionTokens ELSE 0 END) AS completionTokensAfterTtft,
|
|
171
|
+
SUM(CASE WHEN completionTokens > 0 AND latencyMs > ttftMs THEN latencyMs - ttftMs ELSE 0 END) AS decodeMs,
|
|
172
|
+
SUM(CASE WHEN latencyMs >= ? THEN 1 ELSE 0 END) AS slowRequests,
|
|
173
|
+
SUM(CASE WHEN latencyMs >= ? THEN 1 ELSE 0 END) AS verySlowRequests,
|
|
174
|
+
SUM(CASE WHEN ttftMs >= ? THEN 1 ELSE 0 END) AS slowTtftRequests,
|
|
175
|
+
SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS longInputRequests,
|
|
176
|
+
SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
|
|
177
|
+
SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests
|
|
178
|
+
FROM usageHistory
|
|
179
|
+
${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=Q(f.samples,0),h=await at(a,e),i=h.ttft.length,j=h.prompt.length,k=h.completion.length,l=as(h.latency,50),m=as(h.latency,95),n=as(h.latency,99),o=as(h.ttft,50),p=as(h.ttft,95),q=as(h.ttft,99),r=as(h.prompt,50),s=as(h.prompt,95),t=as(h.prompt,99),u=as(h.completion,95),v=Q(f.slowRequests,0),w=Q(f.verySlowRequests,0),x=Q(f.slowTtftRequests,0),y=Q(f.longInputRequests,0),z=Q(f.hugeInputRequests,0),A=Q(f.extremeInputRequests,0),B=Q(f.totalPromptTokens,0),C=Q(f.totalLatencyMs,0),D=Q(f.totalTtftMs,0),E=Q(f.promptTokensWithTtft,0),F=Q(f.completionTokensWithLatency,0),G=Q(f.latencyMsWithOutput,0),H=Q(f.completionTokensAfterTtft,0),I=Q(f.decodeMs,0),J=g?v/g:0,K=g?w/g:0,L=g?y/g:0,M=g?z/g:0,N=g?A/g:0,O=au({samples:g,p95LatencyMs:Q(m,0),p95TtftMs:Q(p,0),slowRequestRate:J,errorRate:Q(d.errorRate,0)});return{samples:g,ttftSamples:i,inputSamples:j,outputSamples:k,label:O.label,level:O.level,tone:O.tone,score:O.score,thresholds:{slowLatencyMs:45e3,verySlowLatencyMs:9e4,slowTtftMs:2e4,longInputTokens:3e4,hugeInputTokens:5e4,extremeInputTokens:7e4},avgLatencyMs:Q(f.avgLatencyMs,null),minLatencyMs:Q(f.minLatencyMs,null),maxLatencyMs:Q(f.maxLatencyMs,null),p50LatencyMs:l,p95LatencyMs:m,p99LatencyMs:n,avgTtftMs:Q(f.avgTtftMs,null),maxTtftMs:Q(f.maxTtftMs,null),p50TtftMs:o,p95TtftMs:p,p99TtftMs:q,avgPromptTokens:Q(f.avgPromptTokens,0),maxPromptTokens:Q(f.maxPromptTokens,0),p50PromptTokens:r,p95PromptTokens:s,p99PromptTokens:t,avgCompletionTokens:Q(f.avgCompletionTokens,0),maxCompletionTokens:Q(f.maxCompletionTokens,0),p95CompletionTokens:u,slowRequests:v,verySlowRequests:w,slowTtftRequests:x,longInputRequests:y,hugeInputRequests:z,extremeInputRequests:A,slowRequestRate:J,verySlowRequestRate:K,slowTtftRate:i?x/i:0,longInputRate:L,hugeInputRate:M,extremeInputRate:N,approxInputTokensPerSecond:D>0?E/(D/1e3):null,outputTokensPerSecond:G>0?F/(G/1e3):null,decodeTokensPerSecond:I>0?H/(I/1e3):null,latencyMsPer10kInputTokens:B>0?C/(B/1e4):null}}async function aw(a,b,c,d=new Map){let e=ar(b,c,{latencyOnly:!0});try{let b=await a.all(`SELECT
|
|
180
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
|
|
181
|
+
COALESCE(NULLIF(model, ''), 'unknown') AS model,
|
|
182
|
+
latencyMs,
|
|
183
|
+
ttftMs,
|
|
184
|
+
promptTokens,
|
|
185
|
+
completionTokens
|
|
186
|
+
FROM usageHistory
|
|
187
|
+
${e.clause}`,e.params)||[],c=new Map;for(let a of b){let b=`${a.provider}|${a.model}`,d=c.get(b);d||(d={provider:a.provider,model:a.model,key:b,entries:[],ttft:[],sums:{latency:0,ttft:0,ttftCount:0,prompt:0,completion:0,slow:0,slowTtft:0,longInput:0,hugeInput:0},max:{latency:0,ttft:0,prompt:0}},c.set(b,d));let e=Q(a.latencyMs,0),f=Q(a.ttftMs,0),g=Q(a.promptTokens,0),h=Q(a.completionTokens,0);d.entries.push({latency:e,prompt:g}),f>0&&(d.ttft.push(f),d.sums.ttft+=f,d.sums.ttftCount+=1),d.sums.latency+=e,d.sums.prompt+=g,d.sums.completion+=h,e>=45e3&&(d.sums.slow+=1),f>=2e4&&(d.sums.slowTtft+=1),g>=3e4&&(d.sums.longInput+=1),g>=5e4&&(d.sums.hugeInput+=1),e>d.max.latency&&(d.max.latency=e),f>d.max.ttft&&(d.max.ttft=f),g>d.max.prompt&&(d.max.prompt=g)}return[...c.values()].map(a=>{a.entries.sort((a,b)=>a.latency-b.latency),a.ttft.sort((a,b)=>a-b);let b=a.entries.length,c=c=>a.entries[Math.min(b-1,Math.max(0,Math.ceil(c/100*b)-1))]||null,d=c(50),e=c(95);return{provider:a.provider,model:a.model,key:a.key,samples:b,avgLatencyMs:b?a.sums.latency/b:null,p50LatencyMs:d?d.latency:null,p95LatencyMs:e?e.latency:null,maxLatencyMs:a.max.latency||null,avgTtftMs:a.sums.ttftCount?a.sums.ttft/a.sums.ttftCount:null,p95TtftMs:as(a.ttft,95),maxTtftMs:a.max.ttft||null,avgPromptTokens:b?a.sums.prompt/b:0,p95PromptTokensApprox:e?e.prompt:0,maxPromptTokens:a.max.prompt,avgCompletionTokens:b?a.sums.completion/b:0,totalCompletionTokens:a.sums.completion,totalLatencyMs:a.sums.latency,slowRequests:a.sums.slow,slowTtftRequests:a.sums.slowTtft,longInputRequests:a.sums.longInput,hugeInputRequests:a.sums.hugeInput}}).sort((a,b)=>b.samples-a.samples||(b.p95LatencyMs||0)-(a.p95LatencyMs||0)).slice(0,30).map(a=>{let b=Q(a.samples,0),c=b?Q(a.slowRequests,0)/b:0,e=b?Q(a.slowTtftRequests,0)/b:0,f=b?Q(a.longInputRequests,0)/b:0,g=b?Q(a.hugeInputRequests,0)/b:0,h=au({samples:b,p95LatencyMs:Q(a.p95LatencyMs,0),p95TtftMs:Q(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:ad(a.provider,d),model:a.model,label:`${a.model} (${ad(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:Q(a.avgLatencyMs,null),p50LatencyMs:Q(a.p50LatencyMs,null),p95LatencyMs:Q(a.p95LatencyMs,null),maxLatencyMs:Q(a.maxLatencyMs,null),avgTtftMs:Q(a.avgTtftMs,null),p95TtftMs:Q(a.p95TtftMs,null),maxTtftMs:Q(a.maxTtftMs,null),avgPromptTokens:Q(a.avgPromptTokens,0),p95PromptTokens:Q(a.p95PromptTokensApprox,0),maxPromptTokens:Q(a.maxPromptTokens,0),avgCompletionTokens:Q(a.avgCompletionTokens,0),slowRequests:Q(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:Q(a.totalLatencyMs,0)>0?Q(a.totalCompletionTokens,0)/(Q(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}async function ax(a,b,c,d,e){try{let f=ar(b,c,{latencyOnly:!0});return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
|
|
188
|
+
FROM usageHistory
|
|
189
|
+
${f.clause}
|
|
190
|
+
ORDER BY latencyMs DESC
|
|
191
|
+
LIMIT ?`,[...f.params,20])||[]).map(a=>ay(a,d,e))}catch{return[]}}function ay(a,b,c){let d=function(a={}){let b=(0,e.q)(a.tokens,{})||{},c=Q(a.promptTokens,0)||Q(b.prompt_tokens,0)||Q(b.input_tokens,0),d=Q(a.completionTokens,0)||Q(b.completion_tokens,0)||Q(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:Q(a.cachedTokens,0)||Q(b.cached_tokens,0)||Q(b.cache_read_input_tokens,0)||Q(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:Q(a.reasoningTokens,0)||Q(b.reasoning_tokens,0)||Q(b.completion_tokens_details?.reasoning_tokens,0)||Q(b.output_tokens_details?.reasoning_tokens,0)}}(a),f=b.get(a.apiKey)||b.get(a.apiKeyFingerprint)||null,g=c.get(a.connectionId)||null;return{id:a.id,timestamp:a.timestamp,provider:a.provider||"",providerLabel:ad(a.provider,c),model:a.model||"",connectionId:a.connectionId||"",accountName:g?.name||a.connectionId||"",apiKeyName:a.apiKeyName||f?.name||(a.apiKeyFingerprint||a.apiKey?aa(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||f?.fingerprint||aa(a.apiKey),apiKeyId:a.apiKeyId||f?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:Q(a.latencyMs,0),ttftMs:Q(a.ttftMs,0),statusCode:a.statusCode||null,errorCode:a.errorCode||"",errorType:a.errorType||"",endpoint:a.endpoint||"",status:a.status||"ok",promptTokens:d.promptTokens,completionTokens:d.completionTokens,totalTokens:d.totalTokens,cachedTokens:d.cachedTokens,reasoningTokens:d.reasoningTokens,cost:Q(a.cost,0)}}async function az(a,b,c,d,e){let f=ag(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
|
|
192
|
+
FROM usageHistory
|
|
193
|
+
${f.clause}
|
|
194
|
+
ORDER BY timestamp DESC
|
|
195
|
+
LIMIT ?`,[...f.params,50])||[]).map(a=>ay(a,d,e))}async function aA(a,b,c,d,e){let f=ag(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
|
|
196
|
+
FROM usageHistory
|
|
197
|
+
${f.clause}
|
|
198
|
+
ORDER BY (COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC
|
|
199
|
+
LIMIT ?`,[...f.params,20])||[]).map(a=>ay(a,d,e))}function aB(a,b,c=b){let d=function(a,b=a){let c=O(a);return c?{value:c,label:O(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function aC(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}async function aD(a,b,c,d=500){let e=ag(aC(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(await a.all(`SELECT DISTINCT ${c} AS value
|
|
200
|
+
FROM usageHistory
|
|
201
|
+
${f} ${c} IS NOT NULL AND ${c} <> ''
|
|
202
|
+
ORDER BY ${c} ASC
|
|
203
|
+
LIMIT ?`,[...e.params,d])||[]).map(a=>O(a.value)).filter(Boolean)}async function aE(a,b){let c=ag(aC(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=await a.get(`SELECT 1 AS hasLocal
|
|
204
|
+
FROM usageHistory
|
|
205
|
+
${d} (apiKey IS NULL OR apiKey = '')
|
|
206
|
+
LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}async function aF(a,b){let c,d,e=(global._dashboardAnalyticsOptionsCache||(global._dashboardAnalyticsOptionsCache=new Map),global._dashboardAnalyticsOptionsCache),f=(c=a=>{let b=new Date(a||0).getTime();return Number.isFinite(b)?Math.floor(b/6e5):String(a)},d=b.ownerScope,JSON.stringify({start:c(b.startIso),end:c(b.endIso),working:(b.workingTimeRanges||[]).map(a=>`${a?.startIso}|${a?.endIso}`),ownerScope:d?.enabled?{identifiers:d.identifiers||[],owners:d.owners||[],noMatch:!!d.noMatch}:null})),g=e.get(f);if(g){if(g.promise)return g.promise;if(Date.now()-g.createdAt<6e5)return g.data}let h=(async()=>{let[c,d,e,f,g,h]=await Promise.all([aD(a,b,"provider",500),aD(a,b,"model",1e3),aD(a,b,"endpoint",500),aD(a,b,"status",200),aD(a,b,"connectionId",1e3),aE(a,b)]);return{providers:c,models:d,endpoints:e,statuses:f,connectionIds:g,hasLocal:h}})().then(a=>{if(e.set(f,{createdAt:Date.now(),data:a}),e.size>50){for(let[a,b]of e)if(b.createdAt&&Date.now()-b.createdAt>6e5&&e.delete(a),e.size<=50)break}return a}).catch(a=>{throw e.delete(f),a});return e.set(f,{promise:h}),h}async function aG(a,b,c,d){let{providers:e,models:f,endpoints:g,statuses:h,connectionIds:i,hasLocal:j}=await aF(a,b),k=i.map(a=>{let b=c.get(a),d=ad(b?.provider||a,c),e=b?.name?`${b.name}${d&&d!==b.name?` \xb7 ${d}`:""}`:d||a;return{value:a,label:e}}),l=[];for(let a of(j&&l.push({value:"local-no-key",label:"Local / kh\xf4ng d\xf9ng API key"}),(function(a={},b={}){let c=a.all||[],d=b.ownerScope;if(!d?.enabled)return c;if(d.noMatch)return[];let e=new Set((d.identifiers||[]).map(a=>O(a)).filter(Boolean)),f=new Set((d.ids||[]).map(a=>O(a)).filter(Boolean)),g=new Set((d.fingerprints||[]).map(a=>O(a)).filter(Boolean)),h=new Set((d.owners||[]).map(a=>P(a)).filter(Boolean));return c.filter(a=>!!a&&(a.key&&e.has(a.key)||a.id&&(e.has(a.id)||f.has(a.id))||a.fingerprint&&(e.has(a.fingerprint)||g.has(a.fingerprint))||a.ownerUser&&h.has(P(a.ownerUser))))})(d,b).slice(0,500)))l.push({value:a.fingerprint,label:`${a.name||a.fingerprint}${a.ownerUser?` \xb7 ${a.ownerUser}`:""}`});aB(k,b.connectionId,b.connectionId),aB(l,b.apiKey,b.apiKey);let m=e.map(a=>({value:a,label:ad(a,c)})),n=f.map(a=>({value:a,label:a})),o=g.map(a=>({value:a,label:a})),p=h.map(a=>({value:a,label:a}));return aB(m,b.provider,b.provider),aB(n,b.model,b.model),aB(o,b.endpoint,b.endpoint),aB(p,b.status,b.status),{providers:m,models:n.map(a=>a.value),endpoints:o.map(a=>a.value),statuses:p.map(a=>a.value),connections:k,apiKeys:l,clientIps:[],sourceTools:[]}}async function aH(a,b,c,d,e,f,g=new Map){let h=await aG(a,b,g,e);return h.clientIps=(d.topClientIps||[]).map(a=>a.key).filter(Boolean),h.sourceTools=(d.topSourceTools||[]).map(a=>a.key).filter(Boolean),h}let aI="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aJ="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')";async function aK(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=ar(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=await a.all(`SELECT
|
|
207
|
+
${aI} AS clientKey,
|
|
208
|
+
${g} AS itemKey,
|
|
209
|
+
COUNT(*) AS requests,
|
|
210
|
+
COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
|
|
211
|
+
MAX(timestamp) AS lastSeen
|
|
212
|
+
FROM usageHistory
|
|
213
|
+
${f.clause}
|
|
214
|
+
GROUP BY ${aI}, ${g}
|
|
215
|
+
ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=O(a.itemKey)||"unknown",f="provider"===d?ad(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(c,a.clientKey,{key:b,label:f,requests:Q(a.requests,0),totalTokens:Q(a.totalTokens,0),lastSeen:a.lastSeen||""})}return c}catch(a){return console.error("[analytics] Failed to build client top usage map:",a?.message||a),new Map}}function aL(a={},b={}){let c=Q(a.requests,0),d=Q(a.success,c),e=Q(a.errors,0),f=Q(a.promptTokens,0),g=Q(a.completionTokens,0),h=Q(a.totalTokens,f+g),i=Q(a.p95PromptTokens,0),j=Q(a.p95LatencyMs,null),k=c?e/c:0,l=c?Q(a.longInputRequests,0)/c:0,m=c?Q(a.hugeInputRequests,0)/c:0,n=c?Q(a.extremeInputRequests,0)/c:0,o=c?Q(a.slowRequests,0)/c:0,p=function({requests:a=0,p95PromptTokens:b=0,p95LatencyMs:c=0,longInputRate:d=0,errorRate:e=0}={}){return a?b>=7e4||d>=.5||c>=9e4?{level:"critical",label:"Rất nặng",tone:"red"}:b>=5e4||d>=.3||c>=45e3||e>=.2?{level:"high",label:"Nặng",tone:"amber"}:b>=3e4||d>=.1||e>=.05?{level:"medium",label:"Cần theo d\xf5i",tone:"blue"}:{level:"normal",label:"Ổn",tone:"green"}:{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate"}}({requests:c,p95PromptTokens:i,p95LatencyMs:Q(j,0),longInputRate:l,errorRate:k});return{key:O(a.clientKey)||"unknown",label:O(a.clientLabel||a.clientKey)||"unknown",ownerUser:O(a.ownerUser),apiKeyName:O(a.apiKeyName),apiKeyFingerprint:O(a.apiKeyFingerprint),primaryClientIp:O(a.primaryClientIp),primarySourceTool:O(a.primarySourceTool),apiKeyCount:Q(a.apiKeyCount,0),sourceIpCount:Q(a.sourceIpCount,0),sourceToolCount:Q(a.sourceToolCount,0),sessionCount:Q(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:Q(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:Q(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:Q(a.maxPromptTokens,0),avgLatencyMs:Q(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:Q(a.maxLatencyMs,null),avgTtftMs:Q(a.avgTtftMs,null),p95TtftMs:Q(a.p95TtftMs,null),longInputRequests:Q(a.longInputRequests,0),hugeInputRequests:Q(a.hugeInputRequests,0),extremeInputRequests:Q(a.extremeInputRequests,0),slowRequests:Q(a.slowRequests,0),slowTtftRequests:Q(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?Q(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:Q(a.totalLatencyMs,0)>0?g/(Q(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}async function aM(a,b,c){let d=ar(b,c);try{return await a.all(`SELECT
|
|
216
|
+
COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyGroupKey,
|
|
217
|
+
COALESCE(NULLIF(apiKeyName, ''), NULLIF(apiKeyOwner, ''), NULLIF(apiKeyFingerprint, ''), 'Local / kh\xf4ng API key') AS apiKeyGroupLabel,
|
|
218
|
+
COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), 'unknown') AS sourceIpGroupKey,
|
|
219
|
+
${aI} AS clientKey,
|
|
220
|
+
${aJ} AS clientLabel,
|
|
221
|
+
COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), '') AS apiKeyStable,
|
|
222
|
+
COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
|
|
223
|
+
COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner,
|
|
224
|
+
COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
|
|
225
|
+
COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), '') AS clientIpStable,
|
|
226
|
+
COALESCE(NULLIF(clientIpNormalized, ''), '') AS clientIpNorm,
|
|
227
|
+
COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''), '') AS sourceToolStable,
|
|
228
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS providerStable,
|
|
229
|
+
COALESCE(NULLIF(model, ''), 'unknown') AS modelStable,
|
|
230
|
+
COALESCE(NULLIF(sessionId, ''), '') AS sessionId,
|
|
231
|
+
timestamp,
|
|
232
|
+
COALESCE(promptTokens, 0) AS promptTokens,
|
|
233
|
+
COALESCE(completionTokens, 0) AS completionTokens,
|
|
234
|
+
COALESCE(latencyMs, 0) AS latencyMs,
|
|
235
|
+
COALESCE(ttftMs, 0) AS ttftMs,
|
|
236
|
+
COALESCE(cost, 0) AS cost
|
|
237
|
+
FROM usageHistory
|
|
238
|
+
${d.clause}`,d.params)||[]}catch(a){return console.error("[analytics] Failed to load client usage rows:",a?.message||a),[]}}function aN(a,b){let c=O(b);return c&&c>a?c:a}function aO(a,{dimension:b="apiKey",order:c="tokens",limit:d=25}={}){let e="sourceIp"===b,f=new Map;for(let b of a){let a=e?b.sourceIpGroupKey:b.apiKeyGroupKey;if(!a||"unknown"===a)continue;let c=f.get(a);c||(c={key:a,label:"",apiKeyName:"",apiKeyOwner:"",apiKeyFingerprint:"",primaryClientIp:"",primarySourceTool:"",requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cost:0,promptArr:[],totalArr:[],maxPromptTokens:0,maxTotalTokens:0,longInputRequests:0,hugeInputRequests:0,extremeInputRequests:0,heavyRequests:0,apiKeySet:new Set,ipSet:new Set,toolSet:new Set,providerSet:new Set,modelSet:new Set,lastSeen:""},f.set(a,c));let d=Q(b.promptTokens,0),g=Q(b.completionTokens,0),h=d+g;c.label=aN(c.label,e?b.sourceIpGroupKey:b.apiKeyGroupLabel),c.apiKeyName=aN(c.apiKeyName,b.apiKeyName),c.apiKeyOwner=aN(c.apiKeyOwner,b.apiKeyOwner),c.apiKeyFingerprint=aN(c.apiKeyFingerprint,b.apiKeyFingerprint),c.primaryClientIp=aN(c.primaryClientIp,b.clientIpStable),c.primarySourceTool=aN(c.primarySourceTool,b.sourceToolStable),c.requests+=1,c.promptTokens+=d,c.completionTokens+=g,c.totalTokens+=h,c.cost+=Q(b.cost,0),c.promptArr.push(d),c.totalArr.push(h),d>c.maxPromptTokens&&(c.maxPromptTokens=d),h>c.maxTotalTokens&&(c.maxTotalTokens=h),d>=3e4&&(c.longInputRequests+=1),d>=5e4&&(c.hugeInputRequests+=1),d>=7e4&&(c.extremeInputRequests+=1),(d>=3e4||h>=3e4)&&(c.heavyRequests+=1),c.apiKeySet.add(O(b.apiKeyStable)||"local-no-key"),O(b.clientIpStable)&&c.ipSet.add(O(b.clientIpStable)),O(b.sourceToolStable)&&c.toolSet.add(O(b.sourceToolStable)),O(b.providerStable)&&c.providerSet.add(O(b.providerStable)),O(b.modelStable)&&c.modelSet.add(O(b.modelStable)),c.lastSeen=aN(c.lastSeen,b.timestamp)}let g="heavy"===c?(a,b)=>b.heavyRequests-a.heavyRequests||b.maxPromptTokens-a.maxPromptTokens||b.promptTokens-a.promptTokens||b.totalTokens-a.totalTokens||b.requests-a.requests:(a,b)=>b.totalTokens-a.totalTokens||b.promptTokens-a.promptTokens||b.requests-a.requests||b.maxPromptTokens-a.maxPromptTokens;return[...f.values()].sort(g).slice(0,d).map(a=>(a.promptArr.sort((a,b)=>a-b),a.totalArr.sort((a,b)=>a-b),function(a={},b={}){let c=Q(a.requests,0),d=Q(a.promptTokens,0),e=Q(a.completionTokens,0),f=Q(a.totalTokens,d+e);return{key:O(a.key||a.groupKey)||"unknown",label:O(a.label||a.groupLabel||a.key||a.groupKey)||"unknown",requests:c,promptTokens:d,completionTokens:e,totalTokens:f,cost:Q(a.cost,0),avgPromptTokens:c?d/c:0,avgCompletionTokens:c?e/c:0,avgTokens:c?f/c:0,p95PromptTokens:Q(a.p95PromptTokens,0),maxPromptTokens:Q(a.maxPromptTokens,0),p95TotalTokens:Q(a.p95TotalTokens,0),maxTotalTokens:Q(a.maxTotalTokens,0),longInputRequests:Q(a.longInputRequests,0),hugeInputRequests:Q(a.hugeInputRequests,0),extremeInputRequests:Q(a.extremeInputRequests,0),heavyRequests:Q(a.heavyRequests,0),longInputRate:c?Q(a.longInputRequests,0)/c:0,hugeInputRate:c?Q(a.hugeInputRequests,0)/c:0,extremeInputRate:c?Q(a.extremeInputRequests,0)/c:0,heavyRequestRate:c?Q(a.heavyRequests,0)/c:0,apiKeyCount:Q(a.apiKeyCount,0),sourceIpCount:Q(a.sourceIpCount,0),sourceToolCount:Q(a.sourceToolCount,0),modelCount:Q(a.modelCount,0),providerCount:Q(a.providerCount,0),lastSeen:a.lastSeen||"",...b}}({key:a.key,label:a.label,requests:a.requests,success:a.requests,errors:0,promptTokens:a.promptTokens,completionTokens:a.completionTokens,totalTokens:a.totalTokens,cost:a.cost,p95PromptTokens:as(a.promptArr,95),maxPromptTokens:a.maxPromptTokens,p95TotalTokens:as(a.totalArr,95),maxTotalTokens:a.maxTotalTokens,longInputRequests:a.longInputRequests,hugeInputRequests:a.hugeInputRequests,extremeInputRequests:a.extremeInputRequests,heavyRequests:a.heavyRequests,apiKeyCount:a.apiKeySet.size,sourceIpCount:a.ipSet.size,sourceToolCount:a.toolSet.size,providerCount:a.providerSet.size,modelCount:a.modelSet.size,lastSeen:a.lastSeen},{apiKeyName:a.apiKeyName,apiKeyOwner:a.apiKeyOwner,apiKeyFingerprint:a.apiKeyFingerprint,primaryClientIp:a.primaryClientIp,primarySourceTool:a.primarySourceTool})))}async function aP(a,b,c){let d=ag(b,c);try{return(await a.all(`SELECT
|
|
239
|
+
${aI} AS clientKey,
|
|
240
|
+
${aJ} AS clientLabel,
|
|
241
|
+
COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
|
|
242
|
+
COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
|
|
243
|
+
COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
|
|
244
|
+
MAX(clientIpNormalized) AS primaryClientIp,
|
|
245
|
+
MAX(COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''))) AS primarySourceTool,
|
|
246
|
+
SUM(CASE WHEN ${M} THEN 1 ELSE 0 END) AS requests,
|
|
247
|
+
SUM(CASE WHEN ${M} AND ${K} THEN 1 ELSE 0 END) AS success,
|
|
248
|
+
SUM(CASE WHEN ${M} AND NOT ${K} THEN 1 ELSE 0 END) AS errors,
|
|
249
|
+
SUM(CASE WHEN ${M} THEN COALESCE(promptTokens, 0) ELSE 0 END) AS promptTokens,
|
|
250
|
+
SUM(CASE WHEN ${M} THEN COALESCE(completionTokens, 0) ELSE 0 END) AS completionTokens,
|
|
251
|
+
SUM(CASE WHEN ${M} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END) AS totalTokens,
|
|
252
|
+
MAX(timestamp) AS lastSeen
|
|
253
|
+
FROM usageHistory
|
|
254
|
+
${d.clause}
|
|
255
|
+
GROUP BY ${aI}
|
|
256
|
+
HAVING errors > 0
|
|
257
|
+
ORDER BY errors DESC, requests DESC
|
|
258
|
+
LIMIT ?`,[...d.params,25])||[]).map(a=>aL(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}let aQ=[{key:"lt2k",label:"<2k",max:2e3},{key:"2k_10k",label:"2k-10k",max:1e4},{key:"10k_30k",label:"10k-30k",max:3e4},{key:"30k_50k",label:"30k-50k",max:5e4},{key:"50k_70k",label:"50k-70k",max:7e4},{key:"gte70k",label:">=70k",max:1/0}];async function aR(a,b,c){let d=ag(b,c),e={clause:d.clause?`${d.clause} AND ${M}`:`WHERE ${M}`,params:d.params};try{let b=await a.get(`SELECT
|
|
259
|
+
COUNT(*) AS totalRequests,
|
|
260
|
+
SUM(CASE WHEN thinkingEnabled = 1 THEN 1 ELSE 0 END) AS thinkingOnRequests,
|
|
261
|
+
SUM(CASE WHEN thinkingEnabled = 0 THEN 1 ELSE 0 END) AS thinkingOffRequests,
|
|
262
|
+
SUM(CASE WHEN thinkingEnabled IS NULL THEN 1 ELSE 0 END) AS unknownRequests,
|
|
263
|
+
SUM(CASE WHEN thinkingAutoOff = 1 THEN 1 ELSE 0 END) AS autoOffRequests,
|
|
264
|
+
SUM(CASE WHEN forceThinkingOffAboveChars > 0 THEN 1 ELSE 0 END) AS thresholdConfiguredRequests,
|
|
265
|
+
AVG(CASE WHEN promptChars > 0 THEN promptChars END) AS avgPromptChars,
|
|
266
|
+
MAX(promptChars) AS maxPromptChars,
|
|
267
|
+
AVG(CASE WHEN thinkingAutoOff = 1 AND promptChars > 0 THEN promptChars END) AS avgAutoOffPromptChars
|
|
268
|
+
FROM usageHistory
|
|
269
|
+
${e.clause}`,e.params)||{},c=await a.all(`SELECT COALESCE(NULLIF(thinkingAutoOffReason, ''), 'unknown') AS reason,
|
|
270
|
+
COUNT(*) AS requests,
|
|
271
|
+
AVG(CASE WHEN promptChars > 0 THEN promptChars END) AS avgPromptChars,
|
|
272
|
+
MAX(promptChars) AS maxPromptChars
|
|
273
|
+
FROM usageHistory
|
|
274
|
+
${e.clause} AND thinkingAutoOff = 1
|
|
275
|
+
GROUP BY COALESCE(NULLIF(thinkingAutoOffReason, ''), 'unknown')
|
|
276
|
+
ORDER BY requests DESC
|
|
277
|
+
LIMIT 10`,e.params)||[],d=await a.all(`SELECT provider, model,
|
|
278
|
+
COUNT(*) AS requests,
|
|
279
|
+
SUM(CASE WHEN thinkingEnabled = 1 THEN 1 ELSE 0 END) AS thinkingOnRequests,
|
|
280
|
+
SUM(CASE WHEN thinkingEnabled = 0 THEN 1 ELSE 0 END) AS thinkingOffRequests,
|
|
281
|
+
SUM(CASE WHEN thinkingAutoOff = 1 THEN 1 ELSE 0 END) AS autoOffRequests,
|
|
282
|
+
AVG(CASE WHEN promptChars > 0 THEN promptChars END) AS avgPromptChars,
|
|
283
|
+
MAX(promptChars) AS maxPromptChars
|
|
284
|
+
FROM usageHistory
|
|
285
|
+
${e.clause}
|
|
286
|
+
GROUP BY provider, model
|
|
287
|
+
HAVING requests > 0
|
|
288
|
+
ORDER BY autoOffRequests DESC, requests DESC
|
|
289
|
+
LIMIT 20`,e.params)||[],f=Q(b.totalRequests,0),g=Q(b.autoOffRequests,0),h=Q(b.thinkingOnRequests,0),i=Q(b.thinkingOffRequests,0),j=Q(b.unknownRequests,0),k=Q(b.thresholdConfiguredRequests,0);return{totalRequests:f,thinkingOnRequests:h,thinkingOffRequests:i,unknownRequests:j,autoOffRequests:g,thresholdConfiguredRequests:k,thinkingOnRate:f?h/f:0,thinkingOffRate:f?i/f:0,unknownRate:f?j/f:0,autoOffRate:f?g/f:0,autoOffEligibleHitRate:k?g/k:0,avgPromptChars:Q(b.avgPromptChars,0),maxPromptChars:Q(b.maxPromptChars,0),avgAutoOffPromptChars:Q(b.avgAutoOffPromptChars,0),byReason:c.map(a=>({reason:a.reason||"unknown",requests:Q(a.requests,0),share:g?Q(a.requests,0)/g:0,avgPromptChars:Q(a.avgPromptChars,0),maxPromptChars:Q(a.maxPromptChars,0)})),byModel:d.map(a=>{let b=Q(a.requests,0),c=Q(a.autoOffRequests,0);return{provider:a.provider||"",model:a.model||"",requests:b,thinkingOnRequests:Q(a.thinkingOnRequests,0),thinkingOffRequests:Q(a.thinkingOffRequests,0),autoOffRequests:c,autoOffRate:b?c/b:0,avgPromptChars:Q(a.avgPromptChars,0),maxPromptChars:Q(a.maxPromptChars,0)}})}}catch(a){return console.error("[analytics] Failed to build thinking analytics:",a?.message||a),{totalRequests:0,thinkingOnRequests:0,thinkingOffRequests:0,unknownRequests:0,autoOffRequests:0,thresholdConfiguredRequests:0,thinkingOnRate:0,thinkingOffRate:0,unknownRate:0,autoOffRate:0,autoOffEligibleHitRate:0,byReason:[],byModel:[]}}}async function aS(a,b,c){let d=ag(b,c),e={clause:d.clause?`${d.clause} AND ${M}`:`WHERE ${M}`,params:d.params},f="CASE WHEN COALESCE(promptChars, 0) > 0 THEN promptChars ELSE COALESCE(promptTokens, 0) END";try{let b=await a.get(`SELECT
|
|
290
|
+
COUNT(*) AS totalRequests,
|
|
291
|
+
SUM(CASE WHEN ${f} >= 30000 THEN 1 ELSE 0 END) AS gte30kRequests,
|
|
292
|
+
SUM(CASE WHEN ${f} >= 50000 THEN 1 ELSE 0 END) AS gte50kRequests,
|
|
293
|
+
SUM(CASE WHEN ${f} >= 100000 THEN 1 ELSE 0 END) AS gte100kRequests,
|
|
294
|
+
AVG(CASE WHEN ${f} > 0 THEN ${f} END) AS avgRequestSize,
|
|
295
|
+
MAX(${f}) AS maxRequestSize,
|
|
296
|
+
AVG(CASE WHEN ${f} >= 30000 THEN latencyMs END) AS avgLargeLatencyMs,
|
|
297
|
+
AVG(CASE WHEN ${f} >= 30000 THEN ttftMs END) AS avgLargeTtftMs,
|
|
298
|
+
SUM(CASE WHEN ${f} >= 30000 THEN promptTokens ELSE 0 END) AS largePromptTokens,
|
|
299
|
+
SUM(CASE WHEN ${f} >= 30000 THEN completionTokens ELSE 0 END) AS largeCompletionTokens
|
|
300
|
+
FROM usageHistory
|
|
301
|
+
${e.clause}`,e.params)||{},c=await a.all(`WITH base AS (
|
|
302
|
+
SELECT
|
|
303
|
+
CASE
|
|
304
|
+
WHEN ${f} < 30000 THEN '<30k'
|
|
305
|
+
WHEN ${f} < 50000 THEN '30k-50k'
|
|
306
|
+
WHEN ${f} < 100000 THEN '50k-100k'
|
|
307
|
+
ELSE '>=100k'
|
|
308
|
+
END AS label,
|
|
309
|
+
CASE
|
|
310
|
+
WHEN ${f} < 30000 THEN 1
|
|
311
|
+
WHEN ${f} < 50000 THEN 2
|
|
312
|
+
WHEN ${f} < 100000 THEN 3
|
|
313
|
+
ELSE 4
|
|
314
|
+
END AS sortOrder,
|
|
315
|
+
${f} AS requestSize,
|
|
316
|
+
promptTokens,
|
|
317
|
+
completionTokens,
|
|
318
|
+
latencyMs,
|
|
319
|
+
ttftMs,
|
|
320
|
+
thinkingAutoOff
|
|
321
|
+
FROM usageHistory
|
|
322
|
+
${e.clause}
|
|
323
|
+
)
|
|
324
|
+
SELECT label,
|
|
325
|
+
sortOrder,
|
|
326
|
+
COUNT(*) AS requests,
|
|
327
|
+
AVG(CASE WHEN requestSize > 0 THEN requestSize END) AS avgRequestSize,
|
|
328
|
+
MAX(requestSize) AS maxRequestSize,
|
|
329
|
+
AVG(latencyMs) AS avgLatencyMs,
|
|
330
|
+
AVG(CASE WHEN ttftMs > 0 THEN ttftMs END) AS avgTtftMs,
|
|
331
|
+
SUM(promptTokens) AS promptTokens,
|
|
332
|
+
SUM(completionTokens) AS completionTokens,
|
|
333
|
+
SUM(CASE WHEN thinkingAutoOff = 1 THEN 1 ELSE 0 END) AS autoOffRequests
|
|
334
|
+
FROM base
|
|
335
|
+
GROUP BY label, sortOrder
|
|
336
|
+
ORDER BY sortOrder ASC`,e.params)||[],d=Q(b.totalRequests,0),g=Q(b.gte30kRequests,0),h=Q(b.gte50kRequests,0),i=Q(b.gte100kRequests,0);return{totalRequests:d,gte30kRequests:g,gte50kRequests:h,gte100kRequests:i,gte30kRate:d?g/d:0,gte50kRate:d?h/d:0,gte100kRate:d?i/d:0,avgRequestSize:Q(b.avgRequestSize,0),maxRequestSize:Q(b.maxRequestSize,0),avgLargeLatencyMs:Q(b.avgLargeLatencyMs,null),avgLargeTtftMs:Q(b.avgLargeTtftMs,null),largePromptTokens:Q(b.largePromptTokens,0),largeCompletionTokens:Q(b.largeCompletionTokens,0),buckets:c.map(a=>{let b=Q(a.requests,0),c=Q(a.autoOffRequests,0);return{label:a.label,requests:b,share:d?b/d:0,avgRequestSize:Q(a.avgRequestSize,0),maxRequestSize:Q(a.maxRequestSize,0),avgLatencyMs:Q(a.avgLatencyMs,null),avgTtftMs:Q(a.avgTtftMs,null),promptTokens:Q(a.promptTokens,0),completionTokens:Q(a.completionTokens,0),autoOffRequests:c,autoOffRate:b?c/b:0}})}}catch(a){return console.error("[analytics] Failed to build large context analytics:",a?.message||a),{totalRequests:0,gte30kRequests:0,gte50kRequests:0,gte100kRequests:0,gte30kRate:0,gte50kRate:0,gte100kRate:0,buckets:[]}}}async function aT(a,b,c,d={},e=new Map){let[f,g,h,i,j,k,l]=await Promise.all([aM(a,b,c),aP(a,b,c),aK(a,b,c,"model",e),aK(a,b,c,"provider",e),aK(a,b,c,"endpoint",e),aK(a,b,c,"clientIpNormalized",e),aK(a,b,c,"sourceTool",e)]),m=function(a,b={}){let c=new Map;for(let b of a){let a=b.clientKey;if(!a)continue;let d=c.get(a);d||(d={clientKey:a,clientLabel:"",ownerUser:"",apiKeyName:"",apiKeyFingerprint:"",primaryClientIp:"",primarySourceTool:"",apiKeySet:new Set,ipSet:new Set,toolSet:new Set,sessionSet:new Set,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cost:0,promptArr:[],latencyArr:[],ttftArr:[],maxPromptTokens:0,maxLatencyMs:0,ttftSum:0,longInputRequests:0,hugeInputRequests:0,extremeInputRequests:0,slowRequests:0,slowTtftRequests:0,totalLatencyMs:0,lastSeen:""},c.set(a,d));let e=Q(b.promptTokens,0),f=Q(b.completionTokens,0),g=Q(b.latencyMs,0),h=Q(b.ttftMs,0);d.clientLabel=aN(d.clientLabel,b.clientLabel),d.ownerUser=aN(d.ownerUser,b.apiKeyOwner),d.apiKeyName=aN(d.apiKeyName,b.apiKeyName),d.apiKeyFingerprint=aN(d.apiKeyFingerprint,b.apiKeyFingerprint),d.primaryClientIp=aN(d.primaryClientIp,b.clientIpNorm),d.primarySourceTool=aN(d.primarySourceTool,b.sourceToolStable),O(b.apiKeyStable)&&d.apiKeySet.add(O(b.apiKeyStable)),O(b.clientIpNorm)&&d.ipSet.add(O(b.clientIpNorm)),O(b.sourceToolStable)&&d.toolSet.add(O(b.sourceToolStable)),O(b.sessionId)&&d.sessionSet.add(O(b.sessionId)),d.requests+=1,d.promptTokens+=e,d.completionTokens+=f,d.totalTokens+=e+f,d.cost+=Q(b.cost,0),d.promptArr.push(e),d.latencyArr.push(g),h>0&&(d.ttftArr.push(h),d.ttftSum+=h),e>d.maxPromptTokens&&(d.maxPromptTokens=e),g>d.maxLatencyMs&&(d.maxLatencyMs=g),e>=3e4&&(d.longInputRequests+=1),e>=5e4&&(d.hugeInputRequests+=1),e>=7e4&&(d.extremeInputRequests+=1),g>=45e3&&(d.slowRequests+=1),h>=2e4&&(d.slowTtftRequests+=1),d.totalLatencyMs+=g,d.lastSeen=aN(d.lastSeen,b.timestamp)}return[...c.values()].sort((a,b)=>b.promptTokens-a.promptTokens||b.totalTokens-a.totalTokens||b.requests-a.requests).slice(0,25).map(a=>(a.promptArr.sort((a,b)=>a-b),a.latencyArr.sort((a,b)=>a-b),a.ttftArr.sort((a,b)=>a-b),aL({clientKey:a.clientKey,clientLabel:a.clientLabel,ownerUser:a.ownerUser,apiKeyName:a.apiKeyName,apiKeyFingerprint:a.apiKeyFingerprint,primaryClientIp:a.primaryClientIp,primarySourceTool:a.primarySourceTool,apiKeyCount:a.apiKeySet.size,sourceIpCount:a.ipSet.size,sourceToolCount:a.toolSet.size,sessionCount:a.sessionSet.size,requests:a.requests,success:a.requests,errors:0,promptTokens:a.promptTokens,completionTokens:a.completionTokens,totalTokens:a.totalTokens,cost:a.cost,avgPromptTokens:a.requests?a.promptTokens/a.requests:0,p50PromptTokens:as(a.promptArr,50),p95PromptTokens:as(a.promptArr,95),maxPromptTokens:a.maxPromptTokens,avgLatencyMs:a.requests?a.totalLatencyMs/a.requests:null,p95LatencyMs:as(a.latencyArr,95),maxLatencyMs:a.maxLatencyMs||null,avgTtftMs:a.ttftArr.length?a.ttftSum/a.ttftArr.length:null,p95TtftMs:as(a.ttftArr,95),longInputRequests:a.longInputRequests,hugeInputRequests:a.hugeInputRequests,extremeInputRequests:a.extremeInputRequests,slowRequests:a.slowRequests,slowTtftRequests:a.slowTtftRequests,totalLatencyMs:a.totalLatencyMs,lastSeen:a.lastSeen},{topModels:b.topModelsByClient?.get(a.clientKey)||[],topProviders:b.topProvidersByClient?.get(a.clientKey)||[],topEndpoints:b.topEndpointsByClient?.get(a.clientKey)||[],topIps:b.topIpsByClient?.get(a.clientKey)||[],topTools:b.topToolsByClient?.get(a.clientKey)||[]})))}(f,{topModelsByClient:h,topProvidersByClient:i,topEndpointsByClient:j,topIpsByClient:k,topToolsByClient:l}),n=aO(f,{dimension:"apiKey",order:"tokens",limit:25}),o=aO(f,{dimension:"sourceIp",order:"tokens",limit:25}),p=aO(f,{dimension:"sourceIp",order:"heavy",limit:25}),q=function(a){let b=aQ.map(a=>({...a,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,maxPromptTokens:0,latencyArr:[],ttftArr:[],latencySum:0,ttftSum:0}));for(let c of a){let a=Q(c.promptTokens,0),d=Q(c.completionTokens,0),e=Q(c.latencyMs,0),f=Q(c.ttftMs,0),g=b.find(b=>a<b.max)||b[b.length-1];g.requests+=1,g.promptTokens+=a,g.completionTokens+=d,g.totalTokens+=a+d,a>g.maxPromptTokens&&(g.maxPromptTokens=a),g.latencyArr.push(e),g.latencySum+=e,f>0&&(g.ttftArr.push(f),g.ttftSum+=f)}let c=a.length;return b.filter(a=>a.requests>0).map(a=>(a.latencyArr.sort((a,b)=>a-b),a.ttftArr.sort((a,b)=>a-b),{key:a.key,label:a.label,requests:a.requests,share:c?a.requests/c:0,promptTokens:a.promptTokens,completionTokens:a.completionTokens,totalTokens:a.totalTokens,avgPromptTokens:a.requests?a.promptTokens/a.requests:0,maxPromptTokens:a.maxPromptTokens,avgLatencyMs:a.requests?a.latencySum/a.requests:null,p95LatencyMs:as(a.latencyArr,95),maxLatencyMs:a.latencyArr.length?a.latencyArr[a.latencyArr.length-1]:null,avgTtftMs:a.ttftArr.length?a.ttftSum/a.ttftArr.length:null,p95TtftMs:as(a.ttftArr,95)}))}(f),r=m[0]||null,s=n[0]||null,t=o[0]||null,u=p[0]||null,v=m.reduce((a,b)=>a+Q(b.totalTokens,0),0),w=Q(d.totalTokens,0),x=r&&w?Q(r.totalTokens,0)/w:0,y=s&&w?Q(s.totalTokens,0)/w:0,z=t&&w?Q(t.totalTokens,0)/w:0,A=q.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+Q(b.share,0),0),B=q.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:m.length,topUserLabel:r?.label||"-",topUserTokens:r?.totalTokens||0,topUserTokenShare:x,topUsersTokenShare:w?v/w:0,topApiKeyLabel:s?.label||"-",topApiKeyTokens:s?.totalTokens||0,topApiKeyTokenShare:y,topSourceIpLabel:t?.label||"-",topSourceIpTokens:t?.totalTokens||0,topSourceIpTokenShare:z,topSourceIpHeavyLabel:u?.label||"-",topSourceIpHeavyRequests:u?.heavyRequests||0,longInputBucketShare:A,extremeInputShare:B?.share||0,problemClients:g.length},topHeavyUsers:m,topProblemClients:g,topApiKeysByTokens:n,topSourceIpsByTokens:o,topSourceIpsByHeavyRequests:p,inputBuckets:q}}async function aU(a,b=4){let c=[a].filter(Boolean),d=Math.max(0,Math.max(1,Math.min(6,Number(b)||4))-c.length);if(d<=0)return c;for(let a of(await Promise.all(Array.from({length:d},async()=>{try{return await (0,D.d9)()}catch(a){return console.warn("[dashboardAnalytics] Extra MySQL analytics connection unavailable:",a?.message||a),null}}))))a&&c.push(a);return c}function aV(a,b=0){return Array.isArray(a)&&0!==a.length?a[Math.abs(b)%a.length]||a[0]:null}async function aW(a=[]){let b=[...new Set((a||[]).filter(Boolean))];await Promise.all(b.map(a=>a?.close?.().catch(()=>{})))}function aX(a={}){return{rows:[],generatedAt:"",nextRefreshAt:"",refreshEveryMs:9e5,period:F,periodLabel:"H\xf4m nay",status:"warming",...a}}function aY(){return global._dashboardTokenLeaderboard||(global._dashboardTokenLeaderboard={data:aX(),refreshPromise:null,timerStarted:!1,lastError:""}),global._dashboardTokenLeaderboard}async function aZ(){let a=_({period:F,timeZone:G}),b=await (0,D.d9)(),c=[b];try{c=await aU(b,1);let d=aV(c,0),e=ar(a,null),f=await d.get(`SELECT
|
|
337
|
+
SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) AS totalTokens,
|
|
338
|
+
COUNT(*) AS requests
|
|
339
|
+
FROM usageHistory
|
|
340
|
+
${e.clause}`,e.params)||{},g=Q(f.totalTokens,0),h=await d.all(`WITH base AS (
|
|
341
|
+
SELECT
|
|
342
|
+
COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), 'local-no-key') AS groupKey,
|
|
343
|
+
COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
|
|
344
|
+
COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
|
|
345
|
+
COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
|
|
346
|
+
COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyStable,
|
|
347
|
+
COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), '') AS clientIpStable,
|
|
348
|
+
COALESCE(NULLIF(provider, ''), 'unknown') AS providerStable,
|
|
349
|
+
COALESCE(NULLIF(model, ''), 'unknown') AS modelStable,
|
|
350
|
+
timestamp,
|
|
351
|
+
COALESCE(promptTokens, 0) AS promptTokens,
|
|
352
|
+
COALESCE(completionTokens, 0) AS completionTokens,
|
|
353
|
+
COALESCE(cost, 0) AS cost
|
|
354
|
+
FROM usageHistory
|
|
355
|
+
${e.clause}
|
|
356
|
+
)
|
|
357
|
+
SELECT
|
|
358
|
+
groupKey AS key,
|
|
359
|
+
MAX(ownerUser) AS ownerUser,
|
|
360
|
+
MAX(apiKeyName) AS apiKeyName,
|
|
361
|
+
MAX(apiKeyFingerprint) AS apiKeyFingerprint,
|
|
362
|
+
COUNT(*) AS requests,
|
|
363
|
+
SUM(promptTokens) AS promptTokens,
|
|
364
|
+
SUM(completionTokens) AS completionTokens,
|
|
365
|
+
SUM(promptTokens + completionTokens) AS totalTokens,
|
|
366
|
+
SUM(cost) AS cost,
|
|
367
|
+
COUNT(DISTINCT NULLIF(apiKeyStable, '')) AS apiKeyCount,
|
|
368
|
+
COUNT(DISTINCT NULLIF(clientIpStable, '')) AS sourceIpCount,
|
|
369
|
+
COUNT(DISTINCT modelStable) AS modelCount,
|
|
370
|
+
COUNT(DISTINCT providerStable) AS providerCount,
|
|
371
|
+
MAX(timestamp) AS lastSeen
|
|
372
|
+
FROM base
|
|
373
|
+
GROUP BY groupKey
|
|
374
|
+
ORDER BY totalTokens DESC, requests DESC
|
|
375
|
+
LIMIT ?`,[...e.params,5])||[];return{rows:function(a=[],b=0){return a.map((a,c)=>{let d=c+1,e=Q(a.promptTokens,0),f=Q(a.completionTokens,0),g=Q(a.totalTokens,e+f),h=O(a.ownerUser),i=O(a.apiKeyName),j=O(a.apiKeyFingerprint);return{key:O(a.key)||`${d}`,rank:d,title:H[c]||"Token Royalty",ownerUser:h,label:h||i||j||"Local / kh\xf4ng API key",apiKeyName:i,apiKeyFingerprint:j,requests:Q(a.requests,0),promptTokens:e,completionTokens:f,totalTokens:g,cost:Q(a.cost,0),apiKeyCount:Q(a.apiKeyCount,0),modelCount:Q(a.modelCount,0),providerCount:Q(a.providerCount,0),sourceIpCount:Q(a.sourceIpCount,0),lastSeen:a.lastSeen||"",tokenShare:b?g/b:0}})}(h,g),generatedAt:new Date().toISOString(),nextRefreshAt:new Date(Date.now()+9e5).toISOString(),refreshEveryMs:9e5,period:F,periodLabel:"H\xf4m nay",status:"ready",totalTokens:g,totalRequests:Q(f.requests,0)}}finally{await aW(c)}}async function a$(){let a=aY();return a.refreshPromise||(a.refreshPromise=aZ().then(b=>(a.data=b,a.lastError="",b)).catch(b=>{let c=b?.message||String(b);return a.lastError=c,a.data=aX({status:a.data?.rows?.length?"stale":"error",error:c}),console.error("[analytics] Failed to refresh token leaderboard:",c),a.data}).finally(()=>{a.refreshPromise=null})),a.refreshPromise}async function a_(a={}){let b=JSON.stringify(_(a)),c=(global._dashboardAnalyticsV2Cache||(global._dashboardAnalyticsV2Cache=new Map),global._dashboardAnalyticsV2Cache),d=c.get(b);if(d&&Date.now()-d.createdAt<3e4){let a=Date.now()-d.createdAt;return a0&&console.log(`[analytics-timing] cache HIT (age=${a}ms)`),{...d.data,cacheState:"hit",cacheAgeMs:a}}let e=(global._dashboardAnalyticsInflight||(global._dashboardAnalyticsInflight=new Map),global._dashboardAnalyticsInflight),f=e.get(b);if(f)return a0&&console.log("[analytics-timing] joined in-flight computation"),f.then(a=>({...a,cacheState:"joined"}));a0&&console.log(`[analytics-timing] cache MISS, computing. key=${b.slice(0,200)}`);let g=a1(a,b,c).finally(()=>{e.delete(b)});return e.set(b,g),g.then(a=>({...a,cacheState:"fresh"}))}let a0="0"!==process.env.DASHBOARD_ANALYTICS_TIMING;async function a1(a,b,c){let e,f,g,{timed:h,report:i,totalMs:j}=(e=Date.now(),f=[],{timed:(a,b)=>{let c=Date.now();return Promise.resolve(b).finally(()=>{f.push({name:a,ms:Date.now()-c})})},report:()=>{if(!a0)return;let a=f.sort((a,b)=>b.ms-a.ms).map(a=>`${a.name}=${a.ms}ms`).join(" | ");console.log(`[analytics-timing] total=${g()}ms | ${a}`)},totalMs:g=()=>Date.now()-e}),k=_(a),l=await (0,d.c)(),m=await (0,D.d9)().catch(a=>(console.error("[dashboardAnalytics] MySQL observability query adapter unavailable; SQLite fallback is disabled:",a?.message||a),null));if(!m)throw Error("MySQL observability is not configured or unavailable; SQLite analytics fallback is disabled.");let n=[m];try{n=await h("openAdapters",aU(m,6));let a=aV(n,0),[d,e]=await h("configLoad",Promise.all([ab(l),ac(l)])),f=k.userOwnedOnly?function(a=[],b={}){let c=[...new Set((a||[]).map(a=>P(a)).filter(Boolean))];if(0===c.length)return{enabled:!0,noMatch:!0,owners:[],identifiers:[],ids:[],fingerprints:[]};let d=new Set(c),e=new Set,f=new Set,g=new Set;for(let a of b.all||[]){let b=P(a.ownerUser);b&&d.has(b)&&(a.key&&e.add(a.key),a.id&&(e.add(a.id),f.add(a.id)),a.fingerprint&&(e.add(a.fingerprint),g.add(a.fingerprint)))}return{enabled:!0,noMatch:0===e.size,owners:c,identifiers:[...e],ids:[...f],fingerprints:[...g]}}(k.ownerCandidates,d):k.ownedAnyUserOnly?function(a={}){let b=new Set,c=new Set,d=new Set,e=new Set;for(let f of a.all||[]){let a=P(f.ownerUser);a&&(b.add(a),f.key&&c.add(f.key),f.id&&(c.add(f.id),d.add(f.id)),f.fingerprint&&(c.add(f.fingerprint),e.add(f.fingerprint)))}return{enabled:!0,noMatch:0===c.size&&0===b.size,owners:[...b],identifiers:[...c],ids:[...d],fingerprints:[...e]}}(d):null,g=f?{...k,ownerScope:f}:k,o=function(a,b){let c=P(a);if(!c)return null;let d=[],e=!1;for(let a of(["local","local-no-key","no-key","khong-key","kh\xf4ng-key","kh\xf4ng d\xf9ng api key"].some(a=>a.includes(c)||c.includes(a))&&(e=!0),b.all||[]))[a.key,a.id,a.name,a.ownerUser,a.createdByUser,a.machineId,a.fingerprint,a.masked].some(a=>P(a).includes(c))&&a.key&&d.push(a.key);return a.length>=16&&!d.includes(a)&&d.push(a),{keys:[...new Set(d)],includeLocal:e,noMatch:0===d.length&&!e,filter:c}}(g.apiKey,d),p=g.userOwnedOnly||g.ownedAnyUserOnly?Promise.resolve(function(a="disabled"){return{disabled:!0,reason:a,missing:!1,total:0,sampled:0,dbInfo:{},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]}}("user_owned_scope_no_api_key_columns")):B({keyword:g.keyword,model:g.model,sourceTool:g.sourceTool,clientIp:g.clientIp,sessionId:g.sessionId,dateFrom:g.startIso,dateTo:g.endIso,workingTimeRanges:g.workingTimeRanges}),q=(0,C.Wl)({keyword:g.keyword,provider:g.provider,model:g.model,connectionId:g.connectionId,endpoint:g.endpoint,apiKey:g.apiKey,apiKeyScope:f,status:g.status,sourceTool:g.sourceTool,clientIp:g.clientIp,sessionId:g.sessionId,dateFrom:g.startIso,dateTo:g.endIso,workingTimeRanges:g.workingTimeRanges}),[r,s,t,u,v,w]=await Promise.all([h("rangeBounds",ai(aV(n,0),g,o)),h("overview",aj(aV(n,1),g,o)),h("groups",an(n,g,d,e,o)),h("latency",aq(aV(n,3),g,o)),h("promptLogStats",p),h("requestErrorStats",q)]),x=function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=a=>Array.isArray(a)?a.map(a=>(function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=O(a.provider||a.errorSource||a.providerId),d=O(a.providerLabel)||ad(c,b),e={...a};for(let a of["sample","sampleMessage","errorMessage","errorMessageShort","message","details"])"string"==typeof e[a]&&(e[a]=function(a,b,c){let d="string"==typeof a?a:"";return d&&b&&c&&b!==c?d.split(b).join(c):a}(e[a],c,d));return{...e,provider:c,providerLabel:d,label:O(e.label)||d||c||"unknown"}})(a,b)):[];return{...a,topErrors:c(a.topErrors),topServerErrors:c(a.topServerErrors),topClientErrors:c(a.topClientErrors),topRateLimitErrors:c(a.topRateLimitErrors),errorDistribution:c(a.errorDistribution),byFaultOwner:c(a.byFaultOwner),byProvider:c(a.byProvider)}}(w,e),y=x?.summary||{};s.rawErrorEvents=Q(x?.total,0),s.serverErrorEvents=Q(y.serverImpacting,0),s.gatewayErrorEvents=Q(y.gateway,0),s.upstreamErrorEvents=Q(y.upstream,0),s.clientErrorEvents=Q(y.client,0),s.rateLimitErrorEvents=Q(y.rateLimit,0),s.unknownErrorEvents=Q(y.unknown,0),s.serverErrorRate=s.requests?s.serverErrorEvents/s.requests:0,s.clientErrorRate=s.requests?s.clientErrorEvents/s.requests:0,s.rateLimitErrorRate=s.requests?s.rateLimitErrorEvents/s.requests:0,x?.topErrors?.length&&(t.errors=x.topErrors);let z=new Map([...d.byKey.entries(),...d.byFingerprint.entries()]),[A,D,E,F,G,H,I]=await Promise.all([h("experience",av(aV(n,0),g,o,s)),h("clientRequests",aT(aV(n,1),g,o,s,e)),h("thinking",aR(aV(n,2),g,o)),h("largeContext",aS(aV(n,3),g,o)),h("timeSeries",ao(aV(n,2),g,o,r)),h("recentUsage",az(aV(n,3),g,o,z,e)),h("heavyRequests",aA(aV(n,0),g,o,z,e))]),[J,K]=await Promise.all([h("modelExperience",aw(aV(n,1),g,o,e)),h("slowRequests",ax(aV(n,2),g,o,z,e))]);A.byModel=J,A.slowestRequests=K,s.userExperienceScore=A.score,s.userExperienceLabel=A.label,s.slowRequestRate=A.slowRequestRate,s.longInputRate=A.longInputRate,s.thinkingAutoOffRate=E.autoOffRate||0,s.largeContextRate=F.gte50kRate||0,s.topHeavyUser=D.summary?.topUserLabel||"",s.topHeavyUserTokenShare=D.summary?.topUserTokenShare||0,s.extremeInputShare=D.summary?.extremeInputShare||0;let L=await h("options",aH(a,g,t,v,d,o,e)),M=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=Q(h.serverImpacting,0),j=Q(h.client,0),k=Q(h.rateLimit,0),l=Q(a.serverErrorRate,a.requests?i/a.requests:0),m=Q(a.clientErrorRate,a.requests?j/a.requests:0);a.requests>=10&&i>=3&&l>=.05?g.push({level:l>=.15?"danger":"warning",title:"Tỷ lệ lỗi server/provider cao",detail:`${i.toLocaleString("vi-VN")} lỗi server-impacting (${(100*l).toFixed(1)}% request) trong khoảng thời gian đang lọc. Ưu ti\xean kiểm tra upstream/provider, gateway, timeout v\xe0 5xx.`}):a.requests>=10&&a.errorRate>=.2&&m>=.1?g.push({level:"warning",title:"Nhiều lỗi do client/request",detail:`${j.toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 client-side (${(100*m).toFixed(1)}% request): sai endpoint/model/auth/body/context. Kh\xf4ng n\xean t\xednh nh\xf3m n\xe0y như lỗi server.`}):a.requests>=10&&a.errorRate>=.2&&g.push({level:"warning",title:"Tỷ lệ lỗi tổng cao",detail:`Tổng lỗi usage l\xe0 ${(100*a.errorRate).toFixed(1)}%, nhưng lỗi server-impacting chỉ ${(100*l).toFixed(1)}%. Xem ph\xe2n loại client/server b\xean dưới trước khi kết luận provider hỏng.`}),k>=5&&a.requests>0&&k/a.requests>=.05&&g.push({level:"warning",title:"Rate limit / quota đ\xe1ng ch\xfa \xfd",detail:`${k.toLocaleString("vi-VN")} lỗi rate-limit/quota trong khoảng lọc. Kiểm tra policy API key, quota provider hoặc ph\xe2n tải model.`});let n=b.apiKeys?.[0];n&&a.totalTokens>0&&n.totalTokens/a.totalTokens>=.5&&g.push({level:"warning",title:"Một API key d\xf9ng phần lớn token",detail:`${n.name||n.fingerprint} đang d\xf9ng ${(n.totalTokens/a.totalTokens*100).toFixed(1)}% tổng token.`});let o=c?.topClientIps?.[0];o&&c.total>0&&o.requests/c.total>=.5&&o.requests>=20&&g.push({level:"warning",title:"Một IP chiếm phần lớn request prompt log",detail:`${o.label} chiếm ${(o.requests/c.total*100).toFixed(1)}% prompt logs trong to\xe0n bộ dữ liệu khớp bộ lọc.`});let p=d?.topServerErrors?.[0];return p&&p.requests>=5&&g.push({level:p.requests>=20?"danger":"warning",title:"Provider/Gateway c\xf3 lỗi cần xử l\xfd",detail:`${p.providerLabel||p.provider||p.errorSource||"unknown"}/${p.model||"unknown"} c\xf3 ${p.requests.toLocaleString("vi-VN")} lỗi ${p.errorType||p.status||"server-impacting"}.`}),e?.samples>=10&&Q(e.slowRequestRate,0)>=.2&&g.push({level:e.slowRequestRate>=.4?"danger":"warning",title:"Nhiều request phản hồi chậm",detail:`${(100*e.slowRequestRate).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 latency >= 45s. Kiểm tra request input d\xe0i, chờ slot/upstream queue v\xe0 tải model server.`}),e?.samples>=10&&Q(e.longInputRate,0)>=.3&&g.push({level:"warning",title:"Tỷ lệ request input d\xe0i cao",detail:`${(100*e.longInputRate).toFixed(1)}% request c\xf3 input >= 30k token. Với VS Code/agent, P95/P99 latency cao c\xf3 thể chủ yếu do prompt eval v\xe0 chờ slot, kh\xf4ng phải do output chậm.`}),f?.summary?.topUserTokenShare>=.35&&g.push({level:f.summary.topUserTokenShare>=.6?"danger":"warning",title:"Token usage tập trung v\xe0o một user/API key",detail:`${f.summary.topUserLabel||"Một client"} đang chiếm ${(100*f.summary.topUserTokenShare).toFixed(1)}% tổng token trong khoảng lọc. N\xean kiểm tra quota, workflow VS Code/agent v\xe0 request input d\xe0i của client n\xe0y.`}),f?.summary?.extremeInputShare>=.1&&g.push({level:f.summary.extremeInputShare>=.25?"danger":"warning",title:"Nhiều request cực d\xe0i >=70k token",detail:`${(100*f.summary.extremeInputShare).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 input >=70k token. Đ\xe2y l\xe0 nh\xf3m dễ k\xe9o TTFT/P95/P99 l\xean cao v\xe0 l\xe0m request nhỏ phải chờ slot.`}),g}({overview:s,groups:t,promptLogStats:v,requestErrorStats:x,experience:A,clientRequests:D}),N={generatedAt:new Date().toISOString(),computeMs:j(),analyticsVersion:"v3.6-token-leaderboard",filters:{period:g.period,startIso:g.startIso,endIso:g.endIso,provider:g.provider,model:g.model,connectionId:g.connectionId,status:g.status,endpoint:g.endpoint,apiKey:g.apiKey,clientIp:g.clientIp,sourceTool:g.sourceTool,sessionId:g.sessionId,keyword:g.keyword,userOwnedOnly:g.userOwnedOnly,ownedAnyUserOnly:g.ownedAnyUserOnly},overview:s,latency:u,experience:A,clientRequests:D,tokenLeaderboard:(!function(){let a=aY();if(a.timerStarted)return;a.timerStarted=!0;let b=setTimeout(()=>{a$().catch(()=>{})},1e3);b.unref?.();let c=setInterval(()=>{a$().catch(()=>{})},9e5);c.unref?.()}(),aY().data||aX()),thinkingAnalytics:E,largeContextAnalytics:F,timeSeries:G,groups:t,promptLogs:v,requestErrors:x,anomalies:M,recentUsage:H,heavyRequests:I,options:L,qualityNotes:[]};if(await aW(n),c.set(b,{createdAt:Date.now(),data:N}),c.size>100){for(let[a,b]of c)if(Date.now()-b.createdAt>3e4&&c.delete(a),c.size<=100)break}return i(),N}catch(a){throw await aW(n),i(),console.error("[dashboardAnalytics] MySQL observability query failed; SQLite fallback is disabled:",a?.message||a),a}}},82731:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ensureDashboardAnalyticsAiScheduler:()=>k});var e=c(70321),f=c(75870),g=c(26738),h=a([g]);g=(h.then?(await h)():h)[0];let l="__blueRouterDashboardAnalyticsAiScheduler";function i(){return globalThis[l]||(globalThis[l]={timer:null,running:null,started:!1}),globalThis[l]}async function j(){let a=i();return a.running||(a.running=(async()=>{if(await (0,f.WR)())return;let a=(await (0,e.mt)()).dashboardAnalyticsAiModel;a&&await (0,g.Q)(a,{requestedBy:"Hệ thống (tự động)"})})().finally(()=>{a.running=null})),a.running}function k(){let a=i();if(a.started)return;a.started=!0;let b=async()=>{try{await j()}catch(a){console.warn("[dashboard-analytics] AI analysis scheduler failed:",a?.message||a)}finally{a.timer=setTimeout(b,36e5),a.timer.unref?.()}};a.timer=setTimeout(b,5e3),a.timer.unref?.()}d()}catch(a){d(a)}})}};
|