@jheavenknows/bluerouter 1.0.122 → 1.0.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +3 -3
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.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/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/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/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/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/cli-tools.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 +5 -5
- 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 +5 -5
- 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 +3 -3
- 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 +6 -6
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
- 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 +6 -6
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
- 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 +4 -4
- 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 +3 -3
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +5 -5
- 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 +3 -3
- 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 +6 -6
- 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 +6 -6
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard/skills.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 +5 -5
- 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 +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +5 -5
- 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 +3 -3
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +3 -3
- 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 +3 -3
- 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 +3 -3
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +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 +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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_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 +3 -3
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +3 -3
- package/app/.next-cli-build/server/chunks/2496.js +1 -1
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/7130.js +1 -1
- package/app/.next-cli-build/server/chunks/7153.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/{1321-463c4a31373d2c36.js → 1321-464567b4573f6085.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/api-keys/page-b617fab6cd6ae253.js +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/api-keys/page-bec8eaff7440b8c7.js +0 -1
- /package/app/.next-cli-build/static/{co8Xecz4CsjwB1raRkxiM → OL2EoAoYy9N8kjE3nAQAA}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{co8Xecz4CsjwB1raRkxiM → OL2EoAoYy9N8kjE3nAQAA}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-1.0.117-to-1.0.118-1.0.118-20260609-222041 → upgrade-1.0.122-to-1.0.123-1.0.123-20260609-231344}/data.sqlite +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7593],{56484:(e,t,s)=>{"use strict";s.d(t,{default:()=>m});var a=s(95155),l=s(12115),n=s(35497),r=s(11059);function i(e){return String(e||"").trim().toLowerCase()}function d(e){return Array.isArray(e)?[...new Set(e.map(e=>String(e||"").trim()).filter(Boolean))]:[]}function c({models:e,emptyLabel:t="Chưa g\xe1n model"}){let s=d(e);return 0===s.length?(0,a.jsx)("span",{className:"rounded-full bg-amber-500/10 px-2 py-0.5 text-xs text-amber-700 dark:text-amber-300",children:t}):(0,a.jsxs)("div",{className:"flex flex-wrap gap-1.5",children:[s.slice(0,8).map(e=>(0,a.jsx)("span",{className:"rounded-full border border-border bg-surface px-2 py-1 font-mono text-[11px] text-text-main",children:e},e)),s.length>8?(0,a.jsxs)("span",{className:"rounded-full bg-primary/10 px-2 py-1 text-[11px] text-primary",children:["+",s.length-8," model kh\xe1c"]}):null]})}function o({open:e,keyName:t,models:s,setModels:r,activeProviders:i,modelAliases:c,onClose:m,onSave:x,saving:h}){let[u,p]=(0,l.useState)(!1),y=d(s),g=e=>{let t=e?.value||e?.name||e;r(e=>d(e).filter(e=>e!==t))};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.aF,{isOpen:e,onClose:m,title:`Sửa quyền truy cập model${t?`: ${t}`:""}`,children:(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)("div",{className:"rounded-xl border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-700 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-300",children:"Chọn một hoặc nhiều model m\xe0 API key n\xe0y được ph\xe9p sử dụng. Trang n\xe0y kh\xf4ng cho lưu danh s\xe1ch model rỗng."}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Model được ph\xe9p d\xf9ng"}),(0,a.jsxs)(n.$n,{variant:"secondary",onClick:()=>p(!0),children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-1 text-[18px]",children:"add"}),"Th\xeam model"]})]}),(0,a.jsx)("div",{className:"min-h-[76px] rounded-xl border border-border bg-background p-3",children:0===y.length?(0,a.jsx)("div",{className:"text-sm text-text-muted",children:"Chưa chọn model n\xe0o. H\xe3y th\xeam \xedt nhất một model trước khi lưu."}):(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:y.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>g(e),className:"rounded-full border border-primary/30 bg-primary/10 px-2 py-1 font-mono text-xs text-primary transition hover:bg-red-500/10 hover:text-red-600",title:"Bấm để gỡ model n\xe0y",children:[e," ",(0,a.jsx)("span",{className:"ml-1",children:"\xd7"})]},e))})})]}),(0,a.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,a.jsx)(n.$n,{variant:"secondary",onClick:m,children:"Hủy"}),(0,a.jsx)(n.$n,{onClick:x,disabled:h||0===y.length,children:h?"Đang lưu...":"Lưu danh s\xe1ch model"})]})]})}),(0,a.jsx)(n.rq,{isOpen:u,onClose:()=>p(!1),onSelect:e=>{let t=e?.value||e?.name||e;t&&r(e=>d([...e,t]))},onDeselect:g,activeProviders:i,modelAliases:c,title:"Chọn model được ph\xe9p d\xf9ng",addedModelValues:y,closeOnSelect:!1})]})}function m(){let[e,t]=(0,l.useState)(null),[s,m]=(0,l.useState)([]),[x,h]=(0,l.useState)(!0),[u,p]=(0,l.useState)(""),[y,g]=(0,l.useState)(!1),[b,f]=(0,l.useState)(""),[j,k]=(0,l.useState)(""),[v,N]=(0,l.useState)(""),[w,C]=(0,l.useState)(""),[A,S]=(0,l.useState)(new Set),[P,I]=(0,l.useState)(null),[$,T]=(0,l.useState)([]),[K,M]=(0,l.useState)(""),[O,D]=(0,l.useState)(!1),[L,_]=(0,l.useState)(!1),[E,q]=(0,l.useState)(""),[B,H]=(0,l.useState)(""),[U,F]=(0,l.useState)(!1),[G,V]=(0,l.useState)(!1),[Z,J]=(0,l.useState)([]),[X,Q]=(0,l.useState)({}),[R,z]=(0,l.useState)(null),[W,Y]=(0,l.useState)([]),[ee,et]=(0,l.useState)(!1),[es,ea]=(0,l.useState)(5),[el,en]=(0,l.useState)(0),{copied:er,copy:ei}=(0,r.C)(),ed=e?.isAdmin===!0,ec=e?.userId||"",eo=Number.isFinite(Number(es))?Number(es):5,em=Number.isFinite(Number(el))?Number(el):s.length,ex=!ed&&em>=eo,eh=(0,l.useMemo)(()=>{let e=new Map;for(let t of $){let s=i(t.username||t.email||t.userPrincipalName||t.sAMAccountName);s&&e.set(s,{id:s,label:`${t.displayName||t.username||s}${t.email?` \xb7 ${t.email}`:""}`})}for(let t of s){let s=i(t.ownerUser||t.createdByUser);s&&!e.has(s)&&e.set(s,{id:s,label:s})}return ec&&!e.has(ec)&&e.set(ec,{id:ec,label:`${ec} (t\xf4i)`}),[...e.values()].sort((e,t)=>e.label.localeCompare(t.label))},[$,s,ec]),eu=B!==E,ep=async()=>{let e=await fetch("/api/auth/status",{cache:"no-store"}),s=await e.json().catch(()=>({}));return t(s),!j&&s?.userId&&k(s.userId),s},ey=async()=>{h(!0),p("");try{let e=await fetch("/api/keys",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được danh s\xe1ch API keys");let s=t.keys||[],a=String(t.apiKeyDefaultModel||"").trim();m(s),q(a),H(a),ea(t.apiKeyLimit??5),en(t.apiKeyCount??s.length)}catch(e){p(e.message||"Kh\xf4ng tải được danh s\xe1ch API keys")}finally{h(!1)}},eg=async()=>{try{let[e,t]=await Promise.allSettled([fetch("/api/providers",{cache:"no-store"}),fetch("/api/models/alias",{cache:"no-store"})]);if("fulfilled"===e.status&&e.value.ok){let t=await e.value.json().catch(()=>({}));J(t.connections||[])}if("fulfilled"===t.status&&t.value.ok){let e=await t.value.json().catch(()=>({}));Q(e.aliases||{})}}catch{}},eb=async(e=K)=>{if(ed){D(!0);try{let t=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(e||"")}`,{cache:"no-store"}),s=await t.json().catch(()=>({}));t.ok&&T(s.users||[])}catch{}finally{D(!1)}}};(0,l.useEffect)(()=>{let e=!1;return(async()=>{let t=await ep();e||await Promise.all([ey(),eg()]),e||t?.isAdmin!==!0||await eb("")})(),()=>{e=!0}},[]);let ef=async()=>{if(ed&&B.trim()){F(!0),p("");try{let e=await fetch("/api/keys",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKeyDefaultModel:B.trim()})}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng lưu được default model");let s=String(t.apiKeyDefaultModel||"").trim();q(s),H(s)}catch(e){p(e.message||"Kh\xf4ng lưu được default model")}finally{F(!1)}}},ej=async()=>{if(b.trim()){if(!E.trim())return void p("Admin cần cấu h\xecnh default model trước khi tạo API key.");if(ex)return void p(`Mỗi user chỉ được tạo tối đa ${eo} API keys. Vui l\xf2ng x\xf3a bớt key cũ trước khi tạo key mới.`);_(!0),p("");try{let e=ed?i(v||j||ec):void 0,t=await fetch("/api/keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:b.trim(),ownerUser:e})}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng tạo được API key");C(s.key),f(""),N(""),g(!1),await ey()}catch(e){p(e.message||"Kh\xf4ng tạo được API key")}finally{_(!1)}}},ek=async(e,t)=>{let s=await fetch(`/api/keys/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await s.json().catch(()=>({}));return s.ok?(await ey(),!0):(p(a.error||"Kh\xf4ng cập nhật được API key"),!1)},ev=async()=>{if(!R)return;let e=d(W);if(0===e.length)return void p("H\xe3y chọn \xedt nhất một model trước khi lưu quyền truy cập API key.");et(!0),p("");try{await ek(R.id,{allowedModels:e})&&(z(null),Y([]))}finally{et(!1)}},eN=L||!b.trim()||!E.trim()||ex;return(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("h1",{className:"flex items-center gap-2 text-3xl font-bold text-text-main",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"vpn_key"}),"Quản l\xfd API Keys"]}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:ed?"Admin c\xf3 thể tạo API key, g\xe1n owner v\xe0 chỉnh quyền truy cập model. Admin kh\xf4ng bị giới hạn số lượng key.":`Bạn c\xf3 thể quản l\xfd API key của t\xe0i khoản m\xecnh. Mỗi user thường được tạo tối đa ${eo} API keys.`})]}),(0,a.jsxs)(n.$n,{onClick:()=>g(!0),disabled:!E.trim()||ex,children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-1 text-[18px]",children:"add"}),"Tạo API Key"]})]}),u?(0,a.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300",children:u}):null,ed?null:(0,a.jsx)(n.Zp,{children:(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-lg font-semibold text-text-main",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"counter_5"}),"Giới hạn API key theo user"]}),(0,a.jsxs)("p",{className:"mt-1 text-sm text-text-muted",children:["T\xe0i khoản của bạn đang c\xf3 ",em,"/",eo," API keys. Key bị disabled vẫn được t\xednh v\xe0o giới hạn."]})]}),(0,a.jsx)("span",{className:`rounded-full px-3 py-1 text-xs ${ex?"bg-red-500/10 text-red-600":"bg-green-500/10 text-green-600"}`,children:ex?"Đ\xe3 đạt giới hạn":"C\xf2n c\xf3 thể tạo th\xeam"})]})}),(0,a.jsx)(n.Zp,{children:(0,a.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-lg font-semibold text-text-main",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"rule"}),"Default model cho API key mới"]}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"API key mới sẽ mặc định chỉ được d\xf9ng model n\xe0y. Cần cấu h\xecnh default model trước khi tạo API key."}),(0,a.jsx)("div",{className:"mt-3",children:E?(0,a.jsx)("span",{className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 font-mono text-xs text-primary",children:E}):(0,a.jsx)("span",{className:"rounded-full bg-red-500/10 px-3 py-1 text-xs text-red-600",children:"Chưa cấu h\xecnh default model"})})]}),ed?(0,a.jsxs)("div",{className:"flex flex-col gap-2 sm:min-w-[360px]",children:[(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)("button",{type:"button",onClick:()=>V(!0),className:"min-w-0 flex-1 rounded-xl border border-border bg-background px-3 py-2 text-left font-mono text-xs text-text-main transition hover:border-primary/50",children:B||"Chọn default model..."}),(0,a.jsx)(n.$n,{onClick:ef,disabled:U||!B.trim()||!eu,children:U?"Đang lưu...":"Lưu"})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Danh s\xe1ch model gồm provider models, custom models, aliases v\xe0 combos."})]}):null]})}),w?(0,a.jsx)(n.Zp,{className:"border-green-200 bg-green-50/60 dark:border-green-500/30 dark:bg-green-500/10",children:(0,a.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-semibold text-green-700 dark:text-green-300",children:"Đ\xe3 tạo API key"}),(0,a.jsx)("div",{className:"mt-1 break-all font-mono text-xs text-text-main",children:w}),(0,a.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["H\xe3y copy ngay. Key mới mặc định chỉ được d\xf9ng ",E||"default model"," trừ khi admin chỉnh quyền model."]})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>ei(w,"created"),children:"created"===er?"Đ\xe3 copy":"Copy"}),(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>C(""),children:"Đ\xf3ng"})]})]})}):null,(0,a.jsx)(n.Zp,{children:x?(0,a.jsxs)("div",{className:"py-10 text-center text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin align-middle",children:"progress_activity"}),"Đang tải API keys..."]}):0===s.length?(0,a.jsxs)("div",{className:"py-12 text-center text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined mb-2 block text-4xl",children:"vpn_key_off"}),"Chưa c\xf3 API key n\xe0o."]}):(0,a.jsx)("div",{className:"space-y-3",children:s.map(e=>{var t;let s=A.has(e.id),l=e.ownerUser||e.createdByUser||"chưa g\xe1n",r=d(e.allowedModels);return(0,a.jsx)("div",{className:"rounded-2xl border border-border bg-background p-4",children:(0,a.jsxs)("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[(0,a.jsxs)("div",{className:"min-w-0 flex-1 space-y-2",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:e.name||"API Key"}),(0,a.jsx)("span",{className:`rounded-full px-2 py-0.5 text-xs ${e.isActive?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:e.isActive?"Đang bật":"Đ\xe3 tắt"}),(0,a.jsxs)("span",{className:"rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary",children:["Owner: ",l]}),r.length>0?(0,a.jsxs)("span",{className:"rounded-full bg-blue-500/10 px-2 py-0.5 text-xs text-blue-600",children:[r.length," model"]}):(0,a.jsx)("span",{className:"rounded-full bg-amber-500/10 px-2 py-0.5 text-xs text-amber-700",children:"Legacy full access"})]}),(0,a.jsx)("div",{className:"break-all font-mono text-xs text-text-muted",children:s?e.key:(t=e.key)?t.length>12?`${t.slice(0,8)}...${t.slice(-4)}`:t:""}),(0,a.jsxs)("div",{className:"text-xs text-text-muted",children:["Tạo l\xfac: ",e.createdAt?new Date(e.createdAt).toLocaleString():"kh\xf4ng r\xf5",e.createdByUser?` \xb7 Tạo bởi: ${e.createdByUser}`:""]}),(0,a.jsx)("div",{className:"pt-1",children:(0,a.jsx)(c,{models:r,emptyLabel:"Legacy full model access"})})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)(n.lM,{checked:!1!==e.isActive,onChange:t=>ek(e.id,{isActive:t})}),(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>{var t;return t=e.id,void S(e=>{let s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s})},children:s?"Ẩn":"Hiện"}),(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>ei(e.key,e.id),children:er===e.id?"Đ\xe3 copy":"Copy"}),(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>{var t;let s;return t=e.id,s=prompt("T\xean API key mới",e.name||""),void(s?.trim()&&ek(t,{name:s.trim()}))},children:"Đổi t\xean"}),ed?(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>{ed&&(z(e),Y(d(e.allowedModels)))},children:"Models"}):null,ed?(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>((e,t)=>{if(!ed)return;let s=prompt("G\xe1n owner username/email",t||ec||"");null!==s&&ek(e,{ownerUser:i(s)})})(e.id,l),children:"G\xe1n owner"}):null,(0,a.jsx)(n.$n,{variant:"danger",onClick:()=>{var t;return t=e.id,void I({title:"X\xf3a API Key",message:"Bạn chắc chắn muốn x\xf3a API key n\xe0y? Thao t\xe1c n\xe0y kh\xf4ng thể ho\xe0n t\xe1c.",onConfirm:async()=>{I(null),(await fetch(`/api/keys/${t}`,{method:"DELETE"})).ok&&await ey()}})},children:"X\xf3a"})]})]})},e.id)})})}),(0,a.jsx)(n.aF,{isOpen:y,onClose:()=>g(!1),title:"Tạo API Key",children:(0,a.jsxs)("div",{className:"space-y-4",children:[E.trim()?ex?(0,a.jsxs)("div",{className:"rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300",children:["Bạn đ\xe3 đạt giới hạn ",eo," API keys. H\xe3y x\xf3a bớt key cũ trước khi tạo key mới."]}):(0,a.jsxs)("div",{className:"rounded-xl border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-700 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-300",children:["Key n\xe0y sẽ được tạo với quyền d\xf9ng default model: ",(0,a.jsx)("span",{className:"font-mono",children:E}),"."]}):(0,a.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300",children:"Admin cần cấu h\xecnh default model trước khi tạo API key."}),(0,a.jsx)(n.pd,{label:"T\xean key",value:b,onChange:e=>f(e.target.value),placeholder:"VD: VSCode, LibreChat, team-user"}),ed?(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Owner user"}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(n.pd,{value:K,onChange:e=>M(e.target.value),placeholder:"T\xecm user LDAP"}),(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>eb(K),disabled:O,children:O?"Đang tải":"Tải"})]}),(0,a.jsxs)("select",{value:j,onChange:e=>k(e.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2 text-sm text-text-main outline-none focus:border-primary",children:[(0,a.jsxs)("option",{value:ec,children:["G\xe1n cho t\xf4i (",ec||"local",")"]}),eh.map(e=>(0,a.jsx)("option",{value:e.id,children:e.label},e.id))]}),(0,a.jsx)(n.pd,{label:"Ghi đ\xe8 owner thủ c\xf4ng",value:v,onChange:e=>N(e.target.value),placeholder:"username hoặc email, kh\xf4ng bắt buộc",hint:"D\xf9ng khi LDAP kh\xf4ng khả dụng hoặc user kh\xf4ng c\xf3 trong danh s\xe1ch."})]}):(0,a.jsxs)("div",{className:"rounded-xl bg-surface-2 px-3 py-2 text-sm text-text-muted",children:["Owner: ",ec||"user hiện tại"]}),(0,a.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,a.jsx)(n.$n,{variant:"secondary",onClick:()=>g(!1),children:"Hủy"}),(0,a.jsx)(n.$n,{onClick:ej,disabled:eN,children:L?"Đang tạo...":"Tạo"})]})]})}),(0,a.jsx)(o,{open:!!R,keyName:R?.name,models:W,setModels:Y,activeProviders:Z,modelAliases:X,onClose:()=>{z(null),Y([])},onSave:ev,saving:ee}),(0,a.jsx)(n.rq,{isOpen:G,onClose:()=>V(!1),onSelect:e=>{let t=String(e?.value||e?.name||e||"").trim();t&&(H(t),V(!1))},activeProviders:Z,modelAliases:X,title:"Chọn default model cho API key",selectedModel:B,addedModelValues:B?[B]:[]}),P?(0,a.jsx)(n.uo,{isOpen:!0,onClose:()=>I(null),onConfirm:P.onConfirm,title:P.title,message:P.message,confirmText:"X\xf3a",cancelText:"Hủy",variant:"danger"}):null]})}},84223:(e,t,s)=>{Promise.resolve().then(s.bind(s,56484))}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=84223)),_N_E=e.O()}]);
|
|
Binary file
|
|
Binary file
|
package/app/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7593],{56484:(e,t,a)=>{"use strict";a.d(t,{default:()=>m});var s=a(95155),l=a(12115),r=a(35497),n=a(11059);function i(e){return String(e||"").trim().toLowerCase()}function d(e){return Array.isArray(e)?[...new Set(e.map(e=>String(e||"").trim()).filter(Boolean))]:[]}function o({models:e,emptyLabel:t="No model assigned"}){let a=d(e);return 0===a.length?(0,s.jsx)("span",{className:"rounded-full bg-amber-500/10 px-2 py-0.5 text-xs text-amber-700 dark:text-amber-300",children:t}):(0,s.jsxs)("div",{className:"flex flex-wrap gap-1.5",children:[a.slice(0,8).map(e=>(0,s.jsx)("span",{className:"rounded-full border border-border bg-surface px-2 py-1 font-mono text-[11px] text-text-main",children:e},e)),a.length>8?(0,s.jsxs)("span",{className:"rounded-full bg-primary/10 px-2 py-1 text-[11px] text-primary",children:["+",a.length-8," more"]}):null]})}function c({open:e,keyName:t,models:a,setModels:n,activeProviders:i,modelAliases:o,onClose:m,onSave:x,saving:u}){let[h,p]=(0,l.useState)(!1),y=d(a),f=e=>{let t=e?.value||e?.name||e;n(e=>d(e).filter(e=>e!==t))};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.aF,{isOpen:e,onClose:m,title:`Edit model access${t?`: ${t}`:""}`,children:(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsx)("div",{className:"rounded-xl border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-700 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-300",children:"Select one or more models this API key may use. Empty model access is not allowed from this page."}),(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Allowed models"}),(0,s.jsxs)(r.$n,{variant:"secondary",onClick:()=>p(!0),children:[(0,s.jsx)("span",{className:"material-symbols-outlined mr-1 text-[18px]",children:"add"}),"Add model"]})]}),(0,s.jsx)("div",{className:"min-h-[76px] rounded-xl border border-border bg-background p-3",children:0===y.length?(0,s.jsx)("div",{className:"text-sm text-text-muted",children:"No models selected. Add at least one model before saving."}):(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:y.map(e=>(0,s.jsxs)("button",{type:"button",onClick:()=>f(e),className:"rounded-full border border-primary/30 bg-primary/10 px-2 py-1 font-mono text-xs text-primary transition hover:bg-red-500/10 hover:text-red-600",title:"Click to remove",children:[e," ",(0,s.jsx)("span",{className:"ml-1",children:"\xd7"})]},e))})})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)(r.$n,{variant:"secondary",onClick:m,children:"Cancel"}),(0,s.jsx)(r.$n,{onClick:x,disabled:u||0===y.length,children:u?"Saving...":"Save models"})]})]})}),(0,s.jsx)(r.rq,{isOpen:h,onClose:()=>p(!1),onSelect:e=>{let t=e?.value||e?.name||e;t&&n(e=>d([...e,t]))},onDeselect:f,activeProviders:i,modelAliases:o,title:"Select allowed models",addedModelValues:y,closeOnSelect:!1})]})}function m(){let[e,t]=(0,l.useState)(null),[a,m]=(0,l.useState)([]),[x,u]=(0,l.useState)(!0),[h,p]=(0,l.useState)(""),[y,f]=(0,l.useState)(!1),[b,g]=(0,l.useState)(""),[j,v]=(0,l.useState)(""),[k,N]=(0,l.useState)(""),[w,C]=(0,l.useState)(""),[S,A]=(0,l.useState)(new Set),[P,$]=(0,l.useState)(null),[I,M]=(0,l.useState)([]),[D,O]=(0,l.useState)(""),[E,L]=(0,l.useState)(!1),[T,F]=(0,l.useState)(!1),[U,_]=(0,l.useState)(""),[K,B]=(0,l.useState)(""),[q,J]=(0,l.useState)(!1),[V,Z]=(0,l.useState)(!1),[H,R]=(0,l.useState)([]),[Y,z]=(0,l.useState)({}),[G,Q]=(0,l.useState)(null),[W,X]=(0,l.useState)([]),[ee,et]=(0,l.useState)(!1),{copied:ea,copy:es}=(0,n.C)(),el=e?.isAdmin!==!1,er=e?.userId||"",en=(0,l.useMemo)(()=>{let e=new Map;for(let t of I){let a=i(t.username||t.email||t.userPrincipalName||t.sAMAccountName);a&&e.set(a,{id:a,label:`${t.displayName||t.username||a}${t.email?` \xb7 ${t.email}`:""}`})}for(let t of a){let a=i(t.ownerUser||t.createdByUser);a&&!e.has(a)&&e.set(a,{id:a,label:a})}return er&&!e.has(er)&&e.set(er,{id:er,label:`${er} (me)`}),[...e.values()].sort((e,t)=>e.label.localeCompare(t.label))},[I,a,er]),ei=K!==U,ed=async()=>{let e=await fetch("/api/auth/status",{cache:"no-store"}),a=await e.json().catch(()=>({}));return t(a),!j&&a?.userId&&v(a.userId),a},eo=async()=>{u(!0),p("");try{let e=await fetch("/api/keys",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to load API keys");m(t.keys||[]);let a=String(t.apiKeyDefaultModel||"").trim();_(a),B(a)}catch(e){p(e.message||"Failed to load API keys")}finally{u(!1)}},ec=async()=>{try{let[e,t]=await Promise.allSettled([fetch("/api/providers",{cache:"no-store"}),fetch("/api/models/alias",{cache:"no-store"})]);if("fulfilled"===e.status&&e.value.ok){let t=await e.value.json().catch(()=>({}));R(t.connections||[])}if("fulfilled"===t.status&&t.value.ok){let e=await t.value.json().catch(()=>({}));z(e.aliases||{})}}catch{}},em=async(e=D)=>{if(el){L(!0);try{let t=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(e||"")}`,{cache:"no-store"}),a=await t.json().catch(()=>({}));t.ok&&M(a.users||[])}catch{}finally{L(!1)}}};(0,l.useEffect)(()=>{let e=!1;return(async()=>{let t=await ed();e||await Promise.all([eo(),ec()]),e||t?.isAdmin===!1||await em("")})(),()=>{e=!0}},[]);let ex=async()=>{if(el&&K.trim()){J(!0),p("");try{let e=await fetch("/api/keys",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKeyDefaultModel:K.trim()})}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to save default model");let a=String(t.apiKeyDefaultModel||"").trim();_(a),B(a)}catch(e){p(e.message||"Failed to save default model")}finally{J(!1)}}},eu=async()=>{if(b.trim()){if(!U.trim())return void p("Default API key model must be configured before creating API keys.");F(!0),p("");try{let e=el?i(k||j||er):void 0,t=await fetch("/api/keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:b.trim(),ownerUser:e})}),a=await t.json().catch(()=>({}));if(!t.ok)throw Error(a.error||"Failed to create key");C(a.key),g(""),N(""),f(!1),await eo()}catch(e){p(e.message||"Failed to create key")}finally{F(!1)}}},eh=async(e,t)=>{let a=await fetch(`/api/keys/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await a.json().catch(()=>({}));return a.ok?(await eo(),!0):(p(s.error||"Failed to update key"),!1)},ep=async()=>{if(!G)return;let e=d(W);if(0===e.length)return void p("Select at least one model before saving API key access.");et(!0),p("");try{await eh(G.id,{allowedModels:e})&&(Q(null),X([]))}finally{et(!1)}},ey=T||!b.trim()||!U.trim();return(0,s.jsxs)("div",{className:"space-y-6",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("h1",{className:"flex items-center gap-2 text-3xl font-bold text-text-main",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:"vpn_key"}),"API Key Management"]}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:el?"Admins can create API keys, assign owners, and control model access.":"You can manage API keys created by you or assigned to your account."})]}),(0,s.jsxs)(r.$n,{onClick:()=>f(!0),disabled:!U.trim(),children:[(0,s.jsx)("span",{className:"material-symbols-outlined mr-1 text-[18px]",children:"add"}),"Create API Key"]})]}),h?(0,s.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300",children:h}):null,(0,s.jsx)(r.Zp,{children:(0,s.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 text-lg font-semibold text-text-main",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-primary",children:"rule"}),"Default model for new API keys"]}),(0,s.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"New API keys are restricted to this model by default. The default model must be set before anyone can create API keys."}),(0,s.jsx)("div",{className:"mt-3",children:U?(0,s.jsx)("span",{className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 font-mono text-xs text-primary",children:U}):(0,s.jsx)("span",{className:"rounded-full bg-red-500/10 px-3 py-1 text-xs text-red-600",children:"No default model configured"})})]}),el?(0,s.jsxs)("div",{className:"flex flex-col gap-2 sm:min-w-[360px]",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{type:"button",onClick:()=>Z(!0),className:"min-w-0 flex-1 rounded-xl border border-border bg-background px-3 py-2 text-left font-mono text-xs text-text-main transition hover:border-primary/50",children:K||"Select default model..."}),(0,s.jsx)(r.$n,{onClick:ex,disabled:q||!K.trim()||!ei,children:q?"Saving...":"Save"})]}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:"Model picker includes provider models, custom models, aliases, and combos."})]}):null]})}),w?(0,s.jsx)(r.Zp,{className:"border-green-200 bg-green-50/60 dark:border-green-500/30 dark:bg-green-500/10",children:(0,s.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"font-semibold text-green-700 dark:text-green-300",children:"API key created"}),(0,s.jsx)("div",{className:"mt-1 break-all font-mono text-xs text-text-main",children:w}),(0,s.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:["Copy it now. New keys are restricted to ",U||"the default model"," unless an admin edits model access."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>es(w,"created"),children:"created"===ea?"Copied":"Copy"}),(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>C(""),children:"Dismiss"})]})]})}):null,(0,s.jsx)(r.Zp,{children:x?(0,s.jsxs)("div",{className:"py-10 text-center text-sm text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined mr-2 animate-spin align-middle",children:"progress_activity"}),"Loading API keys..."]}):0===a.length?(0,s.jsxs)("div",{className:"py-12 text-center text-sm text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined mb-2 block text-4xl",children:"vpn_key_off"}),"No API keys yet."]}):(0,s.jsx)("div",{className:"space-y-3",children:a.map(e=>{var t;let a=S.has(e.id),l=e.ownerUser||e.createdByUser||"unassigned",n=d(e.allowedModels);return(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-background p-4",children:(0,s.jsxs)("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[(0,s.jsxs)("div",{className:"min-w-0 flex-1 space-y-2",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsx)("h3",{className:"font-semibold text-text-main",children:e.name||"API Key"}),(0,s.jsx)("span",{className:`rounded-full px-2 py-0.5 text-xs ${e.isActive?"bg-green-500/10 text-green-600":"bg-red-500/10 text-red-600"}`,children:e.isActive?"Active":"Disabled"}),(0,s.jsxs)("span",{className:"rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary",children:["Owner: ",l]}),n.length>0?(0,s.jsxs)("span",{className:"rounded-full bg-blue-500/10 px-2 py-0.5 text-xs text-blue-600",children:[n.length," model(s)"]}):(0,s.jsx)("span",{className:"rounded-full bg-amber-500/10 px-2 py-0.5 text-xs text-amber-700",children:"Legacy full access"})]}),(0,s.jsx)("div",{className:"break-all font-mono text-xs text-text-muted",children:a?e.key:(t=e.key)?t.length>12?`${t.slice(0,8)}...${t.slice(-4)}`:t:""}),(0,s.jsxs)("div",{className:"text-xs text-text-muted",children:["Created: ",e.createdAt?new Date(e.createdAt).toLocaleString():"unknown",e.createdByUser?` \xb7 Created by: ${e.createdByUser}`:""]}),(0,s.jsx)("div",{className:"pt-1",children:(0,s.jsx)(o,{models:n,emptyLabel:"Legacy full model access"})})]}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsx)(r.lM,{checked:!1!==e.isActive,onChange:t=>eh(e.id,{isActive:t})}),(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>{var t;return t=e.id,void A(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})},children:a?"Hide":"Show"}),(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>es(e.key,e.id),children:ea===e.id?"Copied":"Copy"}),(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>{var t;let a;return t=e.id,a=prompt("New API key name",e.name||""),void(a?.trim()&&eh(t,{name:a.trim()}))},children:"Rename"}),el?(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>{el&&(Q(e),X(d(e.allowedModels)))},children:"Models"}):null,el?(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>((e,t)=>{if(!el)return;let a=prompt("Assign owner username/email",t||er||"");null!==a&&eh(e,{ownerUser:i(a)})})(e.id,l),children:"Assign"}):null,(0,s.jsx)(r.$n,{variant:"danger",onClick:()=>{var t;return t=e.id,void $({title:"Delete API Key",message:"Delete this API key? This cannot be undone.",onConfirm:async()=>{$(null),(await fetch(`/api/keys/${t}`,{method:"DELETE"})).ok&&m(e=>e.filter(e=>e.id!==t))}})},children:"Delete"})]})]})},e.id)})})}),(0,s.jsx)(r.aF,{isOpen:y,onClose:()=>f(!1),title:"Create API Key",children:(0,s.jsxs)("div",{className:"space-y-4",children:[U.trim()?(0,s.jsxs)("div",{className:"rounded-xl border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-700 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-300",children:["This key will be created with access to the default model only: ",(0,s.jsx)("span",{className:"font-mono",children:U}),"."]}):(0,s.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300",children:"Admin must set a default model before API keys can be created."}),(0,s.jsx)(r.pd,{label:"Name",value:b,onChange:e=>g(e.target.value),placeholder:"e.g. VSCode, LibreChat, team-user"}),el?(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Owner user"}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(r.pd,{value:D,onChange:e=>O(e.target.value),placeholder:"Search LDAP users"}),(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>em(D),disabled:E,children:E?"Loading":"Load"})]}),(0,s.jsxs)("select",{value:j,onChange:e=>v(e.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2 text-sm text-text-main outline-none focus:border-primary",children:[(0,s.jsxs)("option",{value:er,children:["Assign to me (",er||"local",")"]}),en.map(e=>(0,s.jsx)("option",{value:e.id,children:e.label},e.id))]}),(0,s.jsx)(r.pd,{label:"Manual owner override",value:k,onChange:e=>N(e.target.value),placeholder:"username or email, optional",hint:"Use this if LDAP search is unavailable or the user is not listed."})]}):(0,s.jsxs)("div",{className:"rounded-xl bg-surface-2 px-3 py-2 text-sm text-text-muted",children:["Owner: ",er||"current user"]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)(r.$n,{variant:"secondary",onClick:()=>f(!1),children:"Cancel"}),(0,s.jsx)(r.$n,{onClick:eu,disabled:ey,children:T?"Creating...":"Create"})]})]})}),(0,s.jsx)(c,{open:!!G,keyName:G?.name,models:W,setModels:X,activeProviders:H,modelAliases:Y,onClose:()=>{Q(null),X([])},onSave:ep,saving:ee}),(0,s.jsx)(r.rq,{isOpen:V,onClose:()=>Z(!1),onSelect:e=>{let t=String(e?.value||e?.name||e||"").trim();t&&(B(t),Z(!1))},activeProviders:H,modelAliases:Y,title:"Select default API key model",selectedModel:K,addedModelValues:K?[K]:[]}),P?(0,s.jsx)(r.uo,{isOpen:!0,onClose:()=>$(null),onConfirm:P.onConfirm,title:P.title,message:P.message,confirmText:"Delete",cancelText:"Cancel",variant:"danger"}):null]})}},84223:(e,t,a)=>{Promise.resolve().then(a.bind(a,56484))}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=84223)),_N_E=e.O()}]);
|
|
File without changes
|
/package/app/.next-cli-build/static/{co8Xecz4CsjwB1raRkxiM → OL2EoAoYy9N8kjE3nAQAA}/_ssgManifest.js
RENAMED
|
File without changes
|