From ad41422c8a1411abb39e127bc322dd7c422e29d0 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 19:29:09 +0200 Subject: [PATCH 1/5] feat(store): request_metrics raw store + migration 017 Migration 017 adds request_metrics (one row per finalized request) and request_metrics_hourly (rollup). request_metrics.py provides record / record_from_trace (the tracer sink) and history/summary queries with exact per-bucket percentiles, optional group_by model|route. All SQL literal; grouping keys are chosen in Python (no identifier interpolation). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../store/migrations/017_request_metrics.sql | 38 ++++ src/berth/store/request_metrics.py | 187 ++++++++++++++++++ tests/unit/test_request_metrics.py | 68 +++++++ 3 files changed, 293 insertions(+) create mode 100644 src/berth/store/migrations/017_request_metrics.sql create mode 100644 src/berth/store/request_metrics.py create mode 100644 tests/unit/test_request_metrics.py diff --git a/src/berth/store/migrations/017_request_metrics.sql b/src/berth/store/migrations/017_request_metrics.sql new file mode 100644 index 0000000..f605c7d --- /dev/null +++ b/src/berth/store/migrations/017_request_metrics.sql @@ -0,0 +1,38 @@ +-- Per-request outcome + latency for the Overview dashboard's historical +-- latency/error views. Distinct from usage_events (the predictor's +-- served-request log): this captures ALL finalized requests, including +-- pre-dispatch failures (bad model, auth, no-ready-service, adapter errors). + +CREATE TABLE IF NOT EXISTS request_metrics ( + id INTEGER PRIMARY KEY, + ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + model_name TEXT, + route_name TEXT, + deployment_id INTEGER, + backend TEXT, + status_code INTEGER, + is_error INTEGER NOT NULL DEFAULT 0, + dispatched INTEGER NOT NULL DEFAULT 0, + latency_ms INTEGER, + ttft_ms INTEGER +); +CREATE INDEX IF NOT EXISTS idx_rm_ts ON request_metrics(ts); +CREATE INDEX IF NOT EXISTS idx_rm_model_ts ON request_metrics(model_name, ts); + +-- Hourly rollup with exact per-bucket percentiles (computed from raw rows at +-- rollup time). model_name NULL = the all-models aggregate row for that hour. +CREATE TABLE IF NOT EXISTS request_metrics_hourly ( + id INTEGER PRIMARY KEY, + bucket_start TIMESTAMP NOT NULL, + model_name TEXT, + count INTEGER NOT NULL, + error_count INTEGER NOT NULL, + dispatched_count INTEGER NOT NULL, + latency_p50_ms INTEGER, + latency_p95_ms INTEGER, + ttft_p50_ms INTEGER, + ttft_p95_ms INTEGER +); +CREATE UNIQUE INDEX IF NOT EXISTS idx_rmh_bucket_model + ON request_metrics_hourly(bucket_start, COALESCE(model_name, '')); +CREATE INDEX IF NOT EXISTS idx_rmh_bucket ON request_metrics_hourly(bucket_start); diff --git a/src/berth/store/request_metrics.py b/src/berth/store/request_metrics.py new file mode 100644 index 0000000..a4fe977 --- /dev/null +++ b/src/berth/store/request_metrics.py @@ -0,0 +1,187 @@ +"""Per-request outcome/latency store powering the Overview latency/error views. + +Reads serve exact percentiles from raw rows for short windows and from +request_metrics_hourly for long windows (see source selection in `history`/ +`summary`). SQL is literal — no identifier interpolation (Bandit B608); +grouping selects a row-dict key in Python, never an SQL column name. +""" +from __future__ import annotations + +import logging +import sqlite3 + +log = logging.getLogger(__name__) + +# Raw rows are kept this long for exact sub-hour percentiles + drill-down; +# older data lives only in the hourly rollup. +RAW_RETENTION_H = 48 + +_GROUP_COL = {"model": "model_name", "route": "route_name"} + + +def record( + conn: sqlite3.Connection, *, + model_name: str | None = None, + route_name: str | None = None, + deployment_id: int | None = None, + backend: str | None = None, + status_code: int | None = None, + is_error: bool = False, + dispatched: bool = False, + latency_ms: int | None = None, + ttft_ms: int | None = None, +) -> int: + cur = conn.execute( + """ + INSERT INTO request_metrics ( + model_name, route_name, deployment_id, backend, status_code, + is_error, dispatched, latency_ms, ttft_ms + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + (model_name, route_name, deployment_id, backend, status_code, + 1 if is_error else 0, 1 if dispatched else 0, latency_ms, ttft_ms), + ) + return int(cur.lastrowid or 0) + + +def record_from_trace(conn: sqlite3.Connection, trace) -> None: + """Best-effort sink for RequestTracer.finalize. Never raises into the + request path.""" + try: + dispatched = trace.dispatched_at is not None + latency_ms = ( + round((trace.completed_at - trace.dispatched_at) * 1000) + if dispatched and trace.completed_at is not None else None + ) + ttft_ms = ( + round((trace.first_byte_at - trace.dispatched_at) * 1000) + if dispatched and trace.first_byte_at is not None else None + ) + sc = trace.status_code + is_error = bool(trace.error) or sc is None or sc >= 400 + record( + conn, + model_name=trace.target_model or trace.model_requested, + route_name=trace.route_name, + deployment_id=trace.deployment_id, + backend=trace.backend, + status_code=sc, + is_error=is_error, + dispatched=dispatched, + latency_ms=latency_ms, + ttft_ms=ttft_ms, + ) + except Exception: # sink must never break serving + log.exception("request_metrics sink failed") + + +def _percentile(sorted_vals: list[int], q: float) -> int | None: + if not sorted_vals: + return None + if len(sorted_vals) == 1: + return sorted_vals[0] + pos = q * (len(sorted_vals) - 1) + lo = int(pos) + hi = min(lo + 1, len(sorted_vals) - 1) + frac = pos - lo + return round(sorted_vals[lo] * (1 - frac) + sorted_vals[hi] * frac) + + +def _summarize(rows: list[sqlite3.Row]) -> dict: + count = len(rows) + error_count = sum(1 for r in rows if r["is_error"]) + lat = sorted(r["latency_ms"] for r in rows if r["latency_ms"] is not None) + ttft = sorted(r["ttft_ms"] for r in rows if r["ttft_ms"] is not None) + return { + "count": count, + "error_count": error_count, + "dispatched_count": sum(1 for r in rows if r["dispatched"]), + "error_rate": (error_count / count) if count else 0.0, + "latency_p50_ms": _percentile(lat, 0.50), + "latency_p95_ms": _percentile(lat, 0.95), + "ttft_p50_ms": _percentile(ttft, 0.50), + "ttft_p95_ms": _percentile(ttft, 0.95), + } + + +def _raw_rows_in_window(conn: sqlite3.Connection, window_s: int) -> list[sqlite3.Row]: + return conn.execute( + """ + SELECT model_name, route_name, is_error, dispatched, latency_ms, ttft_ms, + CAST((CAST(strftime('%s','now') AS INTEGER) + - CAST(strftime('%s', ts) AS INTEGER)) AS INTEGER) AS age_s + FROM request_metrics + WHERE ts > datetime('now', ?) + """, + (f"-{window_s} seconds",), + ).fetchall() + + +def _group_key(row: sqlite3.Row, col: str) -> str: + return row[col] or "—" + + +def summary( + conn: sqlite3.Connection, *, window_s: int, group_by: str | None = None, +) -> object: + rows = _raw_rows_in_window(conn, window_s) + if group_by is None: + return _summarize(rows) + col = _GROUP_COL[group_by] + keyed: dict[str, list] = {} + for r in rows: + keyed.setdefault(_group_key(r, col), []).append(r) + # sort by group size (descending); tuple key keeps mypy happy vs indexing + # into the object-typed summary dict. + items = [(len(v), {"key": k, "label": k, "summary": _summarize(v)}) + for k, v in keyed.items()] + items.sort(key=lambda t: t[0], reverse=True) + return [g for _, g in items] + + +def history( + conn: sqlite3.Connection, *, window_s: int, bucket_s: int, + group_by: str | None = None, +) -> list[dict]: + bucket_s = max(1, int(bucket_s)) + num_buckets = max(1, int(window_s) // bucket_s) + rows = _raw_rows_in_window(conn, window_s) + + def empty() -> list[dict]: + return [ + {"bucket_idx": i, "ts_offset_s": i * bucket_s, + "count": 0, "error_count": 0, "error_rate": 0.0, + "latency_p50_ms": None, "latency_p95_ms": None} + for i in range(num_buckets - 1, -1, -1) + ] + + def fill(buckets: list[dict], rowset: list[sqlite3.Row]) -> list[dict]: + by_idx: dict[int, list] = {} + for r in rowset: + idx = min(int(r["age_s"]) // bucket_s, num_buckets - 1) + by_idx.setdefault(idx, []).append(r) + for b in buckets: + grp = by_idx.get(b["bucket_idx"]) + if grp: + s = _summarize(grp) + b["count"] = s["count"] + b["error_count"] = s["error_count"] + b["error_rate"] = s["error_rate"] + b["latency_p50_ms"] = s["latency_p50_ms"] + b["latency_p95_ms"] = s["latency_p95_ms"] + return buckets + + if group_by is None: + return fill(empty(), rows) + + col = _GROUP_COL[group_by] + keyed: dict[str, list] = {} + for r in rows: + keyed.setdefault(_group_key(r, col), []).append(r) + items = [ + (len(v), {"key": k, "label": k, + "summary": _summarize(v), "buckets": fill(empty(), v)}) + for k, v in keyed.items() + ] + items.sort(key=lambda t: t[0], reverse=True) + return [g for _, g in items] diff --git a/tests/unit/test_request_metrics.py b/tests/unit/test_request_metrics.py new file mode 100644 index 0000000..6d48c6a --- /dev/null +++ b/tests/unit/test_request_metrics.py @@ -0,0 +1,68 @@ +"""Tests for the request_metrics store (raw per-request latency/error data +powering the Overview dashboard's historical latency/error views).""" +from berth.store import db +from berth.store import request_metrics as rm + + +def _fresh(tmp_path): + conn = db.connect(tmp_path / "t.db") + db.init_schema(conn) + return conn + + +def test_migration_creates_tables_and_indexes(tmp_path): + conn = _fresh(tmp_path) + tables = {r["name"] for r in conn.execute( + "SELECT name FROM sqlite_master WHERE type='table'").fetchall()} + assert "request_metrics" in tables + assert "request_metrics_hourly" in tables + idx = {r["name"] for r in conn.execute( + "SELECT name FROM sqlite_master WHERE type='index'").fetchall()} + assert "idx_rm_ts" in idx + assert "idx_rm_model_ts" in idx + + +def test_record_and_summary_counts_and_percentiles(tmp_path): + conn = _fresh(tmp_path) + for ms in (100, 200, 300, 400): # dispatched OK + rm.record(conn, model_name="m", status_code=200, is_error=False, + dispatched=True, latency_ms=ms, ttft_ms=ms // 2) + rm.record(conn, model_name="m", status_code=503, is_error=True, + dispatched=False, latency_ms=None, ttft_ms=None) # pre-dispatch err + s = rm.summary(conn, window_s=3600) + assert s["count"] == 5 + assert s["error_count"] == 1 + assert abs(s["error_rate"] - 0.2) < 1e-9 + assert s["latency_p50_ms"] == 250 # median of 100,200,300,400 -> avg(200,300) + assert s["latency_p95_ms"] == 385 # linear interpolation: 0.95*(n-1)=2.85 -> 300..400 + + +def test_history_buckets_zero_filled_oldest_first(tmp_path): + conn = _fresh(tmp_path) + rm.record(conn, model_name="m", status_code=200, is_error=False, + dispatched=True, latency_ms=120, ttft_ms=40) + rows = rm.history(conn, window_s=3600, bucket_s=900) + assert len(rows) == 4 + assert rows[0]["count"] == 0 and rows[-1]["count"] == 1 + assert rows[-1]["latency_p95_ms"] == 120 + assert rows[0]["ts_offset_s"] > rows[-1]["ts_offset_s"] + + +def test_history_group_by_model(tmp_path): + conn = _fresh(tmp_path) + rm.record(conn, model_name="a", status_code=200, is_error=False, + dispatched=True, latency_ms=100, ttft_ms=10) + rm.record(conn, model_name="b", status_code=500, is_error=True, + dispatched=True, latency_ms=900, ttft_ms=90) + groups = rm.history(conn, window_s=3600, bucket_s=3600, group_by="model") + by = {g["label"]: g for g in groups} + assert by["b"]["summary"]["error_rate"] == 1.0 + assert by["a"]["summary"]["latency_p95_ms"] == 100 + + +def test_summary_empty_window(tmp_path): + conn = _fresh(tmp_path) + s = rm.summary(conn, window_s=3600) + assert s["count"] == 0 + assert s["error_rate"] == 0.0 + assert s["latency_p50_ms"] is None From 12cbcda0b12bf439ffed8350d143d9241ed23fcf Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 19:30:33 +0200 Subject: [PATCH 2/5] feat(daemon): persist request outcomes via tracer finalize sink RequestTracer gains an optional on_finalize callback invoked once per finalized request (the single chokepoint covering all terminal paths, dispatched and pre-dispatch). build_app wires it to request_metrics so every request's latency/status is persisted. Sink errors are caught and logged, never breaking request serving. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/daemon/app.py | 5 ++++- src/berth/daemon/request_tracer.py | 16 ++++++++++++++- tests/unit/test_request_tracer_sink.py | 27 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/unit/test_request_tracer_sink.py diff --git a/src/berth/daemon/app.py b/src/berth/daemon/app.py index b52bc34..fde6a4a 100644 --- a/src/berth/daemon/app.py +++ b/src/berth/daemon/app.py @@ -179,7 +179,10 @@ def build_apps( event_bus = EventBus() stream_tokens = StreamTokenStore() from berth.daemon.request_tracer import RequestTracer - request_tracer = RequestTracer() + from berth.store import request_metrics as _rm_store + request_tracer = RequestTracer( + on_finalize=lambda trace: _rm_store.record_from_trace(conn, trace), + ) manager = LifecycleManager( conn=conn, docker_client=docker_client, diff --git a/src/berth/daemon/request_tracer.py b/src/berth/daemon/request_tracer.py index 56912ec..6ab8546 100644 --- a/src/berth/daemon/request_tracer.py +++ b/src/berth/daemon/request_tracer.py @@ -12,6 +12,7 @@ import time import uuid from collections import deque +from collections.abc import Callable from dataclasses import asdict, dataclass, field from typing import Any @@ -63,9 +64,16 @@ class RequestTracer: lock needed. The deque's append/popleft are atomic. """ - def __init__(self, capacity: int = _MAX_TRACES) -> None: + def __init__( + self, + capacity: int = _MAX_TRACES, + on_finalize: Callable[[RequestTrace], None] | None = None, + ) -> None: self._buffer: deque[RequestTrace] = deque(maxlen=capacity) self._subscribers: list[_Subscriber] = [] + # Optional sink invoked once per finalized request (used to persist + # request_metrics). Failure-isolated: a sink error never breaks serving. + self._on_finalize = on_finalize def start(self, *, method: str, path: str) -> RequestTrace: trace = RequestTrace( @@ -88,6 +96,12 @@ def finalize(self, trace: RequestTrace, **fields: Any) -> None: for k, v in fields.items(): setattr(trace, k, v) self._publish(trace, "completed") + if self._on_finalize is not None: + try: + self._on_finalize(trace) + except Exception: + import logging + logging.getLogger(__name__).exception("tracer on_finalize failed") def snapshot(self) -> list[dict[str, Any]]: return [t.to_dict() for t in self._buffer] diff --git a/tests/unit/test_request_tracer_sink.py b/tests/unit/test_request_tracer_sink.py new file mode 100644 index 0000000..f41883a --- /dev/null +++ b/tests/unit/test_request_tracer_sink.py @@ -0,0 +1,27 @@ +"""The RequestTracer on_finalize sink — the single chokepoint that persists +every request's outcome to request_metrics.""" +from berth.daemon.request_tracer import RequestTracer + + +def test_on_finalize_called_once_with_completed_trace(): + seen = [] + tr = RequestTracer(on_finalize=lambda t: seen.append(t)) + trace = tr.start(method="POST", path="/v1/chat/completions") + tr.finalize(trace, status_code=200) + assert len(seen) == 1 + assert seen[0].status_code == 200 + assert seen[0].completed_at is not None + + +def test_on_finalize_exception_does_not_propagate(): + def boom(_t): + raise RuntimeError("db down") + tr = RequestTracer(on_finalize=boom) + trace = tr.start(method="GET", path="/x") + tr.finalize(trace, status_code=500) # must not raise + + +def test_no_sink_is_fine(): + tr = RequestTracer() + trace = tr.start(method="GET", path="/x") + tr.finalize(trace, status_code=200) # no on_finalize set; must not raise From d9e4a9a8cf286387067a1860ba1e0137f6cd1bcd Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 19:34:38 +0200 Subject: [PATCH 3/5] feat(daemon): hourly request_metrics rollup + MetricsRollupTask request_metrics_rollup folds aged raw rows into request_metrics_hourly with exact per-bucket percentiles (all-models + per-model rows) and purges old hourly rows. history/summary read raw for short windows and the rollup for long windows. MetricsRollupTask (hourly) wired into app lifespan alongside UsageRollupTask. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/daemon/app.py | 7 ++ src/berth/lifecycle/metrics_rollup_task.py | 59 ++++++++++++ src/berth/store/request_metrics.py | 107 +++++++++++++++++++++ src/berth/store/request_metrics_rollup.py | 81 ++++++++++++++++ tests/unit/test_request_metrics_rollup.py | 77 +++++++++++++++ 5 files changed, 331 insertions(+) create mode 100644 src/berth/lifecycle/metrics_rollup_task.py create mode 100644 src/berth/store/request_metrics_rollup.py create mode 100644 tests/unit/test_request_metrics_rollup.py diff --git a/src/berth/daemon/app.py b/src/berth/daemon/app.py index fde6a4a..171b6d5 100644 --- a/src/berth/daemon/app.py +++ b/src/berth/daemon/app.py @@ -226,6 +226,11 @@ def build_apps( # aggregated into usage_aggregates and removed from usage_events. # Keeps the predictor's hot table bounded for long-running boxes. rollup_task = UsageRollupTask(conn=conn, config=predictor_cfg) + # Hourly rollup: request_metrics raw rows older than RAW_RETENTION_H get + # aggregated (with exact per-bucket percentiles) into request_metrics_hourly; + # hourly rows past retention_days are purged. + from berth.lifecycle.metrics_rollup_task import MetricsRollupTask + metrics_rollup_task = MetricsRollupTask(conn=conn, config=predictor_cfg) @asynccontextmanager async def lifespan(_app: FastAPI): @@ -238,6 +243,7 @@ async def lifespan(_app: FastAPI): health_monitor.start() predictor_task.start() rollup_task.start() + metrics_rollup_task.start() import asyncio as _asyncio async def _local_metrics_tick() -> None: @@ -305,6 +311,7 @@ async def _local_metrics_tick() -> None: except (Exception, _asyncio.CancelledError): pass await rollup_task.stop() + await metrics_rollup_task.stop() await predictor_task.stop() await health_monitor.stop() await reaper.stop() diff --git a/src/berth/lifecycle/metrics_rollup_task.py b/src/berth/lifecycle/metrics_rollup_task.py new file mode 100644 index 0000000..5ace03f --- /dev/null +++ b/src/berth/lifecycle/metrics_rollup_task.py @@ -0,0 +1,59 @@ +"""Daemon task that rolls aged request_metrics into request_metrics_hourly and +purges old hourly rows. Mirrors UsageRollupTask.""" +from __future__ import annotations + +import asyncio +import logging +import sqlite3 + +from berth.lifecycle.predictor import PredictorConfig +from berth.store import request_metrics_rollup as rmr +from berth.store.request_metrics import RAW_RETENTION_H + +log = logging.getLogger(__name__) + + +class MetricsRollupTask: + def __init__( + self, + *, + conn: sqlite3.Connection, + config: PredictorConfig | None = None, + tick_s: float = 3600.0, + ): + self._conn = conn + self._config = config or PredictorConfig() + self._tick_s = tick_s + self._task: asyncio.Task | None = None + self._stop_event = asyncio.Event() + + async def tick_once(self) -> dict: + res = rmr.rollup_aged_raw(self._conn, older_than_h=RAW_RETENTION_H) + res["hourly_purged"] = rmr.purge_hourly_older_than( + self._conn, days=self._config.retention_days, + ) + return res + + async def run(self) -> None: + while not self._stop_event.is_set(): + try: + r = await self.tick_once() + if r["raw_deleted"] or r["hourly_purged"]: + log.info( + "metrics rollup: %d raw rolled, %d hourly purged", + r["raw_deleted"], r["hourly_purged"], + ) + except Exception: + log.exception("metrics rollup tick failed") + try: + await asyncio.wait_for(self._stop_event.wait(), timeout=self._tick_s) + except TimeoutError: + pass + + def start(self) -> None: + self._task = asyncio.create_task(self.run()) + + async def stop(self) -> None: + self._stop_event.set() + if self._task: + await self._task diff --git a/src/berth/store/request_metrics.py b/src/berth/store/request_metrics.py index a4fe977..3a46120 100644 --- a/src/berth/store/request_metrics.py +++ b/src/berth/store/request_metrics.py @@ -15,10 +15,17 @@ # Raw rows are kept this long for exact sub-hour percentiles + drill-down; # older data lives only in the hourly rollup. RAW_RETENTION_H = 48 +_RAW_WINDOW_S = RAW_RETENTION_H * 3600 _GROUP_COL = {"model": "model_name", "route": "route_name"} +def _use_rollup(window_s: int, group_by: str | None) -> bool: + # Long windows read the hourly rollup. The rollup only stores per-model + # (and all-models) rows, so route grouping always uses raw (≤ retention). + return window_s > _RAW_WINDOW_S and group_by in (None, "model") + + def record( conn: sqlite3.Connection, *, model_name: str | None = None, @@ -121,9 +128,61 @@ def _group_key(row: sqlite3.Row, col: str) -> str: return row[col] or "—" +def _hourly_rows_in_window(conn: sqlite3.Connection, window_s: int) -> list[sqlite3.Row]: + return conn.execute( + """ + SELECT bucket_start, model_name, count, error_count, dispatched_count, + latency_p50_ms, latency_p95_ms, ttft_p50_ms, ttft_p95_ms, + CAST((CAST(strftime('%s','now') AS INTEGER) + - CAST(strftime('%s', bucket_start) AS INTEGER)) AS INTEGER) AS age_s + FROM request_metrics_hourly + WHERE bucket_start > datetime('now', ?) + """, + (f"-{window_s} seconds",), + ).fetchall() + + +def _weighted(rows: list[sqlite3.Row], col: str) -> int | None: + # count-weighted mean of a per-bucket percentile column (an approximation: + # percentiles can't be recombined exactly across buckets). + num = sum((r[col] or 0) * r["count"] for r in rows if r[col] is not None) + den = sum(r["count"] for r in rows if r[col] is not None) + return round(num / den) if den else None + + +def _summarize_hourly(rows: list[sqlite3.Row]) -> dict: + count = sum(r["count"] for r in rows) + error_count = sum(r["error_count"] for r in rows) + return { + "count": count, + "error_count": error_count, + "dispatched_count": sum(r["dispatched_count"] for r in rows), + "error_rate": (error_count / count) if count else 0.0, + "latency_p50_ms": _weighted(rows, "latency_p50_ms"), + "latency_p95_ms": _weighted(rows, "latency_p95_ms"), + "ttft_p50_ms": _weighted(rows, "ttft_p50_ms"), + "ttft_p95_ms": _weighted(rows, "ttft_p95_ms"), + } + + def summary( conn: sqlite3.Connection, *, window_s: int, group_by: str | None = None, ) -> object: + if _use_rollup(window_s, group_by): + hourly = _hourly_rows_in_window(conn, window_s) + if group_by is None: + return _summarize_hourly([r for r in hourly if r["model_name"] is None]) + hkeyed: dict[str, list] = {} + for r in hourly: + if r["model_name"] is None: + continue + hkeyed.setdefault(r["model_name"], []).append(r) + items = [(sum(x["count"] for x in v), + {"key": k, "label": k, "summary": _summarize_hourly(v)}) + for k, v in hkeyed.items()] + items.sort(key=lambda t: t[0], reverse=True) + return [g for _, g in items] + rows = _raw_rows_in_window(conn, window_s) if group_by is None: return _summarize(rows) @@ -139,10 +198,58 @@ def summary( return [g for _, g in items] +def _hourly_history( + conn: sqlite3.Connection, window_s: int, group_by: str | None, +) -> list[dict]: + # Long-window history from the rollup: hourly granularity (percentiles are + # already exact per hour and must not be recombined). + bucket_s = 3600 + num_buckets = max(1, int(window_s) // bucket_s) + hourly = _hourly_rows_in_window(conn, window_s) + + def empty() -> list[dict]: + return [ + {"bucket_idx": i, "ts_offset_s": i * bucket_s, + "count": 0, "error_count": 0, "error_rate": 0.0, + "latency_p50_ms": None, "latency_p95_ms": None} + for i in range(num_buckets - 1, -1, -1) + ] + + def fill(buckets: list[dict], rowset: list[sqlite3.Row]) -> list[dict]: + by_idx = {min(int(r["age_s"]) // bucket_s, num_buckets - 1): r for r in rowset} + for b in buckets: + r = by_idx.get(b["bucket_idx"]) + if r: + b["count"] = r["count"] + b["error_count"] = r["error_count"] + b["error_rate"] = (r["error_count"] / r["count"]) if r["count"] else 0.0 + b["latency_p50_ms"] = r["latency_p50_ms"] + b["latency_p95_ms"] = r["latency_p95_ms"] + return buckets + + if group_by is None: + return fill(empty(), [r for r in hourly if r["model_name"] is None]) + + keyed: dict[str, list] = {} + for r in hourly: + if r["model_name"] is None: + continue + keyed.setdefault(r["model_name"], []).append(r) + items = [ + (sum(x["count"] for x in v), + {"key": k, "label": k, "summary": _summarize_hourly(v), "buckets": fill(empty(), v)}) + for k, v in keyed.items() + ] + items.sort(key=lambda t: t[0], reverse=True) + return [g for _, g in items] + + def history( conn: sqlite3.Connection, *, window_s: int, bucket_s: int, group_by: str | None = None, ) -> list[dict]: + if _use_rollup(window_s, group_by): + return _hourly_history(conn, window_s, group_by) bucket_s = max(1, int(bucket_s)) num_buckets = max(1, int(window_s) // bucket_s) rows = _raw_rows_in_window(conn, window_s) diff --git a/src/berth/store/request_metrics_rollup.py b/src/berth/store/request_metrics_rollup.py new file mode 100644 index 0000000..3a0cb55 --- /dev/null +++ b/src/berth/store/request_metrics_rollup.py @@ -0,0 +1,81 @@ +"""Roll aged request_metrics raw rows into request_metrics_hourly with exact +per-bucket percentiles, then drop the raw rows. Mirrors usage_aggregates. + +Each closed hour is rolled in a single pass (the task runs after the raw row +ages past RAW_RETENTION_H), so the stored percentiles are exact for that hour +and never recombined across buckets. +""" +from __future__ import annotations + +import sqlite3 + +from berth.store.request_metrics import _percentile + + +def rollup_aged_raw(conn: sqlite3.Connection, *, older_than_h: int) -> dict: + rows = conn.execute( + """ + SELECT + strftime('%Y-%m-%d %H:00:00', ts) AS bucket_start, + model_name, is_error, dispatched, latency_ms, ttft_ms + FROM request_metrics + WHERE ts < datetime('now', ?) + """, + (f"-{older_than_h} hours",), + ).fetchall() + if not rows: + return {"buckets_upserted": 0, "raw_deleted": 0} + + # Group by (bucket, model) and (bucket, all-models=None). + groups: dict[tuple, list] = {} + for r in rows: + b = r["bucket_start"] + groups.setdefault((b, r["model_name"]), []).append(r) + groups.setdefault((b, None), []).append(r) + + conn.execute("BEGIN IMMEDIATE") + try: + upserts = 0 + for (bucket, model), grp in groups.items(): + lat = sorted(x["latency_ms"] for x in grp if x["latency_ms"] is not None) + ttft = sorted(x["ttft_ms"] for x in grp if x["ttft_ms"] is not None) + conn.execute( + """ + INSERT INTO request_metrics_hourly ( + bucket_start, model_name, count, error_count, dispatched_count, + latency_p50_ms, latency_p95_ms, ttft_p50_ms, ttft_p95_ms) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(bucket_start, COALESCE(model_name, '')) DO UPDATE SET + count = count + excluded.count, + error_count = error_count + excluded.error_count, + dispatched_count = dispatched_count + excluded.dispatched_count, + latency_p50_ms = excluded.latency_p50_ms, + latency_p95_ms = excluded.latency_p95_ms, + ttft_p50_ms = excluded.ttft_p50_ms, + ttft_p95_ms = excluded.ttft_p95_ms + """, + (bucket, model, len(grp), + sum(1 for x in grp if x["is_error"]), + sum(1 for x in grp if x["dispatched"]), + _percentile(lat, 0.50), _percentile(lat, 0.95), + _percentile(ttft, 0.50), _percentile(ttft, 0.95)), + ) + upserts += 1 + cur = conn.execute( + "DELETE FROM request_metrics WHERE ts < datetime('now', ?)", + (f"-{older_than_h} hours",), + ) + deleted = cur.rowcount or 0 + conn.execute("COMMIT") + except Exception: + conn.execute("ROLLBACK") + raise + return {"buckets_upserted": upserts, "raw_deleted": deleted} + + +def purge_hourly_older_than(conn: sqlite3.Connection, *, days: int) -> int: + cur = conn.execute( + "DELETE FROM request_metrics_hourly WHERE bucket_start < datetime('now', ?)", + (f"-{days} days",), + ) + return cur.rowcount or 0 diff --git a/tests/unit/test_request_metrics_rollup.py b/tests/unit/test_request_metrics_rollup.py new file mode 100644 index 0000000..a95f57f --- /dev/null +++ b/tests/unit/test_request_metrics_rollup.py @@ -0,0 +1,77 @@ +"""Hourly rollup of aged request_metrics raw rows, and long-window history +served from the rollup.""" +import pytest + +from berth.store import db +from berth.store import request_metrics as rm +from berth.store import request_metrics_rollup as rmr + + +def _fresh(tmp_path): + conn = db.connect(tmp_path / "t.db") + db.init_schema(conn) + return conn + + +def test_rollup_aggregates_old_raw_and_purges(tmp_path): + conn = _fresh(tmp_path) + for ms in (100, 300): # two rows for model 'a', same hour bucket (3h ago) + conn.execute( + "INSERT INTO request_metrics (ts, model_name, is_error, dispatched, latency_ms) " + "VALUES (datetime('now','-3 hours'), 'a', 0, 1, ?)", (ms,)) + res = rmr.rollup_aged_raw(conn, older_than_h=1) + assert res["raw_deleted"] == 2 + row = conn.execute( + "SELECT * FROM request_metrics_hourly WHERE model_name='a'").fetchone() + assert row["count"] == 2 + assert row["latency_p50_ms"] == 200 # interp median of (100,300) + allrow = conn.execute( + "SELECT * FROM request_metrics_hourly WHERE model_name IS NULL").fetchone() + assert allrow["count"] == 2 + assert conn.execute( + "SELECT COUNT(*) AS n FROM request_metrics").fetchone()["n"] == 0 + + +def test_rollup_noop_when_no_aged_rows(tmp_path): + conn = _fresh(tmp_path) + rm.record(conn, model_name="a", dispatched=True, latency_ms=100) # recent + res = rmr.rollup_aged_raw(conn, older_than_h=1) + assert res == {"buckets_upserted": 0, "raw_deleted": 0} + + +def test_purge_hourly_older_than(tmp_path): + conn = _fresh(tmp_path) + conn.execute( + "INSERT INTO request_metrics_hourly (bucket_start, model_name, count, " + "error_count, dispatched_count) VALUES (datetime('now','-40 days'), NULL, 1, 0, 1)") + deleted = rmr.purge_hourly_older_than(conn, days=30) + assert deleted == 1 + + +def test_history_long_window_reads_rollup(tmp_path): + conn = _fresh(tmp_path) + # only hourly rollup rows exist (10 days ago), no raw rows + conn.execute( + "INSERT INTO request_metrics_hourly (bucket_start, model_name, count, " + "error_count, dispatched_count, latency_p50_ms, latency_p95_ms) " + "VALUES (datetime('now','-10 days'), NULL, 50, 5, 50, 120, 800)") + rows = rm.history(conn, window_s=30 * 86400, bucket_s=3600) + hit = [b for b in rows if b["count"] > 0] + assert hit and hit[0]["count"] == 50 + assert hit[0]["latency_p95_ms"] == 800 + assert abs(hit[0]["error_rate"] - 0.1) < 1e-9 + + +@pytest.mark.asyncio +async def test_metrics_rollup_task_tick(tmp_path): + from berth.lifecycle.metrics_rollup_task import MetricsRollupTask + conn = _fresh(tmp_path) + conn.execute( + "INSERT INTO request_metrics (ts, model_name, is_error, dispatched, latency_ms) " + "VALUES (datetime('now','-60 hours'), 'a', 0, 1, 100)") # aged past 48h + task = MetricsRollupTask(conn=conn) + res = await task.tick_once() + assert res["raw_deleted"] == 1 + assert "hourly_purged" in res + n = conn.execute("SELECT COUNT(*) AS n FROM request_metrics_hourly").fetchone()["n"] + assert n >= 1 # all-models + per-model rows From 618c24f7402121757e1e87bbf78ff15d3c304650 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 19:36:35 +0200 Subject: [PATCH 4/5] feat: GET /admin/metrics/history endpoint + api client Read-only latency/error history: per-bucket p50/p95 + error rate (raw for short windows, hourly rollup for long), optional group_by model|route, and a summary variant for the tiles/breakdown. Validation mirrors /admin/usage/series. api.ts gains getMetricsHistory/getMetricsSummary/getMetricsByModel + types. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/daemon/admin_runtime.py | 30 ++++++++++++++++++ tests/unit/test_admin_endpoints.py | 44 +++++++++++++++++++++++++++ ui/src/api.ts | 49 ++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) diff --git a/src/berth/daemon/admin_runtime.py b/src/berth/daemon/admin_runtime.py index 737d0e1..3f7c512 100644 --- a/src/berth/daemon/admin_runtime.py +++ b/src/berth/daemon/admin_runtime.py @@ -11,6 +11,7 @@ from berth.daemon.admin import get_backends, get_conn, router from berth.store import deployments as dep_store from berth.store import nodes as nodes_store +from berth.store import request_metrics as _request_metrics from berth.store import usage_events as _usage_events @@ -102,6 +103,35 @@ def usage_series( return {**base, "buckets": data} +@router.get("/metrics/history") +def metrics_history( + window_s: int = 86400, + bucket_s: int = 3600, + group_by: str | None = None, + summary: bool = False, + conn: sqlite3.Connection = Depends(get_conn), +): + """Read-only latency/error history for the Overview dashboard. Per-bucket + latency percentiles + error rate (raw rows for short windows, hourly rollup + for long). group_by may be 'model' or 'route' (or omitted/'none').""" + if window_s <= 0 or bucket_s <= 0: + raise HTTPException(400, "window_s and bucket_s must be positive") + if window_s // bucket_s > 1024: + raise HTTPException(400, "too many buckets requested (cap is 1024)") + if group_by not in (None, "none", "model", "route"): + raise HTTPException(400, "group_by must be one of: model, route") + gb = None if group_by in (None, "none") else group_by + if summary: + data = _request_metrics.summary(conn, window_s=window_s, group_by=gb) + return {"window_s": window_s, "group_by": gb, + ("groups" if gb else "summary"): data} + data = _request_metrics.history( + conn, window_s=window_s, bucket_s=bucket_s, group_by=gb, + ) + return {"window_s": window_s, "bucket_s": bucket_s, "group_by": gb, + ("groups" if gb else "buckets"): data} + + @router.get("/deployments/current/logs") def stream_current_logs(request: Request): conn: sqlite3.Connection = request.app.state.conn diff --git a/tests/unit/test_admin_endpoints.py b/tests/unit/test_admin_endpoints.py index 06379f6..f8a2acd 100644 --- a/tests/unit/test_admin_endpoints.py +++ b/tests/unit/test_admin_endpoints.py @@ -10,6 +10,7 @@ from berth.lifecycle.docker_client import ContainerHandle from berth.store import api_keys as key_store from berth.store import db +from berth.store import request_metrics as rm_store from berth.store import usage_events as usage_store @@ -1050,3 +1051,46 @@ async def test_usage_series_rejects_bad_params(app): assert bad_window.status_code == 400, bad_window.text assert too_many.status_code == 400, too_many.text assert bad_group.status_code == 400, bad_group.text + + +@pytest.mark.asyncio +async def test_metrics_history_summary(app): + for ms in (100, 200, 300): + rm_store.record(app.state.conn, model_name="m", status_code=200, + dispatched=True, latency_ms=ms) + rm_store.record(app.state.conn, model_name="m", status_code=500, is_error=True, + dispatched=True, latency_ms=900) + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + r = await c.get("/admin/metrics/history?window_s=3600&summary=true") + assert r.status_code == 200, r.text + s = r.json()["summary"] + assert s["count"] == 4 and s["error_count"] == 1 + + +@pytest.mark.asyncio +async def test_metrics_history_buckets_and_group_by_model(app): + rm_store.record(app.state.conn, model_name="a", status_code=200, + dispatched=True, latency_ms=120) + rm_store.record(app.state.conn, model_name="b", status_code=500, is_error=True, + dispatched=True, latency_ms=800) + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + hist = await c.get("/admin/metrics/history?window_s=3600&bucket_s=3600") + grouped = await c.get( + "/admin/metrics/history?window_s=3600&summary=true&group_by=model") + assert hist.status_code == 200, hist.text + assert hist.json()["buckets"][-1]["count"] == 2 + groups = grouped.json()["groups"] + by = {g["label"]: g for g in groups} + assert by["b"]["summary"]["error_rate"] == 1.0 + + +@pytest.mark.asyncio +async def test_metrics_history_rejects_bad_params(app): + transport = httpx.ASGITransport(app=app) + async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: + bad = await c.get("/admin/metrics/history?window_s=0&bucket_s=60") + grp = await c.get("/admin/metrics/history?window_s=3600&bucket_s=60&group_by=bogus") + assert bad.status_code == 400, bad.text + assert grp.status_code == 400, grp.text diff --git a/ui/src/api.ts b/ui/src/api.ts index 8413a46..241aab7 100644 --- a/ui/src/api.ts +++ b/ui/src/api.ts @@ -34,6 +34,10 @@ export const queryKeys = { ['key-usage', keyId, scope] as const, usageSeries: (windowS: number, bucketS: number, groupBy: string) => ['usage-series', windowS, bucketS, groupBy] as const, + metricsHistory: (windowS: number, bucketS: number) => + ['metrics-history', windowS, bucketS] as const, + metricsSummary: (windowS: number, groupBy: string) => + ['metrics-summary', windowS, groupBy] as const, } export async function eventSourceUrl(path: string): Promise { @@ -369,6 +373,18 @@ export const api = { 'GET', `/admin/usage/series?window_s=${windowS}&bucket_s=${bucketS}&group_by=model`, ), + getMetricsHistory: (windowS = 86400, bucketS = 3600) => + jfetch( + 'GET', `/admin/metrics/history?window_s=${windowS}&bucket_s=${bucketS}`, + ), + getMetricsSummary: (windowS = 86400) => + jfetch<{ summary: MetricsSummary }>( + 'GET', `/admin/metrics/history?window_s=${windowS}&summary=true`, + ), + getMetricsByModel: (windowS = 86400) => + jfetch<{ groups: MetricsGroup[] }>( + 'GET', `/admin/metrics/history?window_s=${windowS}&summary=true&group_by=model`, + ), } export type MetricsSnapshotGpu = { @@ -430,6 +446,39 @@ export type UsageSeriesGrouped = { groups: UsageGroup[] } +// Latency/error history (Overview latency/error tiles, chart, breakdown). +export type MetricsBucket = { + bucket_idx: number + ts_offset_s: number + count: number + error_count: number + error_rate: number + latency_p50_ms: number | null + latency_p95_ms: number | null +} +export type MetricsSummary = { + count: number + error_count: number + dispatched_count: number + error_rate: number + latency_p50_ms: number | null + latency_p95_ms: number | null + ttft_p50_ms: number | null + ttft_p95_ms: number | null +} +export type MetricsHistory = { + window_s: number + bucket_s: number + group_by: null + buckets: MetricsBucket[] +} +export type MetricsGroup = { + key: string + label: string + summary: MetricsSummary + buckets?: MetricsBucket[] +} + // Cluster types. export type Node = { From dfeb2c7d8f11391e3250a99719ed42fefe2cffb4 Mon Sep 17 00:00:00 2001 From: Mapika Date: Fri, 5 Jun 2026 19:40:48 +0200 Subject: [PATCH 5/5] feat(ui): Overview latency/error history + cluster GPU health strip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Latency/errors tiles now read persisted history (/admin/metrics/history summary, 24h) and are badged "24h" instead of "live · 60s". Add a latency/errors over-time chart (p95 bars + error-rate strip) and a per-model latency/error breakdown table. Fix the GPU health strip to source GPUs from the cluster metrics snapshot (nodes[].gpus[]) grouped by node, so a GPU-less leader (VPS) shows remote worker-node GPUs; falls back to local topology only when the snapshot has none. Extract a shared GpuMeter used by both paths. Header GPU count now reflects the cluster total. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/berth/ui/assets/index-BCvkwgrI.js | 11 +++ src/berth/ui/assets/index-CNEC70C6.js | 11 --- src/berth/ui/index.html | 2 +- ui/src/components/GpuCard.tsx | 47 ++++--------- ui/src/components/GpuMeter.tsx | 42 ++++++++++++ ui/src/views/overview/HealthStrip.tsx | 85 ++++++++++++++++++++---- ui/src/views/overview/LatencyChart.tsx | 59 ++++++++++++++++ ui/src/views/overview/ModelBreakdown.tsx | 44 ++++++++++++ ui/src/views/overview/Overview.tsx | 53 ++++++++++++--- 9 files changed, 287 insertions(+), 67 deletions(-) create mode 100644 src/berth/ui/assets/index-BCvkwgrI.js delete mode 100644 src/berth/ui/assets/index-CNEC70C6.js create mode 100644 ui/src/components/GpuMeter.tsx create mode 100644 ui/src/views/overview/LatencyChart.tsx create mode 100644 ui/src/views/overview/ModelBreakdown.tsx diff --git a/src/berth/ui/assets/index-BCvkwgrI.js b/src/berth/ui/assets/index-BCvkwgrI.js new file mode 100644 index 0000000..e10d9e2 --- /dev/null +++ b/src/berth/ui/assets/index-BCvkwgrI.js @@ -0,0 +1,11 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function w(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ie(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ae=/\/+/g;function oe(e,t){return typeof e==`object`&&e&&e.key!=null?ie(``+e.key):t.toString(36)}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+oe(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ae,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(w(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ae,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,w());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?w():ee=!1}}}var w;if(typeof y==`function`)w=function(){y(re)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=re,w=function(){ae.postMessage(null)}}else w=function(){_(re,0)};function oe(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,w()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1pe||(e.current=fe[pe],fe[pe]=null,pe--)}function D(e,t){pe++,fe[pe]=e.current,e.current=t}var ge=me(null),_e=me(null),ve=me(null),ye=me(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}he(ge),D(ge,e)}function xe(){he(ge),he(_e),he(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(he(ge),he(_e)),ye.current===e&&(he(ye),Qf._currentValue=de)}var O,we;function Te(e){if(O===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);O=t&&t[1]||``,we=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function k(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),mn=!1;if(pn)try{var hn={};Object.defineProperty(hn,"passive",{get:function(){mn=!0}}),window.addEventListener(`test`,hn,hn),window.removeEventListener(`test`,hn,hn)}catch{mn=!1}var gn=null,_n=null,vn=null;function yn(){if(vn)return vn;var e,t=_n,n=t.length,r,i=`value`in gn?gn.value:gn.textContent,a=i.length;for(e=0;e=Zn),er=` `,tr=!1;function nr(e,t){switch(e){case`keyup`:return Yn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function rr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var ir=!1;function ar(e,t){switch(e){case`compositionend`:return rr(t);case`keypress`:return t.which===32?(tr=!0,er):null;case`textInput`:return e=t.data,e===er&&tr?null:e;default:return null}}function or(e,t){if(ir)return e===`compositionend`||!Xn&&nr(e,t)?(e=yn(),vn=_n=gn=null,ir=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Or(n)}}function Ar(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ar(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Bt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Bt(e.document)}return t}function Mr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Nr=pn&&`documentMode`in document&&11>=document.documentMode,Pr=null,Fr=null,Ir=null,Lr=!1;function Rr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Lr||Pr==null||Pr!==Bt(r)||(r=Pr,`selectionStart`in r&&Mr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ir&&Dr(Ir,r)||(Ir=r,r=Ed(Fr,`onSelect`),0>=o,i-=o,Ai=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),I&&Mi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),I&&Mi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return I&&Mi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),I&&Mi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=_i(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=gi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=bi(o,e.mode,c),c.return=e,e=c}return s(e);case w:return o=Aa(o),b(e,r,o,c)}if(ue(o))return h(e,r,o,c);if(se(o)){if(l=se(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===S)return b(e,r,aa(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=vi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=fi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=li(e),ci(e,null,n),t}return ai(e,r,t,n),li(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Fs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,de,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ia(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=oi(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Er(s,o))return ai(e,t,i,0),K===null&&ii(),!1}catch{}if(n=oi(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=oi(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var zs={readContext:ia,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ia,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ia,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(I){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(I){var n=ji,r=Ai;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[mt]=t,o[ht]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ve.current,Wi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Li,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Vi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Wi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[mt]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Wi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[mt]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Qi(t.type),U(t),null;case 19:if(he(R),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)hi(n,e),n=n.sibling;return D(R,R.current&1|2),I&&Mi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!I)return U(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=R.current,D(R,a?n&1|2:n&1),I&&Mi(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&he(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Qi(L),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Fi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Qi(L),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(R),null;case 4:return xe(),null;case 10:return Qi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&he(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Qi(L),null;case 25:return null;default:return null}}function Vc(e,t){switch(Fi(t),t.tag){case 3:Qi(L),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:he(R);break;case 10:Qi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&he(ba);break;case 24:Qi(L)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=rn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=jr(e),Mr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[mt]=e,Tt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=kr(s,h),v=kr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,o)}catch{}return!0}finally{E.p=a,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=Si(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Si(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=si(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||k(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Ht(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),Tt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Ht(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Ht(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Ht(n.imageSizes)+`"]`)):i+=`[href="`+Ht(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),Tt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Ht(r)+`"][href="`+Ht(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),Tt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=M(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);Tt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=M(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Tt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=M(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Tt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=M(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=M(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=M(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Ht(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),Tt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Ht(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Ht(n.href)+`"]`);if(r)return t.instance=r,Tt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Tt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,Tt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),Tt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,Tt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Tt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Tt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),Tt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function yt(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var bt=c(g(),1),xt=`berth.adminToken`;function St(){return localStorage.getItem(xt)}function Ct(e){localStorage.setItem(xt,e)}function wt(){localStorage.removeItem(xt)}var M={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t],usageSeries:(e,t,n)=>[`usage-series`,e,t,n],metricsHistory:(e,t)=>[`metrics-history`,e,t],metricsSummary:(e,t)=>[`metrics-summary`,e,t]};async function Tt(e){if(!St())return e;let t=await P.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function N(e,t,n){let r={"Content-Type":`application/json`},i=St();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var P={listDeployments:()=>N(`GET`,`/admin/deployments`),stopDeployment:e=>N(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>N(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>N(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>N(`GET`,`/admin/models`),createModel:e=>N(`POST`,`/admin/models`,e),deleteModel:e=>N(`DELETE`,`/admin/models/${e}`),listKeys:()=>N(`GET`,`/admin/keys`),createKey:e=>N(`POST`,`/admin/keys`,e),revokeKey:e=>N(`DELETE`,`/admin/keys/${e}`),listGpus:()=>N(`GET`,`/admin/gpus`),listBackends:()=>N(`GET`,`/admin/backends`),loadModel:e=>N(`POST`,`/admin/deployments`,e),createStreamToken:e=>N(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>N(`GET`,`/admin/adapters`),createAdapter:e=>N(`POST`,`/admin/adapters`,e),downloadAdapter:e=>N(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>N(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>N(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>N(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>N(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>N(`GET`,`/admin/predictor/candidates`),predictorStats:()=>N(`GET`,`/admin/predictor/stats`),listProfiles:()=>N(`GET`,`/admin/service-profiles`),createProfile:e=>N(`POST`,`/admin/service-profiles`,e),deployProfile:e=>N(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>N(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>N(`GET`,`/admin/routes`),createRoute:e=>N(`POST`,`/admin/routes`,e),deleteRoute:e=>N(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>N(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>N(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>N(`GET`,`/admin/requests`),listNodes:()=>N(`GET`,`/admin/nodes`),getNode:e=>N(`GET`,`/admin/nodes/${e}`),enrollNode:e=>N(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>N(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>N(`GET`,`/admin/cluster`),getConfig:()=>N(`GET`,`/admin/config`),getMetricsSnapshot:()=>N(`GET`,`/admin/metrics/snapshot`),getUsageSeries:(e=86400,t=3600)=>N(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}`),getUsageByModel:(e=86400,t=3600)=>N(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}&group_by=model`),getMetricsHistory:(e=86400,t=3600)=>N(`GET`,`/admin/metrics/history?window_s=${e}&bucket_s=${t}`),getMetricsSummary:(e=86400)=>N(`GET`,`/admin/metrics/history?window_s=${e}&summary=true`),getMetricsByModel:(e=86400)=>N(`GET`,`/admin/metrics/history?window_s=${e}&summary=true&group_by=model`)};function Et(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Dt({children:e}){let[t,n]=(0,k.useState)(St()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(Ct(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{Ct(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Ot({label:e,usedMb:t,totalMb:n,utilPct:r,powerW:i,right:a,loaded:o}){let s=n>0?t/n*100:0;return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[s.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(t/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(n/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${s}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,r,`%`]}),i!=null&&(0,A.jsxs)(`span`,{children:[i,` w`]}),a&&(0,A.jsx)(`span`,{className:`ml-auto`,children:a})]}),o]})}function kt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function At(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function jt(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function Mt(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function Nt({d:e,modelName:t}){let n=Mt(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:kt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Pt({g:e,deployments:t,models:n}){let r=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsx)(Ot,{label:`gpu ${e.index}`,usedMb:e.memory_used_mb,totalMb:e.memory_total_mb,utilPct:e.gpu_util_pct,powerW:e.power_w,right:r.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[r.length,` loaded`]}),loaded:r.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:r.map(e=>(0,A.jsx)(Nt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})})}function Ft(){let e=j({queryKey:M.metricsSnapshot,queryFn:P.getMetricsSnapshot,refetchInterval:2e3}),t=j({queryKey:M.deployments,queryFn:P.listDeployments,refetchInterval:2e3}),n=j({queryKey:M.models,queryFn:P.listModels,refetchInterval:5e3}),r=j({queryKey:M.gpus,queryFn:P.listGpus,refetchInterval:2e3}),i=e.data?.nodes??[],a=t.data??[],o=n.data??[],s=i.reduce((e,t)=>e+t.gpus.length,0),c=i.filter(e=>e.gpus.length>0).length>1,l=(e,t)=>i.length<=1||e.node_id===t.node_id||t.label===`local`&&e.node_id==null;if(s===0){let e=r.data??[];return(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),e.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no gpus reported`}):(0,A.jsx)(`div`,{className:`grid gap-12 `+jt(e.length),children:e.map(e=>(0,A.jsx)(Pt,{g:e,deployments:a,models:o},e.index))})]})}return(0,A.jsxs)(`section`,{className:`space-y-8`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),i.filter(e=>e.gpus.length>0).map(e=>(0,A.jsxs)(`div`,{className:`space-y-4`,children:[c&&(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:e.label===`local`?`text-dim text-[12px] tracking-wider`:`text-accent text-[12px] tracking-wider`,children:e.label}),(0,A.jsxs)(`span`,{className:`text-mute text-[11px]`,children:[e.gpus.length,` gpu`]})]}),(0,A.jsx)(`div`,{className:`grid gap-12 `+jt(e.gpus.length),children:e.gpus.map(t=>{let n=a.filter(n=>(n.gpu_ids??[]).includes(t.index)&&(n.status===`ready`||n.status===`loading`)&&l(n,e));return(0,A.jsx)(Ot,{label:`gpu ${t.index}`,usedMb:t.mem_used_mb,totalMb:t.mem_total_mb,utilPct:t.util_pct,right:n.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[n.length,` loaded`]}),loaded:n.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:n.map(e=>(0,A.jsx)(Nt,{d:e,modelName:o.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})},t.index)})})]},e.node_id))]})}function It({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function Lt({title:e,value:t,sub:n,spark:r,badge:i,onClick:a}){return(0,A.jsxs)(`div`,{className:`space-y-3 border-l border-rule pl-5 `+(a?`cursor-pointer hover:border-accent transition-colors`:``),onClick:a,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tracking-tightish tnum`,children:t}),r&&r.length>0&&(0,A.jsx)(`div`,{className:`text-accent`,children:(0,A.jsx)(It,{values:r,width:120,height:22})}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:n}),i&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:i})]})}function Rt({buckets:e,height:t=56}){if(e.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no traffic in window`});let n=Math.max(1,...e.map(e=>e.count)),r=100/e.length;return(0,A.jsx)(`svg`,{width:`100%`,height:t,viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,"aria-label":`requests over time`,children:e.map((e,i)=>{let a=e.count/n*t;return(0,A.jsx)(`rect`,{x:i*r+1/2,y:t-a,width:Math.max(r-1,.4),height:a,className:`text-accent`,fill:`currentColor`,opacity:e.count===0?.15:.85,children:(0,A.jsxs)(`title`,{children:[e.count,` req`]})},i)})})}function zt({buckets:e,height:t=56}){if(e.filter(e=>e.count>0).length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no requests in window`});let n=Math.max(1,...e.map(e=>e.latency_p95_ms??0)),r=100/e.length;return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`svg`,{width:`100%`,height:t,viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,"aria-label":`p95 latency over time`,children:e.map((e,i)=>{let a=(e.latency_p95_ms??0)/n*t;return(0,A.jsx)(`rect`,{x:i*r+1/2,y:t-a,width:Math.max(r-1,.4),height:a,className:`text-accent`,fill:`currentColor`,opacity:e.count===0?.12:.85,children:(0,A.jsxs)(`title`,{children:[`p95 `,e.latency_p95_ms??0,`ms · `,e.count,` req`]})},i)})}),(0,A.jsx)(`svg`,{width:`100%`,height:8,viewBox:`0 0 100 8`,preserveAspectRatio:`none`,"aria-label":`error rate over time`,children:e.map((e,t)=>(0,A.jsx)(`rect`,{x:t*r+1/2,y:0,width:Math.max(r-1,.4),height:8,className:`text-err`,fill:`currentColor`,opacity:e.count===0?.06:Math.max(.08,e.error_rate),children:(0,A.jsxs)(`title`,{children:[(e.error_rate*100).toFixed(1),`% errors · `,e.error_count,`/`,e.count]})},t))}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`p95 latency`}),(0,A.jsxs)(`span`,{children:[`peak `,n.toLocaleString(),` ms · error rate strip`]})]})]})}function Bt({groups:e,limit:t=5}){let n=e.slice(0,t);if(n.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no requests in window`});let r=Math.max(1,...n.map(e=>e.total));return(0,A.jsx)(`div`,{className:`space-y-2`,children:n.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,children:[(0,A.jsx)(`span`,{className:`font-mono text-ink truncate w-[14ch]`,title:e.label,children:e.label}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[8ch] text-right`,children:e.total.toLocaleString()}),(0,A.jsx)(`div`,{className:`flex-1 h-1 bg-rule-soft relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent`,style:{width:`${e.total/r*100}%`}})})]},e.key))})}function Vt({groups:e,limit:t=6}){let n=e.slice(0,t);return n.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no requests in window`}):(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`p95`}),(0,A.jsx)(`th`,{className:`text-right`,children:`errors`}),(0,A.jsx)(`th`,{className:`text-right`,children:`req`})]})}),(0,A.jsx)(`tbody`,{children:n.map(e=>{let t=e.summary.error_rate*100;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono truncate max-w-[16ch]`,title:e.label,children:e.label}),(0,A.jsx)(`td`,{className:`text-right tnum text-dim`,children:e.summary.latency_p95_ms===null?`—`:`${e.summary.latency_p95_ms} ms`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsxs)(`span`,{className:t>0?`text-err`:`text-mute`,children:[t.toFixed(+(t>0&&t<1)),`%`]})}),(0,A.jsx)(`td`,{className:`text-right tnum text-mute`,children:e.summary.count.toLocaleString()})]},e.key)})})]})}function Ht(){let e=j({queryKey:M.deployments,queryFn:P.listDeployments,refetchInterval:2e3}),t=j({queryKey:M.models,queryFn:P.listModels,refetchInterval:5e3}),n=j({queryKey:M.nodes,queryFn:P.listNodes,refetchInterval:5e3}),r=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`);return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`active deployments`}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{location.hash=`#/serving/deployments`},children:`manage in serving →`})]}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`nothing loaded`}):(0,A.jsx)(`div`,{className:`space-y-1`,children:r.map(e=>{let r=(t.data??[]).find(t=>t.id===e.model_id),i=(n.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:r?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[7ch] text-right`,children:(e.gpu_ids??[]).length?`gpu ${(e.gpu_ids??[]).join(`,`)}`:`-`}),i!==`local`&&(0,A.jsx)(`span`,{className:`text-accent text-[10px]`,children:i})]},e.id)})})]})}function Ut(e){let t=(e?.nodes??[]).flatMap(e=>e.deployments),n=0,r=0,i=0,a=0,o=0,s=0;for(let e of t){n+=e.in_flight,r+=e.requests_last_window,i+=e.errors_last_window;let t=e.requests_last_window||0;a+=e.latency_p50_ms*t,o+=e.latency_p95_ms*t,s+=t}let c=t.length?t.reduce((e,t)=>e+t.latency_p50_ms,0)/t.length:0,l=t.length?t.reduce((e,t)=>e+t.latency_p95_ms,0)/t.length:0;return{inFlight:n,requestsWindow:r,errorsWindow:i,errorRate:i/Math.max(r,1),latencyP50:s?a/s:c,latencyP95:s?o/s:l}}function Wt(e,t){if(e.length===0||t<=0)return{reqPerMin:0,tokPerSec:0,totalOut:0};let n=e.slice(-3),r=n.length*t,i=n.reduce((e,t)=>e+t.count,0),a=n.reduce((e,t)=>e+t.tokens_out,0),o=e.reduce((e,t)=>e+t.tokens_out,0);return{reqPerMin:r?i/r*60:0,tokPerSec:r?a/r:0,totalOut:o}}function Gt(e,t){return(0,A.jsxs)(A.Fragment,{children:[e,(0,A.jsxs)(`span`,{className:`text-mute text-[13px]`,children:[` `,t]})]})}function Kt(){let e=j({queryKey:M.deployments,queryFn:P.listDeployments,refetchInterval:2e3}),t=j({queryKey:M.gpus,queryFn:P.listGpus,refetchInterval:2e3}),n=j({queryKey:M.nodes,queryFn:P.listNodes,refetchInterval:5e3}),r=j({queryKey:M.metricsSnapshot,queryFn:P.getMetricsSnapshot,refetchInterval:2e3}),i=j({queryKey:M.usageSeries(3600,60,`none`),queryFn:()=>P.getUsageSeries(3600,60),refetchInterval:5e3}),a=j({queryKey:M.usageSeries(86400,3600,`none`),queryFn:()=>P.getUsageSeries(86400,3600),refetchInterval:3e4}),o=j({queryKey:M.usageSeries(86400,3600,`model`),queryFn:()=>P.getUsageByModel(86400,3600),refetchInterval:3e4}),s=j({queryKey:M.metricsSummary(86400,`none`),queryFn:()=>P.getMetricsSummary(86400),refetchInterval:15e3}),c=j({queryKey:M.metricsHistory(86400,3600),queryFn:()=>P.getMetricsHistory(86400,3600),refetchInterval:3e4}),l=j({queryKey:M.metricsSummary(86400,`model`),queryFn:()=>P.getMetricsByModel(86400),refetchInterval:3e4}),u=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`),d=Ut(r.data),f=i.data?.buckets??[],p=Wt(f,60),m=f.slice(-30).map(e=>e.count),h=f.slice(-30).map(e=>e.tokens_out),g=s.data?.summary,_=(r.data?.nodes??[]).reduce((e,t)=>e+t.gpus.length,0)||(t.data??[]).length;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`overview`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=n.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,r=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:r===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[_,` gpu / `,u.length,` active`]})]})]}),(0,A.jsx)(Ft,{}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`request stats`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-y-8 gap-x-6`,children:[(0,A.jsx)(Lt,{title:`volume`,value:Gt(p.reqPerMin.toFixed(+(p.reqPerMin<10)),`req/min`),sub:`${d.inFlight} in flight`,spark:m,badge:`live`}),(0,A.jsx)(Lt,{title:`latency`,value:Gt(g?.latency_p50_ms==null?`—`:String(g.latency_p50_ms),`ms p50`),sub:`p95 ${g?.latency_p95_ms??`—`} ms`,badge:`24h`}),(0,A.jsx)(Lt,{title:`errors`,value:Gt(g?(g.error_rate*100).toFixed(1):`—`,`%`),sub:(0,A.jsxs)(`span`,{className:`text-accent`,children:[g?.error_count??0,` in 24h → see traffic`]}),badge:`24h`,onClick:()=>{location.hash=`#/observe/requests`}}),(0,A.jsx)(Lt,{title:`throughput`,value:Gt(p.tokPerSec.toFixed(0),`tok/s`),sub:`${p.totalOut.toLocaleString()} out tok · 1h`,spark:h,badge:`live`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`traffic over time`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:`last 24h · bounded by retention`})]}),(0,A.jsx)(Rt,{buckets:a.data?.buckets??[]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`latency & errors over time`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:`last 24h`})]}),(0,A.jsx)(zt,{buckets:c.data?.buckets??[]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-12 gap-y-10`,children:[(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`top models · 24h`}),(0,A.jsx)(Bt,{groups:o.data?.groups??[]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`latency & errors by model · 24h`}),(0,A.jsx)(Vt,{groups:l.data?.groups??[]})]})]}),(0,A.jsx)(`section`,{children:(0,A.jsx)(Ht,{})})]})}function qt({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:kt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,kt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:kt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function Jt(){let e=rt(),t=j({queryKey:M.deployments,queryFn:P.listDeployments,refetchInterval:2e3}),n=j({queryKey:M.models,queryFn:P.listModels,refetchInterval:5e3}),r=j({queryKey:M.nodes,queryFn:P.listNodes,refetchInterval:5e3}),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(``),u=yt({mutationFn:e=>P.stopDeployment(e),onMutate:e=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:M.deployments})}}),d=yt({mutationFn:({id:e,pinned:t})=>t?P.unpinDeployment(e):P.pinDeployment(e),onMutate:({id:e})=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:M.deployments})}}),f=t.data??[],p=f.filter(e=>e.status===`ready`||e.status===`loading`),m=i?f:p,h=f.length-m.length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`deployments`}),(0,A.jsxs)(`div`,{className:`label`,children:[p.length,` active / `,f.length,` total`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:i,onChange:e=>a(e.target.checked)}),`show stopped `,h>0&&!i&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,h,`)`]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:c}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[m.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),m.map(e=>{let t=(n.data??[]).find(t=>t.id===e.model_id),i=(r.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,s=o===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:i===`local`?`text-mute`:`text-accent`,children:i})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(qt,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:At(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:s,onClick:()=>d.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&u.mutate(e.id)},children:s?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Yt(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function Xt(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function Zt(e){return e&&e!==`local`?e:null}var Qt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},$t=e=>new Promise(t=>setTimeout(t,e));function en(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function tn(e,t){for(let n=0;n<15;n+=1){let n=(await P.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await $t(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function nn(){let e=rt(),t=j({queryKey:M.models,queryFn:P.listModels}),n=j({queryKey:M.backends,queryFn:P.listBackends}),r=j({queryKey:M.gpus,queryFn:P.listGpus}),i=j({queryKey:M.nodes,queryFn:P.listNodes}),a=j({queryKey:M.config,queryFn:P.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Qt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=yt({mutationFn:()=>P.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:M.models})}}),ee=yt({mutationFn:e=>P.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:M.models})}),S=yt({mutationFn:async e=>{let t=Yt(f.gpuIds),n=Xt(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=Zt(y);let i=(await P.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await P.loadModel(r)}catch(t){if(!en(t))throw t;return tn(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Qt),e.invalidateQueries({queryKey:M.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Qt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function rn(){let e=rt(),t=j({queryKey:M.adapters,queryFn:P.listAdapters,refetchInterval:5e3}),n=j({queryKey:M.models,queryFn:P.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=yt({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await P.createAdapter({name:e,base_model_name:l,hf_repo:a}),P.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:M.adapters})}}),h=yt({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return P.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:M.adapters})}}),g=yt({mutationFn:e=>P.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:M.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function an({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function on(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function sn({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:on(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:on(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function cn({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(sn,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var ln={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},un={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function dn({mode:e=`both`}){let t=rt(),n=j({queryKey:M.profiles,queryFn:P.listProfiles}),r=j({queryKey:M.routes,queryFn:P.listRoutes}),i=j({queryKey:M.models,queryFn:P.listModels}),a=j({queryKey:M.backends,queryFn:P.listBackends}),o=j({queryKey:M.nodes,queryFn:P.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(ln),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=yt({mutationFn:()=>{let e=Yt(u.gpu_ids),t=Xt(u.max_model_len);return P.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:Zt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(ln),t.invalidateQueries({queryKey:M.profiles})}}),_=yt({mutationFn:e=>P.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:M.deployments})}),v=yt({mutationFn:e=>P.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:M.profiles}),t.invalidateQueries({queryKey:M.routes})}}),[y,b]=(0,k.useState)(un),[x,ee]=(0,k.useState)(``),S=yt({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return P.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(un),t.invalidateQueries({queryKey:M.routes})}}),C=yt({mutationFn:e=>P.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:M.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=yt({mutationFn:e=>P.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(an,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(cn,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function fn(){return(0,A.jsx)(dn,{mode:`routes`})}function pn(){return(0,A.jsx)(dn,{mode:`profiles`})}var mn={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function hn({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function gn(){let e=j({queryKey:M.predictorCandidates,queryFn:P.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:M.predictorStats,queryFn:P.predictorStats,refetchInterval:5e3}).data??mn,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(hn,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(hn,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(hn,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(hn,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(hn,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(hn,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(hn,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(hn,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(hn,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(hn,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var _n={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function vn(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=St();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` +`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function yn({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function bn({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function xn({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function Sn(){let e=j({queryKey:M.models,queryFn:P.listModels}),t=j({queryKey:M.routes,queryFn:P.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,..._n}),[o,s]=(0,k.useState)({model:``,..._n}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,..._n,model:e.model,pending:!0})),n&&s(e=>({...e,..._n,model:e.model,pending:!0}));let t=[vn(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(vn(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(bn,{stats:i.stats})]}),(0,A.jsx)(yn,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(bn,{stats:o.stats})]}),(0,A.jsx)(yn,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(xn,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(xn,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function Cn(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function wn({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function Tn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function En({keyId:e}){let t=j({queryKey:M.keyUsage(e,`detail`),queryFn:()=>P.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(Tn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[Cn(o),` total`]})]}),(0,A.jsx)(Tn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function Dn(){let e=rt(),t=j({queryKey:M.keys,queryFn:P.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=yt({mutationFn:()=>P.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:M.keys})}}),h=yt({mutationFn:e=>P.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:M.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:M.keyUsage(e.id,`spark`),queryFn:()=>P.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(wn,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(En,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function On(e,t){let n=!1,r=null;return Tt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function kn(){let e=j({queryKey:M.deployments,queryFn:P.listDeployments,refetchInterval:5e3}),t=j({queryKey:M.models,queryFn:P.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=On(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>On(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function An(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function jn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function Mn(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function Nn(e){switch(Mn(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function Pn({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${An(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:An(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:An(r)})]})]})]})}function Fn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${Nn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):An(jn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(Pn,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function In(){let e=j({queryKey:M.requestsSeed,queryFn:P.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return On(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>Mn(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(Fn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Ln({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function Rn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=yt({mutationFn:e=>P.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:M.nodes}),e()}}),h=o?Et(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function zn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function Bn(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Vn(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function Hn(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function Un({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${Hn(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Vn(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,zn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,zn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:Bn(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(It,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(It,{values:r.series.request_rate})]})]})]})}function Wn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Gn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:zn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Kn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:M.node(e.id),queryFn:()=>P.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${Hn(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Vn(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,zn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,zn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:Bn(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(Wn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Gn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function qn({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,zn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,zn(t.total_vram_mb)]})]})]})}function Jn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(Wn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=yt({mutationFn:e=>P.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:M.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Ln,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Ln,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Ln,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Ln,{label:`vram`,value:zn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(qn,{nodes:l})}),r.data&&(0,A.jsx)(Jn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(Un,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Kn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(Rn,{onMinted:()=>e.invalidateQueries({queryKey:M.nodes})})]})]})}function Xn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function Zn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Qn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function $n({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` +`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function tr(){let e=j({queryKey:M.config,queryFn:P.getConfig}),t=j({queryKey:M.clusterInfo,queryFn:P.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Qn.filter(e=>e.group===`public`),s=Qn.filter(e=>e.group===`cluster`),c=Qn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)($n,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)($n,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)($n,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Xn(r.leader_url??`default`),children:Zn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:er(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var nr=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Kt}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:Jt},{id:`models`,label:`models`,component:nn},{id:`adapters`,label:`adapters`,component:rn},{id:`routes`,label:`routes`,component:fn},{id:`profiles`,label:`profiles`,component:pn}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:In},{id:`logs`,label:`logs`,component:kn},{id:`cluster`,label:`cluster`,component:Yn},{id:`predictor`,label:`predictor`,component:gn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:Dn},{id:`settings`,label:`settings`,component:tr}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:Sn}]}];function rr(e){return nr.find(t=>t.id===e)??nr[0]}function ir(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function ar({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:nr.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function or({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function sr(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function cr(e,t){return t?`#/${e}/${t}`:`#/${e}`}function lr(){let[e,t]=(0,k.useState)(()=>sr(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(sr(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=cr(e,t)}]}function ur(){let[e,t]=lr(),n=rr(e.section),r=ir(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Dt,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(ar,{active:n.id,onSelect:e=>{let n=rr(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{wt(),location.reload()}}),(0,A.jsx)(or,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var dr=new $e({defaultOptions:{queries:{staleTime:1e3}}});bt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:dr,children:(0,A.jsx)(ur,{})})})); \ No newline at end of file diff --git a/src/berth/ui/assets/index-CNEC70C6.js b/src/berth/ui/assets/index-CNEC70C6.js deleted file mode 100644 index 628e90c..0000000 --- a/src/berth/ui/assets/index-CNEC70C6.js +++ /dev/null @@ -1,11 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function S(){}var C={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return ne(e.type,t,e.props)}function w(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ie(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ae=/\/+/g;function oe(e,t){return typeof e==`object`&&e&&e.key!=null?ie(``+e.key):t.toString(36)}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(S,S):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+oe(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ae,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(w(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ae,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,w());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}var ee=!1,S=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-tet&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?w():ee=!1}}}var w;if(typeof y==`function`)w=function(){y(re)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=re,w=function(){ae.postMessage(null)}}else w=function(){_(re,0)};function oe(t,n){S=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(S),S=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,w()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1pe||(e.current=fe[pe],fe[pe]=null,pe--)}function D(e,t){pe++,fe[pe]=e.current,e.current=t}var ge=me(null),_e=me(null),ve=me(null),ye=me(null);function be(e,t){switch(D(ve,t),D(_e,e),D(ge,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}he(ge),D(ge,e)}function xe(){he(ge),he(_e),he(ve)}function Se(e){e.memoizedState!==null&&D(ye,e);var t=ge.current,n=Hd(t,e.type);t!==n&&(D(_e,e),D(ge,n))}function Ce(e){_e.current===e&&(he(ge),he(_e)),ye.current===e&&(he(ye),Qf._currentValue=de)}var O,we;function Te(e){if(O===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);O=t&&t[1]||``,we=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ee=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Te(n):``}function Oe(e,t){switch(e.tag){case 26:case 27:case 5:return Te(e.type);case 16:return Te(`Lazy`);case 13:return e.child!==t&&t!==null?Te(`Suspense Fallback`):Te(`Suspense`);case 19:return Te(`SuspenseList`);case 0:case 15:return De(e.type,!1);case 11:return De(e.type.render,!1);case 1:return De(e.type,!0);case 31:return Te(`Activity`);default:return``}}function ke(e){try{var t=``,n=null;do t+=Oe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Ae=Object.prototype.hasOwnProperty,je=t.unstable_scheduleCallback,Me=t.unstable_cancelCallback,Ne=t.unstable_shouldYield,Pe=t.unstable_requestPaint,Fe=t.unstable_now,Ie=t.unstable_getCurrentPriorityLevel,Le=t.unstable_ImmediatePriority,Re=t.unstable_UserBlockingPriority,ze=t.unstable_NormalPriority,Be=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,He=t.log,Ue=t.unstable_setDisableYieldValue,We=null,Ge=null;function Ke(e){if(typeof He==`function`&&Ue(e),Ge&&typeof Ge.setStrictMode==`function`)try{Ge.setStrictMode(We,e)}catch{}}var qe=Math.clz32?Math.clz32:Xe,Je=Math.log,Ye=Math.LN2;function Xe(e){return e>>>=0,e===0?32:31-(Je(e)/Ye|0)|0}var Ze=256,Qe=262144,$e=4194304;function et(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function tt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=et(n))):i=et(o):i=et(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=et(n))):i=et(o)):i=et(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function k(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=$e;return $e<<=1,!($e&62914560)&&($e=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),pn=!1;if(fn)try{var mn={};Object.defineProperty(mn,"passive",{get:function(){pn=!0}}),window.addEventListener(`test`,mn,mn),window.removeEventListener(`test`,mn,mn)}catch{pn=!1}var hn=null,gn=null,_n=null;function vn(){if(_n)return _n;var e,t=gn,n=t.length,r,i=`value`in hn?hn.value:hn.textContent,a=i.length;for(e=0;e=Xn),$n=` `,er=!1;function tr(e,t){switch(e){case`keyup`:return Jn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function nr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var rr=!1;function ir(e,t){switch(e){case`compositionend`:return nr(t);case`keypress`:return t.which===32?(er=!0,$n):null;case`textInput`:return e=t.data,e===$n&&er?null:e;default:return null}}function ar(e,t){if(rr)return e===`compositionend`||!Yn&&tr(e,t)?(e=vn(),_n=gn=hn=null,rr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Dr(n)}}function kr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?kr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ar(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=zt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=zt(e.document)}return t}function jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Mr=fn&&`documentMode`in document&&11>=document.documentMode,Nr=null,Pr=null,Fr=null,Ir=!1;function Lr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ir||Nr==null||Nr!==zt(r)||(r=Nr,`selectionStart`in r&&jr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Fr&&Er(Fr,r)||(Fr=r,r=Ed(Pr,`onSelect`),0>=o,i-=o,ki=1<<32-qe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),L&&ji(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),L&&ji(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return L&&ji(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),L&&ji(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=gi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=hi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=yi(o,e.mode,c),c.return=e,e=c}return s(e);case w:return o=Aa(o),b(e,r,o,c)}if(ue(o))return h(e,r,o,c);if(se(o)){if(l=se(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===S)return b(e,r,ia(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=_i(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=di(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ci(e),si(e,null,n),t}return ii(e,r,t,n),ci(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Fs(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,de,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ra(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ai(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Tr(s,o))return ii(e,t,i,0),K===null&&ri(),!1}catch{}if(n=ai(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ai(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var zs={readContext:ra,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ra,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ra,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Ke(!0);try{e()}finally{Ke(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Ke(!0);try{n(t)}finally{Ke(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(L){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(L){var n=Ai,r=ki;n=(r&~(1<<32-qe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[mt]=t,o[ht]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ve.current,Ui(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ii,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Bi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ui(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ui(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[mt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return xe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Zi(t.type),U(t),null;case 19:if(he(R),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)mi(n,e),n=n.sibling;return D(R,R.current&1|2),L&&ji(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Fe()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!L)return U(t),null}else 2*Fe()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Fe(),e.sibling=null,n=R.current,D(R,a?n&1|2:n&1),L&&ji(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&he(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Zi(la),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Pi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Zi(la),xe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ce(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(R),null;case 4:return xe(),null;case 10:return Zi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&he(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Zi(la),null;case 25:return null;default:return null}}function Vc(e,t){switch(Pi(t),t.tag){case 3:Zi(la),xe();break;case 26:case 27:case 5:Ce(t);break;case 4:xe();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:he(R);break;case 10:Zi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&he(ba);break;case 24:Zi(la)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Ar(e),jr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[mt]=e,wt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Or(s,h),v=Or(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Ge&&typeof Ge.onPostCommitFiberRoot==`function`)try{Ge.onPostCommitFiberRoot(We,o)}catch{}return!0}finally{E.p=a,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=xi(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=xi(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Fe()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=oi(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return je(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-qe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=tt(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||k(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Fe(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=N(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);wt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=N(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),wt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ve.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=N(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=N(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=N(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Vt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),wt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Vt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,wt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},v=new class extends _{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function S(){}function C(e,t){return typeof e==`function`?e(t):e}function te(e){return typeof e==`number`&&e>=0&&e!==1/0}function ne(e,t){return Math.max(e+(t||0)-Date.now(),0)}function re(e,t){return typeof e==`function`?e(t):e}function w(e,t){return typeof e==`function`?e(t):e}function ie(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==oe(o,t.options))return!1}else if(!ce(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ae(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(se(t.options.mutationKey)!==se(a))return!1}else if(!ce(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function oe(e,t){return(t?.queryKeyHashFn||se)(e)}function se(e){return JSON.stringify(e,(e,t)=>de(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ce(e,t){return e===t?!0:typeof e==typeof t&&e&&t&&typeof e==`object`&&typeof t==`object`?Object.keys(t).every(n=>ce(e[n],t[n])):!1}var le=Object.prototype.hasOwnProperty;function ue(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=E(e)&&E(t);if(!r&&!(de(e)&&de(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{b.setTimeout(t,e)})}function me(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:ue(e,t)}function he(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function D(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=(()=>{let e=()=>ee;return{isServer(){return e()},setIsServer(t){e=t}}})();function xe(){let e,t,n=new Promise((n,r)=>{e=n,t=r});n.status=`pending`,n.catch(()=>{});function r(e){Object.assign(n,e),delete n.resolve,delete n.reject}return n.resolve=t=>{r({status:`fulfilled`,value:t}),e(t)},n.reject=e=>{r({status:`rejected`,reason:e}),t(e)},n}var Se=x;function Ce(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Se,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var O=Ce(),we=new class extends _{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Te(e){return Math.min(1e3*2**e,3e4)}function Ee(e){return(e??`online`)===`online`?we.isOnline():!0}var De=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Oe(e){let t=!1,n=0,r,i=xe(),a=()=>i.status!==`pending`,o=t=>{if(!a()){let n=new De(t);f(n),e.onCancel?.(n)}},s=()=>{t=!0},c=()=>{t=!1},l=()=>v.isFocused()&&(e.networkMode===`always`||we.isOnline())&&e.canRun(),u=()=>Ee(e.networkMode)&&e.canRun(),d=e=>{a()||(r?.(),i.resolve(e))},f=e=>{a()||(r?.(),i.reject(e))},p=()=>new Promise(t=>{r=e=>{(a()||l())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,a()||e.onContinue?.()}),m=()=>{if(a())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(d).catch(r=>{if(a())return;let i=e.retry??(be.isServer()?0:3),o=e.retryDelay??Te,s=typeof o==`function`?o(n,r):o,c=i===!0||typeof i==`number`&&nl()?void 0:p()).then(()=>{t?f(r):m()})})};return{promise:i,status:()=>i.status,cancel:o,continue:()=>(r?.(),i),cancelRetry:s,continueRetry:c,canStart:u,start:()=>(u()?m():p().then(m),i)}}var ke=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),te(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(be.isServer()?1/0:300*1e3))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ae(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=await u((()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})()),{maxPages:o}=t.options,s=i?D:he;return{pages:s(e.pages,a,o),pageParams:s(e.pageParams,r,o)}};if(i&&a.length){let e=i===`backward`,t=e?Me:je,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:je(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):t.fetchFn=l}}}function je(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Me(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ne=class extends ke{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Ie(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Ie(this.options);e.data!==void 0&&(this.setState(Fe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=me(this.state.data,e,this.options);return this.#l({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#l({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(S).catch(S):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>w(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>re(e.options.staleTime,this)===`static`):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ne(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(t=>t!==e),this.observers.length||(this.#a&&(this.#s||this.#c()?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}#c(){return this.state.fetchStatus===`paused`&&this.state.status===`pending`}invalidate(){this.state.isInvalidated||this.#l({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ae(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#l({type:`fetch`,meta:a.fetchOptions?.meta}),this.#a=Oe({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof De&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#l({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#l({type:`pause`})},onContinue:()=>{this.#l({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await this.#a.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof De){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#l({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.scheduleGc()}}#l(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Pe(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Fe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),O.batch(()=>{this.observers.forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Pe(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ee(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Fe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Ie(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Le=class extends _{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=xe(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),ze(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Be(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Be(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof w(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!T(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&Ve(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||re(this.options.staleTime,this.#t)!==re(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||w(this.options.enabled,this.#t)!==w(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return Ue(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(S)),t}#g(){this.#b();let e=re(this.options.staleTime,this.#t);if(be.isServer()||this.#r.isStale||!te(e))return;let t=ne(this.#r.dataUpdatedAt,e)+1;this.#d=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(be.isServer()||w(this.options.enabled,this.#t)===!1||!te(this.#p)||this.#p===0)&&(this.#f=b.setInterval(()=>{(this.options.refetchIntervalInBackground||v.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(b.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(b.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&ze(e,t),o=i&&Ve(e,n,t,r);(a||o)&&(l={...l,...Pe(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=me(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=me(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:He(e,t),refetch:this.refetch,promise:this.#o,isEnabled:w(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=xe())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!T(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){O.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function Re(e,t){return w(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&w(t.retryOnMount,e)===!1)}function ze(e,t){return Re(e,t)||e.state.data!==void 0&&Be(e,t,t.refetchOnMount)}function Be(e,t,n){if(w(t.enabled,e)!==!1&&re(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&He(e,t)}return!1}function Ve(e,t,n,r){return(e!==t||w(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&He(e,n)}function He(e,t){return w(t.enabled,e)!==!1&&e.isStaleByTime(re(t.staleTime,e))}function Ue(e,t){return!T(e.getCurrentResult(),t)}var We=class extends ke{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||Ge(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=Oe({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let r=this.state.status===`pending`,i=!this.#r.canStart();try{if(r)t();else{this.#i({type:`pending`,variables:e,isPaused:i}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:i})}let a=await this.#r.start();return await this.#n.config.onSuccess?.(a,e,this.state.context,this,n),await this.options.onSuccess?.(a,e,this.state.context,n),await this.#n.config.onSettled?.(a,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(a,null,e,this.state.context,n),this.#i({type:`success`,data:a}),a}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),O.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function Ge(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Ke=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}#e;#t;#n;build(e,t,n){let r=new We({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t);if(n)if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=qe(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}else return!0}runNext(e){let t=qe(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){O.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ae(t,e))}findAll(e={}){return this.getAll().filter(t=>ae(e,t))}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return O.batch(()=>Promise.all(e.map(e=>e.continue().catch(S))))}};function qe(e){return e.options.scope?.id}var Je=class extends _{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),T(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&se(t.mutationKey)!==se(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??Ge();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){O.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function Ye(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}function Xe(e,t,n){let r=e.slice(0);return r[t]=n,r}var Ze=class extends _{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,O.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!T(e,n)});!o&&!s||(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(Ye(e,n).forEach(e=>{e.destroy()}),Ye(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){return t.map((n,r)=>{let i=e[r];return n.defaultedQueryOptions.notifyOnChangeProps?i:n.observer.trackResult(i,e=>{t.forEach(t=>{t.observer.trackProp(e)})})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(!this.#a||this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=ue(this.#a,t(e))),this.#a}return e}#f(){return this.#r?.combine!==void 0&&this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Le(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=Xe(this.#t,n,t),this.#h())}#h(){if(this.hasListeners()){let e=this.#u(this.#t,this.#l),t=this.#f(),n=this.#a,r=t?n:this.#d(e,this.#r?.combine);(t||n!==r)&&O.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},Qe=class extends _{constructor(e={}){super(),this.config=e,this.#e=new Map}#e;build(e,t,n){let r=t.queryKey,i=t.queryHash??oe(r,t),a=this.get(i);return a||(a=new Ne({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){O.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ie(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ie(e,t)):t}notify(e){O.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){O.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){O.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},$e=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new Qe,this.#t=e.mutationCache||new Ke,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=v.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=we.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(re(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=C(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return O.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;O.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return O.batch(()=>(n.findAll(e).forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,...e},t)))}cancelQueries(e,t={}){let n={revert:!0,...t},r=O.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(S).catch(S)}invalidateQueries(e,t={}){return O.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=O.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(S)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(S)}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(re(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(S).catch(S)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(S).catch(S)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return we.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(se(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ce(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(se(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ce(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=oe(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===ge&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}},et=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),tt=o(((e,t)=>{t.exports=et()})),k=c(u(),1),A=tt(),nt=k.createContext(void 0),rt=e=>{let t=k.useContext(nt);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},it=({client:e,children:t})=>(k.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,A.jsx)(nt.Provider,{value:e,children:t})),at=k.createContext(!1),ot=()=>k.useContext(at);at.Provider;function st(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var ct=k.createContext(st()),lt=()=>k.useContext(ct),ut=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},dt=e=>{k.useEffect(()=>{e.clearReset()},[e])},ft=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),pt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},mt=(e,t)=>e.isLoading&&e.isFetching&&!t,ht=(e,t)=>e?.suspense&&t.isPending,gt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function _t({queries:e,...t},n){let r=rt(n),i=ot(),a=lt(),o=k.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:`optimistic`,t}),[e,r,i]);o.forEach(e=>{pt(e),ut(e,a,r.getQueryCache().get(e.queryHash))}),dt(a);let[s]=k.useState(()=>new Ze(r,o,t)),[c,l,u]=s.getOptimisticResult(o,t.combine),d=!i&&t.subscribed!==!1;k.useSyncExternalStore(k.useCallback(e=>d?s.subscribe(O.batchCalls(e)):S,[s,d]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),k.useEffect(()=>{s.setQueries(o,t)},[o,t,s]);let f=c.some((e,t)=>ht(o[t],e))?c.flatMap((e,t)=>{let n=o[t];return n&&ht(n,e)?gt(n,new Le(r,n),a):[]}):[];if(f.length>0)throw Promise.all(f);let p=c.find((e,t)=>{let n=o[t];return n&&ft({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(p?.error)throw p.error;return l(u())}function vt(e,t,n){let r=ot(),i=lt(),a=rt(n),o=a.defaultQueryOptions(e);a.getDefaultOptions().queries?._experimental_beforeQuery?.(o);let s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,pt(o),ut(o,i,s),dt(i);let l=!a.getQueryCache().get(o.queryHash),[u]=k.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),f=!r&&c;if(k.useSyncExternalStore(k.useCallback(e=>{let t=f?u.subscribe(O.batchCalls(e)):S;return u.updateResult(),t},[u,f]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),k.useEffect(()=>{u.setOptions(o)},[o,u]),ht(o,d))throw gt(o,u,i);if(ft({result:d,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw d.error;return a.getDefaultOptions().queries?._experimental_afterQuery?.(o,d),o.experimental_prefetchInRender&&!be.isServer()&&mt(d,r)&&(l?gt(o,u,i):s?.promise)?.catch(S).finally(()=>{u.updateResult()}),o.notifyOnChangeProps?d:u.trackResult(d)}function j(e,t){return vt(e,Le,t)}function M(e,t){let n=rt(t),[r]=k.useState(()=>new Je(n,e));k.useEffect(()=>{r.setOptions(e)},[r,e]);let i=k.useSyncExternalStore(k.useCallback(e=>r.subscribe(O.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=k.useCallback((e,t)=>{r.mutate(e,t).catch(S)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var yt=c(g(),1),bt=`berth.adminToken`;function xt(){return localStorage.getItem(bt)}function St(e){localStorage.setItem(bt,e)}function Ct(){localStorage.removeItem(bt)}var N={deployments:[`deps`],models:[`models`],keys:[`keys`],gpus:[`gpus`],backends:[`backends`],adapters:[`adapters`],profiles:[`profiles`],routes:[`routes`],nodes:[`nodes`],requests:[`requests`],predictorCandidates:[`predictor-candidates`],predictorStats:[`predictor-stats`],metricsSnapshot:[`metrics-snapshot`],clusterInfo:[`cluster-info`],config:[`config`],requestsSeed:[`requests-seed`],node:e=>[`node`,e],keyUsage:(e,t)=>[`key-usage`,e,t],usageSeries:(e,t,n)=>[`usage-series`,e,t,n]};async function wt(e){if(!xt())return e;let t=await F.createStreamToken(new URL(e,window.location.origin).pathname);return`${e}${e.includes(`?`)?`&`:`?`}stream_token=${encodeURIComponent(t.token)}`}async function P(e,t,n){let r={"Content-Type":`application/json`},i=xt();i&&(r.Authorization=`Bearer ${i}`);let a=await fetch(t,{method:e,headers:r,body:n===void 0?void 0:JSON.stringify(n)});if(!a.ok){let e=await a.text();throw Error(`${a.status}: ${e}`)}if(a.status!==204)return a.json()}var F={listDeployments:()=>P(`GET`,`/admin/deployments`),stopDeployment:e=>P(`DELETE`,`/admin/deployments/${e}`),pinDeployment:e=>P(`POST`,`/admin/deployments/${e}/pin`),unpinDeployment:e=>P(`POST`,`/admin/deployments/${e}/unpin`),listModels:()=>P(`GET`,`/admin/models`),createModel:e=>P(`POST`,`/admin/models`,e),deleteModel:e=>P(`DELETE`,`/admin/models/${e}`),listKeys:()=>P(`GET`,`/admin/keys`),createKey:e=>P(`POST`,`/admin/keys`,e),revokeKey:e=>P(`DELETE`,`/admin/keys/${e}`),listGpus:()=>P(`GET`,`/admin/gpus`),listBackends:()=>P(`GET`,`/admin/backends`),loadModel:e=>P(`POST`,`/admin/deployments`,e),createStreamToken:e=>P(`POST`,`/admin/stream-token`,{path:e}),listAdapters:()=>P(`GET`,`/admin/adapters`),createAdapter:e=>P(`POST`,`/admin/adapters`,e),downloadAdapter:e=>P(`POST`,`/admin/adapters/${e}/download`),addLocalAdapter:e=>P(`POST`,`/admin/adapters/local`,e),deleteAdapter:(e,t=!1)=>P(`DELETE`,`/admin/adapters/${e}${t?`?force=true`:``}`),hotLoadAdapter:(e,t)=>P(`POST`,`/admin/deployments/${e}/adapters/${t}`),hotUnloadAdapter:(e,t)=>P(`DELETE`,`/admin/deployments/${e}/adapters/${t}`),predictorCandidates:()=>P(`GET`,`/admin/predictor/candidates`),predictorStats:()=>P(`GET`,`/admin/predictor/stats`),listProfiles:()=>P(`GET`,`/admin/service-profiles`),createProfile:e=>P(`POST`,`/admin/service-profiles`,e),deployProfile:e=>P(`POST`,`/admin/service-profiles/${encodeURIComponent(e)}/deploy`),deleteProfile:e=>P(`DELETE`,`/admin/service-profiles/${encodeURIComponent(e)}`),listRoutes:()=>P(`GET`,`/admin/routes`),createRoute:e=>P(`POST`,`/admin/routes`,e),deleteRoute:e=>P(`DELETE`,`/admin/routes/${encodeURIComponent(e)}`),dryRunRoute:e=>P(`GET`,`/admin/routes/match/dry-run?model=${encodeURIComponent(e)}`),keyUsage:(e,t=86400,n=3600)=>P(`GET`,`/admin/keys/${e}/usage?window_s=${t}&bucket_s=${n}`),listRequests:()=>P(`GET`,`/admin/requests`),listNodes:()=>P(`GET`,`/admin/nodes`),getNode:e=>P(`GET`,`/admin/nodes/${e}`),enrollNode:e=>P(`POST`,`/admin/nodes/enroll`,{label:e}),removeNode:e=>P(`DELETE`,`/admin/nodes/${e}`),getClusterInfo:()=>P(`GET`,`/admin/cluster`),getConfig:()=>P(`GET`,`/admin/config`),getMetricsSnapshot:()=>P(`GET`,`/admin/metrics/snapshot`),getUsageSeries:(e=86400,t=3600)=>P(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}`),getUsageByModel:(e=86400,t=3600)=>P(`GET`,`/admin/usage/series?window_s=${e}&bucket_s=${t}&group_by=model`)};function Tt(e){return`berth://enroll?${new URLSearchParams({leader:e.leader_url,token:e.token,ca_fp:e.ca_fingerprint}).toString()}`}function Et({children:e}){let[t,n]=(0,k.useState)(xt()),[r,i]=(0,k.useState)(``);return t?(0,A.jsx)(A.Fragment,{children:e}):(0,A.jsx)(`div`,{className:`min-h-screen flex items-center justify-center px-6`,children:(0,A.jsxs)(`div`,{className:`w-full max-w-md enter`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-12`,children:[(0,A.jsx)(`div`,{className:`text-base`,children:`berth`}),(0,A.jsx)(`span`,{className:`caret`})]}),(0,A.jsxs)(`div`,{className:`space-y-8`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`authenticate`}),(0,A.jsx)(`p`,{className:`text-dim text-[12px] leading-relaxed`,children:`Paste an admin-tier API key. If you don't have one, run this on the host:`}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-elev border border-rule px-3 py-2 text-ink overflow-x-auto`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),`berth key create web --tier admin`]})]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`input`,{className:`field w-full font-mono`,placeholder:`sk-...`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r.trim()&&(St(r.trim()),n(r.trim()))},autoFocus:!0}),(0,A.jsx)(`button`,{className:`btn-primary w-full`,disabled:!r.trim(),onClick:()=>{St(r.trim()),n(r.trim())},children:`Continue`})]})]})]})})}function Dt(e){return e?e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`:`-`}function Ot(e){return!e||e.length===0?`-`:e.length===1?`gpu ${e[0]}`:`gpu ${e.join(`,`)}`}function kt(e){return e<=1?`grid-cols-1`:e===2?`grid-cols-1 md:grid-cols-2`:e===3?`grid-cols-1 md:grid-cols-3`:`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`}function At(e){if(e.pinned||!e.idle_timeout_s||!e.last_request_at)return null;let t=String(e.last_request_at).replace(` `,`T`)+`Z`,n=Date.parse(t);if(Number.isNaN(n))return null;let r=e.idle_timeout_s-(Date.now()-n)/1e3;return r<=0?`evicting`:r<60?`${Math.round(r)}s`:`${Math.round(r/60)}m`}function jt({d:e,modelName:t}){let n=At(e),r=e.vram_used_mb&&e.vram_used_mb>0?e.vram_used_mb:e.vram_reserved_mb;return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1.5`,title:e.last_error||`deployment #${e.id} on ${e.backend}`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:t}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider hidden lg:inline`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum`,children:Dt(r)}),e.pinned?(0,A.jsx)(`span`,{className:`text-accent text-[10px] tracking-wider`,children:`pin`}):n?(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,title:`idle countdown`,children:n}):(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`})]})}function Mt({g:e,deployments:t,models:n}){let r=e.memory_used_mb/e.memory_total_mb*100,i=t.filter(t=>(t.gpu_ids??[]).includes(e.index)&&(t.status===`ready`||t.status===`loading`));return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`gpu `,e.index]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[r.toFixed(0),`%`]})]}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2 tnum`,children:[(0,A.jsx)(`div`,{className:`text-3xl font-light tracking-tightish`,children:(e.memory_used_mb/1024).toFixed(1)}),(0,A.jsxs)(`div`,{className:`text-mute text-[12px]`,children:[`/ `,(e.memory_total_mb/1024).toFixed(0),` GB`]})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent transition-[width] duration-500`,style:{width:`${r}%`}})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6 text-mute text-[11px] tnum`,children:[(0,A.jsxs)(`span`,{children:[`util `,e.gpu_util_pct,`%`]}),(0,A.jsxs)(`span`,{children:[e.power_w,` w`]}),(0,A.jsx)(`span`,{className:`ml-auto`,children:i.length===0?(0,A.jsx)(`span`,{className:`text-mute`,children:`idle`}):(0,A.jsxs)(`span`,{className:`text-dim`,children:[i.length,` loaded`]})})]}),i.length>0&&(0,A.jsx)(`div`,{className:`pt-2 border-t border-rule-soft space-y-0.5`,children:i.map(e=>(0,A.jsx)(jt,{d:e,modelName:n.find(t=>t.id===e.model_id)?.name??`#${e.id}`},e.id))})]})}function Nt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=t.data??[],i=e.data??[];return(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpus`}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no gpus reported`}):(0,A.jsx)(`div`,{className:`grid gap-12 `+kt(r.length),children:r.map(e=>(0,A.jsx)(Mt,{g:e,deployments:i,models:n.data??[]},e.index))})]})}function Pt({values:e,width:t=80,height:n=20}){if(e.length===0)return(0,A.jsx)(`span`,{style:{color:`#888`},children:`—`});let r=Math.max(1,...e),i=t/Math.max(1,e.length-1);return(0,A.jsx)(`svg`,{width:t,height:n,"aria-label":`sparkline`,children:(0,A.jsx)(`polyline`,{fill:`none`,stroke:`currentColor`,strokeWidth:`1`,points:e.map((e,t)=>`${(t*i).toFixed(1)},${(n-e/r*n).toFixed(1)}`).join(` `)})})}function Ft({title:e,value:t,sub:n,spark:r,badge:i,onClick:a}){return(0,A.jsxs)(`div`,{className:`space-y-3 border-l border-rule pl-5 `+(a?`cursor-pointer hover:border-accent transition-colors`:``),onClick:a,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tracking-tightish tnum`,children:t}),r&&r.length>0&&(0,A.jsx)(`div`,{className:`text-accent`,children:(0,A.jsx)(Pt,{values:r,width:120,height:22})}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:n}),i&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:i})]})}function It({buckets:e,height:t=56}){if(e.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no traffic in window`});let n=Math.max(1,...e.map(e=>e.count)),r=100/e.length;return(0,A.jsx)(`svg`,{width:`100%`,height:t,viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,"aria-label":`requests over time`,children:e.map((e,i)=>{let a=e.count/n*t;return(0,A.jsx)(`rect`,{x:i*r+1/2,y:t-a,width:Math.max(r-1,.4),height:a,className:`text-accent`,fill:`currentColor`,opacity:e.count===0?.15:.85,children:(0,A.jsxs)(`title`,{children:[e.count,` req`]})},i)})})}function Lt({groups:e,limit:t=5}){let n=e.slice(0,t);if(n.length===0)return(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`no requests in window`});let r=Math.max(1,...n.map(e=>e.total));return(0,A.jsx)(`div`,{className:`space-y-2`,children:n.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,children:[(0,A.jsx)(`span`,{className:`font-mono text-ink truncate w-[14ch]`,title:e.label,children:e.label}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[8ch] text-right`,children:e.total.toLocaleString()}),(0,A.jsx)(`div`,{className:`flex-1 h-1 bg-rule-soft relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent`,style:{width:`${e.total/r*100}%`}})})]},e.key))})}function Rt(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`);return(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`active deployments`}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{location.hash=`#/serving/deployments`},children:`manage in serving →`})]}),r.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[12px]`,children:`nothing loaded`}):(0,A.jsx)(`div`,{className:`space-y-1`,children:r.map(e=>{let r=(t.data??[]).find(t=>t.id===e.model_id),i=(n.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px] py-1`,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate flex-1 min-w-0`,children:r?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsx)(`span`,{className:`text-dim tnum w-[7ch] text-right`,children:(e.gpu_ids??[]).length?`gpu ${(e.gpu_ids??[]).join(`,`)}`:`-`}),i!==`local`&&(0,A.jsx)(`span`,{className:`text-accent text-[10px]`,children:i})]},e.id)})})]})}function zt(e){let t=(e?.nodes??[]).flatMap(e=>e.deployments),n=0,r=0,i=0,a=0,o=0,s=0;for(let e of t){n+=e.in_flight,r+=e.requests_last_window,i+=e.errors_last_window;let t=e.requests_last_window||0;a+=e.latency_p50_ms*t,o+=e.latency_p95_ms*t,s+=t}let c=t.length?t.reduce((e,t)=>e+t.latency_p50_ms,0)/t.length:0,l=t.length?t.reduce((e,t)=>e+t.latency_p95_ms,0)/t.length:0;return{inFlight:n,requestsWindow:r,errorsWindow:i,errorRate:i/Math.max(r,1),latencyP50:s?a/s:c,latencyP95:s?o/s:l}}function Bt(e,t){if(e.length===0||t<=0)return{reqPerMin:0,tokPerSec:0,totalOut:0};let n=e.slice(-3),r=n.length*t,i=n.reduce((e,t)=>e+t.count,0),a=n.reduce((e,t)=>e+t.tokens_out,0),o=e.reduce((e,t)=>e+t.tokens_out,0);return{reqPerMin:r?i/r*60:0,tokPerSec:r?a/r:0,totalOut:o}}function Vt(e,t){return(0,A.jsxs)(A.Fragment,{children:[e,(0,A.jsxs)(`span`,{className:`text-mute text-[13px]`,children:[` `,t]})]})}function Ht(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),t=j({queryKey:N.gpus,queryFn:F.listGpus,refetchInterval:2e3}),n=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),r=j({queryKey:N.metricsSnapshot,queryFn:F.getMetricsSnapshot,refetchInterval:2e3}),i=j({queryKey:N.usageSeries(3600,60,`none`),queryFn:()=>F.getUsageSeries(3600,60),refetchInterval:5e3}),a=j({queryKey:N.usageSeries(86400,3600,`none`),queryFn:()=>F.getUsageSeries(86400,3600),refetchInterval:3e4}),o=j({queryKey:N.usageSeries(86400,3600,`model`),queryFn:()=>F.getUsageByModel(86400,3600),refetchInterval:3e4}),s=(e.data??[]).filter(e=>e.status===`ready`||e.status===`loading`),c=zt(r.data),l=i.data?.buckets??[],u=Bt(l,60),d=l.slice(-30).map(e=>e.count),f=l.slice(-30).map(e=>e.tokens_out);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`overview`}),(0,A.jsxs)(`div`,{className:`flex items-baseline gap-6`,children:[(()=>{let e=n.data?.nodes??[],t=e.filter(e=>e.status===`ready`).length,r=e.filter(e=>e.label!==`local`).length;return e.length===0?null:(0,A.jsx)(`div`,{className:`label`,title:`cluster nodes`,children:r===0?(0,A.jsx)(A.Fragment,{children:`single-node`}):(0,A.jsxs)(A.Fragment,{children:[`cluster `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[t,`/`,e.length]})]})})})(),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` gpu / `,s.length,` active`]})]})]}),(0,A.jsx)(Nt,{}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`request stats`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-y-8 gap-x-6`,children:[(0,A.jsx)(Ft,{title:`volume`,value:Vt(u.reqPerMin.toFixed(+(u.reqPerMin<10)),`req/min`),sub:`${c.inFlight} in flight`,spark:d,badge:`live`}),(0,A.jsx)(Ft,{title:`latency`,value:Vt(c.latencyP50.toFixed(0),`ms p50`),sub:`p95 ${c.latencyP95.toFixed(0)} ms`,badge:`live · 60s`}),(0,A.jsx)(Ft,{title:`errors`,value:Vt((c.errorRate*100).toFixed(1),`%`),sub:(0,A.jsxs)(`span`,{className:`text-accent`,children:[c.errorsWindow,` recent → see traffic`]}),badge:`live · 60s`,onClick:()=>{location.hash=`#/observe/requests`}}),(0,A.jsx)(Ft,{title:`throughput`,value:Vt(u.tokPerSec.toFixed(0),`tok/s`),sub:`${u.totalOut.toLocaleString()} out tok · 1h`,spark:f,badge:`live`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`traffic over time`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider uppercase`,children:`last 24h · bounded by retention`})]}),(0,A.jsx)(It,{buckets:a.data?.buckets??[]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-12 gap-y-10`,children:[(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`top models · 24h`}),(0,A.jsx)(Lt,{groups:o.data?.groups??[]})]}),(0,A.jsx)(`section`,{children:(0,A.jsx)(Rt,{})})]})]})}function Ut({used:e,reserved:t,status:n}){return n===`stopped`||n===`failed`?(0,A.jsx)(`span`,{children:`-`}):e&&e>0?(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{children:Dt(e)}),(0,A.jsxs)(`span`,{className:`text-mute text-[10px]`,children:[`est `,Dt(t)]})]}):(0,A.jsxs)(`div`,{className:`flex flex-col items-end leading-tight`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:Dt(t)}),(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`est`})]})}function Wt(){let e=rt(),t=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:2e3}),n=j({queryKey:N.models,queryFn:F.listModels,refetchInterval:5e3}),r=j({queryKey:N.nodes,queryFn:F.listNodes,refetchInterval:5e3}),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(``),u=M({mutationFn:e=>F.stopDeployment(e),onMutate:e=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),d=M({mutationFn:({id:e,pinned:t})=>t?F.unpinDeployment(e):F.pinDeployment(e),onMutate:({id:e})=>{s(e),l(``)},onError:e=>l(e.message),onSettled:()=>{s(null),e.invalidateQueries({queryKey:N.deployments})}}),f=t.data??[],p=f.filter(e=>e.status===`ready`||e.status===`loading`),m=i?f:p,h=f.length-m.length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`deployments`}),(0,A.jsxs)(`div`,{className:`label`,children:[p.length,` active / `,f.length,` total`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`deployments`}),(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:i,onChange:e=>a(e.target.checked)}),`show stopped `,h>0&&!i&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,h,`)`]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:c}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{children:`node`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{className:`text-right`,children:`vram`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpu`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[m.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsxs)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:[`no active deployments. load one from `,(0,A.jsx)(`span`,{className:`text-dim`,children:`models`})]})}),m.map(e=>{let t=(n.data??[]).find(t=>t.id===e.model_id),i=(r.data?.nodes??[]).find(t=>t.id===e.node_id)?.label??(e.node_id?`#${e.node_id}`:`local`),a=e.status===`ready`||e.status===`loading`,s=o===e.id;return(0,A.jsxs)(`tr`,{title:e.last_error||void 0,children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:t?.name??`-`}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{children:(0,A.jsx)(`span`,{className:i===`local`?`text-mute`:`text-accent`,children:i})}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.status})]}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:(0,A.jsx)(Ut,{used:e.vram_used_mb??null,reserved:e.vram_reserved_mb,status:e.status})}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:Ot(e.gpu_ids)}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`transition-opacity hover:opacity-70 disabled:opacity-40 `+(e.pinned?`text-accent`:`text-dim`),disabled:s,onClick:()=>d.mutate({id:e.id,pinned:!!e.pinned}),title:e.pinned?`pinned: idle reaper will not stop this deployment`:`pin to keep alive through idle timeout`,children:e.pinned?`unpin`:`pin`}),a?(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s,onClick:()=>{confirm(`stop deployment #${e.id}?`)&&u.mutate(e.id)},children:s?`stopping...`:`stop`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]})]},e.id)})]})]})]})]})}function Gt(e){let t=e.split(`,`).map(e=>e.trim()).filter(Boolean).map(Number).filter(e=>Number.isInteger(e)&&e>=0);if(t.length===0)throw Error(`gpu_ids: at least one integer required`);return t}function Kt(e){let t=Number(e);if(!Number.isInteger(t)||t<128)throw Error(`max_model_len: integer >= 128`);return t}function qt(e){return e&&e!==`local`?e:null}var Jt={backend:``,maxModelLen:`4096`,gpuIds:`0`,pinned:!1,nodeLabel:``},Yt=e=>new Promise(t=>setTimeout(t,e));function Xt(e){return e instanceof TypeError&&/failed to fetch|network/i.test(e.message)}async function Zt(e,t){for(let n=0;n<15;n+=1){let n=(await F.listDeployments()).filter(n=>n.id>t&&n.model_id===e).sort((e,t)=>t.id-e.id)[0];if(n){if(n.status===`failed`)throw Error(n.last_error||`deployment failed after it started`);return n}await Yt(1e3)}throw Error(`deployment request disconnected before a new deployment appeared`)}function Qt(){let e=rt(),t=j({queryKey:N.models,queryFn:F.listModels}),n=j({queryKey:N.backends,queryFn:F.listBackends}),r=j({queryKey:N.gpus,queryFn:F.listGpus}),i=j({queryKey:N.nodes,queryFn:F.listNodes}),a=j({queryKey:N.config,queryFn:F.getConfig}),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Jt),[m,h]=(0,k.useState)(``),g=a.data?.values.leader_only===!0,_=(i.data?.nodes??[]).filter(e=>e.label!==`local`),v=_.filter(e=>e.status===`ready`),y=f.nodeLabel||(g?v[0]?.label??``:``),b=g&&!y,x=M({mutationFn:()=>F.createModel({name:c||o.split(`/`).pop().toLowerCase(),hf_repo:o}),onSuccess:()=>{s(``),l(``),e.invalidateQueries({queryKey:N.models})}}),ee=M({mutationFn:e=>F.deleteModel(e),onSuccess:()=>e.invalidateQueries({queryKey:N.models})}),S=M({mutationFn:async e=>{let t=Gt(f.gpuIds),n=Kt(f.maxModelLen),r={model_name:e.name,hf_repo:e.hf_repo,gpu_ids:t,max_model_len:n,pinned:f.pinned};f.backend&&(r.backend=f.backend),r.node_label=qt(y);let i=(await F.listDeployments()).reduce((e,t)=>Math.max(e,t.id),0);try{return await F.loadModel(r)}catch(t){if(!Xt(t))throw t;return Zt(e.id,i)}},onMutate:()=>h(``),onSuccess:()=>{d(null),p(Jt),e.invalidateQueries({queryKey:N.deployments})},onError:e=>h(e.message)});return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`models`}),(0,A.jsxs)(`div`,{className:`label`,children:[(t.data??[]).length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_220px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`huggingface repo (e.g. Qwen/Qwen3.6-35B-A3B-FP8)`,value:o,onChange:e=>s(e.target.value)}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local alias (optional)`,value:c,onChange:e=>l(e.target.value)}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!o.trim()||x.isPending,onClick:()=>x.mutate(),children:x.isPending?`registering...`:`register`})]}),x.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:x.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`huggingface`}),(0,A.jsx)(`th`,{children:`revision`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[(t.data??[]).length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!py-12 text-center text-mute`,children:`no models registered yet`})}),(t.data??[]).map(e=>{let t=u===e.name,i=S.isPending&&u===e.name;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.revision}),(0,A.jsxs)(`td`,{className:`text-right space-x-6`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity`,onClick:()=>{t?d(null):(d(e.name),p(Jt),h(``))},children:t?`cancel`:`load`}),(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>ee.mutate(e.name),children:`delete`})]})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:4,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:f.backend,onChange:e=>p(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto (server picks)`}),(n.data??[]).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:y,onChange:e=>p(t=>({...t,nodeLabel:e.target.value})),children:[!g&&(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),v.map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id)),g&&v.length===0&&(0,A.jsx)(`option`,{value:``,disabled:!0,children:`no ready agents`})]}),_.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no agents enrolled`}),_.length>0&&v.length===0&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:`no ready agents online`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.maxModelLen,onChange:e=>p(t=>({...t,maxModelLen:e.target.value})),placeholder:`4096`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,value:f.gpuIds,onChange:e=>p(t=>({...t,gpuIds:e.target.value})),placeholder:`0 or 0,1`}),f.nodeLabel&&f.nodeLabel!==`local`?(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`on agent `,f.nodeLabel]}):(r.data??[]).length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`available: `,(r.data??[]).map(e=>e.index).join(`, `)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-1`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:f.pinned,onChange:e=>p(t=>({...t,pinned:e.target.checked}))}),`pin (idle reaper skips it)`]})]})]}),m&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:m}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:i||b,onClick:()=>S.mutate(e),children:i?`launching...`:`deploy`}),(0,A.jsx)(`button`,{className:`btn`,disabled:i,onClick:()=>d(null),children:`cancel`})]})]})})})]},e.id)})]})]})]})]})}function $t(){let e=rt(),t=j({queryKey:N.adapters,queryFn:F.listAdapters,refetchInterval:5e3}),n=j({queryKey:N.models,queryFn:F.listModels}),[r,i]=(0,k.useState)(`hf`),[a,o]=(0,k.useState)(``),[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(``),[d,f]=(0,k.useState)(``),p=n.data??[],m=M({mutationFn:async()=>{let e=d||a.split(`/`).pop().toLowerCase();return await F.createAdapter({name:e,base_model_name:l,hf_repo:a}),F.downloadAdapter(e)},onSuccess:()=>{o(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),h=M({mutationFn:()=>{let e=d||s.split(`/`).filter(Boolean).pop().toLowerCase();return F.addLocalAdapter({name:e,base_model_name:l,local_path:s})},onSuccess:()=>{c(``),f(``),e.invalidateQueries({queryKey:N.adapters})}}),g=M({mutationFn:e=>F.deleteAdapter(e,!0),onSuccess:()=>e.invalidateQueries({queryKey:N.adapters})}),_=t.data??[];return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`adapters`}),(0,A.jsxs)(`div`,{className:`label`,children:[_.length,` registered`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`register`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,A.jsx)(`button`,{onClick:()=>i(`hf`),className:r===`hf`?`text-ink`:`text-mute hover:text-dim`,children:`huggingface`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{onClick:()=>i(`local`),className:r===`local`?`text-ink`:`text-mute hover:text-dim`,children:`local path`})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px_160px_auto] gap-3 max-w-4xl`,children:[r===`hf`?(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`hf repo (e.g. user/qwen3-lora)`,value:a,onChange:e=>o(e.target.value)}):(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`/abs/path/to/adapter-dir`,value:s,onChange:e=>c(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:l,onChange:e=>u(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`base model`}),p.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]}),(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`local name (opt)`,value:d,onChange:e=>f(e.target.value)}),r===`hf`?(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!a.trim()||!l||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`pulling...`:`pull`}):(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!s.trim()||!l||h.isPending,onClick:()=>h.mutate(),children:h.isPending?`adding...`:`add`})]}),m.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:m.error.message}),h.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px]`,children:h.error.message})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`registry`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`base`}),(0,A.jsx)(`th`,{children:`source`}),(0,A.jsx)(`th`,{className:`text-right`,children:`rank`}),(0,A.jsx)(`th`,{className:`text-right`,children:`size`}),(0,A.jsx)(`th`,{children:`loaded into`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[_.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no adapters registered yet`})}),_.map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.base}),(0,A.jsx)(`td`,{className:`text-mute font-mono text-[11px]`,children:e.hf_repo.startsWith(`local:`)?`local`:e.hf_repo}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.lora_rank??`-`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.size_mb==null?e.downloaded?`-`:`not pulled`:`${e.size_mb} MB`}),(0,A.jsx)(`td`,{className:`text-mute tnum`,children:(e.loaded_into??[]).length>0?(e.loaded_into??[]).join(`,`):`-`}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger`,onClick:()=>g.mutate(e.name),children:`remove`})})]},e.id))]})]})]})]})}function en({profiles:e,models:t,backends:n,nodes:r,form:i,setForm:a,formError:o,actionError:s,createProfile:c,deployProfile:l,deleteProfile:u}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profiles`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`reusable launch definition`})]}),s&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:s}),(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`qwen-vllm`,value:i.name,onChange:e=>a(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`model name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,list:`profile-model-list`,placeholder:`qwen`,value:i.model_name,onChange:e=>{let n=e.target.value,r=t.find(e=>e.name===n);a(e=>({...e,model_name:n,hf_repo:r?r.hf_repo:e.hf_repo}))}}),(0,A.jsx)(`datalist`,{id:`profile-model-list`,children:t.map(e=>(0,A.jsx)(`option`,{value:e.name},e.id))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-6`,children:[(0,A.jsx)(`div`,{className:`label`,children:`hf repo`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`Qwen/Qwen2.5-0.5B-Instruct`,value:i.hf_repo,onChange:e=>a(t=>({...t,hf_repo:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`backend`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.backend,onChange:e=>a(t=>({...t,backend:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`auto`}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`node`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:i.node_label,onChange:e=>a(t=>({...t,node_label:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`leader (local)`}),r.filter(e=>e.label!==`local`&&e.status===`ready`).map(e=>(0,A.jsxs)(`option`,{value:e.label,children:[e.label,` · `,e.gpu_count,` gpu`]},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu ids`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,placeholder:`0 or 0,1`,value:i.gpu_ids,onChange:e=>a(t=>({...t,gpu_ids:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max model len`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum`,value:i.max_model_len,onChange:e=>a(t=>({...t,max_model_len:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3 flex flex-col`,children:[(0,A.jsx)(`div`,{className:`label`,children:`options`}),(0,A.jsxs)(`label`,{className:`text-[12px] text-dim flex items-center gap-2 select-none cursor-pointer pt-2`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`accent-accent`,checked:i.pinned,onChange:e=>a(t=>({...t,pinned:e.target.checked}))}),`pinned (skip idle reaper)`]})]})]}),o&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:o}),(0,A.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!i.name.trim()||!i.model_name.trim()||!i.hf_repo.trim()||c.isPending,onClick:()=>c.mutate(),children:c.isPending?`creating…`:`create profile`})})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`gpus`}),(0,A.jsx)(`th`,{className:`text-right`,children:`ctx`}),(0,A.jsx)(`th`,{children:`pinned`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:`no profiles yet. create one above to define how a model is launched.`})}),e.map(e=>{let t=l.isPending&&l.variables===e.name,n=u.isPending&&u.variables===e.name;return(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.model_name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.backend}),(0,A.jsx)(`td`,{className:`text-right text-dim tnum`,children:e.gpu_ids.join(`,`)||`—`}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.max_model_len}),(0,A.jsx)(`td`,{children:e.pinned?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})}),(0,A.jsxs)(`td`,{className:`text-right space-x-5 whitespace-nowrap`,children:[(0,A.jsx)(`button`,{className:`text-accent hover:opacity-70 transition-opacity disabled:opacity-40`,disabled:t,onClick:()=>l.mutate(e.name),children:t?`deploying…`:`deploy`}),(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:n,onClick:()=>{confirm(`delete profile ${e.name}?`)&&u.mutate(e.name)},children:n?`deleting…`:`delete`})]})]},e.id)})]})]})]})}function tn(e){return e===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):e?(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-ready`}),(0,A.jsx)(`span`,{className:`text-ok`,children:`ready`})]}):(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`dot dot-failed`}),(0,A.jsx)(`span`,{className:`text-err`,children:`not ready`})]})}function nn({result:e}){if(!e.matched)return(0,A.jsxs)(`div`,{className:`text-[12px] space-y-2`,children:[(0,A.jsxs)(`div`,{className:`text-err`,children:[`no enabled route matches `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested})]}),e.candidates.length>0&&(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[e.candidates.length,` disabled candidate`,e.candidates.length===1?``:`s`,` share this match_model:`,` `,e.candidates.map(e=>e.name).join(`, `)]}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:[`the proxy will fall back to treating `,(0,A.jsx)(`span`,{className:`font-mono`,children:e.requested}),` as a direct model name.`]})]});let t=e.matched;return(0,A.jsxs)(`div`,{className:`text-[12px] grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`matched route `}),(0,A.jsx)(`span`,{className:`text-ink`,children:t.name}),(0,A.jsxs)(`span`,{className:`text-mute`,children:[` (priority `,t.priority,`)`]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`primary profile `}),(0,A.jsx)(`span`,{className:`text-dim`,children:t.profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.target_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:tn(e.primary_ready)})]}),(0,A.jsxs)(`div`,{className:`md:col-start-2`,children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback `}),t.fallback_profile_name?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:t.fallback_profile_name}),(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:t.fallback_model_name}),(0,A.jsx)(`span`,{className:`ml-3`,children:tn(e.fallback_ready)})]}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})]}),e.candidates.length>1&&(0,A.jsxs)(`div`,{className:`md:col-span-2 text-mute text-[11px] tracking-wider pt-1`,children:[e.candidates.length-1,` other route`,e.candidates.length-1==1?``:`s`,` share this match_model (lower priority or disabled):`,` `,e.candidates.filter(e=>e.id!==t.id).map(e=>e.name).join(`, `)]}),e.primary_ready===!1&&e.fallback_ready!==!0&&(0,A.jsx)(`div`,{className:`md:col-span-2 text-err text-[11px] tracking-wider pt-1`,children:`neither primary nor fallback has a ready deployment — a request would 503.`})]})}function rn({profiles:e,routes:t,hasProfiles:n,form:r,setForm:i,routeError:a,createRoute:o,deleteRoute:s,dryRunModel:c,setDryRunModel:l,dryRunResult:u,setDryRunResult:d,dryRun:f}){return(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`routes`}),(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`public model name → profile · lower priority wins`})]}),n?(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-4`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-12 gap-3`,children:[(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`name`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat-default`,value:r.name,onChange:e=>i(t=>({...t,name:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.profile_name,onChange:e=>i(t=>({...t,profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`choose…`}),e.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`fallback (optional)`}),(0,A.jsxs)(`select`,{className:`field font-mono w-full text-[12px]`,value:r.fallback_profile_name,onChange:e=>i(t=>({...t,fallback_profile_name:e.target.value})),children:[(0,A.jsx)(`option`,{value:``,children:`none`}),e.filter(e=>e.name!==r.profile_name).map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.id))]})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-6 md:col-span-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`match model (exact)`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`chat`,value:r.match_model,onChange:e=>i(t=>({...t,match_model:e.target.value}))})]}),(0,A.jsxs)(`div`,{className:`space-y-1 col-span-12 md:col-span-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`pri`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px] tnum text-right`,value:r.priority,onChange:e=>i(t=>({...t,priority:e.target.value}))})]})]}),a&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:a}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!r.name.trim()||!r.match_model.trim()||!r.profile_name||o.isPending,onClick:()=>o.mutate(),children:o.isPending?`creating…`:`create route`}),(0,A.jsxs)(`span`,{className:`label`,children:[`callable as `,(0,A.jsxs)(`span`,{className:`text-dim`,children:[`model: `,r.match_model||``]})]})]})]}):(0,A.jsx)(`div`,{className:`border border-rule bg-elev/40 px-5 py-12 text-center text-mute text-[12px]`,children:`create a profile above first — routes point at profiles.`}),n&&t.length>0&&(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule px-5 py-4 space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`div`,{className:`label whitespace-nowrap`,children:`dry-run`}),(0,A.jsx)(`input`,{className:`field font-mono w-full text-[12px]`,placeholder:`model name to test (e.g. chat)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c.trim()&&f.mutate(c.trim())}}),(0,A.jsx)(`button`,{className:`btn`,disabled:!c.trim()||f.isPending,onClick:()=>f.mutate(c.trim()),children:f.isPending?`testing…`:`test`}),u&&(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors whitespace-nowrap`,onClick:()=>{d(null),l(``)},children:`clear`})]}),u&&(0,A.jsx)(nn,{result:u})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`w-12`,children:`pri`}),(0,A.jsx)(`th`,{children:`name`}),(0,A.jsx)(`th`,{children:`match model`}),(0,A.jsx)(`th`,{children:`profile`}),(0,A.jsx)(`th`,{children:`fallback`}),(0,A.jsx)(`th`,{children:`enabled`}),(0,A.jsx)(`th`,{className:`text-right`,children:`actions`})]})}),(0,A.jsxs)(`tbody`,{children:[t.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:n?`no routes. create one above to expose a public model name.`:`no routes — and no profiles to route at yet.`})}),t.slice().sort((e,t)=>e.priority-t.priority).map(e=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.priority}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`font-mono text-[12px]`,children:e.match_model}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.profile_name}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.fallback_profile_name??`—`}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.enabled?`dot-ready`:`dot-stopped`}`}),(0,A.jsx)(`span`,{className:`text-dim`,children:e.enabled?`on`:`off`})]}),(0,A.jsx)(`td`,{className:`text-right`,children:(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:s.isPending,onClick:()=>{confirm(`delete route ${e.name}?`)&&s.mutate(e.name)},children:`delete`})})]},e.id))]})]})]})}var an={name:``,model_name:``,hf_repo:``,backend:``,gpu_ids:`0`,max_model_len:`8192`,pinned:!1,node_label:``},on={name:``,match_model:``,profile_name:``,fallback_profile_name:``,priority:`100`};function sn({mode:e=`both`}){let t=rt(),n=j({queryKey:N.profiles,queryFn:F.listProfiles}),r=j({queryKey:N.routes,queryFn:F.listRoutes}),i=j({queryKey:N.models,queryFn:F.listModels}),a=j({queryKey:N.backends,queryFn:F.listBackends}),o=j({queryKey:N.nodes,queryFn:F.listNodes}),s=n.data??[],c=r.data??[],l=s.length>0,[u,d]=(0,k.useState)(an),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(``),g=M({mutationFn:()=>{let e=Gt(u.gpu_ids),t=Kt(u.max_model_len);return F.createProfile({name:u.name.trim(),model_name:u.model_name.trim(),hf_repo:u.hf_repo.trim(),backend:u.backend||void 0,gpu_ids:e,max_model_len:t,pinned:u.pinned,node_label:qt(u.node_label)})},onMutate:()=>p(``),onError:e=>p(e.message),onSuccess:()=>{d(an),t.invalidateQueries({queryKey:N.profiles})}}),_=M({mutationFn:e=>F.deployProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>t.invalidateQueries({queryKey:N.deployments})}),v=M({mutationFn:e=>F.deleteProfile(e),onMutate:()=>h(``),onError:e=>h(e.message),onSuccess:()=>{t.invalidateQueries({queryKey:N.profiles}),t.invalidateQueries({queryKey:N.routes})}}),[y,b]=(0,k.useState)(on),[x,ee]=(0,k.useState)(``),S=M({mutationFn:()=>{let e=Number(y.priority);if(!Number.isInteger(e))throw Error(`priority must be an integer`);return F.createRoute({name:y.name.trim(),match_model:y.match_model.trim(),profile_name:y.profile_name,fallback_profile_name:y.fallback_profile_name||null,priority:e})},onMutate:()=>ee(``),onError:e=>ee(e.message),onSuccess:()=>{b(on),t.invalidateQueries({queryKey:N.routes})}}),C=M({mutationFn:e=>F.deleteRoute(e),onSuccess:()=>t.invalidateQueries({queryKey:N.routes})}),[te,ne]=(0,k.useState)(``),[re,w]=(0,k.useState)(null),ie=M({mutationFn:e=>F.dryRunRoute(e),onSuccess:e=>w(e),onError:()=>w(null)}),ae=e===`both`||e===`profiles`,oe=e===`both`||e===`routes`,se=e===`routes`?`routes`:e===`profiles`?`profiles`:`services`,ce=e===`routes`?`${c.length} routes`:e===`profiles`?`${s.length} profiles`:`${s.length} profiles / ${c.length} routes`;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:se}),(0,A.jsx)(`div`,{className:`label`,children:ce})]}),ae&&(0,A.jsx)(en,{profiles:s,models:i.data??[],backends:a.data??[],nodes:o.data?.nodes??[],form:u,setForm:d,formError:f,actionError:m,createProfile:g,deployProfile:_,deleteProfile:v}),oe&&(0,A.jsx)(rn,{profiles:s,routes:c,hasProfiles:l,form:y,setForm:b,routeError:x,createRoute:S,deleteRoute:C,dryRunModel:te,setDryRunModel:ne,dryRunResult:re,setDryRunResult:w,dryRun:ie})]})}function cn(){return(0,A.jsx)(sn,{mode:`routes`})}function ln(){return(0,A.jsx)(sn,{mode:`profiles`})}var un={enabled:!1,preloads_attempted:0,preloads_succeeded:0,preloads_skipped_already_warm:0,preloads_skipped_no_deployment:0,base_prewarms_attempted:0,base_prewarms_succeeded:0,base_prewarms_skipped_no_plan:0};function dn({label:e,value:t,dim:n=!1}){return(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`text-mute text-[11px]`,children:e}),(0,A.jsx)(`div`,{className:`tnum text-lg font-light ${n?`text-dim`:``}`,children:t??0})]})}function fn(){let e=j({queryKey:N.predictorCandidates,queryFn:F.predictorCandidates,refetchInterval:5e3}),t=j({queryKey:N.predictorStats,queryFn:F.predictorStats,refetchInterval:5e3}).data??un,n=e.data??[],r=t.enabled!==!1,i=t.preloads_attempted>0?Math.round(100*(t.preloads_succeeded/t.preloads_attempted)):null,a=t.base_prewarms_attempted>0?Math.round(100*(t.base_prewarms_succeeded/t.base_prewarms_attempted)):null;return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`predictor`}),(0,A.jsx)(`div`,{className:`label`,children:r?(0,A.jsxs)(A.Fragment,{children:[`tick `,t.tick_interval_s,`s / adapter `,t.max_prewarm_per_tick,`/tick / base `,t.max_base_prewarm_per_tick??0,`/tick`]}):`disabled`})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`adapter pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(dn,{label:`attempted`,value:t.preloads_attempted}),(0,A.jsx)(dn,{label:`succeeded`,value:t.preloads_succeeded}),(0,A.jsx)(dn,{label:`success rate`,value:i==null?`-`:`${i}%`,dim:!0}),(0,A.jsx)(dn,{label:`skipped (warm)`,value:t.preloads_skipped_already_warm,dim:!0}),(0,A.jsx)(dn,{label:`skipped (no dep)`,value:t.preloads_skipped_no_deployment,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`base pre-warming`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-5 gap-8 max-w-4xl`,children:[(0,A.jsx)(dn,{label:`attempted`,value:t.base_prewarms_attempted}),(0,A.jsx)(dn,{label:`succeeded`,value:t.base_prewarms_succeeded}),(0,A.jsx)(dn,{label:`success rate`,value:a==null?`-`:`${a}%`,dim:!0}),(0,A.jsx)(dn,{label:`skipped (no plan)`,value:t.base_prewarms_skipped_no_plan,dim:!0}),(0,A.jsx)(dn,{label:`-`,value:`-`,dim:!0})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`current candidates`}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{className:`text-right`,children:`score`}),(0,A.jsx)(`th`,{children:`reason`})]})}),(0,A.jsxs)(`tbody`,{children:[n.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:3,className:`!py-12 text-center text-mute`,children:`no candidates. rules have nothing to suggest right now`})}),n.map((e,t)=>(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`td`,{className:`font-mono`,children:e.adapter_name?`${e.base_name}:${e.adapter_name}`:e.base_name}),(0,A.jsx)(`td`,{className:`text-right tnum`,children:e.score.toFixed(3)}),(0,A.jsx)(`td`,{className:`text-mute text-[11px]`,children:e.reason})]},`${e.base_name}:${e.adapter_name}:${t}`))]})]})]})]})}var pn={reasoning:``,answer:``,error:``,stats:{ttftMs:null,totalMs:null,tokens:0,tps:null},pending:!1};async function mn(e,t,n,r,i){let a=performance.now(),o=null,s=0;try{let c={"Content-Type":`application/json`},l=xt();l&&(c.Authorization=`Bearer ${l}`);let u=await fetch(`/v1/chat/completions`,{method:`POST`,headers:c,signal:r,body:JSON.stringify({model:e,messages:[{role:`user`,content:t}],stream:!0,max_tokens:n})});if(!u.ok){let e=await u.text();i(t=>({...t,error:`${u.status}: ${e.slice(0,500)}`}));return}if(!u.body)return;let d=u.body.getReader(),f=new TextDecoder,p=``;for(;;){let{done:e,value:t}=await d.read();if(e)break;p+=f.decode(t,{stream:!0});let n=p.split(` -`);p=n.pop();for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t).choices?.[0]?.delta??{},n=e.reasoning??e.reasoning_content??``,r=e.content??``;if((n||r)&&o===null){o=performance.now();let e=Math.round(o-a);i(t=>({...t,stats:{...t.stats,ttftMs:e}}))}n&&(s+=1,i(e=>({...e,reasoning:e.reasoning+n}))),r&&(s+=1,i(e=>({...e,answer:e.answer+r})))}catch{}}}}catch(e){if(!(e instanceof DOMException&&e.name===`AbortError`)){let t=e instanceof Error?e.message:String(e);i(e=>({...e,error:`error: ${t}`}))}}finally{let e=performance.now();i(t=>({...t,stats:{...t.stats,totalMs:Math.round(e-a),tokens:s,tps:s&&e>a?Math.round(s/(e-a)*1e4)/10:null}}))}}function hn({value:e,onChange:t,models:n,routes:r}){return(0,A.jsxs)(`select`,{className:`field w-full font-mono`,value:e,onChange:e=>t(e.target.value),children:[(0,A.jsx)(`option`,{value:``,children:`choose model or route`}),r.length>0&&(0,A.jsx)(`optgroup`,{label:`routes`,children:r.map(e=>(0,A.jsxs)(`option`,{value:e.match_model,children:[e.match_model,` → `,e.profile_name]},`r-${e.id}`))}),n.length>0&&(0,A.jsx)(`optgroup`,{label:`models`,children:n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},`m-${e.id}`))})]})}function gn({stats:e}){return e.ttftMs===null&&e.totalMs===null?null:(0,A.jsxs)(`div`,{className:`flex gap-5 text-mute text-[11px] tnum`,children:[e.ttftMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`ttft`}),` `,e.ttftMs,`ms`]}),e.totalMs!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,e.totalMs,`ms`]}),e.tps!==null&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tok/s`}),` `,e.tps]}),e.tokens>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`tokens`}),` `,e.tokens]})]})}function _n({pane:e,showThinking:t,onToggleThinking:n}){return e.error?(0,A.jsx)(`pre`,{className:`text-err text-[12px] whitespace-pre-wrap font-mono border border-err/30 px-3 py-2`,children:e.error}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[e.reasoning&&(0,A.jsxs)(`details`,{open:t,onToggle:e=>n(e.target.open),className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`,style:{width:5,height:5}}),`thinking`,(0,A.jsxs)(`span`,{className:`text-mute tnum`,children:[e.reasoning.length.toLocaleString(),`c`]})]}),(0,A.jsx)(`pre`,{className:`px-4 pb-4 text-[12px] text-dim whitespace-pre-wrap font-mono leading-relaxed`,children:e.reasoning})]}),(e.answer||e.pending&&!e.reasoning)&&(0,A.jsx)(`pre`,{className:`text-[13px] whitespace-pre-wrap font-mono leading-relaxed border-l border-accent pl-4 min-h-[2.5rem]`,children:e.answer||(e.pending?(0,A.jsx)(`span`,{className:`text-mute`,children:`waiting for tokens…`}):``)}),!e.answer&&!e.reasoning&&!e.pending&&(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no output yet`})]})}function vn(){let e=j({queryKey:N.models,queryFn:F.listModels}),t=j({queryKey:N.routes,queryFn:F.listRoutes}),[n,r]=(0,k.useState)(!1),[i,a]=(0,k.useState)({model:``,...pn}),[o,s]=(0,k.useState)({model:``,...pn}),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(4096),[f,p]=(0,k.useState)(!0),[m,h]=(0,k.useState)(!0),g=(0,k.useRef)(null),_=(0,k.useMemo)(()=>e.data??[],[e.data]),v=(0,k.useMemo)(()=>(t.data??[]).filter(e=>e.enabled),[t.data]),y=!!i.model&&!!c.trim(),b=i.pending||o.pending;async function x(){if(!y||n&&!o.model)return;g.current?.abort();let e=new AbortController;g.current=e,a(e=>({...e,...pn,model:e.model,pending:!0})),n&&s(e=>({...e,...pn,model:e.model,pending:!0}));let t=[mn(i.model,c,u,e.signal,a).finally(()=>a(e=>({...e,pending:!1})))];n&&t.push(mn(o.model,c,u,e.signal,s).finally(()=>s(e=>({...e,pending:!1})))),await Promise.allSettled(t)}function ee(){g.current?.abort()}return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`playground`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] tracking-wider`,children:[(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-mute hover:text-dim`:`text-ink`),onClick:()=>r(!1),children:`single`}),(0,A.jsx)(`span`,{className:`text-mute`,children:`/`}),(0,A.jsx)(`button`,{className:`transition-colors `+(n?`text-ink`:`text-mute hover:text-dim`),onClick:()=>r(!0),children:`compare`})]}),(0,A.jsx)(`div`,{className:`label`,children:`openai-compatible`})]})]}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`grid gap-6 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:n?`a`:`model`}),(0,A.jsx)(gn,{stats:i.stats})]}),(0,A.jsx)(hn,{value:i.model,onChange:e=>a(t=>({...t,model:e})),models:_,routes:v})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`b`}),(0,A.jsx)(gn,{stats:o.stats})]}),(0,A.jsx)(hn,{value:o.model,onChange:e=>s(t=>({...t,model:e})),models:_,routes:v})]})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px] gap-4`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`prompt`}),(0,A.jsx)(`textarea`,{className:`field w-full font-mono text-[13px]`,style:{minHeight:`8rem`},placeholder:`ask something`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&!b&&x()}})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`max tokens`}),(0,A.jsx)(`input`,{type:`number`,className:`field w-full font-mono tnum`,value:u,min:32,max:32768,step:256,onChange:e=>d(Number(e.target.value)||4096)})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!y||n&&!o.model||b,onClick:x,children:b?`streaming…`:n?`send both`:`send`}),b&&(0,A.jsx)(`button`,{className:`btn`,onClick:ee,children:`stop`}),(0,A.jsx)(`span`,{className:`label`,children:`Ctrl+Enter`})]}),(0,A.jsxs)(`div`,{className:`grid gap-8 `+(n?`grid-cols-1 md:grid-cols-2`:`grid-cols-1`),children:[(0,A.jsxs)(`div`,{className:`space-y-3`,children:[n&&(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`a — `,i.model||`—`]}),i.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(_n,{pane:i,showThinking:f,onToggleThinking:p})]}),n&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`label flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{children:[`b — `,o.model||`—`]}),o.pending&&(0,A.jsx)(`span`,{className:`text-accent tracking-wider`,children:`streaming`})]}),(0,A.jsx)(_n,{pane:o,showThinking:m,onToggleThinking:h})]})]})]})]})}function yn(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}function bn({values:e,width:t=80,height:n=18,color:r=`currentColor`}){if(e.length===0||e.every(e=>e===0))return(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:`no traffic`});let i=Math.max(...e,1),a=t/e.length;return(0,A.jsx)(`svg`,{width:t,height:n,className:`overflow-visible align-middle`,children:e.map((e,t)=>{let o=i?e/i*n:0;return(0,A.jsx)(`rect`,{x:t*a,y:n-o,width:Math.max(a-1,1),height:Math.max(o,1),fill:r,opacity:e===0?.15:1},t)})})}function xn({values:e,height:t=56,accent:n=!1}){if(e.length===0)return null;let r=Math.max(...e,1),i=100/e.length;return(0,A.jsx)(`svg`,{viewBox:`0 0 100 ${t}`,preserveAspectRatio:`none`,width:`100%`,height:t,className:n?`text-accent`:`text-dim`,children:e.map((e,n)=>{let a=r?e/r*t:0;return(0,A.jsx)(`rect`,{x:n*i,y:t-a,width:Math.max(i-.3,.3),height:Math.max(a,.5),fill:`currentColor`,opacity:e===0?.15:1},n)})})}function Sn({keyId:e}){let t=j({queryKey:N.keyUsage(e,`detail`),queryFn:()=>F.keyUsage(e,86400,3600),staleTime:3e4});if(t.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(t.error||!t.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:t.error?.message??`no data`});let n=t.data.buckets,r=n.map(e=>e.requests),i=n.map(e=>e.tokens_in+e.tokens_out),a=r.reduce((e,t)=>e+t,0),o=i.reduce((e,t)=>e+t,0);return(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`requests · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[a.toLocaleString(),` total`]})]}),(0,A.jsx)(xn,{values:r,accent:!0}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`tokens (in+out) · 24h`}),(0,A.jsxs)(`div`,{className:`text-mute text-[11px] tnum`,children:[yn(o),` total`]})]}),(0,A.jsx)(xn,{values:i}),(0,A.jsxs)(`div`,{className:`flex justify-between text-mute text-[10px] tracking-wider`,children:[(0,A.jsx)(`span`,{children:`24h ago`}),(0,A.jsx)(`span`,{children:`now`})]})]})]})}function Cn(){let e=rt(),t=j({queryKey:N.keys,queryFn:F.listKeys}),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(`standard`),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f,p]=(0,k.useState)(null),m=M({mutationFn:()=>F.createKey({name:n,tier:i}),onSuccess:t=>{s(t.secret),l(!1),r(``),e.invalidateQueries({queryKey:N.keys})}}),h=M({mutationFn:e=>F.revokeKey(e),onSuccess:()=>e.invalidateQueries({queryKey:N.keys})});async function g(){if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),1600)}catch{}}let _=t.data??[],v=_.filter(e=>!e.revoked).length,y=_.length-v,b=u?_:_.filter(e=>!e.revoked),x=_t({queries:b.filter(e=>!e.revoked).map(e=>({queryKey:N.keyUsage(e.id,`spark`),queryFn:()=>F.keyUsage(e.id,86400,3600),staleTime:6e4,refetchInterval:6e4}))}),ee=new Map;return b.filter(e=>!e.revoked).forEach((e,t)=>{let n=x[t]?.data;n&&ee.set(e.id,n)}),(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`api keys`}),(0,A.jsxs)(`div`,{className:`label`,children:[v,` active`]})]}),(0,A.jsxs)(`section`,{className:`space-y-5`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issue a key`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-[1fr_180px_auto] gap-3 max-w-3xl`,children:[(0,A.jsx)(`input`,{className:`field font-mono`,placeholder:`label (e.g. alice / web / cron)`,value:n,onChange:e=>r(e.target.value)}),(0,A.jsxs)(`select`,{className:`field font-mono`,value:i,onChange:e=>a(e.target.value),children:[(0,A.jsx)(`option`,{value:`admin`,children:`admin`}),(0,A.jsx)(`option`,{value:`standard`,children:`standard`}),(0,A.jsx)(`option`,{value:`trial`,children:`trial`})]}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(),children:m.isPending?`issuing...`:`issue`})]}),o&&(0,A.jsxs)(`div`,{className:`border border-accent/40 bg-[var(--accent-soft)] px-4 py-3 max-w-3xl`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsx)(`div`,{className:`label text-accent`,children:`save this; it won't be shown again`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,A.jsx)(`button`,{onClick:g,className:`text-accent text-[11px] tracking-wider hover:opacity-70 transition-opacity`,children:c?`copied ✓`:`copy`}),(0,A.jsx)(`button`,{onClick:()=>s(null),className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,"aria-label":`dismiss`,children:`dismiss`})]})]}),(0,A.jsx)(`code`,{className:`font-mono text-[13px] break-all select-all`,children:o})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`issued keys`}),y>0&&(0,A.jsxs)(`label`,{className:`text-mute text-[11px] tracking-wider select-none cursor-pointer hover:text-dim transition-colors`,children:[(0,A.jsx)(`input`,{type:`checkbox`,className:`mr-2 accent-accent align-middle`,checked:u,onChange:e=>d(e.target.checked)}),`show revoked `,!u&&(0,A.jsxs)(`span`,{className:`text-accent`,children:[`(`,y,`)`]})]})]}),(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`#`}),(0,A.jsx)(`th`,{children:`label`}),(0,A.jsx)(`th`,{children:`tier`}),(0,A.jsx)(`th`,{children:`prefix`}),(0,A.jsx)(`th`,{children:`status`}),(0,A.jsx)(`th`,{children:`24h activity`}),(0,A.jsx)(`th`,{className:`text-right`})]})}),(0,A.jsxs)(`tbody`,{children:[b.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!py-12 text-center text-mute`,children:_.length===0?`no keys yet`:`no active keys`})}),b.map(e=>{let t=ee.get(e.id)?.buckets.map(e=>e.requests)??[],n=t.reduce((e,t)=>e+t,0),r=f===e.id;return(0,A.jsxs)(k.Fragment,{children:[(0,A.jsxs)(`tr`,{className:e.revoked?``:`cursor-pointer`,onClick:()=>!e.revoked&&p(r?null:e.id),children:[(0,A.jsx)(`td`,{className:`text-mute tnum`,children:e.id}),(0,A.jsx)(`td`,{children:e.name}),(0,A.jsx)(`td`,{className:`text-dim`,children:e.tier}),(0,A.jsx)(`td`,{className:`text-mute`,children:e.prefix}),(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${e.revoked?`dot-failed`:`dot-ready`}`}),(0,A.jsx)(`span`,{className:e.revoked?`text-err`:`text-dim`,children:e.revoked?`revoked`:`active`})]}),(0,A.jsx)(`td`,{children:e.revoked?(0,A.jsx)(`span`,{className:`text-mute text-[10px]`,children:`—`}):(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`span`,{className:`text-accent`,children:(0,A.jsx)(bn,{values:t})}),n>0&&(0,A.jsxs)(`span`,{className:`text-mute text-[10px] tnum`,children:[n.toLocaleString(),` req`]})]})}),(0,A.jsx)(`td`,{className:`text-right`,children:!e.revoked&&(0,A.jsx)(`button`,{className:`btn-link-danger disabled:opacity-40`,disabled:h.isPending&&h.variables===e.id,onClick:t=>{t.stopPropagation(),confirm(`revoke key "${e.name}" (#${e.id})? this cannot be undone.`)&&h.mutate(e.id)},children:h.isPending&&h.variables===e.id?`revoking…`:`revoke`})})]}),r&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:7,className:`!pt-2 !pb-6`,children:(0,A.jsx)(`div`,{className:`bg-elev/40 border border-rule p-5`,children:(0,A.jsx)(Sn,{keyId:e.id})})})})]},e.id)})]})]})]})]})}function wn(e,t){let n=!1,r=null;return wt(e).then(e=>{if(!n){r=new EventSource(e),t.onMessage&&(r.onmessage=t.onMessage),t.onError&&(r.onerror=e=>t.onError?.(e,r));for(let[e,n]of Object.entries(t.listeners??{}))r.addEventListener(e,n)}}).catch(e=>{n||t.onOpenError?.(e instanceof Error?e:Error(String(e)))}),()=>{n=!0,r?.close()}}function Tn(){let e=j({queryKey:N.deployments,queryFn:F.listDeployments,refetchInterval:5e3}),t=j({queryKey:N.models,queryFn:F.listModels}),[n,r]=(0,k.useState)(null),[i,a]=(0,k.useState)([]),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)([]),f=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>{if(n!==null)return;let t=e.data??[],i=t.find(e=>e.status===`ready`||e.status===`loading`);if(i){r(i.id);return}let a=[...t].sort((e,t)=>t.id-e.id);a.length>0&&r(a[0].id)},[e.data,n]),(0,k.useEffect)(()=>{if(n===null)return;a([]),l(``),s(!0);let e=wn(`/admin/deployments/${n}/logs/stream`,{onMessage:e=>{a(t=>{let n=[...t,e.data];return n.length>2e3?n.slice(-2e3):n})},onError:(e,t)=>{s(!1),l(`stream closed (container stopped or auth failed)`),t.close()},onOpenError:e=>{s(!1),l(e.message)}});return()=>{s(!1),e()}},[n]),(0,k.useEffect)(()=>wn(`/admin/events`,{onMessage:e=>{try{let t=JSON.parse(e.data);d(e=>[t,...e].slice(0,50))}catch{}},onError:(e,t)=>t.close()}),[]),(0,k.useEffect)(()=>{!f.current||!p.current||(f.current.scrollTop=f.current.scrollHeight)},[i]);function m(e){let t=e.currentTarget;p.current=t.scrollHeight-t.scrollTop-t.clientHeight<60}let h=(e.data??[]).filter(e=>e.container_id!==null&&e.container_id!==void 0).sort((e,t)=>{let n=e.status===`ready`||e.status===`loading`?0:1,r=t.status===`ready`||t.status===`loading`?0:1;return n===r?t.id-e.id:n-r}),g=h.find(e=>e.id===n);return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`logs`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[o&&(0,A.jsxs)(`span`,{className:`flex items-center text-[11px] tracking-wider text-accent`,children:[(0,A.jsx)(`span`,{className:`dot dot-loading`}),`live`]}),c&&(0,A.jsx)(`span`,{className:`text-err text-[11px] tracking-wider`,children:c})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`container`}),(0,A.jsxs)(`select`,{className:`field font-mono text-[13px] min-w-[420px]`,value:n??``,onChange:e=>{r(e.target.value?Number(e.target.value):null)},children:[(0,A.jsx)(`option`,{value:``,children:`select deployment`}),h.map(e=>{let n=(t.data??[]).find(t=>t.id===e.model_id),r=e.status===`ready`||e.status===`loading`?`●`:`·`;return(0,A.jsxs)(`option`,{value:e.id,children:[r,` #`,e.id,` · `,n?.name??`model ${e.model_id}`,` · `,e.status]},e.id)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`stdout`}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider tnum`,children:[i.length,` lines`]})]}),(0,A.jsxs)(`div`,{ref:f,onScroll:m,className:`border border-rule font-mono text-[11.5px] leading-relaxed text-ink/80 overflow-y-auto h-[32rem] p-4 bg-[#08080a]`,children:[n===null&&(0,A.jsx)(`div`,{className:`text-mute`,children:`select a deployment above to tail its container logs`}),n!==null&&i.length===0&&o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`waiting for output`,(0,A.jsx)(`span`,{className:`caret`})]}),n!==null&&i.length===0&&!o&&(0,A.jsxs)(`div`,{className:`text-mute`,children:[`no log output. the container for #`,n,g?` (${g.status})`:``,` may have been removed.`]}),i.map((e,t)=>(0,A.jsx)(`div`,{className:`whitespace-pre-wrap break-all `+(e.startsWith(`[berth]`)?`text-accent/70`:``),children:e},t))]})]}),(0,A.jsxs)(`details`,{className:`border border-rule`,children:[(0,A.jsxs)(`summary`,{className:`cursor-pointer px-4 py-3 text-dim text-[11px] tracking-wider hover:text-ink transition-colors select-none flex items-center justify-between`,children:[(0,A.jsx)(`span`,{children:`lifecycle events`}),(0,A.jsx)(`span`,{className:`text-mute tnum`,children:u.length})]}),(0,A.jsxs)(`div`,{className:`px-4 pb-4 text-[11px] font-mono space-y-1 max-h-64 overflow-y-auto`,children:[u.length===0&&(0,A.jsx)(`div`,{className:`text-mute`,children:`no events yet`}),u.map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-3`,children:[(0,A.jsx)(`span`,{className:`text-mute tnum w-16 shrink-0`,children:e.ts.slice(11,19)}),(0,A.jsx)(`span`,{className:`text-accent shrink-0`,children:e.kind}),(0,A.jsx)(`span`,{className:`text-dim break-all`,children:JSON.stringify(e.payload)})]},t))]})]})]})}function En(e){let t=e*1e3;return t<1?`0ms`:t<10?`${t.toFixed(1)}ms`:t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`}function Dn(e){return e.completed_at===null?0:e.completed_at-e.arrived_at}function On(e){return e.completed_at===null?`inflight`:e.error||e.status_code!==null&&e.status_code>=400?`err`:`ok`}function kn(e){switch(On(e)){case`inflight`:return`dot-loading`;case`err`:return`dot-failed`;default:return`dot-ready`}}function An({t:e}){let t=e.arrived_at,n=e.completed_at??Math.max(e.first_byte_at??0,e.dispatched_at??0,e.route_resolved_at??0,e.arrived_at),r=Math.max(n-t,1e-6),i=[];return e.route_resolved_at!==null&&i.push({label:`route`,from:t,to:e.route_resolved_at,color:`var(--ink-mute)`}),e.route_resolved_at!==null&&e.dispatched_at!==null&&i.push({label:`placement`,from:e.route_resolved_at,to:e.dispatched_at,color:`var(--ink-dim)`}),e.dispatched_at!==null&&e.first_byte_at!==null&&i.push({label:`ttft`,from:e.dispatched_at,to:e.first_byte_at,color:`var(--accent-dim)`}),e.first_byte_at!==null&&e.completed_at!==null&&i.push({label:`stream`,from:e.first_byte_at,to:e.completed_at,color:`var(--accent)`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsx)(`div`,{className:`relative h-3 bg-rule-soft`,children:i.map((e,n)=>{let i=(e.from-t)/r*100,a=Math.max((e.to-e.from)/r*100,.5);return(0,A.jsx)(`div`,{className:`absolute inset-y-0`,style:{left:`${i}%`,width:`${a}%`,background:e.color},title:`${e.label}: ${En(e.to-e.from)}`},n)})}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-1 text-[11px] text-mute tracking-wider`,children:[i.map((e,t)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:e.label}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:En(e.to-e.from)})]},t)),(0,A.jsxs)(`span`,{className:`ml-auto`,children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`total`}),` `,(0,A.jsx)(`span`,{className:`tnum`,children:En(r)})]})]})]})}function jn({t:e,isOpen:t,onToggle:n}){return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`tr`,{className:`cursor-pointer`,onClick:n,children:[(0,A.jsxs)(`td`,{children:[(0,A.jsx)(`span`,{className:`dot ${kn(e)}`}),(0,A.jsx)(`span`,{className:`text-dim font-mono text-[11px]`,children:e.request_id})]}),(0,A.jsx)(`td`,{className:`text-dim text-[11px]`,children:e.method}),(0,A.jsx)(`td`,{className:`font-mono text-[12px] truncate max-w-[16ch]`,children:e.model_requested??`—`}),(0,A.jsx)(`td`,{className:`text-dim text-[12px]`,children:e.route_name?(0,A.jsxs)(`span`,{children:[e.route_name,(0,A.jsx)(`span`,{className:`text-mute`,children:` → `}),(0,A.jsx)(`span`,{className:`font-mono`,children:e.target_model})]}):e.target_model??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})}),(0,A.jsx)(`td`,{className:`text-mute text-[12px]`,children:e.backend??`—`}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px]`,children:e.completed_at===null?(0,A.jsx)(`span`,{className:`text-accent`,children:`streaming…`}):En(Dn(e))}),(0,A.jsx)(`td`,{className:`text-right tnum text-[12px] text-dim`,children:e.tokens_out>0?`${e.tokens_out}`:`—`}),(0,A.jsx)(`td`,{className:`text-right text-[12px]`,children:e.error?(0,A.jsx)(`span`,{className:`text-err`,children:e.status_code??`err`}):e.status_code===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsx)(`span`,{className:e.status_code>=400?`text-err`:`text-ok`,children:e.status_code})})]}),t&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!pt-2 !pb-6`,children:(0,A.jsxs)(`div`,{className:`bg-elev/40 border border-rule p-5 space-y-5`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-2 text-[12px]`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`request`}),(0,A.jsxs)(`div`,{className:`font-mono`,children:[e.method,` `,e.path]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`api key`}),(0,A.jsx)(`div`,{children:e.api_key_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`none`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`deployment`}),(0,A.jsx)(`div`,{children:e.deployment_id===null?(0,A.jsx)(`span`,{className:`text-mute`,children:`—`}):(0,A.jsxs)(A.Fragment,{children:[`#`,e.deployment_id,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`(`,e.backend,`)`]})]})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`route`}),(0,A.jsx)(`div`,{children:e.route_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`direct`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`profile`}),(0,A.jsx)(`div`,{children:e.profile_name??(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cold load`}),(0,A.jsx)(`div`,{children:e.cold_loaded?(0,A.jsx)(`span`,{className:`text-accent`,children:`yes`}):(0,A.jsx)(`span`,{className:`text-mute`,children:`no`})})]})]}),(0,A.jsx)(An,{t:e}),e.error&&(0,A.jsx)(`div`,{className:`text-err text-[12px] font-mono whitespace-pre-wrap border-l border-err/40 pl-3`,children:e.error})]})})})]})}function Mn(){let e=j({queryKey:N.requestsSeed,queryFn:F.listRequests}),[t,n]=(0,k.useState)(new Map),[r,i]=(0,k.useState)(null),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1);(0,k.useEffect)(()=>{!e.data||s.current||(s.current=!0,n(t=>{let n=new Map(t);for(let t of e.data)n.set(t.request_id,t);return n}))},[e.data]),(0,k.useEffect)(()=>{if(a)return;let e=e=>{try{let t=JSON.parse(e.data);Array.isArray(t)?n(()=>{let e=new Map;for(let n of t)e.set(n.request_id,n);return e}):t&&typeof t==`object`&&`request_id`in t&&n(e=>{let n=t,r=new Map(e);if(r.set(n.request_id,n),r.size>256){let e=Array.from(r.keys()).slice(0,r.size-256);for(let t of e)r.delete(t)}return r})}catch{}};return wn(`/admin/requests/stream`,{listeners:{snapshot:e,started:e,updated:e,completed:e},onOpenError:e=>console.error(`requests stream open failed`,e)})},[a]);let c=Array.from(t.values()).sort((e,t)=>t.arrived_at-e.arrived_at),l=c.filter(e=>e.completed_at===null).length,u=c.filter(e=>On(e)===`err`).length;return(0,A.jsxs)(`div`,{className:`space-y-10`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`requests`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-6`,children:[(0,A.jsx)(`button`,{className:`text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>o(e=>!e),children:(0,A.jsx)(`span`,{className:a?`text-accent`:`text-mute`,children:a?`▶ resume`:`❚❚ pause`})}),(0,A.jsx)(`button`,{className:`text-mute text-[11px] tracking-wider hover:text-dim transition-colors`,onClick:()=>{n(new Map),i(null)},children:`clear`}),(0,A.jsxs)(`div`,{className:`label`,children:[c.length,` traced · `,l,` in flight`,u>0?` · ${u} errored`:``]})]})]}),(0,A.jsx)(`section`,{className:`space-y-4`,children:(0,A.jsxs)(`table`,{className:`ditable`,children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{children:`id`}),(0,A.jsx)(`th`,{children:`method`}),(0,A.jsx)(`th`,{children:`model`}),(0,A.jsx)(`th`,{children:`route → target`}),(0,A.jsx)(`th`,{children:`backend`}),(0,A.jsx)(`th`,{className:`text-right`,children:`total`}),(0,A.jsx)(`th`,{className:`text-right`,children:`out tok`}),(0,A.jsx)(`th`,{className:`text-right`,children:`status`})]})}),(0,A.jsxs)(`tbody`,{children:[c.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:8,className:`!py-12 text-center text-mute`,children:`no traffic yet. send a request to /v1/chat/completions to see it appear.`})}),c.map(e=>(0,A.jsx)(jn,{t:e,isOpen:r===e.request_id,onToggle:()=>i(r===e.request_id?null:e.request_id)},e.request_id))]})]})})]})}function Nn({label:e,value:t,hint:n}){return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`text-2xl font-light tnum tracking-tightish text-ink`,children:t}),n&&(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:n})]})}function Pn({onMinted:e}){let t=rt(),[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(null),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(null),[f,p]=(0,k.useState)(Date.now());(0,k.useEffect)(()=>{if(!u)return;let e=window.setInterval(()=>p(Date.now()),1e3);return()=>window.clearInterval(e)},[u]);let m=M({mutationFn:e=>F.enrollNode(e),onMutate:()=>{a(``),s(null)},onError:e=>a(e.message),onSuccess:n=>{s(n),d(Date.now()+600*1e3),t.invalidateQueries({queryKey:N.nodes}),e()}}),h=o?Tt(o):``,g=o?`berth agent register --uri '${h}'`:``,_=u?Math.max(0,u-f):0,v=_>0?`${Math.floor(_/6e4)}m ${Math.floor(_%6e4/1e3).toString().padStart(2,`0`)}s`:`expired`;function y(e,t){navigator.clipboard.writeText(e),l(t),setTimeout(()=>l(null),1500)}return(0,A.jsxs)(`div`,{className:`border border-rule p-6 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`enroll new node`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-1`,children:`mint a single-use uri that pins the cluster ca to its fingerprint`})]}),o&&(0,A.jsxs)(`span`,{className:`text-[10px] tracking-wider `+(_>6e4?`text-mute`:`text-warn`),children:[`expires in `,v]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,A.jsx)(`input`,{className:`field flex-1 font-mono`,placeholder:`label (e.g. gpu-rig-2)`,value:n,onChange:e=>r(e.target.value.toLowerCase().replace(/\s+/g,`-`)),onKeyDown:e=>{e.key===`Enter`&&n.trim()&&m.mutate(n.trim())}}),(0,A.jsx)(`button`,{className:`btn-primary`,disabled:!n.trim()||m.isPending,onClick:()=>m.mutate(n.trim()),children:m.isPending?`minting…`:`mint uri`})]}),i&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:i}),o&&(0,A.jsxs)(`div`,{className:`space-y-5 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment uri`}),(0,A.jsx)(`button`,{onClick:()=>y(h,`uri`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`uri`?`copied`:`copy`})]}),(0,A.jsx)(`pre`,{className:`text-[11px] bg-bg border border-rule px-3 py-3 text-dim overflow-x-auto break-all whitespace-pre-wrap leading-relaxed`,children:h})]}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`on the agent host`}),(0,A.jsx)(`button`,{onClick:()=>y(g,`cmd`),className:`text-mute hover:text-accent text-[10px] tracking-wider transition-colors`,children:c===`cmd`?`copied`:`copy`})]}),(0,A.jsxs)(`pre`,{className:`text-[12px] bg-bg border border-rule px-3 py-3 text-ink overflow-x-auto break-all whitespace-pre-wrap`,children:[(0,A.jsx)(`span`,{className:`text-mute select-none`,children:`$ `}),g]}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`the agent fetches the ca, verifies its sha256 against the pin in the uri, then registers. re-run `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth agent start`}),` after.`]})]})]})]})}function Fn(e){return!e||e<=0?`-`:e>=1024?`${(e/1024).toFixed(1)} GB`:`${e} MB`}function In(e){if(!e)return`—`;let t=Math.max(0,Date.now()/1e3-e);return t<5?`just now`:t<60?`${Math.round(t)}s ago`:t<3600?`${Math.round(t/60)}m ago`:t<86400?`${Math.round(t/3600)}h ago`:`${Math.round(t/86400)}d ago`}function Ln(e){return e===`ready`?`text-ok`:e===`unreachable`?`text-warn`:e===`gone`||e===`failed`?`text-err`:`text-mute`}function Rn(e){return e===`ready`?`dot-ready`:e===`unreachable`?`dot-stopping`:e===`gone`||e===`failed`?`dot-failed`:`dot-stopped`}function zn({node:e,selected:t,onSelect:n,liveMetrics:r}){let i=e.label===`local`;return(0,A.jsxs)(`button`,{onClick:n,className:`group text-left p-5 border transition-all duration-200 `+(t?`border-accent bg-elev`:`border-rule hover:border-ink-mute hover:bg-elev/40`),children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between mb-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[(0,A.jsx)(`span`,{className:`dot ${Rn(e.status)}`}),(0,A.jsx)(`span`,{className:`text-ink text-[13px]`,children:e.label}),i&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Ln(e.status)}`,children:e.status})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`gpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-ink`,children:[e.gpu_count,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Fn(e.total_vram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`cpus`}),(0,A.jsxs)(`div`,{className:`text-right tnum text-dim`,children:[e.cpu_count||`-`,` `,(0,A.jsxs)(`span`,{className:`text-mute`,children:[`/ `,Fn(e.total_ram_mb)]})]}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`agent`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:e.agent_version??`—`}),(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`heartbeat`}),(0,A.jsx)(`div`,{className:`text-right text-dim`,children:In(e.last_seen)})]}),r&&(0,A.jsxs)(`div`,{className:`mt-4 pt-3 border-t border-rule/40 space-y-1.5 text-[10px]`,children:[Object.entries(r.series.gpu_util_pct).map(([e,t])=>(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`span`,{className:`text-mute tracking-wider`,children:[e,` util`]}),(0,A.jsx)(Pt,{values:t})]},e)),(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`text-mute tracking-wider`,children:`req/s`}),(0,A.jsx)(Pt,{values:r.series.request_rate})]})]})]})}function Bn({fp:e,copyable:t=!0}){let[n,r]=(0,k.useState)(!1),i=e.replace(/^sha256:/,``),a=[];for(let e=0;e{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),1200)},children:n?`copied`:`copy`})]})}function Vn({gpu:e,totalInNode:t}){let n=t>0?e.total_vram_mb/t*100:0;return(0,A.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-dim`,children:[(0,A.jsxs)(`span`,{className:`text-mute mr-2`,children:[`[`,e.gpu_index,`]`]}),e.name]}),(0,A.jsx)(`div`,{className:`tnum text-[11px] text-dim`,children:Fn(e.total_vram_mb)})]}),(0,A.jsx)(`div`,{className:`h-px bg-rule relative overflow-hidden`,children:(0,A.jsx)(`div`,{className:`absolute inset-y-0 left-0 bg-accent/70`,style:{width:`${n}%`}})}),e.driver_version&&(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:[`driver `,e.driver_version]})]})}function Hn({node:e,deployments:t,models:n,onRemove:r}){let i=j({queryKey:N.node(e.id),queryFn:()=>F.getNode(e.id),refetchInterval:5e3}),a=i.data?.gpus??[],o=a.reduce((e,t)=>e+t.total_vram_mb,0),s=e.label===`local`,c=t.filter(t=>(t.node_id===e.id||s&&(!t.node_id||t.node_id===0))&&t.status!==`stopped`);return(0,A.jsxs)(`aside`,{className:`border border-rule bg-elev/30`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between px-6 py-4 border-b border-rule`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsx)(`span`,{className:`dot ${Rn(e.status)}`}),(0,A.jsx)(`h3`,{className:`text-lg font-light tracking-tightish`,children:e.label}),(0,A.jsx)(`span`,{className:`text-[10px] tracking-wider ${Ln(e.status)}`,children:e.status}),s&&(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider ml-1`,children:`— this host`})]}),!s&&r&&(0,A.jsx)(`button`,{onClick:r,className:`btn-link-danger text-[11px] tracking-wider`,children:`remove node`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`grid grid-cols-2 gap-6 text-[12px]`,children:[(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cpu / ram`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.cpu_count||`-`,` cpu / `,Fn(e.total_ram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu total`}),(0,A.jsxs)(`div`,{className:`tnum text-dim`,children:[e.gpu_count,` gpu / `,Fn(e.total_vram_mb)]})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`agent version`}),(0,A.jsx)(`div`,{className:`text-dim`,children:e.agent_version??`—`})]}),(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:`label`,children:`last heartbeat`}),(0,A.jsx)(`div`,{className:`text-dim`,children:In(e.last_seen)})]})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cert fingerprint`}),s?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`local node — no agent certificate (control runs in-process)`}):(0,A.jsx)(Bn,{fp:e.fingerprint})]})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-6`,children:[(0,A.jsxs)(`section`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`gpu inventory`}),a.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:i.isLoading?`loading…`:`no gpus reported`}):(0,A.jsx)(`div`,{className:`space-y-4`,children:a.map(e=>(0,A.jsx)(Vn,{gpu:e,totalInNode:o},e.gpu_index))})]}),(0,A.jsxs)(`section`,{className:`space-y-3 pt-2 border-t border-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`deployments on this node · `,c.length]}),c.length===0?(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`no active deployments`}):(0,A.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>{let t=n.find(t=>t.id===e.model_id);return(0,A.jsxs)(`div`,{className:`flex items-center gap-3 text-[12px]`,title:e.last_error||void 0,children:[(0,A.jsx)(`span`,{className:`dot dot-${e.status}`}),(0,A.jsx)(`span`,{className:`text-ink truncate`,children:t?.name??`#${e.id}`}),(0,A.jsx)(`span`,{className:`text-mute text-[10px] tracking-wider`,children:e.backend}),(0,A.jsxs)(`span`,{className:`text-dim tnum ml-auto`,children:[`gpu `,(e.gpu_ids??[]).join(`,`)||`-`]})]},e.id)})})]})]})]})]})}function Un({nodes:e}){let t=e.find(e=>e.label===`local`),n=e.filter(e=>e.label!==`local`),r=Math.max(n.length,1),i=Math.min(220,120+n.length*24);return(0,A.jsxs)(`svg`,{viewBox:`0 0 720 280`,preserveAspectRatio:`xMidYMid meet`,className:`w-full h-[280px] select-none`,"aria-hidden":!0,children:[[.35,.65,1].map((e,t)=>(0,A.jsx)(`circle`,{cx:360,cy:140,r:i*e,fill:`none`,stroke:`var(--rule-soft)`,strokeWidth:1,strokeDasharray:t===2?`2 6`:void 0},t)),Array.from({length:6},(e,t)=>{let n=t/6*2*Math.PI;return(0,A.jsx)(`line`,{x1:360,y1:140,x2:360+Math.cos(n)*i,y2:140+Math.sin(n)*i,stroke:`var(--rule-soft)`,strokeWidth:.5},t)}),n.map((e,t)=>{let n=t/r*2*Math.PI-Math.PI/2,a=360+Math.cos(n)*i,o=140+Math.sin(n)*i,s=e.status===`ready`,c=e.status===`unreachable`,l=s?`var(--accent)`:c?`var(--warn)`:`var(--ink-mute)`;return(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`line`,{x1:360,y1:140,x2:a,y2:o,stroke:l,strokeWidth:s?1.25:1,strokeDasharray:s?void 0:`4 4`,opacity:s?.7:.4}),s&&(0,A.jsx)(`circle`,{r:2.5,fill:l,children:(0,A.jsx)(`animateMotion`,{dur:`2.8s`,repeatCount:`indefinite`,path:`M 360 140 L ${a} ${o}`})}),(0,A.jsxs)(`g`,{transform:`translate(${a}, ${o})`,children:[(0,A.jsx)(`circle`,{r:14,fill:`var(--bg-page)`,stroke:l,strokeWidth:1.25}),(0,A.jsx)(`circle`,{r:5,fill:l,opacity:s?1:.5}),(0,A.jsx)(`text`,{x:0,y:28,textAnchor:`middle`,fontSize:10,fill:`var(--ink-dim)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:e.label}),(0,A.jsxs)(`text`,{x:0,y:42,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.06em`},children:[e.gpu_count,` gpu / `,Fn(e.total_vram_mb)]})]})]},e.id)}),(0,A.jsxs)(`g`,{children:[(0,A.jsx)(`circle`,{cx:360,cy:140,r:28,fill:`var(--bg-elev)`,stroke:`var(--accent)`,strokeWidth:1.5}),(0,A.jsx)(`circle`,{cx:360,cy:140,r:10,fill:`var(--accent)`}),(0,A.jsx)(`text`,{x:360,y:190,textAnchor:`middle`,fontSize:10,fill:`var(--ink)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.14em`,textTransform:`uppercase`},children:`leader`}),t&&(0,A.jsxs)(`text`,{x:360,y:204,textAnchor:`middle`,fontSize:9,fill:`var(--ink-mute)`,style:{fontFamily:`JetBrains Mono, monospace`,letterSpacing:`0.04em`},children:[t.gpu_count,` gpu / `,Fn(t.total_vram_mb)]})]})]})}function Wn({info:e}){let t=e.leader_server_cert;return(0,A.jsxs)(`section`,{className:`border border-rule`,children:[(0,A.jsxs)(`div`,{className:`px-6 py-4 border-b border-rule flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster transport`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:e.public_tls_configured?`public_tls configured`:`⚠ cluster-ca cert on public listener`})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 divide-x divide-rule-soft`,children:[(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`public listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.public_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.public_bind,` · `,e.public_tls_configured?`operator cert`:`cluster-ca fallback`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/v1/* · /admin/* · bearer auth · external sdk clients`})]}),(0,A.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`label`,children:`cluster listener`}),(0,A.jsx)(`code`,{className:`block text-[12px] text-ink mt-1.5`,children:e.cluster_url}),(0,A.jsxs)(`div`,{className:`text-mute text-[10px] tracking-wider mt-1`,children:[`bind `,e.cluster_bind,` · cluster-ca signed`]})]}),(0,A.jsx)(`div`,{className:`text-[11px] text-mute leading-relaxed`,children:`/cluster/agent · mtls websocket · /admin/nodes/register`})]})]}),(0,A.jsxs)(`div`,{className:`px-6 py-5 border-t border-rule space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`ca fingerprint`}),(0,A.jsx)(Bn,{fp:e.ca_fingerprint}),t.present&&`san`in t&&(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2 pt-3 text-[11px]`,children:[(0,A.jsx)(`div`,{className:`text-mute tracking-wider`,children:`leader server cert`}),(0,A.jsxs)(`div`,{className:`text-dim`,children:[`san\xA0`,(0,A.jsx)(`span`,{className:`text-mute`,children:`[`}),t.san.map((e,n)=>(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`code`,{className:`text-ink`,children:e}),n{let e=e=>e===`ready`?0:e===`unreachable`?1:2;return[...c].sort((t,n)=>t.label===`local`?-1:n.label===`local`?1:e(t.status)-e(n.status))},[c]);(0,k.useEffect)(()=>{o===null&&c.length!==0&&s((c.find(e=>e.label!==`local`)??c[0]).id)},[c,o]);let u=c.find(e=>e.id===o)??null,d=M({mutationFn:e=>F.removeNode(e),onSuccess:()=>{e.invalidateQueries({queryKey:N.nodes}),s(null)}}),f=c.filter(e=>e.status===`ready`).length,p=c.filter(e=>e.label!==`local`).length,m=c.reduce((e,t)=>e+t.gpu_count,0),h=c.reduce((e,t)=>e+t.total_vram_mb,0);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`cluster`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:p===0?`single-node leader. enroll an agent to scale out.`:`${p} agent${p===1?``:`s`} attached · leader at the hub`})]}),(0,A.jsxs)(`div`,{className:`label`,children:[f,`/`,c.length,` ready`]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-2 md:grid-cols-4 gap-12`,children:[(0,A.jsx)(Nn,{label:`nodes`,value:String(c.length),hint:`${f} ready`}),(0,A.jsx)(Nn,{label:`agents`,value:String(p),hint:p>0?`${p} remote`:`no remote agents`}),(0,A.jsx)(Nn,{label:`gpus`,value:String(m),hint:`across the fleet`}),(0,A.jsx)(Nn,{label:`vram`,value:Fn(h),hint:`aggregated`})]}),(0,A.jsx)(`section`,{className:`border border-rule p-4`,children:c.length===0?(0,A.jsx)(`div`,{className:`h-[280px] flex items-center justify-center text-mute text-[11px] tracking-wider`,children:`no nodes yet`}):(0,A.jsx)(Un,{nodes:l})}),r.data&&(0,A.jsx)(Wn,{info:r.data}),(0,A.jsxs)(`section`,{className:`space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`fleet · `,c.length,` node`,c.length===1?``:`s`]}),d.isError&&(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:d.error.message})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:l.map(e=>(0,A.jsx)(zn,{node:e,selected:o===e.id,onSelect:()=>s(e.id),liveMetrics:n.data?.nodes.find(t=>t.node_id===e.id)},e.id))}),l.length>0&&(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider`,children:`click any node to view its certificate and gpu inventory below`})]}),u&&(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-3`,children:[(0,A.jsxs)(`div`,{className:`label`,children:[`selected · `,u.label]}),(0,A.jsx)(`div`,{className:`h-px bg-rule flex-1`})]}),(0,A.jsx)(Hn,{node:u,deployments:i.data??[],models:a.data??[],onRemove:u.label===`local`?void 0:()=>{confirm(`remove node "${u.label}"?\nany live connection is dropped and its cert fingerprint stops authenticating.`)&&d.mutate(u.id)}})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`enrollment`}),(0,A.jsx)(Pn,{onMinted:()=>e.invalidateQueries({queryKey:N.nodes})})]})]})}function Kn(e){return e===`flag`?`text-accent`:e.startsWith(`env`)?`text-warn`:e===`file`?`text-ok`:e===`autodetect`||e.startsWith(`inherit`)?`text-dim`:`text-mute`}function qn(e){return e.startsWith(`inherit:`)?`inherit ${e.slice(8)}`:e.startsWith(`env:`)?e.slice(4):e}var Jn=[{key:`public_host`,label:`host`,group:`public`},{key:`public_port`,label:`port`,group:`public`},{key:`public_bind`,label:`bind`,group:`public`},{key:`cluster_host`,label:`host`,group:`cluster`},{key:`cluster_port`,label:`port`,group:`cluster`},{key:`cluster_bind`,label:`bind`,group:`cluster`},{key:`public_cert_path`,label:`cert`,group:`tls`},{key:`public_key_path`,label:`key`,group:`tls`}];function Yn({title:e,rows:t,values:n,sources:r}){return(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:e}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:t.map((e,i)=>{let a=n[e.key],o=r[e.key]??`default`;return(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px] `+(i{let a=i.filter(([e])=>t[e]===`file`);if(a.length!==0){n.push(`[${r}]`);for(let[t,r]of a){let i=e[t];if(i==null)continue;let a=typeof i==`string`?`"${i}"`:String(i);n.push(`${r} = ${a}`)}n.push(``)}};return r(`public`,[[`public_host`,`host`],[`public_port`,`port`],[`public_bind`,`bind`]]),r(`public_tls`,[[`public_cert_path`,`cert`],[`public_key_path`,`key`]]),r(`cluster`,[[`cluster_host`,`host`],[`cluster_port`,`port`],[`cluster_bind`,`bind`]]),n.join(` -`).trim()||`# config.toml is empty — all values from autodetect/env/default`}function Zn(){let e=j({queryKey:N.config,queryFn:F.getConfig}),t=j({queryKey:N.clusterInfo,queryFn:F.getClusterInfo});if(e.isLoading)return(0,A.jsx)(`div`,{className:`text-mute text-[11px] tracking-wider`,children:`loading…`});if(!e.data)return(0,A.jsx)(`div`,{className:`text-err text-[11px] tracking-wider`,children:`no config`});let{values:n,sources:r,config_file:i,config_file_exists:a}=e.data,o=Jn.filter(e=>e.group===`public`),s=Jn.filter(e=>e.group===`cluster`),c=Jn.filter(e=>e.group===`tls`);return(0,A.jsxs)(`div`,{className:`space-y-14`,children:[(0,A.jsxs)(`header`,{className:`flex items-baseline justify-between`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{className:`text-2xl font-light tracking-tightish caret`,children:`settings`}),(0,A.jsx)(`p`,{className:`text-mute text-[11px] tracking-wider mt-2`,children:`resolved daemon configuration · flag > env > file > autodetect > default`})]}),t.data&&(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`label`,children:`advertised`}),(0,A.jsx)(`code`,{className:`text-[11px] text-dim mt-1 block`,children:t.data.cluster_url})]})]}),(0,A.jsxs)(`section`,{className:`grid grid-cols-1 lg:grid-cols-2 gap-x-10 gap-y-10`,children:[(0,A.jsx)(Yn,{title:`public listener`,rows:o,values:n,sources:r}),(0,A.jsx)(Yn,{title:`cluster listener`,rows:s,values:n,sources:r}),(0,A.jsx)(Yn,{title:`public tls (operator cert)`,rows:c,values:n,sources:r}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsx)(`div`,{className:`label`,children:`overrides`}),(0,A.jsx)(`div`,{className:`border border-rule-soft`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-12 items-center px-4 py-3 text-[12px]`,children:[(0,A.jsx)(`div`,{className:`col-span-3 text-mute tracking-wider`,children:`leader url`}),(0,A.jsx)(`div`,{className:`col-span-6 text-ink`,children:n.leader_url_override?(0,A.jsx)(`code`,{children:n.leader_url_override}):(0,A.jsx)(`span`,{className:`text-mute`,children:`—`})}),(0,A.jsx)(`div`,{className:`col-span-3 text-right text-[10px] tracking-wider `+Kn(r.leader_url??`default`),children:qn(r.leader_url??`default`)})]})})]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,A.jsx)(`div`,{className:`label`,children:`~/.berth/config.toml`}),(0,A.jsx)(`div`,{className:`text-mute text-[10px] tracking-wider`,children:a?i:`${i} · not present`})]}),(0,A.jsx)(`pre`,{className:`bg-bg border border-rule px-4 py-4 text-[12px] text-dim leading-relaxed overflow-x-auto`,children:Xn(n,r)}),(0,A.jsxs)(`p`,{className:`text-mute text-[11px] tracking-wider leading-relaxed`,children:[`edit via cli: `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public host=... port=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-cluster bind=...`}),` ·`,` `,(0,A.jsx)(`code`,{className:`text-dim`,children:`berth config set-public-tls cert=... key=...`}),`.`,` `,`restart the daemon to pick up changes.`]})]}),(0,A.jsxs)(`section`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`label`,children:`legend`}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-x-6 gap-y-2 text-[11px] tracking-wider`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-accent`,children:`flag`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`cli`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-warn`,children:`env`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`environment`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-ok`,children:`file`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`config.toml`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-dim`,children:`autodetect`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`probed`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-mute`,children:`default`}),` `,(0,A.jsx)(`span`,{className:`text-mute`,children:`fallback`})]})]})]})]})}var Qn=[{id:`overview`,label:`overview`,tabs:[{id:`overview`,label:`overview`,component:Ht}]},{id:`serving`,label:`serving`,tabs:[{id:`deployments`,label:`deployments`,component:Wt},{id:`models`,label:`models`,component:Qt},{id:`adapters`,label:`adapters`,component:$t},{id:`routes`,label:`routes`,component:cn},{id:`profiles`,label:`profiles`,component:ln}]},{id:`observe`,label:`observe`,tabs:[{id:`requests`,label:`requests`,component:Mn},{id:`logs`,label:`logs`,component:Tn},{id:`cluster`,label:`cluster`,component:Gn},{id:`predictor`,label:`predictor`,component:fn}]},{id:`admin`,label:`admin`,tabs:[{id:`keys`,label:`keys`,component:Cn},{id:`settings`,label:`settings`,component:Zn}]},{id:`playground`,label:`playground`,tabs:[{id:`playground`,label:`playground`,component:vn}]}];function $n(e){return Qn.find(t=>t.id===e)??Qn[0]}function er(e,t){return e.tabs.find(e=>e.id===t)??e.tabs[0]}function tr({active:e,onSelect:t,onSignOut:n}){return(0,A.jsx)(`header`,{className:`sticky top-0 z-10 backdrop-blur-sm bg-bg/80 border-b border-rule`,children:(0,A.jsxs)(`div`,{className:`max-w-[1280px] mx-auto px-8 h-14 flex items-center justify-between gap-8`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-10`,children:[(0,A.jsx)(`div`,{className:`text-[13px] tracking-tightish select-none`,children:`berth`}),(0,A.jsx)(`nav`,{className:`flex items-center gap-6`,children:Qn.map(n=>{let r=e===n.id;return(0,A.jsxs)(`button`,{onClick:()=>t(n.id),className:`relative text-[12px] tracking-wider transition-colors py-4 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[n.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},n.id)})})]}),(0,A.jsx)(`button`,{onClick:n,className:`label hover:text-dim transition-colors`,children:`sign out`})]})})}function nr({section:e,activeTab:t,onSelect:n}){return e.tabs.length<=1?null:(0,A.jsx)(`div`,{className:`border-b border-rule-soft`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 flex items-center gap-6`,children:e.tabs.map(e=>{let r=t===e.id;return(0,A.jsxs)(`button`,{onClick:()=>n(e.id),className:`relative text-[11px] tracking-wider transition-colors py-3 `+(r?`text-ink`:`text-mute hover:text-dim`),children:[e.label,r&&(0,A.jsx)(`span`,{className:`absolute left-0 right-0 bottom-0 h-px bg-accent`})]},e.id)})})})}function rr(e){let t=e.replace(/^#\/?/,``);if(!t)return{section:`overview`,tab:null};let[n,r]=t.split(`/`);return{section:n,tab:r||null}}function ir(e,t){return t?`#/${e}/${t}`:`#/${e}`}function ar(){let[e,t]=(0,k.useState)(()=>rr(location.hash));return(0,k.useEffect)(()=>{let e=()=>t(rr(location.hash));return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),[e,(e,t)=>{location.hash=ir(e,t)}]}function or(){let[e,t]=ar(),n=$n(e.section),r=er(n,e.tab??n.tabs[0].id),i=r.component;return(0,A.jsx)(Et,{children:(0,A.jsxs)(`div`,{className:`min-h-screen flex flex-col`,children:[(0,A.jsx)(tr,{active:n.id,onSelect:e=>{let n=$n(e);t(n.id,n.tabs[0].id)},onSignOut:()=>{Ct(),location.reload()}}),(0,A.jsx)(nr,{section:n,activeTab:r.id,onSelect:e=>t(n.id,e)}),(0,A.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:(0,A.jsx)(`div`,{className:`max-w-[1280px] mx-auto px-8 py-12 enter`,children:(0,A.jsx)(i,{})},`${n.id}/${r.id}`)})]})})}var sr=new $e({defaultOptions:{queries:{staleTime:1e3}}});yt.createRoot(document.getElementById(`root`)).render((0,A.jsx)(k.StrictMode,{children:(0,A.jsx)(it,{client:sr,children:(0,A.jsx)(or,{})})})); \ No newline at end of file diff --git a/src/berth/ui/index.html b/src/berth/ui/index.html index 807ce5e..2c3b1c3 100644 --- a/src/berth/ui/index.html +++ b/src/berth/ui/index.html @@ -15,7 +15,7 @@ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> - + diff --git a/ui/src/components/GpuCard.tsx b/ui/src/components/GpuCard.tsx index 4ee9363..b876fb2 100644 --- a/ui/src/components/GpuCard.tsx +++ b/ui/src/components/GpuCard.tsx @@ -1,4 +1,5 @@ import type { Deployment, GpuSnapshot, Model } from '../api' +import { GpuMeter } from './GpuMeter' export function fmtMb(mb: number | null | undefined): string { if (!mb) return '-' @@ -32,7 +33,7 @@ function idleCountdown(d: Deployment): string | null { return `${Math.round(remaining / 60)}m` } -function DeploymentChip({ d, modelName }: { d: Deployment; modelName: string }) { +export function DeploymentChip({ d, modelName }: { d: Deployment; modelName: string }) { const idle = idleCountdown(d) const vram = d.vram_used_mb && d.vram_used_mb > 0 ? d.vram_used_mb : d.vram_reserved_mb return ( @@ -64,48 +65,28 @@ export function GpuCard({ deployments: Deployment[] models: Model[] }) { - const pct = (g.memory_used_mb / g.memory_total_mb) * 100 const onCard = deployments.filter(d => (d.gpu_ids ?? []).includes(g.index) && (d.status === 'ready' || d.status === 'loading'), ) return ( -
-
-
gpu {g.index}
-
{pct.toFixed(0)}%
-
-
-
- {(g.memory_used_mb / 1024).toFixed(1)} -
-
/ {(g.memory_total_mb / 1024).toFixed(0)} GB
-
-
-
-
-
- util {g.gpu_util_pct}% - {g.power_w} w - - {onCard.length === 0 - ? idle - : {onCard.length} loaded} - -
- {onCard.length > 0 && ( + idle + : {onCard.length} loaded} + loaded={onCard.length > 0 && (
{onCard.map(d => { const m = models.find(m => m.id === d.model_id) - return ( - - ) + return })}
)} -
+ /> ) } diff --git a/ui/src/components/GpuMeter.tsx b/ui/src/components/GpuMeter.tsx new file mode 100644 index 0000000..54a5ac1 --- /dev/null +++ b/ui/src/components/GpuMeter.tsx @@ -0,0 +1,42 @@ +import type { ReactNode } from 'react' + +// Presentational GPU meter shared by the local-topology path (GpuCard) and the +// cluster metrics-snapshot path (HealthStrip). Takes normalized values so it +// works for both GpuSnapshot (has power) and MetricsSnapshotGpu (no power). +export function GpuMeter({ + label, usedMb, totalMb, utilPct, powerW, right, loaded, +}: { + label: string + usedMb: number + totalMb: number + utilPct: number + powerW?: number | null + right?: ReactNode + loaded?: ReactNode +}) { + const pct = totalMb > 0 ? (usedMb / totalMb) * 100 : 0 + return ( +
+
+
{label}
+
{pct.toFixed(0)}%
+
+
+
{(usedMb / 1024).toFixed(1)}
+
/ {(totalMb / 1024).toFixed(0)} GB
+
+
+
+
+
+ util {utilPct}% + {powerW != null && {powerW} w} + {right && {right}} +
+ {loaded} +
+ ) +} diff --git a/ui/src/views/overview/HealthStrip.tsx b/ui/src/views/overview/HealthStrip.tsx index ad70b35..8e28bab 100644 --- a/ui/src/views/overview/HealthStrip.tsx +++ b/ui/src/views/overview/HealthStrip.tsx @@ -1,27 +1,86 @@ import { useQuery } from '@tanstack/react-query' -import { api, queryKeys } from '../../api' -import { GpuCard, gpuGridCols } from '../../components/GpuCard' +import { api, queryKeys, type Deployment, type MetricsSnapshotNode } from '../../api' +import { GpuMeter } from '../../components/GpuMeter' +import { GpuCard, DeploymentChip, gpuGridCols } from '../../components/GpuCard' +// GPUs come from the cluster metrics snapshot (nodes[].gpus[]) so a GPU-less +// leader (e.g. a VPS) still shows the GPUs on remote worker nodes. Falls back +// to the leader's local topology only when the snapshot reports no GPUs. export default function HealthStrip() { + const snap = useQuery({ queryKey: queryKeys.metricsSnapshot, queryFn: api.getMetricsSnapshot, refetchInterval: 2000 }) const deps = useQuery({ queryKey: queryKeys.deployments, queryFn: api.listDeployments, refetchInterval: 2000 }) - const gpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) const models = useQuery({ queryKey: queryKeys.models, queryFn: api.listModels, refetchInterval: 5000 }) + const localGpus = useQuery({ queryKey: queryKeys.gpus, queryFn: api.listGpus, refetchInterval: 2000 }) - const gpuList = gpus.data ?? [] + const nodes = snap.data?.nodes ?? [] const all = deps.data ?? [] + const modelList = models.data ?? [] + const totalGpus = nodes.reduce((n, x) => n + x.gpus.length, 0) + const multiNode = nodes.filter(n => n.gpus.length > 0).length > 1 + + const nodeMatch = (d: Deployment, node: MetricsSnapshotNode) => + nodes.length <= 1 || d.node_id === node.node_id || (node.label === 'local' && d.node_id == null) + + if (totalGpus === 0) { + const lg = localGpus.data ?? [] + return ( +
+
gpus
+ {lg.length === 0 ? ( +
no gpus reported
+ ) : ( +
+ {lg.map(g => )} +
+ )} +
+ ) + } return ( -
+
gpus
- {gpuList.length === 0 ? ( -
no gpus reported
- ) : ( -
- {gpuList.map(g => ( - - ))} + {nodes.filter(n => n.gpus.length > 0).map(node => ( +
+ {multiNode && ( +
+ + {node.label} + + {node.gpus.length} gpu +
+ )} +
+ {node.gpus.map(g => { + const onGpu = all.filter(d => + (d.gpu_ids ?? []).includes(g.index) && + (d.status === 'ready' || d.status === 'loading') && + nodeMatch(d, node), + ) + return ( + idle + : {onGpu.length} loaded} + loaded={onGpu.length > 0 && ( +
+ {onGpu.map(d => { + const m = modelList.find(m => m.id === d.model_id) + return + })} +
+ )} + /> + ) + })} +
- )} + ))}
) } diff --git a/ui/src/views/overview/LatencyChart.tsx b/ui/src/views/overview/LatencyChart.tsx new file mode 100644 index 0000000..615d111 --- /dev/null +++ b/ui/src/views/overview/LatencyChart.tsx @@ -0,0 +1,59 @@ +import type { MetricsBucket } from '../../api' + +// p95 latency as bars (accent) + a thin per-bucket error-rate strip (red). +// Dependency-free SVG, same aesthetic as TrafficChart. +export default function LatencyChart({ buckets, height = 56 }: { + buckets: MetricsBucket[] + height?: number +}) { + const withData = buckets.filter(b => b.count > 0) + if (withData.length === 0) { + return
no requests in window
+ } + const maxP95 = Math.max(1, ...buckets.map(b => b.latency_p95_ms ?? 0)) + const n = buckets.length + const gap = 1 + const barW = 100 / n + return ( +
+ + {buckets.map((b, i) => { + const v = b.latency_p95_ms ?? 0 + const h = (v / maxP95) * height + return ( + + p95 {b.latency_p95_ms ?? 0}ms · {b.count} req + + ) + })} + + + {buckets.map((b, i) => ( + + {(b.error_rate * 100).toFixed(1)}% errors · {b.error_count}/{b.count} + + ))} + +
+ p95 latency + peak {maxP95.toLocaleString()} ms · error rate strip +
+
+ ) +} diff --git a/ui/src/views/overview/ModelBreakdown.tsx b/ui/src/views/overview/ModelBreakdown.tsx new file mode 100644 index 0000000..4a1641c --- /dev/null +++ b/ui/src/views/overview/ModelBreakdown.tsx @@ -0,0 +1,44 @@ +import type { MetricsGroup } from '../../api' + +// Per-model latency p95 + error rate over the window. Groups arrive sorted by +// volume (server-side). Highlights the slow/erroring models. +export default function ModelBreakdown({ groups, limit = 6 }: { + groups: MetricsGroup[] + limit?: number +}) { + const top = groups.slice(0, limit) + if (top.length === 0) { + return
no requests in window
+ } + return ( + + + + + + + + + + + {top.map(g => { + const errPct = g.summary.error_rate * 100 + return ( + + + + + + + ) + })} + +
modelp95errorsreq
{g.label} + {g.summary.latency_p95_ms !== null ? `${g.summary.latency_p95_ms} ms` : '—'} + + 0 ? 'text-err' : 'text-mute'}> + {errPct.toFixed(errPct > 0 && errPct < 1 ? 1 : 0)}% + + {g.summary.count.toLocaleString()}
+ ) +} diff --git a/ui/src/views/overview/Overview.tsx b/ui/src/views/overview/Overview.tsx index de39bf9..5a8e03a 100644 --- a/ui/src/views/overview/Overview.tsx +++ b/ui/src/views/overview/Overview.tsx @@ -3,7 +3,9 @@ import { api, queryKeys } from '../../api' import HealthStrip from './HealthStrip' import StatTile from './StatTile' import TrafficChart from './TrafficChart' +import LatencyChart from './LatencyChart' import TopModels from './TopModels' +import ModelBreakdown from './ModelBreakdown' import DeploymentsGlance from './DeploymentsGlance' import { aggregateSnapshot, recentRates } from './useOverviewStats' @@ -34,6 +36,23 @@ export default function Overview() { queryFn: () => api.getUsageByModel(86400, 3600), refetchInterval: 30000, }) + // Latency/error history (persisted): 24h summary for the tiles + breakdown, + // 24h hourly buckets for the chart. + const metricsSummary = useQuery({ + queryKey: queryKeys.metricsSummary(86400, 'none'), + queryFn: () => api.getMetricsSummary(86400), + refetchInterval: 15000, + }) + const metricsHistory = useQuery({ + queryKey: queryKeys.metricsHistory(86400, 3600), + queryFn: () => api.getMetricsHistory(86400, 3600), + refetchInterval: 30000, + }) + const metricsByModel = useQuery({ + queryKey: queryKeys.metricsSummary(86400, 'model'), + queryFn: () => api.getMetricsByModel(86400), + refetchInterval: 30000, + }) const all = deps.data ?? [] const active = all.filter(d => d.status === 'ready' || d.status === 'loading') @@ -42,6 +61,9 @@ export default function Overview() { const rates = recentRates(liveBuckets, 60) const volSpark = liveBuckets.slice(-30).map(b => b.count) const tokSpark = liveBuckets.slice(-30).map(b => b.tokens_out) + const ms = metricsSummary.data?.summary + const snapGpus = (snap.data?.nodes ?? []).reduce((n, x) => n + x.gpus.length, 0) + const gpuCount = snapGpus || (gpus.data ?? []).length return (
@@ -63,7 +85,7 @@ export default function Overview() {
) })()} -
{(gpus.data ?? []).length} gpu / {active.length} active
+
{gpuCount} gpu / {active.length} active
@@ -81,17 +103,17 @@ export default function Overview() { /> {stats.errorsWindow} recent → see traffic + {ms?.error_count ?? 0} in 24h → see traffic } - badge="live · 60s" + badge="24h" onClick={() => { location.hash = '#/observe/requests' }} /> +
+
+
latency & errors over time
+
last 24h
+
+ +
+
top models · 24h
-
- +
+
latency & errors by model · 24h
+
+ +
+ +
) }