aigetwey 1.4.1 → 1.4.2
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 +12 -0
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/build-manifest.json +3 -3
- package/dashboard/.next/diagnostics/route-bundle-stats.json +4 -4
- package/dashboard/.next/fallback-build-manifest.json +3 -3
- 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/_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.html +1 -1
- package/dashboard/.next/server/app/_not-found.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/server/app/combos.html +1 -1
- package/dashboard/.next/server/app/combos.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/combos.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.html +1 -1
- package/dashboard/.next/server/app/config.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/config.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.html +1 -1
- package/dashboard/.next/server/app/console.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/console.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.html +1 -1
- package/dashboard/.next/server/app/endpoint.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/endpoint.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/server/app/index.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.html +1 -1
- package/dashboard/.next/server/app/keys.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/keys.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.html +1 -1
- package/dashboard/.next/server/app/login.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- 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 +2 -2
- 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 +1 -1
- package/dashboard/.next/server/app/providers.segments/_full.segment.rsc +2 -2
- package/dashboard/.next/server/app/providers.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/providers.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/providers.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.html +1 -1
- package/dashboard/.next/server/app/quota.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/quota.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.html +1 -1
- package/dashboard/.next/server/app/tools.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/server/app/tools.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/server/chunks/[root-of-the-server]__07euc03._.js.map +1 -1
- package/dashboard/.next/server/chunks/[root-of-the-server]__0uqpr_c._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/_0p90gyy._.js.map +1 -1
- package/dashboard/.next/server/chunks/ssr/_1mumvwn._.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_ProviderManager_tsx_09d2dzw._.js +1 -1
- package/dashboard/.next/server/chunks/ssr/src_components_ProviderManager_tsx_09d2dzw._.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/{0pf-u__m67vld.js → 03xhjt1ta90pp.js} +1 -1
- package/dashboard/.next/static/chunks/{3y0b8yet0vgwr.js → 15d148buj9byd.js} +1 -1
- package/dashboard/.next/trace +1 -1
- package/dashboard/.next/trace-build +1 -1
- package/dashboard/src/components/ProviderDetail.tsx +10 -5
- package/dashboard/src/components/ProviderManager.tsx +7 -3
- package/dashboard/src/lib/client.ts +1 -0
- package/dashboard/src/lib/gateway.ts +2 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/headroom/process.js +22 -6
- package/dist/headroom/process.js.map +1 -1
- package/dist/routes/admin.js +1 -0
- package/dist/routes/admin.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +2 -0
- package/src/headroom/process.ts +19 -5
- package/src/routes/admin.ts +2 -0
- /package/dashboard/.next/static/{DzOHVl0QeJ1RnKMho8Q0_ → jKcczqYA93-Kuqa9A9H9h}/_buildManifest.js +0 -0
- /package/dashboard/.next/static/{DzOHVl0QeJ1RnKMho8Q0_ → jKcczqYA93-Kuqa9A9H9h}/_clientMiddlewareManifest.js +0 -0
- /package/dashboard/.next/static/{DzOHVl0QeJ1RnKMho8Q0_ → jKcczqYA93-Kuqa9A9H9h}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Button.tsx","../../../../src/lib/client.ts","../../../../node_modules/next/src/shared/lib/invariant-error.ts","../../../../node_modules/next/src/shared/lib/segment.ts","../../../../node_modules/next/src/shared/lib/promise-with-resolvers.ts","../../../../src/components/ConfirmModal.tsx","../../../../src/components/Rail.tsx","../../../../src/components/TopBar.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes } from \"react\";\n\ntype Variant = \"primary\" | \"ghost\" | \"danger\";\n\nconst VARIANTS: Record<Variant, string> = {\n primary: \"bg-accent text-accent-ink shadow-warm hover:bg-accent-hover border border-transparent font-semibold\",\n ghost: \"bg-transparent text-text-muted border border-border hover:text-text hover:border-text-subtle\",\n danger: \"bg-transparent text-text-muted border border-border hover:text-danger hover:border-danger/50\",\n};\n\nexport function Button({\n variant = \"primary\",\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { variant?: Variant }) {\n return (\n <button\n className={`inline-flex items-center justify-center gap-1.5 rounded-brand px-3.5 py-2 text-[13px] font-medium transition-colors duration-150 cursor-pointer disabled:opacity-45 disabled:cursor-not-allowed ${VARIANTS[variant]}${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Input({ className, ...props }: React.InputHTMLAttributes<HTMLInputElement>) {\n return (\n <input\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text placeholder:text-text-subtle focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Select({ className, ...props }: React.SelectHTMLAttributes<HTMLSelectElement>) {\n return (\n <select\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Field({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-[11px] font-medium uppercase tracking-wider text-text-subtle\">\n {label}\n {hint && <span className=\"ml-1.5 lowercase tracking-normal text-text-subtle/70\">· {hint}</span>}\n </span>\n {children}\n </label>\n );\n}\n","\"use client\";\n\n/**\n * Browser-side admin client. Talks to the gateway THROUGH the same-origin proxy\n * (`/api/gw/admin/...`), which injects the admin Bearer server-side — so the\n * password never reaches the browser. Server components read initial data via\n * lib/gateway.ts directly; client components mutate through here.\n */\nimport type {\n BudgetStatus,\n ConfigReply,\n EndpointPayload,\n HeadroomStatusReply,\n InjectLevel,\n KeyUsageRow,\n ModelsPayload,\n PingResult,\n PricingPayload,\n ProviderSnapshot,\n WireFormat,\n} from \"./gateway\";\n\nexport interface ApiResult<T> {\n ok: boolean;\n status: number;\n data: T | null;\n error?: string;\n}\n\nasync function api<T>(method: string, path: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(`/api/gw${path}`, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n let data: T | null = null;\n try {\n data = text ? (JSON.parse(text) as T) : null;\n } catch {\n data = null;\n }\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\nexport const adminApi = {\n providers: () => api<{ providers: ProviderSnapshot[] }>(\"GET\", \"/admin/providers\"),\n budgets: () => api<{ budgets: BudgetStatus[] }>(\"GET\", \"/admin/budgets\"),\n models: () => api<ModelsPayload>(\"GET\", \"/admin/models\"),\n keys: () => api<Array<{ fingerprint: string; name: string; masked: string }>>(\"GET\", \"/admin/keys\"),\n keysUsage: () => api<{ keys: KeyUsageRow[] }>(\"GET\", \"/admin/keys/usage\"),\n\n setBudget: (body: {\n scope: { type: \"global\" } | { type: \"provider\"; id: string } | { type: \"model\"; id: string } | { type: \"key\"; id: string };\n unit: \"usd\" | \"tokens\";\n limit: number;\n window: \"5h\" | \"24h\" | \"7day\" | \"30day\";\n alert_at?: number;\n note?: string;\n }) => api<ConfigReply>(\"PUT\", \"/admin/budgets\", body),\n clearBudget: (key: string) => api<ConfigReply>(\"DELETE\", `/admin/budgets/${encodeURIComponent(key)}`),\n\n addProvider: (p: {\n id: string;\n format: WireFormat;\n base_url: string;\n api_key?: string;\n free?: boolean;\n auto_models?: boolean;\n service_account?: string;\n }) => api<ConfigReply>(\"POST\", \"/admin/providers\", p),\n editProvider: (id: string, patch: { base_url?: string; format?: WireFormat; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}`, patch),\n renameProvider: (id: string, newId: string) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/rename`, { id: newId }),\n removeProvider: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}`),\n addKey: (id: string, key: string, name?: string) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys`, { key, name }),\n editKey: (id: string, index: number, patch: { key?: string; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`, patch),\n removeKey: (id: string, index: number) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`),\n revealKey: (id: string, index: number) =>\n api<{ key: string }>(\"GET\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/reveal`),\n addModel: (id: string, model: string, price?: { price_in?: number; price_out?: number }) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { model, ...price }),\n addModels: (id: string, models: string[]) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { models }),\n // model id can hold a slash (provider/model); send it as a query param so the\n // proxy's path split doesn't mangle it.\n removeModel: (id: string, model: string) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models?model=${encodeURIComponent(model)}`),\n clearModels: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models`),\n pricing: () => api<PricingPayload>(\"GET\", \"/admin/pricing\"),\n setModelPrice: (id: string, model: string, price: { price_in?: number | null; price_out?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/models/price`, { model, ...price }),\n testProvider: (id: string) => api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/test`),\n testKey: (id: string, index: number) =>\n api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/test`),\n testModel: (id: string, model: string) =>\n api<{ ok: boolean; status?: number; error?: string }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/models/test?model=${encodeURIComponent(model)}`,\n ),\n validateProvider: (b: { format: WireFormat; base_url: string; api_key?: string }) =>\n api<PingResult>(\"POST\", \"/admin/providers/validate\", b),\n // discover: returns the upstream catalog flagged with which ids are in config.\n discoverModels: (id: string) =>\n api<{ ok: boolean; models: Array<{ id: string; added: boolean }> }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/connect`,\n ),\n\n reorderProvider: (from: number, to: number) =>\n api<ConfigReply>(\"PUT\", \"/admin/providers/reorder\", { from, to }),\n reorderKey: (id: string, from: number, to: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/reorder`, { from, to }),\n toggleKey: (id: string, index: number, enabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/toggle`, { enabled }),\n setProviderStrategy: (id: string, strategy: \"fallback\" | \"round-robin\" | null, sticky?: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/strategy`, { strategy, sticky }),\n setProviderDisabled: (id: string, disabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/disabled`, { disabled }),\n\n setRoute: (\n alias: string,\n body: { target: string[]; model?: string | string[]; strategy?: \"fallback\" | \"round-robin\"; price_in?: number; price_out?: number },\n ) => api<ConfigReply>(\"PUT\", `/admin/routes/${encodeURIComponent(alias)}`, body),\n removeRoute: (alias: string) => api<ConfigReply>(\"DELETE\", `/admin/routes/${encodeURIComponent(alias)}`),\n\n endpoint: () => api<EndpointPayload>(\"GET\", \"/admin/endpoint\"),\n setRtk: (enabled: boolean) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/rtk\", { enabled }),\n setCaveman: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/caveman\", { level }),\n setPonytail: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/ponytail\", { level }),\n addServerKey: (key: string, name?: string) => api<ConfigReply>(\"POST\", \"/admin/endpoint/keys\", { key, name }),\n editServerKey: (index: number, name: string) => api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}`, { name }),\n setServerKeyScope: (index: number, body: { models?: string[]; rpm?: number | null; expires?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}/scope`, body),\n removeServerKey: (index: number) => api<ConfigReply>(\"DELETE\", `/admin/endpoint/keys/${index}`),\n revealServerKey: (index: number) => api<{ key: string }>(\"GET\", `/admin/endpoint/keys/${index}/reveal`),\n\n setHeadroom: (patch: { enabled?: boolean; url?: string; compress_user_messages?: boolean }) =>\n api<ConfigReply>(\"PUT\", \"/admin/endpoint/headroom\", patch),\n headroomStatus: () => api<HeadroomStatusReply>(\"GET\", \"/admin/headroom/status\"),\n headroomStart: () => api<{ success?: boolean; pid?: number; alreadyRunning?: boolean }>(\"POST\", \"/admin/headroom/start\"),\n headroomStop: () => api<{ stopped: boolean; reason?: string; pid?: number }>(\"POST\", \"/admin/headroom/stop\"),\n\n putConfig: (text: string) => api<{ ok: boolean }>(\"PUT\", \"/admin/config\", { text }),\n\n version: () => api<{ current: string; latest: string | null; updateAvailable: boolean }>(\"GET\", \"/admin/version\"),\n shutdown: () => api<{ ok: boolean; message: string }>(\"POST\", \"/admin/shutdown\"),\n};\n\n// Local CLI-tool detection/auto-config. These hit the dashboard's OWN server\n// routes (/api/cli-detect/*), not the gateway proxy — they read/write the tool's\n// config file on this machine. Session-gated by middleware like everything else.\nexport interface CliStatus {\n auto: boolean;\n installed: boolean;\n configured?: boolean;\n path?: string;\n baseUrl?: string | null;\n models?: string[];\n activeModel?: string | null;\n // claude returns its three slot defaults instead of a flat list\n modelSlots?: { opus?: string | null; sonnet?: string | null; haiku?: string | null };\n}\n\nasync function appApi<T>(method: string, url: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n const data = text ? (JSON.parse(text) as T) : null;\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\n/** Admin account actions that hit the dashboard's OWN routes (not the gw proxy). */\nexport const account = {\n changePassword: (current: string, next: string) =>\n appApi<{ ok: boolean }>(\"POST\", \"/api/password\", { current, next }),\n};\n\nexport const cliConfig = {\n status: (tool: string) => appApi<CliStatus>(\"GET\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n apply: (tool: string, body: { base: string; key?: string; models?: string[] | Record<string, string>; active?: string }) =>\n appApi<{ success?: boolean; path?: string }>(\"POST\", `/api/cli-detect/${encodeURIComponent(tool)}`, body),\n reset: (tool: string) => appApi<{ success?: boolean }>(\"DELETE\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n};\n","export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n // Use array[0] for performant purpose\n return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n segment: Segment,\n searchParams: Record<string, string | string[] | undefined>\n) {\n const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n if (isPageSegment) {\n const stringifiedQuery = JSON.stringify(searchParams)\n return stringifiedQuery !== '{}'\n ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n : PAGE_SEGMENT_KEY\n }\n\n return segment\n}\n\nexport function computeSelectedLayoutSegment(\n segments: string[] | null,\n parallelRouteKey: string\n): string | null {\n if (!segments || segments.length === 0) {\n return null\n }\n\n // For 'children', use first segment; for other parallel routes, use last segment\n const rawSegment =\n parallelRouteKey === 'children'\n ? segments[0]\n : segments[segments.length - 1]\n\n // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n // Returning an internal value like `__DEFAULT__` would be confusing\n return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n tree: FlightRouterState,\n parallelRouteKey: string,\n first = true,\n segmentPath: string[] = []\n): string[] {\n let node: FlightRouterState\n if (first) {\n // Use the provided parallel route key on the first parallel route\n node = tree[1][parallelRouteKey]\n } else {\n // After first parallel route prefer children, if there's no children pick the first parallel route.\n const parallelRoutes = tree[1]\n node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n }\n\n if (!node) return segmentPath\n const segment = node[0]\n\n let segmentValue = getSegmentValue(segment)\n\n if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n return segmentPath\n }\n\n segmentPath.push(segmentValue)\n\n return getSelectedLayoutSegmentPath(\n node,\n parallelRouteKey,\n false,\n segmentPath\n )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\nexport const NOT_FOUND_SEGMENT_KEY = '/_not-found'\n","export function createPromiseWithResolvers<T>(): PromiseWithResolvers<T> {\n // Shim of Stage 4 Promise.withResolvers proposal\n let resolve: (value: T | PromiseLike<T>) => void\n let reject: (reason: any) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return { resolve: resolve!, reject: reject!, promise }\n}\n","\"use client\";\n\nimport { Button } from \"@/components/Button\";\nimport { Icon } from \"@/components/Icon\";\n\ninterface ConfirmModalProps {\n title: string;\n message: string;\n confirmLabel?: string;\n onConfirm: () => void;\n onCancel: () => void;\n busy?: boolean;\n}\n\nexport function ConfirmModal({ title, message, confirmLabel = \"Delete\", onConfirm, onCancel, busy }: ConfirmModalProps) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6\" onClick={onCancel}>\n <div\n className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"warning\" size={16} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">{title}</h2>\n </div>\n <p className=\"mb-4 text-[12.5px] text-text-muted\">{message}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button variant=\"danger\" disabled={busy} onClick={onConfirm}>{confirmLabel}</Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\n\n// Floating icon-rail (user's preferred chrome), carrying aigetwey's IA: Endpoint\n// is the landing, routing lives in Combos, and operational pages sit below a\n// divider. Labels surface as hover tooltips (data-label).\ntype NavItem = { href: string; label: string; icon: string };\n\nconst MAIN: NavItem[] = [\n { href: \"/\", label: \"Endpoint\", icon: \"api\" },\n { href: \"/keys\", label: \"Access Keys\", icon: \"key\" },\n { href: \"/providers\", label: \"Providers\", icon: \"dns\" },\n { href: \"/combos\", label: \"Combos\", icon: \"layers\" },\n { href: \"/usage\", label: \"Usage\", icon: \"bar_chart\" },\n { href: \"/quota\", label: \"Budgets\", icon: \"data_usage\" },\n { href: \"/tools\", label: \"CLI Tools\", icon: \"terminal\" },\n];\n\nconst SYSTEM: NavItem[] = [\n { href: \"/console\", label: \"Server Console\", icon: \"terminal\" },\n { href: \"/config\", label: \"Settings\", icon: \"settings\" },\n];\n\nexport function Rail() {\n const path = usePathname();\n const router = useRouter();\n\n async function logout() {\n await fetch(\"/api/logout\", { method: \"POST\" });\n router.replace(\"/login\");\n router.refresh();\n }\n\n // Endpoint owns both \"/\" (landing) and \"/endpoint\"; others match the segment\n // and its sub-routes (e.g. /providers/[id]).\n const isActive = (href: string) =>\n href === \"/\"\n ? path === \"/\" || path.startsWith(\"/endpoint\")\n : path === href || path.startsWith(`${href}/`);\n\n const link = (item: NavItem) => {\n const active = isActive(item.href);\n return (\n <Link\n key={item.href}\n href={item.href}\n data-label={item.label}\n className={`rail-icon${active ? \" rail-icon-active\" : \"\"}`}\n aria-label={item.label}\n >\n <Icon name={item.icon} size={20} fill={active} />\n </Link>\n );\n };\n\n return (\n <>\n <Link href=\"/\" className=\"rail-brand\" aria-label=\"aigetwey\">\n {/* \"a»\" mark — ink on the lime tile (CSS provides the tile) */}\n <svg viewBox=\"0 0 512 512\" width=\"26\" height=\"26\" aria-hidden>\n <text x=\"120\" y=\"338\" fontFamily=\"ui-sans-serif, Arial, sans-serif\" fontSize=\"260\" fontWeight=\"800\" textAnchor=\"middle\" fill=\"#14140f\">a</text>\n <g fill=\"none\" stroke=\"#14140f\" strokeWidth=\"34\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"276,182 352,256 276,330\" />\n <polyline points=\"346,182 422,256 346,330\" />\n </g>\n </svg>\n </Link>\n\n <nav className=\"flex flex-col items-center gap-3\">\n {MAIN.map(link)}\n <div className=\"rail-divider\" />\n {SYSTEM.map(link)}\n </nav>\n\n <button onClick={logout} data-label=\"Disconnect\" className=\"rail-icon\" aria-label=\"Disconnect\">\n <Icon name=\"logout\" size={19} />\n </button>\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\nimport { useTheme } from \"./ThemeProvider\";\nimport { ConfirmModal } from \"./ConfirmModal\";\nimport { adminApi } from \"@/lib/client\";\n\nconst LABELS: Record<string, string> = {\n \"\": \"Endpoint\",\n endpoint: \"Endpoint\",\n keys: \"Access Keys\",\n providers: \"Providers\",\n combos: \"Combos\",\n usage: \"Usage\",\n quota: \"Budgets\",\n tools: \"CLI Tools\",\n console: \"Server Console\",\n config: \"Settings\",\n};\n\nconst CMD = \"npm install -g aigetwey@latest\";\n\nfunction UpdateModal({\n current,\n latest,\n onClose,\n onShutdown,\n}: {\n current: string;\n latest: string;\n onClose: () => void;\n onShutdown: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n\n function copy() {\n void navigator.clipboard.writeText(CMD).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6\" onClick={onClose}>\n <div\n className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"flex h-9 w-9 flex-none items-center justify-center rounded-full bg-warning/10 text-warning\">\n <Icon name=\"arrow_upward\" size={19} />\n </span>\n <div>\n <h2 className=\"text-[14px] font-semibold text-text\">Update available</h2>\n <p className=\"text-[12px] text-text-muted\">\n v{current} → <span className=\"text-warning font-medium\">v{latest}</span>\n </p>\n </div>\n </div>\n <button onClick={onClose} className=\"text-text-subtle hover:text-text\">\n <Icon name=\"close\" size={17} />\n </button>\n </div>\n\n <p className=\"mb-3 text-[12.5px] text-text-muted\">\n Run this command in your terminal to update:\n </p>\n\n <div className=\"flex items-center gap-2 rounded-brand border border-border bg-bg px-3 py-2\">\n <code className=\"flex-1 text-[12px] text-text\">{CMD}</code>\n <button\n onClick={copy}\n className=\"flex-none text-text-subtle transition-colors hover:text-text\"\n title=\"Copy command\"\n >\n <Icon name={copied ? \"check\" : \"content_copy\"} size={14} />\n </button>\n </div>\n\n <p className=\"mt-3 text-[11.5px] text-text-subtle\">\n Shut down the gateway first, then run the command above, then restart.\n </p>\n\n <div className=\"mt-4 flex gap-2\">\n <button\n onClick={() => { copy(); onShutdown(); }}\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-brand border border-warning/30 bg-warning/10 px-3 py-2 text-[12.5px] font-medium text-warning transition-colors hover:bg-warning/20\"\n >\n <Icon name=\"content_copy\" size={14} />\n Copy & Shut down\n </button>\n <button\n onClick={onClose}\n className=\"rounded-brand border border-border px-3 py-2 text-[12.5px] text-text-muted transition-colors hover:text-text\"\n >\n Later\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function TopBar() {\n const path = usePathname();\n const { theme, toggle } = useTheme();\n const seg = path === \"/\" ? \"\" : (path.split(\"/\")[1] ?? \"\");\n const current = LABELS[seg] ?? seg;\n\n const [version, setVersion] = useState<{ current: string; latest: string | null; updateAvailable: boolean } | null>(null);\n const [showUpdate, setShowUpdate] = useState(false);\n const [confirmShutdown, setConfirmShutdown] = useState(false);\n const [stopped, setStopped] = useState(false);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n void adminApi.version().then((r) => {\n if (r.ok && r.data) setVersion(r.data);\n });\n }, []);\n\n async function doShutdown() {\n setBusy(true);\n await adminApi.shutdown();\n setStopped(true);\n setConfirmShutdown(false);\n setShowUpdate(false);\n setBusy(false);\n }\n\n return (\n <header className=\"console-topbar\">\n <div className=\"flex items-center gap-2 text-[13px]\">\n <span className=\"text-text-subtle\">aigetwey</span>\n <span className=\"text-text-subtle\">/</span>\n <span className=\"font-medium text-text\">{current}</span>\n </div>\n\n <div className=\"ml-auto flex items-center gap-2.5\">\n {version && (\n version.updateAvailable ? (\n <button\n onClick={() => setShowUpdate(true)}\n className=\"flex items-center gap-1.5 rounded-full border border-warning/30 bg-warning/10 px-2.5 py-1 text-[11px] font-medium text-warning transition-colors hover:bg-warning/20\"\n >\n <Icon name=\"arrow_upward\" size={12} />\n v{version.current} → {version.latest}\n </button>\n ) : (\n <span className=\"text-[11px] text-text-subtle\" title=\"You're on the latest version\">\n v{version.current}\n </span>\n )\n )}\n\n <button\n onClick={toggle}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-text\"\n aria-label=\"Toggle theme\"\n title={theme === \"dark\" ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n <Icon name={theme === \"dark\" ? \"light_mode\" : \"dark_mode\"} size={18} />\n </button>\n\n <button\n onClick={() => setConfirmShutdown(true)}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-danger\"\n aria-label=\"Shut down gateway\"\n title=\"Shut down the gateway\"\n >\n <Icon name=\"power_settings_new\" size={18} />\n </button>\n\n <div className=\"flex items-center gap-2 rounded-full border border-border bg-surface py-1 pl-1 pr-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-accent text-[11px] font-bold text-accent-ink\">\n A\n </span>\n <span className=\"text-[12px] text-text-muted\">admin</span>\n </div>\n </div>\n\n {showUpdate && version?.updateAvailable && (\n <UpdateModal\n current={version.current}\n latest={version.latest!}\n onClose={() => setShowUpdate(false)}\n onShutdown={doShutdown}\n />\n )}\n\n {confirmShutdown && (\n <ConfirmModal\n title=\"Shut down gateway?\"\n message=\"The gateway process will stop and all requests will fail until you restart it. The dashboard stays up but can't reach the gateway.\"\n confirmLabel=\"Shut down\"\n busy={busy}\n onConfirm={doShutdown}\n onCancel={() => setConfirmShutdown(false)}\n />\n )}\n\n {stopped && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 p-6\">\n <div className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 text-center shadow-elevated\">\n <span className=\"mx-auto mb-2 flex h-9 w-9 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"power_settings_new\" size={20} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">Gateway stopped</h2>\n <p className=\"mt-1 text-[12.5px] text-text-muted\">\n Run <code className=\"rounded bg-surface-2 px-1\">{CMD}</code> then restart with <code className=\"rounded bg-surface-2 px-1\">aigetwey</code>.\n </p>\n </div>\n </div>\n )}\n </header>\n );\n}\n"],"names":["VARIANTS","primary","ghost","danger","Button","variant","className","props","Input","Select","Field","label","hint","children","api","method","path","body","res","fetch","headers","undefined","JSON","stringify","e","ok","status","data","error","message","text","parse","err","adminApi","providers","budgets","models","keys","keysUsage","setBudget","clearBudget","key","encodeURIComponent","addProvider","p","editProvider","id","patch","renameProvider","newId","removeProvider","addKey","name","editKey","index","removeKey","revealKey","addModel","model","price","addModels","removeModel","clearModels","pricing","setModelPrice","testProvider","testKey","testModel","validateProvider","b","discoverModels","reorderProvider","from","to","reorderKey","toggleKey","enabled","setProviderStrategy","strategy","sticky","setProviderDisabled","disabled","setRoute","alias","removeRoute","endpoint","setRtk","setCaveman","level","setPonytail","addServerKey","editServerKey","setServerKeyScope","removeServerKey","revealServerKey","setHeadroom","headroomStatus","headroomStart","headroomStop","putConfig","version","shutdown","appApi","url","account","changePassword","current","next","cliConfig","tool","apply","reset","InvariantError","Error","constructor","options","endsWith","DEFAULT_SEGMENT_KEY","NOT_FOUND_SEGMENT_KEY","PAGE_SEGMENT_KEY","addSearchParamsIfPageSegment","computeSelectedLayoutSegment","getSegmentValue","getSelectedLayoutSegmentPath","isGroupSegment","isParallelRouteSegment","segment","Array","isArray","startsWith","searchParams","isPageSegment","includes","stringifiedQuery","segments","parallelRouteKey","length","rawSegment","tree","first","segmentPath","node","parallelRoutes","Object","values","segmentValue","push","createPromiseWithResolvers","resolve","reject","promise","Promise","rej","ConfirmModal","title","confirmLabel","onConfirm","onCancel","busy","onClick","stopPropagation","size","MAIN","href","icon","SYSTEM","Rail","router","logout","replace","refresh","isActive","link","item","active","fill","viewBox","width","height","x","y","fontFamily","fontSize","fontWeight","textAnchor","stroke","strokeWidth","strokeLinecap","strokeLinejoin","points","map","LABELS","combos","usage","quota","tools","console","config","CMD","UpdateModal","latest","onClose","onShutdown","copied","setCopied","copy","navigator","clipboard","writeText","then","setTimeout","TopBar","theme","toggle","seg","split","setVersion","showUpdate","setShowUpdate","confirmShutdown","setConfirmShutdown","stopped","setStopped","setBusy","r","doShutdown","updateAvailable"],"mappings":"uDAIA,IAAMA,EAAoC,CACxCC,QAAS,sGACTC,MAAO,+FACPC,OAAQ,8FACV,kBAEO,SAASC,AAAO,SACrBC,EAAU,SAAS,WACnBC,CAAS,CACT,GAAGC,EAC6D,EAChE,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCD,UAAW,CAAC,gMAAgM,EAAEN,CAAQ,CAACK,EAAQ,CAAA,EAAGC,EAAY,CAAC,CAAC,EAAEA,EAAAA,CAAW,CAAG,GAAA,CAAI,CACnQ,GAAGC,CAAK,EAGf,YAoBO,SAASG,AAAM,OACpBC,CAAK,MACLC,CAAI,UACJC,CAAQ,CAKT,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAMP,UAAU,kCACf,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKA,UAAU,8EACbK,EACAC,GAAQ,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKN,UAAU,iEAAuD,KAAGM,QAEpFC,IAGP,YApCO,SAASL,AAAM,WAAEF,CAAS,CAAE,GAAGC,EAAoD,EACxF,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACCD,UAAW,CAAC,qKAAqK,EAAEA,EAAY,CAAC,CAAC,EAAEA,EAAAA,CAAW,CAAG,GAAA,CAAI,CACpN,GAAGC,CAAK,EAGf,aAEO,SAASE,AAAO,WAAEH,CAAS,CAAE,GAAGC,EAAsD,EAC3F,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCD,UAAW,CAAC,wIAAwI,EAAEA,EAAY,CAAC,CAAC,EAAEA,EAAAA,CAAW,CAAG,GAAA,CAAI,CACvL,GAAGC,CAAK,EAGf,4BCVA,eAAeO,EAAOC,CAAc,CAAEC,CAAY,CAAEC,CAAc,MAC5DC,EACJ,GAAI,CACFA,EAAM,MAAMC,MAAM,CAAC,OAAO,EAAEH,EAAAA,CAAM,CAAE,CAClCD,SACAK,aAAkBC,IAATJ,EAAqB,CAAE,eAAgB,kBAAmB,EAAI,CAAC,EACxEA,UAAeI,IAATJ,EAAqBK,KAAKC,SAAS,CAACN,QAAQI,CACpD,EACF,CAAE,MAAOG,EAAG,CACV,MAAO,CAAEC,IAAI,EAAOC,OAAQ,EAAGC,KAAM,KAAMC,MAAQJ,EAAYK,OAAO,AAAC,CACzE,CACA,IAAMC,EAAO,MAAMZ,EAAIY,IAAI,GACvBH,EAAiB,KACrB,GAAI,CACFA,EAAOG,EAAQR,KAAKS,KAAK,CAACD,GAAc,IAC1C,CAAE,KAAM,CACNH,EAAO,IACT,CACA,GAAI,CAACT,EAAIO,EAAE,CAAE,CACX,IAAMO,EAAOL,GAAoCC,OAAS,CAAC,gBAAgB,EAAEV,EAAIQ,MAAM,CAAC,CAAC,CAAC,CAC1F,MAAO,CAAED,GAAI,GAAOC,OAAQR,EAAIQ,MAAM,MAAEC,EAAMC,MAAOI,CAAI,CAC3D,CACA,MAAO,CAAEP,IAAI,EAAMC,OAAQR,EAAIQ,MAAM,MAAEC,CAAK,CAC9C,CA6HA,eAAe2E,EAAUvF,CAAc,CAAEwF,CAAW,CAAEtF,CAAc,MAC9DC,EACJ,GAAI,CACFA,EAAM,MAAMC,MAAMoF,EAAK,CACrBxF,SACAK,aAAkBC,IAATJ,EAAqB,CAAE,eAAgB,kBAAmB,EAAI,CAAC,EACxEA,UAAeI,IAATJ,EAAqBK,KAAKC,SAAS,CAACN,GAAQI,MACpD,EACF,CAAE,MAAOG,EAAG,CACV,MAAO,CAAEC,IAAI,EAAOC,OAAQ,EAAGC,KAAM,KAAMC,MAAQJ,EAAYK,OAAO,AAAC,CACzE,CACA,IAAMC,EAAO,MAAMZ,EAAIY,IAAI,GACrBH,EAAOG,EAAQR,KAAKS,KAAK,CAACD,GAAc,KAC9C,GAAI,CAACZ,EAAIO,EAAE,CAAE,CACX,IAAMO,EAAOL,GAAoCC,OAAS,CAAC,gBAAgB,EAAEV,EAAIQ,MAAM,CAAC,CAAC,CAAC,CAC1F,MAAO,CAAED,GAAI,GAAOC,OAAQR,EAAIQ,MAAM,MAAEC,EAAMC,MAAOI,CAAI,CAC3D,CACA,MAAO,CAAEP,IAAI,EAAMC,OAAQR,EAAIQ,MAAM,MAAEC,CAAK,CAC9C,kBAGuB,CACrB8E,eAAgB,CAACC,EAAiBC,IAChCL,EAAwB,OAAQ,gBAAiB,SAAEI,OAASC,CAAK,EACrE,eAnJwB,CACtBzE,UAAW,IAAMpB,EAAuC,MAAO,oBAC/DqB,QAAS,IAAMrB,EAAiC,MAAO,kBACvDsB,OAAQ,IAAMtB,EAAmB,MAAO,iBACxCuB,KAAM,IAAMvB,EAAkE,MAAO,eACrFwB,UAAW,IAAMxB,EAA6B,MAAO,qBAErDyB,UAAYtB,AAAD,GAOLH,EAAiB,MAAO,iBAAkBG,GAChDuB,YAAa,AAACC,GAAgB3B,EAAiB,SAAU,CAAC,eAAe,EAAE4B,mBAAmBD,GAAAA,CAAM,EAEpGE,YAAa,AAACC,GAQR9B,EAAiB,OAAQ,mBAAoB8B,GACnDC,aAAc,CAACC,EAAYC,IACzBjC,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAAA,CAAK,CAAEC,GACxEC,eAAgB,CAACF,EAAYG,IAC3BnC,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,OAAO,CAAC,CAAE,CAAEA,GAAIG,CAAM,GAC3FC,eAAgB,AAACJ,GAAehC,EAAiB,SAAU,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAAA,CAAK,EACvGK,OAAQ,CAACL,EAAYL,EAAaW,IAChCtC,EAAiB,OAAQ,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,KAAK,CAAC,CAAE,KAAEL,OAAKW,CAAK,GAC1FC,QAAS,CAACP,EAAYQ,EAAeP,IACnCjC,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,MAAM,EAAEQ,EAAAA,CAAO,CAAEP,GACtFQ,UAAW,CAACT,EAAYQ,IACtBxC,EAAiB,SAAU,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,MAAM,EAAEQ,EAAAA,CAAO,EACvFE,UAAW,CAACV,EAAYQ,IACtBxC,EAAqB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,MAAM,EAAEQ,EAAM,OAAO,CAAC,EAC/FG,SAAU,CAACX,EAAYY,EAAeC,IACpC7C,EAAiB,OAAQ,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,OAAO,CAAC,CAAE,OAAEY,EAAO,GAAGC,CAAK,AAAC,GAClGC,UAAW,CAACd,EAAYV,IACtBtB,EAAiB,OAAQ,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,OAAO,CAAC,CAAE,QAAEV,CAAO,GAGzFyB,YAAa,CAACf,EAAYY,IACxB5C,EAAiB,SAAU,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,cAAc,EAAEJ,mBAAmBgB,GAAAA,CAAQ,EACnHI,YAAa,AAAChB,GAAehC,EAAiB,SAAU,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,OAAO,CAAC,EAC3GiB,QAAS,IAAMjD,EAAoB,MAAO,kBAC1CkD,cAAe,CAAClB,EAAYY,EAAeC,IACzC7C,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,aAAa,CAAC,CAAE,CAAEY,QAAO,GAAGC,CAAK,AAAC,GACvGM,aAAenB,AAAD,GAAgBhC,EAAgB,OAAQ,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,KAAK,CAAC,EACvGoB,QAAS,CAACpB,EAAYQ,IACpBxC,EAAgB,OAAQ,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,MAAM,EAAEQ,EAAM,KAAK,CAAC,EACzFa,UAAW,CAACrB,EAAYY,IACtB5C,EACE,OACA,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,mBAAmB,EAAEJ,mBAAmBgB,GAAAA,CAAQ,EAE/FU,iBAAkB,AAACC,GACjBvD,EAAgB,OAAQ,4BAA6BuD,GAEvDC,eAAgB,AAACxB,GACfhC,EACE,OACA,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,QAAQ,CAAC,EAGxDyB,gBAAiB,CAACC,EAAcC,IAC9B3D,EAAiB,MAAO,2BAA4B,CAAE0D,UAAMC,CAAG,GACjEC,WAAY,CAAC5B,EAAY0B,EAAcC,IACrC3D,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,aAAa,CAAC,CAAE,MAAE0B,KAAMC,CAAG,GAChGE,UAAW,CAAC7B,EAAYQ,EAAesB,IACrC9D,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,MAAM,EAAEQ,EAAM,OAAO,CAAC,CAAE,CAAEsB,SAAQ,GACvGC,oBAAqB,CAAC/B,EAAYgC,EAA6CC,IAC7EjE,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,SAAS,CAAC,CAAE,UAAEgC,SAAUC,CAAO,GACpGC,oBAAqB,CAAClC,EAAYmC,IAChCnE,EAAiB,MAAO,CAAC,iBAAiB,EAAE4B,mBAAmBI,GAAI,SAAS,CAAC,CAAE,UAAEmC,CAAS,GAE5FC,SAAU,CACRC,EACAlE,IACGH,EAAiB,MAAO,CAAC,cAAc,EAAE4B,mBAAmByC,GAAAA,CAAQ,CAAElE,GAC3EmE,YAAa,AAACD,GAAkBrE,EAAiB,SAAU,CAAC,cAAc,EAAE4B,mBAAmByC,GAAAA,CAAQ,EAEvGE,SAAU,IAAMvE,EAAqB,MAAO,mBAC5CwE,OAAQ,AAACV,GAAqB9D,EAAiB,MAAO,sBAAuB,SAAE8D,CAAQ,GACvFW,WAAaC,AAAD,GAAwB1E,EAAiB,MAAO,0BAA2B,OAAE0E,CAAM,GAC/FC,YAAa,AAACD,GAAuB1E,EAAiB,MAAO,2BAA4B,OAAE0E,CAAM,GACjGE,aAAc,CAACjD,EAAaW,IAAkBtC,EAAiB,OAAQ,uBAAwB,KAAE2B,OAAKW,CAAK,GAC3GuC,cAAe,CAACrC,EAAeF,IAAiBtC,EAAiB,MAAO,CAAC,qBAAqB,EAAEwC,EAAAA,CAAO,CAAE,MAAEF,CAAK,GAChHwC,kBAAmB,CAACtC,EAAerC,IACjCH,EAAiB,MAAO,CAAC,qBAAqB,EAAEwC,EAAM,MAAM,CAAC,CAAErC,GACjE4E,gBAAiB,AAACvC,GAAkBxC,EAAiB,SAAU,CAAC,qBAAqB,EAAEwC,EAAAA,CAAO,EAC9FwC,gBAAiB,AAACxC,GAAkBxC,EAAqB,MAAO,CAAC,qBAAqB,EAAEwC,EAAM,OAAO,CAAC,EAEtGyC,YAAchD,AAAD,GACXjC,EAAiB,MAAO,2BAA4BiC,GACtDiD,eAAgB,IAAMlF,EAAyB,MAAO,0BACtDmF,cAAe,IAAMnF,EAAmE,OAAQ,yBAChGoF,aAAc,IAAMpF,EAAyD,OAAQ,wBAErFqF,UAAW,AAACrE,GAAiBhB,EAAqB,MAAO,gBAAiB,MAAEgB,CAAK,GAEjFsE,QAAS,IAAMtF,EAA0E,MAAO,kBAChGuF,SAAU,IAAMvF,EAAsC,OAAQ,kBAChE,gBA2CyB,CACvBY,OAAQ,AAACmF,GAAiBP,EAAkB,MAAO,CAAC,gBAAgB,EAAE5D,mBAAmBmE,GAAAA,CAAO,EAChGC,MAAO,CAACD,EAAc5F,IACpBqF,EAA6C,OAAQ,CAAC,gBAAgB,EAAE5D,mBAAmBmE,GAAAA,CAAO,CAAE5F,GACtG8F,MAAO,AAACF,GAAiBP,EAA8B,SAAU,CAAC,gBAAgB,EAAE5D,mBAAmBmE,GAAAA,CAAO,CAChH,2GChNaG,iBAAAA,qCAAAA,IAAN,OAAMA,UAAuBC,MAClCC,YAAYrF,CAAe,CAAEsF,CAAsB,CAAE,CACnD,KAAK,CACH,CAAC,WAAW,EAAEtF,EAAQuF,QAAQ,CAAC,KAAOvF,EAAUA,EAAU,IAAI,0BAA0B,CAAC,CACzFsF,GAEF,IAAI,CAAC/D,IAAI,CAAG,gBACd,CACF,wFC+EaiE,mBAAmB,CAAA,kBAAnBA,GACAC,qBAAqB,CAAA,kBAArBA,GAFAC,gBAAgB,CAAA,kBAAhBA,GAvEGC,4BAA4B,CAAA,kBAA5BA,GAgBAC,4BAA4B,CAAA,kBAA5BA,GA7BAC,eAAe,CAAA,kBAAfA,GAiDAC,4BAA4B,CAAA,kBAA5BA,AAAT,SAASA,EACde,CAAuB,CACvBH,CAAwB,CACxBI,GAAQ,CAAI,CACZC,EAAwB,EAAE,MAEtBC,EACJ,GAAIF,EAEFE,EAAOH,CAAI,CAAC,CAFH,CAEK,CAACH,EAAiB,KAC3B,CAEL,IAAMO,EAAiBJ,CAAI,CAAC,EAAE,CAC9BG,EAAOC,EAAejI,QAAQ,EAAIkI,OAAOC,MAAM,CAACF,EAAe,CAAC,EAAE,AACpE,CAEA,GAAI,CAACD,EAAM,OAAOD,EAGlB,IAAIK,EAAevB,EAFHmB,CAAI,CAAC,EAAE,QAIvB,AAAI,CAACI,CAF8BnB,EAEdmB,EAAahB,UAAU,CAACV,GACpCqB,GAGTA,EAAYM,IAAI,CAACD,GAEVtB,EACLkB,CAP8D,CAQ9DN,GACA,EACAK,GAEJ,GA9EgBhB,cAAc,CAAA,kBAAdA,GAKAC,sBAAsB,CAAA,kBAAtBA,uEATT,SAASH,EAAgBI,CAAgB,EAC9C,OAAOC,MAAMC,OAAO,CAACF,GAAWA,CAAO,CAAC,EAAE,CAAGA,CAC/C,CAEO,SAASF,EAAeE,CAAe,EAE5C,MAAsB,MAAfA,CAAO,CAAC,EAAE,EAAYA,EAAQV,QAAQ,CAAC,IAChD,CAEO,SAASS,EAAuBC,CAAe,EACpD,OAAOA,EAAQG,UAAU,CAAC,MAAoB,cAAZH,CACpC,CAEO,SAASN,EACdM,CAAgB,CAChBI,CAA2D,EAI3D,GAFsBJ,CAElBK,CAF0BC,QAAQ,CAACb,GAEpB,CACjB,IAAMc,EAAmB/G,KAAKC,SAAS,CAAC2G,GACxC,MAA4B,OAArBG,EACHd,EAAmB,IAAMc,EACzBd,CACN,CAEA,OAAOO,CACT,CAEO,SAASL,EACda,CAAyB,CACzBC,CAAwB,EAExB,GAAI,CAACD,GAAgC,GAAG,CAAvBA,EAASE,MAAM,CAC9B,OAAO,KAIT,IAAMC,EACiB,aAArBF,EACID,CAAQ,CAAC,EAAE,CACXA,CAAQ,CAACA,EAASE,MAAM,CAAG,EAAE,CAInC,OAAOC,IAAepB,EAAsB,KAAOoB,CACrD,CAsCO,IAAMlB,EAAmB,WACnBF,EAAsB,cACtBC,EAAwB,4CCxF9B,SAAS6B,IAId,IAFIC,EACAC,EACEC,EAAU,IAAIC,QAAW,CAACrI,EAAKsI,KACnCJ,EAAUlI,EACVmI,EAASG,CACX,GACA,MAAO,CAAEJ,QAASA,EAAUC,OAAQA,UAASC,CAAQ,CACvD,0EATgBH,6BAAAA,qCAAAA,8CCEhB,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,6BAWO,SAASM,AAAa,OAAEC,CAAK,SAAE7H,CAAO,cAAE8H,EAAe,QAAQ,WAAEC,CAAS,UAAEC,CAAQ,MAAEC,CAAI,CAAqB,EACpH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIxJ,UAAU,sEAAsEyJ,QAASF,WAC5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACCvJ,UAAU,uFACVyJ,QAAS,AAACvI,GAAMA,EAAEwI,eAAe,aAEjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI1J,UAAU,yCACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,0FACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,UAAU6G,KAAM,OAE7B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG3J,UAAU,+CAAuCoJ,OAEvD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEpJ,UAAU,8CAAsCuB,IACnD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIvB,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAACD,QAAQ,QAAQ0J,QAASF,WAAU,WAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAACxJ,QAAQ,SAAS4E,SAAU6E,EAAMC,QAASH,WAAYD,WAKxE,6CCjCA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAOA,IAAMO,EAAkB,CACtB,CAAEC,KAAM,IAAKxJ,MAAO,WAAYyJ,KAAM,KAAM,EAC5C,CAAED,KAAM,QAASxJ,MAAO,cAAeyJ,KAAM,KAAM,EACnD,CAAED,KAAM,aAAcxJ,MAAO,YAAayJ,KAAM,KAAM,EACtD,CAAED,KAAM,UAAWxJ,MAAO,SAAUyJ,KAAM,QAAS,EACnD,CAAED,KAAM,SAAUxJ,MAAO,QAASyJ,KAAM,WAAY,EACpD,CAAED,KAAM,SAAUxJ,MAAO,UAAWyJ,KAAM,YAAa,EACvD,CAAED,KAAM,SAAUxJ,MAAO,YAAayJ,KAAM,UAAW,EACxD,CAEKC,EAAoB,CACxB,CAAEF,KAAM,WAAYxJ,MAAO,iBAAkByJ,KAAM,UAAW,EAC9D,CAAED,KAAM,UAAWxJ,MAAO,WAAYyJ,KAAM,UAAW,EACxD,eAEM,SAASE,EACd,IAAMtJ,EAAO,CAAA,EAAA,EAAA,WAAA,AAAW,IAClBuJ,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAExB,eAAeC,IACb,MAAMrJ,MAAM,cAAe,CAAEJ,OAAQ,MAAO,GAC5CwJ,EAAOE,OAAO,CAAC,UACfF,EAAOG,OAAO,EAChB,CASA,IAAME,EAAO,AAACC,IACZ,MAAMC,EALNX,AAAS,OADOA,AAMDQ,EAASE,EAAKV,IAAI,EAJpB,MAATnJ,GAAgBA,EAAKiH,UAAU,CAAC,aAChCjH,IAASmJ,GAAQnJ,EAAKiH,UAAU,CAAC,CAAA,EAAGkC,EAAK,CAAC,CAAC,EAI/C,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAEHA,KAAMU,EAAKV,IAAI,CACf,aAAYU,EAAKlK,KAAK,CACtBL,UAAW,CAAC,SAAS,EAAEwK,EAAS,oBAAsB,GAAA,CAAI,CAC1D,aAAYD,EAAKlK,KAAK,UAEtB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAACyC,KAAMyH,EAAKT,IAAI,CAAEH,KAAM,GAAIc,KAAMD,KANlCD,EAAKV,IAAI,CASpB,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAACA,KAAK,IAAI7J,UAAU,aAAa,aAAW,oBAE/C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI0K,QAAQ,cAAcC,MAAM,KAAKC,OAAO,KAAK,aAAW,CAAA,CAAA,YAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,EAAE,MAAMC,EAAE,MAAMC,WAAW,mCAAmCC,SAAS,MAAMC,WAAW,MAAMC,WAAW,SAAST,KAAK,mBAAU,MACvI,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEA,KAAK,OAAOU,OAAO,UAAUC,YAAY,KAAKC,cAAc,QAAQC,eAAe,kBACpF,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CAASC,OAAO,4BACjB,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CAASA,OAAO,oCAKvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIvL,UAAU,6CACZ4J,EAAK4B,GAAG,CAAClB,GACV,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAItK,UAAU,iBACd+J,EAAOyB,GAAG,CAAClB,MAGd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOb,QAASS,EAAQ,aAAW,aAAalK,UAAU,YAAY,aAAW,sBAChF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,SAAS6G,KAAM,SAIlC,4CChFA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,IAAM8B,EAAiC,CACrC,GAAI,WACJ1G,SAAU,WACVhD,KAAM,cACNH,UAAW,YACX8J,OAAQ,SACRC,MAAO,QACPC,MAAO,UACPC,MAAO,YACPC,QAAS,iBACTC,OAAQ,UACV,EAEMC,EAAM,iCAEZ,SAASC,EAAY,SACnB7F,CAAO,QACP8F,CAAM,SACNC,CAAO,YACPC,CAAU,CAMX,EACC,GAAM,CAACC,EAAQC,EAAU,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAErC,SAASC,IACFC,UAAUC,SAAS,CAACC,SAAS,CAACV,GAAKW,IAAI,CAAC,KAC3CL,GAAU,GACVM,WAAW,IAAMN,GAAU,GAAQ,IACrC,EACF,CAEA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAItM,UAAU,sEAAsEyJ,QAAS0C,WAC5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACCnM,UAAU,uFACVyJ,QAAS,AAACvI,GAAMA,EAAEwI,eAAe,aAEjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI1J,UAAU,wDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,sCACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,sGACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,eAAe6G,KAAM,OAElC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG3J,UAAU,+CAAsC,qBACpD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEA,UAAU,wCAA8B,IACvCoG,EAAQ,MAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKpG,UAAU,qCAA2B,IAAEkM,cAIhE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOzC,QAAS0C,EAASnM,UAAU,4CAClC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,QAAQ6G,KAAM,UAI7B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE3J,UAAU,8CAAqC,iDAIlD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,uFACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,wCAAgCgM,IAChD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCvC,QAAS8C,EACTvM,UAAU,+DACVoJ,MAAM,wBAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAACtG,KAAMuJ,EAAS,QAAU,eAAgB1C,KAAM,UAIzD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE3J,UAAU,+CAAsC,2EAInD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,4BACb,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACCyJ,QAAS,KAAQ8C,IAAQH,GAAc,EACvCpM,UAAU,wMAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,eAAe6G,KAAM,KAAM,sBAGxC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCF,QAAS0C,EACTnM,UAAU,wHACX,iBAOX,iBAEO,SAAS6M,EACd,IAAMnM,EAAO,CAAA,EAAA,EAAA,WAAA,AAAW,IAClB,CAAEoM,OAAK,QAAEC,CAAM,CAAE,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,IACpBC,EAAe,MAATtM,EAAe,GAAMA,EAAKuM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAI,GACjD7G,EAAUqF,CAAM,CAACuB,EAAI,EAAIA,EAEzB,CAAClH,EAASoH,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA8E,MAC9G,CAACC,EAAYC,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAACC,EAAiBC,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAChE,EAAMiE,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAQjC,eAAeE,IACbF,GAAQ,GACR,MAAM,EAAA,QAAQ,CAAC1H,QAAQ,GACvByH,EAAW,IACXF,GAAmB,GACnBF,GAAc,GACdK,GAAQ,EACV,CAEA,MAfA,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACH,EAAA,QAAQ,CAAC3H,OAAO,GAAG6G,IAAI,CAAC,AAACe,IACxBA,EAAEvM,EAAE,EAAIuM,EAAErM,IAAI,EAAE6L,EAAWQ,EAAErM,IAAI,CACvC,EACF,EAAG,EAAE,EAYH,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOrB,UAAU,2BAChB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,gDACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,4BAAmB,aACnC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,4BAAmB,MACnC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,iCAAyBoG,OAG3C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIpG,UAAU,8CACZ8F,IACCA,EAAQ8H,KADE,UACa,CACrB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACCnE,QAAS,IAAM2D,GAAc,GAC7BpN,UAAU,iLAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,eAAe6G,KAAM,KAAM,IACpC7D,EAAQM,OAAO,CAAC,MAAIN,EAAQoG,MAAM,IAGtC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKlM,UAAU,+BAA+BoJ,MAAM,yCAA+B,IAChFtD,EAAQM,OAAO,IAGvB,CAEA,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCqD,QAASsD,EACT/M,UAAU,2GACV,aAAW,eACXoJ,MAAiB,SAAV0D,EAAmB,uBAAyB,+BAEnD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAChK,KAAgB,SAAVgK,EAAmB,aAAe,YAAanD,KAAM,OAGnE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCF,QAAS,IAAM6D,EAAmB,IAClCtN,UAAU,6GACV,aAAW,oBACXoJ,MAAM,iCAEN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAACtG,KAAK,qBAAqB6G,KAAM,OAGxC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI3J,UAAU,gGACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,iHAAwG,MAGxH,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,uCAA8B,gBAIjDmN,GAAcrH,GAAS8H,iBACtB,CAAA,EAAA,EAAA,GAAA,EAAC3B,EAAAA,CACC7F,QAASN,EAAQM,OAAO,CACxB8F,OAAQpG,EAAQoG,MAAM,CACtBC,QAAS,IAAMiB,GAAc,GAC7BhB,WAAYuB,IAIfN,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,YAAY,CAAA,CACXjE,MAAM,qBACN7H,QAAQ,qIACR8H,aAAa,YACbG,KAAMA,EACNF,UAAWqE,EACXpE,SAAU,IAAM+D,EAAmB,MAItCC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIvN,UAAU,+EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,6GACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,uGACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC8C,KAAK,qBAAqB6G,KAAM,OAExC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG3J,UAAU,+CAAsC,oBACpD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEA,UAAU,+CAAqC,OAC5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,qCAA6BgM,IAAW,sBAAmB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKhM,UAAU,qCAA4B,aAAe,cAOxJ","ignoreList":[2,3,4]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Button.tsx","../../../../src/lib/client.ts","../../../../node_modules/next/src/shared/lib/invariant-error.ts","../../../../node_modules/next/src/shared/lib/segment.ts","../../../../node_modules/next/src/shared/lib/promise-with-resolvers.ts","../../../../src/components/ConfirmModal.tsx","../../../../src/components/Rail.tsx","../../../../src/components/TopBar.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes } from \"react\";\n\ntype Variant = \"primary\" | \"ghost\" | \"danger\";\n\nconst VARIANTS: Record<Variant, string> = {\n primary: \"bg-accent text-accent-ink shadow-warm hover:bg-accent-hover border border-transparent font-semibold\",\n ghost: \"bg-transparent text-text-muted border border-border hover:text-text hover:border-text-subtle\",\n danger: \"bg-transparent text-text-muted border border-border hover:text-danger hover:border-danger/50\",\n};\n\nexport function Button({\n variant = \"primary\",\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { variant?: Variant }) {\n return (\n <button\n className={`inline-flex items-center justify-center gap-1.5 rounded-brand px-3.5 py-2 text-[13px] font-medium transition-colors duration-150 cursor-pointer disabled:opacity-45 disabled:cursor-not-allowed ${VARIANTS[variant]}${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Input({ className, ...props }: React.InputHTMLAttributes<HTMLInputElement>) {\n return (\n <input\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text placeholder:text-text-subtle focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Select({ className, ...props }: React.SelectHTMLAttributes<HTMLSelectElement>) {\n return (\n <select\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Field({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-[11px] font-medium uppercase tracking-wider text-text-subtle\">\n {label}\n {hint && <span className=\"ml-1.5 lowercase tracking-normal text-text-subtle/70\">· {hint}</span>}\n </span>\n {children}\n </label>\n );\n}\n","\"use client\";\n\n/**\n * Browser-side admin client. Talks to the gateway THROUGH the same-origin proxy\n * (`/api/gw/admin/...`), which injects the admin Bearer server-side — so the\n * password never reaches the browser. Server components read initial data via\n * lib/gateway.ts directly; client components mutate through here.\n */\nimport type {\n BudgetStatus,\n ConfigReply,\n EndpointPayload,\n HeadroomStatusReply,\n InjectLevel,\n KeyUsageRow,\n ModelsPayload,\n PingResult,\n PricingPayload,\n ProviderSnapshot,\n WireFormat,\n} from \"./gateway\";\n\nexport interface ApiResult<T> {\n ok: boolean;\n status: number;\n data: T | null;\n error?: string;\n}\n\nasync function api<T>(method: string, path: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(`/api/gw${path}`, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n let data: T | null = null;\n try {\n data = text ? (JSON.parse(text) as T) : null;\n } catch {\n data = null;\n }\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\nexport const adminApi = {\n providers: () => api<{ providers: ProviderSnapshot[] }>(\"GET\", \"/admin/providers\"),\n budgets: () => api<{ budgets: BudgetStatus[] }>(\"GET\", \"/admin/budgets\"),\n models: () => api<ModelsPayload>(\"GET\", \"/admin/models\"),\n keys: () => api<Array<{ fingerprint: string; name: string; masked: string }>>(\"GET\", \"/admin/keys\"),\n keysUsage: () => api<{ keys: KeyUsageRow[] }>(\"GET\", \"/admin/keys/usage\"),\n\n setBudget: (body: {\n scope: { type: \"global\" } | { type: \"provider\"; id: string } | { type: \"model\"; id: string } | { type: \"key\"; id: string };\n unit: \"usd\" | \"tokens\";\n limit: number;\n window: \"5h\" | \"24h\" | \"7day\" | \"30day\";\n alert_at?: number;\n note?: string;\n }) => api<ConfigReply>(\"PUT\", \"/admin/budgets\", body),\n clearBudget: (key: string) => api<ConfigReply>(\"DELETE\", `/admin/budgets/${encodeURIComponent(key)}`),\n\n addProvider: (p: {\n id: string;\n name?: string;\n format: WireFormat;\n base_url: string;\n api_key?: string;\n free?: boolean;\n auto_models?: boolean;\n service_account?: string;\n }) => api<ConfigReply>(\"POST\", \"/admin/providers\", p),\n editProvider: (id: string, patch: { base_url?: string; format?: WireFormat; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}`, patch),\n renameProvider: (id: string, newId: string) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/rename`, { id: newId }),\n removeProvider: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}`),\n addKey: (id: string, key: string, name?: string) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys`, { key, name }),\n editKey: (id: string, index: number, patch: { key?: string; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`, patch),\n removeKey: (id: string, index: number) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`),\n revealKey: (id: string, index: number) =>\n api<{ key: string }>(\"GET\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/reveal`),\n addModel: (id: string, model: string, price?: { price_in?: number; price_out?: number }) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { model, ...price }),\n addModels: (id: string, models: string[]) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { models }),\n // model id can hold a slash (provider/model); send it as a query param so the\n // proxy's path split doesn't mangle it.\n removeModel: (id: string, model: string) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models?model=${encodeURIComponent(model)}`),\n clearModels: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models`),\n pricing: () => api<PricingPayload>(\"GET\", \"/admin/pricing\"),\n setModelPrice: (id: string, model: string, price: { price_in?: number | null; price_out?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/models/price`, { model, ...price }),\n testProvider: (id: string) => api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/test`),\n testKey: (id: string, index: number) =>\n api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/test`),\n testModel: (id: string, model: string) =>\n api<{ ok: boolean; status?: number; error?: string }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/models/test?model=${encodeURIComponent(model)}`,\n ),\n validateProvider: (b: { format: WireFormat; base_url: string; api_key?: string }) =>\n api<PingResult>(\"POST\", \"/admin/providers/validate\", b),\n // discover: returns the upstream catalog flagged with which ids are in config.\n discoverModels: (id: string) =>\n api<{ ok: boolean; models: Array<{ id: string; added: boolean }> }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/connect`,\n ),\n\n reorderProvider: (from: number, to: number) =>\n api<ConfigReply>(\"PUT\", \"/admin/providers/reorder\", { from, to }),\n reorderKey: (id: string, from: number, to: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/reorder`, { from, to }),\n toggleKey: (id: string, index: number, enabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/toggle`, { enabled }),\n setProviderStrategy: (id: string, strategy: \"fallback\" | \"round-robin\" | null, sticky?: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/strategy`, { strategy, sticky }),\n setProviderDisabled: (id: string, disabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/disabled`, { disabled }),\n\n setRoute: (\n alias: string,\n body: { target: string[]; model?: string | string[]; strategy?: \"fallback\" | \"round-robin\"; price_in?: number; price_out?: number },\n ) => api<ConfigReply>(\"PUT\", `/admin/routes/${encodeURIComponent(alias)}`, body),\n removeRoute: (alias: string) => api<ConfigReply>(\"DELETE\", `/admin/routes/${encodeURIComponent(alias)}`),\n\n endpoint: () => api<EndpointPayload>(\"GET\", \"/admin/endpoint\"),\n setRtk: (enabled: boolean) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/rtk\", { enabled }),\n setCaveman: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/caveman\", { level }),\n setPonytail: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/ponytail\", { level }),\n addServerKey: (key: string, name?: string) => api<ConfigReply>(\"POST\", \"/admin/endpoint/keys\", { key, name }),\n editServerKey: (index: number, name: string) => api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}`, { name }),\n setServerKeyScope: (index: number, body: { models?: string[]; rpm?: number | null; expires?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}/scope`, body),\n removeServerKey: (index: number) => api<ConfigReply>(\"DELETE\", `/admin/endpoint/keys/${index}`),\n revealServerKey: (index: number) => api<{ key: string }>(\"GET\", `/admin/endpoint/keys/${index}/reveal`),\n\n setHeadroom: (patch: { enabled?: boolean; url?: string; compress_user_messages?: boolean }) =>\n api<ConfigReply>(\"PUT\", \"/admin/endpoint/headroom\", patch),\n headroomStatus: () => api<HeadroomStatusReply>(\"GET\", \"/admin/headroom/status\"),\n headroomStart: () => api<{ success?: boolean; pid?: number; alreadyRunning?: boolean }>(\"POST\", \"/admin/headroom/start\"),\n headroomStop: () => api<{ stopped: boolean; reason?: string; pid?: number }>(\"POST\", \"/admin/headroom/stop\"),\n\n putConfig: (text: string) => api<{ ok: boolean }>(\"PUT\", \"/admin/config\", { text }),\n\n version: () => api<{ current: string; latest: string | null; updateAvailable: boolean }>(\"GET\", \"/admin/version\"),\n shutdown: () => api<{ ok: boolean; message: string }>(\"POST\", \"/admin/shutdown\"),\n};\n\n// Local CLI-tool detection/auto-config. These hit the dashboard's OWN server\n// routes (/api/cli-detect/*), not the gateway proxy — they read/write the tool's\n// config file on this machine. Session-gated by middleware like everything else.\nexport interface CliStatus {\n auto: boolean;\n installed: boolean;\n configured?: boolean;\n path?: string;\n baseUrl?: string | null;\n models?: string[];\n activeModel?: string | null;\n // claude returns its three slot defaults instead of a flat list\n modelSlots?: { opus?: string | null; sonnet?: string | null; haiku?: string | null };\n}\n\nasync function appApi<T>(method: string, url: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n const data = text ? (JSON.parse(text) as T) : null;\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\n/** Admin account actions that hit the dashboard's OWN routes (not the gw proxy). */\nexport const account = {\n changePassword: (current: string, next: string) =>\n appApi<{ ok: boolean }>(\"POST\", \"/api/password\", { current, next }),\n};\n\nexport const cliConfig = {\n status: (tool: string) => appApi<CliStatus>(\"GET\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n apply: (tool: string, body: { base: string; key?: string; models?: string[] | Record<string, string>; active?: string }) =>\n appApi<{ success?: boolean; path?: string }>(\"POST\", `/api/cli-detect/${encodeURIComponent(tool)}`, body),\n reset: (tool: string) => appApi<{ success?: boolean }>(\"DELETE\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n};\n","export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n // Use array[0] for performant purpose\n return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n segment: Segment,\n searchParams: Record<string, string | string[] | undefined>\n) {\n const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n if (isPageSegment) {\n const stringifiedQuery = JSON.stringify(searchParams)\n return stringifiedQuery !== '{}'\n ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n : PAGE_SEGMENT_KEY\n }\n\n return segment\n}\n\nexport function computeSelectedLayoutSegment(\n segments: string[] | null,\n parallelRouteKey: string\n): string | null {\n if (!segments || segments.length === 0) {\n return null\n }\n\n // For 'children', use first segment; for other parallel routes, use last segment\n const rawSegment =\n parallelRouteKey === 'children'\n ? segments[0]\n : segments[segments.length - 1]\n\n // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n // Returning an internal value like `__DEFAULT__` would be confusing\n return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n tree: FlightRouterState,\n parallelRouteKey: string,\n first = true,\n segmentPath: string[] = []\n): string[] {\n let node: FlightRouterState\n if (first) {\n // Use the provided parallel route key on the first parallel route\n node = tree[1][parallelRouteKey]\n } else {\n // After first parallel route prefer children, if there's no children pick the first parallel route.\n const parallelRoutes = tree[1]\n node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n }\n\n if (!node) return segmentPath\n const segment = node[0]\n\n let segmentValue = getSegmentValue(segment)\n\n if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n return segmentPath\n }\n\n segmentPath.push(segmentValue)\n\n return getSelectedLayoutSegmentPath(\n node,\n parallelRouteKey,\n false,\n segmentPath\n )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\nexport const NOT_FOUND_SEGMENT_KEY = '/_not-found'\n","export function createPromiseWithResolvers<T>(): PromiseWithResolvers<T> {\n // Shim of Stage 4 Promise.withResolvers proposal\n let resolve: (value: T | PromiseLike<T>) => void\n let reject: (reason: any) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return { resolve: resolve!, reject: reject!, promise }\n}\n","\"use client\";\n\nimport { Button } from \"@/components/Button\";\nimport { Icon } from \"@/components/Icon\";\n\ninterface ConfirmModalProps {\n title: string;\n message: string;\n confirmLabel?: string;\n onConfirm: () => void;\n onCancel: () => void;\n busy?: boolean;\n}\n\nexport function ConfirmModal({ title, message, confirmLabel = \"Delete\", onConfirm, onCancel, busy }: ConfirmModalProps) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6\" onClick={onCancel}>\n <div\n className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"warning\" size={16} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">{title}</h2>\n </div>\n <p className=\"mb-4 text-[12.5px] text-text-muted\">{message}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button variant=\"danger\" disabled={busy} onClick={onConfirm}>{confirmLabel}</Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\n\n// Floating icon-rail (user's preferred chrome), carrying aigetwey's IA: Endpoint\n// is the landing, routing lives in Combos, and operational pages sit below a\n// divider. Labels surface as hover tooltips (data-label).\ntype NavItem = { href: string; label: string; icon: string };\n\nconst MAIN: NavItem[] = [\n { href: \"/\", label: \"Endpoint\", icon: \"api\" },\n { href: \"/keys\", label: \"Access Keys\", icon: \"key\" },\n { href: \"/providers\", label: \"Providers\", icon: \"dns\" },\n { href: \"/combos\", label: \"Combos\", icon: \"layers\" },\n { href: \"/usage\", label: \"Usage\", icon: \"bar_chart\" },\n { href: \"/quota\", label: \"Budgets\", icon: \"data_usage\" },\n { href: \"/tools\", label: \"CLI Tools\", icon: \"terminal\" },\n];\n\nconst SYSTEM: NavItem[] = [\n { href: \"/console\", label: \"Server Console\", icon: \"terminal\" },\n { href: \"/config\", label: \"Settings\", icon: \"settings\" },\n];\n\nexport function Rail() {\n const path = usePathname();\n const router = useRouter();\n\n async function logout() {\n await fetch(\"/api/logout\", { method: \"POST\" });\n router.replace(\"/login\");\n router.refresh();\n }\n\n // Endpoint owns both \"/\" (landing) and \"/endpoint\"; others match the segment\n // and its sub-routes (e.g. /providers/[id]).\n const isActive = (href: string) =>\n href === \"/\"\n ? path === \"/\" || path.startsWith(\"/endpoint\")\n : path === href || path.startsWith(`${href}/`);\n\n const link = (item: NavItem) => {\n const active = isActive(item.href);\n return (\n <Link\n key={item.href}\n href={item.href}\n data-label={item.label}\n className={`rail-icon${active ? \" rail-icon-active\" : \"\"}`}\n aria-label={item.label}\n >\n <Icon name={item.icon} size={20} fill={active} />\n </Link>\n );\n };\n\n return (\n <>\n <Link href=\"/\" className=\"rail-brand\" aria-label=\"aigetwey\">\n {/* \"a»\" mark — ink on the lime tile (CSS provides the tile) */}\n <svg viewBox=\"0 0 512 512\" width=\"26\" height=\"26\" aria-hidden>\n <text x=\"120\" y=\"338\" fontFamily=\"ui-sans-serif, Arial, sans-serif\" fontSize=\"260\" fontWeight=\"800\" textAnchor=\"middle\" fill=\"#14140f\">a</text>\n <g fill=\"none\" stroke=\"#14140f\" strokeWidth=\"34\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"276,182 352,256 276,330\" />\n <polyline points=\"346,182 422,256 346,330\" />\n </g>\n </svg>\n </Link>\n\n <nav className=\"flex flex-col items-center gap-3\">\n {MAIN.map(link)}\n <div className=\"rail-divider\" />\n {SYSTEM.map(link)}\n </nav>\n\n <button onClick={logout} data-label=\"Disconnect\" className=\"rail-icon\" aria-label=\"Disconnect\">\n <Icon name=\"logout\" size={19} />\n </button>\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\nimport { useTheme } from \"./ThemeProvider\";\nimport { ConfirmModal } from \"./ConfirmModal\";\nimport { adminApi } from \"@/lib/client\";\n\nconst LABELS: Record<string, string> = {\n \"\": \"Endpoint\",\n endpoint: \"Endpoint\",\n keys: \"Access Keys\",\n providers: \"Providers\",\n combos: \"Combos\",\n usage: \"Usage\",\n quota: \"Budgets\",\n tools: \"CLI Tools\",\n console: \"Server Console\",\n config: \"Settings\",\n};\n\nconst CMD = \"npm install -g aigetwey@latest\";\n\nfunction UpdateModal({\n current,\n latest,\n onClose,\n onShutdown,\n}: {\n current: string;\n latest: string;\n onClose: () => void;\n onShutdown: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n\n function copy() {\n void navigator.clipboard.writeText(CMD).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6\" onClick={onClose}>\n <div\n className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"flex h-9 w-9 flex-none items-center justify-center rounded-full bg-warning/10 text-warning\">\n <Icon name=\"arrow_upward\" size={19} />\n </span>\n <div>\n <h2 className=\"text-[14px] font-semibold text-text\">Update available</h2>\n <p className=\"text-[12px] text-text-muted\">\n v{current} → <span className=\"text-warning font-medium\">v{latest}</span>\n </p>\n </div>\n </div>\n <button onClick={onClose} className=\"text-text-subtle hover:text-text\">\n <Icon name=\"close\" size={17} />\n </button>\n </div>\n\n <p className=\"mb-3 text-[12.5px] text-text-muted\">\n Run this command in your terminal to update:\n </p>\n\n <div className=\"flex items-center gap-2 rounded-brand border border-border bg-bg px-3 py-2\">\n <code className=\"flex-1 text-[12px] text-text\">{CMD}</code>\n <button\n onClick={copy}\n className=\"flex-none text-text-subtle transition-colors hover:text-text\"\n title=\"Copy command\"\n >\n <Icon name={copied ? \"check\" : \"content_copy\"} size={14} />\n </button>\n </div>\n\n <p className=\"mt-3 text-[11.5px] text-text-subtle\">\n Shut down the gateway first, then run the command above, then restart.\n </p>\n\n <div className=\"mt-4 flex gap-2\">\n <button\n onClick={() => { copy(); onShutdown(); }}\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-brand border border-warning/30 bg-warning/10 px-3 py-2 text-[12.5px] font-medium text-warning transition-colors hover:bg-warning/20\"\n >\n <Icon name=\"content_copy\" size={14} />\n Copy & Shut down\n </button>\n <button\n onClick={onClose}\n className=\"rounded-brand border border-border px-3 py-2 text-[12.5px] text-text-muted transition-colors hover:text-text\"\n >\n Later\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function TopBar() {\n const path = usePathname();\n const { theme, toggle } = useTheme();\n const seg = path === \"/\" ? \"\" : (path.split(\"/\")[1] ?? \"\");\n const current = LABELS[seg] ?? seg;\n\n const [version, setVersion] = useState<{ current: string; latest: string | null; updateAvailable: boolean } | null>(null);\n const [showUpdate, setShowUpdate] = useState(false);\n const [confirmShutdown, setConfirmShutdown] = useState(false);\n const [stopped, setStopped] = useState(false);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n void adminApi.version().then((r) => {\n if (r.ok && r.data) setVersion(r.data);\n });\n }, []);\n\n async function doShutdown() {\n setBusy(true);\n await adminApi.shutdown();\n setStopped(true);\n setConfirmShutdown(false);\n setShowUpdate(false);\n setBusy(false);\n }\n\n return (\n <header className=\"console-topbar\">\n <div className=\"flex items-center gap-2 text-[13px]\">\n <span className=\"text-text-subtle\">aigetwey</span>\n <span className=\"text-text-subtle\">/</span>\n <span className=\"font-medium text-text\">{current}</span>\n </div>\n\n <div className=\"ml-auto flex items-center gap-2.5\">\n {version && (\n version.updateAvailable ? (\n <button\n onClick={() => setShowUpdate(true)}\n className=\"flex items-center gap-1.5 rounded-full border border-warning/30 bg-warning/10 px-2.5 py-1 text-[11px] font-medium text-warning transition-colors hover:bg-warning/20\"\n >\n <Icon name=\"arrow_upward\" size={12} />\n v{version.current} → {version.latest}\n </button>\n ) : (\n <span className=\"text-[11px] text-text-subtle\" title=\"You're on the latest version\">\n v{version.current}\n </span>\n )\n )}\n\n <button\n onClick={toggle}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-text\"\n aria-label=\"Toggle theme\"\n title={theme === \"dark\" ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n <Icon name={theme === \"dark\" ? \"light_mode\" : \"dark_mode\"} size={18} />\n </button>\n\n <button\n onClick={() => setConfirmShutdown(true)}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-danger\"\n aria-label=\"Shut down gateway\"\n title=\"Shut down the gateway\"\n >\n <Icon name=\"power_settings_new\" size={18} />\n </button>\n\n <div className=\"flex items-center gap-2 rounded-full border border-border bg-surface py-1 pl-1 pr-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-accent text-[11px] font-bold text-accent-ink\">\n A\n </span>\n <span className=\"text-[12px] text-text-muted\">admin</span>\n </div>\n </div>\n\n {showUpdate && version?.updateAvailable && (\n <UpdateModal\n current={version.current}\n latest={version.latest!}\n onClose={() => setShowUpdate(false)}\n onShutdown={doShutdown}\n />\n )}\n\n {confirmShutdown && (\n <ConfirmModal\n title=\"Shut down gateway?\"\n message=\"The gateway process will stop and all requests will fail until you restart it. The dashboard stays up but can't reach the gateway.\"\n confirmLabel=\"Shut down\"\n busy={busy}\n onConfirm={doShutdown}\n onCancel={() => setConfirmShutdown(false)}\n />\n )}\n\n {stopped && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 p-6\">\n <div className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 text-center shadow-elevated\">\n <span className=\"mx-auto mb-2 flex h-9 w-9 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"power_settings_new\" size={20} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">Gateway stopped</h2>\n <p className=\"mt-1 text-[12.5px] text-text-muted\">\n Run <code className=\"rounded bg-surface-2 px-1\">{CMD}</code> then restart with <code className=\"rounded bg-surface-2 px-1\">aigetwey</code>.\n </p>\n </div>\n </div>\n )}\n </header>\n );\n}\n"],"names":["VARIANTS","primary","ghost","danger","Button","variant","className","props","Input","Select","Field","label","hint","children","api","method","path","body","res","fetch","headers","undefined","JSON","stringify","e","ok","status","data","error","message","text","parse","err","adminApi","providers","budgets","models","keys","keysUsage","setBudget","clearBudget","key","encodeURIComponent","addProvider","p","editProvider","id","patch","renameProvider","newId","removeProvider","addKey","name","editKey","index","removeKey","revealKey","addModel","model","price","addModels","removeModel","clearModels","pricing","setModelPrice","testProvider","testKey","testModel","validateProvider","b","discoverModels","reorderProvider","from","to","reorderKey","toggleKey","enabled","setProviderStrategy","strategy","sticky","setProviderDisabled","disabled","setRoute","alias","removeRoute","endpoint","setRtk","setCaveman","level","setPonytail","addServerKey","editServerKey","setServerKeyScope","removeServerKey","revealServerKey","setHeadroom","headroomStatus","headroomStart","headroomStop","putConfig","version","shutdown","appApi","url","account","changePassword","current","next","cliConfig","tool","apply","reset","InvariantError","Error","constructor","options","endsWith","DEFAULT_SEGMENT_KEY","NOT_FOUND_SEGMENT_KEY","PAGE_SEGMENT_KEY","addSearchParamsIfPageSegment","computeSelectedLayoutSegment","getSegmentValue","getSelectedLayoutSegmentPath","isGroupSegment","isParallelRouteSegment","segment","Array","isArray","startsWith","searchParams","isPageSegment","includes","stringifiedQuery","segments","parallelRouteKey","length","rawSegment","tree","first","segmentPath","node","parallelRoutes","Object","values","segmentValue","push","createPromiseWithResolvers","resolve","reject","promise","Promise","rej","ConfirmModal","title","confirmLabel","onConfirm","onCancel","busy","onClick","stopPropagation","size","MAIN","href","icon","SYSTEM","Rail","router","logout","replace","refresh","isActive","link","item","active","fill","viewBox","width","height","x","y","fontFamily","fontSize","fontWeight","textAnchor","stroke","strokeWidth","strokeLinecap","strokeLinejoin","points","map","LABELS","combos","usage","quota","tools","console","config","CMD","UpdateModal","latest","onClose","onShutdown","copied","setCopied","copy","navigator","clipboard","writeText","then","setTimeout","TopBar","theme","toggle","seg","split","setVersion","showUpdate","setShowUpdate","confirmShutdown","setConfirmShutdown","stopped","setStopped","setBusy","r","doShutdown","updateAvailable"],"mappings":"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","ignoreList":[2,3,4]}
|