@jheavenknows/bluerouter 5.5.26 → 5.5.28
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 +24 -24
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudcombo/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudcombo/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +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/audit-proxy/ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +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.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/model-catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/codex-catalog/download/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/codex-catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/codex-catalog/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-combos/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-combos/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/combo-references/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/custom-embedding/manage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/export/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js +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.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/statusline/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +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.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.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.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/rate-limits/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/rate-limits/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.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.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +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/ai-power-index.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.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 +9 -9
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +4 -4
- 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 +9 -9
- 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/model-profiles.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.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/logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/logs.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/personal.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/personal.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/embedding.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk/dashboard/providers/embedding/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk/dashboard/providers/embedding.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk/dashboard/providers/image-to-text/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk/dashboard/providers/image-to-text.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk/dashboard/providers/image/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk/dashboard/providers/image.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/image.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/image.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/stt.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk/dashboard/providers/web/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk/dashboard/providers/web.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/web.segments/_index.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/web.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 +6 -6
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
- 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.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +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/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.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.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.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.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +24 -24
- package/app/.next-cli-build/server/chunks/2428.js +1 -1
- package/app/.next-cli-build/server/chunks/3104.js +1 -1
- package/app/.next-cli-build/server/chunks/318.js +4 -4
- package/app/.next-cli-build/server/chunks/3399.js +1 -1
- package/app/.next-cli-build/server/chunks/3738.js +1 -1
- package/app/.next-cli-build/server/chunks/395.js +1 -0
- 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/{2041.js → 4939.js} +1 -1
- package/app/.next-cli-build/server/chunks/5024.js +1 -1
- package/app/.next-cli-build/server/chunks/5210.js +2 -2
- package/app/.next-cli-build/server/chunks/541.js +1 -1
- package/app/.next-cli-build/server/chunks/6118.js +1 -1
- package/app/.next-cli-build/server/chunks/6811.js +1 -1
- package/app/.next-cli-build/server/chunks/689.js +1 -1
- package/app/.next-cli-build/server/chunks/6992.js +2 -2
- package/app/.next-cli-build/server/chunks/834.js +1 -0
- package/app/.next-cli-build/server/instrumentation.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/2218-36e7f91e828ac660.js +1 -0
- package/app/.next-cli-build/static/chunks/{5263-827de68ed8132a29.js → 5263-27880098055728b6.js} +1 -1
- package/app/.next-cli-build/static/chunks/{7413-2cc83a72bcf459e1.js → 7413-d40f6736e1d7319d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/api-keys/{page-1bb88dd0ad65807c.js → page-4aada93a94ec82bd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/{page-30cd3f3e9f363bef.js → page-14a0b5fdee993e34.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/{page-70e158890ae4fc83.js → page-c2bb446a6d222c88.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/{page-ce7ac6694fbbb678.js → page-4110bf83034e0909.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/model-profiles/{page-f521e8417f2e2f31.js → page-bc086583b55ef5f2.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-0ecc380c93debdab.js → page-0cac844db4ad9c99.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/combos/{page-5ade313a9167c99b.js → page-aaa19d383574b8a9.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/{page-0e22441e0507f163.js → page-51fa9780f88cfd15.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/{page-11e60a551b0228c1.js → page-143d8991f86918ac.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/logs/console/{page-0a6293eb31eab332.js → page-8d39b923cd5d8dfd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-a08c52db4e01d8e3.js → page-9f90e12fa5ca5baf.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/{page-e870a4cb95e2a8bc.js → page-b37a236cb3ab960f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/combo/[id]/{page-07644039f6bf80ee.js → page-af7a9d2e066296a1.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{providers/web/page-6c63098dc771e280.js → media-providers/web/page-c22a60b871a0390d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{page-11e60a551b0228c1.js → page-143d8991f86918ac.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personal/{page-9ef9615e95c6d98c.js → page-7e49d60c5ff96cc6.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/{layout-478314699bce9b31.js → layout-83f4ca72c4f22484.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovider/{page-9a5af94bcad73254.js → page-2d525b336c1bc605.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudprovidermonitor/{page-33d2948585dccd8c.js → page-776d405190fe0585.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalquota/{page-d5a701cfcbeb0aaa.js → page-a67ab9649831fe5a.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-43da6f2dc8e6127f.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-3567ff1ce2261dcf.js → page-f1fc95b1ed079f4a.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/embedding/[id]/{page-c927b95886c5f0d6.js → page-10b1e26c8e2646dd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/embedding/{page-e870a4cb95e2a8bc.js → page-b37a236cb3ab960f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/image/[id]/{page-c927b95886c5f0d6.js → page-10b1e26c8e2646dd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/image/{page-e870a4cb95e2a8bc.js → page-b37a236cb3ab960f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/image-to-text/[id]/{page-c927b95886c5f0d6.js → page-10b1e26c8e2646dd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/image-to-text/{page-e870a4cb95e2a8bc.js → page-b37a236cb3ab960f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/new/{page-82eca1407d4266c2.js → page-d15119f314c7cc77.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-267a7602579ef6f4.js → page-9962982834408a76.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/stt/[id]/{page-c927b95886c5f0d6.js → page-10b1e26c8e2646dd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/stt/page-b37a236cb3ab960f.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/tts/[id]/page-10b1e26c8e2646dd.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/tts/page-b37a236cb3ab960f.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/web/[kind]/[id]/{page-7dedb965c7920eb8.js → page-0a39d5e23270296a.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/{media-providers/web/page-6c63098dc771e280.js → providers/web/page-c22a60b871a0390d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-94f864cc2f20b76d.js → page-cec84b31c776f6df.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/{page-a8165d10ab8301ef.js → page-a514ee8a88960ba6.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/{page-8ff70e1fe63630c5.js → page-87a04c48e7e3b9ed.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/translator/{page-78d24f71ba0846fa.js → page-465c5ead9fad38c4.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/{page-d08272fd14e6b4af.js → page-9f3e6003c3300b19.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/{layout-8b4790ae13ade152.js → layout-2eeace9c23b4b34b.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/{layout-9b0fc956496699bb.js → layout-0d1d11056fa4e4d9.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/login/{page-534a498e40d54531.js → page-2cae9c46669e7c3f.js} +1 -1
- 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/chunks/8723-c429b062393b6348.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-57581f6add7284d5.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/stt/page-e870a4cb95e2a8bc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/tts/[id]/page-c927b95886c5f0d6.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/tts/page-e870a4cb95e2a8bc.js +0 -1
- /package/app/.next-cli-build/static/{5AQ_UrmD1tq7tn1M3F6jS → O9rhbemkeDpWkJo57dqjk}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{5AQ_UrmD1tq7tn1M3F6jS → O9rhbemkeDpWkJo57dqjk}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.5.19-to-5.5.21-5.5.21-20260918-100009 → upgrade-5.5.26-to-5.5.27-5.5.27-20260923-105231}/data.sqlite +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.5.21-to-5.5.22-5.5.22-20260918-115908 → upgrade-5.5.27-to-5.5.28-5.5.28-20260923-112240}/data.sqlite +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8334],{22662:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>b});var a=s(95155),l=s(73321),r=s(12115),i=s(98500),n=s.n(i),o=s(35497),c=s(57250),d=s(52679);let m=/^[a-zA-Z0-9_.\-]+$/,x={webSearch:"Web Search",webFetch:"Web Fetch",image:"Text to Image",tts:"Text To Speech"},h={webSearch:"/v1/search",webFetch:"/v1/web/fetch",image:"/v1/images/generations",tts:"/v1/audio/speech"},u={webSearch:e=>({model:e,query:"What is the latest news about AI?",search_type:"web",max_results:5}),webFetch:e=>({model:e,url:"https://example.com",format:"markdown"}),image:e=>({model:e,prompt:"A cute cat playing piano",n:1,size:"1024x1024"}),tts:e=>({model:e,input:"Hello, this is a test.",voice:"alloy"})};function p(e){return"webSearch"===e||"webFetch"===e?"/dashboard/media-providers/web":`/dashboard/media-providers/${e}`}function b(){let{id:e}=(0,l.useParams)(),t=(0,l.useRouter)(),[s,i]=(0,r.useState)(null),[b,f]=(0,r.useState)(!0),[j,g]=(0,r.useState)(""),[w,y]=(0,r.useState)(""),[v,N]=(0,r.useState)([]),[k,S]=(0,r.useState)(!1),[U,$]=(0,r.useState)(!1),[C,O]=(0,r.useState)([]),[_,T]=(0,r.useState)(!1),[R,A]=(0,r.useState)(null),[L,P]=(0,r.useState)(""),[E,z]=(0,r.useState)(""),[D,F]=(0,r.useState)([]),[M,I]=(0,r.useState)({}),J=async()=>{try{let[t,s,a,l,r,n]=await Promise.all([fetch(`/api/combos/${e}`,{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"}),fetch("/api/usage/logs",{cache:"no-store"}),fetch("/api/keys",{cache:"no-store"}),fetch("/api/providers",{cache:"no-store"}),fetch("/api/models/alias",{cache:"no-store"})]);if(n.ok&&I((await n.json()).aliases||{}),l.ok){let e=await l.json();z((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}if(r.ok&&F((await r.json()).connections||[]),!t.ok){i(null),f(!1);return}let o=await t.json();i(o),g(o.name),N(o.models||[]);let c=s.ok?await s.json():{};S(c.comboStrategies?.[o.name]?.fallbackStrategy==="round-robin");let d=a.ok?await a.json():[];O(d.filter(e=>"string"==typeof e&&e.includes(o.name)).slice(0,50))}catch{}f(!1)};(0,r.useEffect)(()=>{J()},[e]);let W=e=>e.trim()?m.test(e)?(y(""),!0):(y("Only letters, numbers, -, _ and ."),!1):(y("Name is required"),!1),H=async t=>{let s=await fetch(`/api/combos/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return!!s.ok||(alert((await s.json()).error||"Failed to save"),!1)},Z=async()=>{!W(j)||j===s.name||await H({name:j})&&await J()},q=async e=>{let t=e?.value||e;if(!t||v.includes(t))return;let s=[...v,t];N(s),await H({models:s})},B=async e=>{let t=e?.value||e;if(!t||!v.includes(t))return;let s=v.filter(e=>e!==t);N(s),await H({models:s})},Y=async e=>{let t=v.filter((t,s)=>s!==e);N(t),await H({models:t})},G=async(e,t)=>{let s=[...v],a=e+t;a<0||a>=s.length||([s[e],s[a]]=[s[a],s[e]],N(s),await H({models:s}))},K=async e=>{S(e);let t=await fetch("/api/settings",{cache:"no-store"}),a={...(t.ok?await t.json():{}).comboStrategies||{}};e?a[s.name]={fallbackStrategy:"round-robin"}:delete a[s.name],await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:a})})},Q=async()=>{!confirm(`Delete combo "${s.name}"?`)||(await fetch(`/api/combos/${e}`,{method:"DELETE"})).ok&&t.push(p(s.kind))},V=async()=>{if(T(!0),A(null),P(""),R?.audioUrl)try{URL.revokeObjectURL(R.audioUrl)}catch{}if(R?.imageUrl?.startsWith("blob:"))try{URL.revokeObjectURL(R.imageUrl)}catch{}let e=Date.now();try{let t=h[s.kind],a=u[s.kind](s.name),l={"Content-Type":"application/json"};E&&(l.Authorization=`Bearer ${E}`);let r=await fetch(`/api${t}`,{method:"POST",headers:l,body:JSON.stringify(a)}),i=Date.now()-e;if(!r.ok){let e=await r.json().catch(()=>({}));P(e?.error?.message||e?.error||`HTTP ${r.status}`),A({json:JSON.stringify(e,null,2),latencyMs:i});return}let n=r.headers.get("content-type")||"";if(n.startsWith("image/")){let e=await r.blob();A({imageUrl:URL.createObjectURL(e),latencyMs:i});return}if(n.startsWith("audio/")||"application/octet-stream"===n){let e=await r.blob();A({audioUrl:URL.createObjectURL(e),latencyMs:i});return}let o=await r.json(),c=o?.data?.[0],d=c?.b64_json?`data:image/png;base64,${c.b64_json}`:c?.url||"";A({json:JSON.stringify(function e(t){if(!t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(e);let s={};for(let[a,l]of Object.entries(t))s[a]="b64_json"===a&&"string"==typeof l&&l.length>100?`<${l.length} chars base64>`:e(l);return s}(o),null,2),imageUrl:d,latencyMs:i})}catch(e){P(e.message||"Network error")}T(!1)};if(b)return(0,a.jsx)("div",{className:"text-text-muted text-sm",children:"Loading..."});if(!s)return(0,l.notFound)();let X=x[s.kind]||d.rj.find(e=>e.id===s.kind)?.label||"Combo",ee=h[s.kind],et=s.kind&&u[s.kind]?u[s.kind](s.name):null,es=ee?`curl -X POST http://localhost:20128${ee} \\
|
|
2
2
|
-H "Content-Type: application/json" \\
|
|
3
3
|
-H "Authorization: Bearer ${E||"YOUR_KEY"}" \\
|
|
4
|
-
-d '${JSON.stringify(et)}'`:"",ea=p(s.kind);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)(n(),{href:ea,className:"text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"arrow_back"})}),(0,a.jsx)("div",{className:"size-10 rounded-lg bg-primary/10 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"layers"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("p",{className:"text-xs text-text-muted",children:[X," Combo"]}),(0,a.jsx)("code",{className:"text-lg font-semibold font-mono",children:s.name})]})]}),(0,a.jsx)(o.$n,{variant:"outline",icon:"delete",onClick:Q,className:"text-red-500 border-red-200 hover:bg-red-50",children:"Delete"})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Settings"}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.pd,{label:"Combo Name",value:j,onChange:e=>{g(e.target.value),W(e.target.value)},onBlur:Z,error:w}),(0,a.jsx)("p",{className:"text-[10px] text-text-muted mt-0.5",children:"Only letters, numbers, -, _ and ."})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Rotate providers across requests instead of strict fallback order."})]}),(0,a.jsx)(o.lM,{checked:k,onChange:K})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Providers"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Tried in order (top-down) or rotated when round-robin is on."})]}),(0,a.jsx)(o.$n,{size:"sm",icon:"add",onClick:()=>$(!0),children:"Add Provider"})]}),0===v.length?(0,a.jsx)("div",{className:"text-center py-6 border border-dashed border-border rounded-lg text-text-muted text-sm",children:"No providers yet."}):(0,a.jsx)("div",{className:"flex flex-col gap-2",children:v.map((e,t)=>{let{providerId:s,model:l}=function(e){if("string"!=typeof e)return{providerId:"",model:""};let t=e.indexOf("/");return t<0?{providerId:e,model:""}:{providerId:e.slice(0,t),model:e.slice(t+1)}}(e),r=d.Q2[s];return(0,a.jsxs)("div",{className:"flex items-center gap-3 p-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02]",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-5 text-center",children:t+1}),(0,a.jsx)(c.A,{src:`/providers/${s}.png`,alt:r?.name||s,size:24,className:"object-contain rounded shrink-0",fallbackText:r?.textIcon||s.slice(0,2).toUpperCase(),fallbackColor:r?.color}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"text-sm font-medium truncate",children:r?.name||s}),l&&(0,a.jsx)("code",{className:"text-[10px] text-text-muted font-mono truncate block",children:l})]}),(0,a.jsxs)("div",{className:"flex items-center gap-0.5",children:[(0,a.jsx)("button",{onClick:()=>G(t,-1),disabled:0===t,className:`p-1 rounded ${0===t?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move up",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,a.jsx)("button",{onClick:()=>G(t,1),disabled:t===v.length-1,className:`p-1 rounded ${t===v.length-1?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move down",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,a.jsx)("button",{onClick:()=>Y(t),className:"p-1 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:"Remove",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]})]},`${e}-${t}`)})})]}),s.kind&&ee&&(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Test Example"}),(0,a.jsx)(o.$n,{size:"sm",icon:"play_arrow",onClick:V,disabled:_||0===v.length,children:_?"Running...":"Run"})]}),(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-x-auto whitespace-pre-wrap break-all",children:es}),L&&(0,a.jsx)("p",{className:"mt-3 text-xs text-red-500 break-words",children:L}),R&&(0,a.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[null!=R.latencyMs&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted",children:["⚡ ",R.latencyMs,"ms"]}),R.imageUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.imageUrl,download:"image.png",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("img",{src:R.imageUrl,alt:"Generated",className:"max-w-full rounded-lg border border-border"})]}),R.audioUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.audioUrl,download:"speech.mp3",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("audio",{controls:!0,src:R.audioUrl,className:"w-full"})]}),R.json&&(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[300px] whitespace-pre-wrap break-all",children:R.json})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Usage Logs"}),0===C.length?(0,a.jsx)("p",{className:"text-xs text-text-muted italic",children:"No usage yet."}):(0,a.jsx)("pre",{className:"text-[11px] font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[400px] whitespace-pre-wrap",children:C.join("\n")})]}),(0,a.jsx)(o.rq,{isOpen:U,onClose:()=>$(!1),onSelect:q,onDeselect:B,activeProviders:D,modelAliases:M,title:`Add ${X} Model`,kindFilter:s.kind,addedModelValues:v,closeOnSelect:!1})]})}},70878:(e,t,s)=>{Promise.resolve().then(s.bind(s,22662))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
4
|
+
-d '${JSON.stringify(et)}'`:"",ea=p(s.kind);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)(n(),{href:ea,className:"text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"arrow_back"})}),(0,a.jsx)("div",{className:"size-10 rounded-lg bg-primary/10 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"layers"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("p",{className:"text-xs text-text-muted",children:[X," Combo"]}),(0,a.jsx)("code",{className:"text-lg font-semibold font-mono",children:s.name})]})]}),(0,a.jsx)(o.$n,{variant:"outline",icon:"delete",onClick:Q,className:"text-red-500 border-red-200 hover:bg-red-50",children:"Delete"})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Settings"}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(o.pd,{label:"Combo Name",value:j,onChange:e=>{g(e.target.value),W(e.target.value)},onBlur:Z,error:w}),(0,a.jsx)("p",{className:"text-[10px] text-text-muted mt-0.5",children:"Only letters, numbers, -, _ and ."})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Rotate providers across requests instead of strict fallback order."})]}),(0,a.jsx)(o.lM,{checked:k,onChange:K})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Providers"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Tried in order (top-down) or rotated when round-robin is on."})]}),(0,a.jsx)(o.$n,{size:"sm",icon:"add",onClick:()=>$(!0),children:"Add Provider"})]}),0===v.length?(0,a.jsx)("div",{className:"text-center py-6 border border-dashed border-border rounded-lg text-text-muted text-sm",children:"No providers yet."}):(0,a.jsx)("div",{className:"flex flex-col gap-2",children:v.map((e,t)=>{let{providerId:s,model:l}=function(e){if("string"!=typeof e)return{providerId:"",model:""};let t=e.indexOf("/");return t<0?{providerId:e,model:""}:{providerId:e.slice(0,t),model:e.slice(t+1)}}(e),r=d.Q2[s];return(0,a.jsxs)("div",{className:"flex items-center gap-3 p-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02]",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-5 text-center",children:t+1}),(0,a.jsx)(c.A,{src:`/providers/${s}.png`,alt:r?.name||s,size:24,className:"object-contain rounded shrink-0",fallbackText:r?.textIcon||s.slice(0,2).toUpperCase(),fallbackColor:r?.color}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"text-sm font-medium truncate",children:r?.name||s}),l&&(0,a.jsx)("code",{className:"text-[10px] text-text-muted font-mono truncate block",children:l})]}),(0,a.jsxs)("div",{className:"flex items-center gap-0.5",children:[(0,a.jsx)("button",{onClick:()=>G(t,-1),disabled:0===t,className:`p-1 rounded ${0===t?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move up",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,a.jsx)("button",{onClick:()=>G(t,1),disabled:t===v.length-1,className:`p-1 rounded ${t===v.length-1?"text-text-muted/20":"text-text-muted hover:text-primary hover:bg-black/5"}`,title:"Move down",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,a.jsx)("button",{onClick:()=>Y(t),className:"p-1 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:"Remove",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]})]},`${e}-${t}`)})})]}),s.kind&&ee&&(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Test Example"}),(0,a.jsx)(o.$n,{size:"sm",icon:"play_arrow",onClick:V,disabled:_||0===v.length,children:_?"Running...":"Run"})]}),(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-x-auto whitespace-pre-wrap break-all",children:es}),L&&(0,a.jsx)("p",{className:"mt-3 text-xs text-red-500 break-words",children:L}),R&&(0,a.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[null!=R.latencyMs&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted",children:["⚡ ",R.latencyMs,"ms"]}),R.imageUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.imageUrl,download:"image.png",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("img",{src:R.imageUrl,alt:"Generated",className:"max-w-full rounded-lg border border-border"})]}),R.audioUrl&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"flex items-center justify-end mb-1.5",children:(0,a.jsxs)("a",{href:R.audioUrl,download:"speech.mp3",className:"inline-flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})}),(0,a.jsx)("audio",{controls:!0,src:R.audioUrl,className:"w-full"})]}),R.json&&(0,a.jsx)("pre",{className:"text-xs font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[300px] whitespace-pre-wrap break-all",children:R.json})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Usage Logs"}),0===C.length?(0,a.jsx)("p",{className:"text-xs text-text-muted italic",children:"No usage yet."}):(0,a.jsx)("pre",{className:"text-[11px] font-mono bg-black/[0.03] dark:bg-white/[0.03] p-3 rounded-lg overflow-auto max-h-[400px] whitespace-pre-wrap",children:C.join("\n")})]}),(0,a.jsx)(o.rq,{isOpen:U,onClose:()=>$(!1),onSelect:q,onDeselect:B,activeProviders:D,modelAliases:M,title:`Add ${X} Model`,kindFilter:s.kind,addedModelValues:v,closeOnSelect:!1})]})}},70878:(e,t,s)=>{Promise.resolve().then(s.bind(s,22662))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,8441,3794,7358],()=>e(e.s=70878)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8241,9260],{39548:(e,s,t)=>{Promise.resolve().then(t.bind(t,60530))},60530:(e,s,t)=>{"use strict";t.d(s,{default:()=>b});var r=t(95155),a=t(98500),i=t.n(a),l=t(12115),o=t(73321),c=t(35497),n=t(57250),d=t(52679);function m(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function x({provider:e,kind:s,connections:t}){let a=d.Q2[e.id],l=!!a?.noAuth,o=t.filter(s=>s.provider===e.id),h=o.filter(e=>{let s=m(e);return"active"===s||"success"===s}).length,p=o.filter(e=>{let s=m(e);return"error"===s||"expired"===s||"unavailable"===s}).length,b=o.length,u=b>0&&o.every(e=>!1===e.isActive);return(0,r.jsx)(i(),{href:`/dashboard/providers/web/${s}/${e.id}`,className:"group",children:(0,r.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${u?"opacity-50":""}`,children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,r.jsx)(n.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,r.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:l?(0,r.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):u?(0,r.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===b?(0,r.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,r.jsxs)(r.Fragment,{children:[h>0&&(0,r.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[h," Connected"]}),p>0&&(0,r.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[p," Error"]}),0===h&&0===p&&(0,r.jsxs)(c.Ex,{variant:"default",size:"sm",children:[b," Added"]})]})})]})]})})})}function h({combos:e}){return 0===e.length?(0,r.jsx)("p",{className:"text-xs text-text-muted italic",children:"No combos yet."}):(0,r.jsx)("div",{className:"flex flex-col gap-2",children:e.map(e=>(0,r.jsx)(i(),{href:`/dashboard/media-providers/combo/${e.id}`,children:(0,r.jsx)(c.Zp,{padding:"xs",className:"hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors cursor-pointer",children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"layers"}),(0,r.jsx)("code",{className:"text-sm font-mono font-medium flex-1 truncate",children:e.name}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1 sm:shrink-0",children:[e.models.slice(0,6).map((e,s)=>{let t="string"==typeof e?e.split("/")[0]:"",a=d.Q2[t];return(0,r.jsx)("div",{title:a?.name||e,className:"size-5 rounded flex items-center justify-center",style:{backgroundColor:`${a?.color??"#888"}15`},children:(0,r.jsx)(n.A,{src:`/providers/${t}.png`,alt:a?.name||t,size:18,className:"object-contain rounded max-w-[18px] max-h-[18px]",fallbackText:a?.textIcon||t.slice(0,2).toUpperCase(),fallbackColor:a?.color})},`${e}-${s}`)}),e.models.length>6&&(0,r.jsxs)("span",{className:"text-[10px] text-text-muted ml-1",children:["+",e.models.length-6]})]}),(0,r.jsx)("span",{className:"text-[11px] text-text-muted shrink-0",children:e.models.length}),(0,r.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[16px]",children:"chevron_right"})]})})},e.id))})}function p({title:e,icon:s,kind:t,providers:a,connections:i,combos:l,onCreateCombo:o}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary",children:s}),(0,r.jsx)("h2",{className:"text-base font-semibold",children:e}),(0,r.jsxs)("span",{className:"text-xs text-text-muted",children:["(",a.length," providers \xb7 ",l.length," combos)"]})]}),(0,r.jsx)(c.$n,{size:"sm",icon:"add",onClick:o,children:"Create Combo"})]}),l.length>0&&(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsx)(h,{combos:l})}),0===a.length?(0,r.jsx)("div",{className:"text-center py-8 border border-dashed border-border rounded-xl text-text-muted text-sm",children:"No providers."}):(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:a.map(e=>(0,r.jsx)(x,{provider:e,kind:t,connections:i},e.id))})]})}function b(){let e=(0,o.useRouter)(),[s,t]=(0,l.useState)([]),[a,i]=(0,l.useState)([]),c=async()=>{try{let[e,s]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/combos",{cache:"no-store"})]);e.ok&&t((await e.json()).connections||[]),s.ok&&i((await s.json()).combos||[])}catch{}};(0,l.useEffect)(()=>{c()},[]);let n=(0,d.o5)("webSearch"),m=(0,d.o5)("webFetch"),x=a.filter(e=>"webSearch"===e.kind),h=a.filter(e=>"webFetch"===e.kind),b=async s=>{let t="webSearch"===s?"search-combo":"fetch-combo",r=t,i=1,l=new Set(a.map(e=>e.name));for(;l.has(r);)r=`${t}-${i++}`;let o=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,models:[],kind:s})});if(o.ok){let s=await o.json();e.push(`/dashboard/media-providers/combo/${s.id}`)}else alert((await o.json()).error||"Failed to create combo")};return(0,r.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,r.jsx)(p,{title:"Web Search",icon:"search",kind:"webSearch",providers:n,connections:s,combos:x,onCreateCombo:()=>b("webSearch")}),(0,r.jsx)("div",{className:"border-t border-border"}),(0,r.jsx)(p,{title:"Web Fetch",icon:"travel_explore",kind:"webFetch",providers:m,connections:s,combos:h,onCreateCombo:()=>b("webFetch")})]})}}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8241,9260],{39548:(e,s,t)=>{Promise.resolve().then(t.bind(t,60530))},60530:(e,s,t)=>{"use strict";t.d(s,{default:()=>b});var r=t(95155),a=t(98500),i=t.n(a),l=t(12115),o=t(73321),c=t(35497),n=t(57250),d=t(52679);function m(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function x({provider:e,kind:s,connections:t}){let a=d.Q2[e.id],l=!!a?.noAuth,o=t.filter(s=>s.provider===e.id),h=o.filter(e=>{let s=m(e);return"active"===s||"success"===s}).length,p=o.filter(e=>{let s=m(e);return"error"===s||"expired"===s||"unavailable"===s}).length,b=o.length,u=b>0&&o.every(e=>!1===e.isActive);return(0,r.jsx)(i(),{href:`/dashboard/providers/web/${s}/${e.id}`,className:"group",children:(0,r.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${u?"opacity-50":""}`,children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,r.jsx)(n.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,r.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:l?(0,r.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):u?(0,r.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===b?(0,r.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,r.jsxs)(r.Fragment,{children:[h>0&&(0,r.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[h," Connected"]}),p>0&&(0,r.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[p," Error"]}),0===h&&0===p&&(0,r.jsxs)(c.Ex,{variant:"default",size:"sm",children:[b," Added"]})]})})]})]})})})}function h({combos:e}){return 0===e.length?(0,r.jsx)("p",{className:"text-xs text-text-muted italic",children:"No combos yet."}):(0,r.jsx)("div",{className:"flex flex-col gap-2",children:e.map(e=>(0,r.jsx)(i(),{href:`/dashboard/media-providers/combo/${e.id}`,children:(0,r.jsx)(c.Zp,{padding:"xs",className:"hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors cursor-pointer",children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"layers"}),(0,r.jsx)("code",{className:"text-sm font-mono font-medium flex-1 truncate",children:e.name}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-1 sm:shrink-0",children:[e.models.slice(0,6).map((e,s)=>{let t="string"==typeof e?e.split("/")[0]:"",a=d.Q2[t];return(0,r.jsx)("div",{title:a?.name||e,className:"size-5 rounded flex items-center justify-center",style:{backgroundColor:`${a?.color??"#888"}15`},children:(0,r.jsx)(n.A,{src:`/providers/${t}.png`,alt:a?.name||t,size:18,className:"object-contain rounded max-w-[18px] max-h-[18px]",fallbackText:a?.textIcon||t.slice(0,2).toUpperCase(),fallbackColor:a?.color})},`${e}-${s}`)}),e.models.length>6&&(0,r.jsxs)("span",{className:"text-[10px] text-text-muted ml-1",children:["+",e.models.length-6]})]}),(0,r.jsx)("span",{className:"text-[11px] text-text-muted shrink-0",children:e.models.length}),(0,r.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[16px]",children:"chevron_right"})]})})},e.id))})}function p({title:e,icon:s,kind:t,providers:a,connections:i,combos:l,onCreateCombo:o}){return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-primary",children:s}),(0,r.jsx)("h2",{className:"text-base font-semibold",children:e}),(0,r.jsxs)("span",{className:"text-xs text-text-muted",children:["(",a.length," providers \xb7 ",l.length," combos)"]})]}),(0,r.jsx)(c.$n,{size:"sm",icon:"add",onClick:o,children:"Create Combo"})]}),l.length>0&&(0,r.jsx)("div",{className:"mb-4",children:(0,r.jsx)(h,{combos:l})}),0===a.length?(0,r.jsx)("div",{className:"text-center py-8 border border-dashed border-border rounded-xl text-text-muted text-sm",children:"No providers."}):(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:a.map(e=>(0,r.jsx)(x,{provider:e,kind:t,connections:i},e.id))})]})}function b(){let e=(0,o.useRouter)(),[s,t]=(0,l.useState)([]),[a,i]=(0,l.useState)([]),c=async()=>{try{let[e,s]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/combos",{cache:"no-store"})]);e.ok&&t((await e.json()).connections||[]),s.ok&&i((await s.json()).combos||[])}catch{}};(0,l.useEffect)(()=>{c()},[]);let n=(0,d.o5)("webSearch"),m=(0,d.o5)("webFetch"),x=a.filter(e=>"webSearch"===e.kind),h=a.filter(e=>"webFetch"===e.kind),b=async s=>{let t="webSearch"===s?"search-combo":"fetch-combo",r=t,i=1,l=new Set(a.map(e=>e.name));for(;l.has(r);)r=`${t}-${i++}`;let o=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,models:[],kind:s})});if(o.ok){let s=await o.json();e.push(`/dashboard/media-providers/combo/${s.id}`)}else alert((await o.json()).error||"Failed to create combo")};return(0,r.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,r.jsx)(p,{title:"Web Search",icon:"search",kind:"webSearch",providers:n,connections:s,combos:x,onCreateCombo:()=>b("webSearch")}),(0,r.jsx)("div",{className:"border-t border-border"}),(0,r.jsx)(p,{title:"Web Fetch",icon:"travel_explore",kind:"webFetch",providers:m,connections:s,combos:h,onCreateCombo:()=>b("webFetch")})]})}}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,8441,3794,7358],()=>e(e.s=39548)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099,6337],{18032:(e,t,s)=>{Promise.resolve().then(s.bind(s,95907))},95907:(e,t,s)=>{"use strict";s.d(t,{default:()=>m});var a=s(95155),l=s(12115),n=s(14051),i=s.n(n),r=s(35497),d=s(11059);let o=[{id:"lite",label:"Lite",desc:"N\xe9n nhẹ, vẫn giữ ngữ ph\xe1p dễ đọc."},{id:"full",label:"Full",desc:"N\xe9n c\xe2n bằng, giảm token r\xf5 hơn."},{id:"ultra",label:"Ultra",desc:"N\xe9n tối đa, c\xe2u cực ngắn."}];function c({label:e,value:t,copiedKey:s,copied:l,copy:n}){return(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3",children:[(0,a.jsx)("div",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-text-muted",children:e}),(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,a.jsx)("code",{className:"min-w-0 flex-1 truncate rounded-lg bg-surface px-3 py-2 font-mono text-xs text-text-main",children:t}),(0,a.jsx)("button",{type:"button",onClick:()=>n(t,s),className:"rounded-lg border border-border px-2 py-2 text-text-muted transition hover:border-primary hover:text-primary",title:"Copy",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:l===s?"check":"content_copy"})})]})]})}function m({machineId:e}){let[t,s]=(0,l.useState)(!0),[n,i]=(0,l.useState)(""),[x,p]=(0,l.useState)(""),[h,u]=(0,l.useState)({hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:b,copy:v}=(0,d.C)(),j=(0,l.useMemo)(()=>(function(e=""){let t=e?`${e.replace(/\/$/,"")}/v1`:"/v1";return{base:t,chat:`${t}/chat/completions`,models:`${t}/models`,health:e?`${e.replace(/\/$/,"")}/api/health`:"/api/health"}})(x),[x]);(0,l.useEffect)(()=>{p(window.location.origin),y()},[]);let y=async()=>{s(!0);try{let e=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),t=await e.json();e.ok&&u(e=>({...e,...t}))}catch(e){console.log("Error loading endpoint settings:",e)}finally{s(!1)}},g=async(e,t="")=>{i(t);try{let t=await fetch("/api/dashboard/endpoint",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json();t.ok?u(e=>({...e,...s})):alert(s.error||"Cập nhật thiết lập thất bại")}catch(e){console.log("Error updating endpoint settings:",e),alert("Cập nhật thiết lập thất bại")}finally{i("")}};return t?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsx)(r.Qv,{}),(0,a.jsx)(r.Qv,{})]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-text-main",children:"Endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Endpoint nội bộ để tool gọi BlueRouter theo chuẩn OpenAI-compatible."})]}),(0,a.jsxs)(r.$n,{onClick:y,variant:"ghost",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"hub"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Th\xf4ng tin API endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"D\xf9ng c\xe1c URL dưới đ\xe2y cho LibreChat, VSCode, Copilot proxy, Antigravity hoặc tool OpenAI-compatible kh\xe1c."})]})]}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(c,{label:"Base URL",value:j.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:j.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:j.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:j.health,copiedKey:"health",copied:b,copy:v})]}),(0,a.jsxs)("p",{className:"mt-4 text-xs text-text-muted",children:["Machine ID: ",(0,a.jsx)("code",{className:"rounded bg-surface px-1.5 py-0.5",children:e||"unknown"})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"bolt"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Token Saver"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Giảm token cho output từ tool v\xe0 phản hồi model. Bật/tắt tại đ\xe2y kh\xf4ng cần load API keys hoặc provider status."})]})]}),(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"RTK tool output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"N\xe9n output của git/grep/ls/tree/logs trước khi gửi v\xe0o model."})]}),(0,a.jsx)(r.lM,{checked:!1!==h.rtkEnabled,onChange:e=>g({rtkEnabled:e},"rtkEnabled"),disabled:"rtkEnabled"===n})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Caveman output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Th\xeam style prompt để model trả lời ngắn hơn, giảm output token."})]}),(0,a.jsx)(r.lM,{checked:!!h.cavemanEnabled,onChange:e=>g({cavemanEnabled:e},"cavemanEnabled"),disabled:"cavemanEnabled"===n})]}),h.cavemanEnabled&&(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:o.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>g({cavemanLevel:e.id},"cavemanLevel"),title:e.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${h.cavemanLevel===e.id?"border-primary bg-primary text-white":"border-border text-text-muted hover:border-primary hover:text-primary"}`,children:e.label},e.id))})]})]})]})]})}c.propTypes={label:i().string.isRequired,value:i().string.isRequired,copiedKey:i().string.isRequired,copied:i().string,copy:i().func.isRequired},m.propTypes={machineId:i().string}}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099,6337],{18032:(e,t,s)=>{Promise.resolve().then(s.bind(s,95907))},95907:(e,t,s)=>{"use strict";s.d(t,{default:()=>m});var a=s(95155),l=s(12115),n=s(14051),i=s.n(n),r=s(35497),d=s(11059);let o=[{id:"lite",label:"Lite",desc:"N\xe9n nhẹ, vẫn giữ ngữ ph\xe1p dễ đọc."},{id:"full",label:"Full",desc:"N\xe9n c\xe2n bằng, giảm token r\xf5 hơn."},{id:"ultra",label:"Ultra",desc:"N\xe9n tối đa, c\xe2u cực ngắn."}];function c({label:e,value:t,copiedKey:s,copied:l,copy:n}){return(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3",children:[(0,a.jsx)("div",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-text-muted",children:e}),(0,a.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,a.jsx)("code",{className:"min-w-0 flex-1 truncate rounded-lg bg-surface px-3 py-2 font-mono text-xs text-text-main",children:t}),(0,a.jsx)("button",{type:"button",onClick:()=>n(t,s),className:"rounded-lg border border-border px-2 py-2 text-text-muted transition hover:border-primary hover:text-primary",title:"Copy",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:l===s?"check":"content_copy"})})]})]})}function m({machineId:e}){let[t,s]=(0,l.useState)(!0),[n,i]=(0,l.useState)(""),[x,p]=(0,l.useState)(""),[h,u]=(0,l.useState)({hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:b,copy:v}=(0,d.C)(),j=(0,l.useMemo)(()=>(function(e=""){let t=e?`${e.replace(/\/$/,"")}/v1`:"/v1";return{base:t,chat:`${t}/chat/completions`,models:`${t}/models`,health:e?`${e.replace(/\/$/,"")}/api/health`:"/api/health"}})(x),[x]);(0,l.useEffect)(()=>{p(window.location.origin),y()},[]);let y=async()=>{s(!0);try{let e=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),t=await e.json();e.ok&&u(e=>({...e,...t}))}catch(e){console.log("Error loading endpoint settings:",e)}finally{s(!1)}},g=async(e,t="")=>{i(t);try{let t=await fetch("/api/dashboard/endpoint",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json();t.ok?u(e=>({...e,...s})):alert(s.error||"Cập nhật thiết lập thất bại")}catch(e){console.log("Error updating endpoint settings:",e),alert("Cập nhật thiết lập thất bại")}finally{i("")}};return t?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsx)(r.Qv,{}),(0,a.jsx)(r.Qv,{})]}):(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-text-main",children:"Endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Endpoint nội bộ để tool gọi BlueRouter theo chuẩn OpenAI-compatible."})]}),(0,a.jsxs)(r.$n,{onClick:y,variant:"ghost",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"hub"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Th\xf4ng tin API endpoint"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"D\xf9ng c\xe1c URL dưới đ\xe2y cho LibreChat, VSCode, Copilot proxy, Antigravity hoặc tool OpenAI-compatible kh\xe1c."})]})]}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(c,{label:"Base URL",value:j.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:j.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:j.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:j.health,copiedKey:"health",copied:b,copy:v})]}),(0,a.jsxs)("p",{className:"mt-4 text-xs text-text-muted",children:["Machine ID: ",(0,a.jsx)("code",{className:"rounded bg-surface px-1.5 py-0.5",children:e||"unknown"})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"bolt"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Token Saver"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Giảm token cho output từ tool v\xe0 phản hồi model. Bật/tắt tại đ\xe2y kh\xf4ng cần load API keys hoặc provider status."})]})]}),(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"RTK tool output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"N\xe9n output của git/grep/ls/tree/logs trước khi gửi v\xe0o model."})]}),(0,a.jsx)(r.lM,{checked:!1!==h.rtkEnabled,onChange:e=>g({rtkEnabled:e},"rtkEnabled"),disabled:"rtkEnabled"===n})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Caveman output compression"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Th\xeam style prompt để model trả lời ngắn hơn, giảm output token."})]}),(0,a.jsx)(r.lM,{checked:!!h.cavemanEnabled,onChange:e=>g({cavemanEnabled:e},"cavemanEnabled"),disabled:"cavemanEnabled"===n})]}),h.cavemanEnabled&&(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:o.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>g({cavemanLevel:e.id},"cavemanLevel"),title:e.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${h.cavemanLevel===e.id?"border-primary bg-primary text-white":"border-border text-text-muted hover:border-primary hover:text-primary"}`,children:e.label},e.id))})]})]})]})]})}c.propTypes={label:i().string.isRequired,value:i().string.isRequired,copiedKey:i().string.isRequired,copied:i().string,copy:i().func.isRequired},m.propTypes={machineId:i().string}}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,8441,3794,7358],()=>e(e.s=18032)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3674],{17:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var s=r(95155),n=r(98500),i=r.n(n),a=r(14051),d=r.n(a),l=r(31474);function o({tabs:e,activeId:t,onChange:r,className:n=""}){return(0,s.jsx)("div",{className:(0,l.cn)("mb-5 overflow-x-auto border-b border-border",n),children:(0,s.jsx)("div",{className:"flex min-w-max items-center gap-1",children:e.map(e=>{let n=e.id===t,a=(0,l.cn)("inline-flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-semibold transition-colors",n?"border-primary text-primary":"border-transparent text-text-muted hover:border-border-strong hover:text-text-main"),d=(0,s.jsxs)(s.Fragment,{children:[e.icon?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:e.icon}):null,(0,s.jsx)("span",{children:e.label})]});return e.href?(0,s.jsx)(i(),{href:e.href,className:a,"aria-current":n?"page":void 0,children:d},e.id):(0,s.jsx)("button",{type:"button",onClick:()=>r?.(e.id),className:a,"aria-pressed":n,children:d},e.id)})})})}o.propTypes={tabs:d().arrayOf(d().shape({id:d().string.isRequired,label:d().string.isRequired,icon:d().string,href:d().string})).isRequired,activeId:d().string.isRequired,onChange:d().func,className:d().string}},15100:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>y});var s=r(95155),n=r(12115),i=r(25086),a=r(94027),d=r(17),l=r(17173),o=r(6945),c=r(35497),m=r(57250),x=r(31458);function u(e){return String(e||"").trim().toLowerCase()}function h(){let{isAdmin:e}=(0,a.s)(),[t,r]=(0,n.useState)([]),[i,d]=(0,n.useState)({}),[l,o]=(0,n.useState)({}),[h,p]=(0,n.useState)(""),[b,g]=(0,n.useState)({}),[v,f]=(0,n.useState)(""),[j,y]=(0,n.useState)({}),[N,k]=(0,n.useState)(3),[C,w]=(0,n.useState)("3"),[A,S]=(0,n.useState)(!0),[P,O]=(0,n.useState)(!1),[q,$]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[T,K]=(0,n.useState)(""),[U,z]=(0,n.useState)(""),[L,R]=(0,n.useState)(""),[_,F]=(0,n.useState)(null),[H,B]=(0,n.useState)(!1),[M,G]=(0,n.useState)(!1),[D,J]=(0,n.useState)(!1),Q=(0,n.useCallback)(e=>{d(e.permissions||{}),o(e.connectionsByUser||{}),"number"==typeof e.globalConnectionsPerProviderLimit&&e.globalConnectionsPerProviderLimit>0&&(k(e.globalConnectionsPerProviderLimit),w(String(e.globalConnectionsPerProviderLimit))),e.connectionsPerProviderLimitOverrides&&"object"==typeof e.connectionsPerProviderLimitOverrides&&y(e.connectionsPerProviderLimitOverrides)},[]),Z=(0,n.useCallback)(async()=>{if(e){S(!0),K("");try{let[e,t]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-providers/permissions",{cache:"no-store"})]),s=await e.json().catch(()=>({})),n=await t.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Kh\xf4ng tải được personal OAuth providers");if(!t.ok)throw Error(n.error||"Kh\xf4ng tải được quyền OAuth");r(Array.isArray(s.providers)?s.providers:[]),Q(n)}catch(e){K(e?.message||"Kh\xf4ng tải được cấu h\xecnh OAuth access")}finally{S(!1)}}},[Q,e]);(0,n.useEffect)(()=>{Z()},[Z]);let V=(0,n.useRef)(0),W=(0,n.useCallback)(async e=>{let t=e.trim();if(!t)return;let r=++V.current;B(!0);try{let e=await fetch(`/api/personal-cloud-providers/permissions?search=${encodeURIComponent(t)}`,{cache:"no-store"}),s=await e.json().catch(()=>({}));if(r!==V.current)return;if(!e.ok)throw Error(s.error||"Kh\xf4ng t\xecm được t\xe0i khoản");F(Array.isArray(s.accounts)?s.accounts:[]),G(!!s.accountsTruncated)}catch(e){if(r!==V.current)return;F([]),K(e?.message||"Kh\xf4ng t\xecm được t\xe0i khoản")}finally{r===V.current&&B(!1)}},[]);(0,n.useEffect)(()=>{if(!e)return;if(!L.trim()){F(null),G(!1),B(!1);return}let t=setTimeout(()=>W(L),300);return()=>clearTimeout(t)},[L,e,W]),(0,n.useEffect)(()=>{let e=u(h),r=i[e]||{},s={};for(let e of t)s[e.id]=!0===r[e.id];g(s);let n=j[e];f(n>0?String(n):"")},[h,i,t,j]);let X=(0,n.useMemo)(()=>Array.from(new Set([...Object.keys(i||{}),...Object.keys(l||{})])).map(e=>{let r=i[e]||{},s=l[e]||{},n=t.filter(e=>r?.[e.id]===!0),a=t.some(e=>Number(s[e.id]||0)>0);return{userId:e,providerState:r,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:a}}).filter(e=>e.enabledProviders.length>0||e.hasAnyConnection).sort((e,t)=>e.userId.localeCompare(t.userId)),[l,i,t]),Y=null!==_,ee=(0,n.useMemo)(()=>Y?_.map(e=>{let r=e.providerState||{},s=e.connectionsByProvider||{},n=t.filter(e=>r?.[e.id]===!0),i=t.some(e=>Number(s[e.id]||0)>0);return{userId:e.userId,displayName:e.displayName,email:e.email,providerState:r,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:i}}).sort((e,t)=>e.userId.localeCompare(t.userId)):X,[Y,_,X,t]),et=(0,n.useMemo)(()=>{let e=0,r=0,s=0,n=new Map(t.map(e=>[e.id,{grantedUsers:0,connections:0}]));for(let i of X){for(let r of t){let t=Number(i.connectionsByProvider?.[r.id]||0);e+=t;let s=n.get(r.id);i.providerState?.[r.id]===!0?(s.grantedUsers+=1,s.connections+=t):t>0&&(s.connections+=t)}i.enabledProviders.length>0&&!i.hasAnyConnection&&(r+=1),0===i.enabledProviders.length&&i.hasAnyConnection&&(s+=1)}return{totalUsers:X.length,totalConnections:e,grantedNoConnection:r,connectionNoGrant:s,perProvider:t.map(e=>({provider:e,...n.get(e.id)}))}},[X,t]),er=async()=>{let e,t=u(h);if(!t)return void K("Nhập username/email cần cấp quyền.");let r=String(v||"").trim();if(""===r)e=null;else{let t=Number.parseInt(r,10);if(!Number.isFinite(t)||t<=0)return void K("Per-user override phải l\xe0 số nguy\xean dương hoặc bỏ trống.");e=t}O(!0),K(""),z("");try{let r=await fetch("/api/personal-cloud-providers/permissions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:t,providers:b,connectionsPerProviderLimit:e})}),s=await r.json().catch(()=>({}));if(!r.ok)throw Error(s.error||"Kh\xf4ng lưu được quyền OAuth");Q(s);let n=s.user?.id||t;p(n),z(`Đ\xe3 lưu quyền OAuth cho ${n}.`),J(!1),L.trim()&&W(L)}catch(e){K(e?.message||"Kh\xf4ng lưu được quyền OAuth")}finally{O(!1)}},es=async()=>{let e=Number.parseInt(C,10);if(!Number.isFinite(e)||e<=0)return void K("Global limit phải l\xe0 số nguy\xean dương.");$(!0),K(""),z("");try{let t=await fetch("/api/personal-cloud-providers/permissions",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({globalConnectionsPerProviderLimit:e})}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Kh\xf4ng lưu được global limit");Q(r),z(`Đ\xe3 đặt global limit = ${e} account / provider / user.`)}catch(e){K(e?.message||"Kh\xf4ng lưu được global limit")}finally{$(!1)}},en=async e=>{let t=u(e);if(t){O(!0),K(""),z("");try{let e=await fetch(`/api/personal-cloud-providers/permissions?userId=${encodeURIComponent(t)}`,{method:"DELETE"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng thu hồi được quyền OAuth");Q(r),u(h)===t&&p("");let s=r.disconnectSummary||{},n=Number(s.manualActionRequired)||0;z(`Đ\xe3 x\xf3a ${s.deletedCount||0} OAuth connection của ${t}; ${s.upstreamRevokedCount||0} token đ\xe3 revoke upstream.${n>0?` ${n} connection cần thu hồi thủ c\xf4ng tại provider.`:""}`),E(""),L.trim()&&W(L)}catch(e){K(e?.message||"Kh\xf4ng thu hồi được quyền OAuth")}finally{O(!1)}}};if(!e)return null;let ei=X.find(e=>e.userId===u(I)),ea=t.reduce((e,t)=>e+Number(ei?.connectionsByProvider?.[t.id]||0),0);return(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main",children:"Admin: OAuth provider access"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Quản l\xfd provider n\xe0o user được ph\xe9p d\xf9ng, giới hạn số account OAuth c\xe1 nh\xe2n v\xe0 thu hồi to\xe0n bộ quyền/token khi cần. C\xe1c thao t\xe1c trong tab n\xe0y chỉ d\xe0nh cho admin."})]}),(0,s.jsx)(x.default,{}),T?(0,s.jsx)("div",{className:"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-700 dark:text-red-300",children:T}):null,U?(0,s.jsx)("div",{className:"rounded-xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm text-green-700 dark:text-green-300",children:U}):null,(0,s.jsxs)(c.Zp,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Access policy"}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Default l\xe0 kh\xf4ng c\xf3 quyền. Tắt provider giữ nguy\xean connection/token để c\xf3 thể bật lại; Revoke all sẽ thử revoke upstream rồi x\xf3a connection/token local."})]}),(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:Z,loading:A,icon:"refresh",children:"Refresh"})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Global limit — số account OAuth c\xe1 nh\xe2n / provider / user thường"}),(0,s.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"\xc1p dụng cho user kh\xf4ng c\xf3 per-user override. Admin kh\xf4ng bị chặn bởi limit n\xe0y."}),(0,s.jsxs)("div",{className:"mt-3 flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,s.jsx)(c.pd,{type:"number",min:1,value:C,onChange:e=>w(e.target.value),className:"sm:w-48"}),(0,s.jsx)(c.$n,{onClick:es,loading:q,disabled:q||Number.parseInt(C,10)===N,children:"Lưu global"}),(0,s.jsxs)("span",{className:"text-xs text-text-muted",children:["Đang lưu: ",N]})]})]}),(0,s.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Granted OAuth Access"}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:"T\xecm một t\xe0i khoản (username/email) để xem v\xe0 chỉnh quyền — kể cả t\xe0i khoản chưa được cấp quyền g\xec. Kh\xf4ng t\xecm kiếm th\xec hiển thị c\xe1c t\xe0i khoản đang c\xf3 quyền hoặc c\xf2n OAuth connection."})]}),A?(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Đang tải quyền..."}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"mb-4 grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Tổng user"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.totalUsers})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Tổng OAuth connection"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.totalConnections})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Cấp quyền, chưa connect"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.grantedNoConnection})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"C\xf2n connection, đ\xe3 thu hồi quyền"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.connectionNoGrant})]})]}),et.perProvider.some(e=>e.grantedUsers>0||e.connections>0)?(0,s.jsxs)("div",{className:"mb-4 rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium text-text-main",children:"Breakdown theo provider"}),(0,s.jsx)("div",{className:"mt-3 space-y-2",children:et.perProvider.map(({provider:e,grantedUsers:t,connections:r})=>(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 text-sm",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(m.A,{src:`/providers/${e.id}.png`,alt:e.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsx)("span",{className:"text-text-main",children:e.name})]}),(0,s.jsxs)("div",{className:"flex items-center gap-3 text-xs text-text-muted",children:[(0,s.jsxs)("span",{children:[t," user được cấp quyền"]}),(0,s.jsxs)("span",{children:[r," connection"]})]})]},e.id))})]}):null,(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)(c.pd,{label:"T\xecm t\xe0i khoản",value:L,onChange:e=>R(e.target.value),placeholder:"Nhập username hoặc email, vd: anh-tct hoặc anh-tct@fujinet.net",hint:H?"Đang t\xecm…":void 0})}),Y&&H&&0===ee.length?(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Đang t\xecm t\xe0i khoản..."}):Y&&0===ee.length?(0,s.jsxs)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:['Kh\xf4ng t\xecm thấy t\xe0i khoản n\xe0o khớp với "',L.trim(),'".']}):Y||0!==X.length?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,s.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,s.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"User"}),t.map(e=>(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:e.name},e.id)),(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"Limit / provider"}),(0,s.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,s.jsx)("tbody",{className:"divide-y divide-border bg-background",children:ee.map(e=>(0,s.jsxs)("tr",{className:"hover:bg-surface/50",children:[(0,s.jsxs)("td",{className:"px-4 py-4",children:[(0,s.jsx)("div",{className:"break-all font-mono text-text-main",children:e.userId}),e.displayName||e.email?(0,s.jsx)("div",{className:"mt-0.5 text-xs text-text-muted",children:[e.displayName,e.email].filter(Boolean).join(" \xb7 ")}):null]}),t.map(t=>{let r=!0===e.providerState[t.id],n=Number(e.connectionsByProvider?.[t.id]||0);return(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)(c.Ex,{variant:r?"success":"default",size:"sm",children:r?"ON":"OFF"}),n>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-0.5",title:`User đ\xe3 add ${n} ${t.name} account`,children:[(0,s.jsx)(m.A,{src:`/providers/${t.id}.png`,alt:t.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:t.id.slice(0,2).toUpperCase(),fallbackColor:t.color||"#64748b"}),n>1?(0,s.jsxs)("span",{className:"text-[10px] font-semibold text-text-muted",children:["\xd7",n]}):null]}):null]})},t.id)}),(0,s.jsx)("td",{className:"px-4 py-4 text-xs",children:j[e.userId]>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,s.jsx)(c.Ex,{variant:"warning",size:"sm",children:"Override"}),(0,s.jsx)("span",{className:"font-mono",children:j[e.userId]})]}):(0,s.jsxs)("span",{className:"text-text-muted",children:["Global \xb7 ",N]})}),(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:()=>(e=>{let r=u(e);p(r);let s=i[r]||{},n={};for(let e of t)n[e.id]=!0===s[e.id];g(n),K(""),z(""),J(!0)})(e.userId),children:"Edit"}),e.enabledProviders.length>0||e.hasAnyConnection?(0,s.jsx)(c.$n,{variant:"danger",size:"sm",loading:P&&I===e.userId,onClick:()=>E(e.userId),children:"Revoke all & delete"}):null]})})]},e.userId))})]})}),Y&&M?(0,s.jsxs)("p",{className:"mt-2 text-xs text-text-muted",children:["Chỉ hiển thị ",ee.length," kết quả đầu, thu hẹp từ kh\xf3a t\xecm kiếm để ch\xednh x\xe1c hơn."]}):null]}):(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Chưa c\xf3 user n\xe0o được cấp quyền OAuth provider. D\xf9ng \xf4 t\xecm kiếm ở tr\xean để cấp quyền cho một t\xe0i khoản."})]})]})]}),I?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>E(""),title:"Thu hồi to\xe0n bộ quyền OAuth",size:"lg",busy:P,closeOnOverlay:!P,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>E(""),disabled:P,children:"Hủy"}),(0,s.jsx)(c.$n,{variant:"danger",icon:"delete_forever",loading:P,onClick:()=>en(I),children:"Thu hồi v\xe0 x\xf3a to\xe0n bộ"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-red-500/30 bg-red-500/10 p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium text-red-700 dark:text-red-300",children:"H\xe0nh động nguy hiểm, kh\xf4ng thể ho\xe0n t\xe1c"}),(0,s.jsx)("div",{className:"mt-1 break-all text-lg font-semibold text-text-main",children:I}),(0,s.jsx)("p",{className:"mt-2 text-sm text-text-muted",children:"To\xe0n bộ quyền OAuth provider v\xe0 connection/token local của user n\xe0y sẽ bị x\xf3a; gateway sẽ thử revoke upstream trước."})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface p-3 text-sm",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Connection t\xecm thấy"}),(0,s.jsx)(c.Ex,{variant:ea>0?"warning":"default",size:"sm",children:ea})]}),ei?(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:t.map(e=>{let t=Number(ei.connectionsByProvider?.[e.id]||0);return t>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-2.5 py-1 text-xs text-text-muted",children:[(0,s.jsx)(m.A,{src:`/providers/${e.id}.png`,alt:e.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase()}),e.name," \xd7",t]},e.id):null})}):null]})}):null,D?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>J(!1),title:"Chỉnh quyền OAuth provider",size:"lg",busy:P,closeOnOverlay:!P,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>J(!1),disabled:P,children:"Hủy"}),(0,s.jsx)(c.$n,{onClick:er,loading:P,icon:"save",children:"Save permissions"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsx)(c.pd,{label:"User ID / Email",value:h,disabled:!0}),(0,s.jsx)("div",{className:"grid gap-3 sm:grid-cols-2",children:t.map(e=>(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:(0,s.jsx)(c.lM,{checked:!0===b[e.id],onChange:t=>g(r=>({...r,[e.id]:t})),label:e.name,description:b[e.id]?"User được ph\xe9p add account":"User chưa được cấp quyền"})},e.id))}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Per-user override — account / provider"}),(0,s.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Ghi đ\xe8 global cho ",(0,s.jsx)("span",{className:"font-mono",children:u(h)||"user đang chọn"}),". Để trống để d\xf9ng global (",N,")."]}),(0,s.jsx)("div",{className:"mt-3 max-w-xs",children:(0,s.jsx)(c.pd,{type:"number",min:1,value:v,onChange:e=>f(e.target.value),placeholder:`Để trống = d\xf9ng global (${N})`})})]})]})}):null]})}var p=r(43503),b=r(78867),g=r(67673),v=r(14796),f=r.n(v);function j(){let e=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>{let t=e.current;if(!t)return;let r=null,s=()=>{let e=Array.from(t.querySelectorAll("h2")).find(e=>e.textContent?.trim()==="Admin: OAuth provider access"),s=e?.closest(".bg-surface.border.border-border");s&&s!==r&&(r&&r.style.removeProperty("display"),(r=s).style.setProperty("display","none"))};s();let n=new MutationObserver(s);return n.observe(t,{childList:!0,subtree:!0}),()=>{n.disconnect(),r&&r.style.removeProperty("display")}},[]),(0,s.jsxs)("div",{ref:e,className:f().page,children:[(0,s.jsx)(p.default,{}),(0,s.jsx)(g.default,{}),(0,s.jsx)(b.default,{})]})}function y(){let{isAdmin:e}=(0,a.s)(),[t,r]=(0,n.useState)("oauth"),c=(0,n.useMemo)(()=>[{id:"oauth",label:"Personal OAuth",icon:"cloud_sync"},...e?[{id:"monitor",label:"OAuth Monitor",icon:"manage_accounts"}]:[],{id:"quota",label:"Personal Quota",icon:"data_usage"},...e?[{id:"admin-access",label:"Admin: OAuth Access",icon:"admin_panel_settings"}]:[]],[e]),m=c.some(e=>e.id===t)?t:"oauth";return(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)(d.A,{tabs:c,activeId:m,onChange:r}),"oauth"===m?(0,s.jsx)(j,{}):null,"monitor"===m&&e?(0,s.jsx)(l.default,{}):null,"quota"===m?(0,s.jsx)(n.Suspense,{fallback:(0,s.jsx)(i.CardSkeleton,{}),children:(0,s.jsx)(o.default,{})}):null,"admin-access"===m&&e?(0,s.jsx)(h,{}):null]})}},31458:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var s=r(95155),n=r(12115),i=r(35497),a=r(57250),d=r(94027);function l(){let{isAdmin:e}=(0,d.s)(),[t,r]=(0,n.useState)([]),[l,o]=(0,n.useState)(!1),[c,m]=(0,n.useState)(""),[x,u]=(0,n.useState)(""),[h,p]=(0,n.useState)(""),b=(0,n.useCallback)(async()=>{if(e){o(!0),u("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");r(Array.isArray(t.providers)?t.providers:[])}catch(e){u(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,n.useEffect)(()=>{b()},[b]),!e)return null;let g=async(e,t)=>{m(e.id),u(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:t})}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng cập nhật được visibility provider");r(Array.isArray(n.providers)?n.providers:[]),p(`${e.name}: ${t?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){u(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{m("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(i.$n,{size:"sm",variant:"outline",onClick:b,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,h?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:h}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:t.map(e=>{let t=!1!==e.visible,r=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(i.Ex,{variant:t?"success":"default",size:"sm",children:t?"Shown":"Hidden"})]})]}),(0,s.jsx)(i.$n,{size:"sm",variant:t?"outline":"secondary",disabled:r,loading:r,icon:t?"visibility_off":"visibility",onClick:()=>g(e,!t),children:t?"Hide":"Show"})]},e.id)})})]})}},96928:(e,t,r)=>{Promise.resolve().then(r.bind(r,15100))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,8723,5263,7033,5497,7413,912,6945,7173,8441,3794,7358],()=>e(e.s=96928)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3674],{17:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var s=r(95155),n=r(98500),i=r.n(n),a=r(14051),d=r.n(a),l=r(31474);function o({tabs:e,activeId:t,onChange:r,className:n=""}){return(0,s.jsx)("div",{className:(0,l.cn)("mb-5 overflow-x-auto border-b border-border",n),children:(0,s.jsx)("div",{className:"flex min-w-max items-center gap-1",children:e.map(e=>{let n=e.id===t,a=(0,l.cn)("inline-flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-semibold transition-colors",n?"border-primary text-primary":"border-transparent text-text-muted hover:border-border-strong hover:text-text-main"),d=(0,s.jsxs)(s.Fragment,{children:[e.icon?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:e.icon}):null,(0,s.jsx)("span",{children:e.label})]});return e.href?(0,s.jsx)(i(),{href:e.href,className:a,"aria-current":n?"page":void 0,children:d},e.id):(0,s.jsx)("button",{type:"button",onClick:()=>r?.(e.id),className:a,"aria-pressed":n,children:d},e.id)})})})}o.propTypes={tabs:d().arrayOf(d().shape({id:d().string.isRequired,label:d().string.isRequired,icon:d().string,href:d().string})).isRequired,activeId:d().string.isRequired,onChange:d().func,className:d().string}},15100:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>y});var s=r(95155),n=r(12115),i=r(25086),a=r(94027),d=r(17),l=r(17173),o=r(6945),c=r(35497),m=r(57250),x=r(31458);function u(e){return String(e||"").trim().toLowerCase()}function h(){let{isAdmin:e}=(0,a.s)(),[t,r]=(0,n.useState)([]),[i,d]=(0,n.useState)({}),[l,o]=(0,n.useState)({}),[h,p]=(0,n.useState)(""),[b,g]=(0,n.useState)({}),[v,f]=(0,n.useState)(""),[j,y]=(0,n.useState)({}),[N,k]=(0,n.useState)(3),[C,w]=(0,n.useState)("3"),[A,S]=(0,n.useState)(!0),[P,O]=(0,n.useState)(!1),[q,$]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[T,K]=(0,n.useState)(""),[U,z]=(0,n.useState)(""),[L,R]=(0,n.useState)(""),[_,F]=(0,n.useState)(null),[H,B]=(0,n.useState)(!1),[M,G]=(0,n.useState)(!1),[D,J]=(0,n.useState)(!1),Q=(0,n.useCallback)(e=>{d(e.permissions||{}),o(e.connectionsByUser||{}),"number"==typeof e.globalConnectionsPerProviderLimit&&e.globalConnectionsPerProviderLimit>0&&(k(e.globalConnectionsPerProviderLimit),w(String(e.globalConnectionsPerProviderLimit))),e.connectionsPerProviderLimitOverrides&&"object"==typeof e.connectionsPerProviderLimitOverrides&&y(e.connectionsPerProviderLimitOverrides)},[]),Z=(0,n.useCallback)(async()=>{if(e){S(!0),K("");try{let[e,t]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-providers/permissions",{cache:"no-store"})]),s=await e.json().catch(()=>({})),n=await t.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Kh\xf4ng tải được personal OAuth providers");if(!t.ok)throw Error(n.error||"Kh\xf4ng tải được quyền OAuth");r(Array.isArray(s.providers)?s.providers:[]),Q(n)}catch(e){K(e?.message||"Kh\xf4ng tải được cấu h\xecnh OAuth access")}finally{S(!1)}}},[Q,e]);(0,n.useEffect)(()=>{Z()},[Z]);let V=(0,n.useRef)(0),W=(0,n.useCallback)(async e=>{let t=e.trim();if(!t)return;let r=++V.current;B(!0);try{let e=await fetch(`/api/personal-cloud-providers/permissions?search=${encodeURIComponent(t)}`,{cache:"no-store"}),s=await e.json().catch(()=>({}));if(r!==V.current)return;if(!e.ok)throw Error(s.error||"Kh\xf4ng t\xecm được t\xe0i khoản");F(Array.isArray(s.accounts)?s.accounts:[]),G(!!s.accountsTruncated)}catch(e){if(r!==V.current)return;F([]),K(e?.message||"Kh\xf4ng t\xecm được t\xe0i khoản")}finally{r===V.current&&B(!1)}},[]);(0,n.useEffect)(()=>{if(!e)return;if(!L.trim()){F(null),G(!1),B(!1);return}let t=setTimeout(()=>W(L),300);return()=>clearTimeout(t)},[L,e,W]),(0,n.useEffect)(()=>{let e=u(h),r=i[e]||{},s={};for(let e of t)s[e.id]=!0===r[e.id];g(s);let n=j[e];f(n>0?String(n):"")},[h,i,t,j]);let X=(0,n.useMemo)(()=>Array.from(new Set([...Object.keys(i||{}),...Object.keys(l||{})])).map(e=>{let r=i[e]||{},s=l[e]||{},n=t.filter(e=>r?.[e.id]===!0),a=t.some(e=>Number(s[e.id]||0)>0);return{userId:e,providerState:r,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:a}}).filter(e=>e.enabledProviders.length>0||e.hasAnyConnection).sort((e,t)=>e.userId.localeCompare(t.userId)),[l,i,t]),Y=null!==_,ee=(0,n.useMemo)(()=>Y?_.map(e=>{let r=e.providerState||{},s=e.connectionsByProvider||{},n=t.filter(e=>r?.[e.id]===!0),i=t.some(e=>Number(s[e.id]||0)>0);return{userId:e.userId,displayName:e.displayName,email:e.email,providerState:r,connectionsByProvider:s,enabledProviders:n,hasAnyConnection:i}}).sort((e,t)=>e.userId.localeCompare(t.userId)):X,[Y,_,X,t]),et=(0,n.useMemo)(()=>{let e=0,r=0,s=0,n=new Map(t.map(e=>[e.id,{grantedUsers:0,connections:0}]));for(let i of X){for(let r of t){let t=Number(i.connectionsByProvider?.[r.id]||0);e+=t;let s=n.get(r.id);i.providerState?.[r.id]===!0?(s.grantedUsers+=1,s.connections+=t):t>0&&(s.connections+=t)}i.enabledProviders.length>0&&!i.hasAnyConnection&&(r+=1),0===i.enabledProviders.length&&i.hasAnyConnection&&(s+=1)}return{totalUsers:X.length,totalConnections:e,grantedNoConnection:r,connectionNoGrant:s,perProvider:t.map(e=>({provider:e,...n.get(e.id)}))}},[X,t]),er=async()=>{let e,t=u(h);if(!t)return void K("Nhập username/email cần cấp quyền.");let r=String(v||"").trim();if(""===r)e=null;else{let t=Number.parseInt(r,10);if(!Number.isFinite(t)||t<=0)return void K("Per-user override phải l\xe0 số nguy\xean dương hoặc bỏ trống.");e=t}O(!0),K(""),z("");try{let r=await fetch("/api/personal-cloud-providers/permissions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:t,providers:b,connectionsPerProviderLimit:e})}),s=await r.json().catch(()=>({}));if(!r.ok)throw Error(s.error||"Kh\xf4ng lưu được quyền OAuth");Q(s);let n=s.user?.id||t;p(n),z(`Đ\xe3 lưu quyền OAuth cho ${n}.`),J(!1),L.trim()&&W(L)}catch(e){K(e?.message||"Kh\xf4ng lưu được quyền OAuth")}finally{O(!1)}},es=async()=>{let e=Number.parseInt(C,10);if(!Number.isFinite(e)||e<=0)return void K("Global limit phải l\xe0 số nguy\xean dương.");$(!0),K(""),z("");try{let t=await fetch("/api/personal-cloud-providers/permissions",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({globalConnectionsPerProviderLimit:e})}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Kh\xf4ng lưu được global limit");Q(r),z(`Đ\xe3 đặt global limit = ${e} account / provider / user.`)}catch(e){K(e?.message||"Kh\xf4ng lưu được global limit")}finally{$(!1)}},en=async e=>{let t=u(e);if(t){O(!0),K(""),z("");try{let e=await fetch(`/api/personal-cloud-providers/permissions?userId=${encodeURIComponent(t)}`,{method:"DELETE"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng thu hồi được quyền OAuth");Q(r),u(h)===t&&p("");let s=r.disconnectSummary||{},n=Number(s.manualActionRequired)||0;z(`Đ\xe3 x\xf3a ${s.deletedCount||0} OAuth connection của ${t}; ${s.upstreamRevokedCount||0} token đ\xe3 revoke upstream.${n>0?` ${n} connection cần thu hồi thủ c\xf4ng tại provider.`:""}`),E(""),L.trim()&&W(L)}catch(e){K(e?.message||"Kh\xf4ng thu hồi được quyền OAuth")}finally{O(!1)}}};if(!e)return null;let ei=X.find(e=>e.userId===u(I)),ea=t.reduce((e,t)=>e+Number(ei?.connectionsByProvider?.[t.id]||0),0);return(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main",children:"Admin: OAuth provider access"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Quản l\xfd provider n\xe0o user được ph\xe9p d\xf9ng, giới hạn số account OAuth c\xe1 nh\xe2n v\xe0 thu hồi to\xe0n bộ quyền/token khi cần. C\xe1c thao t\xe1c trong tab n\xe0y chỉ d\xe0nh cho admin."})]}),(0,s.jsx)(x.default,{}),T?(0,s.jsx)("div",{className:"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-700 dark:text-red-300",children:T}):null,U?(0,s.jsx)("div",{className:"rounded-xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm text-green-700 dark:text-green-300",children:U}):null,(0,s.jsxs)(c.Zp,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Access policy"}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Default l\xe0 kh\xf4ng c\xf3 quyền. Tắt provider giữ nguy\xean connection/token để c\xf3 thể bật lại; Revoke all sẽ thử revoke upstream rồi x\xf3a connection/token local."})]}),(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:Z,loading:A,icon:"refresh",children:"Refresh"})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Global limit — số account OAuth c\xe1 nh\xe2n / provider / user thường"}),(0,s.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"\xc1p dụng cho user kh\xf4ng c\xf3 per-user override. Admin kh\xf4ng bị chặn bởi limit n\xe0y."}),(0,s.jsxs)("div",{className:"mt-3 flex flex-col gap-2 sm:flex-row sm:items-end",children:[(0,s.jsx)(c.pd,{type:"number",min:1,value:C,onChange:e=>w(e.target.value),className:"sm:w-48"}),(0,s.jsx)(c.$n,{onClick:es,loading:q,disabled:q||Number.parseInt(C,10)===N,children:"Lưu global"}),(0,s.jsxs)("span",{className:"text-xs text-text-muted",children:["Đang lưu: ",N]})]})]}),(0,s.jsxs)("div",{className:"border-t border-border pt-4",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:"Granted OAuth Access"}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:"T\xecm một t\xe0i khoản (username/email) để xem v\xe0 chỉnh quyền — kể cả t\xe0i khoản chưa được cấp quyền g\xec. Kh\xf4ng t\xecm kiếm th\xec hiển thị c\xe1c t\xe0i khoản đang c\xf3 quyền hoặc c\xf2n OAuth connection."})]}),A?(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Đang tải quyền..."}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"mb-4 grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Tổng user"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.totalUsers})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Tổng OAuth connection"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.totalConnections})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"Cấp quyền, chưa connect"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.grantedNoConnection})]}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-xs font-semibold uppercase text-text-muted",children:"C\xf2n connection, đ\xe3 thu hồi quyền"}),(0,s.jsx)("div",{className:"mt-1 text-2xl font-bold text-text-main",children:et.connectionNoGrant})]})]}),et.perProvider.some(e=>e.grantedUsers>0||e.connections>0)?(0,s.jsxs)("div",{className:"mb-4 rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium text-text-main",children:"Breakdown theo provider"}),(0,s.jsx)("div",{className:"mt-3 space-y-2",children:et.perProvider.map(({provider:e,grantedUsers:t,connections:r})=>(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 text-sm",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(m.A,{src:`/providers/${e.id}.png`,alt:e.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsx)("span",{className:"text-text-main",children:e.name})]}),(0,s.jsxs)("div",{className:"flex items-center gap-3 text-xs text-text-muted",children:[(0,s.jsxs)("span",{children:[t," user được cấp quyền"]}),(0,s.jsxs)("span",{children:[r," connection"]})]})]},e.id))})]}):null,(0,s.jsx)("div",{className:"mb-4",children:(0,s.jsx)(c.pd,{label:"T\xecm t\xe0i khoản",value:L,onChange:e=>R(e.target.value),placeholder:"Nhập username hoặc email, vd: anh-tct hoặc anh-tct@fujinet.net",hint:H?"Đang t\xecm…":void 0})}),Y&&H&&0===ee.length?(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Đang t\xecm t\xe0i khoản..."}):Y&&0===ee.length?(0,s.jsxs)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:['Kh\xf4ng t\xecm thấy t\xe0i khoản n\xe0o khớp với "',L.trim(),'".']}):Y||0!==X.length?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"overflow-x-auto rounded-2xl border border-border",children:(0,s.jsxs)("table",{className:"min-w-full divide-y divide-border text-sm",children:[(0,s.jsx)("thead",{className:"bg-surface/80 text-left text-xs uppercase tracking-wide text-text-muted",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"User"}),t.map(e=>(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:e.name},e.id)),(0,s.jsx)("th",{className:"px-4 py-3 font-medium",children:"Limit / provider"}),(0,s.jsx)("th",{className:"px-4 py-3 text-right font-medium",children:"Actions"})]})}),(0,s.jsx)("tbody",{className:"divide-y divide-border bg-background",children:ee.map(e=>(0,s.jsxs)("tr",{className:"hover:bg-surface/50",children:[(0,s.jsxs)("td",{className:"px-4 py-4",children:[(0,s.jsx)("div",{className:"break-all font-mono text-text-main",children:e.userId}),e.displayName||e.email?(0,s.jsx)("div",{className:"mt-0.5 text-xs text-text-muted",children:[e.displayName,e.email].filter(Boolean).join(" \xb7 ")}):null]}),t.map(t=>{let r=!0===e.providerState[t.id],n=Number(e.connectionsByProvider?.[t.id]||0);return(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)(c.Ex,{variant:r?"success":"default",size:"sm",children:r?"ON":"OFF"}),n>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-0.5",title:`User đ\xe3 add ${n} ${t.name} account`,children:[(0,s.jsx)(m.A,{src:`/providers/${t.id}.png`,alt:t.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:t.id.slice(0,2).toUpperCase(),fallbackColor:t.color||"#64748b"}),n>1?(0,s.jsxs)("span",{className:"text-[10px] font-semibold text-text-muted",children:["\xd7",n]}):null]}):null]})},t.id)}),(0,s.jsx)("td",{className:"px-4 py-4 text-xs",children:j[e.userId]>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,s.jsx)(c.Ex,{variant:"warning",size:"sm",children:"Override"}),(0,s.jsx)("span",{className:"font-mono",children:j[e.userId]})]}):(0,s.jsxs)("span",{className:"text-text-muted",children:["Global \xb7 ",N]})}),(0,s.jsx)("td",{className:"px-4 py-4",children:(0,s.jsxs)("div",{className:"flex flex-wrap justify-end gap-2",children:[(0,s.jsx)(c.$n,{variant:"outline",size:"sm",onClick:()=>(e=>{let r=u(e);p(r);let s=i[r]||{},n={};for(let e of t)n[e.id]=!0===s[e.id];g(n),K(""),z(""),J(!0)})(e.userId),children:"Edit"}),e.enabledProviders.length>0||e.hasAnyConnection?(0,s.jsx)(c.$n,{variant:"danger",size:"sm",loading:P&&I===e.userId,onClick:()=>E(e.userId),children:"Revoke all & delete"}):null]})})]},e.userId))})]})}),Y&&M?(0,s.jsxs)("p",{className:"mt-2 text-xs text-text-muted",children:["Chỉ hiển thị ",ee.length," kết quả đầu, thu hẹp từ kh\xf3a t\xecm kiếm để ch\xednh x\xe1c hơn."]}):null]}):(0,s.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Chưa c\xf3 user n\xe0o được cấp quyền OAuth provider. D\xf9ng \xf4 t\xecm kiếm ở tr\xean để cấp quyền cho một t\xe0i khoản."})]})]})]}),I?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>E(""),title:"Thu hồi to\xe0n bộ quyền OAuth",size:"lg",busy:P,closeOnOverlay:!P,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>E(""),disabled:P,children:"Hủy"}),(0,s.jsx)(c.$n,{variant:"danger",icon:"delete_forever",loading:P,onClick:()=>en(I),children:"Thu hồi v\xe0 x\xf3a to\xe0n bộ"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"rounded-2xl border border-red-500/30 bg-red-500/10 p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium text-red-700 dark:text-red-300",children:"H\xe0nh động nguy hiểm, kh\xf4ng thể ho\xe0n t\xe1c"}),(0,s.jsx)("div",{className:"mt-1 break-all text-lg font-semibold text-text-main",children:I}),(0,s.jsx)("p",{className:"mt-2 text-sm text-text-muted",children:"To\xe0n bộ quyền OAuth provider v\xe0 connection/token local của user n\xe0y sẽ bị x\xf3a; gateway sẽ thử revoke upstream trước."})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between rounded-xl border border-border bg-surface p-3 text-sm",children:[(0,s.jsx)("span",{className:"text-text-muted",children:"Connection t\xecm thấy"}),(0,s.jsx)(c.Ex,{variant:ea>0?"warning":"default",size:"sm",children:ea})]}),ei?(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:t.map(e=>{let t=Number(ei.connectionsByProvider?.[e.id]||0);return t>0?(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-2.5 py-1 text-xs text-text-muted",children:[(0,s.jsx)(m.A,{src:`/providers/${e.id}.png`,alt:e.name,size:16,className:"max-h-[16px] max-w-[16px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase()}),e.name," \xd7",t]},e.id):null})}):null]})}):null,D?(0,s.jsx)(c.aF,{isOpen:!0,onClose:()=>J(!1),title:"Chỉnh quyền OAuth provider",size:"lg",busy:P,closeOnOverlay:!P,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.$n,{variant:"ghost",onClick:()=>J(!1),disabled:P,children:"Hủy"}),(0,s.jsx)(c.$n,{onClick:er,loading:P,icon:"save",children:"Save permissions"})]}),children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsx)(c.pd,{label:"User ID / Email",value:h,disabled:!0}),(0,s.jsx)("div",{className:"grid gap-3 sm:grid-cols-2",children:t.map(e=>(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:(0,s.jsx)(c.lM,{checked:!0===b[e.id],onChange:t=>g(r=>({...r,[e.id]:t})),label:e.name,description:b[e.id]?"User được ph\xe9p add account":"User chưa được cấp quyền"})},e.id))}),(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4",children:[(0,s.jsx)("div",{className:"text-sm font-medium",children:"Per-user override — account / provider"}),(0,s.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Ghi đ\xe8 global cho ",(0,s.jsx)("span",{className:"font-mono",children:u(h)||"user đang chọn"}),". Để trống để d\xf9ng global (",N,")."]}),(0,s.jsx)("div",{className:"mt-3 max-w-xs",children:(0,s.jsx)(c.pd,{type:"number",min:1,value:v,onChange:e=>f(e.target.value),placeholder:`Để trống = d\xf9ng global (${N})`})})]})]})}):null]})}var p=r(43503),b=r(78867),g=r(67673),v=r(14796),f=r.n(v);function j(){let e=(0,n.useRef)(null);return(0,n.useLayoutEffect)(()=>{let t=e.current;if(!t)return;let r=null,s=()=>{let e=Array.from(t.querySelectorAll("h2")).find(e=>e.textContent?.trim()==="Admin: OAuth provider access"),s=e?.closest(".bg-surface.border.border-border");s&&s!==r&&(r&&r.style.removeProperty("display"),(r=s).style.setProperty("display","none"))};s();let n=new MutationObserver(s);return n.observe(t,{childList:!0,subtree:!0}),()=>{n.disconnect(),r&&r.style.removeProperty("display")}},[]),(0,s.jsxs)("div",{ref:e,className:f().page,children:[(0,s.jsx)(p.default,{}),(0,s.jsx)(g.default,{}),(0,s.jsx)(b.default,{})]})}function y(){let{isAdmin:e}=(0,a.s)(),[t,r]=(0,n.useState)("oauth"),c=(0,n.useMemo)(()=>[{id:"oauth",label:"Personal OAuth",icon:"cloud_sync"},...e?[{id:"monitor",label:"OAuth Monitor",icon:"manage_accounts"}]:[],{id:"quota",label:"Personal Quota",icon:"data_usage"},...e?[{id:"admin-access",label:"Admin: OAuth Access",icon:"admin_panel_settings"}]:[]],[e]),m=c.some(e=>e.id===t)?t:"oauth";return(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)(d.A,{tabs:c,activeId:m,onChange:r}),"oauth"===m?(0,s.jsx)(j,{}):null,"monitor"===m&&e?(0,s.jsx)(l.default,{}):null,"quota"===m?(0,s.jsx)(n.Suspense,{fallback:(0,s.jsx)(i.CardSkeleton,{}),children:(0,s.jsx)(o.default,{})}):null,"admin-access"===m&&e?(0,s.jsx)(h,{}):null]})}},31458:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var s=r(95155),n=r(12115),i=r(35497),a=r(57250),d=r(94027);function l(){let{isAdmin:e}=(0,d.s)(),[t,r]=(0,n.useState)([]),[l,o]=(0,n.useState)(!1),[c,m]=(0,n.useState)(""),[x,u]=(0,n.useState)(""),[h,p]=(0,n.useState)(""),b=(0,n.useCallback)(async()=>{if(e){o(!0),u("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");r(Array.isArray(t.providers)?t.providers:[])}catch(e){u(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,n.useEffect)(()=>{b()},[b]),!e)return null;let g=async(e,t)=>{m(e.id),u(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:t})}),n=await s.json().catch(()=>({}));if(!s.ok)throw Error(n.error||"Kh\xf4ng cập nhật được visibility provider");r(Array.isArray(n.providers)?n.providers:[]),p(`${e.name}: ${t?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){u(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{m("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(i.$n,{size:"sm",variant:"outline",onClick:b,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,h?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:h}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:t.map(e=>{let t=!1!==e.visible,r=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(i.Ex,{variant:t?"success":"default",size:"sm",children:t?"Shown":"Hidden"})]})]}),(0,s.jsx)(i.$n,{size:"sm",variant:t?"outline":"secondary",disabled:r,loading:r,icon:t?"visibility_off":"visibility",onClick:()=>g(e,!t),children:t?"Hide":"Show"})]},e.id)})})]})}},96928:(e,t,r)=>{Promise.resolve().then(r.bind(r,15100))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,7413,912,6945,7173,8441,3794,7358],()=>e(e.s=96928)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9645],{31458:(e,r,i)=>{"use strict";i.d(r,{default:()=>l});var s=i(95155),t=i(12115),n=i(35497),a=i(57250),d=i(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,i]=(0,t.useState)([]),[l,o]=(0,t.useState)(!1),[c,h]=(0,t.useState)(""),[x,m]=(0,t.useState)(""),[u,p]=(0,t.useState)(""),v=(0,t.useCallback)(async()=>{if(e){o(!0),m("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");i(Array.isArray(r.providers)?r.providers:[])}catch(e){m(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,t.useEffect)(()=>{v()},[v]),!e)return null;let g=async(e,r)=>{h(e.id),m(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Kh\xf4ng cập nhật được visibility provider");i(Array.isArray(t.providers)?t.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){m(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{h("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(n.$n,{size:"sm",variant:"outline",onClick:v,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,u?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:u}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,i=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(n.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(n.$n,{size:"sm",variant:r?"outline":"secondary",disabled:i,loading:i,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},76333:(e,r,i)=>{Promise.resolve().then(i.bind(i,31458))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9645],{31458:(e,r,i)=>{"use strict";i.d(r,{default:()=>l});var s=i(95155),t=i(12115),n=i(35497),a=i(57250),d=i(94027);function l(){let{isAdmin:e}=(0,d.s)(),[r,i]=(0,t.useState)([]),[l,o]=(0,t.useState)(!1),[c,h]=(0,t.useState)(""),[x,m]=(0,t.useState)(""),[u,p]=(0,t.useState)(""),v=(0,t.useCallback)(async()=>{if(e){o(!0),m("");try{let e=await fetch("/api/personal-cloud-providers/visibility",{cache:"no-store"}),r=await e.json().catch(()=>({}));if(!e.ok)throw Error(r.error||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider");i(Array.isArray(r.providers)?r.providers:[])}catch(e){m(e?.message||"Kh\xf4ng tải được trạng th\xe1i Show/Hide provider")}finally{o(!1)}}},[e]);if((0,t.useEffect)(()=>{v()},[v]),!e)return null;let g=async(e,r)=>{h(e.id),m(""),p("");try{let s=await fetch("/api/personal-cloud-providers/visibility",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,visible:r})}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Kh\xf4ng cập nhật được visibility provider");i(Array.isArray(t.providers)?t.providers:[]),p(`${e.name}: ${r?"đ\xe3 Show cho user":"đ\xe3 Hide khỏi user"}.`)}catch(e){m(e?.message||"Kh\xf4ng cập nhật được visibility provider")}finally{h("")}};return(0,s.jsxs)("div",{className:"rounded-2xl border border-border bg-surface/50 p-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-text-main",children:"Admin: Show / Hide Personal Cloud Providers"}),(0,s.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chỉ điều khiển provider c\xf3 xuất hiện tr\xean giao diện của user hay kh\xf4ng. Kh\xf4ng đổi quyền OAuth, kh\xf4ng deactivate connection, kh\xf4ng x\xf3a token, kh\xf4ng đổi API key/routing v\xe0 kh\xf4ng ảnh hưởng sử dụng thực tế."})]}),(0,s.jsx)(n.$n,{size:"sm",variant:"outline",onClick:v,loading:l,icon:"refresh",children:"Refresh"})]}),x?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-red-500/30 bg-red-500/10 px-3 py-2 text-xs text-red-700 dark:text-red-300",children:x}):null,u?(0,s.jsx)("div",{className:"mt-3 rounded-xl border border-green-500/30 bg-green-500/10 px-3 py-2 text-xs text-green-700 dark:text-green-300",children:u}):null,(0,s.jsx)("div",{className:"mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4",children:r.map(e=>{let r=!1!==e.visible,i=c===e.id;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-3",children:[(0,s.jsxs)("div",{className:"flex min-w-0 items-center gap-3",children:[(0,s.jsx)(a.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"max-h-[30px] max-w-[30px] rounded object-contain",fallbackText:e.id.slice(0,2).toUpperCase(),fallbackColor:e.color||"#64748b"}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("div",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,s.jsx)(n.Ex,{variant:r?"success":"default",size:"sm",children:r?"Shown":"Hidden"})]})]}),(0,s.jsx)(n.$n,{size:"sm",variant:r?"outline":"secondary",disabled:i,loading:i,icon:r?"visibility_off":"visibility",onClick:()=>g(e,!r),children:r?"Hide":"Show"})]},e.id)})})]})}},76333:(e,r,i)=>{Promise.resolve().then(i.bind(i,31458))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,8441,3794,7358],()=>e(e.s=76333)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3538],{2823:(e,s,n)=>{Promise.resolve().then(n.bind(n,67673)),Promise.resolve().then(n.t.bind(n,14796,23)),Promise.resolve().then(n.bind(n,43503)),Promise.resolve().then(n.bind(n,78867))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3538],{2823:(e,s,n)=>{Promise.resolve().then(n.bind(n,67673)),Promise.resolve().then(n.t.bind(n,14796,23)),Promise.resolve().then(n.bind(n,43503)),Promise.resolve().then(n.bind(n,78867))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,912,8441,3794,7358],()=>e(e.s=2823)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3864],{74064:(e,s,_)=>{Promise.resolve().then(_.bind(_,17173))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3864],{74064:(e,s,_)=>{Promise.resolve().then(_.bind(_,17173))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,7173,8441,3794,7358],()=>e(e.s=74064)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9730],{14051:(e,r,t)=>{e.exports=t(34701)()},25086:(e,r,t)=>{"use strict";t.d(r,{CardSkeleton:()=>c,PageLoading:()=>i,Skeleton:()=>o,Spinner:()=>a,default:()=>l});var n=t(95155),s=t(31474);function a({size:e="md",className:r}){return(0,n.jsx)("span",{className:(0,s.cn)("material-symbols-outlined animate-spin text-brand-500",{sm:"size-4",md:"size-6",lg:"size-8",xl:"size-12"}[e],r),children:"progress_activity"})}function i({message:e="Loading..."}){return(0,n.jsxs)("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center bg-bg",children:[(0,n.jsx)(a,{size:"xl"}),(0,n.jsx)("p",{className:"mt-4 text-text-muted",children:e})]})}function o({className:e,...r}){return(0,n.jsx)("div",{className:(0,s.cn)("animate-pulse rounded-[10px] bg-surface-2",e),...r})}function c(){return(0,n.jsxs)("div",{className:"p-6 rounded-[14px] border border-border-subtle bg-surface shadow-[var(--shadow-soft)]",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,n.jsx)(o,{className:"h-4 w-24"}),(0,n.jsx)(o,{className:"size-10 rounded-[10px]"})]}),(0,n.jsx)(o,{className:"h-8 w-16 mb-2"}),(0,n.jsx)(o,{className:"h-3 w-20"})]})}function l({type:e="spinner",...r}){switch(e){case"page":return(0,n.jsx)(i,{...r});case"skeleton":return(0,n.jsx)(o,{...r});case"card":return(0,n.jsx)(c,{...r});default:return(0,n.jsx)(a,{...r})}}},31474:(e,r,t)=>{"use strict";function n(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}t.d(r,{cn:()=>n})},34701:(e,r,t)=>{"use strict";var n=t(82114);function s(){}function a(){}a.resetWarningCache=s,e.exports=function(){function e(e,r,t,s,a,i){if(i!==n){var o=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw o.name="Invariant Violation",o}}function r(){return e}e.isRequired=e;var t={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:r,element:e,elementType:e,instanceOf:r,node:e,objectOf:r,oneOf:r,oneOfType:r,shape:r,exact:r,checkPropTypes:a,resetWarningCache:s};return t.PropTypes=t,t}},54642:e=>{var r;"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="//"),(r={}).endianness=function(){return"LE"},r.hostname=function(){return"u">typeof location?location.hostname:""},r.loadavg=function(){return[]},r.uptime=function(){return 0},r.freemem=function(){return Number.MAX_VALUE},r.totalmem=function(){return Number.MAX_VALUE},r.cpus=function(){return[]},r.type=function(){return"Browser"},r.release=function(){return"u">typeof navigator?navigator.appVersion:""},r.networkInterfaces=r.getNetworkInterfaces=function(){return{}},r.arch=function(){return"javascript"},r.platform=function(){return"browser"},r.tmpdir=r.tmpDir=function(){return"/tmp"},r.EOL="\n",r.homedir=function(){return"/"},e.exports=r},57250:(e,r,t)=>{"use strict";t.d(r,{A:()=>o});var n=t(95155),s=t(12115),a=t(14051),i=t.n(a);function o({src:e,alt:r,size:t=32,className:a="",fallbackText:i="?",fallbackColor:c}){let[l,u]=(0,s.useState)(!1);return!e||l?(0,n.jsx)("span",{className:`inline-flex items-center justify-center font-bold rounded-lg ${a}`.trim(),style:{width:t,height:t,color:c,fontSize:Math.max(10,Math.floor(.38*t))},children:i}):(0,n.jsx)("img",{src:e,alt:r,width:t,height:t,className:a,onError:()=>u(!0)})}o.propTypes={src:i().string,alt:i().string,size:i().number,className:i().string,fallbackText:i().string,fallbackColor:i().string}},66225:(e,r,t)=>{Promise.resolve().then(t.bind(t,6945)),Promise.resolve().then(t.bind(t,25086))},82114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},84588:(e,r,t)=>{"use strict";t.d(r,{default:()=>a});var n=t(95155),s=t(31474);function a({children:e,title:r,subtitle:t,icon:i,action:o,padding:c="md",hover:l=!1,elev:u=!1,className:d,...m}){return(0,n.jsxs)("div",{className:(0,s.cn)("bg-surface border border-border",u?"rounded-[14px] shadow-[var(--shadow-elev)]":"rounded-[14px] shadow-[0_1px_2px_rgba(15,23,42,0.045),0_12px_28px_-26px_rgba(37,99,235,0.38)]",l&&"hover:shadow-[var(--shadow-warm)] hover:border-brand-500/40 transition-all cursor-pointer",{none:"",xs:"p-3",sm:"p-4",md:"p-5",lg:"p-6"}[c],d),...m,children:[(r||o)&&(0,n.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,n.jsxs)("div",{className:"flex items-center gap-3",children:[i&&(0,n.jsx)("div",{className:"p-2 rounded-[10px] bg-bg-alt border border-border-subtle text-text-muted",children:(0,n.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:i})}),(0,n.jsxs)("div",{children:[r&&(0,n.jsx)("h3",{className:"text-text-main font-semibold",children:r}),t&&(0,n.jsx)("p",{className:"text-sm text-text-muted",children:t})]})]}),o]}),e]})}a.Section=function({children:e,className:r,...t}){return(0,n.jsx)("div",{className:(0,s.cn)("p-4 rounded-[10px]","bg-bg-alt border border-border",r),...t,children:e})},a.Row=function({children:e,className:r,...t}){return(0,n.jsx)("div",{className:(0,s.cn)("p-3 -mx-3 px-3 transition-colors","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50",r),...t,children:e})},a.ListItem=function({children:e,actions:r,className:t,...a}){return(0,n.jsxs)("div",{className:(0,s.cn)("group flex items-center justify-between p-3 -mx-3 px-3","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50 transition-colors",t),...a,children:[(0,n.jsx)("div",{className:"flex-1 min-w-0",children:e}),r&&(0,n.jsx)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:r})]})}},98542:(e,r,t)=>{"use strict";t.d(r,{default:()=>a});var n=t(95155),s=t(31474);function a({checked:e=!1,onChange:r,label:t,description:i,disabled:o=!1,size:c="md",className:l}){let u={sm:{track:"w-8 h-4",thumb:"size-3",translate:"translate-x-4"},md:{track:"w-11 h-6",thumb:"size-5",translate:"translate-x-5"},lg:{track:"w-14 h-7",thumb:"size-6",translate:"translate-x-7"}};return(0,n.jsxs)("div",{className:(0,s.cn)("flex items-center gap-3",o&&"opacity-50 cursor-not-allowed",l),children:[(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":e,disabled:o,onClick:()=>{!o&&r&&r(!e)},className:(0,s.cn)("relative inline-flex shrink-0 cursor-pointer rounded-full","transition-colors duration-200 ease-in-out","focus:outline-none focus:ring-2 focus:ring-brand-500/30",e?"bg-brand-500":"bg-surface-3",u[c].track,o&&"cursor-not-allowed"),children:(0,n.jsx)("span",{className:(0,s.cn)("pointer-events-none inline-block rounded-full bg-white shadow-sm","transform transition duration-200 ease-in-out",e?u[c].translate:"translate-x-0.5",u[c].thumb,"mt-0.5")})}),(t||i)&&(0,n.jsxs)("div",{className:"flex flex-col",children:[t&&(0,n.jsx)("span",{className:"text-sm font-medium text-text-main",children:t}),i&&(0,n.jsx)("span",{className:"text-xs text-text-muted",children:i})]})]})}}},e=>{e.O(0,[
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9730],{14051:(e,r,t)=>{e.exports=t(34701)()},25086:(e,r,t)=>{"use strict";t.d(r,{CardSkeleton:()=>c,PageLoading:()=>i,Skeleton:()=>o,Spinner:()=>a,default:()=>l});var n=t(95155),s=t(31474);function a({size:e="md",className:r}){return(0,n.jsx)("span",{className:(0,s.cn)("material-symbols-outlined animate-spin text-brand-500",{sm:"size-4",md:"size-6",lg:"size-8",xl:"size-12"}[e],r),children:"progress_activity"})}function i({message:e="Loading..."}){return(0,n.jsxs)("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center bg-bg",children:[(0,n.jsx)(a,{size:"xl"}),(0,n.jsx)("p",{className:"mt-4 text-text-muted",children:e})]})}function o({className:e,...r}){return(0,n.jsx)("div",{className:(0,s.cn)("animate-pulse rounded-[10px] bg-surface-2",e),...r})}function c(){return(0,n.jsxs)("div",{className:"p-6 rounded-[14px] border border-border-subtle bg-surface shadow-[var(--shadow-soft)]",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,n.jsx)(o,{className:"h-4 w-24"}),(0,n.jsx)(o,{className:"size-10 rounded-[10px]"})]}),(0,n.jsx)(o,{className:"h-8 w-16 mb-2"}),(0,n.jsx)(o,{className:"h-3 w-20"})]})}function l({type:e="spinner",...r}){switch(e){case"page":return(0,n.jsx)(i,{...r});case"skeleton":return(0,n.jsx)(o,{...r});case"card":return(0,n.jsx)(c,{...r});default:return(0,n.jsx)(a,{...r})}}},31474:(e,r,t)=>{"use strict";function n(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}t.d(r,{cn:()=>n})},34701:(e,r,t)=>{"use strict";var n=t(82114);function s(){}function a(){}a.resetWarningCache=s,e.exports=function(){function e(e,r,t,s,a,i){if(i!==n){var o=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw o.name="Invariant Violation",o}}function r(){return e}e.isRequired=e;var t={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:r,element:e,elementType:e,instanceOf:r,node:e,objectOf:r,oneOf:r,oneOfType:r,shape:r,exact:r,checkPropTypes:a,resetWarningCache:s};return t.PropTypes=t,t}},54642:e=>{var r;"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="//"),(r={}).endianness=function(){return"LE"},r.hostname=function(){return"u">typeof location?location.hostname:""},r.loadavg=function(){return[]},r.uptime=function(){return 0},r.freemem=function(){return Number.MAX_VALUE},r.totalmem=function(){return Number.MAX_VALUE},r.cpus=function(){return[]},r.type=function(){return"Browser"},r.release=function(){return"u">typeof navigator?navigator.appVersion:""},r.networkInterfaces=r.getNetworkInterfaces=function(){return{}},r.arch=function(){return"javascript"},r.platform=function(){return"browser"},r.tmpdir=r.tmpDir=function(){return"/tmp"},r.EOL="\n",r.homedir=function(){return"/"},e.exports=r},57250:(e,r,t)=>{"use strict";t.d(r,{A:()=>o});var n=t(95155),s=t(12115),a=t(14051),i=t.n(a);function o({src:e,alt:r,size:t=32,className:a="",fallbackText:i="?",fallbackColor:c}){let[l,u]=(0,s.useState)(!1);return!e||l?(0,n.jsx)("span",{className:`inline-flex items-center justify-center font-bold rounded-lg ${a}`.trim(),style:{width:t,height:t,color:c,fontSize:Math.max(10,Math.floor(.38*t))},children:i}):(0,n.jsx)("img",{src:e,alt:r,width:t,height:t,className:a,onError:()=>u(!0)})}o.propTypes={src:i().string,alt:i().string,size:i().number,className:i().string,fallbackText:i().string,fallbackColor:i().string}},66225:(e,r,t)=>{Promise.resolve().then(t.bind(t,6945)),Promise.resolve().then(t.bind(t,25086))},82114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},84588:(e,r,t)=>{"use strict";t.d(r,{default:()=>a});var n=t(95155),s=t(31474);function a({children:e,title:r,subtitle:t,icon:i,action:o,padding:c="md",hover:l=!1,elev:u=!1,className:d,...m}){return(0,n.jsxs)("div",{className:(0,s.cn)("bg-surface border border-border",u?"rounded-[14px] shadow-[var(--shadow-elev)]":"rounded-[14px] shadow-[0_1px_2px_rgba(15,23,42,0.045),0_12px_28px_-26px_rgba(37,99,235,0.38)]",l&&"hover:shadow-[var(--shadow-warm)] hover:border-brand-500/40 transition-all cursor-pointer",{none:"",xs:"p-3",sm:"p-4",md:"p-5",lg:"p-6"}[c],d),...m,children:[(r||o)&&(0,n.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,n.jsxs)("div",{className:"flex items-center gap-3",children:[i&&(0,n.jsx)("div",{className:"p-2 rounded-[10px] bg-bg-alt border border-border-subtle text-text-muted",children:(0,n.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:i})}),(0,n.jsxs)("div",{children:[r&&(0,n.jsx)("h3",{className:"text-text-main font-semibold",children:r}),t&&(0,n.jsx)("p",{className:"text-sm text-text-muted",children:t})]})]}),o]}),e]})}a.Section=function({children:e,className:r,...t}){return(0,n.jsx)("div",{className:(0,s.cn)("p-4 rounded-[10px]","bg-bg-alt border border-border",r),...t,children:e})},a.Row=function({children:e,className:r,...t}){return(0,n.jsx)("div",{className:(0,s.cn)("p-3 -mx-3 px-3 transition-colors","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50",r),...t,children:e})},a.ListItem=function({children:e,actions:r,className:t,...a}){return(0,n.jsxs)("div",{className:(0,s.cn)("group flex items-center justify-between p-3 -mx-3 px-3","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50 transition-colors",t),...a,children:[(0,n.jsx)("div",{className:"flex-1 min-w-0",children:e}),r&&(0,n.jsx)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:r})]})}},98542:(e,r,t)=>{"use strict";t.d(r,{default:()=>a});var n=t(95155),s=t(31474);function a({checked:e=!1,onChange:r,label:t,description:i,disabled:o=!1,size:c="md",className:l}){let u={sm:{track:"w-8 h-4",thumb:"size-3",translate:"translate-x-4"},md:{track:"w-11 h-6",thumb:"size-5",translate:"translate-x-5"},lg:{track:"w-14 h-7",thumb:"size-6",translate:"translate-x-7"}};return(0,n.jsxs)("div",{className:(0,s.cn)("flex items-center gap-3",o&&"opacity-50 cursor-not-allowed",l),children:[(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":e,disabled:o,onClick:()=>{!o&&r&&r(!e)},className:(0,s.cn)("relative inline-flex shrink-0 cursor-pointer rounded-full","transition-colors duration-200 ease-in-out","focus:outline-none focus:ring-2 focus:ring-brand-500/30",e?"bg-brand-500":"bg-surface-3",u[c].track,o&&"cursor-not-allowed"),children:(0,n.jsx)("span",{className:(0,s.cn)("pointer-events-none inline-block rounded-full bg-white shadow-sm","transform transition duration-200 ease-in-out",e?u[c].translate:"translate-x-0.5",u[c].thumb,"mt-0.5")})}),(t||i)&&(0,n.jsxs)("div",{className:"flex flex-col",children:[t&&(0,n.jsx)("span",{className:"text-sm font-medium text-text-main",children:t}),i&&(0,n.jsx)("span",{className:"text-xs text-text-muted",children:i})]})]})}}},e=>{e.O(0,[2218,7413,6945,8441,3794,7358],()=>e(e.s=66225)),_N_E=e.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-43da6f2dc8e6127f.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{6191:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>j});var a=s(95155),r=s(12115),n=s(44656),i=s(35497);let o={enabled:!1,fileLoggingEnabled:!1,type:"mysql",host:"",port:"",database:"",username:"",password:"",ssl:!1,createDatabase:!1,logClientRequest:!0,logSourceRequest:!0,logTargetRequest:!0,logProviderResponse:!1,logErrors:!0,retentionDays:30,payloadRotationEnabled:!1,payloadRetentionDays:60,payloadRotationScheduleTime:"21:00",payloadRotationMaxRuntimeMinutes:60,payloadRotationIntervalHours:24,payloadRotationBatchSize:500,payloadRotationMaxBatches:20,usageEventsRotationEnabled:!1,usageEventsRetentionDays:365,usageEventsRotationScheduleTime:"02:00",usageEventsRotationMaxRuntimeMinutes:60,usageEventsRotationBatchSize:2e3,usageEventsRotationMaxBatches:50},l=[{value:60,label:"1 hour"},{value:120,label:"2 hours"},{value:180,label:"3 hours"},{value:240,label:"4 hours"},{value:360,label:"6 hours"},{value:480,label:"8 hours"},{value:720,label:"12 hours"},{value:0,label:"Until finished"}];function d({label:e,value:t,onChange:s,type:r="text",placeholder:n="",disabled:i=!1,min:o,max:l,step:c}){return(0,a.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,a.jsx)("span",{className:"text-text-muted",children:e}),(0,a.jsx)("input",{type:r,value:t||"",placeholder:n,disabled:i,min:o,max:l,step:c,onChange:e=>s(e.target.value),className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50"})]})}function c({label:e,checked:t,onChange:s,disabled:r=!1}){return(0,a.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main",children:[(0,a.jsx)("input",{type:"checkbox",checked:!!t,disabled:r,onChange:e=>s(e.target.checked)}),e]})}function p(){let[e,t]=(0,r.useState)(o),[s,n]=(0,r.useState)(!1),[p,u]=(0,r.useState)(null),[m,x]=(0,r.useState)(null),[h,b]=(0,r.useState)(null),[g,v]=(0,r.useState)(null),y=e=>t(t=>({...t,...e})),f=async()=>{n(!0),x(null);try{let e=await fetch("/api/settings/prompt-log-db"),s=await e.json();if(!e.ok)throw Error(s.error||"Failed to load config");t({...o,...s.config||{}})}catch(e){x(e.message||"Failed to load config")}finally{n(!1)}};(0,r.useEffect)(()=>{f()},[]);let j=async()=>{n(!0),x(null),u(null);try{let s=await fetch("/api/settings/prompt-log-db",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:e})}),a=await s.json();if(!s.ok)throw Error(a.error||"Failed to save config");t({...o,...a.config||{}}),u("Saved")}catch(e){x(e.message||"Failed to save config")}finally{n(!1)}},w=async(t,s={})=>{if(!s.confirm||window.confirm(s.confirmMessage||"Delete all prompt_logs rows and their payloads older than the retention cutoff? Both the rows in prompt_logs (previews, model/provider/token metadata) and the referenced payloads will be removed. This cannot be undone.")){n(!0),x(null),u(null),t.includes("payload-rotation")&&b(null),t.includes("usage-events-rotation")&&v(null);try{let a=await fetch("/api/settings/prompt-log-db",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:t,config:e,confirm:!0===s.confirm})}),r=await a.text(),n={};try{n=r?JSON.parse(r):{}}catch{let e=r.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,200),t=504===a.status?"Manual rotation exceeded the request timeout. Use automatic rotation for long-running cleanup.":`HTTP ${a.status}: ${e||a.statusText||"non-JSON response"}`;throw Error(t)}if(!a.ok)throw Error(n.error||`HTTP ${a.status}`);t.includes("payload-rotation")&&b(n),t.includes("usage-events-rotation")&&v(n),u(n.message||n.init?.message||"OK")}catch(e){x(e.message||"Action failed")}finally{n(!1)}}},C="postgres"===e.type||"mysql"===e.type;return(0,a.jsx)(i.Zp,{title:"Request Logging",subtitle:"Choose which request stages are logged, and where the prompt log database lives",icon:"receipt_long",children:(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)("div",{className:"flex flex-wrap items-center gap-2",children:(0,a.jsxs)(i.Ex,{variant:e.enabled?"success":"default",children:["Prompt logging: ",e.enabled?"Enabled":"Disabled"]})}),(0,a.jsx)("div",{className:"rounded-lg border border-yellow-500/30 bg-yellow-500/10 p-3 text-xs text-yellow-700 dark:text-yellow-300",children:'Prompt logs may contain source code, selected code, internal URLs, user prompts, and provider responses. Checked stages store the full raw request/response body; prompt/response text columns keep only short previews. Per-combo "hide content" still redacts the body.'}),(0,a.jsx)("div",{className:"grid gap-3 md:grid-cols-2",children:(0,a.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Database type"}),(0,a.jsxs)("select",{value:e.type,disabled:s,onChange:t=>{let s=t.target.value;y({type:s,port:"postgres"===s?e.port||"5432":"mysql"===s?e.port||"3306":e.port})},className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50",children:[(0,a.jsx)("option",{value:"mysql",children:"MySQL / MariaDB"}),(0,a.jsx)("option",{value:"postgres",children:"PostgreSQL"})]})]})}),C&&(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(d,{label:"Host",value:e.host,placeholder:"127.0.0.1",onChange:e=>y({host:e}),disabled:s}),(0,a.jsx)(d,{label:"Port",value:e.port,placeholder:"postgres"===e.type?"5432":"3306",onChange:e=>y({port:e}),disabled:s}),(0,a.jsx)(d,{label:"Database",value:e.database,placeholder:"bluerouter_logs",onChange:e=>y({database:e}),disabled:s}),(0,a.jsx)(d,{label:"Username",value:e.username,placeholder:"bluerouter",onChange:e=>y({username:e}),disabled:s}),(0,a.jsx)(d,{label:"Password",type:"password",value:e.password,placeholder:"Leave as ******** to keep existing password",onChange:e=>y({password:e}),disabled:s}),(0,a.jsxs)("div",{className:"flex flex-col justify-end gap-2",children:[(0,a.jsx)(c,{label:"Use SSL",checked:e.ssl,onChange:e=>y({ssl:e}),disabled:s}),(0,a.jsx)(c,{label:"Create database if missing",checked:e.createDatabase,onChange:e=>y({createDatabase:e}),disabled:s})]})]}),(0,a.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-surface/40 p-3 md:grid-cols-2",children:[(0,a.jsx)(c,{label:"Enable prompt logging",checked:e.enabled,onChange:e=>y({enabled:e}),disabled:s}),(0,a.jsx)(c,{label:"Log client request",checked:e.logClientRequest,onChange:e=>y({logClientRequest:e}),disabled:s}),(0,a.jsx)(c,{label:"Log normalized/source request",checked:e.logSourceRequest,onChange:e=>y({logSourceRequest:e}),disabled:s}),(0,a.jsx)(c,{label:"Log target/provider request",checked:e.logTargetRequest,onChange:e=>y({logTargetRequest:e}),disabled:s}),(0,a.jsx)(c,{label:"Log provider response",checked:e.logProviderResponse,onChange:e=>y({logProviderResponse:e}),disabled:s}),(0,a.jsx)(c,{label:"Log errors",checked:e.logErrors,onChange:e=>y({logErrors:e}),disabled:s})]}),(0,a.jsxs)("div",{className:"rounded-lg border border-border bg-background p-3 text-xs text-text-muted",children:["Full request/response bodies are stored as gzip files under ",(0,a.jsx)("code",{children:"DATA_DIR/prompt-log-payloads/"}),", addressed by content hash; the database keeps only that hash, the size and the short previews. The client, source and target stages of one call share a single file, so enabling more stages costs little extra disk."]}),(0,a.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-surface/40 p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Prompt log rotation"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Deletes ",(0,a.jsx)("code",{children:"prompt_logs"})," rows AND their referenced payloads older than the retention cutoff. After a full run, only logs from the last N days remain — analytics/metadata for older rows are removed as well."]})]}),(0,a.jsx)(c,{label:"Enable automatic rotation",checked:e.payloadRotationEnabled,onChange:e=>y({payloadRotationEnabled:e}),disabled:s}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsx)(d,{label:"Keep logs for (days)",type:"number",min:1,max:3650,step:1,value:String(e.payloadRetentionDays||60),onChange:e=>y({payloadRetentionDays:Number(e)||60}),disabled:s}),(0,a.jsx)(d,{label:"Daily start time (Vietnam, UTC+7)",type:"time",step:60,value:String(e.payloadRotationScheduleTime||"21:00"),onChange:e=>y({payloadRotationScheduleTime:e||"21:00"}),disabled:s}),(0,a.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Maximum automatic run time"}),(0,a.jsx)("select",{value:String(Number(e.payloadRotationMaxRuntimeMinutes??60)),disabled:s,onChange:e=>y({payloadRotationMaxRuntimeMinutes:Number(e.target.value)}),className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50",children:l.map(e=>(0,a.jsx)("option",{value:String(e.value),children:e.label},e.value))})]}),(0,a.jsx)(d,{label:"Prompt-log rows per transaction",type:"number",min:50,max:5e3,step:50,value:String(e.payloadRotationBatchSize||500),onChange:e=>y({payloadRotationBatchSize:Number(e)||500}),disabled:s})]}),(0,a.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["Automatic rotation runs once per day at the selected Vietnam time. It deletes expired ",(0,a.jsx)("code",{children:"prompt_logs"})," in small transactions and checks the run-time budget between cleanup passes. If the budget is reached, remaining rows continue at the next daily run. Choose ",(0,a.jsx)("strong",{children:"Until finished"})," to keep running until no expired rows remain. On MySQL, orphan ",(0,a.jsx)("code",{children:"prompt_log_payloads"})," rows (and their payload files on disk) are reaped as part of the cleanup."]}),(0,a.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:["Deletion is permanent: previews, model/provider/token metadata, and analytics for older rows go away too. The full request/response bodies live as gzip files on disk (not in ",(0,a.jsx)("code",{children:"payload_json"}),"), so reaping them frees disk space immediately. The ",(0,a.jsx)("code",{children:"prompt_logs"}),"/",(0,a.jsx)("code",{children:"prompt_log_payloads"})," tables themselves still keep their allocated space inside InnoDB — ",(0,a.jsx)("code",{children:"OPTIMIZE TABLE"})," is needed to shrink the .ibd files (only during a maintenance window, with enough free disk)."]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",onClick:()=>w("preview-payload-rotation"),loading:s,children:"Preview expired logs"}),(0,a.jsx)(i.$n,{size:"sm",variant:"danger",onClick:()=>w("run-payload-rotation",{confirm:!0}),loading:s,children:"Delete expired logs now"})]}),h&&(0,a.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-background p-3 text-xs md:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Cutoff:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:h.cutoff?new Date(h.cutoff).toLocaleString():"-"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:void 0===h.promptLogRowsUpdated?"Prompt-log rows past retention:":"Prompt-log rows deleted:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:Number(h.promptLogRowsUpdated??h.promptLogRows??0).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:void 0===h.payloadRowsDeleted?"Payload rows to delete:":"Payload rows deleted:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:Number(h.payloadRowsDeleted??h.payloadRowsPastRetention??0).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:void 0===h.payloadBytesDeleted?"Estimated payload size:":"Payload size deleted:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:function(e){let t=Number(e||0);if(!Number.isFinite(t)||t<=0)return"0 B";let s=["B","KB","MB","GB","TB"],a=Math.min(s.length-1,Math.floor(Math.log(t)/Math.log(1024))),r=t/1024**a;return`${r.toFixed(r>=10||0===a?1:2)} ${s[a]}`}(h.payloadBytesDeleted??h.payloadBytesPastRetention??h.referencedPayloadBytes)})]}),h.hasMore?(0,a.jsx)("div",{className:"md:col-span-2 lg:col-span-4 text-amber-600",children:"More expired rows remain. Automatic rotation will continue them at the next scheduled run."}):null]}),(0,a.jsx)("div",{className:"text-[11px] text-text-muted",children:"Save to apply the automatic schedule immediately. Preview uses the values currently shown. Manual deletion is a bounded maintenance pass; use automatic rotation for multi-hour cleanup."})]}),(0,a.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-surface/40 p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Usage events rotation"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Deletes ",(0,a.jsx)("code",{children:"usage_events"})," rows older than the retention cutoff. This is the only store behind ",(0,a.jsx)("code",{children:"/dashboard/usage"}),' (charts, request log, Details tab) and the Token Saver analytics — nothing is aggregated elsewhere, so deleted rows disappear from those pages too, and "all-time" totals shrink to match what remains.']})]}),(0,a.jsx)(c,{label:"Enable automatic rotation",checked:e.usageEventsRotationEnabled,onChange:e=>y({usageEventsRotationEnabled:e}),disabled:s}),(0,a.jsxs)("div",{className:"grid gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsx)(d,{label:"Keep usage events for (days)",type:"number",min:1,max:3650,step:1,value:String(e.usageEventsRetentionDays||365),onChange:e=>y({usageEventsRetentionDays:Number(e)||365}),disabled:s}),(0,a.jsx)(d,{label:"Daily start time (Vietnam, UTC+7)",type:"time",step:60,value:String(e.usageEventsRotationScheduleTime||"02:00"),onChange:e=>y({usageEventsRotationScheduleTime:e||"02:00"}),disabled:s}),(0,a.jsxs)("label",{className:"flex flex-col gap-1 text-xs",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Maximum automatic run time"}),(0,a.jsx)("select",{value:String(Number(e.usageEventsRotationMaxRuntimeMinutes??60)),disabled:s,onChange:e=>y({usageEventsRotationMaxRuntimeMinutes:Number(e.target.value)}),className:"w-full rounded border border-border bg-surface px-2 py-1.5 text-xs text-text-main focus:outline-none focus:ring-1 focus:ring-primary/50 disabled:opacity-50",children:l.map(e=>(0,a.jsx)("option",{value:String(e.value),children:e.label},e.value))})]}),(0,a.jsx)(d,{label:"Usage-event rows per batch",type:"number",min:100,max:2e4,step:100,value:String(e.usageEventsRotationBatchSize||2e3),onChange:e=>y({usageEventsRotationBatchSize:Number(e)||2e3}),disabled:s})]}),(0,a.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["Automatic rotation runs once per day at the selected Vietnam time, deleting expired ",(0,a.jsx)("code",{children:"usage_events"})," in batches and checking the run-time budget between passes. Choose ",(0,a.jsx)("strong",{children:"Until finished"})," to keep running until no expired rows remain."]}),(0,a.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-300",children:["Deletion is permanent and disabled by default. Unlike prompt-log payloads, ",(0,a.jsx)("code",{children:"usage_events"})," rows are not mirrored to disk anywhere — deleting them is the only way this data existed, so ",(0,a.jsx)("code",{children:"/dashboard/usage"})," and Token Saver analytics for those dates go away for good."]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",onClick:()=>w("preview-usage-events-rotation"),loading:s,children:"Preview expired usage events"}),(0,a.jsx)(i.$n,{size:"sm",variant:"danger",onClick:()=>w("run-usage-events-rotation",{confirm:!0,confirmMessage:"Delete all usage_events rows older than the retention cutoff? This removes their history from /dashboard/usage and Token Saver analytics permanently, with no copy kept anywhere. This cannot be undone."}),loading:s,children:"Delete expired usage events now"})]}),g&&(0,a.jsxs)("div",{className:"grid gap-2 rounded-lg border border-border bg-background p-3 text-xs md:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Cutoff:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:g.cutoff?new Date(g.cutoff).toLocaleString():"-"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:void 0===g.usageEventRowsDeleted?"Usage-event rows past retention:":"Usage-event rows deleted:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:Number(g.usageEventRowsDeleted??g.usageEventRowsPastRetention??0).toLocaleString()})]}),g.hasMore?(0,a.jsx)("div",{className:"md:col-span-2 lg:col-span-4 text-amber-600",children:"More expired rows remain. Automatic rotation will continue them at the next scheduled run."}):null]}),(0,a.jsx)("div",{className:"text-[11px] text-text-muted",children:"Save to apply the automatic schedule immediately. Preview uses the values currently shown."})]}),C&&(0,a.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:["Prompt logs now support MySQL/MariaDB and PostgreSQL only. MySQL/MariaDB requires ",(0,a.jsx)("code",{children:"mysql2"}),"; PostgreSQL requires ",(0,a.jsx)("code",{children:"pg"}),"."]}),p&&(0,a.jsx)("div",{className:"rounded-lg border border-green-500/30 bg-green-500/10 p-2 text-xs text-green-600",children:p}),m&&(0,a.jsx)("div",{className:"rounded-lg border border-red-500/30 bg-red-500/10 p-2 text-xs text-red-500",children:m}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",onClick:f,loading:s,children:"Reload"}),(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",onClick:()=>w("test"),loading:s,children:"Test connection"}),(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",onClick:()=>w("init"),loading:s,children:"Initialize schema"}),(0,a.jsx)(i.$n,{size:"sm",onClick:j,loading:s,children:"Save"}),(0,a.jsx)(i.$n,{size:"sm",variant:"success",onClick:()=>w("save-and-init"),loading:s,children:"Save & initialize"})]})]})})}let u="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",m="image/svg+xml,image/png,image/webp,image/jpeg,image/gif",x=`${m},image/x-icon,image/vnd.microsoft.icon,.ico`;function h({status:e}){if(!e?.message)return null;let t="error"===e.type?"text-red-600 bg-red-50 border-red-200":"text-green-700 bg-green-50 border-green-200";return(0,a.jsx)("div",{className:`mt-3 rounded-xl border px-4 py-3 text-sm ${t}`,children:e.message})}function b({icon:e,title:t,desc:s,children:r}){return(0,a.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,a.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-bold text-text-main",children:t}),s&&(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:s})]})]}),r]})}function g({label:e,hint:t,children:s}){return(0,a.jsxs)("label",{className:"block",children:[(0,a.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),s,t&&(0,a.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:t})]})}function v(e){return(0,a.jsx)("input",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function y(e){return(0,a.jsx)("textarea",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function f({title:e,desc:t,checked:s,onChange:r,disabled:n}){return(0,a.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),t&&(0,a.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:t})]}),(0,a.jsx)("button",{type:"button",disabled:n,onClick:()=>r(!s),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${s?"bg-primary":"bg-border"}`,children:(0,a.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${s?"left-5":"left-0.5"}`})})]})}function j(){let[e,t]=(0,r.useState)({}),[s,i]=(0,r.useState)(!0),[o,l]=(0,r.useState)({current:"",new:"",confirm:""}),[d,c]=(0,r.useState)({type:"",message:""}),[j,w]=(0,r.useState)(!1),[C,N]=(0,r.useState)(!1),[k,D]=(0,r.useState)({type:"",message:""}),[S,A]=(0,r.useState)(""),[L,U]=(0,r.useState)(""),R=(0,r.useRef)(null),[E,O]=(0,r.useState)("admin"),[P,M]=(0,r.useState)({type:"",message:""}),[I,B]=(0,r.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:u,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapAiGatewaysMonitorsGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[F,T]=(0,r.useState)({type:"",message:""}),[V,G]=(0,r.useState)(!1),[q,_]=(0,r.useState)(!1),[$,z]=(0,r.useState)(""),[J,Q]=(0,r.useState)([]),[K,H]=(0,r.useState)(!1),[W,X]=(0,r.useState)({authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC"}),[Z,Y]=(0,r.useState)(""),[ee,et]=(0,r.useState)({type:"",message:""}),[es,ea]=(0,r.useState)(!1),[er,en]=(0,r.useState)(!1),[ei,eo]=(0,r.useState)({type:"",message:""}),[el,ed]=(0,r.useState)({claudeCodeVersionOverride:"",codexClientVersionOverride:"",qwenCodeVersionOverride:"",openCodeVersionOverride:""}),[ec,ep]=(0,r.useState)({type:"",message:""}),[eu,em]=(0,r.useState)(!1),ex=(0,n.useBranding)(),[eh,eb]=(0,r.useState)(""),[eg,ev]=(0,r.useState)(""),[ey,ef]=(0,r.useState)(""),[ej,ew]=(0,r.useState)({type:"",message:""}),[eC,eN]=(0,r.useState)(!1),[ek,eD]=(0,r.useState)(!1),[eS,eA]=(0,r.useState)(!1),[eL,eU]=(0,r.useState)(!1),eR=(0,r.useRef)(null),eE=(0,r.useRef)(null),eO=async()=>{i(!0);try{let e=await fetch("/api/settings",{cache:"no-store"}),s=await e.json();t(s),O(s.localLoginUsername||"admin"),B({ldapEnabled:!0===s.ldapEnabled,ldapUrl:s.ldapUrl||"",ldapBindDn:s.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:s.ldapUserBaseDn||s.ldapBaseDn||"",ldapUserSearchFilter:s.ldapUserSearchFilter||u,ldapUserNameAttribute:s.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:s.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:s.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:s.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:s.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:s.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:s.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==s.ldapNestedGroups,ldapAllowedUsers:Array.isArray(s.ldapAllowedUsers)?s.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==s.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:s.ldapConnectTimeoutMs||8e3}),X({authMode:s.authMode||"password",oidcIssuerUrl:s.oidcIssuerUrl||"",oidcClientId:s.oidcClientId||"",oidcScopes:s.oidcScopes||"openid profile email",oidcLoginLabel:s.oidcLoginLabel||"Sign in with OIDC"}),eb(s.siteTitle||""),ev(s.siteShortName||""),ef(s.siteDescription||""),ed({claudeCodeVersionOverride:s.claudeCodeVersionOverride||"",codexClientVersionOverride:s.codexClientVersionOverride||"",qwenCodeVersionOverride:s.qwenCodeVersionOverride||"",openCodeVersionOverride:s.openCodeVersionOverride||""}),("oidc"===s.authMode||"both"===s.authMode)&&en(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{i(!1)}};(0,r.useEffect)(()=>{eO()},[]);let eP=async e=>{let s=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),a=await s.json().catch(()=>({}));if(!s.ok)throw Error(a.error||"Failed to save settings");return t(e=>({...e,...a})),a},eM=async e=>{e?.preventDefault?.(),em(!0),ep({type:"",message:""});try{let e=await eP({claudeCodeVersionOverride:el.claudeCodeVersionOverride.trim(),codexClientVersionOverride:el.codexClientVersionOverride.trim(),qwenCodeVersionOverride:el.qwenCodeVersionOverride.trim(),openCodeVersionOverride:el.openCodeVersionOverride.trim()});ed({claudeCodeVersionOverride:e.claudeCodeVersionOverride||"",codexClientVersionOverride:e.codexClientVersionOverride||"",qwenCodeVersionOverride:e.qwenCodeVersionOverride||"",openCodeVersionOverride:e.openCodeVersionOverride||""}),ep({type:"success",message:"Client compatibility versions saved and applied immediately. No restart is required."})}catch(e){ep({type:"error",message:e.message||"Failed to save client compatibility versions."})}finally{em(!1)}},eI=async s=>{eo({type:"",message:""});let a=!1!==e.sidebarAdvancedToolsVisible;t(e=>({...e,sidebarAdvancedToolsVisible:s}));try{let e=await eP({sidebarAdvancedToolsVisible:s}),a=!1!==e.sidebarAdvancedToolsVisible;t(e=>({...e,sidebarAdvancedToolsVisible:a})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:a}})),eo({type:"success",message:a?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){t(e=>({...e,sidebarAdvancedToolsVisible:a})),window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:a}})),eo({type:"error",message:e.message||"Failed to save sidebar setting."})}},eB=async e=>{e.preventDefault(),M({type:"",message:""});try{let e=await eP({localLoginUsername:E});O(e.localLoginUsername||E||"admin"),M({type:"success",message:"Local account name saved."})}catch(e){M({type:"error",message:e.message})}},eF=async e=>{if(e.preventDefault(),o.new!==o.confirm)return void c({type:"error",message:"Passwords do not match"});w(!0),c({type:"",message:""});try{await eP({currentPassword:o.current,newPassword:o.new}),c({type:"success",message:"Password updated successfully"}),l({current:"",new:"",confirm:""})}catch(e){c({type:"error",message:e.message||"Failed to update password"})}finally{w(!1)}},eT=async()=>{N(!0),D({type:"",message:""});try{if(S&&S!==L)throw Error("Backup password confirmation does not match.");if(S&&new TextEncoder().encode(S).length<8)throw Error("Backup password must be at least 8 characters.");let e=await fetch("/api/settings/database/export",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:S})});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"Failed to export full-node backup")}let t=await e.json(),s=t?.backup?.encrypted===!0,a=JSON.stringify(t,null,2*!s),r=new Blob([a],{type:"application/json"}),n=URL.createObjectURL(r),i=document.createElement("a"),o=new Date().toISOString().replace(/[.:]/g,"-");i.href=n,i.download=s?`bluerouter-full-backup-${o}.brbackup.json`:`bluerouter-full-backup-${o}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(n),D({type:"success",message:s?"Encrypted full-node backup downloaded.":"Plaintext full-node backup downloaded."})}catch(e){D({type:"error",message:e.message||"Failed to export full-node backup."})}finally{N(!1)}},eV=async e=>{let t=e.target.files?.[0];if(t){N(!0),D({type:"",message:""});try{let e=await t.text(),s=JSON.parse(e),a=s?.backup?.encrypted===!0;if(a&&!S)throw Error("Enter the backup password before importing this encrypted backup.");let r=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({payload:s,password:a?S:""})}),n=await r.json().catch(()=>({}));if(!r.ok)throw Error(n.error||"Failed to import backup");await eO();let i=n.resourceMonitorImported?`Restored ${n.resourceMonitorServerCount||0} Resource Monitor server(s) and ${n.resourceMonitorHistoryCount||0} history sample(s).`:"Legacy backup: current Resource Monitor data was kept.",o=n.brandingImported?`Restored ${n.brandingAssetCount||0} branding asset(s).`:"Current logo and favicon were kept.",l=n.auditProxyImported?`Audit Proxy restored; listener is ${n.listenerRunning?"running":"stopped"}.`:"legacy-database"===n.backupKind?`Legacy Audit Proxy policy: ${n.auditProxyReason||"not present"}.`:"Audit Proxy data was not restored.",d=n.rootCAImported?"Root CA certificate/private key restored.":n.rootCAPreserved?"Current Root CA was preserved.":"";D({type:"success",message:`Backup imported successfully. ${i} ${o} ${l} ${d}`})}catch(e){D({type:"error",message:e.message||"Invalid backup file."})}finally{R.current&&(R.current.value=""),N(!1)}}},eG=(e,t)=>B(s=>({...s,[e]:t})),eq=async e=>{e?.preventDefault?.(),G(!0),T({type:"",message:""});try{let e={...I,ldapBaseDn:I.ldapUserBaseDn,ldapAllowedUsers:I.ldapAllowedUsers};e.ldapBindPassword||delete e.ldapBindPassword;let t=await eP(e);B(e=>({...e,ldapBindPassword:"",ldapEnabled:!0===t.ldapEnabled,ldapUserBaseDn:t.ldapUserBaseDn||t.ldapBaseDn||e.ldapUserBaseDn,ldapLoginAllowedGroupDn:t.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:t.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:t.ldapMonitorAdminGroupDn||"",ldapAiGatewaysMonitorsGroupDn:t.ldapAiGatewaysMonitorsGroupDn||"",ldapNestedGroups:!1!==t.ldapNestedGroups,ldapAllowedUsers:Array.isArray(t.ldapAllowedUsers)?t.ldapAllowedUsers:e.ldapAllowedUsers})),T({type:"success",message:"LDAP settings saved."})}catch(e){T({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{G(!1)}},e_=async()=>{_(!0),T({type:"",message:""});try{await eq();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),t=await e.json().catch(()=>({}));e.ok&&t.ok?T({type:"success",message:t.message||"LDAP connection OK."}):T({type:"error",message:t.error||"LDAP test failed."})}catch(e){T({type:"error",message:e.message||"LDAP test failed."})}finally{_(!1)}},e$=async()=>{H(!0),T({type:"",message:""});try{await eq();let e=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent($)}`,{cache:"no-store"}),t=await e.json().catch(()=>({}));e.ok?(Q(t.users||[]),T({type:"success",message:`Loaded ${(t.users||[]).length} LDAP user(s).`})):T({type:"error",message:t.error||"Failed to load LDAP users."})}catch(e){T({type:"error",message:e.message||"Failed to load LDAP users."})}finally{H(!1)}},ez=e=>{let t=String(e||"").trim();t&&B(e=>{let s=new Set(e.ldapAllowedUsers||[]);return s.has(t)?s.delete(t):s.add(t),{...e,ldapAllowedUsers:[...s]}})},eJ=async(t=W.authMode||"password")=>{let s=W.oidcIssuerUrl.trim(),a=W.oidcClientId.trim(),r=W.oidcScopes.trim(),n=W.oidcLoginLabel.trim(),i=Z.trim();if("password"!==t&&(!s||!a||!i)&&!e.oidcConfigured)return void et({type:"error",message:"Issuer URL, client ID, and client secret are required to enable OIDC."});ea(!0),et({type:"",message:""});try{let e={authMode:t,oidcIssuerUrl:s,oidcClientId:a,oidcScopes:r||"openid profile email",oidcLoginLabel:n||"Sign in with OIDC"};i&&(e.oidcClientSecret=i);let o=await eP(e);X({authMode:o.authMode||t,oidcIssuerUrl:o.oidcIssuerUrl||s,oidcClientId:o.oidcClientId||a,oidcScopes:o.oidcScopes||r||"openid profile email",oidcLoginLabel:o.oidcLoginLabel||n||"Sign in with OIDC"}),Y(""),et({type:"success",message:"OIDC settings saved."})}catch(e){et({type:"error",message:e.message||"Failed to save OIDC settings"})}finally{ea(!1)}},eQ=async(e,t)=>{if(!t)return;if(t.size>1048576)return void ew({type:"error",message:"File exceeds 1 MB limit."});let s="logo"===e?eD:eA;s(!0),ew({type:"",message:""});try{let s=new FormData;s.append("asset",e),s.append("file",t);let a=await fetch("/api/branding/upload",{method:"POST",body:s}),r=await a.json().catch(()=>({}));if(!a.ok)throw Error(r.error||"Upload failed");(0,n.notifyBrandingChanged)(),ew({type:"success",message:`${"logo"===e?"Logo":"Favicon"} uploaded.`})}catch(e){ew({type:"error",message:e.message||"Upload failed."})}finally{s(!1)}},eK=async e=>{let t=e.target.files?.[0];await eQ("logo",t),eR.current&&(eR.current.value="")},eH=async e=>{let t=e.target.files?.[0];await eQ("favicon",t),eE.current&&(eE.current.value="")},eW=async e=>{e.preventDefault(),eN(!0),ew({type:"",message:""});try{await eP({siteTitle:eh.trim(),siteShortName:eg.trim(),siteDescription:ey.trim()}),(0,n.notifyBrandingChanged)(),ew({type:"success",message:"Branding text saved."})}catch(e){ew({type:"error",message:e.message||"Failed to save branding."})}finally{eN(!1)}},eX=async e=>{ew({type:"",message:""});try{let t=await fetch(`/api/branding?asset=${e}`,{method:"DELETE"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Failed to remove asset");(0,n.notifyBrandingChanged)(),ew({type:"success",message:`${"logo"===e?"Logo":"Favicon"} removed.`})}catch(e){ew({type:"error",message:e.message||"Failed to remove asset."})}},eZ=async()=>{eU(!0),ew({type:"",message:""});try{let e=await fetch("/api/branding",{method:"DELETE"});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"Failed to reset branding")}await eP({siteTitle:"",siteShortName:"",siteDescription:""}),eb(""),ev(""),ef(""),(0,n.notifyBrandingChanged)(),ew({type:"success",message:"Branding reset to defaults."})}catch(e){ew({type:"error",message:e.message||"Failed to reset branding."})}finally{eU(!1)}};return s?(0,a.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,a.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,a.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure dashboard preferences, request logging, database backup, and authentication."})]}),(0,a.jsxs)(b,{icon:"view_sidebar",title:"Sidebar tools",desc:"Show or hide advanced dashboard tools to keep the sidebar clean.",children:[(0,a.jsx)(f,{title:"Show Advanced tools",desc:"When disabled, Media / Web, AI Traffic Gateway, CLI Tools, Proxy Pools, Skills, Console Log and Translator are hidden from the sidebar. Core admin pages remain visible.",checked:!1!==e.sidebarAdvancedToolsVisible,onChange:eI}),(0,a.jsx)(h,{status:ei})]}),(0,a.jsx)(b,{icon:"tune",title:"AI Client Compatibility",desc:"Override the Claude Code, Codex CLI, Qwen Code and OpenCode CLI versions BlueRouter presents upstream. Dashboard values apply immediately; environment variables remain authoritative.",children:(0,a.jsxs)("form",{onSubmit:eM,className:"space-y-4",children:[(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{className:"mb-3 flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Claude Code"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Built-in: ",(0,a.jsx)("code",{children:e.clientFingerprint?.claude?.builtInVersion||"2.1.280"})," \xb7 ","Effective: ",(0,a.jsx)("code",{children:e.clientFingerprint?.claude?.effectiveVersion||"2.1.280"})," \xb7 ","Source: ",e.clientFingerprint?.claude?.source||"built-in"]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"terminal"})]}),(0,a.jsx)(g,{label:"Version override",hint:e.clientFingerprint?.claude?.environmentLocked?"CLAUDE_CODE_VERSION is set in the environment and takes priority over this field.":"Leave blank to use the version shipped with BlueRouter. Example: 2.1.300",children:(0,a.jsx)(v,{value:el.claudeCodeVersionOverride,disabled:e.clientFingerprint?.claude?.environmentLocked,onChange:e=>ed(t=>({...t,claudeCodeVersionOverride:e.target.value})),placeholder:e.clientFingerprint?.claude?.builtInVersion||"2.1.280"})}),(0,a.jsxs)("div",{className:"mt-3 text-xs text-text-muted",children:["Effective User-Agent: ",(0,a.jsx)("code",{className:"break-all",children:e.clientFingerprint?.claude?.userAgent||"-"})]}),(0,a.jsx)("button",{type:"button",disabled:e.clientFingerprint?.claude?.environmentLocked,onClick:()=>ed(e=>({...e,claudeCodeVersionOverride:""})),className:"mt-3 rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main disabled:opacity-50",children:"Use built-in on next save"})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{className:"mb-3 flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Codex CLI"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Built-in: ",(0,a.jsx)("code",{children:e.clientFingerprint?.codex?.builtInVersion||"0.156.1"})," \xb7 ","Effective: ",(0,a.jsx)("code",{children:e.clientFingerprint?.codex?.effectiveVersion||"0.156.1"})," \xb7 ","Source: ",e.clientFingerprint?.codex?.source||"built-in"]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"code"})]}),(0,a.jsx)(g,{label:"Version override",hint:e.clientFingerprint?.codex?.environmentLocked?"CODEX_CLIENT_VERSION is set in the environment and takes priority over this field.":"Leave blank to use the version shipped with BlueRouter. Example: 0.157.0",children:(0,a.jsx)(v,{value:el.codexClientVersionOverride,disabled:e.clientFingerprint?.codex?.environmentLocked,onChange:e=>ed(t=>({...t,codexClientVersionOverride:e.target.value})),placeholder:e.clientFingerprint?.codex?.builtInVersion||"0.156.1"})}),(0,a.jsxs)("div",{className:"mt-3 space-y-1 text-xs text-text-muted",children:[(0,a.jsxs)("div",{children:["version: ",(0,a.jsx)("code",{children:e.clientFingerprint?.codex?.effectiveVersion||"-"})]}),(0,a.jsxs)("div",{children:["originator: ",(0,a.jsx)("code",{children:e.clientFingerprint?.codex?.originator||"-"})]}),(0,a.jsxs)("div",{children:["User-Agent: ",(0,a.jsx)("code",{className:"break-all",children:e.clientFingerprint?.codex?.userAgent||"-"})]})]}),(0,a.jsx)("button",{type:"button",disabled:e.clientFingerprint?.codex?.environmentLocked,onClick:()=>ed(e=>({...e,codexClientVersionOverride:""})),className:"mt-3 rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main disabled:opacity-50",children:"Use built-in on next save"})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{className:"mb-3 flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"Qwen Code"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Built-in: ",(0,a.jsx)("code",{children:e.clientFingerprint?.qwen?.builtInVersion||"0.24.3"})," \xb7 ","Effective: ",(0,a.jsx)("code",{children:e.clientFingerprint?.qwen?.effectiveVersion||"0.24.3"})," \xb7 ","Source: ",e.clientFingerprint?.qwen?.source||"built-in"]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"terminal"})]}),(0,a.jsx)(g,{label:"Version override",hint:e.clientFingerprint?.qwen?.environmentLocked?"QWEN_CODE_VERSION is set in the environment and takes priority over this field.":"Leave blank to use the version shipped with BlueRouter. Example: 0.25.0",children:(0,a.jsx)(v,{value:el.qwenCodeVersionOverride,disabled:e.clientFingerprint?.qwen?.environmentLocked,onChange:e=>ed(t=>({...t,qwenCodeVersionOverride:e.target.value})),placeholder:e.clientFingerprint?.qwen?.builtInVersion||"0.24.3"})}),(0,a.jsxs)("div",{className:"mt-3 space-y-1 text-xs text-text-muted",children:[(0,a.jsxs)("div",{children:["User-Agent: ",(0,a.jsx)("code",{className:"break-all",children:e.clientFingerprint?.qwen?.userAgent||"-"})]}),(0,a.jsxs)("div",{children:["X-DashScope-AuthType: ",(0,a.jsx)("code",{children:e.clientFingerprint?.qwen?.authType||"qwen-oauth"})]}),(0,a.jsxs)("div",{children:["X-DashScope-CacheControl: ",(0,a.jsx)("code",{children:e.clientFingerprint?.qwen?.cacheControl||"enable"})]})]}),(0,a.jsx)("button",{type:"button",disabled:e.clientFingerprint?.qwen?.environmentLocked,onClick:()=>ed(e=>({...e,qwenCodeVersionOverride:""})),className:"mt-3 rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main disabled:opacity-50",children:"Use built-in on next save"})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{className:"mb-3 flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:"OpenCode CLI"}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Built-in: ",(0,a.jsx)("code",{children:e.clientFingerprint?.opencode?.builtInVersion||"1.18.32"})," \xb7 ","Effective: ",(0,a.jsx)("code",{children:e.clientFingerprint?.opencode?.effectiveVersion||"1.18.32"})," \xb7 ","Source: ",e.clientFingerprint?.opencode?.source||"built-in"]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"code_blocks"})]}),(0,a.jsx)(g,{label:"Version override",hint:e.clientFingerprint?.opencode?.environmentLocked?"OPENCODE_VERSION is set in the environment and takes priority over this field.":"Leave blank to use the version shipped with BlueRouter. Example: 1.19.0",children:(0,a.jsx)(v,{value:el.openCodeVersionOverride,disabled:e.clientFingerprint?.opencode?.environmentLocked,onChange:e=>ed(t=>({...t,openCodeVersionOverride:e.target.value})),placeholder:e.clientFingerprint?.opencode?.builtInVersion||"1.18.32"})}),(0,a.jsxs)("div",{className:"mt-3 space-y-1 text-xs text-text-muted",children:[(0,a.jsxs)("div",{children:["client: ",(0,a.jsx)("code",{children:e.clientFingerprint?.opencode?.client||"cli"})]}),(0,a.jsxs)("div",{children:["User-Agent: ",(0,a.jsx)("code",{className:"break-all",children:e.clientFingerprint?.opencode?.userAgent||"-"})]})]}),(0,a.jsx)("button",{type:"button",disabled:e.clientFingerprint?.opencode?.environmentLocked,onClick:()=>ed(e=>({...e,openCodeVersionOverride:""})),className:"mt-3 rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main disabled:opacity-50",children:"Use built-in on next save"})]})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-blue-500/30 bg-blue-500/10 px-4 py-3 text-xs leading-5 text-blue-800 dark:text-blue-300",children:[(0,a.jsx)("div",{className:"font-semibold",children:"Admin guide"}),(0,a.jsx)("div",{children:"Change a version only when the upstream service requires a newer Claude Code, Codex CLI, Qwen Code or OpenCode CLI client, or after you verify the official release/source for that version."}),(0,a.jsxs)("div",{children:["Enter only the semantic version, for example ",(0,a.jsx)("code",{children:"2.1.300"}),", ",(0,a.jsx)("code",{children:"0.157.0"}),", ",(0,a.jsx)("code",{children:"0.25.0"})," or ",(0,a.jsx)("code",{children:"1.19.0"}),", then click ",(0,a.jsx)("strong",{children:"Save & Apply"}),". BlueRouter updates the supported identity headers immediately without a rebuild or restart."]}),(0,a.jsxs)("div",{children:["To return to the version shipped with BlueRouter, click ",(0,a.jsx)("strong",{children:"Use built-in on next save"})," and then ",(0,a.jsx)("strong",{children:"Save & Apply"}),". If an environment variable is active, change that variable instead because it has higher priority."]})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,a.jsx)("button",{type:"submit",disabled:eu,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:eu?"Saving...":"Save & Apply"}),(0,a.jsx)("span",{className:"text-xs text-text-muted",children:"Saved values are included automatically in the normal settings/database backup."})]}),(0,a.jsx)(h,{status:ec})]})}),(0,a.jsxs)(b,{icon:"palette",title:"Branding",desc:"Customize site title, logo and favicon shown in the dashboard, browser tab and login page. Max 1 MB per file.",children:[(0,a.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Logo"}),(0,a.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,a.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:ex?.logoUrl?(0,a.jsx)("img",{src:ex.logoUrl,alt:"Current logo",className:"max-h-full max-w-full object-contain"}):(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"hub"})}),(0,a.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the dashboard sidebar and login page. SVG, PNG, WebP, JPEG, GIF."}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)("button",{type:"button",disabled:ek,onClick:()=>eR.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:ek?"Uploading...":ex?.logoUrl?"Replace logo":"Upload logo"}),ex?.logoUrl?(0,a.jsx)("button",{type:"button",onClick:()=>eX("logo"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,a.jsx)("input",{ref:eR,type:"file",accept:m,className:"hidden",onChange:eK})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:"Favicon"}),(0,a.jsxs)("div",{className:"flex items-center gap-4 rounded-xl border border-border bg-background p-4",children:[(0,a.jsx)("div",{className:"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-lg border border-border bg-surface",children:ex?.faviconUrl?(0,a.jsx)("img",{src:ex.faviconUrl,alt:"Current favicon",className:"max-h-10 max-w-10 object-contain"}):(0,a.jsx)("span",{className:"material-symbols-outlined text-text-muted",children:"public"})}),(0,a.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,a.jsx)("div",{className:"text-xs text-text-muted",children:"Shown in the browser tab. ICO, SVG, PNG, WebP, JPEG, GIF."}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)("button",{type:"button",disabled:eS,onClick:()=>eE.current?.click(),className:"rounded-xl bg-primary px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50",children:eS?"Uploading...":ex?.faviconUrl?"Replace favicon":"Upload favicon"}),ex?.faviconUrl?(0,a.jsx)("button",{type:"button",onClick:()=>eX("favicon"),className:"rounded-xl border border-border px-3 py-1.5 text-xs font-semibold text-text-main hover:border-red-300 hover:text-red-600",children:"Remove"}):null]})]}),(0,a.jsx)("input",{ref:eE,type:"file",accept:x,className:"hidden",onChange:eH})]})]})]}),(0,a.jsxs)("form",{onSubmit:eW,className:"space-y-3",children:[(0,a.jsx)(g,{label:"Site title",hint:"Shown in browser tab and login page. Leave blank for default.",children:(0,a.jsx)(v,{value:eh,onChange:e=>eb(e.target.value),placeholder:"AI Router Gateway"})}),(0,a.jsx)(g,{label:"Company short name",hint:"Shown in dashboard sidebar and login hero text. Defaults to site title/sidebar default or 'Fujinet' on login.",children:(0,a.jsx)(v,{value:eg,onChange:e=>ev(e.target.value),placeholder:"Fujinet"})}),(0,a.jsx)(g,{label:"Description",hint:"Used for browser metadata.",children:(0,a.jsx)(y,{rows:3,value:ey,onChange:e=>ef(e.target.value),placeholder:"AI Infrastructure Management"})}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)("button",{type:"submit",disabled:eC,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:eC?"Saving...":"Save branding text"}),(0,a.jsx)("button",{type:"button",disabled:eL,onClick:eZ,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-red-300 hover:text-red-600 disabled:opacity-50",children:eL?"Resetting...":"Reset to defaults"})]})]})]}),(0,a.jsx)(h,{status:ej})]}),(0,a.jsx)(b,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,a.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,a.jsxs)("form",{onSubmit:eB,className:"space-y-3",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,a.jsx)(g,{label:"Local username",children:(0,a.jsx)(v,{value:E,onChange:e=>O(e.target.value)})}),(0,a.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,a.jsx)(h,{status:P})]}),(0,a.jsxs)("form",{onSubmit:eF,className:"space-y-3",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,a.jsx)(g,{label:"Current password",children:(0,a.jsx)(v,{type:"password",value:o.current,onChange:e=>l({...o,current:e.target.value}),required:!0})}),(0,a.jsx)(g,{label:"New password",children:(0,a.jsx)(v,{type:"password",value:o.new,onChange:e=>l({...o,new:e.target.value}),required:!0})}),(0,a.jsx)(g,{label:"Confirm password",children:(0,a.jsx)(v,{type:"password",value:o.confirm,onChange:e=>l({...o,confirm:e.target.value}),required:!0})}),(0,a.jsx)("button",{disabled:j,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:e.hasPassword?"Update Password":"Set Password"}),(0,a.jsx)(h,{status:d})]})]})}),(0,a.jsx)("div",{id:"request-logging",className:"scroll-mt-6",children:(0,a.jsx)(p,{})}),(0,a.jsxs)(b,{icon:"database",title:"Full Node Backup",desc:"Export or restore the database, Audit Proxy node configuration, Root CA, Resource Monitor data, logo and favicon.",children:[(0,a.jsxs)("div",{className:"mb-4 grid gap-3 md:grid-cols-2",children:[(0,a.jsx)(g,{label:"Backup password (optional)",hint:"Leave blank for plaintext JSON. When set, the entire backup is encrypted with AES-256-GCM and scrypt. Minimum 8 characters.",children:(0,a.jsx)(v,{type:"password",autoComplete:"new-password",value:S,onChange:e=>A(e.target.value),placeholder:"Optional encryption password"})}),(0,a.jsx)(g,{label:"Confirm password (export only)",hint:"Used only to prevent exporting a backup with a mistyped password. Not required when importing.",children:(0,a.jsx)(v,{type:"password",autoComplete:"new-password",value:L,onChange:e=>U(e.target.value),placeholder:"Repeat password before download"})})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,a.jsx)("button",{onClick:eT,disabled:C,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Full Backup"}),(0,a.jsx)("button",{onClick:()=>R.current?.click(),disabled:C,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-primary/50 disabled:opacity-50",children:"Import Backup"}),(0,a.jsx)("input",{ref:R,type:"file",accept:"application/json,.brbackup",className:"hidden",onChange:eV})]}),(0,a.jsx)("div",{className:"mt-3 rounded-xl border border-amber-500/30 bg-amber-500/10 px-4 py-3 text-xs leading-5 text-amber-800 dark:text-amber-300",children:"Full backups include API credentials, Audit Proxy bcrypt password hashes and the Root CA private key. Anyone holding the Root CA key can issue certificates trusted by enrolled clients. Use a password whenever the file leaves the secured backup location."}),(0,a.jsx)("p",{className:"mt-3 text-xs text-text-muted",children:"Import validates the complete Root CA pair and Audit Proxy configuration before mutation, applies the restored runtime state immediately, and rolls back database/configuration/CA state if restore fails. Legacy v2 database backups remain supported."}),(0,a.jsx)(h,{status:k})]}),(0,a.jsx)(b,{icon:"corporate_fare",title:"LDAP / Active Directory Login",desc:"Search users from a User Base DN, restrict login by group DN, and grant admin by group DN. The old Selected LDAP users list is kept as a manual admin list.",children:(0,a.jsxs)("form",{onSubmit:eq,className:"space-y-5",children:[(0,a.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,a.jsx)("button",{type:"button",onClick:()=>eG("ldapEnabled",!I.ldapEnabled),className:`rounded-xl px-3 py-2 text-sm font-semibold ${I.ldapEnabled?"bg-primary text-white":"border border-border text-text-muted"}`,children:I.ldapEnabled?"Enabled":"Disabled"})}),(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,a.jsx)(g,{label:"LDAP URL",children:(0,a.jsx)(v,{value:I.ldapUrl,onChange:e=>eG("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,a.jsx)(g,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,a.jsx)(v,{value:I.ldapUserBaseDn,onChange:e=>eG("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,a.jsx)(g,{label:"LDAP Bind DN",children:(0,a.jsx)(v,{value:I.ldapBindDn,onChange:e=>eG("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,a.jsx)(g,{label:"LDAP Bind Password",children:(0,a.jsx)(v,{type:"password",value:I.ldapBindPassword,onChange:e=>eG("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,a.jsx)(g,{label:"LDAP Login Allowed Group DN",hint:"Only members of this group can log in. Leave blank to allow any valid LDAP user.",children:(0,a.jsx)(v,{value:I.ldapLoginAllowedGroupDn,onChange:e=>eG("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,a.jsx)(g,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,a.jsx)(v,{value:I.ldapAdminGroupDn,onChange:e=>eG("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,a.jsx)(g,{label:"LDAP Monitor Admin Group DN",hint:"Members can use only Endpoint, API Keys, Usage, Analytics, Quota Tracker and Prompt Logs with admin-like permissions inside those tabs.",children:(0,a.jsx)(v,{value:I.ldapMonitorAdminGroupDn,onChange:e=>eG("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,a.jsx)(g,{label:"LDAP AI Gateways Monitors Group DN",hint:"Members log in as regular users but the Analytics page aggregates statistics for every API key that has an owner, instead of only their own keys.",children:(0,a.jsx)(v,{value:I.ldapAiGatewaysMonitorsGroupDn,onChange:e=>eG("ldapAiGatewaysMonitorsGroupDn",e.target.value),placeholder:"CN=BlueRouter_AI_Gateways_Monitors,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})})]}),(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,a.jsx)(g,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,a.jsx)(v,{value:I.ldapUserSearchFilter,onChange:e=>eG("ldapUserSearchFilter",e.target.value)})}),(0,a.jsx)(g,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,a.jsx)(f,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:I.ldapNestedGroups,onChange:e=>eG("ldapNestedGroups",e)})}),(0,a.jsx)(g,{label:"Username attribute",children:(0,a.jsx)(v,{value:I.ldapUserNameAttribute,onChange:e=>eG("ldapUserNameAttribute",e.target.value)})}),(0,a.jsx)(g,{label:"Display attribute",children:(0,a.jsx)(v,{value:I.ldapUserDisplayAttribute,onChange:e=>eG("ldapUserDisplayAttribute",e.target.value)})}),(0,a.jsx)(g,{label:"Email attribute",children:(0,a.jsx)(v,{value:I.ldapUserEmailAttribute,onChange:e=>eG("ldapUserEmailAttribute",e.target.value)})}),(0,a.jsx)(g,{label:"Connect timeout ms",children:(0,a.jsx)(v,{type:"number",value:I.ldapConnectTimeoutMs,onChange:e=>eG("ldapConnectTimeoutMs",e.target.value)})})]}),(0,a.jsx)(f,{title:"Reject invalid TLS certificates",desc:"Disable only for test/self-signed LDAP TLS.",checked:I.ldapTlsRejectUnauthorized,onChange:e=>eG("ldapTlsRejectUnauthorized",e)}),(0,a.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{className:"mb-3",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,a.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Users loaded here come from Login Allowed Group DN when set. Selected users are also treated as manual admins for backward compatibility."})]}),(0,a.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,a.jsx)(v,{value:$,onChange:e=>z(e.target.value),placeholder:"Search users..."}),(0,a.jsx)("button",{type:"button",onClick:e$,disabled:K,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:K?"Loading...":"Load users"})]}),J.length>0&&(0,a.jsx)("div",{className:"max-h-72 overflow-auto rounded-xl border border-border",children:J.map(e=>{let t=I.ldapAllowedUsers.includes(e.username);return(0,a.jsxs)("button",{type:"button",onClick:()=>ez(e.username),className:`flex w-full items-center justify-between gap-3 border-b border-border px-3 py-2 text-left text-sm last:border-b-0 ${t?"bg-primary/10":"bg-background hover:bg-surface"}`,children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,a.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:t?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,a.jsxs)("div",{className:"mt-3",children:[(0,a.jsxs)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:["Selected manual admin users (",I.ldapAllowedUsers.length,")"]}),0===I.ldapAllowedUsers.length?(0,a.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:I.ldapAllowedUsers.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>ez(e),className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs text-primary",children:[e," \xd7"]},e))})]})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,a.jsx)("button",{type:"button",onClick:e_,disabled:q,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:q?"Testing...":"Save & test LDAP"}),(0,a.jsx)("button",{type:"submit",disabled:V,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:V?"Saving...":"Save LDAP settings"})]}),(0,a.jsx)(h,{status:F})]})}),(0,a.jsxs)(b,{icon:"lock_open",title:"OIDC Dashboard Login",desc:"oidc"===e.authMode?"OIDC active":"both"===e.authMode?"Password + OIDC active":"Optional SSO via Authentik/Keycloak/Google",children:[(0,a.jsx)("button",{type:"button",onClick:()=>en(e=>!e),className:"mb-4 rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main",children:er?"Hide OIDC settings":"Show OIDC settings"}),er&&(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:[{value:"password",title:"Password/LDAP",desc:"Keep local and LDAP login."},{value:"oidc",title:"OIDC only",desc:"Disable local/LDAP login when configured."},{value:"both",title:"Both",desc:"Allow either OIDC or local/LDAP."}].map(e=>{let t=W.authMode===e.value;return(0,a.jsxs)("button",{type:"button",onClick:()=>X(t=>({...t,authMode:e.value})),className:`rounded-xl border p-3 text-left ${t?"border-primary bg-primary/10":"border-border bg-background hover:border-primary/40"}`,children:[(0,a.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,a.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,a.jsx)(g,{label:"Issuer URL",children:(0,a.jsx)(v,{value:W.oidcIssuerUrl,onChange:e=>X({...W,oidcIssuerUrl:e.target.value})})}),(0,a.jsx)(g,{label:"Client ID",children:(0,a.jsx)(v,{value:W.oidcClientId,onChange:e=>X({...W,oidcClientId:e.target.value})})}),(0,a.jsx)(g,{label:"Client Secret",children:(0,a.jsx)(v,{type:"password",value:Z,onChange:e=>Y(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,a.jsx)(g,{label:"Scopes",children:(0,a.jsx)(v,{value:W.oidcScopes,onChange:e=>X({...W,oidcScopes:e.target.value})})}),(0,a.jsx)(g,{label:"Login label",children:(0,a.jsx)(v,{value:W.oidcLoginLabel,onChange:e=>X({...W,oidcLoginLabel:e.target.value})})})]}),(0,a.jsx)("button",{type:"button",onClick:()=>eJ(),disabled:es,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:es?"Saving...":"Save OIDC settings"}),(0,a.jsx)(h,{status:ee})]})]})]})}},7973:(e,t,s)=>{Promise.resolve().then(s.bind(s,6191))}},e=>{e.O(0,[6373,3862,8500,506,9959,7050,2218,5263,7033,5497,8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|