aigetwey 1.3.6 → 1.3.8
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/CHANGELOG.md +33 -0
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/build-manifest.json +3 -3
- package/dashboard/.next/diagnostics/route-bundle-stats.json +27 -27
- package/dashboard/.next/fallback-build-manifest.json +3 -3
- package/dashboard/.next/server/app/(console)/combos/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/config/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/console/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/endpoint/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/providers/[id]/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/providers/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/quota/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/tools/[id]/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/tools/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/(console)/usage/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/_global-error.html +1 -1
- package/dashboard/.next/server/app/_global-error.rsc +1 -1
- package/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/_not-found.html +1 -1
- package/dashboard/.next/server/app/_not-found.rsc +2 -2
- package/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/combos.html +1 -1
- package/dashboard/.next/server/app/combos.rsc +5 -5
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/combos.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/combos.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/combos.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/config.html +1 -1
- package/dashboard/.next/server/app/config.rsc +5 -5
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/config.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/config.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/config.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/console.html +1 -1
- package/dashboard/.next/server/app/console.rsc +5 -5
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/console.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/console.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/console.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/endpoint.html +1 -1
- package/dashboard/.next/server/app/endpoint.rsc +5 -5
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/endpoint.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/endpoint.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/endpoint.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/server/app/index.rsc +5 -5
- package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/login.html +1 -1
- package/dashboard/.next/server/app/login.rsc +2 -2
- package/dashboard/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/dashboard/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/dashboard/.next/server/app/providers.html +1 -1
- package/dashboard/.next/server/app/providers.rsc +5 -5
- package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers.segment.rsc +1 -1
- package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/providers.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/providers.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/providers.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/quota.html +1 -1
- package/dashboard/.next/server/app/quota.rsc +5 -5
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/quota.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/quota.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/quota.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/app/tools.html +1 -1
- package/dashboard/.next/server/app/tools.rsc +5 -5
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
- package/dashboard/.next/server/app/tools.segments/_full.segment.rsc +5 -5
- package/dashboard/.next/server/app/tools.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/server/app/tools.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/server/chunks/[root-of-the-server]__043un18._.js +1 -1
- package/dashboard/.next/server/chunks/[root-of-the-server]__043un18._.js.map +1 -1
- package/dashboard/.next/server/chunks/_0digmky._.js +1 -1
- package/dashboard/.next/server/chunks/_0digmky._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/_1jt-_lv._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/_1jt-_lv._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/_1mumvwn._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/_1mumvwn._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_0nuo5yx._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_0nuo5yx._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_EndpointView_tsx_0awdzb5._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_EndpointView_tsx_0awdzb5._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_ProviderDetail_tsx_06sxu0r._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_ProviderDetail_tsx_06sxu0r._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_ToolDetail_tsx_0qperd-._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_ToolDetail_tsx_0qperd-._.js.map +1 -1
- package/dashboard/.next/server/middleware-build-manifest.js +3 -3
- package/dashboard/.next/server/pages/404.html +1 -1
- package/dashboard/.next/server/pages/500.html +1 -1
- package/dashboard/.next/static/chunks/{0_fo_1xhw25rd.js → 063d_vdu_m-g_.js} +1 -1
- package/dashboard/.next/static/chunks/{3i6nr2y3h_7s2.js → 0tq5u12liycmg.js} +1 -1
- package/dashboard/.next/static/chunks/{17nxt0zmkvdgv.js → 13824732j7-dk.js} +1 -1
- package/dashboard/.next/static/chunks/{00415cmd3ji2s.js → 16vbdc0g5xea0.js} +1 -1
- package/dashboard/.next/static/chunks/{05i93ivai9obr.js → 3mhsmb2ks1vev.js} +1 -1
- package/dashboard/.next/static/chunks/452cgglyyo7hp.css +3 -0
- package/dashboard/.next/trace +1 -1
- package/dashboard/.next/trace-build +1 -1
- package/dashboard/src/components/EndpointView.tsx +13 -7
- package/dashboard/src/components/ProviderDetail.tsx +1 -1
- package/dashboard/src/components/ProviderManager.tsx +1 -1
- package/dashboard/src/components/ToolDetail.tsx +160 -20
- package/dashboard/src/components/TopBar.tsx +33 -15
- package/dashboard/src/lib/session.ts +6 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +1 -1
- package/dashboard/.next/static/chunks/2284qz1hy9776.css +0 -3
- /package/dashboard/.next/static/{kpgVHg6Rdnh2YUO8-xGjX → l0QkSM6jT0jiUc4m4dh6K}/_buildManifest.js +0 -0
- /package/dashboard/.next/static/{kpgVHg6Rdnh2YUO8-xGjX → l0QkSM6jT0jiUc4m4dh6K}/_clientMiddlewareManifest.js +0 -0
- /package/dashboard/.next/static/{kpgVHg6Rdnh2YUO8-xGjX → l0QkSM6jT0jiUc4m4dh6K}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ToolDetail.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { RichCard, CardTitle } from \"@/components/RichCard\";\nimport { Badge } from \"@/components/Badge\";\nimport { Button, Select } from \"@/components/Button\";\nimport { ModelPicker, type ModelGroup } from \"@/components/ModelPicker\";\nimport { Icon } from \"@/components/Icon\";\nimport { Empty } from \"@/components/ui\";\nimport { adminApi, cliConfig, type CliStatus } from \"@/lib/client\";\nimport { toolById } from \"@/lib/cliTools\";\nimport { modalitiesForModel } from \"@/lib/capabilities\";\nimport type { EndpointPayload, MaskedConfig } from \"@/lib/gateway\";\n\n/** Step-by-step setup for one CLI tool, with copy-ready env (real key inlined). */\nexport function ToolDetail({ id }: { id: string }) {\n const router = useRouter();\n const tool = toolById(id);\n const [ep, setEp] = useState<EndpointPayload | null>(null);\n const [combos, setCombos] = useState<string[]>([]);\n const [keyIdx, setKeyIdx] = useState(0);\n const [realKey, setRealKey] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [cli, setCli] = useState<CliStatus | null>(null);\n const [cliBusy, setCliBusy] = useState<\"\" | \"apply\" | \"reset\">(\"\");\n const [cliMsg, setCliMsg] = useState(\"\");\n const [allModels, setAllModels] = useState<string[]>([]);\n const [groups, setGroups] = useState<ModelGroup[]>([]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [picked, setPicked] = useState<string[]>([]); // openai tools: chosen models\n const [active, setActive] = useState(\"\"); // openai tools: default/active model\n const [slots, setSlots] = useState({ opus: \"\", sonnet: \"\", haiku: \"\" }); // claude\n const isAnthropic = tool?.format === \"anthropic\";\n\n function togglePicked(v: string) {\n if (picked.includes(v)) {\n setPicked((p) => p.filter((x) => x !== v));\n if (active === v) setActive(\"\");\n } else {\n setPicked((p) => [...p, v]);\n if (!active) setActive(v);\n }\n }\n\n const loadCli = useCallback(async () => {\n if (!tool?.autoConfig) return;\n const r = await cliConfig.status(tool.id);\n setCli(r.data);\n }, [tool]);\n useEffect(() => { void loadCli(); }, [loadCli]);\n\n // seed the editable selection from whatever is already in the tool's config.\n useEffect(() => {\n if (!cli?.installed) return;\n if (isAnthropic && cli.modelSlots) {\n setSlots({ opus: cli.modelSlots.opus ?? \"\", sonnet: cli.modelSlots.sonnet ?? \"\", haiku: cli.modelSlots.haiku ?? \"\" });\n } else if (!isAnthropic && cli.models && cli.models.length > 0) {\n setPicked(cli.models);\n setActive(cli.activeModel ?? cli.models[0] ?? \"\");\n }\n }, [cli, isAnthropic]);\n\n async function applyCli() {\n if (!tool || !ep) return;\n setCliMsg(\"\");\n const baseUrl = `http://127.0.0.1:${ep.port}`; // gateway root; opencode route appends /v1\n const key = ep.keys.length ? realKey || undefined : undefined;\n if (isAnthropic) {\n const m: Record<string, string> = {};\n if (slots.opus) m.opus = slots.opus;\n if (slots.sonnet) m.sonnet = slots.sonnet;\n if (slots.haiku) m.haiku = slots.haiku;\n setCliBusy(\"apply\");\n const r = await cliConfig.apply(tool.id, { base: baseUrl, key, models: m });\n setCliBusy(\"\");\n setCliMsg(r.ok ? \"Wrote config ✓\" : r.error ?? \"failed\");\n if (r.ok) void loadCli();\n return;\n }\n if (picked.length === 0) { setCliMsg(\"add at least one model\"); return; }\n setCliBusy(\"apply\");\n const r = await cliConfig.apply(tool.id, { base: baseUrl, key, models: picked, active });\n setCliBusy(\"\");\n setCliMsg(r.ok ? \"Wrote config ✓\" : r.error ?? \"failed\");\n if (r.ok) void loadCli();\n }\n\n async function resetCli() {\n if (!tool) return;\n setCliBusy(\"reset\");\n setCliMsg(\"\");\n const r = await cliConfig.reset(tool.id);\n setCliBusy(\"\");\n if (r.ok) { setCliMsg(\"Removed gateway config ✓\"); void loadCli(); }\n else setCliMsg(r.error ?? \"failed\");\n }\n\n useEffect(() => {\n void (async () => {\n const [epRes, cfgRes] = await Promise.all([\n fetch(\"/api/gw/admin/endpoint\"),\n fetch(\"/api/gw/admin/config\"),\n ]);\n if (!epRes.ok) {\n setError(\"could not reach the gateway\");\n return;\n }\n setEp((await epRes.json()) as EndpointPayload);\n if (cfgRes.ok) {\n const cfg = (await cfgRes.json()) as MaskedConfig;\n const aliases = cfg.models.map((m) => m.alias);\n setCombos(aliases);\n // disabled providers are skipped in routing, so hide their models here.\n const liveProviders = cfg.providers.filter((p) => !p.disabled);\n // everything callable: combo aliases + every (enabled) provider/model ref.\n const refs = liveProviders.flatMap((p) => p.models.map((m) => `${p.id}/${m.id}`));\n setAllModels([...aliases, ...refs]);\n // grouped for the picker: Combos first, then one group per provider.\n const grps: ModelGroup[] = [];\n if (aliases.length) grps.push({ label: \"Combos\", items: aliases.map((a) => ({ value: a, label: a })) });\n for (const p of liveProviders) {\n if (p.models.length) grps.push({ label: p.id, items: p.models.map((m) => ({ value: `${p.id}/${m.id}`, label: `${p.id}/${m.id}` })) });\n }\n setGroups(grps);\n }\n })();\n }, []);\n\n // reveal the selected gateway key so the env block is copy-ready (the whole\n // point of this page is to paste a working config locally).\n useEffect(() => {\n if (!ep || ep.keys.length === 0) return;\n void adminApi.revealServerKey(keyIdx).then((r) => setRealKey(r.ok ? r.data?.key ?? \"\" : \"\"));\n }, [ep, keyIdx]);\n\n if (!tool) return <Empty>Unknown tool.</Empty>;\n if (error) return <Empty>{error}</Empty>;\n if (!ep) return <Empty>Loading…</Empty>;\n\n const base = `http://127.0.0.1:${ep.port}`;\n const env = tool.env(base, realKey);\n const block = env.map((e) => `export ${e.name}=\"${e.value}\"`).join(\"\\n\");\n\n // opencode reads models from ~/.config/opencode/opencode.json, not shell env.\n // Show the exact JSON the auto-apply would MERGE — so the models are visible and\n // it's clear nothing else gets replaced (other providers + your other keys stay).\n const ocModels = picked.length ? picked : cli?.models ?? [];\n const opencodeJson =\n tool.id === \"opencode\"\n ? JSON.stringify(\n {\n provider: {\n aigetwey: {\n npm: \"@ai-sdk/openai-compatible\",\n options: { baseURL: `${base}/v1`, apiKey: realKey || \"aigetwey\" },\n models: Object.fromEntries(ocModels.map((m) => [m, { name: m, modalities: modalitiesForModel(m) }])),\n },\n },\n model: `aigetwey/${active || ocModels[0] || \"\"}`,\n },\n null,\n 2,\n )\n : null;\n\n // Claude Code reads its config from ~/.claude/settings.json — show the exact\n // env block the auto-apply writes (merged into the existing settings).\n const claudeJson =\n tool.id === \"claude-code\"\n ? JSON.stringify(\n {\n hasCompletedOnboarding: true,\n env: {\n ANTHROPIC_BASE_URL: base,\n API_TIMEOUT_MS: \"600000\",\n ...(realKey ? { ANTHROPIC_AUTH_TOKEN: realKey } : {}),\n ...(slots.opus ? { ANTHROPIC_DEFAULT_OPUS_MODEL: slots.opus } : {}),\n ...(slots.sonnet ? { ANTHROPIC_DEFAULT_SONNET_MODEL: slots.sonnet } : {}),\n ...(slots.haiku ? { ANTHROPIC_DEFAULT_HAIKU_MODEL: slots.haiku } : {}),\n },\n },\n null,\n 2,\n )\n : null;\n\n return (\n <div>\n <button onClick={() => router.push(\"/tools\")} className=\"mb-4 inline-flex items-center gap-1 text-[12px] text-text-muted hover:text-text\">\n <Icon name=\"arrow_back\" size={15} /> CLI Tools\n </button>\n\n <div className=\"mb-6 flex items-center gap-3\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-brand bg-surface-2 text-text-muted\">\n <Icon name={tool.icon} size={20} />\n </span>\n <h1 className=\"text-[22px] font-semibold tracking-tight text-text\">{tool.name}</h1>\n <Badge tone=\"info\">{tool.format}</Badge>\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n {tool.autoConfig && (\n <RichCard\n className=\"lg:col-span-2\"\n header={\n <>\n <CardTitle title=\"Local setup\" sub=\"detect this tool on your machine and write its config for you\" />\n {cli && (\n <Badge tone={!cli.installed ? \"neutral\" : cli.configured ? \"live\" : \"warn\"}>\n {!cli.installed ? \"not detected\" : cli.configured ? \"configured\" : \"detected\"}\n </Badge>\n )}\n </>\n }\n >\n {!cli ? (\n <p className=\"text-[12.5px] text-text-subtle\">Checking your machine…</p>\n ) : !cli.installed ? (\n <p className=\"text-[12.5px] text-text-muted\">\n Not found on this machine. Install it (above) or paste the manual env below — then re-open this page.\n </p>\n ) : (\n <div className=\"space-y-3\">\n <SetupRow label=\"Endpoint\">\n <span className=\"tnum text-[12.5px] text-text\">{isAnthropic ? base : `${base}/v1`}</span>\n </SetupRow>\n\n {ep.keys.length > 0 && (\n <SetupRow label=\"API Key\">\n <Select value={String(keyIdx)} onChange={(e) => setKeyIdx(Number(e.target.value))} className=\"max-w-[260px]\">\n {ep.keys.map((k, i) => (\n <option key={i} value={i}>{k.name || `key ${i + 1}`}</option>\n ))}\n </Select>\n </SetupRow>\n )}\n\n {isAnthropic ? (\n <SetupRow label=\"Models\" top>\n <div className=\"flex flex-col gap-2\">\n {([\"opus\", \"sonnet\", \"haiku\"] as const).map((slot) => (\n <div key={slot} className=\"flex items-center gap-2\">\n <span className=\"w-16 text-[12px] capitalize text-text-subtle\">{slot}</span>\n <Select value={slots[slot]} onChange={(e) => setSlots((s) => ({ ...s, [slot]: e.target.value }))} className=\"flex-1\">\n <option value=\"\">— none —</option>\n {allModels.map((m) => <option key={m} value={m}>{m}</option>)}\n </Select>\n </div>\n ))}\n </div>\n </SetupRow>\n ) : (\n <SetupRow label=\"Models\" top>\n <div>\n <div className=\"flex min-h-[34px] flex-wrap gap-1.5 rounded-brand border border-border-subtle bg-bg px-2 py-1.5\">\n {picked.length === 0 ? (\n <span className=\"text-[12px] text-text-subtle\">No models — add one below.</span>\n ) : (\n picked.map((m) => (\n <span\n key={m}\n onClick={() => setActive((a) => (a === m ? \"\" : m))}\n title={m === active ? \"active model — click to clear\" : \"click to set active\"}\n className={`inline-flex cursor-pointer items-center gap-1 rounded px-2 py-0.5 text-[12px] transition-colors ${\n m === active ? \"border border-accent bg-accent-soft text-accent\" : \"border border-transparent bg-surface-2 text-text-muted hover:border-border\"\n }`}\n >\n {m === active && <Icon name=\"star\" size={11} />}\n <span className=\"tnum\">{m}</span>\n <button\n onClick={(e) => { e.stopPropagation(); setPicked((p) => p.filter((x) => x !== m)); setActive((a) => (a === m ? \"\" : a)); }}\n className=\"hover:text-danger\"\n aria-label={`Remove ${m}`}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n ))\n )}\n </div>\n <div className=\"mt-1.5 flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => setPickerOpen(true)}>\n <Icon name=\"add\" size={15} /> Add models\n </Button>\n <span className=\"text-[11.5px] text-text-subtle\">\n {active ? <>active: <span className=\"tnum text-accent\">{active}</span></> : picked.length ? \"click a chip to set active\" : \"\"}\n </span>\n </div>\n </div>\n </SetupRow>\n )}\n\n {cli.configured && cli.baseUrl && (\n <SetupRow label=\"Current\">\n <span className=\"tnum text-[11.5px] text-text-subtle\">{cli.baseUrl}</span>\n </SetupRow>\n )}\n\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <Button onClick={applyCli} disabled={cliBusy === \"apply\"}>\n <Icon name={cliBusy === \"apply\" ? \"progress_activity\" : \"bolt\"} size={15} />\n {cliBusy === \"apply\" ? \"Applying…\" : cli.configured ? \"Re-apply\" : \"Apply config\"}\n </Button>\n {cli.configured && (\n <Button variant=\"ghost\" onClick={resetCli} disabled={cliBusy === \"reset\"}>\n {cliBusy === \"reset\" ? \"Removing…\" : \"Reset\"}\n </Button>\n )}\n {cliMsg && <span className=\"text-[12px] text-text-subtle\">{cliMsg}</span>}\n {cli.path && <span className=\"ml-auto truncate tnum text-[11px] text-text-subtle\">{cli.path}</span>}\n </div>\n </div>\n )}\n </RichCard>\n )}\n\n {tool.install && (\n <RichCard header={<CardTitle title=\"Install\" />}>\n <CopyBlock text={tool.install} />\n </RichCard>\n )}\n\n <RichCard\n className={tool.install ? \"\" : \"lg:col-span-2\"}\n header={\n <>\n <CardTitle title=\"Environment\" sub=\"copy into your shell\" />\n {ep.keys.length > 1 && (\n <Select value={String(keyIdx)} onChange={(e) => setKeyIdx(Number(e.target.value))} className=\"max-w-[180px]\">\n {ep.keys.map((k, i) => (\n <option key={i} value={i}>{k.name || `key ${i + 1}`}</option>\n ))}\n </Select>\n )}\n </>\n }\n >\n <CopyBlock text={block} />\n {ep.keys.length === 0 ? (\n <p className=\"mt-3 text-[12px] text-warning\">\n No gateway key set — auth is disabled. Add one under Endpoint, then it appears here.\n </p>\n ) : (\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Using key <span className=\"text-text-muted\">{ep.keys[keyIdx]?.name || `#${keyIdx + 1}`}</span>. The real value is filled in above.\n </p>\n )}\n </RichCard>\n\n {opencodeJson && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Manual config\" sub=\"merge into ~/.config/opencode/opencode.json — every model listed\" />}\n >\n {ocModels.length === 0 ? (\n <p className=\"text-[12.5px] text-text-muted\">Add models above to see them listed here.</p>\n ) : (\n <CopyBlock text={opencodeJson} />\n )}\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Apply does the same merge for you — it keeps any other providers and existing models, only adding these.\n </p>\n </RichCard>\n )}\n\n {claudeJson && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Manual config\" sub=\"merge the env block into ~/.claude/settings.json\" />}\n >\n <CopyBlock text={claudeJson} />\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Apply does the same merge for you — it keeps the rest of your settings, only writing these env keys.\n </p>\n </RichCard>\n )}\n\n {!tool.autoConfig && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Models to call\" sub=\"name a combo exactly this — the tool will hit it\" />}\n >\n <div className=\"space-y-1.5\">\n {tool.slots.map((s) => {\n const exists = combos.includes(s.alias);\n return (\n <div key={s.alias} className=\"flex items-center gap-3 rounded-brand border border-border-subtle px-3 py-2\">\n <span className=\"w-32 flex-none text-[12px] text-text-subtle\">{s.label}</span>\n <Icon name=\"arrow_forward\" size={14} className=\"flex-none text-text-subtle\" />\n <span className=\"tnum truncate text-[13px] text-text\">{s.alias}</span>\n <span className=\"ml-auto flex flex-none items-center gap-2\">\n {exists ? (\n <Badge tone=\"live\">ready</Badge>\n ) : (\n <>\n <Badge tone=\"warn\">missing</Badge>\n <button\n type=\"button\"\n onClick={() => router.push(\"/combos\")}\n className=\"inline-flex items-center gap-1 text-[12px] text-accent hover:underline\"\n >\n <Icon name=\"add\" size={13} /> create\n </button>\n </>\n )}\n </span>\n </div>\n );\n })}\n </div>\n {combos.length > 0 && (\n <p className=\"mt-2.5 text-[11px] text-text-subtle\">\n Your combos: <span className=\"tnum text-text-muted\">{combos.join(\", \")}</span>\n </p>\n )}\n </RichCard>\n )}\n\n <RichCard className=\"lg:col-span-2\" header={<CardTitle title=\"Steps\" />}>\n <ol className=\"space-y-2.5\">\n {tool.steps.map((s, i) => (\n <li key={i} className=\"flex gap-2.5 text-[13px] text-text-muted\">\n <span className=\"flex h-5 w-5 flex-none items-center justify-center rounded-full bg-surface-2 tnum text-[11px] text-text\">\n {i + 1}\n </span>\n {s}\n </li>\n ))}\n </ol>\n </RichCard>\n </div>\n\n {pickerOpen && (\n <ModelPicker\n title=\"Add models\"\n note=\"Click a model to add it, click again to remove. Then hit Apply.\"\n groups={groups}\n selected={picked}\n onToggle={togglePicked}\n onClose={() => setPickerOpen(false)}\n />\n )}\n </div>\n );\n}\n\n/** label → control row used by the Local setup card (matches aigetwey's layout). */\nfunction SetupRow({ label, children, top }: { label: string; children: React.ReactNode; top?: boolean }) {\n return (\n <div className={`grid grid-cols-[7rem_1fr] gap-3 ${top ? \"items-start\" : \"items-center\"}`}>\n <span className={`text-[12px] font-medium text-text-subtle ${top ? \"pt-1.5\" : \"\"}`}>{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n );\n}\n\nfunction CopyBlock({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n return (\n <div className=\"relative\">\n <pre className=\"overflow-x-auto rounded-brand border border-border-subtle bg-bg px-3 py-2.5 font-mono text-[12.5px] leading-relaxed text-text\">\n {text}\n </pre>\n <button\n onClick={() => {\n void navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n }}\n className=\"absolute right-2 top-2 flex items-center gap-1 rounded-brand border border-border bg-surface px-2 py-1 text-[11px] text-text-muted hover:text-text\"\n >\n <Icon name={copied ? \"check\" : \"content_copy\"} size={13} /> {copied ? \"copied\" : \"copy\"}\n </button>\n </div>\n );\n}\n"],"names":["ToolDetail","id","router","tool","ep","setEp","combos","setCombos","keyIdx","setKeyIdx","realKey","setRealKey","error","setError","cli","setCli","cliBusy","setCliBusy","cliMsg","setCliMsg","allModels","setAllModels","groups","setGroups","pickerOpen","setPickerOpen","picked","setPicked","active","setActive","slots","setSlots","opus","sonnet","haiku","isAnthropic","format","togglePicked","v","includes","p","filter","x","loadCli","autoConfig","r","status","data","installed","modelSlots","models","length","activeModel","applyCli","baseUrl","port","key","keys","undefined","m","apply","base","ok","resetCli","reset","epRes","cfgRes","Promise","all","fetch","json","cfg","aliases","map","alias","liveProviders","providers","disabled","refs","flatMap","grps","push","label","items","a","value","revealServerKey","then","env","block","e","name","join","ocModels","opencodeJson","JSON","stringify","provider","aigetwey","npm","options","baseURL","apiKey","Object","fromEntries","modalities","model","claudeJson","hasCompletedOnboarding","ANTHROPIC_BASE_URL","API_TIMEOUT_MS","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","onClick","className","size","icon","tone","header","title","sub","configured","SetupRow","String","onChange","Number","target","k","i","top","slot","s","stopPropagation","type","variant","path","install","CopyBlock","text","exists","steps","note","selected","onToggle","onClose","children","copied","setCopied","navigator","clipboard","writeText","setTimeout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ToolDetail.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { RichCard, CardTitle } from \"@/components/RichCard\";\nimport { Badge } from \"@/components/Badge\";\nimport { Button, Select } from \"@/components/Button\";\nimport { ModelPicker, type ModelGroup } from \"@/components/ModelPicker\";\nimport { Icon } from \"@/components/Icon\";\nimport { Empty } from \"@/components/ui\";\nimport { adminApi, cliConfig, type CliStatus } from \"@/lib/client\";\nimport { toolById } from \"@/lib/cliTools\";\nimport { modalitiesForModel } from \"@/lib/capabilities\";\nimport type { EndpointPayload, MaskedConfig } from \"@/lib/gateway\";\n\n/** Step-by-step setup for one CLI tool, with copy-ready env (real key inlined). */\nexport function ToolDetail({ id }: { id: string }) {\n const router = useRouter();\n const tool = toolById(id);\n const [ep, setEp] = useState<EndpointPayload | null>(null);\n const [combos, setCombos] = useState<string[]>([]);\n const [keyIdx, setKeyIdx] = useState(0);\n const [realKey, setRealKey] = useState(\"\");\n const [savedBases, setSavedBases] = useState<string[]>([]);\n const [selectedBase, setSelectedBase] = useState(\"\"); // \"\" = auto-detected\n const [customBaseInput, setCustomBaseInput] = useState(\"\");\n const [showCustomBase, setShowCustomBase] = useState(false);\n const [customKey, setCustomKey] = useState(\"\");\n const [showCustomKey, setShowCustomKey] = useState(false);\n const [customKeyInput, setCustomKeyInput] = useState(\"\");\n\n useEffect(() => {\n const bases = JSON.parse(localStorage.getItem(`cli-saved-bases-${id}`) ?? \"[]\") as string[];\n setSavedBases(bases);\n const sel = localStorage.getItem(`cli-selected-base-${id}`) ?? \"\";\n setSelectedBase(sel);\n const key = localStorage.getItem(`cli-custom-key-${id}`) ?? \"\";\n setCustomKey(key);\n }, [id]);\n const [error, setError] = useState(\"\");\n const [cli, setCli] = useState<CliStatus | null>(null);\n const [cliBusy, setCliBusy] = useState<\"\" | \"apply\" | \"reset\">(\"\");\n const [cliMsg, setCliMsg] = useState(\"\");\n const [allModels, setAllModels] = useState<string[]>([]);\n const [groups, setGroups] = useState<ModelGroup[]>([]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerSlot, setPickerSlot] = useState<\"opus\" | \"sonnet\" | \"haiku\" | null>(null); // which slot the picker targets\n const [picked, setPicked] = useState<string[]>([]); // openai tools: chosen models\n const [active, setActive] = useState(\"\"); // openai tools: default/active model\n const [slots, setSlots] = useState({ opus: \"\", sonnet: \"\", haiku: \"\" }); // claude\n const isAnthropic = tool?.format === \"anthropic\";\n\n function togglePicked(v: string) {\n if (picked.includes(v)) {\n setPicked((p) => p.filter((x) => x !== v));\n if (active === v) setActive(\"\");\n } else {\n setPicked((p) => [...p, v]);\n if (!active) setActive(v);\n }\n }\n\n const loadCli = useCallback(async () => {\n if (!tool?.autoConfig) return;\n const r = await cliConfig.status(tool.id);\n setCli(r.data);\n }, [tool]);\n useEffect(() => { void loadCli(); }, [loadCli]);\n\n // seed the editable selection from whatever is already in the tool's config.\n useEffect(() => {\n if (!cli?.installed) return;\n if (isAnthropic && cli.modelSlots) {\n setSlots({ opus: cli.modelSlots.opus ?? \"\", sonnet: cli.modelSlots.sonnet ?? \"\", haiku: cli.modelSlots.haiku ?? \"\" });\n } else if (!isAnthropic && cli.models && cli.models.length > 0) {\n setPicked(cli.models);\n setActive(cli.activeModel ?? cli.models[0] ?? \"\");\n }\n }, [cli, isAnthropic]);\n\n function addCustomBase(url: string) {\n const trimmed = url.trim();\n if (!trimmed) return;\n const next = [trimmed, ...savedBases.filter((b) => b !== trimmed)];\n setSavedBases(next);\n setSelectedBase(trimmed);\n localStorage.setItem(`cli-saved-bases-${id}`, JSON.stringify(next));\n localStorage.setItem(`cli-selected-base-${id}`, trimmed);\n setCustomBaseInput(\"\");\n setShowCustomBase(false);\n }\n\n async function applyCli() {\n if (!tool || !ep) return;\n setCliMsg(\"\");\n localStorage.setItem(`cli-selected-base-${id}`, selectedBase);\n if (customKey.trim()) localStorage.setItem(`cli-custom-key-${id}`, customKey.trim());\n else localStorage.removeItem(`cli-custom-key-${id}`);\n const autoBase = `http://127.0.0.1:${ep.port}`;\n const baseUrl = selectedBase || autoBase;\n const key = customKey.trim() || (ep.keys.length ? realKey || undefined : undefined);\n if (isAnthropic) {\n const m: Record<string, string> = {};\n if (slots.opus) m.opus = slots.opus;\n if (slots.sonnet) m.sonnet = slots.sonnet;\n if (slots.haiku) m.haiku = slots.haiku;\n setCliBusy(\"apply\");\n const r = await cliConfig.apply(tool.id, { base: baseUrl, key, models: m });\n setCliBusy(\"\");\n setCliMsg(r.ok ? \"Wrote config ✓\" : r.error ?? \"failed\");\n if (r.ok) void loadCli();\n return;\n }\n if (picked.length === 0) { setCliMsg(\"add at least one model\"); return; }\n setCliBusy(\"apply\");\n const r = await cliConfig.apply(tool.id, { base: baseUrl, key, models: picked, active });\n setCliBusy(\"\");\n setCliMsg(r.ok ? \"Wrote config ✓\" : r.error ?? \"failed\");\n if (r.ok) void loadCli();\n }\n\n async function resetCli() {\n if (!tool) return;\n setCliBusy(\"reset\");\n setCliMsg(\"\");\n const r = await cliConfig.reset(tool.id);\n setCliBusy(\"\");\n if (r.ok) { setCliMsg(\"Removed gateway config ✓\"); void loadCli(); }\n else setCliMsg(r.error ?? \"failed\");\n }\n\n useEffect(() => {\n void (async () => {\n const [epRes, cfgRes] = await Promise.all([\n fetch(\"/api/gw/admin/endpoint\"),\n fetch(\"/api/gw/admin/config\"),\n ]);\n if (!epRes.ok) {\n setError(\"could not reach the gateway\");\n return;\n }\n setEp((await epRes.json()) as EndpointPayload);\n if (cfgRes.ok) {\n const cfg = (await cfgRes.json()) as MaskedConfig;\n const aliases = cfg.models.map((m) => m.alias);\n setCombos(aliases);\n // disabled providers are skipped in routing, so hide their models here.\n const liveProviders = cfg.providers.filter((p) => !p.disabled);\n // everything callable: combo aliases + every (enabled) provider/model ref.\n const refs = liveProviders.flatMap((p) => p.models.map((m) => `${p.id}/${m.id}`));\n setAllModels([...aliases, ...refs]);\n // grouped for the picker: Combos first, then one group per provider.\n const grps: ModelGroup[] = [];\n if (aliases.length) grps.push({ label: \"Combos\", items: aliases.map((a) => ({ value: a, label: a })) });\n for (const p of liveProviders) {\n if (p.models.length) grps.push({ label: p.id, items: p.models.map((m) => ({ value: `${p.id}/${m.id}`, label: `${p.id}/${m.id}` })) });\n }\n setGroups(grps);\n }\n })();\n }, []);\n\n // reveal the selected gateway key so the env block is copy-ready (the whole\n // point of this page is to paste a working config locally).\n useEffect(() => {\n if (!ep || ep.keys.length === 0) return;\n void adminApi.revealServerKey(keyIdx).then((r) => setRealKey(r.ok ? r.data?.key ?? \"\" : \"\"));\n }, [ep, keyIdx]);\n\n if (!tool) return <Empty>Unknown tool.</Empty>;\n if (error) return <Empty>{error}</Empty>;\n if (!ep) return <Empty>Loading…</Empty>;\n\n const autoBase = `http://127.0.0.1:${ep.port}`;\n const base = selectedBase || autoBase;\n const effectiveKey = customKey.trim() || realKey;\n const env = tool.env(base, effectiveKey);\n const block = env.map((e) => `export ${e.name}=\"${e.value}\"`).join(\"\\n\");\n\n // opencode reads models from ~/.config/opencode/opencode.json, not shell env.\n // Show the exact JSON the auto-apply would MERGE — so the models are visible and\n // it's clear nothing else gets replaced (other providers + your other keys stay).\n const ocModels = picked.length ? picked : cli?.models ?? [];\n const opencodeJson =\n tool.id === \"opencode\"\n ? JSON.stringify(\n {\n provider: {\n aigetwey: {\n npm: \"@ai-sdk/openai-compatible\",\n options: { baseURL: `${base}/v1`, apiKey: realKey || \"aigetwey\" },\n models: Object.fromEntries(ocModels.map((m) => [m, { name: m, modalities: modalitiesForModel(m) }])),\n },\n },\n model: `aigetwey/${active || ocModels[0] || \"\"}`,\n },\n null,\n 2,\n )\n : null;\n\n // Claude Code reads its config from ~/.claude/settings.json — show the exact\n // env block the auto-apply writes (merged into the existing settings).\n const claudeJson =\n tool.id === \"claude-code\"\n ? JSON.stringify(\n {\n hasCompletedOnboarding: true,\n env: {\n ANTHROPIC_BASE_URL: base,\n API_TIMEOUT_MS: \"600000\",\n ...(realKey ? { ANTHROPIC_AUTH_TOKEN: realKey } : {}),\n ...(slots.opus ? { ANTHROPIC_DEFAULT_OPUS_MODEL: slots.opus } : {}),\n ...(slots.sonnet ? { ANTHROPIC_DEFAULT_SONNET_MODEL: slots.sonnet } : {}),\n ...(slots.haiku ? { ANTHROPIC_DEFAULT_HAIKU_MODEL: slots.haiku } : {}),\n },\n },\n null,\n 2,\n )\n : null;\n\n return (\n <div>\n <button onClick={() => router.push(\"/tools\")} className=\"mb-4 inline-flex items-center gap-1 text-[12px] text-text-muted hover:text-text\">\n <Icon name=\"arrow_back\" size={15} /> CLI Tools\n </button>\n\n <div className=\"mb-6 flex items-center gap-3\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-brand bg-surface-2 text-text-muted\">\n <Icon name={tool.icon} size={20} />\n </span>\n <h1 className=\"text-[22px] font-semibold tracking-tight text-text\">{tool.name}</h1>\n <Badge tone=\"info\">{tool.format}</Badge>\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n {tool.autoConfig && (\n <RichCard\n className=\"lg:col-span-2\"\n header={\n <>\n <CardTitle title=\"Local setup\" sub=\"detect this tool on your machine and write its config for you\" />\n {cli && (\n <Badge tone={!cli.installed ? \"neutral\" : cli.configured ? \"live\" : \"warn\"}>\n {!cli.installed ? \"not detected\" : cli.configured ? \"configured\" : \"detected\"}\n </Badge>\n )}\n </>\n }\n >\n {!cli ? (\n <p className=\"text-[12.5px] text-text-subtle\">Checking your machine…</p>\n ) : !cli.installed ? (\n <p className=\"text-[12.5px] text-text-muted\">\n Not found on this machine. Install it (above) or paste the manual env below — then re-open this page.\n </p>\n ) : (\n <div className=\"space-y-3\">\n <SetupRow label=\"Endpoint\">\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-2\">\n <Select\n value={selectedBase || \"__auto__\"}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"__custom__\") { setShowCustomBase(true); return; }\n const next = v === \"__auto__\" ? \"\" : v;\n setSelectedBase(next);\n localStorage.setItem(`cli-selected-base-${id}`, next);\n }}\n className=\"flex-1\"\n >\n <option value=\"__auto__\">{autoBase} (auto)</option>\n {savedBases.map((b) => <option key={b} value={b}>{b}</option>)}\n <option value=\"__custom__\">Custom URL…</option>\n </Select>\n {selectedBase && (\n <Button variant=\"ghost\" className=\"px-2 py-1 flex-none\" title=\"remove this URL\" onClick={() => {\n const next = savedBases.filter((x) => x !== selectedBase);\n setSavedBases(next);\n localStorage.setItem(`cli-saved-bases-${id}`, JSON.stringify(next));\n setSelectedBase(\"\");\n localStorage.setItem(`cli-selected-base-${id}`, \"\");\n }}><Icon name=\"delete\" size={15} /></Button>\n )}\n </div>\n {showCustomBase && (\n <div className=\"flex items-center gap-2\">\n <input\n autoFocus\n value={customBaseInput}\n onChange={(e) => setCustomBaseInput(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && addCustomBase(customBaseInput)}\n placeholder=\"https://your-gateway.example.com\"\n className=\"flex-1 rounded-brand border border-accent bg-bg px-2.5 py-1.5 font-mono text-[12px] text-text outline-none placeholder:text-text-subtle\"\n />\n <Button variant=\"ghost\" onClick={() => addCustomBase(customBaseInput)}>Add</Button>\n <Button variant=\"ghost\" onClick={() => { setShowCustomBase(false); setCustomBaseInput(\"\"); }}>Cancel</Button>\n </div>\n )}\n </div>\n </SetupRow>\n\n <SetupRow label=\"API Key\">\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-2\">\n <Select\n value={customKey ? \"__custom__\" : String(keyIdx)}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"__custom__\") { setShowCustomKey(true); return; }\n setCustomKey(\"\");\n setKeyIdx(Number(v));\n localStorage.removeItem(`cli-custom-key-${id}`);\n }}\n className=\"flex-1\"\n >\n {ep.keys.map((k, i) => <option key={i} value={i}>{k.name || `key ${i + 1}`}</option>)}\n {customKey && <option value=\"__custom__\">{customKey.slice(0, 12)}… (custom)</option>}\n {!customKey && <option value=\"__custom__\">Custom key…</option>}\n </Select>\n {customKey && (\n <Button variant=\"ghost\" className=\"px-2 py-1 flex-none\" title=\"remove custom key\" onClick={() => {\n setCustomKey(\"\");\n localStorage.removeItem(`cli-custom-key-${id}`);\n }}><Icon name=\"delete\" size={15} /></Button>\n )}\n </div>\n {showCustomKey && (\n <div className=\"flex items-center gap-2\">\n <input\n autoFocus\n value={customKeyInput}\n onChange={(e) => setCustomKeyInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n setCustomKey(customKeyInput.trim());\n localStorage.setItem(`cli-custom-key-${id}`, customKeyInput.trim());\n setShowCustomKey(false);\n setCustomKeyInput(\"\");\n }\n }}\n placeholder=\"paste API key…\"\n className=\"flex-1 rounded-brand border border-accent bg-bg px-2.5 py-1.5 font-mono text-[12px] text-text outline-none placeholder:text-text-subtle\"\n />\n <Button variant=\"ghost\" onClick={() => { setCustomKey(customKeyInput.trim()); localStorage.setItem(`cli-custom-key-${id}`, customKeyInput.trim()); setShowCustomKey(false); setCustomKeyInput(\"\"); }}>Add</Button>\n <Button variant=\"ghost\" onClick={() => { setShowCustomKey(false); setCustomKeyInput(\"\"); }}>Cancel</Button>\n </div>\n )}\n </div>\n </SetupRow>\n\n {isAnthropic ? (\n <SetupRow label=\"Models\" top>\n <div className=\"flex flex-col gap-2\">\n {([\"opus\", \"sonnet\", \"haiku\"] as const).map((slot) => (\n <div key={slot} className=\"flex items-center gap-2\">\n <span className=\"w-16 flex-none text-[12px] capitalize text-text-subtle\">{slot}</span>\n {slots[slot] ? (\n <span className=\"flex flex-1 items-center gap-1.5 rounded border border-accent bg-accent-soft px-2 py-1 font-mono text-[12px] text-accent\">\n <span className=\"flex-1 truncate\">{slots[slot]}</span>\n <button onClick={() => setSlots((s) => ({ ...s, [slot]: \"\" }))} className=\"flex-none hover:text-danger\" aria-label=\"clear\">\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n ) : (\n <button\n onClick={() => { setPickerSlot(slot); setPickerOpen(true); }}\n className=\"flex items-center gap-1 rounded border border-dashed border-border px-2.5 py-1 text-[12px] text-text-subtle hover:border-accent hover:text-accent\"\n >\n <Icon name=\"add\" size={13} /> Add model\n </button>\n )}\n </div>\n ))}\n </div>\n </SetupRow>\n ) : (\n <SetupRow label=\"Models\" top>\n <div>\n <div className=\"flex min-h-[34px] flex-wrap gap-1.5 rounded-brand border border-border-subtle bg-bg px-2 py-1.5\">\n {picked.length === 0 ? (\n <span className=\"text-[12px] text-text-subtle\">No models — add one below.</span>\n ) : (\n picked.map((m) => (\n <span\n key={m}\n onClick={() => setActive((a) => (a === m ? \"\" : m))}\n title={m === active ? \"active model — click to clear\" : \"click to set active\"}\n className={`inline-flex cursor-pointer items-center gap-1 rounded px-2 py-0.5 text-[12px] transition-colors ${\n m === active ? \"border border-accent bg-accent-soft text-accent\" : \"border border-transparent bg-surface-2 text-text-muted hover:border-border\"\n }`}\n >\n {m === active && <Icon name=\"star\" size={11} />}\n <span className=\"tnum\">{m}</span>\n <button\n onClick={(e) => { e.stopPropagation(); setPicked((p) => p.filter((x) => x !== m)); setActive((a) => (a === m ? \"\" : a)); }}\n className=\"hover:text-danger\"\n aria-label={`Remove ${m}`}\n >\n <Icon name=\"close\" size={12} />\n </button>\n </span>\n ))\n )}\n </div>\n <div className=\"mt-1.5 flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => setPickerOpen(true)}>\n <Icon name=\"add\" size={15} /> Add models\n </Button>\n <span className=\"text-[11.5px] text-text-subtle\">\n {active ? <>active: <span className=\"tnum text-accent\">{active}</span></> : picked.length ? \"click a chip to set active\" : \"\"}\n </span>\n </div>\n </div>\n </SetupRow>\n )}\n\n {cli.configured && cli.baseUrl && (\n <SetupRow label=\"Current\">\n <span className=\"tnum text-[11.5px] text-text-subtle\">{cli.baseUrl}</span>\n </SetupRow>\n )}\n\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <Button onClick={applyCli} disabled={cliBusy === \"apply\"}>\n <Icon name={cliBusy === \"apply\" ? \"progress_activity\" : \"bolt\"} size={15} />\n {cliBusy === \"apply\" ? \"Applying…\" : cli.configured ? \"Re-apply\" : \"Apply config\"}\n </Button>\n {cli.configured && (\n <Button variant=\"ghost\" onClick={resetCli} disabled={cliBusy === \"reset\"}>\n {cliBusy === \"reset\" ? \"Removing…\" : \"Reset\"}\n </Button>\n )}\n {cliMsg && <span className=\"text-[12px] text-text-subtle\">{cliMsg}</span>}\n {cli.path && <span className=\"ml-auto truncate tnum text-[11px] text-text-subtle\">{cli.path}</span>}\n </div>\n </div>\n )}\n </RichCard>\n )}\n\n {tool.install && (\n <RichCard header={<CardTitle title=\"Install\" />}>\n <CopyBlock text={tool.install} />\n </RichCard>\n )}\n\n <RichCard\n className={tool.install ? \"\" : \"lg:col-span-2\"}\n header={\n <>\n <CardTitle title=\"Environment\" sub=\"copy into your shell\" />\n {ep.keys.length > 1 && (\n <Select value={String(keyIdx)} onChange={(e) => setKeyIdx(Number(e.target.value))} className=\"max-w-[180px]\">\n {ep.keys.map((k, i) => (\n <option key={i} value={i}>{k.name || `key ${i + 1}`}</option>\n ))}\n </Select>\n )}\n </>\n }\n >\n <CopyBlock text={block} />\n {ep.keys.length === 0 ? (\n <p className=\"mt-3 text-[12px] text-warning\">\n No gateway key set — auth is disabled. Add one under Endpoint, then it appears here.\n </p>\n ) : (\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Using key <span className=\"text-text-muted\">{ep.keys[keyIdx]?.name || `#${keyIdx + 1}`}</span>. The real value is filled in above.\n </p>\n )}\n </RichCard>\n\n {opencodeJson && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Manual config\" sub=\"merge into ~/.config/opencode/opencode.json — every model listed\" />}\n >\n {ocModels.length === 0 ? (\n <p className=\"text-[12.5px] text-text-muted\">Add models above to see them listed here.</p>\n ) : (\n <CopyBlock text={opencodeJson} />\n )}\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Apply does the same merge for you — it keeps any other providers and existing models, only adding these.\n </p>\n </RichCard>\n )}\n\n {claudeJson && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Manual config\" sub=\"merge the env block into ~/.claude/settings.json\" />}\n >\n <CopyBlock text={claudeJson} />\n <p className=\"mt-3 text-[12px] text-text-subtle\">\n Apply does the same merge for you — it keeps the rest of your settings, only writing these env keys.\n </p>\n </RichCard>\n )}\n\n {!tool.autoConfig && (\n <RichCard\n className=\"lg:col-span-2\"\n header={<CardTitle title=\"Models to call\" sub=\"name a combo exactly this — the tool will hit it\" />}\n >\n <div className=\"space-y-1.5\">\n {tool.slots.map((s) => {\n const exists = combos.includes(s.alias);\n return (\n <div key={s.alias} className=\"flex items-center gap-3 rounded-brand border border-border-subtle px-3 py-2\">\n <span className=\"w-32 flex-none text-[12px] text-text-subtle\">{s.label}</span>\n <Icon name=\"arrow_forward\" size={14} className=\"flex-none text-text-subtle\" />\n <span className=\"tnum truncate text-[13px] text-text\">{s.alias}</span>\n <span className=\"ml-auto flex flex-none items-center gap-2\">\n {exists ? (\n <Badge tone=\"live\">ready</Badge>\n ) : (\n <>\n <Badge tone=\"warn\">missing</Badge>\n <button\n type=\"button\"\n onClick={() => router.push(\"/combos\")}\n className=\"inline-flex items-center gap-1 text-[12px] text-accent hover:underline\"\n >\n <Icon name=\"add\" size={13} /> create\n </button>\n </>\n )}\n </span>\n </div>\n );\n })}\n </div>\n {combos.length > 0 && (\n <p className=\"mt-2.5 text-[11px] text-text-subtle\">\n Your combos: <span className=\"tnum text-text-muted\">{combos.join(\", \")}</span>\n </p>\n )}\n </RichCard>\n )}\n\n <RichCard className=\"lg:col-span-2\" header={<CardTitle title=\"Steps\" />}>\n <ol className=\"space-y-2.5\">\n {tool.steps.map((s, i) => (\n <li key={i} className=\"flex gap-2.5 text-[13px] text-text-muted\">\n <span className=\"flex h-5 w-5 flex-none items-center justify-center rounded-full bg-surface-2 tnum text-[11px] text-text\">\n {i + 1}\n </span>\n {s}\n </li>\n ))}\n </ol>\n </RichCard>\n </div>\n\n {pickerOpen && pickerSlot && (\n <ModelPicker\n title={`Pick model — ${pickerSlot}`}\n note=\"Click a model to select it for this slot.\"\n groups={groups}\n selected={slots[pickerSlot] ? [slots[pickerSlot]] : []}\n onToggle={(v) => {\n setSlots((s) => ({ ...s, [pickerSlot]: s[pickerSlot] === v ? \"\" : v }));\n setPickerOpen(false);\n setPickerSlot(null);\n }}\n onClose={() => { setPickerOpen(false); setPickerSlot(null); }}\n />\n )}\n {pickerOpen && !pickerSlot && (\n <ModelPicker\n title=\"Add models\"\n note=\"Click a model to add it, click again to remove. Then hit Apply.\"\n groups={groups}\n selected={picked}\n onToggle={togglePicked}\n onClose={() => setPickerOpen(false)}\n />\n )}\n </div>\n );\n}\n\n/** label → control row used by the Local setup card (matches aigetwey's layout). */\nfunction SetupRow({ label, children, top }: { label: string; children: React.ReactNode; top?: boolean }) {\n return (\n <div className={`grid grid-cols-[7rem_1fr] gap-3 ${top ? \"items-start\" : \"items-center\"}`}>\n <span className={`text-[12px] font-medium text-text-subtle ${top ? \"pt-1.5\" : \"\"}`}>{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n );\n}\n\nfunction CopyBlock({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n return (\n <div className=\"relative\">\n <pre className=\"overflow-x-auto rounded-brand border border-border-subtle bg-bg px-3 py-2.5 font-mono text-[12.5px] leading-relaxed text-text\">\n {text}\n </pre>\n <button\n onClick={() => {\n void navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n }}\n className=\"absolute right-2 top-2 flex items-center gap-1 rounded-brand border border-border bg-surface px-2 py-1 text-[11px] text-text-muted hover:text-text\"\n >\n <Icon name={copied ? \"check\" : \"content_copy\"} size={13} /> {copied ? \"copied\" : \"copy\"}\n </button>\n </div>\n );\n}\n"],"names":["ToolDetail","id","router","tool","ep","setEp","combos","setCombos","keyIdx","setKeyIdx","realKey","setRealKey","savedBases","setSavedBases","selectedBase","setSelectedBase","customBaseInput","setCustomBaseInput","showCustomBase","setShowCustomBase","customKey","setCustomKey","showCustomKey","setShowCustomKey","customKeyInput","setCustomKeyInput","bases","JSON","parse","localStorage","getItem","sel","key","error","setError","cli","setCli","cliBusy","setCliBusy","cliMsg","setCliMsg","allModels","setAllModels","groups","setGroups","pickerOpen","setPickerOpen","pickerSlot","setPickerSlot","picked","setPicked","active","setActive","slots","setSlots","opus","sonnet","haiku","isAnthropic","format","togglePicked","v","includes","p","filter","x","loadCli","autoConfig","r","status","data","installed","modelSlots","models","length","activeModel","addCustomBase","url","trimmed","trim","next","b","setItem","stringify","applyCli","removeItem","autoBase","port","baseUrl","keys","undefined","m","apply","base","ok","resetCli","reset","epRes","cfgRes","Promise","all","fetch","json","cfg","aliases","map","alias","liveProviders","providers","disabled","refs","flatMap","grps","push","label","items","a","value","revealServerKey","then","effectiveKey","env","block","e","name","join","ocModels","opencodeJson","provider","aigetwey","npm","options","baseURL","apiKey","Object","fromEntries","modalities","model","claudeJson","hasCompletedOnboarding","ANTHROPIC_BASE_URL","API_TIMEOUT_MS","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","onClick","className","size","icon","tone","header","title","sub","configured","SetupRow","onChange","target","variant","autoFocus","onKeyDown","placeholder","String","Number","k","i","slice","top","slot","s","stopPropagation","type","path","install","CopyBlock","text","exists","steps","note","selected","onToggle","onClose","children","copied","setCopied","navigator","clipboard","writeText","setTimeout"],"mappings":"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"}
|
|
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
7
7
|
"static/chunks/0cz1d0mv5g_q7.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
12
|
-
"static/
|
|
10
|
+
"static/l0QkSM6jT0jiUc4m4dh6K/_buildManifest.js",
|
|
11
|
+
"static/l0QkSM6jT0jiUc4m4dh6K/_ssgManifest.js",
|
|
12
|
+
"static/l0QkSM6jT0jiUc4m4dh6K/_clientMiddlewareManifest.js"
|
|
13
13
|
],
|
|
14
14
|
"rootMainFiles": [
|
|
15
15
|
"static/chunks/36ssnkm0cjgq6.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2284qz1hy9776.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/13ge_ybuj8rl3.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block" as="style"/><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>aigetwey</title><meta name="description" content="Console for the aigetwey AI gateway"/><link rel="icon" href="/icon.svg?icon.43yv9zw_mes0x.svg" sizes="any" type="image/svg+xml"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block"/><script>(self.__next_s=self.__next_s||[]).push([0,{"children":"try{var t=localStorage.getItem(\"theme\");if(t===\"light\")document.documentElement.className=document.documentElement.className.replace(\"dark\",\"light\")}catch(e){}","id":"theme-init"}])</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-5 right-5 z-[100] flex flex-col gap-2"></div><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79520,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"\"]\n3:I[59919,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ThemeProvider\"]\n4:I[76972,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ToastProvider\"]\n5:I[39756,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2284qz1hy9776.css\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2284qz1hy9776.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\"}],[\"$\",\"$L2\",null,{\"id\":\"theme-init\",\"strategy\":\"beforeInteractive\",\"children\":\"try{var t=localStorage.getItem(\\\"theme\\\");if(t===\\\"light\\\")document.documentElement.className=document.documentElement.className.replace(\\\"dark\\\",\\\"light\\\")}catch(e){}\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2284qz1hy9776.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"kpgVHg6Rdnh2YUO8-xGjX\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"aigetwey\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Console for the aigetwey AI gateway\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.43yv9zw_mes0x.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/452cgglyyo7hp.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/13ge_ybuj8rl3.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block" as="style"/><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>aigetwey</title><meta name="description" content="Console for the aigetwey AI gateway"/><link rel="icon" href="/icon.svg?icon.43yv9zw_mes0x.svg" sizes="any" type="image/svg+xml"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block"/><script>(self.__next_s=self.__next_s||[]).push([0,{"children":"try{var t=localStorage.getItem(\"theme\");if(t===\"light\")document.documentElement.className=document.documentElement.className.replace(\"dark\",\"light\")}catch(e){}","id":"theme-init"}])</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-5 right-5 z-[100] flex flex-col gap-2"></div><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79520,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"\"]\n3:I[59919,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ThemeProvider\"]\n4:I[76972,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ToastProvider\"]\n5:I[39756,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/452cgglyyo7hp.css\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/452cgglyyo7hp.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\"}],[\"$\",\"$L2\",null,{\"id\":\"theme-init\",\"strategy\":\"beforeInteractive\",\"children\":\"try{var t=localStorage.getItem(\\\"theme\\\");if(t===\\\"light\\\")document.documentElement.className=document.documentElement.className.replace(\\\"dark\\\",\\\"light\\\")}catch(e){}\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/452cgglyyo7hp.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"l0QkSM6jT0jiUc4m4dh6K\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"aigetwey\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Console for the aigetwey AI gateway\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.43yv9zw_mes0x.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"l0QkSM6jT0jiUc4m4dh6K\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,81189,e=>{"use strict";var t=e.i(43476);let a={live:"bg-success/12 text-success",down:"bg-danger/12 text-danger",warn:"bg-warning/12 text-warning",info:"bg-info/12 text-info",neutral:"bg-surface-2 text-text-muted"};function s({tone:e="neutral",children:n,className:r}){return(0,t.jsx)("span",{className:`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium ${a[e]}${r?` ${r}`:""}`,children:n})}e.s(["Badge",0,s,"FormatBadge",0,function({format:e}){return(0,t.jsx)(s,{tone:"info",children:e})}])},38286,e=>{"use strict";var t=e.i(43476);e.s(["Empty",0,function({children:e}){return(0,t.jsx)("div",{className:"px-1 py-8 text-center text-[13px] text-text-muted",children:e})},"Stat",0,function({label:e,value:a,sub:s}){return(0,t.jsxs)("div",{className:"rounded-brand-lg border border-border bg-surface px-4 py-3.5 shadow-soft",children:[(0,t.jsx)("div",{className:"text-[11px] font-medium uppercase tracking-wider text-text-subtle",children:e}),(0,t.jsx)("div",{className:"mt-1 tnum text-[22px] font-semibold tracking-tight text-text",children:a}),s&&(0,t.jsx)("div",{className:"mt-0.5 text-[12px] text-text-muted",children:s})]})},"fmt",0,{int:e=>e.toLocaleString("en-US"),compact:e=>Math.abs(e)>=1e6?`${(e/1e6).toFixed(1)}M`:Math.abs(e)>=1e3?`${(e/1e3).toFixed(1)}K`:String(Math.round(e)),cost:e=>0===e?"$0":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`,time:e=>new Date(e).toLocaleString("en-US",{hour12:!1}),date(e){let t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}/${t.getFullYear()}`},ago(e){let t=Math.max(0,Math.round((Date.now()-e)/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`},duration(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;if(t<3600)return`${Math.floor(t/60)}m ${t%60}s`;let a=Math.floor(t/3600),s=Math.floor(t%3600/60);if(a<24)return`${a}h ${s}m`;let n=Math.floor(a/24);return`${n}d ${a%24}h`}}])},49080,e=>{"use strict";var t=e.i(43476);e.s(["Lamp",0,function({state:e,title:a}){return(0,t.jsx)("span",{className:`lamp lamp-${e}`,title:a,"aria-label":e})}])},98111,e=>{"use strict";var t=e.i(43476),a=e.i(71645),s=e.i(51514),n=e.i(38286);e.s(["CooldownTimer",0,function({ms:e,tone:r="danger",icon:i="timer",keepZero:l=!1}){let[o]=(0,a.useState)(()=>Date.now()+e),[d,c]=(0,a.useState)(()=>Math.max(0,e));return((0,a.useEffect)(()=>{let e=()=>c(Math.max(0,o-Date.now()));e();let t=setInterval(e,1e3);return()=>clearInterval(t)},[o]),d<=0&&!l)?null:(0,t.jsxs)("span",{className:`inline-flex items-center gap-1 tnum text-[12px] ${"danger"===r?"text-danger":"text-text-muted"}`,children:[(0,t.jsx)(s.Icon,{name:i,size:13}),d<=0?"now":n.fmt.duration(d)]})}])},70757,e=>{"use strict";var t=e.i(43476),a=e.i(71645),s=e.i(22016),n=e.i(29481),r=e.i(49080),i=e.i(81189),l=e.i(98111),o=e.i(10007),d=e.i(51514),c=e.i(38286);function x({id:e,disabled:s,onDone:r}){let[i,l]=(0,a.useState)(!1);return(0,t.jsxs)("button",{type:"button",onClick:t=>{t.preventDefault(),t.stopPropagation(),i||(l(!0),n.adminApi.setProviderDisabled(e,!s).then(()=>r()).finally(()=>l(!1)))},className:`inline-flex items-center gap-1.5 text-[11px] font-medium ${s?"text-danger":"text-text-muted"}`,"aria-label":s?"Enable provider":"Disable provider",title:s?"Provider disabled — click to enable":"Provider enabled — click to disable",children:[(0,t.jsx)("span",{className:`relative h-4 w-7 rounded-full transition-colors ${s?"bg-danger":"bg-accent"} ${i?"opacity-60":""}`,children:(0,t.jsx)("span",{className:`absolute left-0.5 top-0.5 h-3 w-3 rounded-full bg-white transition-transform ${s?"translate-x-0":"translate-x-[14px]"}`})}),s?"disabled":"enabled"]})}let u=[{id:"openai",label:"OpenAI compatible",sub:"/v1/chat/completions",icon:"bolt",format:"openai",base_url:"https://api.openai.com/v1",hint:"Base URL ending in /v1 for any OpenAI-compatible API.",modelHint:"e.g. gpt-4o, glm-5.2"},{id:"anthropic",label:"Anthropic compatible",sub:"/v1/messages",icon:"smart_toy",format:"anthropic",base_url:"https://api.anthropic.com",hint:"Base URL of an Anthropic-compatible API; /messages is appended.",modelHint:"e.g. claude-sonnet-4-6"}];function m({onDone:e,onClose:s}){let[r,l]=(0,a.useState)(null),[c,x]=(0,a.useState)(""),[p,h]=(0,a.useState)(""),[b,f]=(0,a.useState)(""),[g,v]=(0,a.useState)(!1),[j,y]=(0,a.useState)(""),[N,w]=(0,a.useState)(!1),[k,$]=(0,a.useState)(!1),[S,C]=(0,a.useState)(null),[I,M]=(0,a.useState)("");if(!r)return(0,t.jsxs)("div",{className:"mb-5 rounded-brand-lg border border-border bg-surface p-5 shadow-soft",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-[14px] font-semibold text-text",children:"Add a provider"}),(0,t.jsx)("p",{className:"mt-0.5 text-[12.5px] text-text-muted",children:"Pick the API your endpoint speaks — the rest is prefilled."})]}),(0,t.jsx)("button",{type:"button",onClick:s,className:"flex-none text-text-subtle hover:text-text","aria-label":"Cancel",children:(0,t.jsx)(d.Icon,{name:"close",size:18})})]}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2",children:u.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>{l(e),h(e.base_url),C(null),M("")},className:"group flex items-start gap-3 rounded-brand-lg border border-border bg-bg p-4 text-left transition-colors hover:border-accent hover:bg-accent-soft",children:[(0,t.jsx)("span",{className:"flex h-10 w-10 flex-none items-center justify-center rounded-brand bg-surface-2 text-text-muted group-hover:text-accent",children:(0,t.jsx)(d.Icon,{name:e.icon,size:20})}),(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("span",{className:"block text-[13.5px] font-semibold text-text",children:e.label}),(0,t.jsx)("span",{className:"block tnum text-[11.5px] text-text-subtle",children:e.sub}),(0,t.jsx)("span",{className:"mt-1 block text-[11.5px] text-text-muted",children:e.hint})]})]},e.id))})]});async function _(){if(!p||!r)return;$(!0),C(null);let e=await n.adminApi.validateProvider({format:r.format,base_url:p,api_key:b||void 0});$(!1),C(e.data??{ok:!1,reachable:!1,status:0,error:e.error})}async function A(t){if(t.preventDefault(),!r||!c||!p)return void M("name and base URL are required");w(!0),M("");let a=await n.adminApi.addProvider({id:c,format:r.format,base_url:p,api_key:b||void 0,free:!b.trim()});if(!a.ok){w(!1),M(a.error??"failed");return}j.trim()&&await n.adminApi.addModel(c,j.trim()),w(!1),e()}return(0,t.jsx)("div",{className:"mb-5 rounded-brand-lg border border-border bg-surface p-5 shadow-soft",children:(0,t.jsxs)("form",{onSubmit:A,children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center gap-2.5 border-b border-border-subtle pb-4",children:[(0,t.jsx)("span",{className:"flex h-8 w-8 items-center justify-center rounded-brand bg-surface-2 text-text-muted",children:(0,t.jsx)(d.Icon,{name:r.icon,size:17})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[13.5px] font-semibold text-text",children:r.label}),(0,t.jsx)("div",{className:"tnum text-[11px] text-text-subtle",children:r.sub})]}),(0,t.jsxs)("button",{type:"button",onClick:()=>{l(null),C(null)},className:"ml-auto inline-flex items-center gap-1 text-[12px] text-text-subtle hover:text-text",children:[(0,t.jsx)(d.Icon,{name:"arrow_back",size:14})," change type"]})]}),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)(o.Field,{label:"Name",hint:"a friendly id — also the model prefix (name/model)",children:(0,t.jsx)(o.Input,{value:c,onChange:e=>x(e.target.value),placeholder:"e.g. openai, huki"})}),(0,t.jsx)(o.Field,{label:"Base URL",hint:r.hint,children:(0,t.jsx)(o.Input,{value:p,onChange:e=>{h(e.target.value),C(null)},placeholder:r.base_url,className:"font-mono text-[12.5px]"})}),(0,t.jsx)(o.Field,{label:"API Key",hint:"used for Check and live requests — leave blank for a free / no-auth endpoint",children:(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsxs)("div",{className:"relative flex-1",children:[(0,t.jsx)(o.Input,{type:g?"text":"password",value:b,onChange:e=>{f(e.target.value),C(null)},placeholder:"sk-…",className:"pr-9 font-mono text-[12.5px]"}),b&&(0,t.jsx)("button",{type:"button",onClick:()=>v(e=>!e),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-subtle hover:text-text","aria-label":g?"Hide key":"Show key",children:(0,t.jsx)(d.Icon,{name:g?"visibility_off":"visibility",size:15})})]}),(0,t.jsxs)(o.Button,{type:"button",variant:"ghost",disabled:k||!p,onClick:_,children:[(0,t.jsx)(d.Icon,{name:k?"progress_activity":"wifi_tethering",size:15}),k?"Checking…":"Check"]})]})}),S&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-[12px]",children:[(0,t.jsx)(i.Badge,{tone:S.ok?"live":S.reachable?"warn":"down",children:S.ok?"valid":S.reachable?`reachable (${S.status})`:"invalid"}),S.error&&(0,t.jsx)("span",{className:"text-text-subtle",children:S.error})]}),(0,t.jsx)(o.Field,{label:"Model ID",hint:"optional — seed one if the provider has no /models endpoint",children:(0,t.jsx)(o.Input,{value:j,onChange:e=>y(e.target.value),placeholder:r.modelHint,className:"font-mono text-[12.5px]"})})]}),I&&(0,t.jsx)("div",{className:"mt-2 text-[12px] text-danger",children:I}),(0,t.jsxs)("div",{className:"mt-4 flex justify-end gap-2",children:[(0,t.jsx)(o.Button,{type:"button",variant:"ghost",onClick:s,children:"Cancel"}),(0,t.jsx)(o.Button,{type:"submit",disabled:N,children:N?"Adding…":"Add provider"})]})]})})}e.s(["ProviderManager",0,function(){let[e,u]=(0,a.useState)(null),[p,h]=(0,a.useState)(""),[b,f]=(0,a.useState)(!1),g=(0,a.useCallback)(async()=>{let[e,t]=await Promise.all([fetch("/api/gw/admin/config"),n.adminApi.providers()]);e.ok&&t.ok?(h(""),u({config:await e.json(),health:t.data?.providers??[]})):h("could not reach the gateway")},[]);if((0,a.useEffect)(()=>{g()},[g]),p)return(0,t.jsx)(c.Empty,{children:p});if(!e)return(0,t.jsx)(c.Empty,{children:"Loading…"});let v=new Map(e.health.map(e=>[e.id,e]));return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6 flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-[22px] font-semibold tracking-tight text-text",children:"Providers & Keys"}),(0,t.jsx)("p",{className:"mt-1 text-[13px] text-text-muted",children:"Upstream providers the gateway routes to."})]}),(0,t.jsxs)(o.Button,{onClick:()=>f(!0),children:[(0,t.jsx)(d.Icon,{name:"add",size:17}),"Add provider"]})]}),b&&(0,t.jsx)(m,{onClose:()=>f(!1),onDone:()=>{f(!1),g()}}),0===e.config.providers.length?(0,t.jsx)(c.Empty,{children:"No providers yet. Add one to start routing."}):(0,t.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:e.config.providers.map(e=>{let a=v.get(e.id),n=!a||a.keys.some(e=>e.healthy),o=a?.keys.find(e=>!e.healthy&&e.cooldown_ms>0);return(0,t.jsxs)(s.default,{href:`/providers/${encodeURIComponent(e.id)}`,className:`group rounded-brand-lg border bg-surface p-4 shadow-soft transition-colors ${e.disabled?"border-danger/35 opacity-60 hover:opacity-100 hover:border-danger/60":"border-border hover:border-text-subtle"}`,children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,t.jsx)(r.Lamp,{state:e.disabled?"idle":n?"live":"down"}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("span",{className:"block truncate text-[14px] font-semibold text-text",children:e.name||e.id}),e.name&&(0,t.jsxs)("span",{className:"block truncate text-[11px] text-text-subtle",children:[e.id,"/"]})]})]}),(0,t.jsx)(i.FormatBadge,{format:e.format})]}),(0,t.jsx)("div",{className:"mt-2 truncate text-[12px] text-text-subtle",children:e.base_url}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)(x,{id:e.id,disabled:!!e.disabled,onDone:g}),e.free&&(0,t.jsx)(i.Badge,{tone:"info",children:"free"}),e.service_account&&(0,t.jsx)(i.Badge,{tone:"info",children:"service-account"}),(0,t.jsx)(i.Badge,{tone:"neutral",children:e.free||e.service_account?`${e.api_keys?.length??0} keys`:`${e.api_keys?.length??+!!e.api_key} keys`}),(0,t.jsxs)(i.Badge,{tone:"neutral",children:[e.models.length," models"]}),o&&(0,t.jsx)(l.CooldownTimer,{ms:o.cooldown_ms})]})]},e.id)})})]})}])}]);
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,81189,e=>{"use strict";var t=e.i(43476);let a={live:"bg-success/12 text-success",down:"bg-danger/12 text-danger",warn:"bg-warning/12 text-warning",info:"bg-info/12 text-info",neutral:"bg-surface-2 text-text-muted"};function s({tone:e="neutral",children:n,className:r}){return(0,t.jsx)("span",{className:`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium ${a[e]}${r?` ${r}`:""}`,children:n})}e.s(["Badge",0,s,"FormatBadge",0,function({format:e}){return(0,t.jsx)(s,{tone:"info",children:e})}])},38286,e=>{"use strict";var t=e.i(43476);e.s(["Empty",0,function({children:e}){return(0,t.jsx)("div",{className:"px-1 py-8 text-center text-[13px] text-text-muted",children:e})},"Stat",0,function({label:e,value:a,sub:s}){return(0,t.jsxs)("div",{className:"rounded-brand-lg border border-border bg-surface px-4 py-3.5 shadow-soft",children:[(0,t.jsx)("div",{className:"text-[11px] font-medium uppercase tracking-wider text-text-subtle",children:e}),(0,t.jsx)("div",{className:"mt-1 tnum text-[22px] font-semibold tracking-tight text-text",children:a}),s&&(0,t.jsx)("div",{className:"mt-0.5 text-[12px] text-text-muted",children:s})]})},"fmt",0,{int:e=>e.toLocaleString("en-US"),compact:e=>Math.abs(e)>=1e6?`${(e/1e6).toFixed(1)}M`:Math.abs(e)>=1e3?`${(e/1e3).toFixed(1)}K`:String(Math.round(e)),cost:e=>0===e?"$0":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`,time:e=>new Date(e).toLocaleString("en-US",{hour12:!1}),date(e){let t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}/${t.getFullYear()}`},ago(e){let t=Math.max(0,Math.round((Date.now()-e)/1e3));return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:`${Math.floor(t/86400)}d`},duration(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;if(t<3600)return`${Math.floor(t/60)}m ${t%60}s`;let a=Math.floor(t/3600),s=Math.floor(t%3600/60);if(a<24)return`${a}h ${s}m`;let n=Math.floor(a/24);return`${n}d ${a%24}h`}}])},49080,e=>{"use strict";var t=e.i(43476);e.s(["Lamp",0,function({state:e,title:a}){return(0,t.jsx)("span",{className:`lamp lamp-${e}`,title:a,"aria-label":e})}])},98111,e=>{"use strict";var t=e.i(43476),a=e.i(71645),s=e.i(51514),n=e.i(38286);e.s(["CooldownTimer",0,function({ms:e,tone:r="danger",icon:i="timer",keepZero:l=!1}){let[o]=(0,a.useState)(()=>Date.now()+e),[d,c]=(0,a.useState)(()=>Math.max(0,e));return((0,a.useEffect)(()=>{let e=()=>c(Math.max(0,o-Date.now()));e();let t=setInterval(e,1e3);return()=>clearInterval(t)},[o]),d<=0&&!l)?null:(0,t.jsxs)("span",{className:`inline-flex items-center gap-1 tnum text-[12px] ${"danger"===r?"text-danger":"text-text-muted"}`,children:[(0,t.jsx)(s.Icon,{name:i,size:13}),d<=0?"now":n.fmt.duration(d)]})}])},70757,e=>{"use strict";var t=e.i(43476),a=e.i(71645),s=e.i(22016),n=e.i(29481),r=e.i(49080),i=e.i(81189),l=e.i(98111),o=e.i(10007),d=e.i(51514),c=e.i(38286);function x({id:e,disabled:s,onDone:r}){let[i,l]=(0,a.useState)(!1);return(0,t.jsxs)("button",{type:"button",onClick:t=>{t.preventDefault(),t.stopPropagation(),i||(l(!0),n.adminApi.setProviderDisabled(e,!s).then(()=>r()).finally(()=>l(!1)))},className:`inline-flex items-center gap-1.5 text-[11px] font-medium ${s?"text-danger":"text-text-muted"}`,"aria-label":s?"Enable provider":"Disable provider",title:s?"Provider disabled — click to enable":"Provider enabled — click to disable",children:[(0,t.jsx)("span",{className:`relative h-4 w-7 rounded-full transition-colors ${s?"bg-danger":"bg-accent"} ${i?"opacity-60":""}`,children:(0,t.jsx)("span",{className:`absolute left-0.5 top-0.5 h-3 w-3 rounded-full bg-white transition-transform ${s?"translate-x-0":"translate-x-[14px]"}`})}),s?"disabled":"enabled"]})}let u=[{id:"openai",label:"OpenAI compatible",sub:"/v1/chat/completions",icon:"bolt",format:"openai",base_url:"https://api.openai.com/v1",hint:"Base URL ending in /v1 for any OpenAI-compatible API.",modelHint:"e.g. gpt-4o, glm-5.2"},{id:"anthropic",label:"Anthropic compatible",sub:"/v1/messages",icon:"smart_toy",format:"anthropic",base_url:"https://api.anthropic.com",hint:"Base URL of an Anthropic-compatible API; /messages is appended.",modelHint:"e.g. claude-sonnet-4-6"}];function m({onDone:e,onClose:s}){let[r,l]=(0,a.useState)(null),[c,x]=(0,a.useState)(""),[p,h]=(0,a.useState)(""),[b,f]=(0,a.useState)(""),[g,v]=(0,a.useState)(!1),[j,y]=(0,a.useState)(""),[N,w]=(0,a.useState)(!1),[k,$]=(0,a.useState)(!1),[S,C]=(0,a.useState)(null),[I,M]=(0,a.useState)("");if(!r)return(0,t.jsxs)("div",{className:"mb-5 rounded-brand-lg border border-border bg-surface p-5 shadow-soft",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-[14px] font-semibold text-text",children:"Add a provider"}),(0,t.jsx)("p",{className:"mt-0.5 text-[12.5px] text-text-muted",children:"Pick the API your endpoint speaks — the rest is prefilled."})]}),(0,t.jsx)("button",{type:"button",onClick:s,className:"flex-none text-text-subtle hover:text-text","aria-label":"Cancel",children:(0,t.jsx)(d.Icon,{name:"close",size:18})})]}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2",children:u.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>{l(e),h(e.base_url),C(null),M("")},className:"group flex items-start gap-3 rounded-brand-lg border border-border bg-bg p-4 text-left transition-colors hover:border-accent hover:bg-accent-soft",children:[(0,t.jsx)("span",{className:"flex h-10 w-10 flex-none items-center justify-center rounded-brand bg-surface-2 text-text-muted group-hover:text-accent",children:(0,t.jsx)(d.Icon,{name:e.icon,size:20})}),(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("span",{className:"block text-[13.5px] font-semibold text-text",children:e.label}),(0,t.jsx)("span",{className:"block tnum text-[11.5px] text-text-subtle",children:e.sub}),(0,t.jsx)("span",{className:"mt-1 block text-[11.5px] text-text-muted",children:e.hint})]})]},e.id))})]});async function _(){if(!p||!r)return;$(!0),C(null);let e=await n.adminApi.validateProvider({format:r.format,base_url:p,api_key:b||void 0});$(!1),C(e.data??{ok:!1,reachable:!1,status:0,error:e.error})}async function A(t){if(t.preventDefault(),!r||!c||!p)return void M("name and base URL are required");w(!0),M("");let a=await n.adminApi.addProvider({id:c,format:r.format,base_url:p,api_key:b||void 0,free:!b.trim()});if(!a.ok){w(!1),M(a.error??"failed");return}j.trim()&&await n.adminApi.addModel(c,j.trim()),w(!1),e()}return(0,t.jsx)("div",{className:"mb-5 rounded-brand-lg border border-border bg-surface p-5 shadow-soft",children:(0,t.jsxs)("form",{onSubmit:A,children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center gap-2.5 border-b border-border-subtle pb-4",children:[(0,t.jsx)("span",{className:"flex h-8 w-8 items-center justify-center rounded-brand bg-surface-2 text-text-muted",children:(0,t.jsx)(d.Icon,{name:r.icon,size:17})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[13.5px] font-semibold text-text",children:r.label}),(0,t.jsx)("div",{className:"tnum text-[11px] text-text-subtle",children:r.sub})]}),(0,t.jsxs)("button",{type:"button",onClick:()=>{l(null),C(null)},className:"ml-auto inline-flex items-center gap-1 text-[12px] text-text-subtle hover:text-text",children:[(0,t.jsx)(d.Icon,{name:"arrow_back",size:14})," change type"]})]}),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)(o.Field,{label:"Name",hint:"a friendly id — also the model prefix (name/model)",children:(0,t.jsx)(o.Input,{value:c,onChange:e=>x(e.target.value),placeholder:"e.g. openai, anthropic"})}),(0,t.jsx)(o.Field,{label:"Base URL",hint:r.hint,children:(0,t.jsx)(o.Input,{value:p,onChange:e=>{h(e.target.value),C(null)},placeholder:r.base_url,className:"font-mono text-[12.5px]"})}),(0,t.jsx)(o.Field,{label:"API Key",hint:"used for Check and live requests — leave blank for a free / no-auth endpoint",children:(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsxs)("div",{className:"relative flex-1",children:[(0,t.jsx)(o.Input,{type:g?"text":"password",value:b,onChange:e=>{f(e.target.value),C(null)},placeholder:"sk-…",className:"pr-9 font-mono text-[12.5px]"}),b&&(0,t.jsx)("button",{type:"button",onClick:()=>v(e=>!e),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-subtle hover:text-text","aria-label":g?"Hide key":"Show key",children:(0,t.jsx)(d.Icon,{name:g?"visibility_off":"visibility",size:15})})]}),(0,t.jsxs)(o.Button,{type:"button",variant:"ghost",disabled:k||!p,onClick:_,children:[(0,t.jsx)(d.Icon,{name:k?"progress_activity":"wifi_tethering",size:15}),k?"Checking…":"Check"]})]})}),S&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-[12px]",children:[(0,t.jsx)(i.Badge,{tone:S.ok?"live":S.reachable?"warn":"down",children:S.ok?"valid":S.reachable?`reachable (${S.status})`:"invalid"}),S.error&&(0,t.jsx)("span",{className:"text-text-subtle",children:S.error})]}),(0,t.jsx)(o.Field,{label:"Model ID",hint:"optional — seed one if the provider has no /models endpoint",children:(0,t.jsx)(o.Input,{value:j,onChange:e=>y(e.target.value),placeholder:r.modelHint,className:"font-mono text-[12.5px]"})})]}),I&&(0,t.jsx)("div",{className:"mt-2 text-[12px] text-danger",children:I}),(0,t.jsxs)("div",{className:"mt-4 flex justify-end gap-2",children:[(0,t.jsx)(o.Button,{type:"button",variant:"ghost",onClick:s,children:"Cancel"}),(0,t.jsx)(o.Button,{type:"submit",disabled:N,children:N?"Adding…":"Add provider"})]})]})})}e.s(["ProviderManager",0,function(){let[e,u]=(0,a.useState)(null),[p,h]=(0,a.useState)(""),[b,f]=(0,a.useState)(!1),g=(0,a.useCallback)(async()=>{let[e,t]=await Promise.all([fetch("/api/gw/admin/config"),n.adminApi.providers()]);e.ok&&t.ok?(h(""),u({config:await e.json(),health:t.data?.providers??[]})):h("could not reach the gateway")},[]);if((0,a.useEffect)(()=>{g()},[g]),p)return(0,t.jsx)(c.Empty,{children:p});if(!e)return(0,t.jsx)(c.Empty,{children:"Loading…"});let v=new Map(e.health.map(e=>[e.id,e]));return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"mb-6 flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-[22px] font-semibold tracking-tight text-text",children:"Providers & Keys"}),(0,t.jsx)("p",{className:"mt-1 text-[13px] text-text-muted",children:"Upstream providers the gateway routes to."})]}),(0,t.jsxs)(o.Button,{onClick:()=>f(!0),children:[(0,t.jsx)(d.Icon,{name:"add",size:17}),"Add provider"]})]}),b&&(0,t.jsx)(m,{onClose:()=>f(!1),onDone:()=>{f(!1),g()}}),0===e.config.providers.length?(0,t.jsx)(c.Empty,{children:"No providers yet. Add one to start routing."}):(0,t.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:e.config.providers.map(e=>{let a=v.get(e.id),n=!a||a.keys.some(e=>e.healthy),o=a?.keys.find(e=>!e.healthy&&e.cooldown_ms>0);return(0,t.jsxs)(s.default,{href:`/providers/${encodeURIComponent(e.id)}`,className:`group rounded-brand-lg border bg-surface p-4 shadow-soft transition-colors ${e.disabled?"border-danger/35 opacity-60 hover:opacity-100 hover:border-danger/60":"border-border hover:border-text-subtle"}`,children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,t.jsx)(r.Lamp,{state:e.disabled?"idle":n?"live":"down"}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("span",{className:"block truncate text-[14px] font-semibold text-text",children:e.name||e.id}),e.name&&(0,t.jsxs)("span",{className:"block truncate text-[11px] text-text-subtle",children:[e.id,"/"]})]})]}),(0,t.jsx)(i.FormatBadge,{format:e.format})]}),(0,t.jsx)("div",{className:"mt-2 truncate text-[12px] text-text-subtle",children:e.base_url}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)(x,{id:e.id,disabled:!!e.disabled,onDone:g}),e.free&&(0,t.jsx)(i.Badge,{tone:"info",children:"free"}),e.service_account&&(0,t.jsx)(i.Badge,{tone:"info",children:"service-account"}),(0,t.jsx)(i.Badge,{tone:"neutral",children:e.free||e.service_account?`${e.api_keys?.length??0} keys`:`${e.api_keys?.length??+!!e.api_key} keys`}),(0,t.jsxs)(i.Badge,{tone:"neutral",children:[e.models.length," models"]}),o&&(0,t.jsx)(l.CooldownTimer,{ms:o.cooldown_ms})]})]},e.id)})})]})}])}]);
|