@jheavenknows/bluerouter 1.0.43 → 1.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ollama-nodes/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ollama-nodes/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/virtual-combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/virtual-combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/virtual-combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/!KGRhc2hib2FyZCk/dashboard/ollama-nodes/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/!KGRhc2hib2FyZCk/dashboard/ollama-nodes.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/ollama-nodes.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.html +2 -2
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard/virtual-combos.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/virtual-combos.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +3 -3
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/7153.js +1 -1
- package/app/.next-cli-build/server/chunks/9526.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/{1321-7a03e1e70a334988.js → 1321-bd73643b071dc334.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/ollama-nodes/{page-a469e2c0e48830b3.js → page-318f46d755eefa4c.js} +1 -1
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- /package/app/.next-cli-build/static/{Xbo_AIKYOGEGqR8MyK-RI → fXCPIllYK5YTILrwmgKb_}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{Xbo_AIKYOGEGqR8MyK-RI → fXCPIllYK5YTILrwmgKb_}/_ssgManifest.js +0 -0
- /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-1.0.36-to-1.0.38-1.0.38-20260526-200007 → upgrade-1.0.43-to-1.0.44-1.0.44-20260526-215241}/data.sqlite +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1088],{72546:(e,a,l)=>{Promise.resolve().then(l.bind(l,99296))},99296:(e,a,l)=>{"use strict";l.r(a),l.d(a,{default:()=>y});var t=l(95155),r=l(12115),s=l(35497),d=l(65921);let n={"qwen3:4b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:0,safetyMarginMb:512},"qwen3:8b":{minRamFreeMb:6144,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"qwen3:14b":{minRamFreeMb:8192,minVramFreeMb:1e4,loadedRamFreeMb:2048,loadedVramFreeMb:1024,safetyMarginMb:1024},"qwen3:32b":{minRamFreeMb:4096,minVramFreeMb:16e3,loadedRamFreeMb:2048,loadedVramFreeMb:2048,safetyMarginMb:2048},"bge-m3:latest":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:512,loadedVramFreeMb:0,safetyMarginMb:512},"deepseek-coder:6.7b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"gemma4:e4b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"gemma:7b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"glm-4.7-flash:latest":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024}},o=["minRamFreeMb","minVramFreeMb","loadedRamFreeMb","loadedVramFreeMb","safetyMarginMb"],i={minRamFreeMb:"Wake RAM MB",minVramFreeMb:"Wake VRAM MB",loadedRamFreeMb:"Loaded RAM MB",loadedVramFreeMb:"Loaded VRAM MB",safetyMarginMb:"Safety MB"},m={model:"",minRamFreeMb:"4096",minVramFreeMb:"0",loadedRamFreeMb:"1024",loadedVramFreeMb:"0",safetyMarginMb:"1024"},c={model:"",overrideEnabled:!1,minRamFreeMb:"",minVramFreeMb:"",loadedRamFreeMb:"",loadedVramFreeMb:"",safetyMarginMb:""};function x(e){return null!=e&&""!==String(e).trim()}function u(e){return x(e)?String(e):""}function h(e={},{overrideRows:a=!1}={}){return Object.entries(e||{}).map(([e,l])=>({model:e,overrideEnabled:!a||l?.enabled!==!1,minRamFreeMb:u(l?.minRamFreeMb),minVramFreeMb:u(l?.minVramFreeMb),loadedRamFreeMb:u(l?.loadedRamFreeMb),loadedVramFreeMb:u(l?.loadedVramFreeMb),safetyMarginMb:u(l?.safetyMarginMb)}))}function b(){return{name:"",host:"",sshUser:"root",sshPort:22,useSudo:!1,agentPort:19999,agentToken:"",ollamaPorts:"11434",refreshIntervalMs:15e3,ufwAllowFrom:"",enabled:!0,useGlobalModelMemory:!0,notes:""}}function p(e){if(!e)return"Never";let a=new Date(e);return Number.isNaN(a.getTime())?"Never":a.toLocaleString()}function f(e){let a=Number(e||0);return Number.isFinite(a)?a>=1024?`${(a/1024).toFixed(1)} GB`:`${Math.round(a)} MB`:"-"}function g(e){let a=new Set,l=e?.lastStatus||{};for(let e of l.instances||[])for(let l of e.models||[])a.add(l);for(let e of l.ollama?.models||[])a.add(e);return[...a].sort()}function v(e=[],a=[],l=[]){let t=new Map;for(let a of e){let e=String(a.model||"").trim();e&&t.set(e,{...c,model:e,overrideEnabled:!1})}for(let e of l)t.has(e)||t.set(e,{...c,model:e,overrideEnabled:!1});for(let e of a){let a=String(e.model||"").trim();a&&t.set(a,{...c,...e,model:a,overrideEnabled:!1!==e.overrideEnabled})}return[...t.values()].sort((e,a)=>String(e.model).localeCompare(String(a.model)))}function j({children:e,variant:a="muted"}){return(0,t.jsx)("div",{className:`mt-1 truncate text-[10px] leading-4 ${"override"===a?"text-blue-600":"warning"===a?"text-amber-600":"text-text-muted"}`,children:e})}function M({value:e,onChange:a,disabled:l=!1,globalValue:r,globalEnabled:s=!0}){let d=x(e),n=x(r)?r:"none";return(0,t.jsxs)("div",{className:"min-w-[130px]",children:[(0,t.jsx)("input",{value:e??"",disabled:l,placeholder:s&&x(r)?String(r):"0",onChange:e=>a(e.target.value),className:`w-full rounded-md border border-border px-2 py-1.5 text-xs outline-none focus:border-primary ${l?"bg-surface-2 text-text-muted":"bg-background text-text-main"}`}),s?(0,t.jsxs)(j,{variant:d?"override":"muted",children:["Global: ",n,d?" \xb7 override":" \xb7 using global"]}):(0,t.jsx)(j,{variant:"warning",children:"Global disabled"})]})}function N({row:e,globalRule:a,useGlobal:l}){if(e.overrideEnabled){let a=o.filter(a=>x(e[a])).length;return(0,t.jsxs)(s.Ex,{variant:"warning",children:["override ",a,"/5"]})}return l&&a?(0,t.jsx)(s.Ex,{variant:"success",children:"global"}):l?(0,t.jsx)(s.Ex,{variant:"error",children:"no rule"}):(0,t.jsx)(s.Ex,{variant:"default",children:"global off"})}function y(){let e=(0,d.i)(),[a,l]=(0,r.useState)([]),[u,y]=(0,r.useState)(h(n)),[w,S]=(0,r.useState)(null),[F,k]=(0,r.useState)(!0),[C,R]=(0,r.useState)("nodes"),[E,O]=(0,r.useState)(!1),[$,A]=(0,r.useState)(!1),[P,V]=(0,r.useState)(null),[G,T]=(0,r.useState)(null),[I,q]=(0,r.useState)(b()),[U,D]=(0,r.useState)([]),[L,B]=(0,r.useState)(""),[z,H]=(0,r.useState)(""),[_,W]=(0,r.useState)(!1),[J,Z]=(0,r.useState)(null),[Q,K]=(0,r.useState)(""),[X,Y]=(0,r.useState)(null),[ee,ea]=(0,r.useState)(!1),el=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/ollama-model-memory",{cache:"no-store"}),a=await e.json();e.ok&&(y(h(a.requirements||a.modelMemoryRequirements||n)),S(a.updatedAt||null))}catch{e.error("Failed to load global model memory map")}},[e]),et=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/ollama-nodes",{cache:"no-store"}),a=await e.json();e.ok&&l(a.nodes||[])}catch{e.error("Failed to load Ollama nodes")}finally{k(!1)}},[e]),er=(0,r.useCallback)(async(a,l=!1)=>{Z(a);try{let t=await fetch(`/api/ollama-nodes/${a}/status`,{method:"POST"}),r=await t.json();t.ok||l||e.error(r.error||"Refresh failed"),await et(),t.ok&&!l&&e.success("Status refreshed")}catch{l||e.error("Refresh failed")}finally{Z(null)}},[et,e]);(0,r.useEffect)(()=>{el(),et()},[el,et]),(0,r.useEffect)(()=>{let e=setInterval(()=>{let e=Date.now();a.forEach(a=>{if(!a.enabled)return;let l=a.lastStatusAt?new Date(a.lastStatusAt).getTime():0,t=Math.max(5e3,Number(a.refreshIntervalMs||15e3));(!l||e-l>=t)&&er(a.id,!0)})},5e3);return()=>clearInterval(e)},[a,er]);let es=(0,r.useMemo)(()=>a.filter(e=>e.lastStatus?.ok&&!e.lastError).length,[a]),ed=(0,r.useMemo)(()=>v(u,U,P?g(P):[]),[P,u,U]),en=()=>{V(null),q(b()),D(v(u,[],[])),O(!0)},eo=async()=>{if(!I.host.trim())return void e.warning("Host/IP is required");let a=function(e=[]){let a={};for(let l of e){let e=String(l.model||"").trim();if(!e||!0!==l.overrideEnabled)continue;let t={enabled:!0};for(let e of o)x(l[e])&&(t[e]=Math.max(0,Number(l[e]||0)));o.some(e=>Object.prototype.hasOwnProperty.call(t,e))&&(a[e]=t)}return a}(ed);if(!1===I.useGlobalModelMemory&&!Object.keys(a).length)return void e.warning("Global map is disabled for this node. Enable at least one node override rule.");W(!0);try{let l={...I,modelMemoryRequirements:a},t=await fetch(P?`/api/ollama-nodes/${P.id}`:"/api/ollama-nodes",{method:P?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),r=await t.json();if(!t.ok)throw Error(r.error||"Save failed");O(!1),await et(),e.success(P?"Ollama node updated":"Ollama node added")}catch(a){e.error(a.message||"Save failed")}finally{W(!1)}},ei=async()=>{if(G){Z(G.id),K("Installing...\n");try{let a=await fetch(`/api/ollama-nodes/${G.id}/install`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sshPassword:L,sudoPassword:z,ufwAllowFrom:G.ufwAllowFrom})}),l=await a.json(),t=l.result?[l.result.stdout,l.result.stderr].filter(Boolean).join("\n"):l.error||"";if(K(t),!a.ok)throw Error(l.error||"Install failed");e.success("Agent installed"),await er(G.id,!0)}catch(a){e.error(a.message||"Install failed")}finally{Z(null)}}},em=(e,a,l)=>{D(t=>ed.map((t,r)=>r===e?{...t,[a]:l}:t))},ec=async()=>{let a=P;if(a?.id){await er(a.id,!0);let e=await fetch("/api/ollama-nodes",{cache:"no-store"}).then(e=>e.json()).catch(()=>null);(a=e?.nodes?.find(e=>e.id===a.id)||a)&&V(a)}let l=g(a);if(!l.length)return void e.warning("No detected models found on this node yet. Refresh status first.");let t=new Set(ed.map(e=>String(e.model||"").trim()).filter(Boolean)),r=l.filter(e=>!t.has(e)).map(e=>({...c,model:e,overrideEnabled:!1}));r.length?(D(e=>[...ed,...r]),e.success(`Added ${r.length} detected model row(s). Toggle Override ON to customize them.`)):e.success("All detected models are already visible in this node table")},ex=(e,a,l)=>{y(t=>t.map((t,r)=>r===e?{...t,[a]:l}:t))},eu=async()=>{ea(!0);try{let a=function(e=[]){let a={};for(let l of e){let e=String(l.model||"").trim();if(e)for(let t of(a[e]={},o))a[e][t]=Math.max(0,Number(l[t]||0))}return a}(u),l=await fetch("/api/ollama-model-memory",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({requirements:a})}),t=await l.json();if(!l.ok)throw Error(t.error||"Save global map failed");S(t.updatedAt||new Date().toISOString()),e.success("Global model memory map saved"),await et()}catch(a){e.error(a.message||"Save global map failed")}finally{ea(!1)}};return F?(0,t.jsx)(s.Qv,{}):(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main",children:"Ollama Nodes"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Remote install and monitor LAN Ollama hardware agents for hardware-aware routing."})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(s.Ex,{children:["Total: ",a.length]}),(0,t.jsxs)(s.Ex,{variant:"success",children:["Online: ",es]}),(0,t.jsx)(s.$n,{icon:"add",onClick:en,children:"Add Ollama Node"})]})]}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-surface-1 p-1",children:[(0,t.jsx)("button",{type:"button",onClick:()=>R("nodes"),className:`rounded-xl px-4 py-2 text-sm ${"nodes"===C?"bg-primary text-white":"text-text-muted hover:bg-surface-2"}`,children:"Nodes"}),(0,t.jsx)("button",{type:"button",onClick:()=>R("global"),className:`rounded-xl px-4 py-2 text-sm ${"global"===C?"bg-primary text-white":"text-text-muted hover:bg-surface-2"}`,children:"Global Model Memory Map"})]}),"global"===C?(0,t.jsxs)(s.Zp,{className:"p-5",children:[(0,t.jsxs)("div",{className:"mb-4 flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Global Model Memory Map"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Default RAM/VRAM rules shared by all Ollama nodes. Node overrides still win when configured."}),(0,t.jsxs)("p",{className:"text-xs text-text-muted",children:["Patterns with * are supported, for example ",(0,t.jsx)("span",{className:"font-mono",children:"gemma*"})," or ",(0,t.jsx)("span",{className:"font-mono",children:"bge-m3:*"}),". Last saved: ",p(w)]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{variant:"secondary",icon:"add",onClick:()=>((e="")=>{y(a=>[...a,{...m,model:e}])})(),children:"Add Rule"}),(0,t.jsx)(s.$n,{variant:"secondary",icon:"download",onClick:()=>{let l=function(e=[]){let a=[],l=new Set;for(let t of e)for(let e of g(t))a.push(e),l.add(e);return{raw:a,unique:[...l].sort()}}(a);if(!l.unique.length)return void e.warning("No detected models found yet. Refresh one or more nodes first.");let t=new Set(u.map(e=>String(e.model||"").trim()).filter(Boolean)),r=l.unique.filter(e=>!t.has(e)).map(e=>({...m,model:e}));r.length?(y(e=>[...e,...r]),e.success(`Detected ${l.raw.length} entries, ${l.unique.length} unique. Added ${r.length}, skipped ${l.unique.length-r.length}.`)):e.success(`Detected ${l.raw.length} entries, ${l.unique.length} unique. All already exist in the global map.`)},children:"Import Detected"}),(0,t.jsx)(s.$n,{variant:"secondary",icon:"auto_fix_high",onClick:()=>{y(h(n)),e.success("Loaded default model memory presets")},children:"Presets"}),(0,t.jsx)(s.$n,{loading:ee,onClick:eu,children:ee?"Saving...":"Save Global Map"})]})]}),(0,t.jsx)("div",{className:"overflow-x-auto rounded-xl border border-border",children:(0,t.jsxs)("table",{className:"w-full min-w-[980px] text-left text-sm",children:[(0,t.jsx)("thead",{className:"bg-surface-2 text-xs uppercase text-text-muted",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-3 py-2",children:"Model / Pattern"}),o.map(e=>(0,t.jsx)("th",{className:"px-3 py-2",children:i[e]},e)),(0,t.jsx)("th",{className:"px-3 py-2 text-right",children:"Action"})]})}),(0,t.jsx)("tbody",{children:u.map((e,a)=>(0,t.jsxs)("tr",{className:"border-t border-border",children:[(0,t.jsx)("td",{className:"px-3 py-2",children:(0,t.jsx)("input",{value:e.model,onChange:e=>ex(a,"model",e.target.value),placeholder:"qwen3:8b or gemma*",className:"w-full rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary"})}),o.map(l=>(0,t.jsx)("td",{className:"px-3 py-2",children:(0,t.jsx)("input",{value:e[l]??"",onChange:e=>ex(a,l,e.target.value),className:"w-32 rounded-md border border-border bg-background px-2 py-1.5 text-xs outline-none focus:border-primary"})},l)),(0,t.jsx)("td",{className:"px-3 py-2 text-right",children:(0,t.jsx)("button",{type:"button",onClick:()=>{y(e=>e.filter((e,l)=>l!==a))},className:"rounded-md px-2 py-1 text-red-500 hover:bg-red-500/10",title:"Remove rule",children:(0,t.jsx)("span",{className:"material-icons text-base",children:"delete"})})})]},`${e.model}-${a}`))})]})}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3 md:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Wake:"})," sleeping model needs Wake RAM/VRAM + Safety."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Loaded:"})," loaded model only needs smaller Loaded RAM/VRAM + Safety overhead."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override:"})," node-specific enabled rows have priority over global rules."]})]})]}):0===a.length?(0,t.jsxs)(s.Zp,{className:"p-8 text-center",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"No Ollama nodes yet"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Add a LAN Ollama machine, then install the hardware status agent from this dashboard."}),(0,t.jsx)(s.$n,{className:"mt-4",icon:"add",onClick:en,children:"Add Ollama Node"})]}):(0,t.jsx)("div",{className:"grid gap-4",children:a.map(a=>{let l=a.lastStatus||{},r=a.lastEvaluation||{},d=l.hardware?.gpus||[],n=l.hardware?.ram||{};return(0,t.jsxs)(s.Zp,{className:"p-5",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:a.name}),(0,t.jsx)(s.Ex,{variant:a.lastError?"error":a.lastStatus?.ok?"success":"default",children:a.lastError?"error":l.ok?"online":"unknown"}),r.hasBlockedSleepingModels?(0,t.jsx)(s.Ex,{variant:"error",children:"blocked sleeping models"}):null,(0,t.jsx)(s.Ex,{variant:a.enabled?"success":"default",children:a.enabled?"enabled":"disabled"}),(0,t.jsx)(s.Ex,{variant:!1===a.useGlobalModelMemory?"warning":"success",children:!1===a.useGlobalModelMemory?"global off":"global on"})]}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-text-muted",children:[a.host,":",a.agentPort," \xb7 Ollama ports ",(a.ollamaPorts||[]).join(", ")," \xb7 Refresh ",a.refreshIntervalMs,"ms"]}),(0,t.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Last status: ",p(a.lastStatusAt),a.lastError?` \xb7 ${a.lastError}`:""]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"refresh",onClick:()=>er(a.id),disabled:J===a.id,children:J===a.id?"Working...":"Refresh"}),(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"terminal",onClick:()=>{T(a),B(""),H(""),K(""),A(!0)},children:"Install Agent"}),(0,t.jsx)(s.$n,{size:"sm",variant:"ghost",icon:"edit",onClick:()=>{V(a),q({...b(),...a,ollamaPorts:(a.ollamaPorts||[11434]).join(","),useGlobalModelMemory:!1!==a.useGlobalModelMemory}),D(v(u,h(a.modelMemoryRequirements||{},{overrideRows:!0}),g(a))),O(!0)},children:"Edit"}),(0,t.jsx)(s.$n,{size:"sm",variant:"ghost",icon:"delete",onClick:()=>{Y({title:"Delete Ollama Node",message:`Delete node "${a.name}"?`,onConfirm:async()=>{Y(null),(await fetch(`/api/ollama-nodes/${a.id}`,{method:"DELETE"})).ok?(await et(),e.success("Node deleted")):e.error("Delete failed")}})},children:"Delete"})]})]}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"RAM"}),(0,t.jsxs)("div",{className:"mt-1 text-xl font-semibold text-text-main",children:[f(n.availableMb)," free"]}),(0,t.jsxs)("div",{className:"text-sm text-text-muted",children:["Total ",f(n.totalMb)," \xb7 Used ",n.usedPercent??"-","%"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"GPU"}),d.length?d.map((e,a)=>(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 text-sm",children:[(0,t.jsx)("span",{className:"font-medium text-text-main",children:e.name}),(0,t.jsxs)(s.Ex,{children:["VRAM ",f(e.vramFreeMb)," / ",f(e.vramTotalMb)," free"]}),(0,t.jsxs)(s.Ex,{children:["GPU ",e.gpuUsagePercent,"%"]}),(0,t.jsxs)(s.Ex,{variant:Number(e.temperatureC)>=80?"error":"success",children:[e.temperatureC,"\xb0C"]})]},`${e.name}-${a}`)):(0,t.jsx)("div",{className:"mt-2 text-sm text-text-muted",children:"No NVIDIA GPU detected"})]})]}),(0,t.jsx)("div",{className:"mt-4 space-y-3",children:(r.instances||[]).map(e=>(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)("h3",{className:"font-semibold text-text-main",children:["Ollama :",e.port||"default"]}),(0,t.jsx)(s.Ex,{variant:e.alive?"success":"error",children:e.alive?"alive":"down"}),(0,t.jsx)("span",{className:"text-xs text-text-muted",children:e.baseUrl})]}),e.modelReadiness?.length?(0,t.jsx)("div",{className:"mt-3 grid gap-2 md:grid-cols-2 xl:grid-cols-3",children:e.modelReadiness.map(e=>{var a;return(0,t.jsxs)("div",{className:"rounded-lg bg-surface-2 p-3 text-sm",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("span",{className:"font-mono text-xs text-text-main",children:e.model}),(0,t.jsx)(s.Ex,{variant:e.loaded?"success":"default",children:e.loaded?"loaded":"sleeping"}),(0,t.jsx)(s.Ex,{variant:(a=e.status)?a.includes("insufficient")||a.includes("low")?"error":a.includes("unconfigured")?"warning":"success":"default",children:e.status}),(0,t.jsx)(s.Ex,{variant:e.ruleSource?.includes("node")?"warning":"global"===e.ruleSource?"success":"default",children:e.ruleSource||"none"})]}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:e.reason})]},e.model)})}):(0,t.jsx)("div",{className:"mt-3 text-sm text-text-muted",children:"No models reported for this instance."})]},e.id||e.port||e.baseUrl))})]},a.id)})}),(0,t.jsx)(s.aF,{isOpen:E,onClose:()=>O(!1),title:P?"Edit Ollama Node":"Add Ollama Node",size:"full",className:"max-w-[1180px]",footer:(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(s.$n,{onClick:eo,loading:_,children:_?"Saving...":"Save"}),(0,t.jsx)(s.$n,{variant:"ghost",onClick:()=>O(!1),disabled:_,children:"Cancel"})]}),children:(0,t.jsxs)("div",{className:"max-h-[75vh] space-y-5 overflow-y-auto pr-2",children:[(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-3",children:[(0,t.jsx)(s.pd,{label:"Name",value:I.name,onChange:e=>q(a=>({...a,name:e.target.value})),placeholder:"A2 node"}),(0,t.jsx)(s.pd,{label:"Host/IP",value:I.host,onChange:e=>q(a=>({...a,host:e.target.value})),placeholder:"192.168.1.10"}),(0,t.jsx)(s.pd,{label:"SSH User",value:I.sshUser,onChange:e=>q(a=>({...a,sshUser:e.target.value})),placeholder:"root or ubuntu"}),(0,t.jsx)(s.pd,{label:"SSH Port",value:I.sshPort,onChange:e=>q(a=>({...a,sshPort:e.target.value})),placeholder:"22"}),(0,t.jsx)(s.pd,{label:"Agent Port",value:I.agentPort,onChange:e=>q(a=>({...a,agentPort:e.target.value})),placeholder:"19999"}),(0,t.jsx)(s.pd,{label:"Agent Token",value:I.agentToken,onChange:e=>q(a=>({...a,agentToken:e.target.value})),placeholder:"auto if empty"}),(0,t.jsx)(s.pd,{label:"Ollama Ports",value:I.ollamaPorts,onChange:e=>q(a=>({...a,ollamaPorts:e.target.value})),placeholder:"11434,11435"}),(0,t.jsx)(s.pd,{label:"Refresh Interval MS",value:I.refreshIntervalMs,onChange:e=>q(a=>({...a,refreshIntervalMs:e.target.value})),placeholder:"15000"}),(0,t.jsx)(s.pd,{label:"UFW Allow From",value:I.ufwAllowFrom,onChange:e=>q(a=>({...a,ufwAllowFrom:e.target.value})),placeholder:"192.168.1.0/24"})]}),(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,t.jsx)("div",{className:"rounded-xl border border-border p-4",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Use sudo"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Enable when SSH user is not root but has sudo rights."})]}),(0,t.jsx)(s.lM,{enabled:!!I.useSudo,onChange:()=>q(e=>({...e,useSudo:!e.useSudo}))})]})}),(0,t.jsx)("div",{className:"rounded-xl border border-border p-4",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Use Global Model Memory Map"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Global rules are fallback values. Per-model override toggles below can still override them."})]}),(0,t.jsx)(s.lM,{enabled:!1!==I.useGlobalModelMemory,onChange:()=>q(e=>({...e,useGlobalModelMemory:!1===e.useGlobalModelMemory}))})]})})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsxs)("div",{className:"mb-3 flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Per-model Node Overrides"}),(0,t.jsx)(s.Ex,{variant:"warning",children:"override per model"}),(0,t.jsx)(s.Ex,{variant:!1===I.useGlobalModelMemory?"warning":"success",children:!1===I.useGlobalModelMemory?"global disabled":"global fallback on"})]}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Toggle Override ON only for models that need node-specific values. Empty override fields inherit the global value shown under each textbox."})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"add",onClick:()=>((e="")=>{D(a=>[...ed,{...c,model:e,overrideEnabled:!0}])})(),children:"Add Override"}),P?(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"download",onClick:ec,children:"Import Detected"}):null,(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"cleaning_services",onClick:()=>{D(v(u,[],P?g(P):[])),e.success("Cleared node override rows")},children:"Clear Overrides"})]})]}),(0,t.jsx)("div",{className:"overflow-x-auto rounded-xl border border-border",children:(0,t.jsxs)("table",{className:"w-full min-w-[1120px] text-left text-sm",children:[(0,t.jsx)("thead",{className:"bg-surface-2 text-xs uppercase text-text-muted",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-3 py-2",children:"Model / Pattern"}),(0,t.jsx)("th",{className:"px-3 py-2",children:"Override"}),(0,t.jsx)("th",{className:"px-3 py-2",children:"Source"}),o.map(e=>(0,t.jsx)("th",{className:"px-3 py-2",children:i[e]},e)),(0,t.jsx)("th",{className:"px-3 py-2 text-right",children:"Action"})]})}),(0,t.jsxs)("tbody",{children:[ed.map((e,a)=>{let l=!1===I.useGlobalModelMemory?null:function(e=[],a){let l=String(a||"").trim();if(!l)return null;let t=e.find(e=>String(e.model||"")===l);if(t)return{row:t,key:t.model,matchType:"exact"};let r=l.toLowerCase(),s=e.find(e=>String(e.model||"").toLowerCase()===r);if(s)return{row:s,key:s.model,matchType:"case-insensitive"};let d=e.find(e=>{let a;return String(e.model||"").includes("*")&&(a=String(e.model||"").split("*").map(e=>e.replace(/[|\\{}()[\]^$+?.]/g,"\\$&")).join(".*"),RegExp(`^${a}$`,"i")).test(l)});return d?{row:d,key:d.model,matchType:"wildcard"}:null}(u,e.model),r=l?.row||null,d=!0!==e.overrideEnabled;return(0,t.jsxs)("tr",{className:"border-t border-border",children:[(0,t.jsxs)("td",{className:"px-3 py-2 align-top",children:[(0,t.jsx)("input",{value:e.model,onChange:e=>em(a,"model",e.target.value),placeholder:"qwen3:8b",className:"w-full rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary"}),l?.matchType==="wildcard"?(0,t.jsxs)(j,{children:["Matched global pattern: ",l.key]}):null]}),(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(s.lM,{enabled:!0===e.overrideEnabled,onChange:()=>em(a,"overrideEnabled",!0!==e.overrideEnabled)})}),(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(N,{row:e,globalRule:r,useGlobal:!1!==I.useGlobalModelMemory})}),o.map(l=>(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(M,{value:e[l]??"",disabled:d,globalValue:r?.[l],globalEnabled:!1!==I.useGlobalModelMemory,onChange:e=>em(a,l,e)})},l)),(0,t.jsx)("td",{className:"px-3 py-2 text-right align-top",children:(0,t.jsx)("button",{type:"button",onClick:()=>{D(e=>ed.filter((e,l)=>l!==a))},className:"rounded-md px-2 py-1 text-red-500 hover:bg-red-500/10",title:"Remove row",children:(0,t.jsx)("span",{className:"material-icons text-base",children:"delete"})})})]},`${e.model}-${a}`)}),0===ed.length?(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:9,className:"px-3 py-6 text-center text-sm text-text-muted",children:"No rows. Add an override or import detected models."})}):null]})]})}),(0,t.jsxs)("div",{className:"mt-3 grid gap-3 text-xs md:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override OFF:"})," model uses global rule when global fallback is enabled."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override ON:"})," filled fields override global; empty fields still inherit global."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Global OFF:"})," only enabled node override rows are used for this node."]})]})]})]})}),(0,t.jsx)(s.aF,{isOpen:$,onClose:()=>A(!1),title:`Install agent: ${G?.name||""}`,children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"rounded-xl border border-amber-300 bg-amber-50 p-3 text-sm text-amber-800",children:"Passwords are used only for this install request and are not stored. The server running BlueRouter needs ssh or sshpass installed for password-based SSH."}),(0,t.jsx)(s.pd,{label:"SSH Password",value:L,onChange:e=>B(e.target.value),type:"password",placeholder:"leave empty for SSH key"}),G?.useSudo?(0,t.jsx)(s.pd,{label:"Sudo Password",value:z,onChange:e=>H(e.target.value),type:"password",placeholder:"leave empty to reuse SSH password or passwordless sudo"}):null,(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(s.$n,{onClick:ei,disabled:J===G?.id,children:J===G?.id?"Installing...":"Install / Update Agent"}),(0,t.jsx)(s.$n,{variant:"ghost",onClick:()=>A(!1),disabled:J===G?.id,children:"Close"})]}),Q?(0,t.jsx)("pre",{className:"max-h-64 overflow-auto rounded-xl bg-surface-2 p-3 text-xs text-text-main",children:Q}):null]})}),(0,t.jsx)(s.uo,{isOpen:!!X,onClose:()=>Y(null),onConfirm:X?.onConfirm,title:X?.title||"Confirm",message:X?.message,variant:"danger"})]})}}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=72546)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1088],{72546:(e,a,l)=>{Promise.resolve().then(l.bind(l,99296))},99296:(e,a,l)=>{"use strict";l.r(a),l.d(a,{default:()=>y});var t=l(95155),r=l(12115),s=l(35497),d=l(65921);let n={"qwen3:4b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:0,safetyMarginMb:512},"qwen3:8b":{minRamFreeMb:6144,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"qwen3:14b":{minRamFreeMb:8192,minVramFreeMb:1e4,loadedRamFreeMb:2048,loadedVramFreeMb:1024,safetyMarginMb:1024},"qwen3:32b":{minRamFreeMb:4096,minVramFreeMb:16e3,loadedRamFreeMb:2048,loadedVramFreeMb:2048,safetyMarginMb:2048},"bge-m3:latest":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:512,loadedVramFreeMb:0,safetyMarginMb:512},"deepseek-coder:6.7b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"gemma4:e4b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"gemma:7b":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024},"glm-4.7-flash:latest":{minRamFreeMb:4096,minVramFreeMb:0,loadedRamFreeMb:1024,loadedVramFreeMb:512,safetyMarginMb:1024}},o=["minRamFreeMb","minVramFreeMb","loadedRamFreeMb","loadedVramFreeMb","safetyMarginMb"],i={minRamFreeMb:"Wake RAM MB",minVramFreeMb:"Wake VRAM MB",loadedRamFreeMb:"Loaded RAM MB",loadedVramFreeMb:"Loaded VRAM MB",safetyMarginMb:"Safety MB"},m={model:"",minRamFreeMb:"4096",minVramFreeMb:"0",loadedRamFreeMb:"1024",loadedVramFreeMb:"0",safetyMarginMb:"1024"},c={model:"",overrideEnabled:!1,minRamFreeMb:"",minVramFreeMb:"",loadedRamFreeMb:"",loadedVramFreeMb:"",safetyMarginMb:""};function x(e){return null!=e&&""!==String(e).trim()}function u(e){return x(e)?String(e):""}function h(e={},{overrideRows:a=!1}={}){return Object.entries(e||{}).map(([e,l])=>({model:e,overrideEnabled:!a||l?.enabled!==!1,minRamFreeMb:u(l?.minRamFreeMb),minVramFreeMb:u(l?.minVramFreeMb),loadedRamFreeMb:u(l?.loadedRamFreeMb),loadedVramFreeMb:u(l?.loadedVramFreeMb),safetyMarginMb:u(l?.safetyMarginMb)}))}function b(){return{name:"",host:"",sshUser:"root",sshPort:22,useSudo:!1,agentPort:19999,agentToken:"",ollamaPorts:"11434",refreshIntervalMs:15e3,ufwAllowFrom:"",enabled:!0,useGlobalModelMemory:!0,notes:""}}function p(e){if(!e)return"Never";let a=new Date(e);return Number.isNaN(a.getTime())?"Never":a.toLocaleString()}function f(e){let a=Number(e||0);return Number.isFinite(a)?a>=1024?`${(a/1024).toFixed(1)} GB`:`${Math.round(a)} MB`:"-"}function g(e){let a=new Set,l=e?.lastStatus||{};for(let e of l.instances||[])for(let l of e.models||[])a.add(l);for(let e of l.ollama?.models||[])a.add(e);return[...a].sort()}function v(e=[],a=[],l=[]){let t=new Map;for(let a of e){let e=String(a.model||"").trim();e&&t.set(e,{...c,model:e,overrideEnabled:!1})}for(let e of l)t.has(e)||t.set(e,{...c,model:e,overrideEnabled:!1});for(let e of a){let a=String(e.model||"").trim();a&&t.set(a,{...c,...e,model:a,overrideEnabled:!1!==e.overrideEnabled})}return[...t.values()].sort((e,a)=>String(e.model).localeCompare(String(a.model)))}function j({children:e,variant:a="muted"}){return(0,t.jsx)("div",{className:`mt-1 truncate text-[10px] leading-4 ${"override"===a?"text-blue-600":"warning"===a?"text-amber-600":"text-text-muted"}`,children:e})}function M({value:e,onChange:a,disabled:l=!1,globalValue:r,globalEnabled:s=!0}){let d=x(e),n=x(r)?r:"none";return(0,t.jsxs)("div",{className:"min-w-[130px]",children:[(0,t.jsx)("input",{value:e??"",disabled:l,placeholder:s&&x(r)?String(r):"0",onChange:e=>a(e.target.value),className:`w-full rounded-md border border-border px-2 py-1.5 text-xs outline-none focus:border-primary ${l?"bg-surface-2 text-text-muted":"bg-background text-text-main"}`}),s?(0,t.jsxs)(j,{variant:d?"override":"muted",children:["Global: ",n,d?" \xb7 override":" \xb7 using global"]}):(0,t.jsx)(j,{variant:"warning",children:"Global disabled"})]})}function N({row:e,globalRule:a,useGlobal:l}){if(e.overrideEnabled){let a=o.filter(a=>x(e[a])).length;return(0,t.jsxs)(s.Ex,{variant:"warning",children:["override ",a,"/5"]})}return l&&a?(0,t.jsx)(s.Ex,{variant:"success",children:"global"}):l?(0,t.jsx)(s.Ex,{variant:"error",children:"no rule"}):(0,t.jsx)(s.Ex,{variant:"default",children:"global off"})}function y(){let e=(0,d.i)(),[a,l]=(0,r.useState)([]),[u,y]=(0,r.useState)(h(n)),[w,S]=(0,r.useState)(null),[F,k]=(0,r.useState)(!0),[C,R]=(0,r.useState)("nodes"),[E,O]=(0,r.useState)(!1),[$,A]=(0,r.useState)(!1),[P,V]=(0,r.useState)(null),[G,T]=(0,r.useState)(null),[I,q]=(0,r.useState)(b()),[U,D]=(0,r.useState)([]),[L,B]=(0,r.useState)(""),[z,H]=(0,r.useState)(""),[_,W]=(0,r.useState)(!1),[J,Z]=(0,r.useState)(null),[Q,K]=(0,r.useState)(""),[X,Y]=(0,r.useState)(null),[ee,ea]=(0,r.useState)(!1),el=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/ollama-model-memory",{cache:"no-store"}),a=await e.json();e.ok&&(y(h(a.requirements||a.modelMemoryRequirements||n)),S(a.updatedAt||null))}catch{e.error("Failed to load global model memory map")}},[e]),et=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/ollama-nodes",{cache:"no-store"}),a=await e.json();e.ok&&l(a.nodes||[])}catch{e.error("Failed to load Ollama nodes")}finally{k(!1)}},[e]),er=(0,r.useCallback)(async(a,l=!1)=>{Z(a);try{let t=await fetch(`/api/ollama-nodes/${a}/status`,{method:"POST"}),r=await t.json();t.ok||l||e.error(r.error||"Refresh failed"),await et(),t.ok&&!l&&e.success("Status refreshed")}catch{l||e.error("Refresh failed")}finally{Z(null)}},[et,e]);(0,r.useEffect)(()=>{el(),et()},[el,et]),(0,r.useEffect)(()=>{let e=setInterval(()=>{let e=Date.now();a.forEach(a=>{if(!a.enabled)return;let l=a.lastStatusAt?new Date(a.lastStatusAt).getTime():0,t=Math.max(5e3,Number(a.refreshIntervalMs||15e3));(!l||e-l>=t)&&er(a.id,!0)})},5e3);return()=>clearInterval(e)},[a,er]);let es=(0,r.useMemo)(()=>a.filter(e=>e.lastStatus?.ok&&!e.lastError).length,[a]),ed=(0,r.useMemo)(()=>v(u,U,P?g(P):[]),[P,u,U]),en=()=>{V(null),q(b()),D(v(u,[],[])),O(!0)},eo=async()=>{if(!I.host.trim())return void e.warning("Host/IP is required");let a=function(e=[]){let a={};for(let l of e){let e=String(l.model||"").trim();if(!e||!0!==l.overrideEnabled)continue;let t={enabled:!0};for(let e of o)x(l[e])&&(t[e]=Math.max(0,Number(l[e]||0)));o.some(e=>Object.prototype.hasOwnProperty.call(t,e))&&(a[e]=t)}return a}(ed);if(!1===I.useGlobalModelMemory&&!Object.keys(a).length)return void e.warning("Global map is disabled for this node. Enable at least one node override rule.");W(!0);try{let l={...I,modelMemoryRequirements:a},t=await fetch(P?`/api/ollama-nodes/${P.id}`:"/api/ollama-nodes",{method:P?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),r=await t.json();if(!t.ok)throw Error(r.error||"Save failed");O(!1),await et(),e.success(P?"Ollama node updated":"Ollama node added")}catch(a){e.error(a.message||"Save failed")}finally{W(!1)}},ei=async()=>{if(G){Z(G.id),K("Installing...\n");try{let a=await fetch(`/api/ollama-nodes/${G.id}/install`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sshPassword:L,sudoPassword:z,ufwAllowFrom:G.ufwAllowFrom})}),l=await a.json(),t=l.result?[l.result.stdout,l.result.stderr].filter(Boolean).join("\n"):l.error||"";if(K(t),!a.ok)throw Error(l.error||"Install failed");e.success("Agent installed"),await er(G.id,!0)}catch(a){e.error(a.message||"Install failed")}finally{Z(null)}}},em=(e,a,l)=>{D(t=>ed.map((t,r)=>r===e?{...t,[a]:l}:t))},ec=async()=>{let a=P;if(a?.id){await er(a.id,!0);let e=await fetch("/api/ollama-nodes",{cache:"no-store"}).then(e=>e.json()).catch(()=>null);(a=e?.nodes?.find(e=>e.id===a.id)||a)&&V(a)}let l=g(a);if(!l.length)return void e.warning("No detected models found on this node yet. Refresh status first.");let t=new Set(ed.map(e=>String(e.model||"").trim()).filter(Boolean)),r=l.filter(e=>!t.has(e)).map(e=>({...c,model:e,overrideEnabled:!1}));r.length?(D(e=>[...ed,...r]),e.success(`Added ${r.length} detected model row(s). Toggle Override ON to customize them.`)):e.success("All detected models are already visible in this node table")},ex=(e,a,l)=>{y(t=>t.map((t,r)=>r===e?{...t,[a]:l}:t))},eu=async()=>{ea(!0);try{let a=function(e=[]){let a={};for(let l of e){let e=String(l.model||"").trim();if(e)for(let t of(a[e]={},o))a[e][t]=Math.max(0,Number(l[t]||0))}return a}(u),l=await fetch("/api/ollama-model-memory",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({requirements:a})}),t=await l.json();if(!l.ok)throw Error(t.error||"Save global map failed");S(t.updatedAt||new Date().toISOString()),e.success("Global model memory map saved"),await et()}catch(a){e.error(a.message||"Save global map failed")}finally{ea(!1)}};return F?(0,t.jsx)(s.Qv,{}):(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main",children:"Ollama Nodes"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Remote install and monitor LAN Ollama hardware agents for hardware-aware routing."})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(s.Ex,{children:["Total: ",a.length]}),(0,t.jsxs)(s.Ex,{variant:"success",children:["Online: ",es]}),(0,t.jsx)(s.$n,{icon:"add",onClick:en,children:"Add Ollama Node"})]})]}),(0,t.jsxs)("div",{className:"rounded-2xl border border-border bg-surface-1 p-1",children:[(0,t.jsx)("button",{type:"button",onClick:()=>R("nodes"),className:`rounded-xl px-4 py-2 text-sm ${"nodes"===C?"bg-primary text-white":"text-text-muted hover:bg-surface-2"}`,children:"Nodes"}),(0,t.jsx)("button",{type:"button",onClick:()=>R("global"),className:`rounded-xl px-4 py-2 text-sm ${"global"===C?"bg-primary text-white":"text-text-muted hover:bg-surface-2"}`,children:"Global Model Memory Map"})]}),"global"===C?(0,t.jsxs)(s.Zp,{className:"p-5",children:[(0,t.jsxs)("div",{className:"mb-4 flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"Global Model Memory Map"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Default RAM/VRAM rules shared by all Ollama nodes. Node overrides still win when configured."}),(0,t.jsxs)("p",{className:"text-xs text-text-muted",children:["Patterns with * are supported, for example ",(0,t.jsx)("span",{className:"font-mono",children:"gemma*"})," or ",(0,t.jsx)("span",{className:"font-mono",children:"bge-m3:*"}),". Last saved: ",p(w)]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{variant:"secondary",icon:"add",onClick:()=>((e="")=>{y(a=>[...a,{...m,model:e}])})(),children:"Add Rule"}),(0,t.jsx)(s.$n,{variant:"secondary",icon:"download",onClick:()=>{let l=function(e=[]){let a=[],l=new Set;for(let t of e)for(let e of g(t))a.push(e),l.add(e);return{raw:a,unique:[...l].sort()}}(a);if(!l.unique.length)return void e.warning("No detected models found yet. Refresh one or more nodes first.");let t=new Set(u.map(e=>String(e.model||"").trim()).filter(Boolean)),r=l.unique.filter(e=>!t.has(e)).map(e=>({...m,model:e}));r.length?(y(e=>[...e,...r]),e.success(`Detected ${l.raw.length} entries, ${l.unique.length} unique. Added ${r.length}, skipped ${l.unique.length-r.length}.`)):e.success(`Detected ${l.raw.length} entries, ${l.unique.length} unique. All already exist in the global map.`)},children:"Import Detected"}),(0,t.jsx)(s.$n,{variant:"secondary",icon:"auto_fix_high",onClick:()=>{y(h(n)),e.success("Loaded default model memory presets")},children:"Presets"}),(0,t.jsx)(s.$n,{loading:ee,onClick:eu,children:ee?"Saving...":"Save Global Map"})]})]}),(0,t.jsx)("div",{className:"overflow-x-auto rounded-xl border border-border",children:(0,t.jsxs)("table",{className:"w-full min-w-[980px] text-left text-sm",children:[(0,t.jsx)("thead",{className:"bg-surface-2 text-xs uppercase text-text-muted",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-3 py-2",children:"Model / Pattern"}),o.map(e=>(0,t.jsx)("th",{className:"px-3 py-2",children:i[e]},e)),(0,t.jsx)("th",{className:"px-3 py-2 text-right",children:"Action"})]})}),(0,t.jsx)("tbody",{children:u.map((e,a)=>(0,t.jsxs)("tr",{className:"border-t border-border",children:[(0,t.jsx)("td",{className:"px-3 py-2",children:(0,t.jsx)("input",{value:e.model,onChange:e=>ex(a,"model",e.target.value),placeholder:"qwen3:8b or gemma*",className:"w-full rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary"})}),o.map(l=>(0,t.jsx)("td",{className:"px-3 py-2",children:(0,t.jsx)("input",{value:e[l]??"",onChange:e=>ex(a,l,e.target.value),className:"w-32 rounded-md border border-border bg-background px-2 py-1.5 text-xs outline-none focus:border-primary"})},l)),(0,t.jsx)("td",{className:"px-3 py-2 text-right",children:(0,t.jsx)("button",{type:"button",onClick:()=>{y(e=>e.filter((e,l)=>l!==a))},className:"rounded-md px-2 py-1 text-red-500 hover:bg-red-500/10",title:"Remove rule",children:(0,t.jsx)("span",{className:"material-icons text-base",children:"delete"})})})]},`${e.model}-${a}`))})]})}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3 md:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Wake:"})," sleeping model needs Wake RAM/VRAM + Safety."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Loaded:"})," loaded model only needs smaller Loaded RAM/VRAM + Safety overhead."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-xs text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override:"})," node-specific enabled rows have priority over global rules."]})]})]}):0===a.length?(0,t.jsxs)(s.Zp,{className:"p-8 text-center",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:"No Ollama nodes yet"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-text-muted",children:"Add a LAN Ollama machine, then install the hardware status agent from this dashboard."}),(0,t.jsx)(s.$n,{className:"mt-4",icon:"add",onClick:en,children:"Add Ollama Node"})]}):(0,t.jsx)("div",{className:"grid gap-4",children:a.map(a=>{let l=a.lastStatus||{},r=a.lastEvaluation||{},d=l.hardware?.gpus||[],n=l.hardware?.ram||{};return(0,t.jsxs)(s.Zp,{className:"p-5",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:a.name}),(0,t.jsx)(s.Ex,{variant:a.lastError?"error":a.lastStatus?.ok?"success":"default",children:a.lastError?"error":l.ok?"online":"unknown"}),r.hasBlockedSleepingModels?(0,t.jsx)(s.Ex,{variant:"error",children:"blocked sleeping models"}):null,(0,t.jsx)(s.Ex,{variant:a.enabled?"success":"default",children:a.enabled?"enabled":"disabled"}),(0,t.jsx)(s.Ex,{variant:!1===a.useGlobalModelMemory?"warning":"success",children:!1===a.useGlobalModelMemory?"global off":"global on"})]}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-text-muted",children:[a.host,":",a.agentPort," \xb7 Ollama ports ",(a.ollamaPorts||[]).join(", ")," \xb7 Refresh ",a.refreshIntervalMs,"ms"]}),(0,t.jsxs)("p",{className:"mt-1 text-xs text-text-muted",children:["Last status: ",p(a.lastStatusAt),a.lastError?` \xb7 ${a.lastError}`:""]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"refresh",onClick:()=>er(a.id),disabled:J===a.id,children:J===a.id?"Working...":"Refresh"}),(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"terminal",onClick:()=>{T(a),B(""),H(""),K(""),A(!0)},children:"Install Agent"}),(0,t.jsx)(s.$n,{size:"sm",variant:"ghost",icon:"edit",onClick:()=>{V(a),q({...b(),...a,ollamaPorts:(a.ollamaPorts||[11434]).join(","),useGlobalModelMemory:!1!==a.useGlobalModelMemory}),D(v(u,h(a.modelMemoryRequirements||{},{overrideRows:!0}),g(a))),O(!0)},children:"Edit"}),(0,t.jsx)(s.$n,{size:"sm",variant:"ghost",icon:"delete",onClick:()=>{Y({title:"Delete Ollama Node",message:`Delete node "${a.name}"?`,onConfirm:async()=>{Y(null),(await fetch(`/api/ollama-nodes/${a.id}`,{method:"DELETE"})).ok?(await et(),e.success("Node deleted")):e.error("Delete failed")}})},children:"Delete"})]})]}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"RAM"}),(0,t.jsxs)("div",{className:"mt-1 text-xl font-semibold text-text-main",children:[f(n.availableMb)," free"]}),(0,t.jsxs)("div",{className:"text-sm text-text-muted",children:["Total ",f(n.totalMb)," \xb7 Used ",n.usedPercent??"-","%"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsx)("div",{className:"text-sm text-text-muted",children:"GPU"}),d.length?d.map((e,a)=>(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 text-sm",children:[(0,t.jsx)("span",{className:"font-medium text-text-main",children:e.name}),(0,t.jsxs)(s.Ex,{children:["VRAM ",f(e.vramFreeMb)," / ",f(e.vramTotalMb)," free"]}),(0,t.jsxs)(s.Ex,{children:["GPU ",e.gpuUsagePercent,"%"]}),(0,t.jsxs)(s.Ex,{variant:Number(e.temperatureC)>=80?"error":"success",children:[e.temperatureC,"\xb0C"]})]},`${e.name}-${a}`)):(0,t.jsx)("div",{className:"mt-2 text-sm text-text-muted",children:"No NVIDIA GPU detected"})]})]}),(0,t.jsx)("div",{className:"mt-4 space-y-3",children:(r.instances||[]).map(e=>(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)("h3",{className:"font-semibold text-text-main",children:["Ollama :",e.port||"default"]}),(0,t.jsx)(s.Ex,{variant:e.alive?"success":"error",children:e.alive?"alive":"down"}),(0,t.jsx)("span",{className:"text-xs text-text-muted",children:e.baseUrl})]}),e.modelReadiness?.length?(0,t.jsx)("div",{className:"mt-3 grid gap-2 md:grid-cols-2 xl:grid-cols-3",children:e.modelReadiness.map(e=>{var a;return(0,t.jsxs)("div",{className:"rounded-lg bg-surface-2 p-3 text-sm",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("span",{className:"font-mono text-xs text-text-main",children:e.model}),(0,t.jsx)(s.Ex,{variant:e.loaded?"success":"default",children:e.loaded?"loaded":"sleeping"}),(0,t.jsx)(s.Ex,{variant:(a=e.status)?a.includes("insufficient")||a.includes("low")?"error":a.includes("unconfigured")?"warning":"success":"default",children:e.status}),(0,t.jsx)(s.Ex,{variant:e.ruleSource?.includes("node")?"warning":"global"===e.ruleSource?"success":"default",children:e.ruleSource||"none"})]}),(0,t.jsx)("p",{className:"mt-1 text-xs text-text-muted",children:e.reason})]},e.model)})}):(0,t.jsx)("div",{className:"mt-3 text-sm text-text-muted",children:"No models reported for this instance."})]},e.id||e.port||e.baseUrl))})]},a.id)})}),(0,t.jsx)(s.aF,{isOpen:E,onClose:()=>O(!1),title:P?"Edit Ollama Node":"Add Ollama Node",size:"full",className:"max-w-[1180px]",footer:(0,t.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,t.jsx)(s.$n,{onClick:eo,loading:_,children:_?"Saving...":"Save"}),(0,t.jsx)(s.$n,{variant:"ghost",onClick:()=>O(!1),disabled:_,children:"Cancel"})]}),children:(0,t.jsxs)("div",{className:"max-h-[75vh] space-y-5 overflow-y-auto pr-2",children:[(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-3",children:[(0,t.jsx)(s.pd,{label:"Name",value:I.name,onChange:e=>q(a=>({...a,name:e.target.value})),placeholder:"A2 node"}),(0,t.jsx)(s.pd,{label:"Host/IP",value:I.host,onChange:e=>q(a=>({...a,host:e.target.value})),placeholder:"192.168.1.10"}),(0,t.jsx)(s.pd,{label:"SSH User",value:I.sshUser,onChange:e=>q(a=>({...a,sshUser:e.target.value})),placeholder:"root or ubuntu"}),(0,t.jsx)(s.pd,{label:"SSH Port",value:I.sshPort,onChange:e=>q(a=>({...a,sshPort:e.target.value})),placeholder:"22"}),(0,t.jsx)(s.pd,{label:"Agent Port",value:I.agentPort,onChange:e=>q(a=>({...a,agentPort:e.target.value})),placeholder:"19999"}),(0,t.jsx)(s.pd,{label:"Agent Token",value:I.agentToken,onChange:e=>q(a=>({...a,agentToken:e.target.value})),placeholder:"auto if empty"}),(0,t.jsx)(s.pd,{label:"Ollama Ports",value:I.ollamaPorts,onChange:e=>q(a=>({...a,ollamaPorts:e.target.value})),placeholder:"11434,11435"}),(0,t.jsx)(s.pd,{label:"Refresh Interval MS",value:I.refreshIntervalMs,onChange:e=>q(a=>({...a,refreshIntervalMs:e.target.value})),placeholder:"15000"}),(0,t.jsx)(s.pd,{label:"UFW Allow From",value:I.ufwAllowFrom,onChange:e=>q(a=>({...a,ufwAllowFrom:e.target.value})),placeholder:"192.168.1.0/24"})]}),(0,t.jsxs)("div",{className:"grid gap-3 md:grid-cols-2",children:[(0,t.jsx)("div",{className:"rounded-xl border border-border p-4",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Use sudo"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Enable when SSH user is not root but has sudo rights."})]}),(0,t.jsx)(s.lM,{checked:!!I.useSudo,onChange:()=>q(e=>({...e,useSudo:!e.useSudo}))})]})}),(0,t.jsx)("div",{className:"rounded-xl border border-border p-4",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Use Global Model Memory Map"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Global rules are fallback values. Per-model override toggles below can still override them."})]}),(0,t.jsx)(s.lM,{checked:!1!==I.useGlobalModelMemory,onChange:()=>q(e=>({...e,useGlobalModelMemory:!1===e.useGlobalModelMemory}))})]})})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-border p-4",children:[(0,t.jsxs)("div",{className:"mb-3 flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h3",{className:"font-semibold text-text-main",children:"Per-model Node Overrides"}),(0,t.jsx)(s.Ex,{variant:"warning",children:"override per model"}),(0,t.jsx)(s.Ex,{variant:!1===I.useGlobalModelMemory?"warning":"success",children:!1===I.useGlobalModelMemory?"global disabled":"global fallback on"})]}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Toggle Override ON only for models that need node-specific values. Empty override fields inherit the global value shown under each textbox."})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"add",onClick:()=>((e="")=>{D(a=>[...ed,{...c,model:e,overrideEnabled:!0}])})(),children:"Add Override"}),P?(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"download",onClick:ec,children:"Import Detected"}):null,(0,t.jsx)(s.$n,{size:"sm",variant:"secondary",icon:"cleaning_services",onClick:()=>{D(v(u,[],P?g(P):[])),e.success("Cleared node override rows")},children:"Clear Overrides"})]})]}),(0,t.jsx)("div",{className:"overflow-x-auto rounded-xl border border-border",children:(0,t.jsxs)("table",{className:"w-full min-w-[1120px] text-left text-sm",children:[(0,t.jsx)("thead",{className:"bg-surface-2 text-xs uppercase text-text-muted",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-3 py-2",children:"Model / Pattern"}),(0,t.jsx)("th",{className:"px-3 py-2",children:"Override"}),(0,t.jsx)("th",{className:"px-3 py-2",children:"Source"}),o.map(e=>(0,t.jsx)("th",{className:"px-3 py-2",children:i[e]},e)),(0,t.jsx)("th",{className:"px-3 py-2 text-right",children:"Action"})]})}),(0,t.jsxs)("tbody",{children:[ed.map((e,a)=>{let l=!1===I.useGlobalModelMemory?null:function(e=[],a){let l=String(a||"").trim();if(!l)return null;let t=e.find(e=>String(e.model||"")===l);if(t)return{row:t,key:t.model,matchType:"exact"};let r=l.toLowerCase(),s=e.find(e=>String(e.model||"").toLowerCase()===r);if(s)return{row:s,key:s.model,matchType:"case-insensitive"};let d=e.find(e=>{let a;return String(e.model||"").includes("*")&&(a=String(e.model||"").split("*").map(e=>e.replace(/[|\\{}()[\]^$+?.]/g,"\\$&")).join(".*"),RegExp(`^${a}$`,"i")).test(l)});return d?{row:d,key:d.model,matchType:"wildcard"}:null}(u,e.model),r=l?.row||null,d=!0!==e.overrideEnabled;return(0,t.jsxs)("tr",{className:"border-t border-border",children:[(0,t.jsxs)("td",{className:"px-3 py-2 align-top",children:[(0,t.jsx)("input",{value:e.model,onChange:e=>em(a,"model",e.target.value),placeholder:"qwen3:8b",className:"w-full rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary"}),l?.matchType==="wildcard"?(0,t.jsxs)(j,{children:["Matched global pattern: ",l.key]}):null]}),(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(s.lM,{checked:!0===e.overrideEnabled,onChange:()=>em(a,"overrideEnabled",!0!==e.overrideEnabled)})}),(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(N,{row:e,globalRule:r,useGlobal:!1!==I.useGlobalModelMemory})}),o.map(l=>(0,t.jsx)("td",{className:"px-3 py-2 align-top",children:(0,t.jsx)(M,{value:e[l]??"",disabled:d,globalValue:r?.[l],globalEnabled:!1!==I.useGlobalModelMemory,onChange:e=>em(a,l,e)})},l)),(0,t.jsx)("td",{className:"px-3 py-2 text-right align-top",children:(0,t.jsx)("button",{type:"button",onClick:()=>{D(e=>ed.filter((e,l)=>l!==a))},className:"rounded-md px-2 py-1 text-red-500 hover:bg-red-500/10",title:"Remove row",children:(0,t.jsx)("span",{className:"material-icons text-base",children:"delete"})})})]},`${e.model}-${a}`)}),0===ed.length?(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:9,className:"px-3 py-6 text-center text-sm text-text-muted",children:"No rows. Add an override or import detected models."})}):null]})]})}),(0,t.jsxs)("div",{className:"mt-3 grid gap-3 text-xs md:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override OFF:"})," model uses global rule when global fallback is enabled."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Override ON:"})," filled fields override global; empty fields still inherit global."]}),(0,t.jsxs)("div",{className:"rounded-xl bg-surface-2 p-3 text-text-muted",children:[(0,t.jsx)("b",{className:"text-text-main",children:"Global OFF:"})," only enabled node override rows are used for this node."]})]})]})]})}),(0,t.jsx)(s.aF,{isOpen:$,onClose:()=>A(!1),title:`Install agent: ${G?.name||""}`,children:(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"rounded-xl border border-amber-300 bg-amber-50 p-3 text-sm text-amber-800",children:"Passwords are used only for this install request and are not stored. The server running BlueRouter needs ssh or sshpass installed for password-based SSH."}),(0,t.jsx)(s.pd,{label:"SSH Password",value:L,onChange:e=>B(e.target.value),type:"password",placeholder:"leave empty for SSH key"}),G?.useSudo?(0,t.jsx)(s.pd,{label:"Sudo Password",value:z,onChange:e=>H(e.target.value),type:"password",placeholder:"leave empty to reuse SSH password or passwordless sudo"}):null,(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(s.$n,{onClick:ei,disabled:J===G?.id,children:J===G?.id?"Installing...":"Install / Update Agent"}),(0,t.jsx)(s.$n,{variant:"ghost",onClick:()=>A(!1),disabled:J===G?.id,children:"Close"})]}),Q?(0,t.jsx)("pre",{className:"max-h-64 overflow-auto rounded-xl bg-surface-2 p-3 text-xs text-text-main",children:Q}):null]})}),(0,t.jsx)(s.uo,{isOpen:!!X,onClose:()=>Y(null),onConfirm:X?.onConfirm,title:X?.title||"Confirm",message:X?.message,variant:"danger"})]})}}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=72546)),_N_E=e.O()}]);
|
|
Binary file
|
|
Binary file
|
package/app/package.json
CHANGED
package/package.json
CHANGED
|
File without changes
|
/package/app/.next-cli-build/static/{Xbo_AIKYOGEGqR8MyK-RI → fXCPIllYK5YTILrwmgKb_}/_ssgManifest.js
RENAMED
|
File without changes
|