omniroute 2.3.3 → 2.3.4
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/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +41 -41
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/.well-known/agent.json/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +2 -2
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/a2a/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/[id]/cancel/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/acp/agents/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cache/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cache/stats/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/backups/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/backups/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/cline-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/cline-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-profiles/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-profiles/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/guide-settings/[toolId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/kilo-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw/auto-order/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/runtime/[toolId]/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/runtime/[toolId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/status/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/auto/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/metrics/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/compliance/audit-log/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/export/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/exportAll/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/evals/[suiteId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/evals/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/fallback/chains/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/logs/console/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/audit/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/audit/stats/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/sse/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/stream/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/availability/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/catalog/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/openrouter-catalog/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/route.js +1 -1
- package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/monitoring/health/route.js +1 -1
- package/app/.next/server/app/api/monitoring/health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/policies/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/defaults/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-metrics/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/route.js +1 -1
- package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/rate-limit/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/rate-limits/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/resilience/reset/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/resilience/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/background-degradation/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/combo-defaults/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/ip-filter/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/model-aliases/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/proxy/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/proxy/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/system-prompt/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/thinking-budget/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/storage/health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sync/cloud/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sync/initialize/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/telemetry/summary/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/token-health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/detect/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/history/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/analytics/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/budget/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/call-logs/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/call-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/proxy-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/quota/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/images/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/moderations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/music/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/rerank/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/videos/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/docs/page.js +1 -1
- package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +41 -41
- package/app/.next/server/chunks/7889.js +1 -1
- package/app/.next/server/pages/500.html +2 -2
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/{5846-42d982547e1caf85.js → 5846-11f0da2526ea550c.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/{page-8d4d2f071d114b90.js → page-284b636e8d7e33f1.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-62c8c63ebebff9df.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/{page-ee3b3c7b9ecbad30.js → page-4c046dfc5159d2ac.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/{page-7341fec78a6818b3.js → page-5c7266984d89bd37.js} +1 -1
- package/app/package.json +1 -1
- package/app/public/providers/assemblyai.svg +12 -0
- package/app/public/providers/elevenlabs.svg +6 -0
- package/app/public/providers/hyperbolic.svg +13 -0
- package/app/public/providers/inworld.svg +12 -0
- package/app/public/providers/nanobanana.svg +12 -0
- package/app/public/providers/ollama-cloud.png +375 -0
- package/app/public/providers/playht.svg +11 -0
- package/package.json +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-7b1037d65eef97a8.js +0 -1
- /package/app/.next/static/{2-Wq7CYQRUOTZ9PqJz4xL → 9Djw7GIB7UXqJwJlVsoxB}/_buildManifest.js +0 -0
- /package/app/.next/static/{2-Wq7CYQRUOTZ9PqJz4xL → 9Djw7GIB7UXqJwJlVsoxB}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
<!doctype html>
|
|
11
|
+
<html class="h-full overflow-y-scroll">
|
|
12
|
+
<head>
|
|
13
|
+
<title>Ollama</title>
|
|
14
|
+
|
|
15
|
+
<meta charset="utf-8" />
|
|
16
|
+
<meta name="description" content="Get up and running with large language models."/>
|
|
17
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
18
|
+
<meta property="og:title" content="Ollama" />
|
|
19
|
+
<meta property="og:description" content="Get up and running with large language models." />
|
|
20
|
+
<meta property="og:url" content="https://ollama.com" />
|
|
21
|
+
<meta property="og:image" content="https://ollama.com/public/og.png" />
|
|
22
|
+
<meta property="og:image:type" content="image/png" />
|
|
23
|
+
<meta property="og:image:width" content="1200" />
|
|
24
|
+
<meta property="og:image:height" content="628" />
|
|
25
|
+
<meta property="og:type" content="website" />
|
|
26
|
+
|
|
27
|
+
<meta name="robots" content="index, follow" />
|
|
28
|
+
|
|
29
|
+
<meta property="twitter:card" content="summary" />
|
|
30
|
+
<meta property="twitter:title" content="Ollama" />
|
|
31
|
+
<meta property="twitter:description" content="Get up and running with large language models." />
|
|
32
|
+
<meta property="twitter:site" content="ollama" />
|
|
33
|
+
|
|
34
|
+
<meta property="twitter:image:src" content="https://ollama.com/public/og-twitter.png" />
|
|
35
|
+
<meta property="twitter:image:width" content="1200" />
|
|
36
|
+
<meta property="twitter:image:height" content="628" />
|
|
37
|
+
|
|
38
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
39
|
+
|
|
40
|
+
<link rel="icon" type="image/png" sizes="16x16" href="/public/icon-16x16.png" />
|
|
41
|
+
<link rel="icon" type="image/png" sizes="32x32" href="/public/icon-32x32.png" />
|
|
42
|
+
<link rel="icon" type="image/png" sizes="48x48" href="/public/icon-48x48.png" />
|
|
43
|
+
<link rel="icon" type="image/png" sizes="64x64" href="/public/icon-64x64.png" />
|
|
44
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/public/apple-touch-icon.png" />
|
|
45
|
+
<link rel="icon" type="image/png" sizes="192x192" href="/public/android-chrome-icon-192x192.png" />
|
|
46
|
+
<link rel="icon" type="image/png" sizes="512x512" href="/public/android-chrome-icon-512x512.png" />
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
<link href="/public/tailwind.css?v=9f0babb28a8cef23daf033b8840da7f9" rel="stylesheet" />
|
|
52
|
+
<link href="/public/vendor/prism/prism.css?v=9f0babb28a8cef23daf033b8840da7f9" rel="stylesheet" />
|
|
53
|
+
<script type="application/ld+json">
|
|
54
|
+
{
|
|
55
|
+
"@context": "https://schema.org",
|
|
56
|
+
"@type": "WebSite",
|
|
57
|
+
"name": "Ollama",
|
|
58
|
+
"url": "https://ollama.com"
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<script type="text/javascript">
|
|
63
|
+
function copyToClipboard(element) {
|
|
64
|
+
let commandElement = null;
|
|
65
|
+
const preElement = element.closest('pre');
|
|
66
|
+
const languageNoneElement = element.closest('.language-none');
|
|
67
|
+
|
|
68
|
+
if (preElement) {
|
|
69
|
+
commandElement = preElement.querySelector('code');
|
|
70
|
+
} else if (languageNoneElement) {
|
|
71
|
+
commandElement = languageNoneElement.querySelector('.command');
|
|
72
|
+
} else {
|
|
73
|
+
const parent = element.parentElement;
|
|
74
|
+
if (parent) {
|
|
75
|
+
commandElement = parent.querySelector('.command');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!commandElement) {
|
|
80
|
+
console.error('No code or command element found');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const code = commandElement.textContent ? commandElement.textContent.trim() : commandElement.value;
|
|
85
|
+
|
|
86
|
+
navigator.clipboard
|
|
87
|
+
.writeText(code)
|
|
88
|
+
.then(() => {
|
|
89
|
+
const copyIcon = element.querySelector('.copy-icon')
|
|
90
|
+
const checkIcon = element.querySelector('.check-icon')
|
|
91
|
+
|
|
92
|
+
copyIcon.classList.add('hidden')
|
|
93
|
+
checkIcon.classList.remove('hidden')
|
|
94
|
+
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
copyIcon.classList.remove('hidden')
|
|
97
|
+
checkIcon.classList.add('hidden')
|
|
98
|
+
}, 2000)
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
</script>
|
|
102
|
+
|
|
103
|
+
<script>
|
|
104
|
+
|
|
105
|
+
function getIcon(url) {
|
|
106
|
+
url = url.toLowerCase();
|
|
107
|
+
if (url.includes('x.com') || url.includes('twitter.com')) return 'x';
|
|
108
|
+
if (url.includes('github.com')) return 'github';
|
|
109
|
+
if (url.includes('linkedin.com')) return 'linkedin';
|
|
110
|
+
if (url.includes('youtube.com')) return 'youtube';
|
|
111
|
+
if (url.includes('hf.co') || url.includes('huggingface.co') || url.includes('huggingface.com')) return 'hugging-face';
|
|
112
|
+
return 'default';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function setInputIcon(input) {
|
|
116
|
+
const icon = getIcon(input.value);
|
|
117
|
+
const img = input.previousElementSibling.querySelector('img');
|
|
118
|
+
img.src = `/public/social/${icon}.svg`;
|
|
119
|
+
img.alt = `${icon} icon`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function setDisplayIcon(imgElement, url) {
|
|
123
|
+
const icon = getIcon(url);
|
|
124
|
+
imgElement.src = `/public/social/${icon}.svg`;
|
|
125
|
+
imgElement.alt = `${icon} icon`;
|
|
126
|
+
}
|
|
127
|
+
</script>
|
|
128
|
+
|
|
129
|
+
<script src="/public/vendor/htmx/bundle.js"></script>
|
|
130
|
+
</head>
|
|
131
|
+
|
|
132
|
+
<body
|
|
133
|
+
class="
|
|
134
|
+
antialiased
|
|
135
|
+
min-h-screen
|
|
136
|
+
w-full
|
|
137
|
+
m-0
|
|
138
|
+
flex
|
|
139
|
+
flex-col
|
|
140
|
+
"
|
|
141
|
+
hx-on:keydown="
|
|
142
|
+
if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
|
|
143
|
+
// Ignore key events in input fields.
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if ((event.metaKey && event.key === 'k') || event.key === '/') {
|
|
147
|
+
event.preventDefault();
|
|
148
|
+
const sp = htmx.find('#search') || htmx.find('#navbar-input');
|
|
149
|
+
sp.focus();
|
|
150
|
+
}
|
|
151
|
+
"
|
|
152
|
+
>
|
|
153
|
+
|
|
154
|
+
<header class="sticky top-0 z-40 bg-white underline-offset-4 lg:static">
|
|
155
|
+
<nav class="flex w-full items-center justify-between px-6 py-[9px]">
|
|
156
|
+
<a href="/" class="z-50">
|
|
157
|
+
<img src="/public/ollama.png" class="w-8" alt="Ollama" />
|
|
158
|
+
</a>
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
<div class="hidden lg:flex xl:flex-1 items-center space-x-6 ml-6 mr-6 xl:mr-0 text-lg">
|
|
162
|
+
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/search">Models</a>
|
|
163
|
+
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/docs">Docs</a>
|
|
164
|
+
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/pricing">Pricing</a>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
<div class="flex-grow justify-center items-center hidden lg:flex">
|
|
169
|
+
<div class="relative w-full xl:max-w-[28rem]">
|
|
170
|
+
|
|
171
|
+
<form action="/search" autocomplete="off">
|
|
172
|
+
<div
|
|
173
|
+
class="relative flex w-full appearance-none bg-black/5 border border-neutral-100 items-center rounded-full"
|
|
174
|
+
hx-on:focusout="
|
|
175
|
+
if (!this.contains(event.relatedTarget)) {
|
|
176
|
+
const searchPreview = document.querySelector('#searchpreview');
|
|
177
|
+
if (searchPreview) {
|
|
178
|
+
htmx.addClass('#searchpreview', 'hidden');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
"
|
|
182
|
+
>
|
|
183
|
+
<span id="searchIcon" class="pl-2 text-2xl text-neutral-500">
|
|
184
|
+
<svg class="mt-0.25 ml-1.5 h-5 w-5 fill-current" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
|
185
|
+
<path d="m8.5 3c3.0375661 0 5.5 2.46243388 5.5 5.5 0 1.24832096-.4158777 2.3995085-1.1166416 3.3225711l4.1469717 4.1470988c.2928932.2928932.2928932.767767 0 1.0606602-.2662666.2662665-.6829303.2904726-.9765418.0726181l-.0841184-.0726181-4.1470988-4.1469717c-.9230626.7007639-2.07425014 1.1166416-3.3225711 1.1166416-3.03756612 0-5.5-2.4624339-5.5-5.5 0-3.03756612 2.46243388-5.5 5.5-5.5zm0 1.5c-2.209139 0-4 1.790861-4 4s1.790861 4 4 4 4-1.790861 4-4-1.790861-4-4-4z" />
|
|
186
|
+
</svg>
|
|
187
|
+
</span>
|
|
188
|
+
<input
|
|
189
|
+
id="search"
|
|
190
|
+
hx-get="/search"
|
|
191
|
+
hx-trigger="keyup changed delay:100ms, focus"
|
|
192
|
+
hx-target="#searchpreview"
|
|
193
|
+
hx-swap="innerHTML"
|
|
194
|
+
name="q"
|
|
195
|
+
class="resize-none rounded-full border-0 py-2.5 bg-transparent text-sm w-full placeholder:text-neutral-500 focus:outline-none focus:ring-0"
|
|
196
|
+
placeholder="Search models"
|
|
197
|
+
autocomplete="off"
|
|
198
|
+
hx-on:keydown="
|
|
199
|
+
if (event.key === 'Enter') {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
window.location.href = '/search?q=' + encodeURIComponent(this.value);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (event.key === 'Escape') {
|
|
205
|
+
event.preventDefault();
|
|
206
|
+
this.value = '';
|
|
207
|
+
this.blur();
|
|
208
|
+
htmx.addClass('#searchpreview', 'hidden');
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (event.key === 'Tab') {
|
|
212
|
+
htmx.addClass('#searchpreview', 'hidden');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (event.key === 'ArrowDown') {
|
|
216
|
+
let first = document.querySelector('#search-preview-list a:first-of-type');
|
|
217
|
+
first?.focus();
|
|
218
|
+
event.preventDefault();
|
|
219
|
+
}
|
|
220
|
+
if (event.key === 'ArrowUp') {
|
|
221
|
+
let last = document.querySelector('#view-all-link');
|
|
222
|
+
last?.focus();
|
|
223
|
+
event.preventDefault();
|
|
224
|
+
}
|
|
225
|
+
htmx.removeClass('#searchpreview', 'hidden');
|
|
226
|
+
"
|
|
227
|
+
hx-on:focus="
|
|
228
|
+
htmx.removeClass('#searchpreview', 'hidden')
|
|
229
|
+
"
|
|
230
|
+
/>
|
|
231
|
+
</form>
|
|
232
|
+
<div id="searchpreview" class="hidden absolute left-0 right-0 top-12 z-50" style="width: calc(100% + 2px); margin-left: -1px;"></div>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
<div class="hidden lg:flex xl:flex-1 items-center space-x-2 justify-end ml-6 xl:ml-0">
|
|
240
|
+
|
|
241
|
+
<a class="flex cursor-pointer items-center rounded-full bg-black/5 hover:bg-black/10 text-lg px-4 py-1.5 text-black whitespace-nowrap" href="/signin">Sign in</a>
|
|
242
|
+
<a class="flex cursor-pointer items-center rounded-full bg-neutral-800 text-lg px-4 py-1.5 text-white hover:bg-black whitespace-nowrap focus:bg-black" href="/download">Download</a>
|
|
243
|
+
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
<div class="lg:hidden flex items-center">
|
|
248
|
+
<input type="checkbox" id="menu" class="peer hidden" />
|
|
249
|
+
<label for="menu" class="z-50 cursor-pointer peer-checked:hidden block">
|
|
250
|
+
<svg
|
|
251
|
+
class="h-8 w-8"
|
|
252
|
+
fill="none"
|
|
253
|
+
viewBox="0 0 24 24"
|
|
254
|
+
stroke-width="1.5"
|
|
255
|
+
stroke="currentColor"
|
|
256
|
+
aria-hidden="true"
|
|
257
|
+
>
|
|
258
|
+
<path
|
|
259
|
+
stroke-linecap="round"
|
|
260
|
+
stroke-linejoin="round"
|
|
261
|
+
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
|
|
262
|
+
/>
|
|
263
|
+
</svg>
|
|
264
|
+
</label>
|
|
265
|
+
<label for="menu" class="z-50 cursor-pointer hidden peer-checked:block fixed top-4 right-6">
|
|
266
|
+
<svg
|
|
267
|
+
class="h-8 w-8"
|
|
268
|
+
fill="none"
|
|
269
|
+
viewBox="0 0 24 24"
|
|
270
|
+
stroke-width="1.5"
|
|
271
|
+
stroke="currentColor"
|
|
272
|
+
aria-hidden="true"
|
|
273
|
+
>
|
|
274
|
+
<path
|
|
275
|
+
stroke-linecap="round"
|
|
276
|
+
stroke-linejoin="round"
|
|
277
|
+
d="M6 18L18 6M6 6l12 12"
|
|
278
|
+
/>
|
|
279
|
+
</svg>
|
|
280
|
+
</label>
|
|
281
|
+
|
|
282
|
+
<div class="fixed inset-0 bg-white z-40 hidden peer-checked:block overflow-y-auto">
|
|
283
|
+
<div class="flex flex-col space-y-5 pt-[5.5rem] text-3xl">
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
<a class="px-6" href="/search">Models</a>
|
|
288
|
+
<a class="px-6" href="/download">Download</a>
|
|
289
|
+
<a class="px-6" href="/docs">Docs</a>
|
|
290
|
+
<a class="px-6" href="/pricing">Pricing</a>
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
<a href="/signin" class="block px-6">Sign in</a>
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
</div>
|
|
298
|
+
</div>
|
|
299
|
+
</div>
|
|
300
|
+
</nav>
|
|
301
|
+
</header>
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
<main class="mx-auto flex max-w-4xl flex-1 flex-col-reverse items-center justify-center p-32 md:flex-row md:items-start md:justify-between">
|
|
305
|
+
<div class="space-y-2 text-center md:pt-6 md:text-left">
|
|
306
|
+
<h2 class="text-3xl font-normal tracking-tight md:text-4xl">
|
|
307
|
+
404.
|
|
308
|
+
<span class="text-neutral-400"> That's an error. </span>
|
|
309
|
+
</h2>
|
|
310
|
+
<p class="text-center text-lg md:text-left md:text-xl">
|
|
311
|
+
The page was not found.
|
|
312
|
+
</p>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="pb-4 md:pb-0">
|
|
315
|
+
<img src="/public/400s.svg" class="w-40 md:w-48" alt="400s ollama" />
|
|
316
|
+
</div>
|
|
317
|
+
</main>
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
<footer class="mt-auto">
|
|
321
|
+
|
|
322
|
+
<div class="underline-offset-4 hidden md:block">
|
|
323
|
+
<div class="flex items-center justify-between px-6 py-3.5">
|
|
324
|
+
<div class="text-xs text-neutral-500">© 2026 Ollama</div>
|
|
325
|
+
<div class="flex space-x-6 text-xs text-neutral-500">
|
|
326
|
+
<a href="/download" class="hover:underline">Download</a>
|
|
327
|
+
<a href="/blog" class="hover:underline">Blog</a>
|
|
328
|
+
<a href="https://docs.ollama.com" class="hover:underline">Docs</a>
|
|
329
|
+
<a href="https://github.com/ollama/ollama" class="hover:underline">GitHub</a>
|
|
330
|
+
<a href="https://discord.com/invite/ollama" class="hover:underline">Discord</a>
|
|
331
|
+
<a href="https://twitter.com/ollama" class="hover:underline">X (Twitter)</a>
|
|
332
|
+
<a href="mailto:hello@ollama.com" class="hover:underline">Contact</a>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
<div class="py-4 md:hidden">
|
|
337
|
+
<div class="flex flex-col items-center justify-center">
|
|
338
|
+
<ul class="flex flex-wrap items-center justify-center text-sm text-neutral-500">
|
|
339
|
+
<li class="mx-2 my-1">
|
|
340
|
+
<a href="/blog" class="hover:underline">Blog</a>
|
|
341
|
+
</li>
|
|
342
|
+
<li class="mx-2 my-1">
|
|
343
|
+
<a href="/download" class="hover:underline">Download</a>
|
|
344
|
+
</li>
|
|
345
|
+
<li class="mx-2 my-1">
|
|
346
|
+
<a href="https://docs.ollama.com" class="hover:underline">Docs</a>
|
|
347
|
+
</li>
|
|
348
|
+
</ul>
|
|
349
|
+
<ul class="flex flex-wrap items-center justify-center text-sm text-neutral-500">
|
|
350
|
+
<li class="mx-2 my-1">
|
|
351
|
+
<a href="https://github.com/ollama/ollama" class="hover:underline">GitHub</a>
|
|
352
|
+
</li>
|
|
353
|
+
<li class="mx-2 my-1">
|
|
354
|
+
<a href="https://discord.com/invite/ollama" class="hover:underline">Discord</a>
|
|
355
|
+
</li>
|
|
356
|
+
<li class="mx-2 my-1">
|
|
357
|
+
<a href="https://twitter.com/ollama" class="hover:underline">X (Twitter)</a>
|
|
358
|
+
</li>
|
|
359
|
+
<li class="mx-2 my-1">
|
|
360
|
+
<a href="https://lu.ma/ollama" class="hover:underline">Meetups</a>
|
|
361
|
+
</li>
|
|
362
|
+
</ul>
|
|
363
|
+
<div class="mt-2 flex items-center justify-center text-sm text-neutral-500">
|
|
364
|
+
© 2026 Ollama Inc.
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
</footer>
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
<span class="hidden" id="end_of_template"></span>
|
|
374
|
+
</body>
|
|
375
|
+
</html>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<rect width="100" height="100" rx="18" fill="#1A1A2E"/>
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="pg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#7B2FFF"/>
|
|
6
|
+
<stop offset="100%" stop-color="#FF6B6B"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
</defs>
|
|
9
|
+
<!-- Play triangle -->
|
|
10
|
+
<polygon points="28,22 28,78 78,50" fill="url(#pg)" rx="4"/>
|
|
11
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omniroute",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.4",
|
|
4
4
|
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6099],{21583:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>k});var a=t(95155),l=t(12115),r=t(40993),i=t(14051),n=t.n(i),o=t(98500),c=t.n(o),d=t(30949),m=t(20909),x=t(50910);let p=t(41463).env.NEXT_PUBLIC_CLOUD_URL||null,u=15e3;function b({machineId:e}){let s=(0,x.c)("endpoint"),t=(0,x.c)("common"),[i,n]=(0,l.useState)(!0),[o,m]=(0,l.useState)([]),[b,f]=(0,l.useState)(null),[j,y]=(0,l.useState)(!1),[v,N]=(0,l.useState)(!1),[k,w]=(0,l.useState)(!1),[C,S]=(0,l.useState)(!1),[T,_]=(0,l.useState)(null),[A,P]=(0,l.useState)(""),[E,$]=(0,l.useState)(!1),[R,D]=(0,l.useState)(null),[M,O]=(0,l.useState)(p),[q,I]=(0,l.useState)("api"),[U,B]=(0,l.useState)(null),[Q,L]=(0,l.useState)(null),{copied:F,copy:z}=(0,d.C)();(0,l.useEffect)(()=>{Promise.allSettled([V(),W(),Z()]).finally(()=>{n(!1)})},[]);let W=async()=>{try{let e=await fetch("/v1/models");if(e.ok){let s=await e.json();m(s.data||[])}}catch(e){console.log("Error fetching models:",e)}},Z=async()=>{try{let[e,s]=await Promise.allSettled([fetch("/api/mcp/status"),fetch("/api/a2a/status")]);"fulfilled"===e.status&&e.value.ok&&B(await e.value.json()),"fulfilled"===s.status&&s.value.ok&&L(await s.value.json())}catch{}},H=(0,l.useMemo)(()=>{let e=o.filter(e=>!e.type&&!e.parent),s=o.filter(e=>"embedding"===e.type&&!e.parent),t=o.filter(e=>"image"===e.type&&!e.parent),a=o.filter(e=>"rerank"===e.type&&!e.parent),l=o.filter(e=>"audio"===e.type&&"transcription"===e.subtype&&!e.parent);return{chat:e,embeddings:s,images:t,rerank:a,audioTranscription:l,audioSpeech:o.filter(e=>"audio"===e.type&&"speech"===e.subtype&&!e.parent),moderation:o.filter(e=>"moderation"===e.type&&!e.parent)}},[o]),J=async(e,t=u)=>{let a=new AbortController,l=setTimeout(()=>a.abort(),t);try{let s=await fetch("/api/sync/cloud",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e}),signal:a.signal}),t=await s.json().catch(()=>({}));return{ok:s.ok,status:s.status,data:t}}catch(e){if(e?.name==="AbortError")return{ok:!1,status:408,data:{error:s("cloudRequestTimeout")}};return{ok:!1,status:500,data:{error:e.message||s("cloudRequestFailed")}}}finally{clearTimeout(l)}},V=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();y(s.cloudEnabled||!1)}}catch(e){console.log("Error loading cloud settings:",e)}},X=e=>{e?N(!0):w(!0)};(0,l.useEffect)(()=>{if(T){let e=setTimeout(()=>_(null),5e3);return()=>clearTimeout(e)}},[T]),(0,l.useEffect)(()=>{let e=setInterval(Z,3e4);return()=>clearInterval(e)},[]);let G=()=>{globalThis.dispatchEvent(new Event("cloud-status-changed"))},Y=async()=>{S(!0),$(!1),P("syncing");try{let{ok:e,status:t,data:a}=await J("enable");if(e)P("verifying"),await new Promise(e=>setTimeout(e,600)),y(!0),P("done"),$(!0),S(!1),G(),await new Promise(e=>setTimeout(e,1200)),N(!1),$(!1),a.verified?_({type:"success",message:s("cloudConnectedVerified")}):_({type:"warning",message:a.verifyError?s("connectedVerificationPendingWithError",{error:a.verifyError}):s("connectedVerificationPending")}),a.cloudUrl&&O(a.cloudUrl),await V();else{let e=a.error||s("failedEnable");(502===t||408===t)&&(e=s("cloudWorkerUnreachable")),_({type:"error",message:e}),N(!1)}}catch(e){_({type:"error",message:e.message||s("connectionFailed")}),N(!1)}finally{S(!1),P("")}},K=async()=>{S(!0),P("syncing");try{await J("sync"),P("disabling");let{ok:e,data:t}=await J("disable");e?(y(!1),_({type:"success",message:s("cloudDisabledSuccess")}),w(!1),G(),await V()):_({type:"error",message:t.error||s("failedDisable")})}catch(e){console.log("Error disabling cloud:",e),_({type:"error",message:s("failedDisable")})}finally{S(!1),P("")}},[ee,es]=(0,l.useState)("/v1"),et=M?`${M}/v1`:null;if((0,l.useEffect)(()=>{es(`${window.location.origin}/v1`)},[]),i)return(0,a.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,a.jsx)(r.Qv,{}),(0,a.jsx)(r.Qv,{})]});let ea=j&&et?et:ee,el=!!U?.online,er=Q?.status==="ok",ei=Number(U?.heartbeat?.toolCount||0),en=Number(Q?.tasks?.activeStreams||0);return(0,a.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,a.jsxs)(r.Zp,{className:"",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:s("title")}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:j?s("usingCloudProxy"):s("usingLocalServer")}),e&&(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:s("machineId",{id:e.slice(0,8)})})]}),(0,a.jsx)("div",{className:"flex items-center gap-2",children:j?(0,a.jsx)(r.$n,{size:"sm",variant:"secondary",icon:"cloud_off",onClick:()=>X(!1),disabled:C,className:"bg-red-500/10! text-red-500! hover:bg-red-500/20! border-red-500/30!",children:s("disableCloud")}):(0,a.jsx)(r.$n,{variant:"primary",icon:"cloud_upload",onClick:()=>X(!0),disabled:C,className:"bg-linear-to-r from-primary to-blue-500 hover:from-primary-hover hover:to-blue-600",children:s("enableCloud")})})]}),T&&(0,a.jsxs)("div",{className:`flex items-center gap-2 px-4 py-2.5 rounded-lg mb-4 text-sm font-medium animate-in fade-in slide-in-from-top-2 duration-300 ${"success"===T.type?"bg-green-500/10 border border-green-500/30 text-green-400":"warning"===T.type?"bg-amber-500/10 border border-amber-500/30 text-amber-400":"bg-red-500/10 border border-red-500/30 text-red-400"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"success"===T.type?"check_circle":"warning"===T.type?"warning":"error"}),(0,a.jsx)("span",{className:"flex-1",children:T.message}),(0,a.jsx)("button",{onClick:()=>_(null),className:"p-0.5 hover:bg-white/10 rounded transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]}),(0,a.jsxs)("div",{className:"flex gap-2 mb-3",children:[(0,a.jsx)(r.pd,{value:ea,readOnly:!0,className:`flex-1 font-mono text-sm ${j?"animate-border-glow":""}`}),(0,a.jsx)(r.$n,{variant:"secondary",icon:"endpoint_url"===F?"check":"content_copy",onClick:()=>z(ea,"endpoint_url"),children:t("endpoint_url"===F?"copied":"copy")})]})]}),(0,a.jsx)(r.Zp,{children:(0,a.jsxs)("div",{className:"flex flex-wrap gap-3 items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:s("sectionTitle")||"Integration Surface"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:s("sectionDescription")||"OpenAI-compatible APIs and operational protocol endpoints"})]}),(0,a.jsx)(r.Iz,{options:[{value:"api",label:s("tabApis")||"OpenAI-compatible APIs",icon:"api"},{value:"protocols",label:s("tabProtocols")||"Protocols",icon:"hub"}],value:q,onChange:I,"aria-label":s("tabsAria")||"Endpoint sections"})]})}),"api"===q?(0,a.jsxs)(r.Zp,{children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:s("available")}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:s("modelsAcrossEndpoints",{models:Object.values(H).reduce((e,s)=>e+s.length,0),endpoints:[H.chat,H.embeddings,H.images,H.rerank,H.audioTranscription,H.audioSpeech,H.moderation].filter(e=>e.length>0).length+2})})]})}),(0,a.jsxs)("div",{className:"mb-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm text-primary",children:"hub"}),(0,a.jsx)("h3",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:s("categoryCore")||"Core APIs"}),(0,a.jsx)("div",{className:"flex-1 h-px bg-border/50"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsx)(g,{icon:"chat",iconColor:"text-blue-500",iconBg:"bg-blue-500/10",title:s("chatCompletions"),path:"/v1/chat/completions",description:s("chatDesc"),models:H.chat,expanded:"chat"===b,onToggle:()=>f("chat"===b?null:"chat"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"code",iconColor:"text-indigo-500",iconBg:"bg-indigo-500/10",title:s("responses")||"Responses API",path:"/v1/responses",description:s("responsesDesc")||"OpenAI Responses API for Codex and advanced agentic workflows",models:H.chat,expanded:"responses"===b,onToggle:()=>f("responses"===b?null:"responses"),copy:z,copied:F,baseUrl:ea})]})]}),(0,a.jsxs)("div",{className:"mb-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm text-purple-400",children:"perm_media"}),(0,a.jsx)("h3",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:s("categoryMedia")||"Media & Multi-Modal"}),(0,a.jsx)("div",{className:"flex-1 h-px bg-border/50"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsx)(g,{icon:"data_array",iconColor:"text-emerald-500",iconBg:"bg-emerald-500/10",title:s("embeddings"),path:"/v1/embeddings",description:s("embeddingsDesc"),models:H.embeddings,expanded:"embeddings"===b,onToggle:()=>f("embeddings"===b?null:"embeddings"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"image",iconColor:"text-purple-500",iconBg:"bg-purple-500/10",title:s("imageGeneration"),path:"/v1/images/generations",description:s("imageDesc"),models:H.images,expanded:"images"===b,onToggle:()=>f("images"===b?null:"images"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"mic",iconColor:"text-rose-500",iconBg:"bg-rose-500/10",title:s("audioTranscription"),path:"/v1/audio/transcriptions",description:s("audioTranscriptionDesc"),models:H.audioTranscription,expanded:"audioTranscription"===b,onToggle:()=>f("audioTranscription"===b?null:"audioTranscription"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"record_voice_over",iconColor:"text-cyan-500",iconBg:"bg-cyan-500/10",title:s("textToSpeech"),path:"/v1/audio/speech",description:s("textToSpeechDesc"),models:H.audioSpeech,expanded:"audioSpeech"===b,onToggle:()=>f("audioSpeech"===b?null:"audioSpeech"),copy:z,copied:F,baseUrl:ea})]})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm text-amber-400",children:"build"}),(0,a.jsx)("h3",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:s("categoryUtility")||"Utility & Management"}),(0,a.jsx)("div",{className:"flex-1 h-px bg-border/50"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsx)(g,{icon:"sort",iconColor:"text-amber-500",iconBg:"bg-amber-500/10",title:s("rerank"),path:"/v1/rerank",description:s("rerankDesc"),models:H.rerank,expanded:"rerank"===b,onToggle:()=>f("rerank"===b?null:"rerank"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"shield",iconColor:"text-orange-500",iconBg:"bg-orange-500/10",title:s("moderations"),path:"/v1/moderations",description:s("moderationsDesc"),models:H.moderation,expanded:"moderation"===b,onToggle:()=>f("moderation"===b?null:"moderation"),copy:z,copied:F,baseUrl:ea}),(0,a.jsx)(g,{icon:"list",iconColor:"text-teal-500",iconBg:"bg-teal-500/10",title:s("listModels")||"List Models",path:"/v1/models",description:s("listModelsDesc")||"List all available models across all connected providers",models:[],expanded:"models"===b,onToggle:()=>f("models"===b?null:"models"),copy:z,copied:F,baseUrl:ea})]})]})]}):(0,a.jsx)(r.Zp,{children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:s("protocolsTitle")||"Protocols"}),(0,a.jsx)("p",{className:"text-sm text-text-muted mt-1",children:s("protocolsDescription")||"MCP and A2A are first-class endpoints with dedicated observability and controls."})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4 bg-bg-subtle",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"font-semibold flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"hub"}),s("mcpCardTitle")||"MCP Server"]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:s("mcpCardDescription")||"Model Context Protocol over stdio"})]}),(0,a.jsx)("span",{className:`text-xs px-2 py-1 rounded-full font-semibold ${el?"bg-green-500/15 text-green-500":"bg-red-500/15 text-red-500"}`,children:t(el?"active":"inactive")})]}),(0,a.jsxs)("div",{className:"mt-3 text-xs text-text-muted space-y-1",children:[(0,a.jsxs)("p",{children:[s("protocolToolsLabel")||"Tools",":"," ",(0,a.jsx)("span",{className:"text-text-main font-semibold",children:ei||16})]}),(0,a.jsxs)("p",{children:[s("protocolLastActivity")||"Last activity",":"," ",(0,a.jsx)("span",{className:"text-text-main",children:U?.activity?.lastCallAt?new Date(U.activity.lastCallAt).toLocaleString():"—"})]})]}),(0,a.jsxs)("div",{className:"mt-3 rounded-lg bg-bg p-3 border border-border/70",children:[(0,a.jsx)("p",{className:"text-xs font-semibold mb-1",children:s("quickStart")||"Quick Start"}),(0,a.jsx)("code",{className:"text-xs font-mono break-all",children:"omniroute --mcp"})]}),(0,a.jsx)("div",{className:"mt-3",children:(0,a.jsxs)(c(),{href:"/dashboard/mcp",className:"text-sm text-primary hover:text-primary-hover transition-colors",children:[s("openMcpDashboard")||"Open MCP management"," →"]})})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4 bg-bg-subtle",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"font-semibold flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-primary text-[18px]",children:"group_work"}),s("a2aCardTitle")||"A2A Server"]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:s("a2aCardDescription")||"Agent2Agent JSON-RPC endpoint"})]}),(0,a.jsx)("span",{className:`text-xs px-2 py-1 rounded-full font-semibold ${er?"bg-green-500/15 text-green-500":"bg-red-500/15 text-red-500"}`,children:t(er?"active":"inactive")})]}),(0,a.jsxs)("div",{className:"mt-3 text-xs text-text-muted space-y-1",children:[(0,a.jsxs)("p",{children:[s("protocolTasksLabel")||"Tasks",":"," ",(0,a.jsx)("span",{className:"text-text-main font-semibold",children:Q?.tasks?.total||0})]}),(0,a.jsxs)("p",{children:[s("protocolActiveStreamsLabel")||"Active streams",":"," ",(0,a.jsx)("span",{className:"text-text-main font-semibold",children:en})]})]}),(0,a.jsxs)("div",{className:"mt-3 rounded-lg bg-bg p-3 border border-border/70",children:[(0,a.jsx)("p",{className:"text-xs font-semibold mb-1",children:s("quickStart")||"Quick Start"}),(0,a.jsxs)("code",{className:"text-xs font-mono break-all",children:[ee.replace(/\/v1$/,""),"/a2a"]})]}),(0,a.jsx)("div",{className:"mt-3",children:(0,a.jsxs)(c(),{href:"/dashboard/a2a",className:"text-sm text-primary hover:text-primary-hover transition-colors",children:[s("openA2aDashboard")||"Open A2A management"," →"]})})]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4 bg-bg-subtle",children:[(0,a.jsx)("h4",{className:"font-semibold mb-2",children:s("mcpQuickStartTitle")||"MCP Quick Start"}),(0,a.jsxs)("ol",{className:"text-sm text-text-muted space-y-1 list-decimal list-inside",children:[(0,a.jsx)("li",{children:s("mcpQuickStartStep1")||"Run the MCP server via `omniroute --mcp`."}),(0,a.jsx)("li",{children:s("mcpQuickStartStep2")||"Configure your MCP client to connect over stdio transport."}),(0,a.jsx)("li",{children:s("mcpQuickStartStep3")||"Invoke tools such as `omniroute_get_health` and `omniroute_list_combos`."})]})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-border p-4 bg-bg-subtle",children:[(0,a.jsx)("h4",{className:"font-semibold mb-2",children:s("a2aQuickStartTitle")||"A2A Quick Start"}),(0,a.jsxs)("ol",{className:"text-sm text-text-muted space-y-1 list-decimal list-inside",children:[(0,a.jsx)("li",{children:s("a2aQuickStartStep1")||"Discover the agent card at `/.well-known/agent.json`."}),(0,a.jsx)("li",{children:s("a2aQuickStartStep2")||"Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`."}),(0,a.jsx)("li",{children:s("a2aQuickStartStep3")||"Track and control tasks using `tasks/get` and `tasks/cancel`."})]})]})]})]})}),(0,a.jsx)(r.aF,{isOpen:v,title:s("enableCloudTitle"),onClose:()=>N(!1),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4",children:[(0,a.jsx)("p",{className:"text-sm text-blue-800 dark:text-blue-200 font-medium mb-2",children:s("whatYouGet")}),(0,a.jsxs)("ul",{className:"text-sm text-blue-700 dark:text-blue-300 space-y-1",children:[(0,a.jsxs)("li",{children:["• ",s("cloudBenefitAccess")]}),(0,a.jsxs)("li",{children:["• ",s("cloudBenefitShare")]}),(0,a.jsxs)("li",{children:["• ",s("cloudBenefitPorts")]}),(0,a.jsxs)("li",{children:["• ",s("cloudBenefitEdge")]})]})]}),(0,a.jsxs)("div",{className:"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4",children:[(0,a.jsx)("p",{className:"text-sm text-yellow-800 dark:text-yellow-200 font-medium mb-1",children:t("note")}),(0,a.jsxs)("ul",{className:"text-sm text-yellow-700 dark:text-yellow-300 space-y-1",children:[(0,a.jsxs)("li",{children:["• ",s("cloudSessionNote")]}),(0,a.jsxs)("li",{children:["• ",s("cloudUnstableNote")]})]})]}),(C||E)&&(0,a.jsxs)("div",{className:`flex items-center gap-3 p-3 rounded-lg border transition-all duration-300 ${E?"bg-green-500/10 border-green-500/30":"bg-primary/10 border-primary/30"}`,children:[E?(0,a.jsx)("span",{className:"material-symbols-outlined text-green-500 text-xl",children:"check_circle"}):(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsxs)("p",{className:`text-sm font-medium ${E?"text-green-500":"text-primary"}`,children:[E&&s("cloudConnected"),!E&&"syncing"===A&&s("connectingToCloud"),!E&&"verifying"===A&&s("verifyingConnection")]})})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(r.$n,{onClick:Y,fullWidth:!0,disabled:C||E,children:C?(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===A?s("connecting"):s("verifying")]}):E?(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"check"}),s("connected")]}):s("enableCloud")}),(0,a.jsx)(r.$n,{onClick:()=>N(!1),variant:"ghost",fullWidth:!0,disabled:C||E,children:t("cancel")})]})]})}),(0,a.jsx)(r.aF,{isOpen:k,title:s("disableCloudTitle"),onClose:()=>!C&&w(!1),children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)("div",{className:"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4",children:(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-red-600 dark:text-red-400",children:"warning"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm text-red-800 dark:text-red-200 font-medium mb-1",children:t("warning")}),(0,a.jsx)("p",{className:"text-sm text-red-700 dark:text-red-300",children:s("disableWarning")})]})]})}),C&&(0,a.jsxs)("div",{className:"flex items-center gap-3 p-3 bg-primary/10 border border-primary/30 rounded-lg",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-primary",children:"progress_activity"}),(0,a.jsx)("div",{className:"flex-1",children:(0,a.jsxs)("p",{className:"text-sm font-medium text-primary",children:["syncing"===A&&s("syncingData"),"disabling"===A&&s("disablingCloud")]})})]}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:s("disableConfirm")}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(r.$n,{onClick:K,fullWidth:!0,disabled:C,className:"bg-red-500! hover:bg-red-600! text-white!",children:C?(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-sm",children:"progress_activity"}),"syncing"===A?s("syncing"):s("disabling")]}):s("disableCloud")}),(0,a.jsx)(r.$n,{onClick:()=>w(!1),variant:"ghost",fullWidth:!0,disabled:C,children:t("cancel")})]})]})}),R&&(0,a.jsx)(h,{provider:R,models:o,copy:z,copied:F,onClose:()=>D(null)})]})}function h({provider:e,models:s,copy:t,copied:i,onClose:n}){let o=(0,x.c)("endpoint"),c=(0,x.c)("common"),d=e.provider.alias||e.id,m=(0,l.useMemo)(()=>s.filter(s=>!s.parent&&(s.owned_by===d||s.owned_by===e.id)),[s,d,e.id]),p=m.filter(e=>!e.type),u=m.filter(e=>"embedding"===e.type),b=m.filter(e=>"image"===e.type),h=(e,s,l)=>0===l.length?null:(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsxs)("h4",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider mb-2 flex items-center gap-1.5",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:s}),e," (",l.length,")"]}),(0,a.jsx)("div",{className:"flex flex-col gap-1",children:l.map(e=>{let s=`modal-${e.id}`;return(0,a.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-surface/60 group",children:[(0,a.jsx)("code",{className:"text-sm font-mono flex-1 truncate",children:e.id}),e.custom&&(0,a.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-primary/10 text-primary",children:o("custom")}),(0,a.jsx)("button",{onClick:()=>t(e.id,s),className:"p-1 hover:bg-sidebar rounded text-text-muted hover:text-primary opacity-0 group-hover:opacity-100 transition-opacity",title:c("copy"),children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:i===s?"check":"content_copy"})})]},e.id)})})]});return(0,a.jsx)(r.aF,{isOpen:!0,onClose:n,title:o("providerModelsTitle",{provider:e.provider.name}),children:(0,a.jsx)("div",{className:"max-h-[60vh] overflow-y-auto",children:0===m.length?(0,a.jsx)("p",{className:"text-sm text-text-muted py-4 text-center",children:o("noModelsForProvider")}):(0,a.jsxs)(a.Fragment,{children:[h(o("chat"),"chat",p),h(o("embedding"),"data_array",u),h(o("image"),"image",b)]})})})}function g({icon:e,iconColor:s,iconBg:t,title:r,path:i,description:n,models:o,expanded:c,onToggle:d,copy:p,copied:u,baseUrl:b}){let h=(0,x.c)("endpoint"),g=(0,l.useMemo)(()=>{let e={};for(let s of o){let t=s.owned_by||"unknown";e[t]||(e[t]=[]),e[t].push(s)}return Object.entries(e).sort((e,s)=>s[1].length-e[1].length)},[o]),f=e=>m.Q2[e]||(0,m.zt)(e),j=`endpoint_${i}`;return(0,a.jsxs)("div",{className:"border border-border rounded-lg overflow-hidden",children:[(0,a.jsxs)("button",{onClick:d,className:"w-full flex items-center gap-3 p-4 hover:bg-surface/50 transition-colors text-left",children:[(0,a.jsx)("div",{className:`flex items-center justify-center size-10 rounded-lg ${t} shrink-0`,children:(0,a.jsx)("span",{className:`material-symbols-outlined text-xl ${s}`,children:e})}),(0,a.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-semibold text-sm",children:r}),(0,a.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-full bg-surface text-text-muted font-medium",children:h("modelsCount",{count:o.length})})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-0.5",children:n})]}),(0,a.jsx)("span",{className:`material-symbols-outlined text-text-muted text-lg transition-transform ${c?"rotate-180":""}`,children:"expand_more"})]}),c&&(0,a.jsxs)("div",{className:"border-t border-border px-4 pb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mt-3 mb-3",children:[(0,a.jsxs)("code",{className:"flex-1 text-xs font-mono text-text-muted bg-surface/80 px-3 py-1.5 rounded-lg truncate",children:[b.replace(/\/v1$/,""),i]}),(0,a.jsx)("button",{onClick:()=>p(`${b.replace(/\/v1$/,"")}${i}`,j),className:"p-1.5 hover:bg-surface rounded-lg text-text-muted hover:text-primary transition-colors shrink-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:u===j?"check":"content_copy"})})]}),(0,a.jsx)("div",{className:"flex flex-col gap-2",children:g.map(([e,s])=>(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,a.jsx)("div",{className:"size-2.5 rounded-full shrink-0",style:{backgroundColor:f(e)?.color||"#888"}}),(0,a.jsx)("span",{className:"text-xs font-semibold text-text-main",children:f(e)?.name||e}),(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:["(",s.length,")"]})]}),(0,a.jsx)("div",{className:"ml-5 flex flex-wrap gap-1.5",children:s.map(e=>(0,a.jsx)("span",{className:"text-xs px-2 py-0.5 rounded-md bg-surface/80 text-text-muted font-mono",title:e.id,children:e.root||e.id.split("/").pop()},e.id))})]},e))})]})]})}b.propTypes={machineId:n().string.isRequired},h.propTypes={provider:n().object.isRequired,models:n().array.isRequired,copy:n().func.isRequired,copied:n().string,onClose:n().func.isRequired},g.propTypes={icon:n().string.isRequired,iconColor:n().string.isRequired,iconBg:n().string.isRequired,title:n().string.isRequired,path:n().string.isRequired,description:n().string.isRequired,models:n().array.isRequired,expanded:n().bool.isRequired,onToggle:n().func.isRequired,copy:n().func.isRequired,copied:n().string,baseUrl:n().string.isRequired};var f=t(24726),j=t(14816);function y(){let e=(0,x.c)("endpoints");return(0,a.jsxs)("div",{className:"p-6 max-w-5xl mx-auto space-y-6",children:[(0,a.jsxs)(r.Zp,{className:"p-8 text-center space-y-4",children:[(0,a.jsx)("div",{className:"flex items-center justify-center size-16 rounded-2xl bg-primary/10 text-primary mx-auto",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:"code"})}),(0,a.jsx)("h2",{className:"text-xl font-semibold",children:e("apiEndpointsTitle")}),(0,a.jsx)("p",{className:"text-sm text-text-muted max-w-md mx-auto",children:e("apiEndpointsDescription")}),(0,a.jsxs)("div",{className:"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-amber-500/10 text-amber-500 text-sm font-medium",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"construction"}),e("comingSoon")]})]}),(0,a.jsxs)(r.Zp,{className:"p-5",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold mb-3",children:e("plannedFeatures")}),(0,a.jsxs)("ul",{className:"space-y-2 text-sm text-text-muted",children:[(0,a.jsxs)("li",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check_circle"}),e("featureRestApi")]}),(0,a.jsxs)("li",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check_circle"}),e("featureWebhooks")]}),(0,a.jsxs)("li",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check_circle"}),e("featureSwagger")]}),(0,a.jsxs)("li",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check_circle"}),e("featureAuth")]})]})]})]})}function v({label:e,status:s,enabled:t,onToggle:l,toggling:r}){return(0,a.jsxs)("div",{className:"flex items-center gap-3 ml-auto",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border",style:{borderColor:s.loading?"var(--color-border)":s.online?"rgba(34,197,94,0.3)":"rgba(239,68,68,0.3)",background:s.loading?"transparent":s.online?"rgba(34,197,94,0.1)":"rgba(239,68,68,0.1)",color:s.loading?"var(--color-text-muted)":s.online?"rgb(34,197,94)":"rgb(239,68,68)"},children:[(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full",style:{background:s.loading?"var(--color-text-muted)":s.online?"rgb(34,197,94)":"rgb(239,68,68)",animation:s.online?"pulse 2s infinite":"none"}}),s.loading?"...":s.online?"Online":"Offline"]}),(0,a.jsx)("button",{onClick:l,disabled:r,className:"relative inline-flex items-center h-7 w-[52px] rounded-full transition-all duration-300 focus:outline-none border",style:{background:t?"rgb(34,197,94)":"var(--color-bg-tertiary)",borderColor:t?"rgba(34,197,94,0.5)":"var(--color-border)",opacity:r?.6:1,cursor:r?"wait":"pointer"},title:t?`Disable ${e}`:`Enable ${e}`,children:(0,a.jsx)("span",{className:"inline-block w-5 h-5 rounded-full shadow-md transition-all duration-300",style:{transform:t?"translateX(26px)":"translateX(3px)",background:t?"#fff":"var(--color-text-muted)"}})}),(0,a.jsx)("span",{className:"text-xs font-medium min-w-[24px]",style:{color:t?"rgb(34,197,94)":"var(--color-text-muted)"},children:r?"...":t?"ON":"OFF"})]})}function N({value:e,onChange:s,disabled:t,baseUrl:l}){let r={stdio:"omniroute --mcp",sse:`${l}/api/mcp/sse`,"streamable-http":`${l}/api/mcp/stream`};return(0,a.jsxs)("div",{className:"rounded-lg border p-4 mt-3",style:{borderColor:"var(--color-border)",background:"var(--color-bg-secondary)"},children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"material-symbols-rounded text-base",style:{color:"var(--color-primary)"},children:"swap_horiz"}),(0,a.jsx)("span",{className:"text-sm font-medium",style:{color:"var(--color-text)"},children:"Transport Mode"})]}),(0,a.jsx)("div",{className:"flex gap-2 flex-wrap",children:[{value:"stdio",label:"stdio",desc:"Local — IDE spawns process via omniroute --mcp"},{value:"sse",label:"SSE",desc:"Remote — Server-Sent Events over HTTP"},{value:"streamable-http",label:"Streamable HTTP",desc:"Remote — Modern bidirectional HTTP"}].map(l=>(0,a.jsxs)("button",{onClick:()=>s(l.value),disabled:t,className:"flex flex-col items-start px-4 py-2.5 rounded-lg border transition-all duration-200 text-left",style:{borderColor:e===l.value?"var(--color-primary)":"var(--color-border)",background:e===l.value?"rgba(var(--color-primary-rgb, 99,102,241), 0.1)":"transparent",opacity:t?.5:1,cursor:t?"wait":"pointer"},children:[(0,a.jsx)("span",{className:"text-sm font-semibold",style:{color:e===l.value?"var(--color-primary)":"var(--color-text)"},children:l.label}),(0,a.jsx)("span",{className:"text-xs mt-0.5",style:{color:"var(--color-text-muted)"},children:l.desc})]},l.value))}),(0,a.jsxs)("div",{className:"mt-3 rounded-md px-3 py-2 flex items-center gap-2",style:{background:"var(--color-bg-tertiary)"},children:[(0,a.jsx)("span",{className:"material-symbols-rounded text-sm",style:{color:"var(--color-text-muted)"},children:"stdio"===e?"terminal":"link"}),(0,a.jsx)("code",{className:"text-xs break-all",style:{color:"var(--color-text-muted)"},children:r[e]}),"stdio"!==e&&(0,a.jsx)("button",{className:"ml-auto text-xs px-2 py-0.5 rounded border hover:opacity-80 transition-opacity",style:{borderColor:"var(--color-border)",color:"var(--color-text-muted)"},onClick:()=>void navigator.clipboard.writeText(r[e]),title:"Copy URL",children:"Copy"})]})]})}function k(){let[e,s]=(0,l.useState)("endpoint-proxy"),t=(0,x.c)("endpoints"),[i,n]=(0,l.useState)({online:!1,loading:!0}),[o,c]=(0,l.useState)({online:!1,loading:!0}),[d,m]=(0,l.useState)(!1),[p,u]=(0,l.useState)(!1),[h,g]=(0,l.useState)(!1),[k,w]=(0,l.useState)(!1),[C,S]=(0,l.useState)("stdio"),[T,_]=(0,l.useState)(!1),[A,P]=(0,l.useState)("");(0,l.useEffect)(()=>{P(`${window.location.protocol}//${window.location.host}`)},[]),(0,l.useEffect)(()=>{(async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();m(!!s.mcpEnabled),u(!!s.a2aEnabled),S(s.mcpTransport||"stdio")}}catch{}})()},[]);let E=(0,l.useCallback)(async e=>fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),[]),$=(0,l.useCallback)(async e=>{let s="mcp"===e?g:w,t=!("mcp"===e?d:p);s(!0);try{(await E({["mcp"===e?"mcpEnabled":"a2aEnabled"]:t})).ok&&("mcp"===e?m:u)(t)}catch{}finally{s(!1)}},[d,p,E]),R=(0,l.useCallback)(async e=>{_(!0);try{(await E({mcpTransport:e})).ok&&S(e)}catch{}finally{_(!1)}},[E]),D=(0,l.useCallback)(async()=>{n(e=>({...e,loading:!0}));try{let e=await fetch("/api/mcp/status");if(e.ok){let s=await e.json();n({online:!!s.online,loading:!1})}else n({online:!1,loading:!1})}catch{n({online:!1,loading:!1})}},[]),M=(0,l.useCallback)(async()=>{c(e=>({...e,loading:!0}));try{let e=await fetch("/api/a2a/status");if(e.ok){let s=await e.json();c({online:"ok"===s.status,loading:!1})}else c({online:!1,loading:!1})}catch{c({online:!1,loading:!1})}},[]);return(0,l.useEffect)(()=>{let e=()=>{D(),M()};e();let s=setInterval(e,3e4);return()=>clearInterval(s)},[D,M]),(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,a.jsx)(r.Iz,{options:[{value:"endpoint-proxy",label:t("tabProxy"),icon:"api"},{value:"mcp",label:"MCP",icon:"hub"},{value:"a2a",label:"A2A",icon:"group_work"},{value:"api-endpoints",label:t("tabApiEndpoints"),icon:"code"}],value:e,onChange:s}),"mcp"===e&&(0,a.jsx)(v,{label:"MCP",status:i,enabled:d,onToggle:()=>void $("mcp"),toggling:h}),"a2a"===e&&(0,a.jsx)(v,{label:"A2A",status:o,enabled:p,onToggle:()=>void $("a2a"),toggling:k})]}),"mcp"===e&&d&&(0,a.jsx)(N,{value:C,onChange:e=>void R(e),disabled:T,baseUrl:A}),"endpoint-proxy"===e&&(0,a.jsx)(b,{machineId:""}),"mcp"===e&&(0,a.jsx)(f.default,{}),"a2a"===e&&(0,a.jsx)(j.default,{}),"api-endpoints"===e&&(0,a.jsx)(y,{})]})}},94388:(e,s,t)=>{Promise.resolve().then(t.bind(t,21583))}},e=>{e.O(0,[8500,3418,9751,8055,1149,5846,647,4726,4816,8441,3794,7358],()=>e(e.s=94388)),_N_E=e.O()}]);
|
|
File without changes
|
|
File without changes
|