@jheavenknows/bluerouter 2.0.47 → 2.0.48
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 +2 -2
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/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 +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/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/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 +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 +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/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/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/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/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 +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/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]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +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/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 +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 +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/analytics.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +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/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 +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.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 +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.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 +4 -4
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- 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 +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 +2 -2
- 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/5681.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/chunks/7795.js +1 -1
- package/app/.next-cli-build/server/chunks/9489.js +2 -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/{1321-8c2c5095637b3d2e.js → 1321-0cabc772a87548bd.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/page-da1f6f82eaaa1188.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/page-da1f6f82eaaa1188.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-677e8d2d39fe85c9.js +1 -0
- package/app/.next-cli-build/static/chunks/app/login/{page-5134676839e72d1b.js → page-7902d86d6a45535f.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/server/chunks/1219.js +0 -1
- package/app/.next-cli-build/static/chunks/8032-dcfc14566596f13a.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/page-283d64c061cc08e1.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/page-019bf097bba329a7.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-3d41333f5ccdfd9e.js +0 -1
- /package/app/.next-cli-build/static/{A0x1XuZjP0w3ZRZa8TH3g → xHze_wXftqJQPS7cBoQN4}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{A0x1XuZjP0w3ZRZa8TH3g → xHze_wXftqJQPS7cBoQN4}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.42-to-2.0.43-2.0.43-20260612-234341 → upgrade-2.0.47-to-2.0.48-2.0.48-20260613-113314}/data.sqlite +0 -0
|
@@ -0,0 +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)(),y=(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),j()},[]);let j=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. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,a.jsxs)(r.$n,{onClick:j,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:y.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:y.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:y.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:y.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, provider hay tunnel 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,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=18032)),_N_E=e.O()}]);
|
|
@@ -0,0 +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)(),y=(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),j()},[]);let j=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. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,a.jsxs)(r.$n,{onClick:j,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:y.base,copiedKey:"base",copied:b,copy:v}),(0,a.jsx)(c,{label:"Chat Completions",value:y.chat,copiedKey:"chat",copied:b,copy:v}),(0,a.jsx)(c,{label:"Models",value:y.models,copiedKey:"models",copied:b,copy:v}),(0,a.jsx)(c,{label:"Health",value:y.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, provider hay tunnel 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,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=18032)),_N_E=e.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-677e8d2d39fe85c9.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,s)=>{Promise.resolve().then(s.bind(s,64561))},64561:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>p});var t=s(95155),l=s(12115);let r="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))";function d({status:e}){if(!e?.message)return null;let a="error"===e.type?"text-red-600 bg-red-50 border-red-200":"text-green-700 bg-green-50 border-green-200";return(0,t.jsx)("div",{className:`mt-3 rounded-xl border px-4 py-3 text-sm ${a}`,children:e.message})}function o({icon:e,title:a,desc:s,children:l}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,t.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),s&&(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:s})]})]}),l]})}function n({label:e,hint:a,children:s}){return(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),s,a&&(0,t.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function i(e){return(0,t.jsx)("input",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function c({title:e,desc:a,checked:s,onChange:l,disabled:r}){return(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,t.jsx)("button",{type:"button",disabled:r,onClick:()=>l(!s),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${s?"bg-primary":"bg-border"}`,children:(0,t.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${s?"left-5":"left-0.5"}`})})]})}function p(){let[e,a]=(0,l.useState)({}),[s,p]=(0,l.useState)(!0),[u,m]=(0,l.useState)({current:"",new:"",confirm:""}),[x,b]=(0,l.useState)({type:"",message:""}),[h,g]=(0,l.useState)(!1),[y,j]=(0,l.useState)(!1),[w,v]=(0,l.useState)({type:"",message:""}),D=(0,l.useRef)(null),[f,A]=(0,l.useState)("admin"),[N,C]=(0,l.useState)({type:"",message:""}),[U,L]=(0,l.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:r,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[S,k]=(0,l.useState)({type:"",message:""}),[P,I]=(0,l.useState)(!1),[O,G]=(0,l.useState)(!1),[B,M]=(0,l.useState)(""),[E,T]=(0,l.useState)([]),[R,F]=(0,l.useState)(!1),[_,$]=(0,l.useState)({authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC"}),[q,z]=(0,l.useState)(""),[J,K]=(0,l.useState)({type:"",message:""}),[H,Q]=(0,l.useState)(!1),[V,W]=(0,l.useState)(!1),X=async()=>{p(!0);try{let e=await fetch("/api/settings",{cache:"no-store"}),s=await e.json();a(s),A(s.localLoginUsername||"admin"),L({ldapEnabled:!0===s.ldapEnabled,ldapUrl:s.ldapUrl||"",ldapBindDn:s.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:s.ldapUserBaseDn||s.ldapBaseDn||"",ldapUserSearchFilter:s.ldapUserSearchFilter||r,ldapUserNameAttribute:s.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:s.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:s.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:s.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:s.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:s.ldapMonitorAdminGroupDn||"",ldapNestedGroups:!1!==s.ldapNestedGroups,ldapAllowedUsers:Array.isArray(s.ldapAllowedUsers)?s.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==s.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:s.ldapConnectTimeoutMs||8e3}),$({authMode:s.authMode||"password",oidcIssuerUrl:s.oidcIssuerUrl||"",oidcClientId:s.oidcClientId||"",oidcScopes:s.oidcScopes||"openid profile email",oidcLoginLabel:s.oidcLoginLabel||"Sign in with OIDC"}),("oidc"===s.authMode||"both"===s.authMode)&&W(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{p(!1)}};(0,l.useEffect)(()=>{X()},[]);let Y=async e=>{let s=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Failed to save settings");return a(e=>({...e,...t})),t},Z=async e=>{e.preventDefault(),C({type:"",message:""});try{let e=await Y({localLoginUsername:f});A(e.localLoginUsername||f||"admin"),C({type:"success",message:"Local account name saved."})}catch(e){C({type:"error",message:e.message})}},ee=async e=>{if(e.preventDefault(),u.new!==u.confirm)return void b({type:"error",message:"Passwords do not match"});g(!0),b({type:"",message:""});try{await Y({currentPassword:u.current,newPassword:u.new}),b({type:"success",message:"Password updated successfully"}),m({current:"",new:"",confirm:""})}catch(e){b({type:"error",message:e.message||"Failed to update password"})}finally{g(!1)}},ea=async()=>{j(!0),v({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let a=await e.json().catch(()=>({}));throw Error(a.error||"Failed to export database")}let a=await e.json(),s=JSON.stringify(a,null,2),t=new Blob([s],{type:"application/json"}),l=URL.createObjectURL(t),r=document.createElement("a"),d=new Date().toISOString().replace(/[.:]/g,"-");r.href=l,r.download=`bluerouter-backup-${d}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(l),v({type:"success",message:"Database backup downloaded."})}catch(e){v({type:"error",message:e.message||"Failed to export database."})}finally{j(!1)}},es=async e=>{let a=e.target.files?.[0];if(a){j(!0),v({type:"",message:""});try{let e=await a.text(),s=JSON.parse(e),t=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),l=await t.json().catch(()=>({}));if(!t.ok)throw Error(l.error||"Failed to import database");await X(),v({type:"success",message:"Database imported successfully."})}catch(e){v({type:"error",message:e.message||"Invalid backup file."})}finally{D.current&&(D.current.value=""),j(!1)}}},et=(e,a)=>L(s=>({...s,[e]:a})),el=async e=>{e?.preventDefault?.(),I(!0),k({type:"",message:""});try{let e={...U,ldapBaseDn:U.ldapUserBaseDn,ldapAllowedUsers:U.ldapAllowedUsers};e.ldapBindPassword||delete e.ldapBindPassword;let a=await Y(e);L(e=>({...e,ldapBindPassword:"",ldapEnabled:!0===a.ldapEnabled,ldapUserBaseDn:a.ldapUserBaseDn||a.ldapBaseDn||e.ldapUserBaseDn,ldapLoginAllowedGroupDn:a.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:a.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:a.ldapMonitorAdminGroupDn||"",ldapNestedGroups:!1!==a.ldapNestedGroups,ldapAllowedUsers:Array.isArray(a.ldapAllowedUsers)?a.ldapAllowedUsers:e.ldapAllowedUsers})),k({type:"success",message:"LDAP settings saved."})}catch(e){k({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{I(!1)}},er=async()=>{G(!0),k({type:"",message:""});try{await el();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?k({type:"success",message:a.message||"LDAP connection OK."}):k({type:"error",message:a.error||"LDAP test failed."})}catch(e){k({type:"error",message:e.message||"LDAP test failed."})}finally{G(!1)}},ed=async()=>{F(!0),k({type:"",message:""});try{await el();let e=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(B)}`,{cache:"no-store"}),a=await e.json().catch(()=>({}));e.ok?(T(a.users||[]),k({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):k({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){k({type:"error",message:e.message||"Failed to load LDAP users."})}finally{F(!1)}},eo=e=>{let a=String(e||"").trim();a&&L(e=>{let s=new Set(e.ldapAllowedUsers||[]);return s.has(a)?s.delete(a):s.add(a),{...e,ldapAllowedUsers:[...s]}})},en=async(a=_.authMode||"password")=>{let s=_.oidcIssuerUrl.trim(),t=_.oidcClientId.trim(),l=_.oidcScopes.trim(),r=_.oidcLoginLabel.trim(),d=q.trim();if("password"!==a&&(!s||!t||!d)&&!e.oidcConfigured)return void K({type:"error",message:"Issuer URL, client ID, and client secret are required to enable OIDC."});Q(!0),K({type:"",message:""});try{let e={authMode:a,oidcIssuerUrl:s,oidcClientId:t,oidcScopes:l||"openid profile email",oidcLoginLabel:r||"Sign in with OIDC"};d&&(e.oidcClientSecret=d);let o=await Y(e);$({authMode:o.authMode||a,oidcIssuerUrl:o.oidcIssuerUrl||s,oidcClientId:o.oidcClientId||t,oidcScopes:o.oidcScopes||l||"openid profile email",oidcLoginLabel:o.oidcLoginLabel||r||"Sign in with OIDC"}),z(""),K({type:"success",message:"OIDC settings saved."})}catch(e){K({type:"error",message:e.message||"Failed to save OIDC settings"})}finally{Q(!1)}};return s?(0,t.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,t.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,t.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure local dashboard login, LDAP/Active Directory login, and OIDC login."})]}),(0,t.jsx)(o,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("form",{onSubmit:Z,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,t.jsx)(n,{label:"Local username",children:(0,t.jsx)(i,{value:f,onChange:e=>A(e.target.value)})}),(0,t.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,t.jsx)(d,{status:N})]}),(0,t.jsxs)("form",{onSubmit:ee,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,t.jsx)(n,{label:"Current password",children:(0,t.jsx)(i,{type:"password",value:u.current,onChange:e=>m({...u,current:e.target.value}),required:!0})}),(0,t.jsx)(n,{label:"New password",children:(0,t.jsx)(i,{type:"password",value:u.new,onChange:e=>m({...u,new:e.target.value}),required:!0})}),(0,t.jsx)(n,{label:"Confirm password",children:(0,t.jsx)(i,{type:"password",value:u.confirm,onChange:e=>m({...u,confirm:e.target.value}),required:!0})}),(0,t.jsx)("button",{disabled:h,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:e.hasPassword?"Update Password":"Set Password"}),(0,t.jsx)(d,{status:x})]})]})}),(0,t.jsxs)(o,{icon:"database",title:"Database Backup",desc:"Export or restore the local bluerouter configuration database.",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsx)("button",{onClick:ea,disabled:y,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Backup"}),(0,t.jsx)("button",{onClick:()=>D.current?.click(),disabled:y,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-primary/50 disabled:opacity-50",children:"Import Backup"}),(0,t.jsx)("input",{ref:D,type:"file",accept:"application/json",className:"hidden",onChange:es})]}),(0,t.jsx)(d,{status:w})]}),(0,t.jsx)(o,{icon:"corporate_fare",title:"LDAP / Active Directory Login",desc:"Search users from a User Base DN, restrict login by group DN, and grant admin by group DN. The old Selected LDAP users list is kept as a manual admin list.",children:(0,t.jsxs)("form",{onSubmit:el,className:"space-y-5",children:[(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,t.jsx)("button",{type:"button",onClick:()=>et("ldapEnabled",!U.ldapEnabled),className:`rounded-xl px-3 py-2 text-sm font-semibold ${U.ldapEnabled?"bg-primary text-white":"border border-border text-text-muted"}`,children:U.ldapEnabled?"Enabled":"Disabled"})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(n,{label:"LDAP URL",children:(0,t.jsx)(i,{value:U.ldapUrl,onChange:e=>et("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,t.jsx)(n,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,t.jsx)(i,{value:U.ldapUserBaseDn,onChange:e=>et("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(n,{label:"LDAP Bind DN",children:(0,t.jsx)(i,{value:U.ldapBindDn,onChange:e=>et("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,t.jsx)(n,{label:"LDAP Bind Password",children:(0,t.jsx)(i,{type:"password",value:U.ldapBindPassword,onChange:e=>et("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,t.jsx)(n,{label:"LDAP Login Allowed Group DN",hint:"Only members of this group can log in. Leave blank to allow any valid LDAP user.",children:(0,t.jsx)(i,{value:U.ldapLoginAllowedGroupDn,onChange:e=>et("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(n,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,t.jsx)(i,{value:U.ldapAdminGroupDn,onChange:e=>et("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(n,{label:"LDAP Monitor Admin Group DN",hint:"Members can use only Endpoint, API Keys, Usage, Analytics, Quota Tracker and Prompt Logs with admin-like permissions inside those tabs.",children:(0,t.jsx)(i,{value:U.ldapMonitorAdminGroupDn,onChange:e=>et("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})})]}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(n,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,t.jsx)(i,{value:U.ldapUserSearchFilter,onChange:e=>et("ldapUserSearchFilter",e.target.value)})}),(0,t.jsx)(n,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,t.jsx)(c,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:U.ldapNestedGroups,onChange:e=>et("ldapNestedGroups",e)})}),(0,t.jsx)(n,{label:"Username attribute",children:(0,t.jsx)(i,{value:U.ldapUserNameAttribute,onChange:e=>et("ldapUserNameAttribute",e.target.value)})}),(0,t.jsx)(n,{label:"Display attribute",children:(0,t.jsx)(i,{value:U.ldapUserDisplayAttribute,onChange:e=>et("ldapUserDisplayAttribute",e.target.value)})}),(0,t.jsx)(n,{label:"Email attribute",children:(0,t.jsx)(i,{value:U.ldapUserEmailAttribute,onChange:e=>et("ldapUserEmailAttribute",e.target.value)})}),(0,t.jsx)(n,{label:"Connect timeout ms",children:(0,t.jsx)(i,{type:"number",value:U.ldapConnectTimeoutMs,onChange:e=>et("ldapConnectTimeoutMs",e.target.value)})})]}),(0,t.jsx)(c,{title:"Reject invalid TLS certificates",desc:"Disable only for test/self-signed LDAP TLS.",checked:U.ldapTlsRejectUnauthorized,onChange:e=>et("ldapTlsRejectUnauthorized",e)}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Users loaded here come from Login Allowed Group DN when set. Selected users are also treated as manual admins for backward compatibility."})]}),(0,t.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,t.jsx)(i,{value:B,onChange:e=>M(e.target.value),placeholder:"Search users..."}),(0,t.jsx)("button",{type:"button",onClick:ed,disabled:R,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:R?"Loading...":"Load users"})]}),E.length>0&&(0,t.jsx)("div",{className:"max-h-72 overflow-auto rounded-xl border border-border",children:E.map(e=>{let a=U.ldapAllowedUsers.includes(e.username);return(0,t.jsxs)("button",{type:"button",onClick:()=>eo(e.username),className:`flex w-full items-center justify-between gap-3 border-b border-border px-3 py-2 text-left text-sm last:border-b-0 ${a?"bg-primary/10":"bg-background hover:bg-surface"}`,children:[(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,t.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:["Selected manual admin users (",U.ldapAllowedUsers.length,")"]}),0===U.ldapAllowedUsers.length?(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:U.ldapAllowedUsers.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>eo(e),className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs text-primary",children:[e," \xd7"]},e))})]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:er,disabled:O,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:O?"Testing...":"Save & test LDAP"}),(0,t.jsx)("button",{type:"submit",disabled:P,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:P?"Saving...":"Save LDAP settings"})]}),(0,t.jsx)(d,{status:S})]})}),(0,t.jsxs)(o,{icon:"lock_open",title:"OIDC Dashboard Login",desc:"oidc"===e.authMode?"OIDC active":"both"===e.authMode?"Password + OIDC active":"Optional SSO via Authentik/Keycloak/Google",children:[(0,t.jsx)("button",{type:"button",onClick:()=>W(e=>!e),className:"mb-4 rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main",children:V?"Hide OIDC settings":"Show OIDC settings"}),V&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:[{value:"password",title:"Password/LDAP",desc:"Keep local and LDAP login."},{value:"oidc",title:"OIDC only",desc:"Disable local/LDAP login when configured."},{value:"both",title:"Both",desc:"Allow either OIDC or local/LDAP."}].map(e=>{let a=_.authMode===e.value;return(0,t.jsxs)("button",{type:"button",onClick:()=>$(a=>({...a,authMode:e.value})),className:`rounded-xl border p-3 text-left ${a?"border-primary bg-primary/10":"border-border bg-background hover:border-primary/40"}`,children:[(0,t.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(n,{label:"Issuer URL",children:(0,t.jsx)(i,{value:_.oidcIssuerUrl,onChange:e=>$({..._,oidcIssuerUrl:e.target.value})})}),(0,t.jsx)(n,{label:"Client ID",children:(0,t.jsx)(i,{value:_.oidcClientId,onChange:e=>$({..._,oidcClientId:e.target.value})})}),(0,t.jsx)(n,{label:"Client Secret",children:(0,t.jsx)(i,{type:"password",value:q,onChange:e=>z(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,t.jsx)(n,{label:"Scopes",children:(0,t.jsx)(i,{value:_.oidcScopes,onChange:e=>$({..._,oidcScopes:e.target.value})})}),(0,t.jsx)(n,{label:"Login label",children:(0,t.jsx)(i,{value:_.oidcLoginLabel,onChange:e=>$({..._,oidcLoginLabel:e.target.value})})})]}),(0,t.jsx)("button",{type:"button",onClick:()=>en(),disabled:H,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:H?"Saving...":"Save OIDC settings"}),(0,t.jsx)(d,{status:J})]})]})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4520],{33796:(e,t,r)=>{Promise.resolve().then(r.bind(r,83016))},73321:(e,t,r)=>{"use strict";var s=r(74645);r.o(s,"notFound")&&r.d(t,{notFound:function(){return s.notFound}}),r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},83016:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>n});var s=r(95155),a=r(12115),o=r(73321);function n(){let[e,t]=(0,a.useState)("admin"),[r,n]=(0,a.useState)(""),[l,d]=(0,a.useState)(""),[i,u]=(0,a.useState)(""),[c,x]=(0,a.useState)(0),[b,m]=(0,a.useState)(!1),[p,h]=(0,a.useState)(null),[f
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4520],{33796:(e,t,r)=>{Promise.resolve().then(r.bind(r,83016))},73321:(e,t,r)=>{"use strict";var s=r(74645);r.o(s,"notFound")&&r.d(t,{notFound:function(){return s.notFound}}),r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},83016:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>n});var s=r(95155),a=r(12115),o=r(73321);function n(){let[e,t]=(0,a.useState)("admin"),[r,n]=(0,a.useState)(""),[l,d]=(0,a.useState)(""),[i,u]=(0,a.useState)(""),[c,x]=(0,a.useState)(0),[b,m]=(0,a.useState)(!1),[p,h]=(0,a.useState)(null),[g,f]=(0,a.useState)("password"),[y,w]=(0,a.useState)(!1),[j,N]=(0,a.useState)("Sign in with OIDC"),[v,S]=(0,a.useState)(!1),[k,P]=(0,a.useState)(!1),[C,I]=(0,a.useState)("admin"),L=(0,o.useRouter)();(0,a.useEffect)(()=>{if(c<=0)return;let e=setInterval(()=>x(e=>e>0?e-1:0),1e3);return()=>clearInterval(e)},[c]),(0,a.useEffect)(()=>{!async function(){let e=new AbortController,r=setTimeout(()=>e.abort(),5e3),s=window.location.origin;try{let a=await fetch(`${s}/api/auth/status`,{signal:e.signal});if(clearTimeout(r),a.ok){let e=await a.json();h(!!e.hasPassword),f(e.authMode||"password"),w(!0===e.oidcConfigured),N(e.oidcLoginLabel||"Sign in with OIDC"),S(!0===e.ldapEnabled),P(!0===e.ldapConfigured),I(e.localLoginUsername||"admin"),t(e.localLoginUsername||"admin")}else h(!0)}catch{clearTimeout(r),h(!0)}}()},[L]);let O=async t=>{t.preventDefault(),m(!0),d(""),u("");try{let t=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,password:r,loginType:"auto"})});if(t.ok)L.push("/dashboard"),L.refresh();else{let e=await t.json();d(e.error||"Invalid account or password"),e.resetHint&&u(e.resetHint),e.retryAfter&&x(Number(e.retryAfter))}}catch{d("An error occurred. Please try again.")}finally{m(!1)}},D=y&&["oidc","both"].includes(g),E="oidc"!==g||!y,R=v&&k&&E;return null===p?(0,s.jsx)("div",{className:"flex min-h-screen items-center justify-center text-text-muted",children:"Loading..."}):(0,s.jsxs)("div",{className:"relative flex min-h-screen items-center justify-center bg-background px-4 py-10",children:[(0,s.jsx)("div",{className:"pointer-events-none absolute inset-0 opacity-[0.35]",style:{backgroundImage:"linear-gradient(to right, rgba(231, 111, 81, 0.12) 1px, transparent 1px), linear-gradient(to bottom, rgba(231, 111, 81, 0.12) 1px, transparent 1px)",backgroundSize:"48px 48px"}}),(0,s.jsxs)("div",{className:"relative w-full max-w-md",children:[(0,s.jsx)("div",{className:"mb-8 text-center",children:(0,s.jsx)("h1",{className:"text-4xl font-bold text-primary",children:"Blue Router Gateway"})}),(0,s.jsxs)("div",{className:"rounded-3xl border border-border bg-surface p-6 shadow-xl",children:[D&&(0,s.jsxs)("button",{type:"button",onClick:()=>{window.location.href="/api/auth/oidc/start"},className:"mb-4 flex w-full items-center justify-center gap-2 rounded-xl border border-border bg-background px-4 py-3 text-sm font-semibold text-text-main transition hover:border-primary/50",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"lock_open"}),j]}),D&&E&&(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3 text-xs text-text-muted",children:[(0,s.jsx)("span",{className:"h-px flex-1 bg-border"}),"or",(0,s.jsx)("span",{className:"h-px flex-1 bg-border"})]}),E?(0,s.jsxs)("form",{onSubmit:O,className:"space-y-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1.5 block text-sm font-semibold text-text-main",children:"Account"}),(0,s.jsx)("input",{value:e,onChange:e=>t(e.target.value),placeholder:R?"admin or your LDAP username":C||"admin",autoFocus:!D,required:!0,className:"w-full rounded-xl border border-border bg-background px-4 py-3 text-base outline-none transition focus:border-primary focus:ring-4 focus:ring-primary/15"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1.5 block text-sm font-semibold text-text-main",children:"Password"}),(0,s.jsx)("input",{type:"password",value:r,onChange:e=>n(e.target.value),placeholder:"Enter password",required:!0,className:"w-full rounded-xl border border-border bg-background px-4 py-3 text-base outline-none transition focus:border-primary focus:ring-4 focus:ring-primary/15"})]}),"oidc"===g&&!y&&(0,s.jsx)("p",{className:"rounded-xl border border-yellow-500/30 bg-yellow-500/10 p-3 text-xs text-yellow-700 dark:text-yellow-300",children:"OIDC login is enabled, but the issuer/client fields are not configured yet. Password login is still available for recovery."}),"both"===g&&y&&(0,s.jsx)("p",{className:"rounded-xl border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-700 dark:text-blue-300",children:"Password/OIDC login are both enabled."}),l&&(0,s.jsx)("p",{className:"rounded-xl border border-red-500/30 bg-red-500/10 p-3 text-sm text-red-600",children:l}),c>0&&(0,s.jsxs)("p",{className:"rounded-xl border border-red-500/30 bg-red-500/10 p-3 text-sm text-red-600",children:["Locked. Retry in ",c,"s."]}),i&&(0,s.jsxs)("p",{className:"rounded-xl border border-border bg-background p-3 text-xs text-text-muted",children:["Forgot password? Open ",(0,s.jsx)("span",{className:"font-mono",children:"bluerouter"})," CLI on the host → Settings → Reset Password to Default."]}),(0,s.jsx)("button",{type:"submit",disabled:b||c>0,className:"w-full rounded-xl bg-primary px-4 py-3 text-base font-semibold text-white shadow-sm transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",children:c>0?`Wait ${c}s`:b?"Signing in...":"Login"}),!1===p&&(0,s.jsx)("p",{className:"text-center text-xs text-text-muted",children:"No custom password is set yet. The default password above will work until you change it."})]}):l&&(0,s.jsx)("p",{className:"rounded-xl border border-red-500/30 bg-red-500/10 p-3 text-sm text-red-600",children:l})]})]})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=33796)),_N_E=e.O()}]);
|
|
Binary file
|
|
Binary file
|
package/app/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=1219,exports.ids=[1219],exports.modules={16904:(a,b,c)=>{Promise.resolve().then(c.bind(c,51747))},43173:(a,b,c)=>{"use strict";c.d(b,{default:()=>o});var d=c(48249),e=c(67484),f=c(49885),g=c.n(f),h=c(2116),i=c.n(h),j=c(50412),k=c(50377);let l=[{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 m({label:a,value:b,copiedKey:c,copied:e,copy:f}){return(0,d.jsxs)("div",{className:"rounded-xl border border-border bg-background p-3",children:[(0,d.jsx)("div",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-text-muted",children:a}),(0,d.jsxs)("div",{className:"flex min-w-0 items-center gap-2",children:[(0,d.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:b}),(0,d.jsx)("button",{type:"button",onClick:()=>f(b,c),className:"rounded-lg border border-border px-2 py-2 text-text-muted transition hover:border-primary hover:text-primary",title:"Copy",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:e===c?"check":"content_copy"})})]})]})}function n({title:a,description:b}){return(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h3",{className:"font-semibold text-text-main",children:a}),(0,d.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:b})]}),(0,d.jsx)("span",{className:"shrink-0 rounded-full border border-emerald-500/30 bg-emerald-500/10 px-3 py-1 text-xs font-semibold text-emerald-600",children:"Bắt buộc"})]})}function o({machineId:a}){let[b,c]=(0,e.useState)(!0),[f,g]=(0,e.useState)(""),[h,p]=(0,e.useState)(""),[q,r]=(0,e.useState)({requireApiKey:!0,requireLogin:!0,hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:s,copy:t}=(0,k.C)(),u=(0,e.useMemo)(()=>(function(a=""){let b=a?`${a.replace(/\/$/,"")}/v1`:"/v1";return{base:b,chat:`${b}/chat/completions`,models:`${b}/models`,health:a?`${a.replace(/\/$/,"")}/api/health`:"/api/health"}})(h),[h]),v=async()=>{c(!0);try{let a=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),b=await a.json();a.ok&&r(a=>({...a,...b,requireApiKey:!0,requireLogin:!0}))}catch(a){console.log("Error loading endpoint settings:",a)}finally{c(!1)}},w=async(a,b="")=>{g(b);try{let b=await fetch("/api/dashboard/endpoint",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),c=await b.json();b.ok?r(a=>({...a,...c,requireApiKey:!0,requireLogin:!0})):alert(c.error||"Cập nhật thiết lập thất bại")}catch(a){console.log("Error updating endpoint settings:",a),alert("Cập nhật thiết lập thất bại")}finally{g("")}};return b?(0,d.jsxs)("div",{className:"space-y-6",children:[(0,d.jsx)(j.Qv,{}),(0,d.jsx)(j.Qv,{}),(0,d.jsx)(j.Qv,{})]}):(0,d.jsxs)("div",{className:"space-y-6",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h1",{className:"text-2xl font-bold text-text-main",children:"Endpoint"}),(0,d.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Endpoint nội bộ để tool gọi BlueRouter theo chuẩn OpenAI-compatible. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,d.jsxs)(j.$n,{onClick:v,variant:"ghost",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,d.jsxs)(j.Zp,{children:[(0,d.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,d.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,d.jsx)("span",{className:"material-symbols-outlined",children:"hub"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Th\xf4ng tin API endpoint"}),(0,d.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,d.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,d.jsx)(m,{label:"Base URL",value:u.base,copiedKey:"base",copied:s,copy:t}),(0,d.jsx)(m,{label:"Chat Completions",value:u.chat,copiedKey:"chat",copied:s,copy:t}),(0,d.jsx)(m,{label:"Models",value:u.models,copiedKey:"models",copied:s,copy:t}),(0,d.jsx)(m,{label:"Health",value:u.health,copiedKey:"health",copied:s,copy:t})]}),(0,d.jsxs)("p",{className:"mt-4 text-xs text-text-muted",children:["Machine ID: ",(0,d.jsx)("code",{className:"rounded bg-surface px-1.5 py-0.5",children:a||"unknown"})]})]}),(0,d.jsxs)(j.Zp,{children:[(0,d.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,d.jsx)("div",{className:"rounded-2xl bg-amber-500/10 p-3 text-amber-600",children:(0,d.jsx)("span",{className:"material-symbols-outlined",children:"security"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Bảo mật truy cập"}),(0,d.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Hai lớp bảo vệ n\xe0y l\xe0 bắt buộc cho hệ thống nội bộ, kh\xf4ng cho tắt từ Dashboard."})]})]}),!q.hasPassword&&(0,d.jsx)("div",{className:"mb-4 rounded-xl border border-red-500/30 bg-red-500/10 p-3 text-sm text-red-600",children:"Dashboard đang bật y\xeau cầu đăng nhập nhưng chưa c\xf3 mật khẩu. H\xe3y v\xe0o Profile/Settings để đặt mật khẩu ngay."}),(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)(n,{title:"Y\xeau cầu API key",description:"Request kh\xf4ng c\xf3 Bearer token hợp lệ sẽ bị từ chối. Đ\xe2y l\xe0 cấu h\xecnh bắt buộc."}),(0,d.jsx)(n,{title:"Y\xeau cầu đăng nhập dashboard",description:"Bảo vệ c\xe1c trang dashboard bằng t\xe0i khoản đăng nhập. Kh\xf4ng cho tắt đăng nhập dashboard."})]}),(0,d.jsx)("div",{className:"mt-4 rounded-xl border border-border bg-surface/50 p-4",children:(0,d.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h3",{className:"font-semibold text-text-main",children:"Quản l\xfd API keys"}),(0,d.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Tạo key, giới hạn model, policy/limit, API Test/curl v\xe0 ph\xe2n quyền user ở trang API Keys."})]}),(0,d.jsx)(i(),{href:"/dashboard/api-keys",children:(0,d.jsxs)(j.$n,{variant:"outline",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"vpn_key"}),"Mở API Keys"]})})]})})]}),(0,d.jsxs)(j.Zp,{children:[(0,d.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,d.jsx)("div",{className:"rounded-2xl bg-primary/10 p-3 text-primary",children:(0,d.jsx)("span",{className:"material-symbols-outlined",children:"bolt"})}),(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Token Saver"}),(0,d.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, provider hay tunnel status."})]})]}),(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h3",{className:"font-semibold text-text-main",children:"RTK tool output compression"}),(0,d.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,d.jsx)(j.lM,{checked:!1!==q.rtkEnabled,onChange:a=>w({rtkEnabled:a},"rtkEnabled"),disabled:"rtkEnabled"===f})]}),(0,d.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h3",{className:"font-semibold text-text-main",children:"Caveman output compression"}),(0,d.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,d.jsx)(j.lM,{checked:!!q.cavemanEnabled,onChange:a=>w({cavemanEnabled:a},"cavemanEnabled"),disabled:"cavemanEnabled"===f})]}),q.cavemanEnabled&&(0,d.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:l.map(a=>(0,d.jsx)("button",{type:"button",onClick:()=>w({cavemanLevel:a.id},"cavemanLevel"),title:a.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${q.cavemanLevel===a.id?"border-primary bg-primary text-white":"border-border text-text-muted hover:border-primary hover:text-primary"}`,children:a.label},a.id))})]})]})]})]})}m.propTypes={label:g().string.isRequired,value:g().string.isRequired,copiedKey:g().string.isRequired,copied:g().string,copy:g().func.isRequired},n.propTypes={title:g().string.isRequired,description:g().string.isRequired},o.propTypes={machineId:g().string}},51747:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call the default export of \"D:\\\\bluerouter\\\\src\\\\app\\\\(dashboard)\\\\dashboard\\\\endpoint\\\\EndpointPageClient.js\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"D:\\bluerouter\\src\\app\\(dashboard)\\dashboard\\endpoint\\EndpointPageClient.js","default")},80456:(a,b,c)=>{Promise.resolve().then(c.bind(c,43173))}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8032],{18032:(e,t,s)=>{Promise.resolve().then(s.bind(s,95907))},95907:(e,t,s)=>{"use strict";s.d(t,{default:()=>p});var a=s(95155),n=s(12115),l=s(14051),i=s.n(l),r=s(98500),d=s.n(r),c=s(35497),o=s(11059);let m=[{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 x({label:e,value:t,copiedKey:s,copied:n,copy:l}){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:()=>l(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:n===s?"check":"content_copy"})})]})]})}function h({title:e,description:t}){return(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border bg-background p-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-text-main",children:e}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:t})]}),(0,a.jsx)("span",{className:"shrink-0 rounded-full border border-emerald-500/30 bg-emerald-500/10 px-3 py-1 text-xs font-semibold text-emerald-600",children:"Bắt buộc"})]})}function p({machineId:e}){let[t,s]=(0,n.useState)(!0),[l,i]=(0,n.useState)(""),[r,u]=(0,n.useState)(""),[b,g]=(0,n.useState)({requireApiKey:!0,requireLogin:!0,hasPassword:!0,rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",apiKeyDefaultModel:""}),{copied:j,copy:y}=(0,o.C)(),v=(0,n.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"}})(r),[r]);(0,n.useEffect)(()=>{u(window.location.origin),f()},[]);let f=async()=>{s(!0);try{let e=await fetch("/api/dashboard/endpoint",{cache:"no-store"}),t=await e.json();e.ok&&g(e=>({...e,...t,requireApiKey:!0,requireLogin:!0}))}catch(e){console.log("Error loading endpoint settings:",e)}finally{s(!1)}},N=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?g(e=>({...e,...s,requireApiKey:!0,requireLogin:!0})):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)(c.Qv,{}),(0,a.jsx)(c.Qv,{}),(0,a.jsx)(c.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. Cloudflare Tunnel v\xe0 Tailscale đ\xe3 được bỏ khỏi trang n\xe0y để dashboard load nhẹ hơn."})]}),(0,a.jsxs)(c.$n,{onClick:f,variant:"ghost",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"refresh"}),"L\xe0m mới"]})]}),(0,a.jsxs)(c.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)(x,{label:"Base URL",value:v.base,copiedKey:"base",copied:j,copy:y}),(0,a.jsx)(x,{label:"Chat Completions",value:v.chat,copiedKey:"chat",copied:j,copy:y}),(0,a.jsx)(x,{label:"Models",value:v.models,copiedKey:"models",copied:j,copy:y}),(0,a.jsx)(x,{label:"Health",value:v.health,copiedKey:"health",copied:j,copy:y})]}),(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)(c.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4 flex items-start gap-3",children:[(0,a.jsx)("div",{className:"rounded-2xl bg-amber-500/10 p-3 text-amber-600",children:(0,a.jsx)("span",{className:"material-symbols-outlined",children:"security"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-main",children:"Bảo mật truy cập"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Hai lớp bảo vệ n\xe0y l\xe0 bắt buộc cho hệ thống nội bộ, kh\xf4ng cho tắt từ Dashboard."})]})]}),!b.hasPassword&&(0,a.jsx)("div",{className:"mb-4 rounded-xl border border-red-500/30 bg-red-500/10 p-3 text-sm text-red-600",children:"Dashboard đang bật y\xeau cầu đăng nhập nhưng chưa c\xf3 mật khẩu. H\xe3y v\xe0o Profile/Settings để đặt mật khẩu ngay."}),(0,a.jsxs)("div",{className:"space-y-3",children:[(0,a.jsx)(h,{title:"Y\xeau cầu API key",description:"Request kh\xf4ng c\xf3 Bearer token hợp lệ sẽ bị từ chối. Đ\xe2y l\xe0 cấu h\xecnh bắt buộc."}),(0,a.jsx)(h,{title:"Y\xeau cầu đăng nhập dashboard",description:"Bảo vệ c\xe1c trang dashboard bằng t\xe0i khoản đăng nhập. Kh\xf4ng cho tắt đăng nhập dashboard."})]}),(0,a.jsx)("div",{className:"mt-4 rounded-xl border border-border bg-surface/50 p-4",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)("h3",{className:"font-semibold text-text-main",children:"Quản l\xfd API keys"}),(0,a.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Tạo key, giới hạn model, policy/limit, API Test/curl v\xe0 ph\xe2n quyền user ở trang API Keys."})]}),(0,a.jsx)(d(),{href:"/dashboard/api-keys",children:(0,a.jsxs)(c.$n,{variant:"outline",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"vpn_key"}),"Mở API Keys"]})})]})})]}),(0,a.jsxs)(c.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, provider hay tunnel 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)(c.lM,{checked:!1!==b.rtkEnabled,onChange:e=>N({rtkEnabled:e},"rtkEnabled"),disabled:"rtkEnabled"===l})]}),(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)(c.lM,{checked:!!b.cavemanEnabled,onChange:e=>N({cavemanEnabled:e},"cavemanEnabled"),disabled:"cavemanEnabled"===l})]}),b.cavemanEnabled&&(0,a.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:m.map(e=>(0,a.jsx)("button",{type:"button",onClick:()=>N({cavemanLevel:e.id},"cavemanLevel"),title:e.desc,className:`rounded-lg border px-3 py-1.5 text-xs font-medium transition ${b.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))})]})]})]})]})}x.propTypes={label:i().string.isRequired,value:i().string.isRequired,copiedKey:i().string.isRequired,copied:i().string,copy:i().func.isRequired},h.propTypes={title:i().string.isRequired,description:i().string.isRequired},p.propTypes={machineId:i().string}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099],{},_=>{_.O(0,[2574,3862,1051,1321,5497,8032,8441,3794,7358],()=>_(_.s=18032)),_N_E=_.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/page-019bf097bba329a7.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6337],{},_=>{_.O(0,[2574,3862,1051,1321,5497,8032,8441,3794,7358],()=>_(_.s=18032)),_N_E=_.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-3d41333f5ccdfd9e.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{7973:(e,a,s)=>{Promise.resolve().then(s.bind(s,64561))},64561:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>p});var t=s(95155),l=s(12115);let r="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))";function d({status:e}){if(!e?.message)return null;let a="error"===e.type?"text-red-600 bg-red-50 border-red-200":"text-green-700 bg-green-50 border-green-200";return(0,t.jsx)("div",{className:`mt-3 rounded-xl border px-4 py-3 text-sm ${a}`,children:e.message})}function o({icon:e,title:a,desc:s,children:l}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-border bg-surface p-6 shadow-sm",children:[(0,t.jsxs)("div",{className:"mb-5 flex items-start gap-3",children:[e&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:e}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-xl font-bold text-text-main",children:a}),s&&(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:s})]})]}),l]})}function i({label:e,hint:a,children:s}){return(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-1 block text-sm font-semibold text-text-main",children:e}),s,a&&(0,t.jsx)("span",{className:"mt-1 block text-xs text-text-muted",children:a})]})}function n(e){return(0,t.jsx)("input",{...e,className:`w-full rounded-xl border border-border bg-background px-3 py-2 text-sm outline-none focus:border-primary ${e.className||""}`})}function c({title:e,desc:a,checked:s,onChange:l,disabled:r}){return(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4 rounded-xl border border-border bg-background px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-sm font-semibold text-text-main",children:e}),a&&(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:a})]}),(0,t.jsx)("button",{type:"button",disabled:r,onClick:()=>l(!s),className:`relative mt-0.5 h-6 w-11 rounded-full transition disabled:opacity-50 ${s?"bg-primary":"bg-border"}`,children:(0,t.jsx)("span",{className:`absolute top-0.5 h-5 w-5 rounded-full bg-white transition ${s?"left-5":"left-0.5"}`})})]})}function p(){let[e,a]=(0,l.useState)({}),[s,p]=(0,l.useState)(!0),[u,m]=(0,l.useState)({current:"",new:"",confirm:""}),[x,b]=(0,l.useState)({type:"",message:""}),[h,g]=(0,l.useState)(!1),[y,j]=(0,l.useState)(!1),[v,w]=(0,l.useState)({type:"",message:""}),f=(0,l.useRef)(null),[D,A]=(0,l.useState)("admin"),[N,C]=(0,l.useState)({type:"",message:""}),[U,L]=(0,l.useState)({ldapEnabled:!1,ldapUrl:"",ldapBindDn:"",ldapBindPassword:"",ldapUserBaseDn:"",ldapUserSearchFilter:r,ldapUserNameAttribute:"sAMAccountName",ldapUserDisplayAttribute:"displayName",ldapUserEmailAttribute:"mail",ldapLoginAllowedGroupDn:"",ldapAdminGroupDn:"",ldapMonitorAdminGroupDn:"",ldapNestedGroups:!0,ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!0,ldapConnectTimeoutMs:8e3}),[S,k]=(0,l.useState)({type:"",message:""}),[P,I]=(0,l.useState)(!1),[O,G]=(0,l.useState)(!1),[B,M]=(0,l.useState)(""),[E,T]=(0,l.useState)([]),[R,F]=(0,l.useState)(!1),[_,$]=(0,l.useState)({authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC"}),[q,z]=(0,l.useState)(""),[K,H]=(0,l.useState)({type:"",message:""}),[J,V]=(0,l.useState)(!1),[Q,W]=(0,l.useState)(!1),[X,Y]=(0,l.useState)({type:"",message:""}),[Z,ee]=(0,l.useState)(!1),ea=async()=>{p(!0);try{let e=await fetch("/api/settings",{cache:"no-store"}),s=await e.json();a(s),A(s.localLoginUsername||"admin"),L({ldapEnabled:!0===s.ldapEnabled,ldapUrl:s.ldapUrl||"",ldapBindDn:s.ldapBindDn||"",ldapBindPassword:"",ldapUserBaseDn:s.ldapUserBaseDn||s.ldapBaseDn||"",ldapUserSearchFilter:s.ldapUserSearchFilter||r,ldapUserNameAttribute:s.ldapUserNameAttribute||"sAMAccountName",ldapUserDisplayAttribute:s.ldapUserDisplayAttribute||"displayName",ldapUserEmailAttribute:s.ldapUserEmailAttribute||"mail",ldapLoginAllowedGroupDn:s.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:s.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:s.ldapMonitorAdminGroupDn||"",ldapNestedGroups:!1!==s.ldapNestedGroups,ldapAllowedUsers:Array.isArray(s.ldapAllowedUsers)?s.ldapAllowedUsers:[],ldapTlsRejectUnauthorized:!1!==s.ldapTlsRejectUnauthorized,ldapConnectTimeoutMs:s.ldapConnectTimeoutMs||8e3}),$({authMode:s.authMode||"password",oidcIssuerUrl:s.oidcIssuerUrl||"",oidcClientId:s.oidcClientId||"",oidcScopes:s.oidcScopes||"openid profile email",oidcLoginLabel:s.oidcLoginLabel||"Sign in with OIDC"}),("oidc"===s.authMode||"both"===s.authMode)&&W(!0)}catch(e){console.log("Failed to fetch settings:",e)}finally{p(!1)}};(0,l.useEffect)(()=>{ea()},[]);let es=async e=>{let s=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await s.json().catch(()=>({}));if(!s.ok)throw Error(t.error||"Failed to save settings");return a(e=>({...e,...t})),t},et=async e=>{ee(!0),Y({type:"",message:""});try{let a=await es({sidebarAdvancedToolsVisible:e}),s=!1!==a.sidebarAdvancedToolsVisible;window.dispatchEvent(new CustomEvent("bluerouter:sidebar-advanced-tools",{detail:{visible:s}})),Y({type:"success",message:s?"Advanced tools are visible in the sidebar.":"Advanced tools are hidden from the sidebar."})}catch(e){Y({type:"error",message:e.message||"Failed to update sidebar tools."})}finally{ee(!1)}},el=async e=>{e.preventDefault(),C({type:"",message:""});try{let e=await es({localLoginUsername:D});A(e.localLoginUsername||D||"admin"),C({type:"success",message:"Local account name saved."})}catch(e){C({type:"error",message:e.message})}},er=async e=>{if(e.preventDefault(),u.new!==u.confirm)return void b({type:"error",message:"Passwords do not match"});g(!0),b({type:"",message:""});try{await es({currentPassword:u.current,newPassword:u.new}),b({type:"success",message:"Password updated successfully"}),m({current:"",new:"",confirm:""})}catch(e){b({type:"error",message:e.message||"Failed to update password"})}finally{g(!1)}},ed=async()=>{j(!0),w({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let a=await e.json().catch(()=>({}));throw Error(a.error||"Failed to export database")}let a=await e.json(),s=JSON.stringify(a,null,2),t=new Blob([s],{type:"application/json"}),l=URL.createObjectURL(t),r=document.createElement("a"),d=new Date().toISOString().replace(/[.:]/g,"-");r.href=l,r.download=`bluerouter-backup-${d}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(l),w({type:"success",message:"Database backup downloaded."})}catch(e){w({type:"error",message:e.message||"Failed to export database."})}finally{j(!1)}},eo=async e=>{let a=e.target.files?.[0];if(a){j(!0),w({type:"",message:""});try{let e=await a.text(),s=JSON.parse(e),t=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),l=await t.json().catch(()=>({}));if(!t.ok)throw Error(l.error||"Failed to import database");await ea(),w({type:"success",message:"Database imported successfully."})}catch(e){w({type:"error",message:e.message||"Invalid backup file."})}finally{f.current&&(f.current.value=""),j(!1)}}},ei=(e,a)=>L(s=>({...s,[e]:a})),en=async e=>{e?.preventDefault?.(),I(!0),k({type:"",message:""});try{let e={...U,ldapBaseDn:U.ldapUserBaseDn,ldapAllowedUsers:U.ldapAllowedUsers};e.ldapBindPassword||delete e.ldapBindPassword;let a=await es(e);L(e=>({...e,ldapBindPassword:"",ldapEnabled:!0===a.ldapEnabled,ldapUserBaseDn:a.ldapUserBaseDn||a.ldapBaseDn||e.ldapUserBaseDn,ldapLoginAllowedGroupDn:a.ldapLoginAllowedGroupDn||"",ldapAdminGroupDn:a.ldapAdminGroupDn||"",ldapMonitorAdminGroupDn:a.ldapMonitorAdminGroupDn||"",ldapNestedGroups:!1!==a.ldapNestedGroups,ldapAllowedUsers:Array.isArray(a.ldapAllowedUsers)?a.ldapAllowedUsers:e.ldapAllowedUsers})),k({type:"success",message:"LDAP settings saved."})}catch(e){k({type:"error",message:e.message||"Failed to save LDAP settings"})}finally{I(!1)}},ec=async()=>{G(!0),k({type:"",message:""});try{await en();let e=await fetch("/api/auth/ldap/test",{method:"POST"}),a=await e.json().catch(()=>({}));e.ok&&a.ok?k({type:"success",message:a.message||"LDAP connection OK."}):k({type:"error",message:a.error||"LDAP test failed."})}catch(e){k({type:"error",message:e.message||"LDAP test failed."})}finally{G(!1)}},ep=async()=>{F(!0),k({type:"",message:""});try{await en();let e=await fetch(`/api/auth/ldap/users?q=${encodeURIComponent(B)}`,{cache:"no-store"}),a=await e.json().catch(()=>({}));e.ok?(T(a.users||[]),k({type:"success",message:`Loaded ${(a.users||[]).length} LDAP user(s).`})):k({type:"error",message:a.error||"Failed to load LDAP users."})}catch(e){k({type:"error",message:e.message||"Failed to load LDAP users."})}finally{F(!1)}},eu=e=>{let a=String(e||"").trim();a&&L(e=>{let s=new Set(e.ldapAllowedUsers||[]);return s.has(a)?s.delete(a):s.add(a),{...e,ldapAllowedUsers:[...s]}})},em=async(a=_.authMode||"password")=>{let s=_.oidcIssuerUrl.trim(),t=_.oidcClientId.trim(),l=_.oidcScopes.trim(),r=_.oidcLoginLabel.trim(),d=q.trim();if("password"!==a&&(!s||!t||!d)&&!e.oidcConfigured)return void H({type:"error",message:"Issuer URL, client ID, and client secret are required to enable OIDC."});V(!0),H({type:"",message:""});try{let e={authMode:a,oidcIssuerUrl:s,oidcClientId:t,oidcScopes:l||"openid profile email",oidcLoginLabel:r||"Sign in with OIDC"};d&&(e.oidcClientSecret=d);let o=await es(e);$({authMode:o.authMode||a,oidcIssuerUrl:o.oidcIssuerUrl||s,oidcClientId:o.oidcClientId||t,oidcScopes:o.oidcScopes||l||"openid profile email",oidcLoginLabel:o.oidcLoginLabel||r||"Sign in with OIDC"}),z(""),H({type:"success",message:"OIDC settings saved."})}catch(e){H({type:"error",message:e.message||"Failed to save OIDC settings"})}finally{V(!1)}};return s?(0,t.jsx)("div",{className:"p-8 text-text-muted",children:"Loading settings..."}):(0,t.jsxs)("div",{className:"mx-auto max-w-6xl space-y-6 p-6",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-3xl font-bold text-text-main",children:"Settings"}),(0,t.jsx)("p",{className:"mt-1 text-text-muted",children:"Configure local dashboard login, LDAP/Active Directory login, and OIDC login."})]}),(0,t.jsx)(o,{icon:"shield",title:"Dashboard Login",desc:"Local account remains available even when LDAP is enabled.",children:(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("form",{onSubmit:el,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local account"}),(0,t.jsx)(i,{label:"Local username",children:(0,t.jsx)(n,{value:D,onChange:e=>A(e.target.value)})}),(0,t.jsx)("button",{className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white",children:"Save account"}),(0,t.jsx)(d,{status:N})]}),!1!==e.requireLogin&&(0,t.jsxs)("form",{onSubmit:er,className:"space-y-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Local password"}),e.hasPassword&&(0,t.jsx)(i,{label:"Current password",children:(0,t.jsx)(n,{type:"password",value:u.current,onChange:e=>m({...u,current:e.target.value}),required:!0})}),(0,t.jsx)(i,{label:"New password",children:(0,t.jsx)(n,{type:"password",value:u.new,onChange:e=>m({...u,new:e.target.value}),required:!0})}),(0,t.jsx)(i,{label:"Confirm password",children:(0,t.jsx)(n,{type:"password",value:u.confirm,onChange:e=>m({...u,confirm:e.target.value}),required:!0})}),(0,t.jsx)("button",{disabled:h,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:e.hasPassword?"Update Password":"Set Password"}),(0,t.jsx)(d,{status:x})]})]})}),(0,t.jsxs)(o,{icon:"database",title:"Database Backup",desc:"Export or restore the local bluerouter configuration database.",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,t.jsx)("button",{onClick:ed,disabled:y,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:"Download Backup"}),(0,t.jsx)("button",{onClick:()=>f.current?.click(),disabled:y,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main hover:border-primary/50 disabled:opacity-50",children:"Import Backup"}),(0,t.jsx)("input",{ref:f,type:"file",accept:"application/json",className:"hidden",onChange:eo})]}),(0,t.jsx)(d,{status:v})]}),(0,t.jsxs)(o,{icon:"dashboard_customize",title:"Sidebar tools",desc:"Keep the main navigation compact. Hide advanced/admin-only tool pages when you do not use them often.",children:[(0,t.jsx)(c,{title:"Show Advanced tools",desc:"Show or hide Media/Web, AI Traffic Gateway, CLI Tools, Proxy Pools, Skills, Console Log and Translator in the sidebar. Core pages such as Endpoint, Providers, Combos, Usage, Analytics and Settings stay visible.",checked:!1!==e.sidebarAdvancedToolsVisible,onChange:et,disabled:s||Z}),(0,t.jsx)(d,{status:X})]}),(0,t.jsx)(o,{icon:"corporate_fare",title:"LDAP / Active Directory Login",desc:"Search users from a User Base DN, restrict login by group DN, and grant admin by group DN. The old Selected LDAP users list is kept as a manual admin list.",children:(0,t.jsxs)("form",{onSubmit:en,className:"space-y-5",children:[(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,t.jsx)("button",{type:"button",onClick:()=>ei("ldapEnabled",!U.ldapEnabled),className:`rounded-xl px-3 py-2 text-sm font-semibold ${U.ldapEnabled?"bg-primary text-white":"border border-border text-text-muted"}`,children:U.ldapEnabled?"Enabled":"Disabled"})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(i,{label:"LDAP URL",children:(0,t.jsx)(n,{value:U.ldapUrl,onChange:e=>ei("ldapUrl",e.target.value),placeholder:"ldap://dc01.company.local:389"})}),(0,t.jsx)(i,{label:"LDAP User Base DN",hint:"OU/container/domain where user objects are searched. Do not use a group DN here.",children:(0,t.jsx)(n,{value:U.ldapUserBaseDn,onChange:e=>ei("ldapUserBaseDn",e.target.value),placeholder:"OU=Users,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(i,{label:"LDAP Bind DN",children:(0,t.jsx)(n,{value:U.ldapBindDn,onChange:e=>ei("ldapBindDn",e.target.value),placeholder:"CN=svc-bluerouter,OU=Service Accounts,DC=company,DC=local"})}),(0,t.jsx)(i,{label:"LDAP Bind Password",children:(0,t.jsx)(n,{type:"password",value:U.ldapBindPassword,onChange:e=>ei("ldapBindPassword",e.target.value),placeholder:e.ldapHasBindPassword?"Saved — leave blank to keep":"Service account password"})}),(0,t.jsx)(i,{label:"LDAP Login Allowed Group DN",hint:"Only members of this group can log in. Leave blank to allow any valid LDAP user.",children:(0,t.jsx)(n,{value:U.ldapLoginAllowedGroupDn,onChange:e=>ei("ldapLoginAllowedGroupDn",e.target.value),placeholder:"CN=Apikeys_Groups,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(i,{label:"LDAP Admin Group DN",hint:"Members of this group get full admin dashboard access.",children:(0,t.jsx)(n,{value:U.ldapAdminGroupDn,onChange:e=>ei("ldapAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})}),(0,t.jsx)(i,{label:"LDAP Monitor Admin Group DN",hint:"Members can use only Endpoint, API Keys, Usage, Analytics, Quota Tracker and Prompt Logs with admin-like permissions inside those tabs.",children:(0,t.jsx)(n,{value:U.ldapMonitorAdminGroupDn,onChange:e=>ei("ldapMonitorAdminGroupDn",e.target.value),placeholder:"CN=BlueRouter_Monitor_Admins,OU=AppGroups,OU=xxx,DC=xx,DC=vn"})})]}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(i,{label:"User search filter",hint:"Use {{username}} placeholder.",children:(0,t.jsx)(n,{value:U.ldapUserSearchFilter,onChange:e=>ei("ldapUserSearchFilter",e.target.value)})}),(0,t.jsx)(i,{label:"Login group mode",hint:"Nested groups uses AD matching rule 1.2.840.113556.1.4.1941.",children:(0,t.jsx)(c,{title:"Nested group membership",desc:"Recommended for Active Directory nested groups.",checked:U.ldapNestedGroups,onChange:e=>ei("ldapNestedGroups",e)})}),(0,t.jsx)(i,{label:"Username attribute",children:(0,t.jsx)(n,{value:U.ldapUserNameAttribute,onChange:e=>ei("ldapUserNameAttribute",e.target.value)})}),(0,t.jsx)(i,{label:"Display attribute",children:(0,t.jsx)(n,{value:U.ldapUserDisplayAttribute,onChange:e=>ei("ldapUserDisplayAttribute",e.target.value)})}),(0,t.jsx)(i,{label:"Email attribute",children:(0,t.jsx)(n,{value:U.ldapUserEmailAttribute,onChange:e=>ei("ldapUserEmailAttribute",e.target.value)})}),(0,t.jsx)(i,{label:"Connect timeout ms",children:(0,t.jsx)(n,{type:"number",value:U.ldapConnectTimeoutMs,onChange:e=>ei("ldapConnectTimeoutMs",e.target.value)})})]}),(0,t.jsx)(c,{title:"Reject invalid TLS certificates",desc:"Disable only for test/self-signed LDAP TLS.",checked:U.ldapTlsRejectUnauthorized,onChange:e=>ei("ldapTlsRejectUnauthorized",e)}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-background p-4",children:[(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Manual admin users / LDAP owner list"}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:"Users loaded here come from Login Allowed Group DN when set. Selected users are also treated as manual admins for backward compatibility."})]}),(0,t.jsxs)("div",{className:"mb-3 flex gap-2",children:[(0,t.jsx)(n,{value:B,onChange:e=>M(e.target.value),placeholder:"Search users..."}),(0,t.jsx)("button",{type:"button",onClick:ep,disabled:R,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:R?"Loading...":"Load users"})]}),E.length>0&&(0,t.jsx)("div",{className:"max-h-72 overflow-auto rounded-xl border border-border",children:E.map(e=>{let a=U.ldapAllowedUsers.includes(e.username);return(0,t.jsxs)("button",{type:"button",onClick:()=>eu(e.username),className:`flex w-full items-center justify-between gap-3 border-b border-border px-3 py-2 text-left text-sm last:border-b-0 ${a?"bg-primary/10":"bg-background hover:bg-surface"}`,children:[(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"font-semibold text-text-main",children:e.displayName||e.username}),(0,t.jsxs)("span",{className:"ml-2 text-text-muted",children:[e.username,e.email?` \xb7 ${e.email}`:""]})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-primary",children:a?"check_circle":"radio_button_unchecked"})]},e.dn||e.username)})}),(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsxs)("div",{className:"mb-2 text-sm font-semibold text-text-main",children:["Selected manual admin users (",U.ldapAllowedUsers.length,")"]}),0===U.ldapAllowedUsers.length?(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"No users selected."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:U.ldapAllowedUsers.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>eu(e),className:"rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs text-primary",children:[e," \xd7"]},e))})]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:ec,disabled:O,className:"rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main disabled:opacity-50",children:O?"Testing...":"Save & test LDAP"}),(0,t.jsx)("button",{type:"submit",disabled:P,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:P?"Saving...":"Save LDAP settings"})]}),(0,t.jsx)(d,{status:S})]})}),(0,t.jsxs)(o,{icon:"lock_open",title:"OIDC Dashboard Login",desc:"oidc"===e.authMode?"OIDC active":"both"===e.authMode?"Password + OIDC active":"Optional SSO via Authentik/Keycloak/Google",children:[(0,t.jsx)("button",{type:"button",onClick:()=>W(e=>!e),className:"mb-4 rounded-xl border border-border px-4 py-2 text-sm font-semibold text-text-main",children:Q?"Hide OIDC settings":"Show OIDC settings"}),Q&&(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"grid gap-3 md:grid-cols-3",children:[{value:"password",title:"Password/LDAP",desc:"Keep local and LDAP login."},{value:"oidc",title:"OIDC only",desc:"Disable local/LDAP login when configured."},{value:"both",title:"Both",desc:"Allow either OIDC or local/LDAP."}].map(e=>{let a=_.authMode===e.value;return(0,t.jsxs)("button",{type:"button",onClick:()=>$(a=>({...a,authMode:e.value})),className:`rounded-xl border p-3 text-left ${a?"border-primary bg-primary/10":"border-border bg-background hover:border-primary/40"}`,children:[(0,t.jsx)("div",{className:"font-semibold text-text-main",children:e.title}),(0,t.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:e.desc})]},e.value)})}),(0,t.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,t.jsx)(i,{label:"Issuer URL",children:(0,t.jsx)(n,{value:_.oidcIssuerUrl,onChange:e=>$({..._,oidcIssuerUrl:e.target.value})})}),(0,t.jsx)(i,{label:"Client ID",children:(0,t.jsx)(n,{value:_.oidcClientId,onChange:e=>$({..._,oidcClientId:e.target.value})})}),(0,t.jsx)(i,{label:"Client Secret",children:(0,t.jsx)(n,{type:"password",value:q,onChange:e=>z(e.target.value),placeholder:e.oidcConfigured?"Saved — leave blank to keep":"Client secret"})}),(0,t.jsx)(i,{label:"Scopes",children:(0,t.jsx)(n,{value:_.oidcScopes,onChange:e=>$({..._,oidcScopes:e.target.value})})}),(0,t.jsx)(i,{label:"Login label",children:(0,t.jsx)(n,{value:_.oidcLoginLabel,onChange:e=>$({..._,oidcLoginLabel:e.target.value})})})]}),(0,t.jsx)("button",{type:"button",onClick:()=>em(),disabled:J,className:"rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white disabled:opacity-50",children:J?"Saving...":"Save OIDC settings"}),(0,t.jsx)(d,{status:K})]})]})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=7973)),_N_E=e.O()}]);
|
|
File without changes
|
/package/app/.next-cli-build/static/{A0x1XuZjP0w3ZRZa8TH3g → xHze_wXftqJQPS7cBoQN4}/_ssgManifest.js
RENAMED
|
File without changes
|