@rsalmn/extremerouter 0.8.4 → 0.8.6
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/README.id.md +130 -0
- package/README.md +73 -32
- package/README.zh-CN.md +130 -0
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +25 -10
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/prerender-manifest.json +3 -3
- package/app/.next-cli-build/routes-manifest.json +94 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/alerts/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/alerts/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/alerts/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/health/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/overview/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/overview/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/overview/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/playground/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +4 -4
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/smart-routing/page.js +2 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/smart-routing/page.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/smart-routing/page_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/swarm/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/swarm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/swarm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js +3 -3
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js +2 -2
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/alerts/test/route.js +2 -2
- package/app/.next-cli-build/server/app/api/alerts/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/reset-password/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/reset-password/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/breaker/route.js +1 -1
- package/app/.next-cli-build/server/app/api/breaker/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cache/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cache/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +9 -11
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +5 -2
- 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 +5 -2
- 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 +4 -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 +5 -2
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -2
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +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 +2 -2
- 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 +7 -4
- 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 +5 -2
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +10 -9
- 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 +5 -2
- 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 +5 -2
- 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 +5 -2
- 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 +5 -2
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js +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/lab/route.js +1 -0
- package/app/.next-cli-build/server/app/api/combos/lab/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/combos/lab/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/simulate/route.js +1 -0
- package/app/.next-cli-build/server/app/api/combos/simulate/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/combos/simulate/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/combos/validate-roles/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/validate-roles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/dashboard/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/stop/route.js +2 -2
- package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/overview/route.js +1 -0
- package/app/.next-cli-build/server/app/api/health/overview/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/health/overview/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/health/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/health/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/health/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js +2 -2
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js +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 +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/1min/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/1min/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js +2 -2
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/freebuff/import/route.js +1 -0
- package/app/.next-cli-build/server/app/api/oauth/freebuff/import/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/oauth/freebuff/import/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/quota/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kimi-desktop/quota/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/qwen/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/qwen/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/wp-studio/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/wp-studio/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/auto-import/route.js +2 -2
- package/app/.next-cli-build/server/app/api/oauth/zed/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/agnes-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/agnes-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/felo-profile/route.js +3 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/felo-profile/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/felo-profile/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/freebuff-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/freebuff-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/health-timeline/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/health-timeline/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/inxora-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/inxora-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +3 -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]/onemin-api-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/onemin-api-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/onemin-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/onemin-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/qwencloud-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/qwencloud-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/v0-profile/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/v0-profile/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/vault-pool/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/vault-pool/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/zai-profile/route.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/zai-profile/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/zai-profile/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/[id]/zenmux-plans/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/zenmux-plans/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/capture/launch/route.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/capture/launch/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/capture/launch/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/capture/route.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/capture/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/capture/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/felo-capture/launch/route.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/felo-capture/launch/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/felo-capture/launch/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/felo-capture/route.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/felo-capture/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/providers/felo-capture/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/install/route.js +2 -2
- package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js +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 +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/smart-routing/active/route.js +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/active/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/active/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/history/route.js +17 -0
- package/app/.next-cli-build/server/app/api/smart-routing/history/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/history/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/lab/route.js +16 -0
- package/app/.next-cli-build/server/app/api/smart-routing/lab/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/lab/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/stream/route.js +7 -0
- package/app/.next-cli-build/server/app/api/smart-routing/stream/route.js.nft.json +1 -0
- package/app/.next-cli-build/server/app/api/smart-routing/stream/route_client-reference-manifest.js +1 -0
- package/app/.next-cli-build/server/app/api/swarm/active/route.js +1 -1
- package/app/.next-cli-build/server/app/api/swarm/active/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/swarm/stream/route.js +4 -2
- package/app/.next-cli-build/server/app/api/swarm/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +2 -2
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/leaderboard/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/leaderboard/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/meta/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/meta/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/retry-stats/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/retry-stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js +2 -2
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +2 -2
- 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/favicon.ico/route.js +1 -1
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js +2 -2
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login/page.js +2 -2
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js +2 -2
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js +2 -2
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +25 -10
- package/app/.next-cli-build/server/chunks/1241.js +1 -1
- package/app/.next-cli-build/server/chunks/1350.js +5 -2
- package/app/.next-cli-build/server/chunks/1429.js +1 -1
- package/app/.next-cli-build/server/chunks/1719.js +1 -1
- package/app/.next-cli-build/server/chunks/1891.js +10 -0
- package/app/.next-cli-build/server/chunks/212.js +1 -1
- package/app/.next-cli-build/server/chunks/2409.js +1 -1
- package/app/.next-cli-build/server/chunks/3520.js +1 -0
- package/app/.next-cli-build/server/chunks/3535.js +1 -1
- package/app/.next-cli-build/server/chunks/3593.js +1 -1
- package/app/.next-cli-build/server/chunks/3841.js +1 -0
- package/app/.next-cli-build/server/chunks/3988.js +1 -0
- package/app/.next-cli-build/server/chunks/4046.js +1 -1
- package/app/.next-cli-build/server/chunks/4109.js +4 -0
- package/app/.next-cli-build/server/chunks/412.js +5 -5
- package/app/.next-cli-build/server/chunks/422.js +1 -1
- package/app/.next-cli-build/server/chunks/4502.js +16 -0
- package/app/.next-cli-build/server/chunks/4739.js +1 -1
- package/app/.next-cli-build/server/chunks/4780.js +1 -1
- package/app/.next-cli-build/server/chunks/507.js +1 -1
- package/app/.next-cli-build/server/chunks/5253.js +17 -0
- package/app/.next-cli-build/server/chunks/5258.js +1 -1
- package/app/.next-cli-build/server/chunks/5330.js +37 -28
- package/app/.next-cli-build/server/chunks/5612.js +1 -1
- package/app/.next-cli-build/server/chunks/5615.js +1 -1
- package/app/.next-cli-build/server/chunks/5628.js +1 -1
- package/app/.next-cli-build/server/chunks/5699.js +1 -1
- package/app/.next-cli-build/server/chunks/5961.js +1 -1
- package/app/.next-cli-build/server/chunks/6306.js +1 -1
- package/app/.next-cli-build/server/chunks/6630.js +1 -1
- package/app/.next-cli-build/server/chunks/6777.js +1 -1
- package/app/.next-cli-build/server/chunks/6878.js +1 -0
- package/app/.next-cli-build/server/chunks/698.js +1 -1
- package/app/.next-cli-build/server/chunks/7016.js +3 -0
- package/app/.next-cli-build/server/chunks/7410.js +1 -1
- package/app/.next-cli-build/server/chunks/7566.js +2 -2
- package/app/.next-cli-build/server/chunks/7765.js +13 -0
- package/app/.next-cli-build/server/chunks/7965.js +1 -1
- package/app/.next-cli-build/server/chunks/8048.js +1 -0
- package/app/.next-cli-build/server/chunks/809.js +1 -0
- package/app/.next-cli-build/server/chunks/8238.js +1 -1
- package/app/.next-cli-build/server/chunks/8266.js +1 -0
- package/app/.next-cli-build/server/chunks/8271.js +1 -1
- package/app/.next-cli-build/server/chunks/8520.js +1 -1
- package/app/.next-cli-build/server/chunks/874.js +2 -2
- package/app/.next-cli-build/server/chunks/8802.js +2 -2
- package/app/.next-cli-build/server/chunks/885.js +11 -7
- package/app/.next-cli-build/server/chunks/8895.js +4 -4
- package/app/.next-cli-build/server/chunks/9365.js +9 -0
- package/app/.next-cli-build/server/chunks/9703.js +5 -5
- package/app/.next-cli-build/server/chunks/9903.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js +6 -6
- 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/server/server-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/server-reference-manifest.json +1 -1
- package/app/.next-cli-build/static/FP2YsqoRbzETOIHRfld7X/_buildManifest.js +1 -0
- package/app/.next-cli-build/static/chunks/1321-a387932dc3179f86.js +1 -0
- package/app/.next-cli-build/static/chunks/5497-c6d8b48c8828240a.js +7 -0
- package/app/.next-cli-build/static/chunks/705-42ad329bbe0c47df.js +1 -0
- package/app/.next-cli-build/static/chunks/9497-d27e455b90c7936e.js +1 -0
- package/app/.next-cli-build/static/chunks/981-eead750d8fdba2cb.js +3 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/alerts/{page-c263cd784e69e6f1.js → page-812b19e92ea94f14.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/page-9a0e996c5bc5a169.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/{page-3c3074cf3f61df46.js → page-0e1d5c3cf52823c3.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-f7cdc992cb310077.js → page-3122fd2735ba291c.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/combos/page-a84afe4d66f3439a.js +3 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/{page-959b3ee3c662de33.js → page-9850fafcf9dd605b.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/page-9879594c5128cd91.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/health/page-1c94a0710d61767e.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-7d472b122fb182f0.js → page-9e98db59d6b1d05f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/{page-83272baae17d38f1.js → page-026721fa921475e0.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/combo/[id]/{page-f36e5ac11783fd1e.js → page-ec37860600228def.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/{page-4069e1d40a3c70a6.js → page-99c8024bece93467.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/web/{page-e794909abbc7a09a.js → page-825c8673e6351d02.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/mitm/{page-1d972fd3baee7474.js → page-65072e4024bb73b6.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/overview/page-b92bc7ebaa0813b2.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/page-d3be818ebce4ade2.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/playground/page-5ef2d54550eda9da.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-d208597b457fee58.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-9eea89b85926cfd8.js +10 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/new/{page-bcf9d97ab4dc20d9.js → page-aaaaeede554f51a5.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-5b11b61863963cad.js → page-1f465a9d64823fe6.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-58d8d0fa5523ff95.js → page-70bfba02b4fc414f.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-e249d28461673557.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/{page-a8b151d5ae9004ea.js → page-17bcf4e0db497e3a.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/smart-routing/page-5c8e7b3b71579268.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/swarm/page-6cda956597418bd9.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/token-saver/{page-d57c129c03c9cb36.js → page-6e8f34517990d858.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/translator/{page-61d162d7a7f88a11.js → page-d9e35b679b85696a.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/page-7ea08e0acef52ce3.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/layout-20cc41f2e1307f06.js +1 -0
- package/app/.next-cli-build/static/chunks/app/_global-error/page-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/alerts/test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/reset-password/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/breaker/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cache/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/lab/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/simulate/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/combos/validate-roles/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/dashboard/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/headroom/start/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/headroom/status/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/headroom/stop/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/overview/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/providers/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/health/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/init/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/keys/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/locale/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/1min/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/bulk-import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/freebuff/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/auto-import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/quota/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/api-key/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import-cli-proxy/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/qwen/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/wp-studio/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/zed/auto-import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/oauth/zed/import/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/agnes-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/felo-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/freebuff-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/health-timeline/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/inxora-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/onemin-api-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/onemin-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/qwencloud-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/v0-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/vault-pool/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/zai-profile/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/zenmux-plans/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/capture/launch/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/capture/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/felo-capture/launch/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/felo-capture/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pxpipe/install/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/pxpipe/status/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/settings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/smart-routing/active/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/smart-routing/history/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/smart-routing/lab/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/smart-routing/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/swarm/active/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/swarm/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tags/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/leaderboard/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/logs/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/meta/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/retry-stats/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/dashboard/settings/pricing/page-bc142d42a8a549b4.js +1 -0
- package/app/.next-cli-build/static/chunks/app/{layout-10bff7b57a2a3c2c.js → layout-0e3fdd66d189006c.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/login/{page-32ab5d7c75651107.js → page-4b39978fc147efa3.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/app/page-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-d93feb6893aee449.js +1 -0
- package/app/.next-cli-build/static/css/d30ee18d498368cc.css +1 -0
- package/app/node_modules/playwright-core/browsers.json +75 -0
- package/app/node_modules/playwright-core/index.js +17 -0
- package/app/node_modules/playwright-core/index.mjs +28 -0
- package/app/node_modules/playwright-core/lib/bootstrap.js +88 -0
- package/app/node_modules/playwright-core/lib/coreBundle.js +74830 -0
- package/app/node_modules/playwright-core/lib/utilsBundle.js +90764 -0
- package/app/node_modules/playwright-core/package.json +34 -0
- package/app/package.json +2 -5
- package/app/public/providers/ai21.svg +4 -0
- package/app/public/providers/aihorde.png +0 -0
- package/app/public/providers/aimlapi.svg +4 -0
- package/app/public/providers/ainative.svg +4 -0
- package/app/public/providers/aion.svg +4 -0
- package/app/public/providers/anyapi.svg +4 -0
- package/app/public/providers/arcee-ai.svg +4 -0
- package/app/public/providers/auriko.svg +4 -0
- package/app/public/providers/azure-ai.svg +4 -0
- package/app/public/providers/bai.svg +4 -0
- package/app/public/providers/baseten.svg +4 -0
- package/app/public/providers/bazaarlink.svg +8 -0
- package/app/public/providers/bluesminds.svg +4 -0
- package/app/public/providers/bytez.svg +4 -0
- package/app/public/providers/charm-hyper.svg +4 -0
- package/app/public/providers/chat-oripe.svg +4 -0
- package/app/public/providers/chatanywhere.svg +4 -0
- package/app/public/providers/cheaperinference.svg +4 -0
- package/app/public/providers/chenzk.svg +4 -0
- package/app/public/providers/clarifai.svg +4 -0
- package/app/public/providers/cloudcode-one.svg +4 -0
- package/app/public/providers/conol-web.svg +1 -0
- package/app/public/providers/crof.svg +4 -0
- package/app/public/providers/dahl.png +0 -0
- package/app/public/providers/datarobot.svg +4 -0
- package/app/public/providers/dgrid.png +0 -0
- package/app/public/providers/digitalocean.svg +4 -0
- package/app/public/providers/dit.svg +4 -0
- package/app/public/providers/docker-model-runner.svg +1 -0
- package/app/public/providers/dxnt.svg +4 -0
- package/app/public/providers/electronhub.svg +4 -0
- package/app/public/providers/empower.svg +4 -0
- package/app/public/providers/factory.svg +4 -0
- package/app/public/providers/fastrouter.svg +4 -0
- package/app/public/providers/felo-web.svg +50 -0
- package/app/public/providers/fireworks.svg +3 -0
- package/app/public/providers/fishaudio.svg +1 -0
- package/app/public/providers/free-ai.svg +4 -0
- package/app/public/providers/freeaiapikey.svg +4 -0
- package/app/public/providers/freebuff.svg +6 -0
- package/app/public/providers/freeinference.svg +4 -0
- package/app/public/providers/freemodel-dev.svg +4 -0
- package/app/public/providers/freetheai.svg +4 -0
- package/app/public/providers/friendliai.svg +4 -0
- package/app/public/providers/g4f-gemini.png +0 -0
- package/app/public/providers/g4f-groq.png +0 -0
- package/app/public/providers/g4f-nvidia.png +0 -0
- package/app/public/providers/g4f-ollama.png +0 -0
- package/app/public/providers/g4f-pollinations.svg +9 -0
- package/app/public/providers/gemini-business.svg +1 -0
- package/app/public/providers/getgoapi.svg +4 -0
- package/app/public/providers/gitlab.png +0 -0
- package/app/public/providers/gitlawb-gmi.svg +4 -0
- package/app/public/providers/gitlawb.svg +4 -0
- package/app/public/providers/gladia.svg +1 -0
- package/app/public/providers/hackclub.png +0 -0
- package/app/public/providers/hailuo-web.svg +1 -0
- package/app/public/providers/helixmind.svg +4 -0
- package/app/public/providers/helyxai.png +0 -0
- package/app/public/providers/heroku.svg +4 -0
- package/app/public/providers/hyperagent.svg +1 -0
- package/app/public/providers/inception.svg +4 -0
- package/app/public/providers/inference-net.svg +4 -0
- package/app/public/providers/inner-ai.svg +1 -0
- package/app/public/providers/kenari.svg +4 -0
- package/app/public/providers/kilo-gateway.svg +4 -0
- package/app/public/providers/lambda-ai.svg +4 -0
- package/app/public/providers/laozhang.svg +4 -0
- package/app/public/providers/lemonade.svg +1 -0
- package/app/public/providers/liquid.svg +4 -0
- package/app/public/providers/literouter.svg +4 -0
- package/app/public/providers/llama-cpp.svg +1 -0
- package/app/public/providers/llamafile.svg +1 -0
- package/app/public/providers/llamagate.svg +4 -0
- package/app/public/providers/llm-kiwi.svg +4 -0
- package/app/public/providers/llm7.png +0 -0
- package/app/public/providers/llmgateway.svg +4 -0
- package/app/public/providers/lm-studio.svg +1 -0
- package/app/public/providers/maritalk.svg +4 -0
- package/app/public/providers/meganova-ai.svg +4 -0
- package/app/public/providers/meta-ai.svg +68 -0
- package/app/public/providers/meta-llama.svg +4 -0
- package/app/public/providers/mimocode.png +0 -0
- package/app/public/providers/mixlayer.svg +4 -0
- package/app/public/providers/mnn-ai.svg +4 -0
- package/app/public/providers/modal.svg +4 -0
- package/app/public/providers/modelscope.svg +4 -0
- package/app/public/providers/morph.svg +4 -0
- package/app/public/providers/naga-ac.svg +4 -0
- package/app/public/providers/naga-ai.svg +4 -0
- package/app/public/providers/nanogpt.svg +4 -0
- package/app/public/providers/nara.svg +4 -0
- package/app/public/providers/navy.svg +4 -0
- package/app/public/providers/notion-web.svg +1 -0
- package/app/public/providers/nous-research.svg +4 -0
- package/app/public/providers/nscale.svg +4 -0
- package/app/public/providers/nube.svg +4 -0
- package/app/public/providers/oci.svg +4 -0
- package/app/public/providers/ofoxai.svg +4 -0
- package/app/public/providers/ollama-cloud.svg +4 -0
- package/app/public/providers/oobabooga.svg +1 -0
- package/app/public/providers/openadapter.svg +4 -0
- package/app/public/providers/opencode-zen.svg +4 -0
- package/app/public/providers/openference-api.svg +4 -0
- package/app/public/providers/orcarouter.svg +4 -0
- package/app/public/providers/ovhcloud.svg +4 -0
- package/app/public/providers/piapi.svg +4 -0
- package/app/public/providers/pioneer.svg +4 -0
- package/app/public/providers/poixe-ai.svg +4 -0
- package/app/public/providers/poolside.svg +4 -0
- package/app/public/providers/predibase.svg +4 -0
- package/app/public/providers/publicai.svg +4 -0
- package/app/public/providers/qiniu.svg +4 -0
- package/app/public/providers/regolo.svg +4 -0
- package/app/public/providers/reka.svg +4 -0
- package/app/public/providers/requesty.svg +4 -0
- package/app/public/providers/rev-ai.svg +1 -0
- package/app/public/providers/routeway.svg +4 -0
- package/app/public/providers/sambanova.svg +4 -0
- package/app/public/providers/sap.svg +4 -0
- package/app/public/providers/scaleway.svg +4 -0
- package/app/public/providers/snowflake.svg +4 -0
- package/app/public/providers/soniox.svg +1 -0
- package/app/public/providers/speechmatics.svg +1 -0
- package/app/public/providers/speka.svg +4 -0
- package/app/public/providers/sumopod.svg +4 -0
- package/app/public/providers/synthetic.svg +4 -0
- package/app/public/providers/tencent-aistudio-web.png +0 -0
- package/app/public/providers/thebai.svg +4 -0
- package/app/public/providers/theoldllm.png +0 -0
- package/app/public/providers/tokenharbor.svg +12 -0
- package/app/public/providers/tokenreply.svg +4 -0
- package/app/public/providers/triton.svg +1 -0
- package/app/public/providers/uncloseai.png +0 -0
- package/app/public/providers/unorouter.svg +4 -0
- package/app/public/providers/upstage.svg +4 -0
- package/app/public/providers/vllm.svg +1 -0
- package/app/public/providers/void-ai.svg +4 -0
- package/app/public/providers/wafer.svg +4 -0
- package/app/public/providers/wandb.svg +4 -0
- package/app/public/providers/watsonx.svg +4 -0
- package/app/public/providers/writer.svg +4 -0
- package/app/public/providers/x5lab.svg +4 -0
- package/app/public/providers/xinference.svg +1 -0
- package/app/public/providers/yolo-auto.svg +4 -0
- package/app/public/providers/{chatglm-cn.svg → zai-web.svg} +3 -3
- package/app/public/providers/zerolimitai.svg +4 -0
- package/app/public/providers/zylo-api.svg +4 -0
- package/package.json +3 -1
- package/app/.next-cli-build/server/chunks/2231.js +0 -1
- package/app/.next-cli-build/server/chunks/2701.js +0 -10
- package/app/.next-cli-build/server/chunks/2742.js +0 -1
- package/app/.next-cli-build/server/chunks/6070.js +0 -1
- package/app/.next-cli-build/server/chunks/6560.js +0 -1
- package/app/.next-cli-build/server/chunks/7187.js +0 -1
- package/app/.next-cli-build/server/chunks/7218.js +0 -1
- package/app/.next-cli-build/server/chunks/7872.js +0 -1
- package/app/.next-cli-build/server/chunks/8955.js +0 -16
- package/app/.next-cli-build/server/chunks/9422.js +0 -13
- package/app/.next-cli-build/static/JRaGItQgERhBp83cHyRqE/_buildManifest.js +0 -1
- package/app/.next-cli-build/static/chunks/1321-a7bfb848c63bdbf7.js +0 -1
- package/app/.next-cli-build/static/chunks/5497-6eb58895074fec6d.js +0 -7
- package/app/.next-cli-build/static/chunks/705-35d16348285626c8.js +0 -1
- package/app/.next-cli-build/static/chunks/8105-49cec265df0de251.js +0 -1
- package/app/.next-cli-build/static/chunks/981-777b2911f938c030.js +0 -3
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/page-ecd3a85a40e51c66.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/combos/page-b4a78d784383253c.js +0 -3
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/endpoint/page-5689c88f2746c37a.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/health/page-133cf1aa2ce53c87.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/overview/page-2dae733c8e1582bf.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/page-7325c65533e4cf60.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/playground/page-e7ba910803086460.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/page-0f877a8a2550a1ea.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-6b500acebeff856b.js +0 -10
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-c02ccb0fd35970d1.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/swarm/page-594a59006196a03a.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/page-483f01fd35d212f5.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/layout-0a63db83d5e05667.js +0 -1
- package/app/.next-cli-build/static/chunks/app/_global-error/page-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/alerts/test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/login/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/logout/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/callback/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/start/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/oidc/test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/reset-password/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/auth/status/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/breaker/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cache/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/all-statuses/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/antigravity-mitm/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/claude-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cline-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/codex-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/copilot-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/cowork-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/deepseek-tui-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/droid-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/hermes-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/jcode-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/kilo-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/openclaw-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/cli-tools/opencode-settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/[id]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/combos/validate-roles/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/dashboard/stream/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/headroom/start/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/headroom/status/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/headroom/stop/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/health/providers/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/health/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/health/stream/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/init/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/[id]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/keys/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/locale/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/message/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/mcp/[plugin]/sse/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/deepgram/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/inworld/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/minimax/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/media-providers/tts/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/alias/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/availability/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/custom/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/disabled/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/models/test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/1min/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/[provider]/[action]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/bulk-import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/codex/import-token/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/auto-import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/cursor/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/gitlab/pat/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/iflow/cookie/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/auto-import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kimi-desktop/quota/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/api-key/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/auto-import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/import-cli-proxy/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-authorize/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/kiro/social-exchange/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/qwen/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/wp-studio/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/zed/auto-import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/oauth/zed/import/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pricing/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/[id]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/provider-nodes/validate/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/agnes-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/freebuff-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/health-timeline/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/inxora-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/onemin-api-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/onemin-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/qwencloud-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/test-models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/v0-profile/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/vault-pool/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/[id]/zenmux-plans/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/client/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/kilo/free-models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/suggested-models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/test-batch/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/providers/validate/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/[id]/test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/deno-deploy/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/proxy-pools/vercel-deploy/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pxpipe/install/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/pxpipe/status/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/database/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/proxy-test/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/require-login/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/settings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/shutdown/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/swarm/active/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/swarm/stream/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tags/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/console-logs/stream/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/load/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/save/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/send/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/translator/translate/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/disable/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/enable/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/status/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-check/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-disable/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-enable/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/tunnel/tailscale-install/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/[connectionId]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/chart/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/history/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/leaderboard/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/logs/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/meta/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/providers/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-details/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/request-logs/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/retry-stats/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stats/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/usage/stream/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/api/chat/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/speech/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/transcriptions/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/audio/voices/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/chat/completions/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/embeddings/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/images/generations/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/count_tokens/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/messages/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/[kind]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/info/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/compact/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/responses/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/search/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1/web/fetch/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/[...path]/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/v1beta/models/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/shutdown/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/api/version/update/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/dashboard/settings/pricing/page-bb9f307074c5c23a.js +0 -1
- package/app/.next-cli-build/static/chunks/app/manifest.webmanifest/route-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/app/page-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/app-error-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/forbidden-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/not-found-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/chunks/next/dist/client/components/builtin/unauthorized-158df2528a1edacc.js +0 -1
- package/app/.next-cli-build/static/css/d25230f8c6390408.css +0 -1
- /package/app/.next-cli-build/static/{JRaGItQgERhBp83cHyRqE → FP2YsqoRbzETOIHRfld7X}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[981],{15536:(e,t,s)=>{"use strict";s.d(t,{Cp:()=>r,Hx:()=>n,Iv:()=>d,Nv:()=>x,RL:()=>c,ev:()=>m,fl:()=>i,hT:()=>a,oX:()=>l,t6:()=>o});let a=["zh-CN","zh-TW"],l=[{icon:"public",title:"Access Anywhere",desc:"Use your API from any network"},{icon:"group",title:"Share Endpoint",desc:"Share URL with team members"},{icon:"code",title:"Use in Cursor/Cline",desc:"Connect AI tools remotely"},{icon:"lock",title:"Encrypted",desc:"End-to-end TLS via Cloudflare"}],n=2e3,r=3e5,i=5e3,o=5,c=1e4,d=5e3,m=[{id:"lite",label:"Lite",desc:"Drop filler, keep grammar"},{id:"full",label:"Full",desc:"Drop articles, fragments OK"},{id:"ultra",label:"Ultra",desc:"Telegraphic, max compression"},{id:"wenyan-lite",label:"文 Lite",desc:"Classical Chinese, light compression",wenyan:!0},{id:"wenyan",label:"文 Full",desc:"Maximum 文言文, 80-90% reduction",wenyan:!0},{id:"wenyan-ultra",label:"文 Ultra",desc:"Extreme classical compression",wenyan:!0}],x=[{id:"lite",label:"Lite",desc:"Build asked, name lazier option"},{id:"full",label:"Full",desc:"Ladder enforced: stdlib/native first"},{id:"ultra",label:"Ultra",desc:"YAGNI extremist, deletion first"}]},20242:(e,t,s)=>{"use strict";s.d(t,{default:()=>g});var a=s(95155),l=s(12115),n=s(14051),r=s.n(n),i=s(35497),o=s(11059),c=s(15536);async function d(e){if(!e)return!1;try{return(await fetch(`${e}/api/health`,{mode:"cors",cache:"no-store",signal:AbortSignal.timeout(c.Iv)})).ok}catch{return!1}}async function m(...e){let t=e.filter(Boolean).map(d);return!!t.length&&new Promise(e=>{let s=t.length;t.forEach(t=>t.then(t=>{t?e(!0):0==--s&&e(!1)}))})}function x({label:e,url:t,copyId:s,copied:l,onCopy:n,badge:r,actions:o}){return(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:`text-xs font-mono px-1.5 py-0.5 rounded shrink-0 min-w-[88px] text-center ${"CF"===r||"TS"===r?"bg-primary/10 text-primary":"bg-surface-2 text-text-muted"}`,children:e}),(0,a.jsx)(i.pd,{value:t,readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,a.jsx)("button",{onClick:()=>n(t,s),className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary transition-colors shrink-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:l===s?"check":"content_copy"})}),o]})}function u({status:e,className:t=""}){return(0,a.jsx)("div",{className:`p-2 rounded text-sm ${t} ${"success"===e.type?"bg-green-500/10 text-green-600 dark:text-green-400":"warning"===e.type?"bg-yellow-500/10 text-yellow-600 dark:text-yellow-400":"info"===e.type?"bg-blue-500/10 text-blue-600 dark:text-blue-400":"bg-red-500/10 text-red-600 dark:text-red-400"}`,children:e.message.split(/(https?:\/\/[^\s]+)/g).map((e,t)=>/^https?:\/\//.test(e)?(0,a.jsx)("a",{href:e,target:"_blank",rel:"noreferrer",className:"underline font-medium",children:e},t):e)})}function h({text:e}){return(0,a.jsxs)("span",{className:"relative group inline-flex items-center",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted cursor-help",children:"help"}),(0,a.jsx)("span",{className:"pointer-events-none absolute left-5 top-1/2 -translate-y-1/2 z-50 w-64 rounded bg-gray-900 dark:bg-gray-800 text-white text-xs px-2.5 py-1.5 opacity-0 group-hover:opacity-100 transition-opacity shadow-lg",children:e})]})}function p({message:e,action:t}){return(0,a.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-amber-500/10 border border-amber-500/20 text-amber-700 dark:text-amber-400",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] shrink-0 mt-0.5",children:"warning"}),(0,a.jsx)("p",{className:"text-xs flex-1",children:e}),t&&(0,a.jsx)("a",{href:t.href,className:"text-xs font-medium underline shrink-0 hover:opacity-80",onClick:t.href.startsWith("#")?e=>{e.preventDefault(),document.getElementById(t.href.slice(1))?.scrollIntoView({behavior:"smooth"})}:void 0,children:t.label})]})}function g({machineId:e}){let[t,s]=(0,l.useState)([]),[n,r]=(0,l.useState)(!0),[f,b]=(0,l.useState)(!1),[j,v]=(0,l.useState)(""),[w,k]=(0,l.useState)(null),[N,C]=(0,l.useState)(null),[S,T]=(0,l.useState)(null),[P,E]=(0,l.useState)(!1),[_,$]=(0,l.useState)(!0),[A,I]=(0,l.useState)(!0),[U,D]=(0,l.useState)(!1),[F,O]=(0,l.useState)(!0),[R,L]=(0,l.useState)(!1),[W,q]=(0,l.useState)(!1),[K,M]=(0,l.useState)(""),[z,H]=(0,l.useState)(""),[J,B]=(0,l.useState)(!1),[G,Q]=(0,l.useState)(""),[X,Y]=(0,l.useState)(null),[Z,V]=(0,l.useState)(!1),[ee,et]=(0,l.useState)(!1),[es,ea]=(0,l.useState)(!1),[el,en]=(0,l.useState)(!1),[er,ei]=(0,l.useState)(""),[eo,ec]=(0,l.useState)(!1),[ed,em]=(0,l.useState)(""),[ex,eu]=(0,l.useState)(null),[eh,ep]=(0,l.useState)(""),[eg,ey]=(0,l.useState)(""),[ef,eb]=(0,l.useState)(null),[ej,ev]=(0,l.useState)(!1),[ew,ek]=(0,l.useState)([]),[eN,eC]=(0,l.useState)(""),[eS,eT]=(0,l.useState)(!1),[eP,eE]=(0,l.useState)(!1),[e_,e$]=(0,l.useState)(!1),eA=(0,l.useRef)(null),eI=(0,l.useRef)(0),eU=(0,l.useRef)(0),eD=(0,l.useRef)(!1),eF=(0,l.useRef)(!1),eO=(0,l.useRef)(!1),eR=(0,l.useRef)(!1),[eL,eW]=(0,l.useState)(!1),[eq,eK]=(0,l.useState)(!1),[eM,ez]=(0,l.useState)(new Set),[eH,eJ]=(0,l.useState)(!1);(0,l.useEffect)(()=>{eJ(!["localhost","127.0.0.1","::1"].includes(window.location.hostname))},[]);let{copied:eB,copy:eG}=(0,o.C)(),eQ=!_||!A,eX=_?"Change the default dashboard password before activating the tunnel.":'Enable "Require login" and set a custom password before activating the tunnel.';(0,l.useEffect)(()=>{eA.current&&(eA.current.scrollTop=eA.current.scrollHeight)},[ew]),(0,l.useEffect)(()=>{e2(),eV()},[]),(0,l.useEffect)(()=>{if(!(R||es))return;let e=!R||W,t=!es||el,s=()=>{document.hidden||eZ()};if(document.addEventListener("visibilitychange",s),e&&t)return()=>document.removeEventListener("visibilitychange",s);let a=setInterval(()=>{document.hidden||eZ()},c.fl);return()=>{clearInterval(a),document.removeEventListener("visibilitychange",s)}},[R,es,W,el]),(0,l.useEffect)(()=>{let e=async()=>{if(!document.hidden){if(R&&(K||z)){let e=await m(z,K);eD.current=e,e?(eI.current=0,q(!0),eO.current||(eO.current=!0,eW(!0))):(eI.current+=1,eI.current>=c.t6&&q(!1))}else eD.current=!1;if(es&&er){let e=await d(er);eF.current=e,e?(eU.current=0,en(!0),eR.current||(eR.current=!0,eK(!0))):(eU.current+=1,eU.current>=c.t6&&en(!1))}else eF.current=!1}};if(!(R&&(K||z)||es&&er))return;e();let t=!es||el;if((!R||W)&&t)return;let s=setInterval(e,c.RL);return()=>clearInterval(s)},[R,K,z,es,er,W,el]);let eY=(0,l.useCallback)((e,t,s,a,l,n)=>{t.current?(s.current=0,a(!0),l.current||(l.current=!0,n(!0))):(s.current+=1,s.current>=c.t6&&a(!1))},[]),eZ=async()=>{try{let e=await fetch("/api/tunnel/status",{cache:"no-store"});if(!e.ok)return;let t=await e.json(),s=t.tunnel?.settingsEnabled??t.tunnel?.enabled??!1,a=t.tunnel?.tunnelUrl||"";M(a),H(t.tunnel?.publicUrl||""),L(s),eY(null,eD,eI,q,eO,eW);let l=t.tailscale?.settingsEnabled??t.tailscale?.enabled??!1,n=t.tailscale?.tunnelUrl||"";ei(n),ea(l),eY(null,eF,eU,en,eR,eK)}catch{}},eV=async()=>{O(!0);try{let[e,t]=await Promise.all([fetch("/api/settings"),fetch("/api/tunnel/status",{cache:"no-store"})]);if(e.ok){let t=await e.json();E(t.requireApiKey||!1),$(!1!==t.requireLogin),I(t.hasPassword||!1),D(t.tunnelDashboardAccess||!1)}if(t.ok){let e=await t.json(),s=e.tunnel?.settingsEnabled??e.tunnel?.enabled??!1,a=e.tunnel?.tunnelUrl||"";M(a),H(e.tunnel?.publicUrl||""),L(s),eY(null,eD,eI,q,eO,eW);let l=e.tailscale?.settingsEnabled??e.tailscale?.enabled??!1,n=e.tailscale?.tunnelUrl||"";ei(n),ea(l),eY(null,eF,eU,en,eR,eK)}}catch(e){console.log("Error loading settings:",e)}finally{O(!1)}},e0=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({tunnelDashboardAccess:e})})).ok&&D(e)}catch(e){console.log("Error updating tunnelDashboardAccess:",e)}},e1=async e=>{try{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({requireApiKey:e})}),s=await t.json().catch(()=>({}));t.ok&&(E(e),s.provisionedKey&&k(s.provisionedKey))}catch(e){console.log("Error updating requireApiKey:",e)}},e2=async()=>{try{let e=await fetch("/api/keys"),t=await e.json();e.ok&&s(t.keys||[])}catch(e){console.log("Error fetching data:",e)}finally{r(!1)}},e5=async(...e)=>{B(!0),Q("Waiting for tunnel ready...");let t=e.filter(Boolean).map(e=>`${e}/api/health`),s=Date.now();for(;Date.now()-s<c.Cp;){if(await new Promise(e=>setTimeout(e,c.Hx)),await Promise.any(t.map(async e=>{if((await fetch(e,{mode:"cors",cache:"no-store"})).ok)return!0;throw Error("not ready")})).catch(()=>!1))return L(!0),B(!1),Q(""),!0;if((Date.now()-s)%1e4<c.Hx)try{let e=await fetch("/api/tunnel/status");if(e.ok){let t=await e.json();if(!t.tunnel?.enabled)return Y({type:"error",message:"Tunnel process stopped unexpectedly."}),B(!1),Q(""),!1}}catch{}}return Y({type:"error",message:"Tunnel created but not reachable. Please try again."}),B(!1),Q(""),!1},e4=async()=>{V(!1),B(!0),Y(null),Q("Creating tunnel...");let e=!0;(async()=>{for(;e;){try{let t=await fetch("/api/tunnel/status");if(t.ok){let s=await t.json();s.download?.downloading?Q(`Downloading cloudflared... ${s.download.progress}%`):e&&Q("Creating tunnel...")}}catch{}await new Promise(e=>setTimeout(e,1e3))}})();try{let t=await fetch("/api/tunnel/enable",{method:"POST"});e=!1;let s=await t.json();if(!t.ok)return void Y({type:"error",message:s.error||"Failed to enable tunnel"});let a=s.tunnelUrl;if(!a)return void Y({type:"error",message:"No tunnel URL returned"});M(a),H(s.publicUrl||""),await e5(s.publicUrl,a)}catch(e){Y({type:"error",message:e.message})}finally{e=!1,B(!1),Q("")}},e3=async()=>{B(!0),Y(null);try{let e=await fetch("/api/tunnel/disable",{method:"POST"}),t=await e.json();e.ok?(L(!1),M(""),et(!1),Y({type:"success",message:"Tunnel disabled"})):Y({type:"error",message:t.error||"Failed to disable tunnel"})}catch(e){Y({type:"error",message:e.message})}finally{B(!1)}},e8=async()=>{eb(null);try{let e=await fetch("/api/tunnel/tailscale-check");if(e.ok){let t=await e.json();return eb(t.installed),t}}catch{}return eb(!1),{installed:!1}},e6=async()=>{ev(!0),eu(null),ek([]);try{let e=await fetch("/api/tunnel/tailscale-install",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sudoPassword:eN})});eC("");let t=e.body.getReader(),s=new TextDecoder,a="";for(;;){let{done:e,value:l}=await t.read();if(e)break;let n=(a+=s.decode(l,{stream:!0})).split("\n\n");for(let e of(a=n.pop()||"",n)){let t=e.split("\n"),s="progress",a=null;for(let e of t)if(e.startsWith("event: ")&&(s=e.slice(7).trim()),e.startsWith("data: "))try{a=JSON.parse(e.slice(6))}catch{}if(a)if("progress"===s)ek(e=>[...e.slice(-50),a.message]);else if("done"===s){eb(!0),ev(!1),eE(!1),tt();return}else"error"===s&&eu({type:"error",message:a.error||"Install failed"})}}}catch(e){eu({type:"error",message:e.message})}finally{ev(!1)}},e9=async e=>{em("Waiting for Tailscale ready...");let t=`${e}/api/health`,s=Date.now();for(;Date.now()-s<c.Cp;){await new Promise(e=>setTimeout(e,c.Hx));try{let e=await fetch(t,{mode:"no-cors",cache:"no-store"});if(e.ok||"opaque"===e.type)return!0}catch{}}return!1},e7=(e,t)=>{ep(e),ey(t)},te=()=>{ep(""),ey("")},tt=async()=>{eE(!1),eT(!0),ec(!0),eu(null),em("Connecting..."),te();try{let e=await fetch("/api/tunnel/tailscale-enable",{method:"POST"}),t=await e.json();if(e.ok&&t.success){ei(t.tunnelUrl||"");let e=await e9(t.tunnelUrl);ea(!0),eu(e?null:{type:"warning",message:"Connected but not reachable yet."});return}if(t.needsLogin&&t.authUrl){e7(t.authUrl,"Open Login Page"),em('Login required — click "Open Login Page" to continue');for(let e=0;e<40;e++){await new Promise(e=>setTimeout(e,3e3));try{let e=await fetch("/api/tunnel/tailscale-check");if(e.ok&&(await e.json()).loggedIn){te(),em("Starting funnel...");let e=await fetch("/api/tunnel/tailscale-enable",{method:"POST"}),t=await e.json();if(e.ok&&t.success){ei(t.tunnelUrl||"");let e=await e9(t.tunnelUrl);ea(!0),eu(e?null:{type:"warning",message:"Connected but not reachable yet."})}else t.funnelNotEnabled&&t.enableUrl?await ts(t.enableUrl):eu({type:"error",message:t.error||"Failed to start funnel"});return}}catch{}}te(),eu({type:"error",message:"Login timed out. Please try again."});return}if(t.funnelNotEnabled&&t.enableUrl)return void await ts(t.enableUrl);eu({type:"error",message:t.error||"Failed to connect"})}catch(e){eu({type:"error",message:e.message})}finally{ec(!1),eT(!1),em(""),te()}},ts=async e=>{e7(e,"Open Funnel Settings"),em('Click "Open Funnel Settings" to enable Funnel...');for(let e=0;e<40;e++){await new Promise(e=>setTimeout(e,3e3));try{let e=await fetch("/api/tunnel/tailscale-enable",{method:"POST"}),t=await e.json();if(e.ok&&t.success){te(),ei(t.tunnelUrl||"");let e=await e9(t.tunnelUrl);ea(!0),eu(e?null:{type:"warning",message:"Connected but not reachable yet."});return}if(t.funnelNotEnabled)continue;if(t.error){te(),eu({type:"error",message:t.error});return}}catch{}}te(),eu({type:"error",message:"Timed out waiting for Funnel to be enabled."})},ta=async()=>{ec(!0),eu(null);try{let e=await fetch("/api/tunnel/tailscale-disable",{method:"POST"}),t=await e.json();e.ok?(ea(!1),ei(""),e$(!1),eu({type:"success",message:"Tailscale disabled"})):eu({type:"error",message:t.error||"Failed to disable Tailscale"})}catch(e){eu({type:"error",message:e.message})}finally{ec(!1)}},tl=async()=>{eu(null),ek([]);let e=await e8();e?.installed&&e?.hasCachedPassword?tt():eE(!0)},tn=async()=>{if(j.trim())try{let e=await fetch("/api/keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:j})}),t=await e.json();e.ok&&(k(t.key),await e2(),v(""),b(!1))}catch(e){console.log("Error creating key:",e)}},tr=async e=>{C({title:"Delete API Key",message:"Delete this API key?",onConfirm:async()=>{C(null);try{(await fetch(`/api/keys/${e}`,{method:"DELETE"})).ok&&(s(t.filter(t=>t.id!==e)),ez(t=>{let s=new Set(t);return s.delete(e),s}))}catch(e){console.log("Error deleting key:",e)}}})},ti=async(e,t)=>{try{(await fetch(`/api/keys/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&s(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("Error toggling key:",e)}},[to,tc]=(0,l.useState)("/v1");return((0,l.useEffect)(()=>{tc(`${window.location.origin}/v1`)},[]),n)?(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)(i.Qv,{}),(0,a.jsx)(i.Qv,{})]}):(0,a.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,a.jsx)(i.zY,{title:"Endpoint",description:"Gateway URL, public exposure, and API keys",icon:"api",actions:(0,a.jsx)(i.$n,{size:"sm",icon:"add",onClick:()=>b(!0),children:"New Key"})}),(0,a.jsxs)(i.Zp,{children:[(0,a.jsxs)("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"api"}),"API Endpoint"]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)(x,{label:"Local",url:to,copyId:"local_url",copied:eB,onCopy:eG}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:`text-xs font-mono px-1.5 py-0.5 rounded shrink-0 min-w-[88px] text-center ${R?"bg-primary/10 text-primary":"bg-surface-2 text-text-muted"}`,children:"Tunnel"}),R&&!J&&W?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.pd,{value:`${z||K}/v1`,readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,a.jsx)("button",{onClick:()=>eG(`${z||K}/v1`,"tunnel_url"),className:"p-2 hover:hover:bg-surface-3 rounded text-text-muted hover:text-primary transition-colors shrink-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"tunnel_url"===eB?"check":"content_copy"})}),(0,a.jsx)("button",{onClick:()=>et(!0),className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Disable Tunnel",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]}):!R||J||W?J?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-border bg-input text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),G||"Creating tunnel..."]}),(0,a.jsx)("button",{onClick:()=>{B(!1),Q("")},className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Stop",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]}):X?.type==="error"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-red-300 dark:border-red-800 bg-red-500/5 text-sm text-danger",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"error"}),X.message]}),(0,a.jsx)(i.$n,{size:"sm",icon:"cloud_upload",onClick:()=>V(!0),children:"Enable"})]}):F?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-border bg-input text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"Checking..."]}),(0,a.jsx)("button",{onClick:()=>O(!1),className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Stop",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]}):(0,a.jsx)(i.$n,{size:"sm",icon:"cloud_upload",onClick:()=>{eQ?Y({type:"error",message:`Security required: ${eX}`}):P?V(!0):Y({type:"error",message:'Security required: Enable "Require API key" before activating the tunnel.'})},children:"Enable"}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-amber-300 dark:border-amber-800 bg-amber-500/5 text-sm text-warning",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),eL?"Tunnel reconnecting...":"Tunnel checking..."]}),(0,a.jsx)("button",{onClick:()=>et(!0),className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Disable Tunnel",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:`text-xs font-mono px-1.5 py-0.5 rounded shrink-0 min-w-[88px] text-center ${es?"bg-primary/10 text-primary":"bg-surface-2 text-text-muted"}`,children:"Tailscale"}),es&&!eo&&el?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.pd,{value:`${er}/v1`,readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,a.jsx)("button",{onClick:()=>eG(`${er}/v1`,"ts_url"),className:"p-2 hover:hover:bg-surface-3 rounded text-text-muted hover:text-primary transition-colors shrink-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"ts_url"===eB?"check":"content_copy"})}),(0,a.jsx)("button",{onClick:()=>e$(!0),className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Disable Tailscale",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]}):!es||eo||el?eo||eS?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-border bg-input text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),ed||"Connecting..."]}),eh&&(0,a.jsx)(i.$n,{size:"sm",icon:"open_in_new",onClick:()=>window.open(eh,"tailscale_auth","width=600,height=700,noopener,noreferrer"),children:eg||"Open"}),(0,a.jsx)("button",{onClick:()=>{ec(!1),eT(!1),em(""),te()},className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Stop",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]}):ex?.type==="error"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-red-300 dark:border-red-800 bg-red-500/5 text-sm text-danger",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"error"}),ex.message]}),(0,a.jsx)(i.$n,{size:"sm",icon:"vpn_lock",onClick:tl,children:"Enable"})]}):(0,a.jsx)(i.$n,{size:"sm",icon:"vpn_lock",onClick:()=>{eQ?eu({type:"error",message:`Security required: ${eX}`}):tl()},className:"bg-linear-to-r from-indigo-500 to-purple-500 hover:from-indigo-600 hover:to-purple-600 text-white!",children:"Enable"}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex-1 flex items-center gap-2 px-3 py-1.5 rounded border border-amber-300 dark:border-amber-800 bg-amber-500/5 text-sm text-warning",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),eq?"Tailscale reconnecting...":"Tailscale checking..."]}),(0,a.jsx)("button",{onClick:()=>e$(!0),className:"p-2 hover:bg-danger/10 text-danger transition-colors shrink-0",title:"Disable Tailscale",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"power_settings_new"})})]})]})]}),eQ&&!R&&!es&&(0,a.jsx)("div",{className:"mt-4",children:(0,a.jsx)(p,{message:eX,action:{label:"Open settings",href:"/dashboard/profile"}})}),(R||es)&&(0,a.jsxs)("div",{className:"mt-4 flex flex-col gap-2",children:[!P&&(0,a.jsx)(p,{message:"Require API key is disabled — your endpoint is publicly accessible without authentication.",action:{label:"Enable",href:"#require-api-key"}}),(!_||!A)&&(0,a.jsx)(p,{message:_?"Dashboard uses the default password — change it in Profile settings.":"Require login is disabled — anyone can access your dashboard via tunnel.",action:{label:_?"Change password":"Enable",href:"/dashboard/profile"}})]}),(R||es)&&(0,a.jsxs)("div",{className:"mt-4 pt-4 border-t border-border flex items-center gap-3",children:[(0,a.jsx)(i.lM,{checked:U,onChange:()=>e0(!U)}),(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)("p",{className:"font-medium text-sm",children:"Allow dashboard access via tunnel"}),(0,a.jsx)(h,{text:"When enabled, the dashboard can be accessed through your tunnel or Tailscale URL (login still required). When disabled, dashboard access via tunnel/Tailscale is completely blocked."})]})]})]}),(0,a.jsxs)(i.Zp,{id:"require-api-key",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("h2",{className:"text-lg font-semibold flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"vpn_key"}),"API Keys"]}),(0,a.jsx)(i.$n,{icon:"add",onClick:()=>b(!0),children:"Create Key"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pb-4 mb-4 border-b border-border",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Require API key"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Requests without a valid key will be rejected"})]}),(0,a.jsx)(i.lM,{checked:P,onChange:()=>e1(!P)})]}),eH&&!P&&(0,a.jsx)("div",{className:"mb-4 -mt-2",children:(0,a.jsx)(p,{message:"Endpoint is exposed without an API key."})}),0===t.length?(0,a.jsxs)("div",{className:"text-center py-12",children:[(0,a.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:"vpn_key"})}),(0,a.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No API keys yet"}),(0,a.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Create your first API key to get started"}),(0,a.jsx)(i.$n,{icon:"add",onClick:()=>b(!0),children:"Create Key"})]}):(0,a.jsx)("div",{className:"flex flex-col",children:t.map(e=>{var t;return(0,a.jsxs)("div",{className:`group flex items-center justify-between py-3 border-b border-black/[0.03] dark:border-white/[0.03] last:border-b-0 ${!1===e.isActive?"opacity-60":""}`,children:[(0,a.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:e.name}),(0,a.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,a.jsx)("code",{className:"text-xs text-text-muted font-mono",children:eM.has(e.id)?e.key:(t=e.key)&&!(t.length<=10)?t.slice(0,6)+"•".repeat(t.length-10)+t.slice(-4):t||""}),(0,a.jsx)("button",{onClick:()=>{var t;return t=e.id,void ez(e=>{let s=new Set(e);return s.has(t)?s.delete(t):s.add(t),s})},className:"p-1 hover:hover:bg-surface-3 rounded text-text-muted hover:text-primary opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-all",title:eM.has(e.id)?"Hide key":"Show key",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:eM.has(e.id)?"visibility_off":"visibility"})}),(0,a.jsx)("button",{onClick:()=>eG(e.key,e.id),className:"p-1 hover:hover:bg-surface-3 rounded text-text-muted hover:text-primary opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-all",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:eB===e.id?"check":"content_copy"})})]}),(0,a.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Created ",new Date(e.createdAt).toLocaleDateString()]}),!1===e.isActive&&(0,a.jsx)("p",{className:"text-xs text-orange-500 mt-1",children:"Paused"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[Array.isArray(e.allowedModels)&&e.allowedModels.length>0&&(0,a.jsxs)("span",{className:"hidden sm:inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-semibold text-primary",title:`Restricted to ${e.allowedModels.length} models`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:"lock"}),e.allowedModels.length]}),(0,a.jsx)(i.lM,{size:"sm",checked:e.isActive??!0,onChange:t=>{e.isActive&&!t?C({title:"Pause API Key",message:`Pause API key "${e.name}"?
|
|
2
|
+
|
|
3
|
+
This key will stop working immediately but can be resumed later.`,onConfirm:async()=>{C(null),ti(e.id,t)}}):ti(e.id,t)},title:e.isActive?"Pause key":"Resume key"}),(0,a.jsx)("button",{onClick:()=>T(e),className:"p-2 hover:bg-surface-2 text-text-muted hover:text-primary opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-all",title:"Model access control",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"tune"})}),(0,a.jsx)("button",{onClick:()=>tr(e.id),className:"p-2 hover:bg-danger/10 text-danger opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-all",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]})]},e.id)})})]}),(0,a.jsx)(i.aF,{isOpen:f,title:"Create API Key",onClose:()=>{b(!1),v("")},children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)(i.pd,{label:"Key Name",value:j,onChange:e=>v(e.target.value),placeholder:"Production Key"}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:tn,fullWidth:!0,disabled:!j.trim(),children:"Create"}),(0,a.jsx)(i.$n,{onClick:()=>{b(!1),v("")},variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}),(0,a.jsx)(i.aF,{isOpen:!!w,title:"API Key Created",onClose:()=>k(null),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,a.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 mb-2 font-medium",children:"Save this key now!"}),(0,a.jsx)("p",{className:"text-sm text-yellow-700 dark:text-yellow-300",children:"This is the only time you will see this key. Store it securely."})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.pd,{value:w||"",readOnly:!0,className:"flex-1 font-mono text-sm"}),(0,a.jsx)(i.$n,{variant:"secondary",icon:"created_key"===eB?"check":"content_copy",onClick:()=>eG(w,"created_key"),children:"created_key"===eB?"Copied!":"Copy"})]}),(0,a.jsx)(i.$n,{onClick:()=>k(null),fullWidth:!0,children:"Done"})]})}),(0,a.jsx)(i.aF,{isOpen:Z,title:"Enable Tunnel",onClose:()=>V(!1),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)("div",{className:"bg-surface-2 border border-border-subtle rounded-lg p-4",children:(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary",children:"cloud_upload"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm text-text-main font-medium mb-1",children:"Cloudflare Tunnel"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Expose your local ExtremeRouter to the internet. No port forwarding, no static IP needed. Share endpoint URL with your team or use it in Cursor, Cline, and other AI tools from anywhere."})]})]})}),(0,a.jsx)("div",{className:"grid grid-cols-2 gap-3",children:c.oX.map(e=>(0,a.jsxs)("div",{className:"flex flex-col items-center text-center p-3 rounded-lg bg-sidebar/50",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-xl text-primary mb-1",children:e.icon}),(0,a.jsx)("p",{className:"text-xs font-semibold",children:e.title}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:e.desc})]},e.title))}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Requires outbound port 7844 (TCP/UDP). Connection may take 10-30s."}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:e4,fullWidth:!0,children:"Start Tunnel"}),(0,a.jsx)(i.$n,{onClick:()=>V(!1),variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}),(0,a.jsx)(i.aF,{isOpen:ee,title:"Disable Tunnel",onClose:()=>!J&&et(!1),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"The Cloudflare tunnel will be disconnected. Remote access via tunnel URL will stop working."}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:e3,fullWidth:!0,disabled:J,variant:"danger",children:J?"Disabling...":"Disable"}),(0,a.jsx)(i.$n,{onClick:()=>et(!1),variant:"ghost",fullWidth:!0,disabled:J,children:"Cancel"})]})]})}),(0,a.jsx)(i.aF,{isOpen:eP,title:"Tailscale Funnel",onClose:()=>{ej||(eE(!1),eC(""),eu(null))},children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[null===ef&&(0,a.jsxs)("p",{className:"text-sm text-text-muted flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"Checking..."]}),!1===ef&&!ej&&(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Tailscale is not installed. Install it to enable Funnel."}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:e6,fullWidth:!0,children:"Install Tailscale"}),(0,a.jsx)(i.$n,{onClick:()=>eE(!1),variant:"ghost",fullWidth:!0,children:"Cancel"})]})]}),ej&&(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"Installing Tailscale..."]}),ew.length>0&&(0,a.jsx)("div",{ref:eA,className:"bg-surface-2 rounded p-2 max-h-40 overflow-y-auto font-mono text-xs text-text-muted",children:ew.map((e,t)=>(0,a.jsx)("div",{children:e},t))})]}),!0===ef&&!ej&&(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-success",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"check_circle"}),"Tailscale installed"]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:()=>tt(),fullWidth:!0,children:"Connect"}),(0,a.jsx)(i.$n,{onClick:()=>eE(!1),variant:"ghost",fullWidth:!0,children:"Cancel"})]})]}),ex&&(0,a.jsx)(u,{status:ex})]})}),(0,a.jsx)(i.aF,{isOpen:e_,title:"Disable Tailscale",onClose:()=>!eo&&e$(!1),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Tailscale Funnel will be stopped. Remote access via Tailscale URL will stop working."}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.$n,{onClick:ta,fullWidth:!0,disabled:eo,variant:"danger",children:eo?"Disabling...":"Disable"}),(0,a.jsx)(i.$n,{onClick:()=>e$(!1),variant:"ghost",fullWidth:!0,disabled:eo,children:"Cancel"})]})]})}),(0,a.jsx)(y,{apiKey:S,onClose:()=>T(null),onSaved:async()=>{await e2(),T(null)}}),(0,a.jsx)(i.uo,{isOpen:!!N,onClose:()=>C(null),onConfirm:N?.onConfirm,title:N?.title||"Confirm",message:N?.message,variant:"danger"})]})}function y({apiKey:e,onClose:t,onSaved:s}){let[n,r]=(0,l.useState)(()=>Array.isArray(e?.allowedModels)?[...e.allowedModels]:[]),[o,c]=(0,l.useState)(""),[d,m]=(0,l.useState)(!1);if((0,l.useEffect)(()=>{e&&(r(Array.isArray(e.allowedModels)?[...e.allowedModels]:[]),c(""))},[e]),!e)return null;let x=()=>{let e=o.trim();e&&(r(t=>t.includes(e)?t:[...t,e]),c(""))},u=async()=>{m(!0);try{await fetch(`/api/keys/${e.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({allowedModels:n.length>0?n:null})}),await s()}catch(e){console.log("Failed to save model access:",e)}finally{m(!1)}};return(0,a.jsx)(i.aF,{isOpen:!!e,onClose:t,title:`Model Access — ${e.name||"Key"}`,footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.$n,{variant:"ghost",onClick:t,disabled:d,children:"Cancel"}),(0,a.jsx)(i.$n,{onClick:u,loading:d,children:"Save"})]}),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("p",{className:"text-sm text-text-muted",children:["Restrict which models this API key can access. Leave empty to allow all models. Supports exact model IDs (e.g. ",(0,a.jsx)("code",{className:"font-mono text-xs",children:"glm/glm-5"}),") or provider prefixes (e.g. ",(0,a.jsx)("code",{className:"font-mono text-xs",children:"glm/"})," to allow all GLM models)."]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)("input",{type:"text",value:o,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),x())},placeholder:"e.g. glm/glm-5 or glm/",className:"flex-1 rounded border border-border bg-surface-2 px-3 py-2 text-sm text-text-main placeholder:text-text-muted/70 focus:outline-none focus:ring-2 focus:ring-primary/30"}),(0,a.jsx)(i.$n,{size:"sm",variant:"secondary",icon:"add",onClick:x,children:"Add"})]}),n.length>0?(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:n.map(e=>(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-primary/30 bg-primary/5 px-2.5 py-1 text-xs font-mono text-primary",children:[e,(0,a.jsx)("button",{onClick:()=>r(t=>t.filter(t=>t!==e)),className:"text-primary/60 hover:text-danger transition-colors","aria-label":`Remove ${e}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]},e))}):(0,a.jsx)("div",{className:"rounded-lg border border-dashed border-border p-4 text-center text-sm text-text-muted",children:"No restrictions — this key can access all models"}),n.length>0&&(0,a.jsx)("button",{onClick:()=>r([]),className:"self-start text-xs text-danger hover:underline",children:"Clear all restrictions"})]})})}g.propTypes={machineId:r().string.isRequired}},90981:(e,t,s)=>{Promise.resolve().then(s.bind(s,20242))}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3721],{2531:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>n});var a=t(95155),l=t(12115),r=t(35497);let i=[{key:"providerDown",label:"Provider Down",desc:"Circuit breaker opens (provider repeatedly failing)",icon:"error"},{key:"rateLimited",label:"Rate Limited",desc:"Account hits 429/403 from upstream",icon:"block"},{key:"healthDegraded",label:"Health Degraded",desc:"Success rate drops below 70%",icon:"monitor_heart"},{key:"budgetExceeded",label:"Budget Exceeded",desc:"Usage quota reached",icon:"data_usage"}];function n(){let[e,s]=(0,l.useState)(null),[t,n]=(0,l.useState)(!0),[c,o]=(0,l.useState)(!1),[d,h]=(0,l.useState)(null),[x,m]=(0,l.useState)(null),u=(0,l.useCallback)(async()=>{try{let e=await fetch("/api/settings",{cache:"no-store"});if(e.ok){let t=await e.json();s(t)}}catch{}n(!1)},[]);(0,l.useEffect)(()=>{u()},[u]),(0,l.useEffect)(()=>()=>{b.current&&clearTimeout(b.current)},[]);let b=(0,l.useRef)(null),p=(0,l.useCallback)(async(e,t,a)=>{s(s=>{let l=a?{...s,[e]:{...s?.[e]||{},[a]:t}}:{...s,[e]:t};return b.current&&clearTimeout(b.current),b.current=setTimeout(async()=>{try{let s=a?{[e]:{...l[e]||{},[a]:t}}:{[e]:t};(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).ok&&(m(a||e),setTimeout(()=>m(null),1500))}catch{}},500),l})},[]),g=async()=>{o(!0),h(null);try{let e=await fetch("/api/alerts/test",{method:"POST"}),s=await e.json();h(s.success?"sent":"failed")}catch{h("failed")}o(!1),setTimeout(()=>h(null),5e3)};if(t)return(0,a.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,a.jsx)(r.Zp,{children:(0,a.jsx)("div",{className:"h-6 w-48 animate-pulse rounded bg-sidebar"})}),(0,a.jsx)(r.Zp,{children:(0,a.jsx)("div",{className:"h-32 animate-pulse rounded bg-sidebar"})})]});let j=e?.webhookEnabled===!0,f=!!(e?.webhookDiscordUrl||e?.webhookTelegramToken||e?.webhookGenericUrl);return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-5",children:[(0,a.jsx)(r.zY,{title:"Webhook Alerts",description:"Get notified via Discord, Telegram, or generic webhook when providers fail",icon:"notifications_active",actions:(0,a.jsx)(r.$n,{size:"sm",variant:"secondary",icon:c?"progress_activity":"send",onClick:g,disabled:c||!j||!f,children:c?"Sending...":"Send Test"})}),(0,a.jsx)(r.Zp,{children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)(r.lM,{checked:j,onChange:e=>p("webhookEnabled",e),label:"Enable Webhook Alerts"}),j&&(0,a.jsx)(r.Ex,{variant:"success",size:"sm",dot:!0,children:"Active"})]}),j&&!f&&(0,a.jsx)(r.Ex,{variant:"warning",size:"sm",icon:"warning",children:"No channel configured"})]})}),j&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Delivery Channels"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"Configure where alerts are sent. Fill one or more."})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-[#5865F2]/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[#5865F2] text-lg",children:"chat"})}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsx)(r.pd,{label:"Discord Webhook URL",type:"text",value:e?.webhookDiscordUrl||"",onChange:e=>p("webhookDiscordUrl",e.target.value),placeholder:"https://discord.com/api/webhooks/...",hint:"webhookDiscordUrl"===x?"✓ Saved":void 0})})]}),(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-[#0088cc]/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[#0088cc] text-lg",children:"send"})}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col gap-3",children:[(0,a.jsx)(r.pd,{label:"Telegram Bot Token",type:"password",value:e?.webhookTelegramToken||"",onChange:e=>p("webhookTelegramToken",e.target.value),placeholder:"123456:ABC-DEF...",hint:"webhookTelegramToken"===x?"✓ Saved":void 0}),(0,a.jsx)(r.pd,{label:"Telegram Chat ID",type:"text",value:e?.webhookTelegramChatId||"",onChange:e=>p("webhookTelegramChatId",e.target.value),placeholder:"Example -1001234567890",hint:"webhookTelegramChatId"===x?"✓ Saved":void 0})]})]}),(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary text-lg",children:"webhook"})}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsx)(r.pd,{label:"Generic Webhook URL",type:"text",value:e?.webhookGenericUrl||"",onChange:e=>p("webhookGenericUrl",e.target.value),placeholder:"https://your-server.com/webhook",hint:"webhookGenericUrl"===x?"✓ Saved":void 0})})]})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Alert Events"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"Choose which events trigger an alert."})]}),(0,a.jsx)("div",{className:"flex flex-col gap-3",children:i.map(s=>{let t=e?.webhookAlertEvents?.[s.key]===!0;return(0,a.jsxs)("div",{className:`flex items-center justify-between rounded-lg border px-3 py-2.5 transition-colors ${t?"border-primary/30 bg-primary/[0.03]":"border-border-subtle"}`,children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("span",{className:`material-symbols-outlined text-lg ${t?"text-primary":"text-text-muted"}`,children:s.icon}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium text-text-main",children:s.label}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:s.desc})]})]}),(0,a.jsx)(r.lM,{size:"sm",checked:t,onChange:e=>p("webhookAlertEvents",e,s.key)})]},s.key)})})]}),"sent"===d&&(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-success/20 bg-success/[0.05] px-4 py-2.5 text-sm text-success",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",children:"check_circle"}),"Test alert sent! Check your configured channels."]}),"failed"===d&&(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-danger/20 bg-danger/[0.05] px-4 py-2.5 text-sm text-danger",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",children:"error"}),"Failed to send test alert. Check your channel URLs."]})]})]})}},20154:(e,s,t)=>{Promise.resolve().then(t.bind(t,2531))}},e=>{e.O(0,[27,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3721],{2531:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>n});var a=t(95155),l=t(12115),r=t(35497);let i=[{key:"providerDown",label:"Provider Down",desc:"Circuit breaker opens (provider repeatedly failing)",icon:"error"},{key:"rateLimited",label:"Rate Limited",desc:"Account hits 429/403 from upstream",icon:"block"},{key:"healthDegraded",label:"Health Degraded",desc:"Success rate drops below 70%",icon:"monitor_heart"},{key:"budgetExceeded",label:"Budget Exceeded",desc:"Usage quota reached",icon:"data_usage"}];function n(){let[e,s]=(0,l.useState)(null),[t,n]=(0,l.useState)(!0),[c,o]=(0,l.useState)(!1),[d,h]=(0,l.useState)(null),[x,m]=(0,l.useState)(null),u=(0,l.useCallback)(async()=>{try{let e=await fetch("/api/settings",{cache:"no-store"});if(e.ok){let t=await e.json();s(t)}}catch{}n(!1)},[]);(0,l.useEffect)(()=>{u()},[u]),(0,l.useEffect)(()=>()=>{b.current&&clearTimeout(b.current)},[]);let b=(0,l.useRef)(null),p=(0,l.useCallback)(async(e,t,a)=>{s(s=>{let l=a?{...s,[e]:{...s?.[e]||{},[a]:t}}:{...s,[e]:t};return b.current&&clearTimeout(b.current),b.current=setTimeout(async()=>{try{let s=a?{[e]:{...l[e]||{},[a]:t}}:{[e]:t};(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).ok&&(m(a||e),setTimeout(()=>m(null),1500))}catch{}},500),l})},[]),g=async()=>{o(!0),h(null);try{let e=await fetch("/api/alerts/test",{method:"POST"}),s=await e.json();h(s.success?"sent":"failed")}catch{h("failed")}o(!1),setTimeout(()=>h(null),5e3)};if(t)return(0,a.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,a.jsx)(r.Zp,{children:(0,a.jsx)("div",{className:"h-6 w-48 animate-pulse rounded bg-sidebar"})}),(0,a.jsx)(r.Zp,{children:(0,a.jsx)("div",{className:"h-32 animate-pulse rounded bg-sidebar"})})]});let j=e?.webhookEnabled===!0,f=!!(e?.webhookDiscordUrl||e?.webhookTelegramToken||e?.webhookGenericUrl);return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-5",children:[(0,a.jsx)(r.zY,{title:"Webhook Alerts",description:"Get notified via Discord, Telegram, or generic webhook when providers fail",icon:"notifications_active",actions:(0,a.jsx)(r.$n,{size:"sm",variant:"secondary",icon:c?"progress_activity":"send",onClick:g,disabled:c||!j||!f,children:c?"Sending...":"Send Test"})}),(0,a.jsx)(r.Zp,{children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)(r.lM,{checked:j,onChange:e=>p("webhookEnabled",e),label:"Enable Webhook Alerts"}),j&&(0,a.jsx)(r.Ex,{variant:"success",size:"sm",dot:!0,children:"Active"})]}),j&&!f&&(0,a.jsx)(r.Ex,{variant:"warning",size:"sm",icon:"warning",children:"No channel configured"})]})}),j&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Delivery Channels"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"Configure where alerts are sent. Fill one or more."})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-[#5865F2]/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[#5865F2] text-lg",children:"chat"})}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsx)(r.pd,{label:"Discord Webhook URL",type:"text",value:e?.webhookDiscordUrl||"",onChange:e=>p("webhookDiscordUrl",e.target.value),placeholder:"https://discord.com/api/webhooks/...",hint:"webhookDiscordUrl"===x?"✓ Saved":void 0})})]}),(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-[#0088cc]/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[#0088cc] text-lg",children:"send"})}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col gap-3",children:[(0,a.jsx)(r.pd,{label:"Telegram Bot Token",type:"password",value:e?.webhookTelegramToken||"",onChange:e=>p("webhookTelegramToken",e.target.value),placeholder:"123456:ABC-DEF...",hint:"webhookTelegramToken"===x?"✓ Saved":void 0}),(0,a.jsx)(r.pd,{label:"Telegram Chat ID",type:"text",value:e?.webhookTelegramChatId||"",onChange:e=>p("webhookTelegramChatId",e.target.value),placeholder:"Example -1001234567890",hint:"webhookTelegramChatId"===x?"✓ Saved":void 0})]})]}),(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-primary text-lg",children:"webhook"})}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsx)(r.pd,{label:"Generic Webhook URL",type:"text",value:e?.webhookGenericUrl||"",onChange:e=>p("webhookGenericUrl",e.target.value),placeholder:"https://your-server.com/webhook",hint:"webhookGenericUrl"===x?"✓ Saved":void 0})})]})]})]}),(0,a.jsxs)(r.Zp,{children:[(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Alert Events"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"Choose which events trigger an alert."})]}),(0,a.jsx)("div",{className:"flex flex-col gap-3",children:i.map(s=>{let t=e?.webhookAlertEvents?.[s.key]===!0;return(0,a.jsxs)("div",{className:`flex items-center justify-between rounded-lg border px-3 py-2.5 transition-colors ${t?"border-primary/30 bg-primary/[0.03]":"border-border-subtle"}`,children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("span",{className:`material-symbols-outlined text-lg ${t?"text-primary":"text-text-muted"}`,children:s.icon}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium text-text-main",children:s.label}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:s.desc})]})]}),(0,a.jsx)(r.lM,{size:"sm",checked:t,onChange:e=>p("webhookAlertEvents",e,s.key)})]},s.key)})})]}),"sent"===d&&(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-success/20 bg-success/[0.05] px-4 py-2.5 text-sm text-success",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",children:"check_circle"}),"Test alert sent! Check your configured channels."]}),"failed"===d&&(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-danger/20 bg-danger/[0.05] px-4 py-2.5 text-sm text-danger",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",children:"error"}),"Failed to send test alert. Check your channel URLs."]})]})]})}},20154:(e,s,t)=>{Promise.resolve().then(t.bind(t,2531))}},e=>{e.O(0,[27,9497,705,1321,5497,8441,3794,7358],()=>e(e.s=20154)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4465],{86508:(e,t,r)=>{Promise.resolve().then(r.bind(r,88512))},88512:(e,t,r)=>{"use strict";r.d(t,{default:()=>g});var a=r(95155),s=r(12115),l=r(35497),i=r(28777),n=r(88105);let o="basic-chat.sessions",d="basic-chat.activeSessionId",c="basic-chat.activeProviderId",m="basic-chat.draft";function u(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`chat_${Date.now()}_${Math.random().toString(16).slice(2)}`}function x(e){if("string"==typeof e)return e;if(null==e)return"";if(Array.isArray(e))return e.map(x).filter(Boolean).join(" ");if("object"==typeof e){if("string"==typeof e.message)return e.message;if("string"==typeof e.error)return e.error;try{return JSON.stringify(e)}catch{}}return String(e)}function p(e=""){let t=x(e).replace(/\s+/g," ").trim();return t?t.length>52?`${t.slice(0,52).trimEnd()}…`:t:"New chat"}async function f(e){return await new Promise((t,r)=>{let a=new FileReader;a.onload=()=>t(String(a.result||"")),a.onerror=()=>r(a.error||Error("Failed to read file")),a.readAsDataURL(e)})}function h(e){return e?.name||function(e=""){return String(e).replace(/[-_]/g," ").replace(/\b\w/g,e=>e.toUpperCase()).trim()||"Unknown"}(e?.provider||e?.id||"provider")}function g(){let[e,t]=(0,s.useState)([]),[r,g]=(0,s.useState)(!0),[b,v]=(0,s.useState)(""),[y,N]=(0,s.useState)(()=>{try{let e=function(e,t){try{return JSON.parse(e)}catch{return t}}(globalThis.localStorage.getItem(o),[]);return Array.isArray(e)?e.map(e=>({...e,messages:Array.isArray(e.messages)?e.messages:[]})):[]}catch{return[]}}),[w,j]=(0,s.useState)(()=>globalThis.localStorage.getItem(d)||""),[S,I]=(0,s.useState)(()=>globalThis.localStorage.getItem(c)||""),[A,k]=(0,s.useState)(""),[D,T]=(0,s.useState)(()=>globalThis.localStorage.getItem(m)||""),[O,$]=(0,s.useState)([]),[C,_]=(0,s.useState)(!1),[M,E]=(0,s.useState)(""),[U,R]=(0,s.useState)(""),[z,q]=(0,s.useState)(!1),[P,J]=(0,s.useState)(!1),[B,F]=(0,s.useState)(!1),K=(0,s.useRef)(null),L=(0,s.useRef)(null),W=(0,s.useRef)(!1),H=(0,s.useRef)(null),Y=(0,s.useRef)(null),[G,Q]=(0,s.useState)(null),V=(0,s.useRef)(null),X=e=>{Q(e),V.current&&clearTimeout(V.current),V.current=setTimeout(()=>Q(null),3e3)};(0,s.useEffect)(()=>{q(!0)},[]),(0,s.useEffect)(()=>{let e=!1;return async function(){g(!0),v("");try{let r=await fetch("/api/providers",{cache:"no-store"}),a=await r.json().catch(()=>({})),s=Array.isArray(a.connections)?a.connections.filter(e=>e?.isActive!==!1):[];if(0===s.length){e||(t([]),v("No providers connected yet."));return}let l=new Map;for(let e of s){let t=e.provider||e.id,r=h(e),a=(0,n.mq)(t)?"openai-compatible":(0,n.gb)(t)?"anthropic-compatible":t;l.has(t)||l.set(t,{providerId:t,providerName:r,providerType:a,connections:[],models:[]});let s=l.get(t);s.providerName=s.providerName||r,s.providerType=s.providerType||a,s.connections.push(e);let o=(0,i.KC)(t).map(t=>t?.id?{id:`${e.provider}/${t.id}`,requestModel:`${e.provider}/${t.id}`,name:t.name||t.id,providerId:e.provider,providerName:h(e),source:"static"}:null).filter(Boolean);s.models.push(...o)}for(let e of(await Promise.all(s.map(async e=>{try{let t=await fetch(`/api/providers/${e.id}/models`,{cache:"no-store"}),r=await t.json().catch(()=>({}));if(!t.ok)return{connection:e,models:[]};let a=(Array.isArray(r?.models)?r.models:Array.isArray(r?.data)?r.data:Array.isArray(r?.results)?r.results:Array.isArray(r)?r:[]).map(t=>(function(e,t){let r="string"==typeof e?e:e?.id||e?.name||e?.model||"";if(!r)return null;let a="string"==typeof e?e:e?.name||e?.displayName||r,s=r;return((0,n.mq)(t.provider)||(0,n.gb)(t.provider))&&!r.includes("/")&&(s=`${t.provider}/${r}`),{id:s,requestModel:s,name:a,providerId:t.provider,providerName:h(t),source:"live"}})(t,e)).filter(Boolean);return{connection:e,models:a}}catch{return{connection:e,models:[]}}})))){let t=e.connection.provider||e.connection.id,r=l.get(t);r&&r.models.push(...e.models)}let o=Array.from(l.values()).map(e=>({...e,models:(function(e){let t=new Map;for(let r of e)r?.id&&(t.has(r.id)||t.set(r.id,r));return Array.from(t.values())})(e.models).sort((e,t)=>e.name.localeCompare(t.name))})).filter(e=>e.models.length>0).sort((e,t)=>e.providerName.localeCompare(t.providerName));e||(t(o),0===o.length&&v("Providers connected but no models available."))}catch(r){e||(v(x(r?.message)||"Failed to load providers/models."),t([]))}finally{e||g(!1)}}(),()=>{e=!0}},[]),(0,s.useEffect)(()=>{let e=e=>{H.current&&!H.current.contains(e.target)&&J(!1),Y.current&&!Y.current.contains(e.target)&&F(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]);let Z=(0,s.useMemo)(()=>{let t=new Map;for(let r of e)for(let e of r.models)t.set(e.id,{...e,providerId:r.providerId,providerName:r.providerName});return t},[e]),ee=(0,s.useMemo)(()=>e.find(e=>e.providerId===S)||e[0]||null,[e,S]),et=(0,s.useMemo)(()=>{if(A&&Z.has(A))return Z.get(A);if(w){let e=y.find(e=>e.id===w);if(e?.modelId&&Z.has(e.modelId))return Z.get(e.modelId)}return ee?.models?.[0]||null},[A,Z,ee,y,w]),er=(0,s.useMemo)(()=>y.find(e=>e.id===w)||null,[y,w]),ea=er?.messages||[],es=(0,s.useMemo)(()=>[...y].sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),[y]),el=!C&&!!et&&(D.trim().length>0||O.length>0);(0,s.useEffect)(()=>{if(z)try{globalThis.localStorage.setItem(o,JSON.stringify(y)),globalThis.localStorage.setItem(d,w),globalThis.localStorage.setItem(c,S),globalThis.localStorage.setItem(m,D),G&&Q(null)}catch{try{globalThis.localStorage.setItem(o,JSON.stringify(y.map(e=>({...e,messages:(e.messages||[]).map(e=>Array.isArray(e.attachments)&&e.attachments.length>0?{...e,attachments:e.attachments.map(e=>({id:e.id,name:e.name,stripped:!0}))}:e)})))),globalThis.localStorage.setItem(d,w),globalThis.localStorage.setItem(c,S),globalThis.localStorage.setItem(m,D),X("stripped")}catch{X("failed")}}},[z,y,w,S,D,G,X]),(0,s.useEffect)(()=>{if(!z||r||W.current||0===e.length)return;let t=e.find(e=>e.providerId===S)||e[0],a=A&&Z.has(A)?Z.get(A):t.models[0];if(y.length>0){let e=y.find(e=>e.id===w)||y[0],r=e?.modelId&&Z.has(e.modelId)?Z.get(e.modelId):a;W.current=!0,j(e.id),I(r?.providerId||t.providerId),k(r?.id||a.id);return}let s={id:u(),title:"New chat",providerId:t.providerId,providerName:t.providerName,modelId:a.id,modelName:a.name,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),messages:[]};W.current=!0,N([s]),j(s.id),I(t.providerId),k(a.id)},[z,r,e,Z,y,w,S,A]);let ei=(e,t)=>{N(r=>r.map(r=>r.id===e?t({...r,messages:Array.isArray(r.messages)?r.messages.map(e=>({...e})):[]}):r))},en=e=>e?{id:u(),title:"New chat",providerId:e.providerId,providerName:e.providerName,modelId:e.id,modelName:e.name,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),messages:[]}:null,eo=async e=>{let t=Array.from(e.target.files||[]);if(0===t.length)return;let r=t.filter(e=>e.type.startsWith("image/"));if(0===r.length){e.target.value="";return}let a=await Promise.all(r.map(async e=>({id:u(),name:e.name,type:e.type,size:e.size,dataUrl:await f(e)})));$(e=>[...e,...a]),e.target.value=""},ed=async()=>{let e=et||ee?.models?.[0]||null;if(!e)return;let t=D.trim();if(!t&&0===O.length)return;let r=w,a=y.find(e=>e.id===r);if(!a){if(!(a=en(e)))return;r=a.id,N(e=>[a,...e]),j(r)}let s={id:u(),role:"user",content:t,attachments:O.map(e=>({id:e.id,name:e.name,type:e.type,dataUrl:e.dataUrl})),createdAt:new Date().toISOString()},l=u(),i={id:l,role:"assistant",content:"",createdAt:new Date().toISOString(),status:"streaming"},n=[...a.messages||[],s,i];N(a=>a.map(a=>a.id===r?{...a,providerId:e.providerId,providerName:e.providerName,modelId:e.id,modelName:e.name,messages:n,updatedAt:new Date().toISOString(),title:"New chat"===a.title?p(t):a.title}:a)),T(""),$([]),_(!0),E(l),R(""),L.current?.abort(),L.current=new AbortController;let o=n.filter(e=>"assistant"!==e.role||e.id!==l).map(e=>({role:e.role,content:"user"===e.role?function(e){let t=x(e.content).trim(),r=Array.isArray(e.attachments)?e.attachments:[];if(0===r.length)return t;let a=[];for(let e of(t&&a.push({type:"text",text:t}),r))e?.dataUrl&&a.push({type:"image_url",image_url:{url:e.dataUrl}});return a.length>0?a:t}(e):e.content}));try{var d;let a,s=await fetch("/api/dashboard/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify({model:e.requestModel||e.id,messages:o,stream:!0}),signal:L.current.signal});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(x(e.error||e.message||`Request failed (${s.status})`))}let i=s.body?.getReader();if(!i){let e=await s.json().catch(()=>({})),t=x(e?.choices?.[0]?.message?.content||e?.output_text||e?.error||e?.message||"");ei(r,e=>({...e,messages:e.messages.map(e=>e.id===l?{...e,content:t,status:"done"}:e),updatedAt:new Date().toISOString()}));return}let n=new TextDecoder,c="",m="";for(;;){let{value:e,done:t}=await i.read();if(t)break;let a=(c+=n.decode(e,{stream:!0})).split(/\r?\n/);for(let e of(c=a.pop()||"",a)){let t=e.trim();if(!t.startsWith("data:"))continue;let a=t.slice(5).trim();if(a&&"[DONE]"!==a)try{let e=JSON.parse(a),t=function(e){if(!e||"object"!=typeof e)return"";let t=e.choices?.[0];return[(t?.delta||{}).content,t?.message?.content,e.output_text,e.text].map(x).filter(Boolean)[0]||""}(e);if(!t)continue;m+=t,R(m),ei(r,e=>({...e,messages:e.messages.map(e=>e.id===l?{...e,content:m,status:"streaming"}:e),updatedAt:new Date().toISOString()}))}catch{}}}ei(r,e=>({...e,messages:e.messages.map(e=>e.id===l?{...e,content:m||e.content,status:"done"}:e),updatedAt:new Date().toISOString()})),d=r,a=p(t),ei(d,e=>({...e,title:"New chat"===e.title?a:e.title,updatedAt:new Date().toISOString()}))}catch(e){if("AbortError"!==e.name){let t=x(e?.message||e);ei(r,e=>({...e,messages:e.messages.map(e=>e.id===l?{...e,content:e.content||`Error: ${t}`,status:"error"}:e),updatedAt:new Date().toISOString()})),v(t||"Failed to send message.")}}finally{_(!1),E(""),R(""),L.current=null}},ec=et?`${et.name}`:"Select model",em=et?et.requestModel:"Choose from connected providers";return(0,a.jsx)("div",{className:"relative flex-1 flex flex-col h-full min-h-0 min-w-0 bg-bg text-text-main overflow-hidden",children:(0,a.jsxs)("div",{className:"relative mx-auto flex flex-1 h-full min-h-0 w-full max-w-4xl flex-col",children:[(0,a.jsxs)("div",{className:"flex shrink-0 items-center justify-between gap-3 px-4 py-3 lg:px-6",children:[(0,a.jsxs)("div",{ref:H,className:"relative",children:[(0,a.jsx)("button",{type:"button",onClick:()=>J(e=>!e),className:"flex items-center gap-3 rounded-2xl border border-border-subtle bg-surface-2 px-4 py-3 text-left transition hover:bg-surface-3",children:(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-sm font-semibold text-text-main",children:ec}),(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px] text-text-muted",children:"expand_more"})]}),(0,a.jsx)("p",{className:"truncate text-xs text-text-muted",children:em})]})}),P?(0,a.jsxs)("div",{className:"absolute left-0 top-[calc(100%+10px)] z-30 w-[min(520px,calc(100vw-2rem))] overflow-hidden rounded-[20px] border border-border-subtle bg-surface shadow-2xl shadow-black/40",children:[(0,a.jsxs)("div",{className:"border-b border-border-subtle px-4 py-3",children:[(0,a.jsx)("p",{className:"text-xs uppercase tracking-[0.22em] text-text-subtle",children:"Models"}),(0,a.jsx)("p",{className:"text-sm text-text-main",children:"Only from connected providers"})]}),(0,a.jsx)("div",{className:"max-h-[60vh] overflow-y-auto p-2 custom-scrollbar",children:e.map(e=>(0,a.jsxs)("div",{className:"mb-2 rounded-[16px] border border-border-subtle bg-surface-3 p-2",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-2 py-2",children:[(0,a.jsx)("p",{className:"text-sm font-semibold text-text-main",children:e.providerName}),(0,a.jsx)(l.Ex,{size:"sm",variant:"default",children:e.models.length})]}),(0,a.jsx)("div",{className:"grid gap-2 sm:grid-cols-2",children:e.models.map(e=>{let t=e.id===A;return(0,a.jsx)("button",{type:"button",onClick:()=>(e=>{let t=Z.get(e);if(!t)return;let r=y.find(e=>e.id===w);if(r&&r.messages.length>0){let e=en(t);if(!e)return;N(t=>[e,...t]),j(e.id)}else if(r)N(e=>e.map(e=>e.id===r.id?{...e,providerId:t.providerId,providerName:t.providerName,modelId:t.id,modelName:t.name}:e)),j(r.id);else{let e=en(t);if(!e)return;N(t=>[e,...t]),j(e.id)}I(t.providerId),k(t.id),J(!1)})(e.id),className:`rounded-[14px] border px-3 py-3 text-left transition ${t?"border-primary/40 bg-primary/15":"border-border-subtle bg-surface-2 hover:bg-surface-3"}`,children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("p",{className:"truncate text-sm font-medium text-text-main",children:e.name}),(0,a.jsx)("p",{className:"truncate text-[11px] text-text-subtle",children:e.requestModel})]}),t?(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px] text-primary",children:"check_circle"}):null]})},e.id)})})]},e.providerId))})]}):null]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[G&&(0,a.jsx)("span",{role:"status","aria-live":"polite",className:`text-xs ${"failed"===G?"text-danger":"text-warning"}`,children:"stripped"===G?"Storage full — images removed to fit":"Chats not saved — storage full"}),(0,a.jsx)("button",{type:"button",onClick:()=>F(e=>!e),className:"rounded-2xl border border-border-subtle bg-surface-2 px-4 py-3 text-sm text-text-main transition hover:bg-surface-3",children:"History"}),(0,a.jsx)(l.$n,{variant:"ghost",size:"sm",icon:"delete",onClick:()=>{if(!w)return;let e=y.filter(e=>e.id!==w),t=e[0]||null;N(e),t?(j(t.id),I(t.providerId),k(t.modelId)):(j(""),I(""),k(""))},disabled:!w||0===y.length,children:"Clear"})]})]}),B?(0,a.jsxs)("div",{ref:Y,className:"absolute right-4 top-[72px] z-20 w-[min(360px,calc(100vw-2rem))] rounded-[20px] border border-border-subtle bg-surface p-2 shadow-2xl shadow-black/40 lg:right-6",children:[(0,a.jsx)("div",{className:"px-3 py-2",children:(0,a.jsx)("p",{className:"text-xs uppercase tracking-[0.22em] text-text-subtle",children:"Recent chats"})}),(0,a.jsx)("div",{className:"max-h-[48vh] space-y-2 overflow-y-auto p-1 custom-scrollbar",children:0===es.length?(0,a.jsx)("div",{className:"rounded-[16px] border border-dashed border-border-subtle bg-surface-2 p-4 text-sm text-text-muted",children:"No conversations yet."}):es.map(e=>{let t=e.id===w,r=[...e.messages||[]].reverse().find(e=>"user"===e.role)||e.messages?.[0];return(0,a.jsx)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,void((r=y.find(e=>e.id===t))&&(j(t),I(r.providerId||S),k(r.modelId||A),F(!1)))},className:`w-full rounded-[16px] border px-3 py-3 text-left transition ${t?"border-primary/40 bg-primary/15":"border-border-subtle bg-surface-2 hover:bg-surface-3"}`,children:(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("p",{className:"truncate text-sm font-medium text-text-main",children:e.title}),(0,a.jsx)("p",{className:"mt-1 truncate text-xs text-text-muted",children:x(r?.content)||"Empty chat"})]}),(0,a.jsx)("span",{className:"text-[10px] text-text-subtle shrink-0",children:function(e){if(!e)return"Now";let t=new Date(e).getTime();if(Number.isNaN(t))return"Now";let r=Math.max(1,Math.round((Date.now()-t)/6e4));if(r<60)return`${r}m`;let a=Math.round(r/60);return a<24?`${a}h`:`${Math.round(a/24)}d`}(e.updatedAt)})]})},e.id)})})]}):null,b?(0,a.jsx)("div",{className:"mt-4 rounded-[18px] border border-danger/20 bg-danger/10 px-4 py-3 text-danger",children:(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"error"}),(0,a.jsx)("p",{className:"text-sm leading-6",children:b})]})}):null,(0,a.jsxs)("div",{className:"flex flex-1 flex-col min-h-0",children:[(0,a.jsxs)("div",{className:"flex-1 overflow-y-auto py-4 custom-scrollbar",children:[0===ea.length?(0,a.jsx)("div",{className:"flex min-h-[50vh] items-center justify-center px-4 text-center",children:(0,a.jsxs)("div",{className:"max-w-xl space-y-4",children:[(0,a.jsx)("div",{className:"mx-auto flex size-16 items-center justify-center rounded-[20px] border border-border-subtle bg-surface-2 text-text-main",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[30px]",children:"chat"})}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("h2",{className:"text-2xl font-semibold text-text-main",children:"Start a conversation"}),(0,a.jsx)("p",{className:"text-sm leading-6 text-text-muted",children:"Simple chat interface to interact with any AI model from connected providers. Select a model and start chatting!"})]})]})}):null,(0,a.jsx)("div",{className:"mx-auto flex w-full max-w-3xl flex-col gap-4 px-4",children:ea.map(e=>{let t="user"===e.role,r="assistant"===e.role,s=r&&e.id===M&&"streaming"===e.status,l=x(e.content)||(r?U:"");return(0,a.jsx)("div",{className:`flex w-full ${t?"justify-end":"justify-start"} mb-6`,children:(0,a.jsxs)("div",{className:`max-w-[min(88%,42rem)] ${t?"rounded-3xl bg-surface-2 px-5 py-3.5 text-text-main":"text-text-main"}`,children:[(0,a.jsx)("div",{className:"mb-1 flex items-center justify-between gap-3",children:(0,a.jsx)("span",{className:"text-xs font-semibold",children:t?"You":et?.name||"Assistant"})}),e.attachments?.length?(0,a.jsx)("div",{className:"mb-3 grid grid-cols-2 gap-2 sm:grid-cols-3 mt-2",children:e.attachments.map(e=>(0,a.jsx)("a",{href:e.dataUrl,target:"_blank",rel:"noreferrer",className:"overflow-hidden rounded-[18px] border border-border-subtle bg-surface-3",children:(0,a.jsx)("img",{src:e.dataUrl,alt:e.name,className:"h-28 w-full object-cover"})},e.id))}):null,(0,a.jsxs)("div",{className:"whitespace-pre-wrap break-words text-[15px] leading-7",children:[l,r&&s&&!U?(0,a.jsx)("span",{className:"inline-block animate-pulse",children:"▋"}):null]})]})},e.id)})})]}),(0,a.jsxs)("div",{className:"shrink-0 pt-2",children:[O.length>0?(0,a.jsx)("div",{className:"mx-auto mb-3 flex w-full max-w-3xl flex-wrap gap-2 px-4",children:O.map(e=>(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-full border border-border-subtle bg-surface-2 px-3 py-2",children:[(0,a.jsx)("span",{className:"text-xs text-text-main max-w-[12rem] truncate",children:e.name}),(0,a.jsx)("button",{type:"button",onClick:()=>{var t;return t=e.id,void $(e=>e.filter(e=>e.id!==t))},className:"text-text-muted hover:text-text-main","aria-label":"Remove attachment",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"close"})})]},e.id))}):null,(0,a.jsx)("div",{className:"mx-auto w-full max-w-3xl px-4 pb-2",children:(0,a.jsxs)("div",{className:"rounded-[26px] bg-surface-2 px-3 pt-3 pb-2 shadow-[0_0_15px_rgba(0,0,0,0.10)] ring-1 ring-border-subtle",children:[(0,a.jsx)("textarea",{value:D,onChange:e=>T(e.target.value),onKeyDown:e=>{"Enter"===e.key&&!e.shiftKey&&(e.preventDefault(),el&&ed())},placeholder:"Message AI",rows:1,className:"w-full resize-none bg-transparent px-2 text-[15px] leading-6 text-text-main outline-none placeholder:text-text-subtle custom-scrollbar max-h-[25vh] overflow-y-auto"}),(0,a.jsxs)("div",{className:"mt-2 flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("button",{type:"button",onClick:()=>K.current?.click(),disabled:!et||r,className:"p-2 text-text-muted hover:text-text-main transition rounded-full hover:bg-surface-2",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"attach_file"})}),(0,a.jsx)("input",{ref:K,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:eo}),(0,a.jsx)("span",{className:"text-xs font-medium text-text-subtle truncate max-w-[120px]",children:et?et.name:"No model"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[C?(0,a.jsx)("button",{type:"button",onClick:()=>{L.current?.abort()},className:"p-2 text-text-main bg-surface-3 hover:bg-surface-3 transition rounded-full h-8 w-8 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"stop"})}):null,(0,a.jsx)("button",{onClick:ed,disabled:!el,className:`h-8 w-8 rounded-full flex items-center justify-center transition ${el?"bg-primary text-white hover:opacity-90":"bg-surface-3 text-text-subtle cursor-not-allowed"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})})]})]})]})})]}),(0,a.jsx)("p",{className:"mx-auto mt-2 max-w-3xl px-4 pb-4 text-center text-[11px] text-text-subtle",children:"Model list is filtered from connected providers."})]})]})})}}},e=>{e.O(0,[27,9497,705,1321,5497,8441,3794,7358],()=>e(e.s=86508)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3554],{7083:(e,t,a)=>{Promise.resolve().then(a.bind(a,85309))},85309:(e,t,a)=>{"use strict";a.d(t,{default:()=>x});var s=a(95155),l=a(12115),r=a(98500),i=a.n(r),o=a(35497),c=a(3534),n=a(28777),d=a(64137);let u=a(41463).env.NEXT_PUBLIC_CLOUD_URL;function x({toolId:e,machineId:t}){let a=c.dM[e],[r,v]=(0,l.useState)([]),[m,h]=(0,l.useState)(!0),[p,b]=(0,l.useState)({}),[f,j]=(0,l.useState)(!1),[E,P]=(0,l.useState)(!1),[w,k]=(0,l.useState)(""),[g,N]=(0,l.useState)(!1),[_,y]=(0,l.useState)(""),[S,A]=(0,l.useState)([]);(0,l.useEffect)(()=>{let e=!0;return(async()=>{try{let[t,a,s,l]=await Promise.all([fetch("/api/providers"),fetch("/api/settings"),fetch("/api/tunnel/status"),fetch("/api/keys")]);if(!e)return;if(t.ok){let e=await t.json();v(e.connections||[])}if(a.ok){let e=await a.json();j(e.cloudEnabled||!1)}if(s.ok){let e=await s.json();P(!!(e.tunnel?.enabled||e.tunnel?.settingsEnabled)),k(e.tunnel?.publicUrl||""),N(!!(e.tailscale?.enabled||e.tailscale?.settingsEnabled)),y(e.tailscale?.tunnelUrl||"")}if(l.ok){let e=await l.json();A(e.keys||[])}}catch(e){console.log("Error loading tool data:",e)}finally{e&&h(!1)}})(),()=>{e=!1}},[]);let C=()=>r.filter(e=>!1!==e.isActive),U=(0,l.useCallback)((e,t,a)=>{b(s=>s[e]?.[t]===a?s:{...s,[e]:{...s[e],[t]:a}})},[]);return a?(0,s.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-4 px-1 sm:px-0",children:[(0,s.jsxs)(i(),{href:"/dashboard/cli-tools",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary w-fit",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_back"}),"Back to CLI Tools"]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main sm:text-2xl",children:a.name}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:a.description})]}),m?(0,s.jsx)(o.Qv,{}):(()=>{let t,l,r,i=(t=C(),l=[],r=new Set,t.forEach(e=>{let t=n.Xg[e.provider]||e.provider;(0,n.KC)(e.provider).forEach(a=>{let s=`${t}/${a.id}`;r.has(s)||(r.add(s),l.push({value:s,label:`${t}/${a.id}`,provider:e.provider,alias:t,connectionName:e.name,modelId:a.id}))})}),l).length>0,o={tool:a,isExpanded:!0,onToggle:()=>{},baseUrl:E&&w?w:f&&u?u:window.location.origin,apiKeys:S,tunnelEnabled:E,tunnelPublicUrl:w,tailscaleEnabled:g,tailscaleUrl:_};switch(e){case"claude":return(0,s.jsx)(d.Tk,{...o,activeProviders:C(),modelMappings:p[e]||{},onModelMappingChange:(t,a)=>U(e,t,a),hasActiveProviders:i,cloudEnabled:f});case"codex":return(0,s.jsx)(d.Ah,{...o,activeProviders:C(),cloudEnabled:f});case"opencode":return(0,s.jsx)(d.qO,{...o,activeProviders:C(),cloudEnabled:f});case"cowork":return(0,s.jsx)(d.Q6,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f,cloudUrl:u,tunnelEnabled:E,tunnelPublicUrl:w,tailscaleEnabled:g,tailscaleUrl:_});case"droid":return(0,s.jsx)(d.ZM,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"openclaw":return(0,s.jsx)(d.yZ,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"hermes":return(0,s.jsx)(d.RF,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"copilot":return(0,s.jsx)(d.h1,{...o,activeProviders:C(),cloudEnabled:f});case"cline":return(0,s.jsx)(d.aG,{...o,activeProviders:C(),cloudEnabled:f});case"kilo":return(0,s.jsx)(d.c9,{...o,activeProviders:C(),cloudEnabled:f});case"kimchi":return(0,s.jsx)(d.GX,{...o});case"deepseek-tui":return(0,s.jsx)(d.lF,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"jcode":return(0,s.jsx)(d.mW,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});default:return(0,s.jsx)(d.a7,{toolId:e,...o,activeProviders:C(),cloudEnabled:f,tunnelEnabled:E})}})()]}):(0,s.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-4 px-1 sm:px-0",children:[(0,s.jsxs)(i(),{href:"/dashboard/cli-tools",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary w-fit",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_back"}),"Back to CLI Tools"]}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Tool not found or disabled."})]})}}},e=>{e.O(0,[27,5772,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3554],{7083:(e,t,a)=>{Promise.resolve().then(a.bind(a,85309))},85309:(e,t,a)=>{"use strict";a.d(t,{default:()=>x});var s=a(95155),l=a(12115),r=a(98500),i=a.n(r),o=a(35497),c=a(3534),n=a(28777),d=a(64137);let u=a(41463).env.NEXT_PUBLIC_CLOUD_URL;function x({toolId:e,machineId:t}){let a=c.dM[e],[r,v]=(0,l.useState)([]),[m,h]=(0,l.useState)(!0),[p,b]=(0,l.useState)({}),[f,j]=(0,l.useState)(!1),[E,P]=(0,l.useState)(!1),[w,k]=(0,l.useState)(""),[g,N]=(0,l.useState)(!1),[_,y]=(0,l.useState)(""),[S,A]=(0,l.useState)([]);(0,l.useEffect)(()=>{let e=!0;return(async()=>{try{let[t,a,s,l]=await Promise.all([fetch("/api/providers"),fetch("/api/settings"),fetch("/api/tunnel/status"),fetch("/api/keys")]);if(!e)return;if(t.ok){let e=await t.json();v(e.connections||[])}if(a.ok){let e=await a.json();j(e.cloudEnabled||!1)}if(s.ok){let e=await s.json();P(!!(e.tunnel?.enabled||e.tunnel?.settingsEnabled)),k(e.tunnel?.publicUrl||""),N(!!(e.tailscale?.enabled||e.tailscale?.settingsEnabled)),y(e.tailscale?.tunnelUrl||"")}if(l.ok){let e=await l.json();A(e.keys||[])}}catch(e){console.log("Error loading tool data:",e)}finally{e&&h(!1)}})(),()=>{e=!1}},[]);let C=()=>r.filter(e=>!1!==e.isActive),U=(0,l.useCallback)((e,t,a)=>{b(s=>s[e]?.[t]===a?s:{...s,[e]:{...s[e],[t]:a}})},[]);return a?(0,s.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-4 px-1 sm:px-0",children:[(0,s.jsxs)(i(),{href:"/dashboard/cli-tools",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary w-fit",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_back"}),"Back to CLI Tools"]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold text-text-main sm:text-2xl",children:a.name}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:a.description})]}),m?(0,s.jsx)(o.Qv,{}):(()=>{let t,l,r,i=(t=C(),l=[],r=new Set,t.forEach(e=>{let t=n.Xg[e.provider]||e.provider;(0,n.KC)(e.provider).forEach(a=>{let s=`${t}/${a.id}`;r.has(s)||(r.add(s),l.push({value:s,label:`${t}/${a.id}`,provider:e.provider,alias:t,connectionName:e.name,modelId:a.id}))})}),l).length>0,o={tool:a,isExpanded:!0,onToggle:()=>{},baseUrl:E&&w?w:f&&u?u:window.location.origin,apiKeys:S,tunnelEnabled:E,tunnelPublicUrl:w,tailscaleEnabled:g,tailscaleUrl:_};switch(e){case"claude":return(0,s.jsx)(d.Tk,{...o,activeProviders:C(),modelMappings:p[e]||{},onModelMappingChange:(t,a)=>U(e,t,a),hasActiveProviders:i,cloudEnabled:f});case"codex":return(0,s.jsx)(d.Ah,{...o,activeProviders:C(),cloudEnabled:f});case"opencode":return(0,s.jsx)(d.qO,{...o,activeProviders:C(),cloudEnabled:f});case"cowork":return(0,s.jsx)(d.Q6,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f,cloudUrl:u,tunnelEnabled:E,tunnelPublicUrl:w,tailscaleEnabled:g,tailscaleUrl:_});case"droid":return(0,s.jsx)(d.ZM,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"openclaw":return(0,s.jsx)(d.yZ,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"hermes":return(0,s.jsx)(d.RF,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"copilot":return(0,s.jsx)(d.h1,{...o,activeProviders:C(),cloudEnabled:f});case"cline":return(0,s.jsx)(d.aG,{...o,activeProviders:C(),cloudEnabled:f});case"kilo":return(0,s.jsx)(d.c9,{...o,activeProviders:C(),cloudEnabled:f});case"kimchi":return(0,s.jsx)(d.GX,{...o});case"deepseek-tui":return(0,s.jsx)(d.lF,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});case"jcode":return(0,s.jsx)(d.mW,{...o,activeProviders:C(),hasActiveProviders:i,cloudEnabled:f});default:return(0,s.jsx)(d.a7,{toolId:e,...o,activeProviders:C(),cloudEnabled:f,tunnelEnabled:E})}})()]}):(0,s.jsxs)("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-4 px-1 sm:px-0",children:[(0,s.jsxs)(i(),{href:"/dashboard/cli-tools",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary w-fit",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_back"}),"Back to CLI Tools"]}),(0,s.jsx)("p",{className:"text-sm text-text-muted",children:"Tool not found or disabled."})]})}}},e=>{e.O(0,[27,5772,9497,705,1321,5497,9622,8441,3794,7358],()=>e(e.s=7083)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2326],{47748:(e,s,l)=>{Promise.resolve().then(l.bind(l,53501))},53501:(e,s,l)=>{"use strict";l.d(s,{default:()=>m});var t=l(95155),a=l(12115),r=l(35497),i=l(3534),n=l(64137),c=l(98500),o=l.n(c),d=l(5772);function x({toolId:e,tool:s,status:l}){let a=l?l.installed?l.hasExtremeRouter?{label:"Connected",cls:"bg-green-500/10 text-green-600 dark:text-green-400"}:{label:"Not configured",cls:"bg-yellow-500/10 text-yellow-600 dark:text-yellow-400"}:{label:"Not installed",cls:"bg-gray-500/10 text-gray-500"}:{label:"Unknown",cls:"bg-gray-500/10 text-gray-500"};return(0,t.jsx)(o(),{href:`/dashboard/cli-tools/${e}`,className:"block",children:(0,t.jsx)(r.Zp,{padding:"sm",className:"h-full overflow-hidden hover:border-primary/50 transition-colors cursor-pointer",children:(0,t.jsx)("div",{className:"flex h-full flex-col gap-2",children:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:s.image?(0,t.jsx)(d.default,{src:s.image,alt:s.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"}}):s.icon?(0,t.jsx)("span",{className:"material-symbols-outlined text-[28px]",style:{color:s.color},children:s.icon}):null}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("h3",{className:"font-medium text-sm truncate",children:s.name}),(0,t.jsx)("span",{className:`inline-block mt-1 px-1.5 py-0.5 text-[10px] font-medium rounded-full ${a.cls}`,children:a.label})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[18px] shrink-0",children:"chevron_right"})]})})})})}function m({machineId:e}){let[s,l]=(0,a.useState)(!0),[c,o]=(0,a.useState)({});if((0,a.useEffect)(()=>{let e=!0;return(async()=>{try{let s=await fetch("/api/cli-tools/all-statuses");s.ok&&e&&o(await s.json())}catch(e){console.log("Error fetching tool statuses:",e)}finally{e&&l(!1)}})(),()=>{e=!1}},[]),s)return(0,t.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4",children:[(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{})]});let d=Object.entries(i.dM),g=Object.entries(i.wn);return(0,t.jsxs)("div",{className:"flex w-full flex-col gap-6",children:[(0,t.jsx)(r.zY,{title:"CLI Tools",description:"Configure developer tools to use ExtremeRouter",icon:"terminal"}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3",children:d.map(([e,s])=>(0,t.jsx)(x,{toolId:e,tool:s,status:c[e]},e))}),(0,t.jsxs)("div",{className:"flex flex-col gap-3 sm:gap-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px] text-primary",children:"security"}),(0,t.jsx)("h2",{className:"text-sm font-semibold text-text-main",children:"MITM Tools"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3",children:g.map(([e,s])=>(0,t.jsx)(n.gY,{tool:s},e))})]})]})}}},e=>{e.O(0,[27,5772,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2326],{47748:(e,s,l)=>{Promise.resolve().then(l.bind(l,53501))},53501:(e,s,l)=>{"use strict";l.d(s,{default:()=>m});var t=l(95155),a=l(12115),r=l(35497),i=l(3534),n=l(64137),c=l(98500),o=l.n(c),d=l(5772);function x({toolId:e,tool:s,status:l}){let a=l?l.installed?l.hasExtremeRouter?{label:"Connected",cls:"bg-green-500/10 text-green-600 dark:text-green-400"}:{label:"Not configured",cls:"bg-yellow-500/10 text-yellow-600 dark:text-yellow-400"}:{label:"Not installed",cls:"bg-gray-500/10 text-gray-500"}:{label:"Unknown",cls:"bg-gray-500/10 text-gray-500"};return(0,t.jsx)(o(),{href:`/dashboard/cli-tools/${e}`,className:"block",children:(0,t.jsx)(r.Zp,{padding:"sm",className:"h-full overflow-hidden hover:border-primary/50 transition-colors cursor-pointer",children:(0,t.jsx)("div",{className:"flex h-full flex-col gap-2",children:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("div",{className:"size-8 flex items-center justify-center shrink-0",children:s.image?(0,t.jsx)(d.default,{src:s.image,alt:s.name,width:32,height:32,className:"size-8 object-contain rounded-lg",sizes:"32px",onError:e=>{e.target.style.display="none"}}):s.icon?(0,t.jsx)("span",{className:"material-symbols-outlined text-[28px]",style:{color:s.color},children:s.icon}):null}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("h3",{className:"font-medium text-sm truncate",children:s.name}),(0,t.jsx)("span",{className:`inline-block mt-1 px-1.5 py-0.5 text-[10px] font-medium rounded-full ${a.cls}`,children:a.label})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted text-[18px] shrink-0",children:"chevron_right"})]})})})})}function m({machineId:e}){let[s,l]=(0,a.useState)(!0),[c,o]=(0,a.useState)({});if((0,a.useEffect)(()=>{let e=!0;return(async()=>{try{let s=await fetch("/api/cli-tools/all-statuses");s.ok&&e&&o(await s.json())}catch(e){console.log("Error fetching tool statuses:",e)}finally{e&&l(!1)}})(),()=>{e=!1}},[]),s)return(0,t.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4",children:[(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{}),(0,t.jsx)(r.Qv,{})]});let d=Object.entries(i.dM),g=Object.entries(i.wn);return(0,t.jsxs)("div",{className:"flex w-full flex-col gap-6",children:[(0,t.jsx)(r.zY,{title:"CLI Tools",description:"Configure developer tools to use ExtremeRouter",icon:"terminal"}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3",children:d.map(([e,s])=>(0,t.jsx)(x,{toolId:e,tool:s,status:c[e]},e))}),(0,t.jsxs)("div",{className:"flex flex-col gap-3 sm:gap-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px] text-primary",children:"security"}),(0,t.jsx)("h2",{className:"text-sm font-semibold text-text-main",children:"MITM Tools"})]}),(0,t.jsx)("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3",children:g.map(([e,s])=>(0,t.jsx)(n.gY,{tool:s},e))})]})]})}}},e=>{e.O(0,[27,5772,9497,705,1321,5497,9622,8441,3794,7358],()=>e(e.s=47748)),_N_E=e.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/combos/page-a84afe4d66f3439a.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3649],{22627:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>K});var s=a(95155),l=a(12115),r=a(73321),i=a(35497),n=a(11059);let o=/^[a-zA-Z0-9_.\-]+$/,d=[{value:"fallback",label:"Fallback",desc:"Try models in order, next on failure",icon:"layers"},{value:"round-robin",label:"Round Robin",desc:"Rotate models across requests",icon:"cached"},{value:"fusion",label:"Fusion",desc:"Parallel panel + judge synthesis",icon:"hub"},{value:"swarm",label:"Swarm",desc:"Hierarchical Manager→Staff→Workers",icon:"account_tree"},{value:"cascade",label:"Cascade",desc:"Escalate cheap→capable on low confidence",icon:"trending_up"},{value:"smart-routing",label:"Smart Routing",desc:"Auto-route by tool calls & research intent",icon:"alt_route"}],c={fallback:{icon:"layers",color:"#3B82F6",badge:"info"},"round-robin":{icon:"cached",color:"#10B981",badge:"success"},fusion:{icon:"hub",color:"#8B5CF6",badge:"primary"},swarm:{icon:"account_tree",color:"#F59E0B",badge:"warning"},cascade:{icon:"trending_up",color:"#06B6D4",badge:"cyan"},"smart-routing":{icon:"alt_route",color:"#EC4899",badge:"warning"}};function m(e){return c[e]||c.fallback}function x(e){let t=d.find(t=>t.value===e);return t?.label||"Fallback"}let u=[{value:"all",label:"All"},{value:"fallback",label:"Fallback"},{value:"round-robin",label:"Round Robin"},{value:"fusion",label:"Fusion"},{value:"swarm",label:"Swarm"},{value:"cascade",label:"Cascade"},{value:"smart-routing",label:"Smart Routing"}],p=[{value:"name",label:"Name"},{value:"models-desc",label:"Most Models"},{value:"models-asc",label:"Fewest Models"}];function b({combos:e,comboStrategies:t,activeProviders:a,onViewCombos:l,onCreate:r}){let n=e.length,o=function(e){let t=new Set;for(let a of e)for(let e of a.models||[])t.add(e);return t.size}(e),d=function(e,t){let a={fallback:0,"round-robin":0,fusion:0,swarm:0,cascade:0,"smart-routing":0},s=new Set(["fallback","round-robin","fusion","swarm","cascade","smart-routing"]);for(let l of e){let e=t[l.name]?.fallbackStrategy||"fallback",r=s.has(e)?e:"fallback";a[r]=(a[r]||0)+1}return a}(e,t),c=Object.values(d).filter(e=>e>0).length,u=n>0?Math.round(e.reduce((e,t)=>e+(t.models?.length||0),0)/n*10)/10:0,p=Math.max(...Object.values(d),1);return(0,s.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,s.jsx)("div",{className:"grid grid-cols-2 gap-3 lg:grid-cols-4",children:[{label:"Total Combos",value:n,icon:"layers",color:"#3B82F6"},{label:"Unique Models",value:o,icon:"model_training",color:"#10B981"},{label:"Strategies Used",value:c,icon:"account_tree",color:"#8B5CF6"},{label:"Avg Models/Combo",value:u,icon:"analytics",color:"#F59E0B"}].map(e=>(0,s.jsx)(i.Zp,{padding:"sm",children:(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${e.color}15`},children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",style:{color:e.color},children:e.icon})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"font-mono text-lg font-bold text-text-main",children:e.value}),(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:e.label})]})]})},e.label))}),(0,s.jsxs)(i.Zp,{children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Strategy Distribution"}),(0,s.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"How combos are distributed across routing strategies"})]}),(0,s.jsx)("div",{className:"flex flex-col gap-2.5",children:Object.entries(d).map(([e,t])=>{let a=m(e),l=n>0?Math.round(t/n*100):0;return(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[(0,s.jsxs)("div",{className:"flex w-28 items-center gap-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:{color:a.color},children:a.icon}),(0,s.jsx)("span",{className:"text-xs font-medium text-text-main",children:x(e)})]}),(0,s.jsx)("div",{className:"flex-1 overflow-hidden rounded-full bg-surface-2",children:(0,s.jsx)("div",{className:"h-2.5 rounded-full transition-all",style:{width:`${t/p*100}%`,backgroundColor:a.color}})}),(0,s.jsxs)("span",{className:"w-16 text-right font-mono text-xs text-text-muted",children:[t," (",l,"%)"]})]},e)})})]}),(0,s.jsxs)(i.Zp,{children:[(0,s.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-text-main",children:"Combo Health"}),(0,s.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"Overview of each combo's status"})]}),(0,s.jsx)(i.$n,{size:"sm",variant:"ghost",icon:"list_alt",onClick:l,children:"View All"})]}),0===e.length?(0,s.jsxs)("div",{className:"py-6 text-center text-sm text-text-muted",children:["No combos yet. ",(0,s.jsx)("button",{onClick:r,className:"text-primary hover:underline",children:"Create one →"})]}):(0,s.jsx)("div",{className:"flex flex-col gap-2",children:e.map(e=>{let l=t[e.name]?.fallbackStrategy||"fallback",r=m(l),n=(e.models||[]).filter(e=>{let t=e.split("/")[0];return a.some(e=>e.provider===t&&!1!==e.isActive)}).length,o=(e.models||[]).length,d=o>0?Math.round(n/o*100):0;return(0,s.jsxs)("div",{className:"flex items-center gap-3 rounded-lg border border-border-subtle px-3 py-2 hover:bg-sidebar/30",children:[(0,s.jsx)("div",{className:"flex size-7 shrink-0 items-center justify-center rounded",style:{backgroundColor:`${r.color}15`},children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[15px]",style:{color:r.color},children:r.icon})}),(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsx)("code",{className:"truncate font-mono text-xs font-medium",children:e.name}),(0,s.jsxs)("div",{className:"flex items-center gap-2 mt-0.5",children:[(0,s.jsx)(i.Ex,{variant:r.badge,size:"sm",children:x(l)}),(0,s.jsxs)("span",{className:"text-[10px] text-text-muted",children:[o," models"]})]})]}),(0,s.jsxs)("div",{className:"hidden sm:flex items-center gap-2 shrink-0",children:[(0,s.jsx)("div",{className:"w-20 overflow-hidden rounded-full bg-surface-2",children:(0,s.jsx)("div",{className:`h-1.5 rounded-full ${d>=80?"bg-success":d>=50?"bg-warning":"bg-danger"}`,style:{width:`${d}%`}})}),(0,s.jsxs)("span",{className:"w-8 text-right font-mono text-[10px] text-text-muted",children:[n,"/",o]})]})]},e.id)})})]})]})}var h=a(88105);let g=new Set(["claude-adaptive","claude-budget","claude","extended","gemini-level","gemini-budget","qwen","hunyuan","minimax","zai"]),f=e=>!!e?.reasoning&&(!e?.thinkingFormat||g.has(e.thinkingFormat)),y=[{value:"auto",label:"Auto (provider default)"},{value:"off",label:"Off"},{value:"effort",label:"Effort (OpenAI-style)"},{value:"extended",label:"Extended (Claude-style)"}],v=[{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"max",label:"Max"}],j=[{key:"manager",label:"Manager",icon:"psychology"},{key:"staff",label:"Staff",icon:"badge"},{key:"audit",label:"Audit",icon:"fact_check"},{key:"worker",label:"Worker",icon:"group"}],N=[{key:"panel",label:"Panel",icon:"dashboard"},{key:"judge",label:"Judge",icon:"gavel"}],k=e=>"unlimited"===e||e===1/0||"Infinity"===e;function w(e){let t=h.Q2[e]?.capabilities;return!t||!1!==t.toolUse&&!1!==t.fileAccess}function C(e){if(!e||"string"!=typeof e)return null;let t=e.indexOf("/");return t>=0?e.slice(0,t):e}function S(e,t){if(e){let t=C(e);return{blocked:!!t&&!w(t),provider:t}}let a=C(t&&t.length>0?t[0]:null);return{blocked:!!a&&!w(a),provider:a}}function M(e){return e.filter(e=>w(e.provider))}function $({combo:e,modelCaps:t={},activeProviders:a=[],copied:r,onCopy:n,onEdit:o,onDelete:c,strategy:u={},onSetStrategy:p}){let[b,h]=(0,l.useState)(!1),[g,w]=(0,l.useState)(!1),[C,F]=(0,l.useState)(null),E=Array.isArray(e?.models)?e.models:[],P=t[e.name]||null,A=u.fallbackStrategy||"fallback",R=u.judgeModel||"",O="fusion"===A,T="swarm"===A,z=u.managerModel||"",_=u.staffModel||"",D=u.auditModel||"",U=m(A),W=(e=>{let t=e?.budgets?.maxEstimatedCostUsd;if(k(t))return 1/0;let a=Number(t);return Number.isFinite(a)&&a>0?a:5})(u),B=k(u?.budgets?.maxEstimatedCostUsd),L=u?.budgets?.enabled===!0,q=L&&u?.budgets?.maxEstimatedCostUsd!=null&&!B&&Number(u.budgets.maxEstimatedCostUsd)>0,J=e=>{let t=Number(e);Number.isFinite(t)&&!(t<=0)&&p({budgets:{...u.budgets||{},enabled:!0,maxEstimatedCostUsd:t}})},I=u.thinking||{},H=I.type||"auto",V="auto"!==H&&"off"!==H,[Z,G]=(0,l.useState)([]),Q=e=>p({thinking:{...I,...e}}),K=(e,t)=>{let a={...I.roles||{}};null===t?delete a[e]:a[e]={...a[e]||{},...t},Q({roles:a})},{hasEffort:Y,hasExtended:X,hasMaxEffort:ee,unresolvableModels:et,unsupportedForCurrent:ea}=function(e,t=""){let a=e.some(e=>!!e.caps?.reasoning),s=e.some(e=>f(e.caps)),l=e.some(e=>!!e.caps?.thinkingMaxEffort);return{hasEffort:a,hasExtended:s,hasMaxEffort:l,unresolvableModels:e.filter(e=>!e.caps?.reasoning&&e.caps?.reasoning!==void 0),unsupportedForCurrent:"effort"===t?[]:"extended"===t?e.filter(e=>e.caps?.reasoning===!0&&!f(e.caps)):[]}}(E.map(e=>({model:e,caps:t[e]||{}})),H);return(0,s.jsxs)(i.Zp,{padding:"sm",className:"group transition-all hover:border-primary/20",children:[(0,s.jsxs)("div",{className:"flex min-w-0 flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,s.jsxs)("button",{className:"flex min-w-0 flex-1 items-start gap-3 text-left sm:items-center",onClick:()=>h(!b),children:[(0,s.jsx)("div",{className:"flex size-8 shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${U.color}15`},children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",style:{color:U.color},children:U.icon})}),(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("code",{className:"truncate font-mono text-sm font-medium",children:e.name}),(0,s.jsx)(i.Ex,{variant:U.badge,size:"sm",children:x(A)}),P&&(0,s.jsxs)("span",{className:"inline-flex items-center gap-1",title:"Capabilities derived from member models",children:[(0,s.jsx)(i.nh,{caps:P,size:12,colorOverride:"text-text-muted"}),(0,s.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-text-muted",children:"derived"})]}),V&&(0,s.jsxs)(i.Ex,{variant:"cyan",size:"sm",className:"flex items-center gap-0.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[10px]",children:"psychology"}),"effort"===H?I.effort||"on":H]}),L&&(0,s.jsxs)(i.Ex,{variant:"warning",size:"sm",className:"flex items-center gap-0.5",title:`Max cost budget: $${W.toFixed(2)} per request`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[10px]",children:"savings"}),"$",W.toFixed(2)]}),(0,s.jsxs)("span",{className:"text-[10px] text-text-muted",children:[E.length," models"]})]}),(0,s.jsxs)("div",{className:"mt-1 flex min-w-0 flex-wrap items-center gap-1",children:[0===E.length?(0,s.jsx)("span",{className:"text-xs text-text-muted italic",children:"No models"}):E.slice(0,3).map((e,a)=>(0,s.jsxs)("code",{className:"inline-flex items-center gap-1 rounded bg-black/5 px-1.5 py-0.5 font-mono text-xs text-text-muted dark:bg-white/5",children:[(0,s.jsx)("span",{className:"truncate max-w-[120px]",children:e}),t[e]&&(0,s.jsx)(i.nh,{caps:t[e],size:11})]},a)),E.length>3&&(0,s.jsxs)("span",{className:"text-[10px] text-text-muted",children:["+",E.length-3," more"]})]})]}),(0,s.jsx)("span",{className:`shrink-0 text-text-muted transition-transform ${b?"rotate-180":""}`,children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"expand_more"})})]}),(0,s.jsxs)("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center sm:gap-3 sm:shrink-0",children:[(0,s.jsx)("div",{className:"w-full sm:w-[180px]",children:(0,s.jsx)(i.l6,{options:d,value:A,onChange:e=>p({fallbackStrategy:e.target.value}),selectClassName:"py-1.5 text-xs"})}),(0,s.jsxs)("div",{className:"grid grid-cols-3 gap-1 sm:flex",children:[(0,s.jsxs)("button",{onClick:t=>{t.stopPropagation(),n(e.name,`combo-${e.id}`)},className:"flex flex-col items-center rounded px-2 py-1 text-text-muted transition-colors hover:bg-black/5 hover:text-primary dark:hover:bg-white/5",title:"Copy combo name",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:r===`combo-${e.id}`?"check":"content_copy"}),(0,s.jsx)("span",{className:"text-[10px] leading-tight",children:"Copy"})]}),(0,s.jsxs)("button",{onClick:o,className:"flex flex-col items-center rounded px-2 py-1 text-text-muted transition-colors hover:bg-black/5 hover:text-primary dark:hover:bg-white/5",title:"Edit",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,s.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,s.jsxs)("button",{onClick:c,className:"flex flex-col items-center rounded px-2 py-1 text-red-500 transition-colors hover:bg-red-500/10",title:"Delete",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,s.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]})]})]}),b&&(0,s.jsxs)("div",{className:"mt-3 border-t border-border-subtle pt-3",children:[(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsxs)("div",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1.5 flex items-center gap-1.5",children:["Models (",E.length,")",P&&(0,s.jsx)(i.nh,{caps:P,size:11,colorOverride:"text-text-muted"})]}),(0,s.jsx)("div",{className:"flex flex-col gap-1",children:E.map((e,a)=>(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded px-2 py-1 bg-black/[0.02] dark:bg-white/[0.02]",children:[(0,s.jsx)("span",{className:"text-[10px] font-medium text-text-muted w-4 text-center",children:a+1}),(0,s.jsx)("code",{className:"min-w-0 flex-1 truncate font-mono text-xs text-text-main",children:e}),t[e]&&(0,s.jsx)(i.nh,{caps:t[e],size:11})]},a))})]}),O&&(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1.5",children:"Fusion Judge"}),(()=>{let{blocked:e,provider:t}=S(R,E);return(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsxs)("button",{onClick:()=>w(!0),className:`inline-flex max-w-full items-center gap-1 rounded border border-dashed px-2 py-1 font-mono text-xs hover:bg-primary/5 ${e?"border-red-400 text-red-500 hover:border-red-500":"border-primary/40 text-primary hover:border-primary"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"gavel"}),(0,s.jsx)("span",{className:"truncate",children:R||`Auto — ${E[0]||"first model"}`})]}),R&&(0,s.jsx)("button",{onClick:()=>p({judgeModel:""}),className:"p-1 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:"Reset to Auto",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]}),e&&(0,s.jsx)("p",{className:"text-[10px] text-red-500",children:R?"⚠ Web cookie providers cannot serve as Judge (no tool use / file access)":`⚠ Auto-fallback to "${t}" (first combo model) — web cookie cannot serve as Judge`})]})})()]}),T&&(0,s.jsxs)("div",{className:"mb-3",children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1.5",children:"Swarm Roles"}),(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[[{key:"manager",label:"Manager",icon:"psychology",value:z,placeholder:`Auto — ${E[0]||"first"}`},{key:"staff",label:"Staff",icon:"badge",value:_,placeholder:"Same as Manager"},{key:"audit",label:"Audit",icon:"fact_check",value:D,placeholder:"Same as Staff"}].map(e=>{let{blocked:t,provider:a}=S(e.value,E);return(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"text-xs font-medium text-text-muted w-16",children:e.label}),(0,s.jsxs)("button",{onClick:()=>F(e.key),className:`inline-flex max-w-full items-center gap-1 rounded border border-dashed px-2 py-0.5 font-mono text-[11px] hover:bg-primary/5 ${t?"border-red-400 text-red-500 hover:border-red-500":"border-primary/40 text-primary hover:border-primary"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:e.icon}),(0,s.jsx)("span",{className:"truncate",children:e.value||e.placeholder})]}),e.value&&(0,s.jsx)("button",{onClick:()=>p({[`${e.key}Model`]:""}),className:"p-0.5 rounded text-text-muted hover:text-red-500 hover:bg-red-500/10",title:`Reset ${e.label}`,children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"close"})})]}),t&&(0,s.jsx)("p",{className:"text-[10px] text-red-500 pl-[76px]",children:e.value?`⚠ Web cookie providers cannot serve as ${e.label} (no tool use / file access)`:`⚠ Auto-fallback to "${a}" (first combo model) — web cookie cannot serve as ${e.label}`})]},e.key)}),(0,s.jsxs)("div",{className:"flex items-center gap-2 text-[11px] text-text-muted",children:[(0,s.jsx)("span",{className:"font-medium",children:"Workers"}),(0,s.jsxs)("span",{children:["= combo models (",E.length,")"]}),(0,s.jsx)("span",{className:"text-text-subtle",children:"\xb7"}),(0,s.jsx)("a",{href:"/dashboard/swarm",className:"text-primary hover:underline",children:"Telemetry →"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-3 mt-1",children:[(0,s.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[(0,s.jsx)("input",{type:"checkbox",checked:u.autoScale?.enabled===!0,onChange:e=>p({autoScale:{...u.autoScale||{},enabled:e.target.checked}}),className:"rounded border-border accent-primary"}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"Auto-scale"})]}),u.autoScale?.enabled&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"Min:"}),(0,s.jsx)("input",{type:"number",min:1,max:u.autoScale?.maxWorkers||8,value:u.autoScale?.minWorkers??1,onChange:e=>p({autoScale:{...u.autoScale||{},minWorkers:Number(e.target.value)||1}}),className:"w-10 rounded border border-border bg-background px-1 py-0.5 text-[10px] font-mono text-center focus:outline-none focus:border-primary"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"Max:"}),(0,s.jsx)("input",{type:"number",min:1,max:8,value:u.autoScale?.maxWorkers??E.length,onChange:e=>p({autoScale:{...u.autoScale||{},maxWorkers:Number(e.target.value)||1}}),className:"w-10 rounded border border-border bg-background px-1 py-0.5 text-[10px] font-mono text-center focus:outline-none focus:border-primary"})]})]})]})]})]}),(0,s.jsxs)("div",{className:"mt-3 border-t border-border-subtle pt-3",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"Thinking"}),(0,s.jsx)("button",{onClick:()=>G(Z.length>0?[]:(O?N:T?j:[]).map(e=>e.key)),className:"text-[10px] text-primary hover:underline",children:Z.length>0?"Hide roles":`Role overrides${V?" ("+Object.keys(I.roles||{}).length+")":""}`})]}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("label",{className:"text-[10px] text-text-muted",children:"Mode:"}),(0,s.jsx)("select",{value:H,onChange:e=>Q({type:e.target.value}),className:"rounded border border-border bg-background px-1.5 py-0.5 text-[11px] font-mono focus:outline-none focus:border-primary",children:y.map(e=>{let t="auto"===e.value||"off"===e.value||"effort"===e.value&&Y||"extended"===e.value&&X;return(0,s.jsxs)("option",{value:e.value,disabled:!t,className:t?"":"text-text-muted",children:[e.label,t?"":" (not supported)"]},e.value)})})]}),ea.length>0&&(0,s.jsxs)("div",{className:"flex items-center gap-1 text-amber-600 dark:text-amber-400",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:"warning"}),(0,s.jsxs)("span",{className:"text-[10px]",children:[H," not supported by ",ea.map(e=>e.model.split("/").pop()).join(", ")]})]}),et.length>0&&"auto"!==H&&"off"!==H&&(0,s.jsxs)("div",{className:"flex items-center gap-1 text-amber-600 dark:text-amber-400",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:"warning"}),(0,s.jsxs)("span",{className:"text-[10px]",children:["Thinking capability unknown for ",et.map(e=>e.model.split("/").pop()).join(", ")]})]}),"effort"===H&&(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("label",{className:"text-[10px] text-text-muted",children:"Effort:"}),(0,s.jsx)("select",{value:I.effort||"high",onChange:e=>Q({effort:e.target.value}),className:"rounded border border-border bg-background px-1.5 py-0.5 text-[11px] font-mono focus:outline-none focus:border-primary",children:v.map(e=>{let t="max"!==e.value||ee;return(0,s.jsxs)("option",{value:e.value,disabled:!t,className:t?"":"text-text-muted",children:[e.label,t?"":" (not supported)"]},e.value)})})]}),"extended"===H&&(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("label",{className:"text-[10px] text-text-muted",children:"Budget:"}),(0,s.jsx)("input",{type:"number",min:1024,max:128e3,step:1024,value:I.budgetTokens||4096,onChange:e=>Q({budgetTokens:Number(e.target.value)||4096}),className:"w-20 rounded border border-border bg-background px-1.5 py-0.5 text-[11px] font-mono focus:outline-none focus:border-primary"})]})]}),Z.length>0&&V&&(0,s.jsxs)("div",{className:"mt-2 flex flex-col gap-1.5 pl-1",children:[(0,s.jsx)("p",{className:"text-[10px] text-text-muted",children:"Per-role overrides (leave as parent to inherit global)"}),(O?N:T?j:[]).map(e=>{let t,a=(t=e.key,I?.roles?.[t]);return(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px] text-text-muted",children:e.icon}),(0,s.jsx)("span",{className:"text-[11px] font-medium text-text-muted w-12",children:e.label}),(0,s.jsxs)("select",{value:a?.type||"inherit",onChange:t=>K(e.key,"inherit"===t.target.value?null:{type:t.target.value}),className:"rounded border border-border bg-background px-1 py-0.5 text-[10px] font-mono focus:outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"inherit",children:"Inherit"}),(0,s.jsx)("option",{value:"off",children:"Off"}),(0,s.jsxs)("option",{value:"effort",disabled:!Y,className:Y?"":"text-text-muted",children:["Effort",Y?"":" (not supported)"]}),(0,s.jsxs)("option",{value:"extended",disabled:!X,className:X?"":"text-text-muted",children:["Extended",X?"":" (not supported)"]})]}),a?.type==="effort"&&(0,s.jsx)("select",{value:a.effort||"high",onChange:t=>K(e.key,{type:"effort",effort:t.target.value}),className:"rounded border border-border bg-background px-1 py-0.5 text-[10px] font-mono focus:outline-none focus:border-primary",children:v.map(e=>{let t="max"!==e.value||ee;return(0,s.jsxs)("option",{value:e.value,disabled:!t,className:t?"":"text-text-muted",children:[e.label,t?"":" (not supported)"]},e.value)})}),a?.type==="extended"&&(0,s.jsx)("input",{type:"number",min:1024,max:128e3,step:1024,value:a.budgetTokens||4096,onChange:t=>K(e.key,{type:"extended",budgetTokens:Number(t.target.value)||4096}),className:"w-16 rounded border border-border bg-background px-1 py-0.5 text-[10px] font-mono focus:outline-none focus:border-primary"}),a&&(0,s.jsx)("button",{onClick:()=>K(e.key,null),className:"p-0.5 rounded text-text-muted hover:text-red-500",title:"Reset to inherit",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[12px]",children:"close"})})]},e.key)})]})]}),(0,s.jsxs)("div",{className:"text-xs text-text-muted bg-black/[0.02] dark:bg-white/[0.02] rounded px-2 py-1.5",children:[(0,s.jsxs)("span",{className:"font-medium",children:[x(A),":"]})," ",d.find(e=>e.value===A)?.desc]}),(0,s.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-3 gap-y-2 rounded-lg border border-warning/20 bg-warning/[0.04] px-3 py-2",children:[(0,s.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[(0,s.jsx)("input",{type:"checkbox",checked:L,onChange:e=>{var t;return t=e.target.checked,void p({budgets:{...u.budgets||{},enabled:t}})},className:"rounded border accent-primary","aria-label":"Enable cost budget limit"}),(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px] text-warning",children:"savings"}),(0,s.jsx)("span",{className:"text-[11px] font-semibold text-text-main",children:"Budget Limit"})]}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:L?"enabled":"off (no limit)"}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("span",{className:"text-[12px] font-medium text-text-muted",children:"$"}),(0,s.jsx)("input",{type:"number",min:.01,step:.5,value:B?"":W,onChange:e=>J(e.target.value),disabled:!L||B,"aria-label":"Max cost budget in USD per request",className:"w-20 rounded border border-border bg-background px-1.5 py-0.5 text-[11px] font-mono text-right focus:outline-none focus:border-primary disabled:opacity-60"}),(0,s.jsx)("button",{type:"button",onClick:B?()=>J(5):()=>{p({budgets:{...u.budgets||{},enabled:!0,maxEstimatedCostUsd:"unlimited"}})},disabled:!L,className:`rounded border px-2 py-0.5 text-[11px] font-medium ${B?"border-primary bg-primary/10 text-primary":"border-border text-text-muted hover:text-text-main"} disabled:opacity-40 disabled:cursor-not-allowed`,children:B?"Unlimited":"∞"})]}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"per request"}),(0,s.jsx)("span",{className:`text-[10px] ${q||B?"text-primary":"text-text-muted"}`,children:B?"Unlimited":q?`Custom $${Number(W).toFixed(2)}`:"Default $5.00"})]})]}),(0,s.jsx)(i.rq,{isOpen:g,onClose:()=>w(!1),onSelect:e=>{p({judgeModel:e?.value||""}),w(!1)},activeProviders:M(a),title:"Select Judge Model",addedModelValues:R?[R]:[],closeOnSelect:!0}),C&&(0,s.jsx)(i.rq,{isOpen:!0,onClose:()=>F(null),onSelect:e=>{p({[`${C}Model`]:e?.value||""}),F(null)},activeProviders:M(a),title:`Select ${"manager"===C?"Manager":"staff"===C?"Staff":"Audit"} Model`,addedModelValues:"manager"===C?z?[z]:[]:"staff"===C?_?[_]:[]:D?[D]:[],closeOnSelect:!0})]})}function F({combos:e,modelCaps:t,activeProviders:a,comboStrategies:r,copied:n,copy:o,onEdit:d,onDelete:c,onSetStrategy:m,onCreate:x}){let[b,h]=(0,l.useState)(""),[g,f]=(0,l.useState)("all"),[y,v]=(0,l.useState)("name"),j=(0,l.useMemo)(()=>{var t;let a;return t=function(e,t,a,s){let l=e;if("all"!==a&&(l=l.filter(e=>(s[e.name]?.fallbackStrategy||"fallback")===a)),t.trim()){let e=t.trim().toLowerCase();l=l.filter(t=>t.name.toLowerCase().includes(e)||(t.models||[]).some(t=>t.toLowerCase().includes(e)))}return l}(e,b,g,r),a=[...t],"models-desc"===y?a.sort((e,t)=>(t.models?.length||0)-(e.models?.length||0)):"models-asc"===y?a.sort((e,t)=>(e.models?.length||0)-(t.models?.length||0)):a.sort((e,t)=>e.name.localeCompare(t.name)),a},[e,b,g,y,r]);return 0===e.length?(0,s.jsx)(i.pp,{icon:"layers",title:"No combos yet",description:"Create model combos with fallback, round-robin, fusion, or swarm strategies",actionText:"Create Combo",onAction:x}):(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,s.jsx)(i.pd,{placeholder:"Search combos or models...",value:b,onChange:e=>h(e.target.value),className:"sm:max-w-xs"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("div",{className:"flex flex-wrap gap-1",children:u.map(e=>(0,s.jsx)("button",{onClick:()=>f(e.value),className:`rounded-full px-2.5 py-1 text-xs font-medium transition-colors ${g===e.value?"bg-primary/15 text-primary ring-1 ring-primary/20":"bg-surface-2 text-text-muted hover:text-text-main"}`,children:e.label},e.value))}),(0,s.jsx)("select",{value:y,onChange:e=>v(e.target.value),className:"appearance-none rounded-lg border border-border bg-surface-2 py-1.5 pl-3 pr-8 text-xs text-text-main [-webkit-appearance:none] [-moz-appearance:none] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30",children:p.map(e=>(0,s.jsx)("option",{value:e.value,children:e.label},e.value))})]})]}),(0,s.jsx)("p",{className:"text-xs text-text-muted",children:j.length===e.length?`${e.length} combo${1!==e.length?"s":""}`:`${j.length} of ${e.length} combos`}),0===j.length?(0,s.jsx)(i.Zp,{children:(0,s.jsxs)("div",{className:"py-8 text-center text-sm text-text-muted",children:['No combos match "',b,'" ',"all"!==g&&`with ${g} strategy`]})}):(0,s.jsx)("div",{className:"flex flex-col gap-3",children:j.map(e=>(0,s.jsx)($,{combo:e,modelCaps:t,activeProviders:a,copied:n,onCopy:o,onEdit:()=>d(e),onDelete:()=>c(e.id),strategy:r[e.name]||{},onSetStrategy:t=>m(e.name,t)},e.id))})]})}let E=[{id:"always-on",name:"Always-On (5-Layer Fallback)",description:"Zero-downtime coding with 5 layers of fallback. Mix of subscription, cheap, and free tiers — if any model fails, the next picks up automatically.",icon:"shield",category:"reliability",strategy:"fallback",models:["claude-opus-4-7","gpt-5.4","glm-5.1","MiniMax-M2.7","claude-sonnet-4.5"],preferredProviders:{"claude-opus-4-7":"cc","gpt-5.4":"cx","glm-5.1":"glm","MiniMax-M2.7":"minimax","claude-sonnet-4.5":"kr"}},{id:"max-reasoning-swarm",name:"Max Reasoning Swarm",description:"Deep multi-agent analysis for complex coding tasks. Manager decomposes the problem, workers solve subtasks in parallel, audit reviews the result. Manager thinks at max effort.",icon:"psychology",category:"reasoning",strategy:"swarm",models:["claude-opus-4-7","gpt-5.4","glm-5.1","claude-sonnet-4.5"],preferredProviders:{"claude-opus-4-7":"cc","gpt-5.4":"cx","glm-5.1":"glm","claude-sonnet-4.5":"kr"},strategyConfig:{fallbackStrategy:"swarm",managerModel:"claude-opus-4-7",auditModel:"claude-sonnet-4.5",thinking:{type:"effort",effort:"high",roles:{manager:{type:"effort",effort:"max"},worker:{type:"effort",effort:"medium"},audit:{type:"effort",effort:"high"}}},autoScale:{enabled:!0,minWorkers:2,maxWorkers:4}}},{id:"flash-fusion",name:"Flash Fusion",description:"Two fast models answer in parallel, a judge picks the best result. Low latency with a quality check — great for everyday coding questions.",icon:"bolt",category:"balanced",strategy:"fusion",models:["gpt-5.4","MiniMax-M2.7"],preferredProviders:{"gpt-5.4":"cx","MiniMax-M2.7":"minimax"},strategyConfig:{fallbackStrategy:"fusion",thinking:{type:"effort",effort:"medium"}}},{id:"penny-pincher",name:"Penny-Pincher",description:"Ultra-low-cost daily driver built from cheap and free tiers. Thinking disabled to keep tokens minimal. Use for simple tasks where cost matters most.",icon:"savings",category:"budget",strategy:"fallback",models:["MiniMax-M2.7","glm-5.1","gpt-5.4"],preferredProviders:{"MiniMax-M2.7":"minimax","glm-5.1":"glm","gpt-5.4":"gh"},strategyConfig:{fallbackStrategy:"fallback",thinking:{type:"off"}}},{id:"ai-researcher",name:"AI Researcher",description:"Smart Routing research combo. Web (cookie) providers answer research tasks first; tool-capable API models handle anything that needs function calling. Auto-falls back if a web provider is blocked.",icon:"travel_explore",category:"research",strategy:"smart-routing",models:["deepseek-v4-flash","gpt-5-6-terra","gemini-3.6-flash","claude-sonnet-4.5","gpt-5.4","glm-5.2"],preferredProviders:{"deepseek-v4-flash":"felo","gpt-5-6-terra":"felo","gemini-3.6-flash":"felo","claude-sonnet-4.5":"kr","gpt-5.4":"cx","glm-5.2":"cl"},strategyConfig:{fallbackStrategy:"smart-routing",smartRouting:{cookiePoolEnabled:!0,intentDetection:{confidenceThreshold:.6,llmClassifierFallback:{enabled:!0,model:"kr/claude-haiku-4.5"}}}}},{id:"deep-research-web",name:"Deep Research Web",description:"Research-heavy smart routing. Maximizes the web (cookie) pool for deep research, with tool-capable models as fallback for verification and citations.",icon:"manage_search",category:"research",strategy:"smart-routing",models:["gpt-5-6-luna","claude-5-0-sonnet","kimi-k2-thinking","grok-4.6","claude-haiku-4.5","glm-5.2"],preferredProviders:{"gpt-5-6-luna":"felo","claude-5-0-sonnet":"felo","kimi-k2-thinking":"felo","grok-4.6":"felo","claude-haiku-4.5":"kr","glm-5.2":"cl"},strategyConfig:{fallbackStrategy:"smart-routing",smartRouting:{cookiePoolEnabled:!0,intentDetection:{confidenceThreshold:.6,llmClassifierFallback:{enabled:!0,model:"kr/claude-haiku-4.5"}}}}},{id:"bug-hunter",name:"Bug Hunter",description:"Three models independently diagnose the same bug, a strong judge picks the most likely root cause. High-precision debugging with thinking on.",icon:"bug_report",category:"debugging",strategy:"fusion",models:["gpt-5.4","glm-5.1","MiniMax-M2.7"],preferredProviders:{"gpt-5.4":"cx","glm-5.1":"glm","MiniMax-M2.7":"minimax"},strategyConfig:{fallbackStrategy:"fusion",thinking:{type:"effort",effort:"high"}}}],P=["managerModel","staffModel","auditModel","judgeModel"];function A({combos:e,connections:t,modelIndex:a={},onApply:r}){let[n,o]=(0,l.useState)(null),d=new Set(t?.filter(e=>!1!==e.isActive).map(e=>e.provider)||[]),c=new Set((e||[]).map(e=>e.name)),u=e=>(function(e,{modelIndex:t={},connectedProviders:a=new Set}={}){return(e.models||[]).map(s=>{let l=s.indexOf("/"),r=l>0,i=r?s.slice(l+1):s,n=(r?s.slice(0,l):"")||(e.preferredProviders||{})[i]||"",o=n?(0,h.rs)(n):"",d=(t[i]||[]).map(e=>(0,h.rs)(e)).filter(e=>a.has(e));if(o&&d.includes(o)){let e=(0,h.wG)(o);return{ref:s,modelName:i,provider:o,providerAlias:e,full:`${e}/${i}`,available:!0}}if(d.length>0){let e=(0,h.wG)(d[0]);return{ref:s,modelName:i,provider:d[0],providerAlias:e,full:`${e}/${i}`,available:!0,resolvedFrom:n}}return{ref:s,modelName:i,provider:o||n,full:r?s:i,available:!1}})})(e,{modelIndex:a,connectedProviders:d}),p=async e=>{o(e.id);try{let t=u(e),a=t.filter(e=>e.available).map(e=>e.full);if(0===a.length)return void alert("No connected provider has any of this template's models.");let s=function(e,t){let a=e.strategyConfig?{...e.strategyConfig}:{fallbackStrategy:e.strategy},s=Object.fromEntries(t.filter(e=>e.available).map(e=>[e.modelName,e.full]));for(let e of P){let t=a[e];if(!t)continue;let l=t.indexOf("/"),r=l>0?t.slice(l+1):t;s[r]&&(a[e]=s[r])}return a}(e,t),l=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e.name,models:a,kind:e.kind||"llm",strategyConfig:s})});if(!l.ok){let e=await l.json();alert(e.error||"Failed to create combo from template");return}let i=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:{[e.name]:s}})});if(!i.ok){let e=await i.json().catch(()=>({}));alert(e.error||"Failed to apply template strategy");return}r&&r()}catch(e){alert("Failed to apply template: "+(e?.message||String(e)))}finally{o(null)}};return 0===E.length?(0,s.jsx)(i.pp,{icon:"dashboard_customize",title:"No templates available",description:"Combo templates will appear here when added."}):(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{className:"mb-1",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-text-main",children:"Combo Templates"}),(0,s.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:"One-click prebuilt combos. Provider availability is checked automatically."})]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:E.map(e=>{let t=u(e),a=t.filter(e=>e.available).length,l=t.length,r=c.has(e.name),o=m(e.strategy),d=a===l;return(0,s.jsxs)(i.Zp,{padding:"sm",className:"flex flex-col gap-3 hover:border-primary/20 transition-all",children:[(0,s.jsxs)("div",{className:"flex items-start justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,s.jsx)("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${o.color}15`},children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",style:{color:o.color},children:e.icon||o.icon})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"text-sm font-semibold text-text-main",children:e.name}),(0,s.jsx)(i.Ex,{variant:o.badge,size:"sm",children:x(e.strategy)})]})]}),r&&(0,s.jsx)(i.Ex,{variant:"success",size:"sm",dot:!0,children:"Created"})]}),(0,s.jsx)("p",{className:"text-xs text-text-muted leading-relaxed",children:e.description}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-1",children:[t.slice(0,4).map((e,t)=>(0,s.jsxs)("code",{className:`inline-flex items-center gap-1 rounded px-1.5 py-0.5 font-mono text-[10px] ${e.available?"bg-black/5 text-text-muted dark:bg-white/5":"bg-red-500/10 text-red-500"}`,title:e.available?`Resolved to ${e.provider}`:`No connected provider has ${e.modelName}`,children:[(0,s.jsx)("span",{className:e.available?"text-success":"text-red-500",children:e.available?"✓":"✗"}),(0,s.jsx)("span",{className:"truncate max-w-[110px]",children:e.modelName}),e.available&&(0,s.jsx)("span",{className:"rounded bg-black/10 px-0.5 text-[9px] dark:bg-white/10",children:e.provider})]},t)),t.length>4&&(0,s.jsxs)("span",{className:"text-[10px] text-text-muted",children:["+",t.length-4," more"]})]}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1",children:t.map(e=>{let t=e.resolvedFrom?(0,h.rs)(e.resolvedFrom):"",a=e.available?`${e.provider}${e.resolvedFrom&&t!==e.provider?` (via ${e.resolvedFrom})`:""}`:`${e.provider||"?"} (missing)`,l=e.available;return(0,s.jsxs)("span",{className:`inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-[10px] font-medium ${l?"bg-success/10 text-success":"bg-surface-2 text-text-muted"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[10px]",children:l?"check_circle":"radio_button_unchecked"}),a]},e.ref)})}),(0,s.jsx)("div",{className:"mt-auto pt-1",children:(0,s.jsx)(i.$n,{size:"sm",fullWidth:!0,variant:r?"secondary":"primary",icon:n===e.id?"progress_activity":"add",disabled:r||n===e.id||!d,onClick:()=>p(e),children:n===e.id?"Creating...":r?"Already Created":d?"Apply Template":`Missing ${l-a} model${l-a!=1?"s":""}`})})]},e.id)})})]})}var R=a(44923),O=a(87256),T=a(5020),z=a(39768);function _({id:e,index:t,model:a,isFirst:r,isLast:n,modelCaps:o,onEdit:d,onMoveUp:c,onMoveDown:m,onRemove:x}){let{attributes:u,listeners:p,setNodeRef:b,transform:h,isDragging:g}=(0,O.gl)({id:e}),f={transform:z.Ks.Transform.toString(h),opacity:g?.5:1,zIndex:g?999:void 0},[y,v]=(0,l.useState)(!1),[j,N]=(0,l.useState)(a),k=()=>{let e=j.trim();e&&e!==a?d(e):N(a),v(!1)};return(0,s.jsxs)("div",{ref:b,style:f,className:`group flex min-w-0 items-center gap-2 rounded-lg border px-2.5 py-1.5 transition-all ${g?"border-primary/40 bg-panel shadow-md ring-1 ring-primary/20":"border-transparent bg-panel hover:border-border-subtle"}`,children:[(0,s.jsx)("span",{className:"flex size-5 shrink-0 items-center justify-center rounded bg-primary/10 text-[10px] font-bold text-primary",children:t+1}),(0,s.jsx)("button",{...u,...p,type:"button",className:"cursor-grab touch-none shrink-0 p-0.5 rounded text-text-muted/50 hover:text-text-main active:cursor-grabbing",title:"Drag to reorder",children:(0,s.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",children:[(0,s.jsx)("circle",{cx:"9",cy:"4",r:"1.5"}),(0,s.jsx)("circle",{cx:"15",cy:"4",r:"1.5"}),(0,s.jsx)("circle",{cx:"9",cy:"12",r:"1.5"}),(0,s.jsx)("circle",{cx:"15",cy:"12",r:"1.5"}),(0,s.jsx)("circle",{cx:"9",cy:"20",r:"1.5"}),(0,s.jsx)("circle",{cx:"15",cy:"20",r:"1.5"})]})}),y?(0,s.jsx)("input",{autoFocus:!0,value:j,onChange:e=>N(e.target.value),onBlur:k,onKeyDown:e=>{"Enter"===e.key&&k(),"Escape"===e.key&&(N(a),v(!1))},className:"min-w-0 flex-1 rounded border border-primary/40 bg-panel px-1.5 py-0.5 font-mono text-xs text-text-main outline-none"}):(0,s.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-1.5 cursor-text rounded px-1 py-0.5 hover:bg-black/[0.03] dark:hover:bg-white/[0.03]",onClick:()=>v(!0),title:"Click to edit",children:[(0,s.jsx)("code",{className:"min-w-0 flex-1 truncate font-mono text-xs text-text-main",children:a}),o?.[a]&&(0,s.jsx)(i.nh,{caps:o[a],size:11})]}),(0,s.jsxs)("div",{className:"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100",children:[(0,s.jsx)("button",{onClick:c,disabled:r,className:`rounded p-1 transition-colors ${r?"cursor-not-allowed text-text-muted/20":"text-text-muted hover:bg-black/5 hover:text-primary dark:hover:bg-white/5"}`,title:"Move up",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"arrow_upward"})}),(0,s.jsx)("button",{onClick:m,disabled:n,className:`rounded p-1 transition-colors ${n?"cursor-not-allowed text-text-muted/20":"text-text-muted hover:bg-black/5 hover:text-primary dark:hover:bg-white/5"}`,title:"Move down",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"arrow_downward"})})]}),(0,s.jsx)("button",{onClick:x,className:"shrink-0 rounded p-1 text-text-muted opacity-0 transition-all hover:bg-danger/10 hover:text-danger group-hover:opacity-100",title:"Remove model",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}var D=a(92899),U=a(29366);let W=[500,1e3,2e3,5e3,1e4,25e3,5e4,1e5],B=e=>"number"==typeof e&&Number.isFinite(e)?`$${e.toFixed(3).replace(/\.?0+$/,"")}`:"—";function L({models:e=[],strategyConfig:t={},onStrategyChange:a}){let[r,i]=(0,l.useState)(1e3),[n,o]=(0,l.useState)(null),[d,c]=(0,l.useState)(!1),[m,u]=(0,l.useState)(""),p=(0,l.useRef)(0);t?.fallbackStrategy,(0,l.useEffect)(()=>{if(!Array.isArray(e)||0===e.length){o(null),u("");return}let a=++p.current;c(!0),u(""),(async()=>{try{let s=await fetch("/api/combos/simulate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({models:e,strategyConfig:t,inputTokens:r,includeLatency:!0})});if(!s.ok){let e=await s.json().catch(()=>({}));throw Error(e?.error||"Simulation failed")}let l=await s.json();a===p.current&&o(l.simulation)}catch(e){a===p.current&&(u(e?.message||"Simulation failed"),o(null))}finally{a===p.current&&c(!1)}})()},[e,t,r]);let b=(e,t,a,l="")=>(0,s.jsxs)("div",{className:`rounded-lg border border-border-subtle bg-surface-2/50 px-2.5 py-2 ${l}`,children:[(0,s.jsx)("div",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:e}),(0,s.jsx)("div",{className:"mt-0.5 text-sm font-semibold text-text-main",children:t}),a?(0,s.jsx)("div",{className:"text-[10px] text-text-muted",children:a}):null]});return(0,s.jsxs)("div",{className:"rounded-lg border border-border-subtle bg-surface-2/50 p-3",children:[(0,s.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"query_stats"}),(0,s.jsx)("span",{className:"text-xs font-medium text-text-main",children:"Combo Simulator"}),d&&(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"simulating…"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"assumed input"}),(0,s.jsx)("select",{value:r,onChange:e=>i(Number(e.target.value)),className:"rounded border border-border-subtle bg-surface-1 px-1.5 py-0.5 text-[10px] text-text-main",children:W.map(e=>(0,s.jsxs)("option",{value:e,children:[e>=1e3?`${e/1e3}k`:e," tok"]},e))})]})]}),n?(0,s.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-1.5 sm:grid-cols-4",children:[b("Strategy",x(n.strategy),`${n.members} member${1!==n.members?"s":""}`),b("Logical calls",n.calls.min===n.calls.max?`${n.calls.max}`:`${n.calls.min}–${n.calls.max}`,`per request \xb7 max ${n.calls.max}`),b("Provider fanout",String(n.maxProviderFanout),"parallel calls at peak"),b("Est. cost",n.calls.min===n.calls.max?B(n.estimatedCost.worst):`${B(n.estimatedCost.optimistic)}–${B(n.estimatedCost.worst)}`,`${B(n.perCallCost)} / call`)]}),n.budgetRisk?.rejected?(0,s.jsxs)("div",{className:"flex items-start gap-1.5 rounded-lg border border-red-500/30 bg-red-500/10 px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-red-400",children:"error"}),(0,s.jsxs)("p",{className:"text-[11px] text-red-300",children:["Will be rejected at runtime: worst-case cost ",B(n.budgetRisk.estimatedCostUsd)," exceeds the budget limit ",B(n.budgetRisk.limit)," (combo_cost_budget_exceeded)."]})]}):n.budgetsEnabled?(0,s.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-emerald-500/30 bg-emerald-500/10 px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-emerald-400",children:"check_circle"}),(0,s.jsxs)("p",{className:"text-[11px] text-emerald-300",children:["Within the configured budget limit (",B(n.budgetRisk.limit),")."]})]}):(0,s.jsx)("p",{className:"text-[10px] text-text-muted",children:"Budgets are off — unlimited cost/calls allowed."}),n.roleViolations.length>0&&(0,s.jsxs)("div",{className:"flex items-start gap-1.5 rounded-lg border border-amber-500/30 bg-amber-500/10 px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-amber-400",children:"warning"}),(0,s.jsx)("div",{className:"text-[11px] text-amber-300",children:n.roleViolations.map(e=>(0,s.jsx)("p",{children:e.reason},`${e.role}-${e.model}`))})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border-subtle bg-surface-1/60 px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"Capabilities"}),(0,s.jsx)(U.default,{caps:{thinking:n.capabilities?.thinking,vision:n.capabilities?.vision?.input,tools:n.capabilities?.tools,pdf:n.capabilities?.pdf,audio:n.capabilities?.audio?.input},size:13}),n.capabilities?.contextWindow?(0,s.jsxs)("span",{className:"ml-auto text-[10px] text-text-muted",children:["ctx ",(n.capabilities.contextWindow/1e3).toFixed(0),"k \xb7 max out"," ",n.capabilities.maxOutput?`${Math.round(n.capabilities.maxOutput/1e3)}k`:"—"]}):null]}),(0,s.jsx)("div",{className:"flex flex-col gap-1",children:n.memberRows.map(e=>{let t=(0,D.vT)(e.latency?.p95,e.latency?.sampleCount);return(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-md border border-border-subtle bg-surface-1/40 px-2 py-1.5",children:[(0,s.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-[10px] text-text-main",children:e.fullModel}),e.roles.length>0&&(0,s.jsx)("span",{className:"rounded bg-primary/15 px-1 py-0.5 text-[9px] font-medium uppercase tracking-wide text-primary",children:e.roles.join("+")}),(0,s.jsxs)("span",{className:"text-[10px] text-text-muted",children:[B(e.costPerCall),"/call"]}),(0,s.jsx)("span",{className:`w-24 text-right text-[10px] ${t.insufficient?"text-amber-400":"text-text-muted"}`,title:t.insufficient?`${e.latency?.sampleCount??0} latency samples — need ≥ 10`:"",children:t.value})]},e.fullModel)})}),(0,s.jsx)("p",{className:"text-[9px] leading-relaxed text-text-muted",children:"Worst-case calls match the runtime call-cap budget; cost uses the same per-leaf formula as the runtime budget guard (output capped at 4k tokens/call, input assumed above). Latency = p95 over the last 30d of usage for that model."})]}):(0,s.jsx)("p",{className:"py-2 text-center text-[11px] text-text-muted",children:m||"Add at least one model to preview the simulation."})]})}function q({isOpen:e,combo:t,onClose:a,onSave:r,activeProviders:n,modelCaps:c={},kindFilter:x=null,comboStrategies:u={}}){let p=e=>e&&u?.[e.name]?.fallbackStrategy||e?.strategyConfig?.fallbackStrategy||"fallback",[b,h]=(0,l.useState)(t?.name||""),[g,f]=(0,l.useState)(t?.models||[]),[y,v]=(0,l.useState)(p(t)),[j,N]=(0,l.useState)(!1),[k,w]=(0,l.useState)(!1),[C,S]=(0,l.useState)(""),[M,$]=(0,l.useState)({}),[F,E]=(0,l.useState)(!0),[P,A]=(0,l.useState)(!0),[z,D]=(0,l.useState)(60),[U,W]=(0,l.useState)(""),[B,J]=(0,l.useState)(!1),[I,H]=(0,l.useState)(""),[V,Z]=(0,l.useState)(e);(0,l.useEffect)(()=>{if(e&&!V){h(t?.name||""),f(Array.isArray(t?.models)?[...t.models]:[]),v(p(t)),S(""),N(!1);let e=t&&u?.[t.name]?.smartRouting||t?.strategyConfig?.smartRouting||{};E(!1!==e.cookiePoolEnabled),A(e.intentDetection?.urlPatternBoost!==!1),D(Math.round((e.intentDetection?.confidenceThreshold??.6)*100)),W((e.intentDetection?.keywords||[]).join(", ")),J(e.intentDetection?.llmClassifierFallback?.enabled===!0),H(e.intentDetection?.llmClassifierFallback?.model||"")}Z(e)},[e,V,t]);let G=(0,R.FR)((0,R.MS)(R.AN,{activationConstraint:{distance:5}}),(0,R.MS)(R.uN,{coordinateGetter:O.JR})),Q=g.map((e,t)=>({uid:`item-${t}`,model:e}));(0,l.useEffect)(()=>{if(!e)return;let t=!1;return(async()=>{try{let e=await fetch("/api/models/alias");if(!t&&e.ok){let t=await e.json();$(t.aliases||{})}}catch{}})(),()=>{t=!0}},[e]);let K=e=>e.trim()?o.test(e)?(S(""),!0):(S("Only letters, numbers, -, _ and . allowed"),!1):(S("Name is required"),!1),Y=async()=>{if(!K(b))return;w(!0);let e={...t?.strategyConfig||{},fallbackStrategy:y};"smart-routing"===y&&(e.smartRouting={cookiePoolEnabled:F,intentDetection:{confidenceThreshold:z/100,urlPatternBoost:P,...U.trim()?{keywords:U.split(",").map(e=>e.trim()).filter(Boolean)}:{},llmClassifierFallback:{enabled:B,...I.trim()?{model:I.trim()}:{}}}}),await r({name:b.trim(),models:g,strategyConfig:e}),w(!1)},X=!!t;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.aF,{isOpen:e,onClose:a,title:X?"Edit Combo":"Create Combo",size:"lg",children:(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)(i.pd,{label:"Combo Name",value:b,onChange:e=>{let t=e.target.value;h(t),t?K(t):S("")},placeholder:"my-combo",error:C}),(0,s.jsxs)("div",{className:"mt-1.5 flex items-center gap-2",children:[(0,s.jsx)("p",{className:"text-[10px] text-text-muted",children:"Use this name as the model in your client:"}),b.trim()&&(0,s.jsx)("code",{className:"rounded bg-primary/10 px-1.5 py-0.5 font-mono text-[10px] text-primary",children:b.trim()})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Models"}),g.length>0&&(0,s.jsxs)(i.Ex,{variant:"info",size:"sm",children:[g.length," model",1!==g.length?"s":""]})]}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"Drag to reorder priority"})]}),0===g.length?(0,s.jsxs)("div",{className:"flex flex-col items-center justify-center py-8 border border-dashed border-border rounded-lg bg-surface-2/50",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-text-muted text-2xl mb-2",children:"layers"}),(0,s.jsx)("p",{className:"text-xs text-text-muted mb-3",children:"Add models to build your combo"}),(0,s.jsx)(i.$n,{size:"sm",variant:"secondary",icon:"add",onClick:()=>N(!0),children:"Add First Model"})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(R.Mp,{sensors:G,collisionDetection:R.fp,onDragEnd:e=>{let{active:t,over:a}=e;if(a&&t.id!==a.id){let e=Q.findIndex(e=>e.uid===t.id),s=Q.findIndex(e=>e.uid===a.id);-1!==e&&-1!==s&&f(t=>(0,O.be)(t,e,s))}},modifiers:[T.FN,T.gj],children:(0,s.jsx)(O.gB,{items:Q.map(e=>e.uid),strategy:O._G,children:(0,s.jsx)("div",{className:"flex max-h-[45vh] min-w-0 flex-col gap-1 overflow-y-auto rounded-lg bg-surface-2/30 p-1.5",children:Q.map(({uid:e,model:t},a)=>(0,s.jsx)(_,{id:e,index:a,model:t,modelCaps:c,isFirst:0===a,isLast:a===Q.length-1,onEdit:e=>{let t=[...g];t[a]=e,f(t)},onMoveUp:()=>(e=>{if(0===e)return;let t=[...g];[t[e-1],t[e]]=[t[e],t[e-1]],f(t)})(a),onMoveDown:()=>(e=>{if(e===g.length-1)return;let t=[...g];[t[e],t[e+1]]=[t[e+1],t[e]],f(t)})(a),onRemove:()=>{f(e=>e.filter((e,t)=>t!==a))}},e))})})}),(0,s.jsxs)("button",{onClick:()=>N(!0),className:"w-full mt-2 py-2 border border-dashed border-primary/30 rounded-lg text-xs text-primary font-medium hover:border-primary hover:bg-primary/5 transition-colors flex items-center justify-center gap-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"add"}),"Add Model"]})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,s.jsx)("label",{className:"text-sm font-medium text-text-main",children:"Strategy"}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"How the combo dispatches requests"})]}),(0,s.jsx)("div",{className:"grid grid-cols-2 gap-1.5 sm:grid-cols-3 lg:grid-cols-6",children:d.map(e=>{let t=y===e.value,a=m(e.value);return(0,s.jsxs)("button",{type:"button",onClick:()=>v(e.value),title:e.desc,className:`flex flex-col items-center gap-1 rounded-lg border px-2 py-1.5 text-[11px] transition-colors ${t?"border-primary/50 bg-primary/10 text-primary":"border-border-subtle bg-surface-2/50 text-text-muted hover:border-border hover:text-text-main"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",style:{color:t?void 0:a.color},children:e.icon}),(0,s.jsx)("span",{className:"font-medium",children:e.label})]},e.value)})})]}),"smart-routing"===y&&(0,s.jsxs)("div",{className:"flex flex-col gap-2.5 rounded-lg border border-primary/20 bg-primary/[0.04] px-3 py-2.5",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",style:{color:"#EC4899"},children:"alt_route"}),(0,s.jsx)("span",{className:"text-xs font-medium text-text-main",children:"Smart Routing"}),(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"Routes each request by tool-calling need & research intent"})]}),(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,s.jsx)("input",{type:"checkbox",checked:F,onChange:e=>E(e.target.checked),className:"rounded border-border accent-primary"}),(0,s.jsx)("span",{className:"text-[11px] text-text-muted",children:"Route research intents to web (cookie) providers first"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)("label",{className:"text-[10px] text-text-muted",children:"Research keywords (comma-separated — leave empty for defaults)"}),(0,s.jsx)("textarea",{value:U,onChange:e=>W(e.target.value),rows:2,placeholder:"research, compare, bandingkan, cari sumber, jurnal, ...",className:"resize-none rounded border border-border bg-background px-2 py-1.5 font-mono text-[11px] focus:border-primary focus:outline-none"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,s.jsx)("input",{type:"checkbox",checked:P,onChange:e=>A(e.target.checked),className:"rounded border-border accent-primary"}),(0,s.jsx)("span",{className:"text-[11px] text-text-muted",children:"Treat prompts containing a URL as research"})]}),(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,s.jsx)("input",{type:"checkbox",checked:B,onChange:e=>J(e.target.checked),className:"rounded border-border accent-primary"}),(0,s.jsx)("span",{className:"text-[11px] text-text-muted",children:"LLM classifier fallback for ambiguous prompts"})]}),B&&(0,s.jsx)("input",{value:I,onChange:e=>H(e.target.value),placeholder:"kr/claude-haiku-4.5",className:"rounded border border-border bg-background px-2 py-1 font-mono text-[11px] focus:border-primary focus:outline-none"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("label",{className:"text-[10px] text-text-muted",children:"Heuristic confidence threshold"}),(0,s.jsxs)("span",{className:"font-mono text-[10px] text-primary",children:[z,"%"]})]}),(0,s.jsx)("input",{type:"range",min:0,max:100,value:z,onChange:e=>D(Number(e.target.value)),className:"w-full accent-primary"})]})]}),g.length>0&&(0,s.jsx)(L,{models:g,strategyConfig:{fallbackStrategy:y}}),g.length>=2&&(0,s.jsxs)("div",{className:"rounded-lg border border-border-subtle bg-surface-2/50 px-3 py-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"lightbulb"}),(0,s.jsx)("span",{className:"text-xs font-medium text-text-main",children:"Strategy Tips"})]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-1.5 sm:grid-cols-2",children:d.map(e=>(0,s.jsxs)("div",{className:"flex items-start gap-1.5 text-[11px] text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[12px] mt-0.5 text-primary/60",children:e.icon}),(0,s.jsxs)("span",{children:[(0,s.jsx)("span",{className:"font-medium text-text-main",children:e.label})," — ",e.desc]})]},e.value))}),(0,s.jsx)("p",{className:"mt-1.5 text-[10px] text-text-muted",children:"Set strategy after creating the combo from the Combos tab."})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2 pt-1 sm:flex-row",children:[(0,s.jsx)(i.$n,{onClick:a,variant:"ghost",fullWidth:!0,size:"sm",children:"Cancel"}),(0,s.jsx)(i.$n,{onClick:Y,fullWidth:!0,size:"sm",icon:X?"save":"add",disabled:!b.trim()||!!C||k,children:k?"Saving...":X?"Save Changes":"Create Combo"})]})]})}),(0,s.jsx)(i.rq,{isOpen:j,onClose:()=>N(!1),onSelect:e=>{f(t=>t.includes(e.value)?t:[...t,e.value])},onDeselect:e=>{f(t=>t.filter(t=>t!==e.value))},activeProviders:n,modelAliases:M,title:"Add Model to Combo",kindFilter:x,addedModelValues:g,closeOnSelect:!1})]})}var J=a(72908);let I=[500,1e3,2e3,5e3,1e4,25e3,5e4,1e5],H=d.map(e=>e.value),V={latency:"Latency",cost:"Cost",reliability:"Reliability"};function Z({activeProviders:e=[]}){let t,[a,r]=(0,l.useState)([]),[i,n]=(0,l.useState)(""),[o,c]=(0,l.useState)(1e3),[u,p]=(0,l.useState)({latency:40,cost:40,reliability:20}),[b,h]=(0,l.useState)([...H]),[g,f]=(0,l.useState)(null),[y,v]=(0,l.useState)(!1),[j,N]=(0,l.useState)(""),[k,w]=(0,l.useState)([]),[C,S]=(0,l.useState)(!1),[M,$]=(0,l.useState)({}),F=(0,l.useRef)(0);(0,l.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await fetch("/api/models");if(!e&&t.ok){let e=await t.json();w([...new Set((e.models||[]).map(e=>e.fullModel).filter(Boolean))].sort())}}catch{}})(),()=>{e=!0}},[]),(0,l.useEffect)(()=>{let e=!1;return fetch("/api/models/alias").then(e=>e.ok?e.json():null).then(t=>{!e&&t&&$(t.aliases||{})}).catch(()=>{}),()=>{e=!0}},[]);let E=e=>{r(e),n(e.join(", "))};(0,l.useEffect)(()=>{if(0===a.length){f(null),N("");return}if(b.length<1)return;let e=++F.current;v(!0),N("");let t=setTimeout(async()=>{try{let t,s,l=await fetch("/api/combos/lab",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({models:a,inputTokens:o,weights:(s=(t={latency:u.latency,cost:u.cost,reliability:u.reliability}).latency+t.cost+t.reliability)<=0?{latency:.4,cost:.4,reliability:.2}:{latency:t.latency/s,cost:t.cost/s,reliability:t.reliability/s},strategies:b})});if(!l.ok){let e=await l.json().catch(()=>({}));throw Error(e?.error||"Analysis failed")}let r=await l.json();e===F.current&&f(r)}catch(t){e===F.current&&(N(t?.message||"Analysis failed"),f(null))}finally{e===F.current&&v(!1)}},350);return()=>clearTimeout(t)},[a.join("|"),o,u.latency,u.cost,u.reliability,b.join("|")]);let P=g?.comparison||[],A=Math.max(...P.map(e=>e.score||0),1e-9),R=g?.dataCoverage;return(0,s.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,s.jsxs)("div",{className:"rounded-lg border border-border-subtle bg-surface-2/50 p-3",children:[(0,s.jsxs)("div",{className:"mb-2 flex items-center justify-between",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"science"}),(0,s.jsx)("span",{className:"text-xs font-medium text-text-main",children:"Combo Lab — what-if analysis"}),y&&(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"analyzing…"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] text-text-muted",children:"assumed input"}),(0,s.jsx)("select",{value:o,onChange:e=>c(Number(e.target.value)),className:"rounded border border-border-subtle bg-surface-1 px-1.5 py-0.5 text-[10px] text-text-main",children:I.map(e=>(0,s.jsxs)("option",{value:e,children:[e>=1e3?`${e/1e3}k`:e," tok"]},e))})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsxs)("div",{className:"flex items-stretch gap-1.5",children:[(0,s.jsx)("input",{list:"combo-lab-models",value:i,onChange:e=>{var t;n(t=e.target.value),r([...new Set(t.split(/[\n,]+/).map(e=>e.trim()).filter(Boolean))])},placeholder:"provider/model, provider/model — e.g. cc/claude-opus-4-7, gh/gpt-5.3-codex",className:"min-w-0 flex-1 rounded-lg border border-border-subtle bg-surface-1 px-2.5 py-1.5 font-mono text-[11px] text-text-main placeholder:text-text-muted/60 focus:border-primary/50 focus:outline-none"}),(0,s.jsxs)("button",{type:"button",onClick:()=>S(!0),className:"flex shrink-0 items-center gap-1 rounded-lg border border-dashed border-border px-2.5 py-1.5 text-[11px] font-medium text-primary transition-colors hover:border-primary/50 hover:bg-primary/5",title:"Pick models from the provider catalog (same picker as Add Model in combos)",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"add"}),"Add Model"]})]}),(0,s.jsx)("datalist",{id:"combo-lab-models",children:k.map(e=>(0,s.jsx)("option",{value:e},e))}),a.length>0&&(0,s.jsx)("div",{className:"flex flex-wrap gap-1",children:a.map(e=>(0,s.jsxs)("span",{className:"flex items-center gap-1 rounded bg-surface-1 px-1.5 py-0.5 font-mono text-[10px] text-text-main",children:[e,(0,s.jsx)("button",{onClick:()=>{E(a.filter(t=>t!==e))},className:"text-text-muted hover:text-red-400",title:"Remove",children:"\xd7"})]},e))})]}),(0,s.jsxs)("div",{className:"mt-2.5 flex flex-col gap-2.5 sm:flex-row sm:items-start sm:justify-between",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"Axis weights"}),["latency","cost","reliability"].map(e=>(0,s.jsxs)("label",{className:"flex items-center gap-2 text-[11px] text-text-muted",children:[(0,s.jsx)("span",{className:"w-16",children:V[e]}),(0,s.jsx)("input",{type:"range",min:0,max:100,step:5,value:u[e],onChange:t=>p(a=>({...a,[e]:Number(t.target.value)})),className:"h-1 w-32 accent-primary"}),(0,s.jsxs)("span",{className:"w-8 text-right font-mono text-[10px] text-text-main",children:[u[e],"%"]})]},e))]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"Compare strategies"}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1.5",children:d.map(e=>{let t=b.includes(e.value),a=m(e.value);return(0,s.jsxs)("button",{type:"button",onClick:()=>{var t;return t=e.value,void h(e=>e.includes(t)?e.filter(e=>e!==t):[...e,t])},title:e.desc,className:`flex items-center gap-1 rounded-md border px-1.5 py-1 text-[10px] transition-colors ${t?"border-primary/40 bg-primary/10 text-text-main":"border-border-subtle bg-surface-1 text-text-muted/60 hover:text-text-muted"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px]",style:{color:t?void 0:a.color},children:e.icon}),e.label]},e.value)})})]})]})]}),0===a.length?(0,s.jsx)("p",{className:"rounded-lg border border-border-subtle bg-surface-2/50 p-4 text-center text-[11px] text-text-muted",children:"Enter at least one model (provider/model) to compare strategies against historical latency, cost and reliability."}):j?(0,s.jsx)("p",{className:"rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2 text-[11px] text-red-300",children:j}):g?(0,s.jsxs)("div",{className:"flex flex-col gap-2.5",children:[g.recommendation&&(0,s.jsxs)("div",{className:"flex items-start gap-2 rounded-lg border border-emerald-500/30 bg-emerald-500/10 px-3 py-2.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px] text-emerald-400",children:"recommend"}),(0,s.jsxs)("div",{className:"flex min-w-0 flex-col gap-0.5",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsxs)("span",{className:"text-xs font-semibold text-text-main",children:["Recommended: ",x(g.recommendation.strategy)]}),(t=m(g.recommendation.strategy),(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:{color:t.color},children:t.icon}))]}),(0,s.jsx)("p",{className:"text-[11px] text-emerald-200/80",children:g.recommendation.reason}),g.recommendation.runnerUp&&(0,s.jsxs)("p",{className:"text-[10px] text-text-muted",children:["Runner-up: ",x(g.recommendation.runnerUp.strategy)," (score ",(100*g.recommendation.runnerUp.score).toFixed(0),")"]})]})]}),g.atRiskProviders?.length>0&&(0,s.jsxs)("div",{className:"flex items-start gap-1.5 rounded-lg border border-amber-500/30 bg-amber-500/10 px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-amber-400",children:"warning"}),(0,s.jsxs)("p",{className:"text-[11px] text-amber-300",children:["Provider",g.atRiskProviders.length>1?"s":""," currently locked or breaker-open:"," ",g.atRiskProviders.join(", ")," — expect failures on those members right now."]})]}),R&&(0,s.jsxs)("p",{className:"text-[10px] text-text-muted",children:["Data coverage: latency ",R.latency.known,"/",R.latency.total," \xb7 reliability ",R.reliability.known,"/",R.reliability.total," \xb7 pricing"," ",R.cost.known,"/",R.cost.total," member",1!==R.cost.total?"s":""," (30d usage history).",R.reliability.known<R.reliability.total&&" Members without history are assumed 90% reliable."]}),(0,s.jsx)("div",{className:"overflow-x-auto rounded-lg border border-border-subtle bg-surface-2/50",children:(0,s.jsxs)("table",{className:"w-full min-w-[640px] text-left",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{className:"border-b border-border-subtle text-[9px] uppercase tracking-wide text-text-muted",children:[(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"#"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Strategy"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Score"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Calls (typ)"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Latency p95"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Cost / req"}),(0,s.jsx)("th",{className:"px-2.5 py-1.5 font-medium",children:"Reliability"})]})}),(0,s.jsx)("tbody",{children:P.map((e,t)=>{let a,l,r,i=m(e.strategy);(0,D.vT)(e.wallClockP95Ms,null);let n=g.recommendation&&e.strategy===g.recommendation.strategy;return(0,s.jsxs)("tr",{className:`border-b border-border-subtle/50 last:border-0 ${n?"bg-emerald-500/5":""}`,children:[(0,s.jsx)("td",{className:"px-2.5 py-1.5 text-[11px] text-text-muted",children:t+1}),(0,s.jsx)("td",{className:"px-2.5 py-1.5",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[15px]",style:{color:i.color},children:i.icon}),(0,s.jsx)("span",{className:"text-[11px] font-medium text-text-main",children:x(e.strategy)}),n&&(0,s.jsx)("span",{className:"rounded bg-emerald-500/20 px-1 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-emerald-400",children:"Best"}),e.invalid&&(0,s.jsx)("span",{className:"rounded bg-red-500/20 px-1 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-red-400",title:e.invalidReasons.join(" \xb7 "),children:"Invalid"})]})}),(0,s.jsx)("td",{className:"px-2.5 py-1.5",children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("div",{className:"h-1.5 w-16 overflow-hidden rounded bg-surface-1",children:(0,s.jsx)("div",{className:"h-full rounded bg-primary",style:{width:`${Math.round(e.score/A*100)}%`}})}),(0,s.jsx)("span",{className:"text-[10px] font-mono text-text-main",children:null!=e.score?e.score.toFixed(2):"—"})]})}),(0,s.jsxs)("td",{className:"px-2.5 py-1.5 text-[11px] text-text-muted",children:["number"==typeof(a=e.expectedCalls)&&Number.isFinite(a)?Number.isInteger(a)?String(a):a.toFixed(1):"—",e.calls&&e.calls.min!==e.calls.max&&(0,s.jsxs)("span",{className:"text-[9px] text-text-muted/70",children:[" (",e.calls.min,"–",e.calls.max,")"]})]}),(0,s.jsx)("td",{className:"px-2.5 py-1.5 text-[11px] text-text-main",title:null!=e.wallClockP95Ms?`${e.wallClockP95Ms}ms`:"",children:null!=e.wallClockP95Ms?(0,D.Se)(e.wallClockP95Ms):"—"}),(0,s.jsx)("td",{className:"px-2.5 py-1.5 text-[11px] text-text-main",children:"number"==typeof(l=e.expectedCostUsd)&&Number.isFinite(l)?`$${l.toFixed(4).replace(/\.?0+$/,"")}`:"—"}),(0,s.jsx)("td",{className:"px-2.5 py-1.5 text-[11px] text-text-main",children:"number"==typeof(r=e.reliability)&&Number.isFinite(r)?`${(100*r).toFixed(1)}%`:"—"})]},e.strategy)})})]})}),(0,s.jsxs)("p",{className:"text-[9px] leading-relaxed text-text-muted",children:["Expected = typical request (midpoint of the runtime call range). Cost uses the same per-leaf formula as the runtime budget guard (output capped 4k tokens/call, input assumed ",o,"). Latency = expected wall-clock p95 including parallel fanout (fusion panel, swarm workers). Reliability = success rate from 30d usage history per model. Axis scores are normalized relative to the best strategy; weights renormalize over axes with data."]})]}):(0,s.jsx)("p",{className:"rounded-lg border border-border-subtle bg-surface-2/50 p-4 text-center text-[11px] text-text-muted",children:"Analyzing…"}),(0,s.jsx)(J.default,{isOpen:C,onClose:()=>S(!1),onSelect:e=>{let t=e?.value;!t||a.includes(t)||E([...a,t])},onDeselect:e=>{let t=e?.value;t&&E(a.filter(e=>e!==t))},activeProviders:e,modelAliases:M,addedModelValues:a,closeOnSelect:!1,title:"Add Model to Combo Lab"})]})}let G=[{value:"overview",label:"Overview"},{value:"combos",label:"Combos"},{value:"templates",label:"Templates"},{value:"lab",label:"Lab"}];function Q(){let e=(0,r.useRouter)(),t=(0,r.useSearchParams)().get("tab")||"overview",[a,o]=(0,l.useState)([]),[d,c]=(0,l.useState)(!0),[m,x]=(0,l.useState)(!1),[u,p]=(0,l.useState)(null),[h,g]=(0,l.useState)([]),[f,y]=(0,l.useState)({}),[v,j]=(0,l.useState)({}),[N,k]=(0,l.useState)({}),[w,C]=(0,l.useState)(null),{copied:S,copy:M}=(0,n.C)(),$=(0,l.useCallback)(async()=>{try{let[e,t,a,s]=await Promise.all([fetch("/api/combos"),fetch("/api/providers"),fetch("/api/settings"),fetch("/api/models")]),l=await e.json(),r=await t.json(),i=a.ok?await a.json():{};if(e.ok&&o((l.combos||[]).filter(e=>!e.kind||"llm"===e.kind)),t.ok&&g(r.connections||[]),s.ok){let e=await s.json(),t={},a={};for(let s of e.models||[]){s.caps&&(t[s.fullModel]=s.caps);let e=(s.fullModel||"").split("/").slice(1).join("/");e&&s.provider&&(a[e]||(a[e]=[]),a[e].includes(s.provider)||a[e].push(s.provider))}j(t),k(a)}y(i.comboStrategies||{})}catch(e){console.log("Error fetching data:",e)}finally{c(!1)}},[]);(0,l.useEffect)(()=>{$()},[$]);let E=t=>e.push(`/dashboard/combos?tab=${t}`),P=async e=>{try{let t=await fetch("/api/combos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(t.ok)await $(),x(!1);else{let e=await t.json();alert(e.error||"Failed to create combo")}}catch(e){console.log("Error creating combo:",e)}},R=async(e,t)=>{try{let a=await fetch(`/api/combos/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(a.ok){let e=t.strategyConfig?.fallbackStrategy,a=u?.name,s=t.name?.trim();e&&(s&&s!==a&&f[a]&&await O(a,{fallbackStrategy:"fallback"}),s&&await O(s,{fallbackStrategy:e})),await $(),p(null)}else{let e=await a.json();alert(e.error||"Failed to update combo")}}catch(e){console.log("Error updating combo:",e)}},O=async(e,t)=>{try{let s=f[e]||{},l={...s,...t},r=l.fallbackStrategy,i=new Set(["fallbackStrategy","thinking","autoScale","budgets",...{fusion:["judgeModel","fusionTuning"],swarm:["managerModel","staffModel","auditModel","workerCount","swarmTuning","enableTelemetry"],cascade:["cascade"],"smart-routing":["smartRouting"],fallback:[],"round-robin":[]}[r]||[]]),n={};for(let[e,t]of Object.entries(l))i.has(e)&&(n[e]=t);let o=Object.keys(s).some(e=>"fallbackStrategy"!==e&&null!=s[e]&&""!==s[e]),d=Object.keys(n).some(e=>"fallbackStrategy"!==e),c="fallback"===n.fallbackStrategy&&o&&!d;if(!c&&("swarm"===n.fallbackStrategy||"fusion"===n.fallbackStrategy)){let t=a.find(t=>t.name===e),s=t?.models||[];try{let e=await fetch("/api/combos/validate-roles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({strategy:n.fallbackStrategy,managerModel:n.managerModel,staffModel:n.staffModel,auditModel:n.auditModel,judgeModel:n.judgeModel,panel:s})});if(e.ok){let t=await e.json();if(!t.valid&&Array.isArray(t.violations)&&t.violations.length>0){let e=t.violations.map(e=>`${e.role}: ${e.reason}`).join("\n");alert(`Cannot save strategy — invalid role models:
|
|
2
|
+
|
|
3
|
+
${e}`);return}}}catch{}}await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategies:{[e]:c?null:n}})}),y(t=>{let a={...t};return c?delete a[e]:a[e]=n,a})}catch(e){console.log("Error updating combo strategy:",e)}};return d?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(i.Qv,{}),(0,s.jsx)(i.Qv,{})]}):(0,s.jsxs)("div",{className:"flex min-w-0 flex-col gap-5",children:[(0,s.jsx)(i.zY,{title:"Combos",description:"Group models under one name, then pick a strategy per combo",icon:"layers",actions:(0,s.jsx)(i.$n,{size:"sm",icon:"add",onClick:()=>x(!0),className:"whitespace-nowrap",children:"Create Combo"})}),(0,s.jsx)(i.Iz,{options:G,value:t,onChange:E}),"overview"===t&&(0,s.jsx)(b,{combos:a,comboStrategies:f,activeProviders:h,onViewCombos:()=>E("combos"),onCreate:()=>x(!0)}),"combos"===t&&(0,s.jsx)(F,{combos:a,modelCaps:v,activeProviders:h,comboStrategies:f,copied:S,copy:M,onEdit:p,onDelete:e=>{C({title:"Delete Combo",message:"Delete this combo?",onConfirm:async()=>{C(null);try{let t=await fetch(`/api/combos/${e}`,{method:"DELETE"});if(t.ok)o(t=>t.filter(t=>t.id!==e));else{let e=await t.json().catch(()=>({}));alert(e.error||`Failed to delete combo (${t.status})`)}}catch(e){console.log("Error deleting combo:",e),alert("Failed to delete combo — network error")}}})},onSetStrategy:O,onCreate:()=>x(!0)}),"templates"===t&&(0,s.jsx)(A,{combos:a,connections:h,modelIndex:N,onApply:$}),"lab"===t&&(0,s.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{className:"text-[11px] text-text-muted",children:"What-if engine — compare routing strategies side-by-side using your historical latency, cost and reliability data, then apply the recommended strategy to any combo."}),(0,s.jsx)(Z,{activeProviders:h})]}),(0,s.jsx)(q,{isOpen:m,onClose:()=>x(!1),onSave:P,activeProviders:h,modelCaps:v},"create"),(0,s.jsx)(q,{isOpen:!!u,combo:u,onClose:()=>p(null),onSave:e=>R(u.id,e),activeProviders:h,modelCaps:v,comboStrategies:f},u?.id||"new"),(0,s.jsx)(i.uo,{isOpen:!!w,onClose:()=>C(null),onConfirm:w?.onConfirm,title:w?.title||"Confirm",message:w?.message,variant:"danger"})]})}function K(){return(0,s.jsx)(l.Suspense,{fallback:(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)("div",{className:"h-32 animate-pulse rounded-lg bg-sidebar"}),(0,s.jsx)("div",{className:"h-32 animate-pulse rounded-lg bg-sidebar"})]}),children:(0,s.jsx)(Q,{})})}},57410:(e,t,a)=>{Promise.resolve().then(a.bind(a,22627))},92899:(e,t,a)=>{"use strict";a.d(t,{Se:()=>r,Uk:()=>l,uv:()=>s,vT:()=>i});let s=10;function l(e){return null==e||e>=s}function r(e){return null==e?"—":e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function i(e,t){return null==e?{value:"—",insufficient:!1}:l(t)?{value:r(e),insufficient:!1}:{value:"insufficient data",insufficient:!0}}}},e=>{e.O(0,[27,7055,9497,705,1321,5497,8441,3794,7358],()=>e(e.s=57410)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[712],{237:(e,s,t)=>{Promise.resolve().then(t.bind(t,44493))},44493:(e,s,t)=>{"use strict";t.d(s,{default:()=>o});var l=t(95155),n=t(12115),r=t(35497),a=t(90620);let c={LOG:"text-green-400",INFO:"text-blue-400",WARN:"text-yellow-400",ERROR:"text-red-400",DEBUG:"text-purple-400"};function o(){let[e,s]=(0,n.useState)([]),[t,o]=(0,n.useState)(!1),i=(0,n.useRef)(null),d=async()=>{try{await fetch("/api/translator/console-logs",{method:"DELETE"})}catch(e){console.error("Failed to clear console logs:",e)}};return(0,n.useEffect)(()=>{let e=new EventSource("/api/translator/console-logs/stream");return e.onopen=()=>o(!0),e.onmessage=e=>{let t=JSON.parse(e.data);"init"===t.type?s(t.logs.slice(-a.UY.maxLines)):"line"===t.type?s(e=>{let s=[...e,t.line];return s.length>a.UY.maxLines?s.slice(-a.UY.maxLines):s}):"lines"===t.type?s(e=>{let s=[...e,...t.lines];return s.length>a.UY.maxLines?s.slice(-a.UY.maxLines):s}):"clear"===t.type&&s([])},e.onerror=()=>o(!1),()=>e.close()},[]),(0,n.useEffect)(()=>{i.current&&(i.current.scrollTop=i.current.scrollHeight)},[e]),(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsx)(r.zY,{title:"Console",description:"Live server logs",icon:"monitor",actions:(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)("span",{className:`flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${t?"bg-success/12 text-success":"bg-danger/12 text-danger"}`,children:[(0,l.jsx)("span",{className:`size-1.5 rounded-full ${t?"bg-success":"bg-danger"}`}),t?"Live":"Disconnected"]}),(0,l.jsx)(r.$n,{size:"sm",variant:"outline",icon:"delete",onClick:d,children:"Clear"})]})}),(0,l.jsx)(r.Zp,{padding:"none",children:(0,l.jsx)("div",{ref:i,className:"bg-black rounded-b-lg p-4 text-xs font-mono h-[calc(100vh-220px)] overflow-y-auto",children:0===e.length?(0,l.jsx)("span",{className:"text-text-muted",children:"No console logs yet."}):(0,l.jsx)("div",{className:"space-y-0.5",children:e.map((e,s)=>{let t,n;return(0,l.jsx)("div",{children:(n=c[(t=e.match(/\[(\w+)\]/g))?t[1]?.replace(/\[|\]/g,""):null]||"text-green-400",(0,l.jsx)("span",{className:n,children:e}))},s)})})})})]})}}},e=>{e.O(0,[27,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[712],{237:(e,s,t)=>{Promise.resolve().then(t.bind(t,44493))},44493:(e,s,t)=>{"use strict";t.d(s,{default:()=>o});var l=t(95155),n=t(12115),r=t(35497),a=t(90620);let c={LOG:"text-green-400",INFO:"text-blue-400",WARN:"text-yellow-400",ERROR:"text-red-400",DEBUG:"text-purple-400"};function o(){let[e,s]=(0,n.useState)([]),[t,o]=(0,n.useState)(!1),i=(0,n.useRef)(null),d=async()=>{try{await fetch("/api/translator/console-logs",{method:"DELETE"})}catch(e){console.error("Failed to clear console logs:",e)}};return(0,n.useEffect)(()=>{let e=new EventSource("/api/translator/console-logs/stream");return e.onopen=()=>o(!0),e.onmessage=e=>{let t=JSON.parse(e.data);"init"===t.type?s(t.logs.slice(-a.UY.maxLines)):"line"===t.type?s(e=>{let s=[...e,t.line];return s.length>a.UY.maxLines?s.slice(-a.UY.maxLines):s}):"lines"===t.type?s(e=>{let s=[...e,...t.lines];return s.length>a.UY.maxLines?s.slice(-a.UY.maxLines):s}):"clear"===t.type&&s([])},e.onerror=()=>o(!1),()=>e.close()},[]),(0,n.useEffect)(()=>{i.current&&(i.current.scrollTop=i.current.scrollHeight)},[e]),(0,l.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,l.jsx)(r.zY,{title:"Console",description:"Live server logs",icon:"monitor",actions:(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)("span",{className:`flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${t?"bg-success/12 text-success":"bg-danger/12 text-danger"}`,children:[(0,l.jsx)("span",{className:`size-1.5 rounded-full ${t?"bg-success":"bg-danger"}`}),t?"Live":"Disconnected"]}),(0,l.jsx)(r.$n,{size:"sm",variant:"outline",icon:"delete",onClick:d,children:"Clear"})]})}),(0,l.jsx)(r.Zp,{padding:"none",children:(0,l.jsx)("div",{ref:i,className:"bg-black rounded-b-lg p-4 text-xs font-mono h-[calc(100vh-220px)] overflow-y-auto",children:0===e.length?(0,l.jsx)("span",{className:"text-text-muted",children:"No console logs yet."}):(0,l.jsx)("div",{className:"space-y-0.5",children:e.map((e,s)=>{let t,n;return(0,l.jsx)("div",{children:(n=c[(t=e.match(/\[(\w+)\]/g))?t[1]?.replace(/\[|\]/g,""):null]||"text-green-400",(0,l.jsx)("span",{className:n,children:e}))},s)})})})})]})}}},e=>{e.O(0,[27,9497,705,1321,5497,8441,3794,7358],()=>e(e.s=237)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099],{},_=>{_.O(0,[27,9497,705,1321,5497,981,8441,3794,7358],()=>_(_.s=90981)),_N_E=_.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/health/page-1c94a0710d61767e.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8192],{4695:(e,t,s)=>{"use strict";s.d(t,{default:()=>d});var n=s(95155),r=s(12115),a=s(56061),i=s(99312),l=s(31474),o=s(88105);let c={closed:{label:"Closed",variant:"success"},halfOpen:{label:"Probing",variant:"warning"},open:{label:"Open",variant:"error"}};function d(){let[e,t]=(0,r.useState)([]),[s,d]=(0,r.useState)(!1),u=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/health/overview");if(!e.ok)return;let s=await e.json();t(Array.isArray(s.providers)?s.providers:[]),d(!0)}catch{d(!1)}},[]);return(0,r.useEffect)(()=>{u();let e=setInterval(u,3e3);return()=>clearInterval(e)},[u]),(0,n.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[(0,n.jsx)("span",{className:(0,l.cn)("size-2 rounded-full",s?"bg-success animate-pulse":"bg-danger")}),s?"Live \xb7 refreshes every 3s":"Reconnecting…"]}),e.length>0&&(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-3 text-xs text-text-muted",children:[(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-success"})," Healthy"]}),(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-warning"})," Degraded"]}),(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-danger"})," Unhealthy"]})]})]}),0===e.length?(0,n.jsx)(i.default,{icon:"grid_view",title:"No provider health data",description:"Send a request to any provider (or connect an account) and the heatmap will appear here with success rate, latency percentiles, breaker state, and connection cooldowns."}):(0,n.jsx)("div",{className:"overflow-x-auto rounded-panel border border-border-subtle bg-panel shadow-[var(--shadow-soft)]",children:(0,n.jsxs)("table",{className:"w-full min-w-[760px] border-collapse text-xs",children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{className:"border-b border-border-subtle text-left text-[11px] uppercase tracking-wider text-text-subtle",children:[(0,n.jsx)("th",{className:"px-3 py-2.5 font-medium",children:"Provider"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"Success rate"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"p50"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"p95"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"p99"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"Errors"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"Breaker"}),(0,n.jsx)("th",{className:"px-3 py-2.5 text-center font-medium",children:"Connections"})]})}),(0,n.jsx)("tbody",{children:e.map(e=>{var t;let s,r=e.health||{},i=r.successRate??null,d=null!=i?Math.round(100*i):null,u=function(e){if(null==e)return{bg:"transparent",fg:"text-text-subtle"};let t=Math.max(0,Math.min(120,Math.round(120*e)));return{bg:`hsl(${t} 80% 45% / 0.20)`,fg:"text-text-main"}}(i),m=e.breaker?c[e.breaker.state]||c.closed:null,x=e.connections.length>0?`${e.connections.length}${e.lockedConnections>0?` \xb7 ${e.lockedConnections} locked`:""}`:"—",p=e.connections.length>0?e.connections.map(e=>`${e.label}${e.cooldownActive?" (cooldown)":e.testStatus?` (${e.testStatus})`:""}${e.lastError?` — ${e.lastError}`:""}`).join("\n"):"";return(0,n.jsxs)("tr",{className:"border-b border-border-subtle/60 last:border-b-0 hover:bg-surface-2/40",children:[(0,n.jsxs)("td",{className:"px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"font-mono font-semibold text-text-main",children:(t=e.id,s=o.Q2[t],s?.name?s.name:String(t||"").replace(/-/g," ").replace(/\b\w/g,e=>e.toUpperCase()))}),e.cooldownActive&&(0,n.jsx)("span",{className:"material-symbols-outlined text-[13px] text-danger",title:"At least one connection is in cooldown",children:"lock_clock"})]}),(0,n.jsx)("div",{className:"text-[10px] text-text-subtle",children:e.id})]}),(0,n.jsx)("td",{className:"px-3 py-2 text-center",children:(0,n.jsx)("span",{className:(0,l.cn)("inline-block min-w-[52px] rounded-md px-2 py-1 font-mono font-semibold",u.fg),style:{background:u.bg},children:null!=d?`${d}%`:"—"})}),["p50LatencyMs","p95LatencyMs","p99LatencyMs"].map(e=>{let t=r[e],s=function(e,t=15e3){if(null==e)return{bg:"transparent",fg:"text-text-subtle"};let s=Math.max(0,Math.min(120,Math.round((1-Math.min(e/t,1))*120)));return{bg:`hsl(${s} 80% 45% / 0.16)`,fg:"text-text-main"}}(t);return(0,n.jsx)("td",{className:"px-3 py-2 text-center",children:(0,n.jsx)("span",{className:(0,l.cn)("inline-block min-w-[52px] rounded-md px-2 py-1 font-mono",s.fg),style:{background:s.bg},children:null==t?"—":t<1e3?`${t}ms`:`${(t/1e3).toFixed(2)}s`})},e)}),(0,n.jsx)("td",{className:"px-3 py-2 text-center",children:(0,n.jsx)("span",{className:(0,l.cn)("inline-block min-w-[40px] rounded-md px-2 py-1 font-mono font-semibold",r.failures>0?"bg-danger/15 text-danger":"text-text-subtle"),children:r.failures||0})}),(0,n.jsxs)("td",{className:"px-3 py-2 text-center",children:[m?(0,n.jsx)(a.default,{variant:m.variant,dot:!0,size:"sm",children:m.label}):(0,n.jsx)("span",{className:"text-text-subtle",children:"—"}),e.breaker?.state==="open"&&null!=e.breaker.cooldownRemainingMs&&(0,n.jsxs)("div",{className:"mt-0.5 text-[10px] text-text-muted",children:["cooldown ",function(e){if(null==e)return"";let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let s=Math.floor(t/60);return`${s}m ${t%60}s`}(e.breaker.cooldownRemainingMs)]})]}),(0,n.jsx)("td",{className:"px-3 py-2 text-center",children:(0,n.jsx)("span",{className:(0,l.cn)("inline-block min-w-[52px] rounded-md px-2 py-1 font-mono",e.lockedConnections>0?"bg-danger/15 text-danger":"active"===e.worstStatus?"bg-success/15 text-success":"text-text-subtle"),title:p||void 0,children:x})})]},e.id)})})]})})]})}},21316:(e,t,s)=>{Promise.resolve().then(s.bind(s,40208)),Promise.resolve().then(s.bind(s,37466)),Promise.resolve().then(s.bind(s,54960)),Promise.resolve().then(s.bind(s,4695))},31474:(e,t,s)=>{"use strict";function n(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}s.d(t,{cn:()=>n})},37466:(e,t,s)=>{"use strict";s.d(t,{default:()=>d});var n=s(95155),r=s(12115),a=s(56061),i=s(99312),l=s(31474),o=s(88105);function c(e){return null==e?"—":e<1e3?`${e}ms`:`${(e/1e3).toFixed(2)}s`}function d(){let[e,t]=(0,r.useState)([]),[s,d]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=new EventSource("/api/health/stream");return e.onopen=()=>d(!0),e.onerror=()=>d(!1),e.onmessage=e=>{try{let s=JSON.parse(e.data);"snapshot"===s.type&&Array.isArray(s.providers)?t(s.providers):s.provider&&t(e=>{let t=e.findIndex(e=>e.provider===s.provider);if(t>=0){let n=[...e];return n[t]=s,n}return[...e,s]})}catch{}},()=>e.close()},[]),(0,n.jsxs)("div",{className:"flex flex-col gap-5",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[(0,n.jsx)("span",{className:(0,l.cn)("size-2 rounded-full",s?"bg-success animate-pulse":"bg-danger")}),s?"Live":"Reconnecting…"]}),e.length>0&&(0,n.jsxs)("div",{className:"flex items-center gap-3 text-xs text-text-muted",children:[(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-success"})," Healthy"]}),(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-warning"})," Degraded"]}),(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsx)("span",{className:"size-2 rounded-full bg-danger"})," Unhealthy"]})]})]}),0===e.length?(0,n.jsx)(i.default,{icon:"monitor_heart",title:"No health data yet",description:"Provider health metrics will appear here once requests flow through the gateway. Send a request to any provider to start collecting samples."}):(0,n.jsx)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",children:e.map(e=>{var t;let s,r=function(e,t){if(0===t)return{label:"Unknown",variant:"default",color:"text-text-subtle",bar:"bg-text-subtle"};let s=e??0;return s>=.95?{label:"Healthy",variant:"success",color:"text-success",bar:"bg-success"}:s>=.8?{label:"Degraded",variant:"warning",color:"text-warning",bar:"bg-warning"}:{label:"Unhealthy",variant:"error",color:"text-danger",bar:"bg-danger"}}(e.successRate,e.total),i=null!=e.successRate?Math.round(100*e.successRate):null;return(0,n.jsxs)("div",{className:"rounded-panel border border-border-subtle bg-panel p-4 shadow-[var(--shadow-soft)]",children:[(0,n.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,n.jsx)("h3",{className:"truncate font-mono text-sm font-semibold text-text-main",children:(t=e.provider,s=o.Q2[t],s?.name?s.name:t.replace(/-/g," ").replace(/\b\w/g,e=>e.toUpperCase()))}),(0,n.jsx)(a.default,{variant:r.variant,dot:!0,size:"sm",children:r.label})]}),null!=i&&(0,n.jsxs)("div",{className:"mb-3",children:[(0,n.jsxs)("div",{className:"mb-1 flex items-center justify-between text-xs text-text-muted",children:[(0,n.jsx)("span",{children:"Success rate"}),(0,n.jsxs)("span",{className:(0,l.cn)("font-mono font-semibold",r.color),children:[i,"%"]})]}),(0,n.jsx)("div",{className:"h-1.5 overflow-hidden rounded-full bg-surface-2",children:(0,n.jsx)("div",{className:(0,l.cn)("h-full rounded-full transition-all",r.bar),style:{width:`${i}%`}})})]}),(0,n.jsxs)("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[(0,n.jsxs)("div",{className:"rounded-md bg-surface-2 p-2",children:[(0,n.jsx)("div",{className:"text-text-subtle",children:"Requests"}),(0,n.jsx)("div",{className:"font-mono font-semibold text-text-main",children:e.total})]}),(0,n.jsxs)("div",{className:"rounded-md bg-surface-2 p-2",children:[(0,n.jsx)("div",{className:"text-text-subtle",children:"Failures"}),(0,n.jsx)("div",{className:(0,l.cn)("font-mono font-semibold",e.failures>0?"text-danger":"text-text-main"),children:e.failures})]}),(0,n.jsxs)("div",{className:"rounded-md bg-surface-2 p-2",children:[(0,n.jsx)("div",{className:"text-text-subtle",children:"Avg latency"}),(0,n.jsx)("div",{className:"font-mono font-semibold text-text-main",children:c(e.avgLatencyMs)})]}),(0,n.jsxs)("div",{className:"rounded-md bg-surface-2 p-2",children:[(0,n.jsx)("div",{className:"text-text-subtle",children:"p95 latency"}),(0,n.jsx)("div",{className:"font-mono font-semibold text-text-main",children:c(e.p95LatencyMs)})]})]}),e.lastError&&(0,n.jsxs)("div",{className:"mt-3 flex items-center gap-1.5 text-xs text-text-muted",children:[(0,n.jsx)("span",{className:"material-symbols-outlined text-[13px] text-danger",children:"error"}),"Last error: ",(0,n.jsx)("span",{className:"font-mono",children:e.lastError})," \xb7 ",function(e){if(!e)return"—";let t=Date.now()-e;return t<5e3?"just now":t<6e4?`${Math.floor(t/1e3)}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:new Date(e).toLocaleTimeString()}(e.lastErrorAt)]})]},e.provider)})})]})}},40208:(e,t,s)=>{"use strict";s.d(t,{default:()=>c});var n=s(95155),r=s(12115),a=s(92542),i=s(56061),l=s(99312);let o={closed:{label:"Closed",variant:"success"},halfOpen:{label:"Half-open (probing)",variant:"warning"},open:{label:"Open",variant:"error"}};function c(){let[e,t]=(0,r.useState)([]),s=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/breaker");if(!e.ok)return;let s=await e.json();t(s.breakers||[])}catch{}},[]);(0,r.useEffect)(()=>{s();let e=setInterval(s,3e3);return()=>clearInterval(e)},[s]);let c=async e=>{try{await fetch("/api/breaker",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,key:e})})}catch{}s()},d=async()=>{for(let t of e)try{await fetch("/api/breaker",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t.provider,key:t.provider})})}catch{}s()};return(0,n.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold text-text-main",children:"Circuit Breakers"}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(a.default,{size:"sm",variant:"ghost",icon:"refresh",onClick:s,children:"Refresh"}),e.length>0&&(0,n.jsx)(a.default,{size:"sm",variant:"danger",icon:"bolt",onClick:d,children:"Reset all"})]})]}),0===e.length?(0,n.jsx)(l.default,{icon:"bolt",title:"No opened circuit breakers",description:"Breakers trip when a provider repeatedly fails and recover automatically after cooldown. Opened breakers will appear here so you can inspect or force-close them."}):(0,n.jsx)("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",children:e.map(e=>{var t;let s=o[e.state]||o.closed;return(0,n.jsxs)("div",{className:"rounded-panel border border-border-subtle bg-panel p-3",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"truncate font-mono text-xs font-semibold text-text-main",children:String((t=e.provider)||"").split(":")[0]||t}),(0,n.jsx)("div",{className:"truncate text-[11px] text-text-subtle",children:e.provider})]}),(0,n.jsx)(i.default,{variant:s.variant,dot:!0,size:"sm",children:s.label})]}),(0,n.jsxs)("div",{className:"mt-2 flex items-center justify-between text-xs text-text-muted",children:[(0,n.jsxs)("span",{children:["Failures: ",(0,n.jsx)("span",{className:"font-mono",children:e.failures})]}),"open"===e.state&&(0,n.jsxs)("span",{children:["Cooldown: ",(0,n.jsx)("span",{className:"font-mono",children:function(e){if(null==e)return"—";let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let s=Math.floor(t/60);return`${s}m ${t%60}s`}(e.cooldownRemainingMs)})]})]}),(0,n.jsx)(a.default,{size:"sm",variant:"secondary",icon:"replay",className:"mt-3 w-full",onClick:()=>c(e.provider),children:"Close breaker"})]},e.provider)})})]})}},54642:e=>{var t;"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="//"),(t={}).endianness=function(){return"LE"},t.hostname=function(){return"u">typeof location?location.hostname:""},t.loadavg=function(){return[]},t.uptime=function(){return 0},t.freemem=function(){return Number.MAX_VALUE},t.totalmem=function(){return Number.MAX_VALUE},t.cpus=function(){return[]},t.type=function(){return"Browser"},t.release=function(){return"u">typeof navigator?navigator.appVersion:""},t.networkInterfaces=t.getNetworkInterfaces=function(){return{}},t.arch=function(){return"javascript"},t.platform=function(){return"browser"},t.tmpdir=t.tmpDir=function(){return"/tmp"},t.EOL="\n",t.homedir=function(){return"/"},e.exports=t},54960:(e,t,s)=>{"use strict";s.d(t,{default:()=>a});var n=s(95155),r=s(31474);function a({title:e,description:t,icon:s,iconNode:i,actions:l,breadcrumbs:o,className:c}){return(0,n.jsxs)("div",{className:(0,r.cn)("mb-6",c),children:[o?.length>0&&(0,n.jsx)("nav",{className:"mb-2 flex items-center gap-1.5 text-xs text-text-muted",children:o.map((e,t)=>(0,n.jsxs)("span",{className:"flex items-center gap-1.5",children:[t>0&&(0,n.jsx)("span",{className:"material-symbols-outlined text-[12px] opacity-60",children:"chevron_right"}),e.href?(0,n.jsx)("a",{href:e.href,className:"transition-colors hover:text-primary",children:e.label}):(0,n.jsx)("span",{className:"font-medium text-text-main",children:e.label})]},t))}),(0,n.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[(0,n.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[i?(0,n.jsx)("div",{className:"mt-0.5 shrink-0",children:i}):s&&(0,n.jsx)("div",{className:"mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-brand bg-primary/10 text-primary ring-1 ring-primary/15",children:(0,n.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:s})}),(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("h1",{className:"truncate text-xl font-semibold tracking-tight text-text-main",children:e}),t&&(0,n.jsx)("p",{className:"mt-0.5 text-sm text-text-muted",children:t})]})]}),l&&(0,n.jsx)("div",{className:"flex shrink-0 items-center gap-2",children:l})]})]})}},56061:(e,t,s)=>{"use strict";s.d(t,{default:()=>o});var n=s(95155),r=s(31474);let a={default:"bg-surface-2 text-text-muted ring-1 ring-border-subtle",primary:"bg-primary/12 text-primary ring-1 ring-primary/20",success:"bg-success/12 text-success ring-1 ring-success/20",warning:"bg-warning/12 text-warning ring-1 ring-warning/20",error:"bg-danger/12 text-danger ring-1 ring-danger/20",info:"bg-info/12 text-info ring-1 ring-info/20",cyan:"bg-cyan/12 text-cyan ring-1 ring-cyan/20"},i={default:"bg-text-subtle",primary:"bg-primary",success:"bg-success",warning:"bg-warning",error:"bg-danger",info:"bg-info",cyan:"bg-cyan"},l={sm:"px-2 py-0.5 text-xs",md:"px-2.5 py-1 text-xs",lg:"px-3 py-1.5 text-sm"};function o({children:e,variant:t="default",size:s="md",dot:c=!1,icon:d,className:u}){return(0,n.jsxs)("span",{className:(0,r.cn)("inline-flex items-center gap-1.5 rounded-full font-semibold leading-none",a[t],l[s],u),children:[c&&(0,n.jsx)("span",{className:(0,r.cn)("size-1.5 rounded-full",i[t])}),d&&(0,n.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:d}),e]})}},88105:(e,t,s)=>{"use strict";s.d(t,{Q2:()=>w,DI:()=>b,fg:()=>x,MA:()=>k,IS:()=>c,nJ:()=>d,rj:()=>h,zN:()=>m,JH:()=>f,s9:()=>u,wb:()=>T,br:()=>p,wG:()=>C,zt:()=>S,o5:()=>M,gb:()=>v,gC:()=>j,Ox:()=>y,U_:()=>N,mq:()=>g,rs:()=>_});var n=s(69497);let r="⚠️ Risk Notice: This provider uses a subscription/OAuth session not officially licensed for proxy/router use. Account may be restricted or banned. Use at your own risk.";Object.fromEntries(n.A.filter(e=>e.display).map(e=>{let t;return[e.id,"RISK_NOTICE"===(t=e.display).deprecationNotice?{...t,deprecationNotice:r}:t]}));let a=["serviceKinds","ttsConfig","sttConfig","embeddingConfig","imageConfig","imageToTextConfig","videoConfig","musicConfig","searchViaChat","searchConfig","fetchConfig","modelsFetcher","mediaPriority","hiddenKinds"],i={toolUse:!0,fileAccess:!0,streaming:!0,multiTurn:!0},l={webCookie:{toolUse:!1,fileAccess:!1,streaming:!0,multiTurn:!0}},o=e=>Object.fromEntries(n.A.filter(t=>t.category===e).map(e=>[e.id,function(e){let t={};for(let s of(e.media&&Object.assign(t,e.media),a))void 0!==e[s]&&(t[s]=e[s]);let s={...e.display||{}};return"RISK_NOTICE"===s.deprecationNotice&&(s.deprecationNotice=r),{...s,id:e.id,alias:e.uiAlias||e.alias,...e.hidden?{hidden:!0}:{},...t,...void 0!==e.priority?{priority:e.priority}:{},...e.hasFree?{hasFree:!0}:{},...e.thinkingConfig?{thinkingConfig:e.thinkingConfig}:{},...e.regions?{regions:e.regions,defaultRegion:e.defaultRegion}:{},...e.hasProviderSpecificData?{hasProviderSpecificData:!0}:{},...e.noAuth?{noAuth:!0}:{},...e.passthroughModels?{passthroughModels:!0}:{},...e.hasOAuth?{hasOAuth:!0}:{},...e.authModes?{authModes:e.authModes}:"freeTier"===e.category||"apikey"===e.category?{authModes:["apikey"]}:{},...e.authType?{authType:e.authType}:{},...e.authHint?{authHint:e.authHint}:{},...e.comingSoon?{comingSoon:!0}:{},capabilities:function(e){if(e.capabilities&&"object"==typeof e.capabilities)return{...i,...e.capabilities};let t=l[e.category];return t?{...t}:{...i}}(e)}}(e)])),c=o("free"),d=o("freeTier"),u={extended:{options:["auto","on","off"],defaultMode:"auto",defaultBudgetTokens:1e4},effort:{options:["auto","none","low","medium","high"],defaultMode:"auto"}},m=o("oauth"),x=o("apikey"),p=o("webCookie"),h=[{id:"embedding",label:"Embedding",icon:"data_array",endpoint:{method:"POST",path:"/v1/embeddings"}},{id:"image",label:"Text to Image",icon:"brush",endpoint:{method:"POST",path:"/v1/images/generations"}},{id:"imageToText",label:"Image to Text",icon:"image_search",endpoint:{method:"POST",path:"/v1/images/understanding"}},{id:"tts",label:"Text To Speech",icon:"record_voice_over",endpoint:{method:"POST",path:"/v1/audio/speech"}},{id:"stt",label:"Speech To Text",icon:"mic",endpoint:{method:"POST",path:"/v1/audio/transcriptions"}},{id:"webSearch",label:"Web Search",icon:"travel_explore",endpoint:{method:"POST",path:"/v1/search"}},{id:"webFetch",label:"Web Fetch",icon:"language",endpoint:{method:"POST",path:"/v1/web/fetch"}},{id:"video",label:"Video",icon:"movie",endpoint:{method:"POST",path:"/v1/video/generations"}},{id:"music",label:"Music",icon:"music_note",endpoint:{method:"POST",path:"/v1/audio/music"}}],f="openai-compatible-",b="anthropic-compatible-";function g(e){return"string"==typeof e&&e.startsWith(f)}function v(e){return"string"==typeof e&&e.startsWith(b)}function j(e){return"string"==typeof e&&e.startsWith("custom-embedding-")}function y(e){return"string"==typeof e&&e.startsWith("custom-stt-")}function N(e){return"string"==typeof e&&e.startsWith("custom-tts-")}let w={...c,...d,...m,...x,...p},k={oauth:{id:"oauth"},apikey:{id:"apikey"},cookie:{id:"cookie"}};function S(e){for(let t of Object.values(w))if(t.alias===e||t.id===e)return t;return null}function _(e){let t=S(e);return t?.id||e}function C(e){let t=w[e];return t?.alias||e}function M(e){return Object.values(w).filter(t=>!(!(t.serviceKinds??["llm"]).includes(e)||t.hidden||t.hiddenKinds?.includes(e))).sort((e,t)=>(e.priority??e.mediaPriority??999)-(t.priority??t.mediaPriority??999))}Object.values(w).reduce((e,t)=>(e[t.alias]=t.id,e),{}),Object.values(w).reduce((e,t)=>(e[t.id]=t.alias,e),{});let T=n.A.filter(e=>e.features?.usage).map(e=>e.id);n.A.filter(e=>e.features?.usageApikey).map(e=>e.id)},92542:(e,t,s)=>{"use strict";s.d(t,{default:()=>l});var n=s(95155),r=s(31474);let a={primary:"bg-primary hover:bg-primary-hover text-white shadow-[0_0_0_1px_rgba(255,255,255,0.08)_inset,0_10px_30px_-18px_rgba(139,92,246,0.75)] disabled:bg-surface-3 disabled:text-text-muted",secondary:"bg-surface-2 hover:bg-surface-3 text-text-main border border-border disabled:opacity-50",outline:"border border-border text-text-main hover:bg-surface-2 hover:border-primary/45",ghost:"text-text-muted hover:bg-surface-2 hover:text-text-main",danger:"bg-danger hover:brightness-110 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted",success:"bg-success hover:brightness-110 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted"},i={sm:"h-7 px-3 text-xs rounded-brand",md:"h-9 px-4 text-sm rounded-brand",lg:"h-10 px-5 text-sm rounded-brand"};function l({children:e,variant:t="primary",size:s="md",icon:o,iconRight:c,disabled:d=!1,loading:u=!1,fullWidth:m=!1,className:x,...p}){return(0,n.jsxs)("button",{className:(0,r.cn)("inline-flex items-center justify-center gap-2 font-semibold transition-all duration-150 ease-out cursor-pointer","active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed disabled:active:scale-100","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/35 focus-visible:ring-offset-2 focus-visible:ring-offset-bg",a[t],i[s],m&&"w-full",x),disabled:d||u,...p,children:[u?(0,n.jsx)("span",{className:"material-symbols-outlined animate-spin text-[16px]",children:"progress_activity"}):o?(0,n.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:o}):null,e,c&&!u&&(0,n.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:c})]})}},99312:(e,t,s)=>{"use strict";s.d(t,{default:()=>i});var n=s(95155),r=s(31474),a=s(92542);function i({icon:e="inbox",title:t="No items found",description:s="There's nothing here yet.",action:l,actionText:o,onAction:c,className:d}){return(0,n.jsxs)("div",{className:(0,r.cn)("flex flex-col items-center justify-center rounded-panel border border-dashed border-border p-12 text-center",d),children:[(0,n.jsx)("div",{className:"mb-4 flex size-12 items-center justify-center rounded-full bg-surface-2 text-text-muted ring-1 ring-border-subtle",children:(0,n.jsx)("span",{className:"material-symbols-outlined text-[24px]",children:e})}),(0,n.jsx)("h3",{className:"mb-1.5 text-sm font-semibold text-text-main",children:t}),(0,n.jsx)("p",{className:"mb-6 max-w-sm text-xs text-text-muted",children:s}),l||o&&c&&(0,n.jsx)(a.default,{variant:"outline",size:"sm",onClick:c,children:o})]})}}},e=>{e.O(0,[9497,8441,3794,7358],()=>e(e.s=21316)),_N_E=e.O()}]);
|