From 5b5daa4beacfa9862ed1bf6c16ee1bd8c18b6fe8 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 14 Jun 2026 19:19:03 +0000 Subject: [PATCH] breakglass UI v2: attachable sessions (tmux model) + mobile-first redesign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full audit-driven rework. Keeps the proven SSE-translation + verb logic; everything else upgraded for phone-primary use. Backend — server owns the session, clients attach (Viktor's tmux idea): - session.py: SessionManager + Session with an event log, subscriber pub/sub, and turns that run DETACHED (keep going if the client disconnects). - GET /api/session/{id}/stream = attach (SSE): replays the transcript then tails live; per-event id: lines so an EventSource auto-reconnect resumes from Last-Event-ID (free re-attach). POST /{id}/prompt starts a detached turn; POST /{id}/cancel = Stop. Replaces the old one-shot /api/chat. - agent_session trimmed to the argv + translate_event helpers; 21 new/updated tests (replay, Last-Event-ID resume, broadcast, detached turn, resume, cancel, routes) — 53 green. Frontend — mobile-first via the frontend-design skill (emergency-console aesthetic): - EventSource attach (native auto-reconnect, zero client reconnect logic); transcript.js folds events->messages with id-dedupe so replays never double-render (30 unit assertions). - Installable PWA: manifest + icons (wrench/break-glass mark) + apple-mobile-web-app meta + theme-color; viewport-fit=cover + safe-area; 100dvh; 16px composer (no iOS zoom). - One-tap diagnosis presets (Triage / Memory-OOM / Disk / Services / QEMU-wedged) mapped to the devvm's real failure modes; Stop button while a turn runs. - Foldable VM-control sheet, cycle the dominant recovery action w/ confirm, output capped 46vh. - a11y: fixed --ink-faint contrast 3.6:1 -> 6.1:1 (WCAG AA); >=44px tap targets. Deleted the obsolete fetch-reader sse.js (EventSource replaces it). Verified: 53 backend tests + 30 transcript assertions; Playwright @390x844 (input on-screen y=721-821, presets/sheet/fold/cap); local integration smoke vs the real backend (attach->caught-up, 404, verbs, PWA served). Co-Authored-By: Claude Fable 5 --- app/breakglass/agent_session.py | 92 +-- app/breakglass/config.py | 3 + app/breakglass/server.py | 87 ++- app/breakglass/session.py | 201 +++++++ app/breakglass/static/apple-touch-icon.png | Bin 0 -> 30577 bytes .../static/assets/index-BoWC1Onq.css | 1 + .../static/assets/index-CLbKo1Yx.js | 6 + .../static/assets/index-DWHIP1Zw.css | 1 - .../static/assets/index-DjaW81Sq.js | 16 - app/breakglass/static/icon-192.png | Bin 0 -> 28637 bytes app/breakglass/static/icon-512.png | Bin 0 -> 48799 bytes app/breakglass/static/icon.svg | 64 +++ app/breakglass/static/index.html | 25 +- app/breakglass/static/manifest.webmanifest | 31 + frontend/index.html | 21 +- frontend/public/apple-touch-icon.png | Bin 0 -> 30577 bytes frontend/public/icon-192.png | Bin 0 -> 28637 bytes frontend/public/icon-512.png | Bin 0 -> 48799 bytes frontend/public/icon.svg | 64 +++ frontend/public/manifest.webmanifest | 31 + frontend/src/App.svelte | 532 +++++++++++++----- frontend/src/Chat.svelte | 513 ++++++++++------- frontend/src/VmControls.svelte | 9 +- frontend/src/app.css | 106 ++-- frontend/src/lib/api.js | 149 ++++- frontend/src/lib/sse.js | 150 ----- frontend/src/lib/sse.test.mjs | 152 ----- frontend/src/lib/transcript.js | 196 +++++++ frontend/src/lib/transcript.test.mjs | 162 ++++++ tests/test_breakglass.py | 317 +++++++---- 30 files changed, 1961 insertions(+), 968 deletions(-) create mode 100644 app/breakglass/session.py create mode 100644 app/breakglass/static/apple-touch-icon.png create mode 100644 app/breakglass/static/assets/index-BoWC1Onq.css create mode 100644 app/breakglass/static/assets/index-CLbKo1Yx.js delete mode 100644 app/breakglass/static/assets/index-DWHIP1Zw.css delete mode 100644 app/breakglass/static/assets/index-DjaW81Sq.js create mode 100644 app/breakglass/static/icon-192.png create mode 100644 app/breakglass/static/icon-512.png create mode 100644 app/breakglass/static/icon.svg create mode 100644 app/breakglass/static/manifest.webmanifest create mode 100644 frontend/public/apple-touch-icon.png create mode 100644 frontend/public/icon-192.png create mode 100644 frontend/public/icon-512.png create mode 100644 frontend/public/icon.svg create mode 100644 frontend/public/manifest.webmanifest delete mode 100644 frontend/src/lib/sse.js delete mode 100644 frontend/src/lib/sse.test.mjs create mode 100644 frontend/src/lib/transcript.js create mode 100644 frontend/src/lib/transcript.test.mjs diff --git a/app/breakglass/agent_session.py b/app/breakglass/agent_session.py index a360e40..7e209d2 100644 --- a/app/breakglass/agent_session.py +++ b/app/breakglass/agent_session.py @@ -1,26 +1,13 @@ -"""Drive the breakglass Claude agent and stream its work to the browser. +"""Claude CLI argv + stream-json → UI-event translation for the breakglass agent. -Each chat turn runs ``claude -p --output-format stream-json`` in the session's -persistent workspace; the first turn opens the session with ``--session-id`` and -later turns ``--resume`` it, so the conversation has memory across turns. The -CLI's JSON events are translated to a small, stable SSE vocabulary the UI -renders (``session`` / ``text`` / ``tool`` / ``result`` / ``error``) — we do not -leak the raw event firehose to the client. - -Subprocesses use ``asyncio.create_subprocess_exec`` (list argv, no shell): the -prompt and ids are argv elements, never interpreted by a shell. +The session lifecycle (running turns, attaching clients) lives in ``session.py``; +this module is just the two helpers it builds on: + * ``_turn_argv`` — the no-shell list argv for one ``claude -p`` turn. + * ``translate_event`` — map a raw stream-json event to the small UI vocabulary + (session / text / tool / result), dropping the hook/thinking-token noise. """ -import asyncio -import json -import os -from subprocess import PIPE -from typing import AsyncIterator - from . import config -# Sessions we've already opened (so the next turn resumes instead of re-creating). -_started: set[str] = set() - def _turn_argv(session_id: str, prompt: str, resume: bool, model: str) -> list[str]: argv = [ @@ -66,7 +53,7 @@ def translate_event(obj: dict) -> dict | None: }) if not events: return None - # The server flattens a "batch" into individual SSE frames. + # The session log flattens a "batch" into individual events. return events[0] if len(events) == 1 else {"kind": "batch", "events": events} if etype == "result": @@ -78,68 +65,3 @@ def translate_event(obj: dict) -> dict | None: } return None - - -async def run_turn( - session_id: str, prompt: str, model: str | None = None -) -> AsyncIterator[dict]: - """Run one chat turn, yielding translated UI events as they arrive.""" - resume = session_id in _started - model = model or config.DEFAULT_MODEL - workspace = os.path.join(config.SESSIONS_DIR, session_id) - os.makedirs(workspace, exist_ok=True) - - argv = _turn_argv(session_id, prompt, resume, model) - proc = await asyncio.create_subprocess_exec( - *argv, cwd=workspace, stdout=PIPE, stderr=PIPE, - ) - _started.add(session_id) - assert proc.stdout is not None and proc.stderr is not None - - try: - async def _pump() -> AsyncIterator[dict]: - async for raw in proc.stdout: - line = raw.decode(errors="replace").strip() - if not line: - continue - try: - obj = json.loads(line) - except json.JSONDecodeError: - continue - ev = translate_event(obj) - if ev is None: - continue - if ev.get("kind") == "batch": - for sub in ev["events"]: - yield sub - else: - yield ev - - async for ev in _with_timeout(_pump(), config.TURN_TIMEOUT_SECONDS): - yield ev - except asyncio.TimeoutError: - proc.kill() - await proc.wait() - yield {"kind": "error", "error": f"turn timed out after {config.TURN_TIMEOUT_SECONDS}s"} - return - - await proc.wait() - if proc.returncode not in (0, None): - err = (await proc.stderr.read()).decode(errors="replace") - yield {"kind": "error", "error": err.strip()[:500] or f"exit {proc.returncode}"} - - -async def _with_timeout(agen: AsyncIterator[dict], timeout: float) -> AsyncIterator[dict]: - """Yield from an async generator but raise TimeoutError if the WHOLE turn - exceeds ``timeout`` seconds (a wedged agent shouldn't stream forever).""" - loop = asyncio.get_event_loop() - deadline = loop.time() + timeout - it = agen.__aiter__() - while True: - remaining = deadline - loop.time() - if remaining <= 0: - raise asyncio.TimeoutError - try: - yield await asyncio.wait_for(it.__anext__(), timeout=remaining) - except StopAsyncIteration: - return diff --git a/app/breakglass/config.py b/app/breakglass/config.py index 785d17f..6f3e86a 100644 --- a/app/breakglass/config.py +++ b/app/breakglass/config.py @@ -25,6 +25,9 @@ MAX_CONCURRENT_TURNS = int(os.environ.get("BREAKGLASS_MAX_CONCURRENT_TURNS", "2" TURN_TIMEOUT_SECONDS = int(os.environ.get("BREAKGLASS_TURN_TIMEOUT_SECONDS", "1800")) # A single PVE power verb must return fast; a wedged host shouldn't hang the UI. PVE_VERB_TIMEOUT_SECONDS = int(os.environ.get("BREAKGLASS_PVE_VERB_TIMEOUT_SECONDS", "120")) +# How long an idle attach stream waits before emitting an SSE keepalive comment +# (keeps proxies/CDN from closing the long-lived connection). +SSE_KEEPALIVE_SECONDS = int(os.environ.get("BREAKGLASS_SSE_KEEPALIVE_SECONDS", "20")) # Auth. The app sits behind the ingress `auth = "required"` resilience proxy # (Authentik SSO, basic-auth fallback when Authentik is down). We additionally diff --git a/app/breakglass/server.py b/app/breakglass/server.py index 9a7201f..215b5a2 100644 --- a/app/breakglass/server.py +++ b/app/breakglass/server.py @@ -1,38 +1,44 @@ """Breakglass FastAPI app — the in-cluster emergency recovery UI. +The chat uses the tmux/attach model (see session.py): the server owns the +conversation; clients attach over SSE and the turn keeps running if they +disconnect. + Routes: - GET /health — liveness (no auth) - GET / — the single-page UI (static) - POST /api/session — open a chat session, returns {session_id} - POST /api/chat — run one turn, streams SSE events (text/tool/result) - POST /api/pve/{verb} — LLM-independent PVE power verb (manual buttons) - GET /api/pve/verbs — list allowed verbs + which mutate + GET /health — liveness (no auth) + GET / — the single-page UI (static) + POST /api/session — create a session, returns {session_id} + GET /api/session/{id}/stream — ATTACH (SSE): replay + live tail + POST /api/session/{id}/prompt — run a turn (detached; survives disconnect) + POST /api/session/{id}/cancel — stop the in-flight turn + GET /api/pve/verbs — list allowed verbs + which mutate + POST /api/pve/{verb} — LLM-independent PVE power verb (buttons) Everything under /api requires auth (edge Authentik header or bearer token). """ -import json import os -import uuid -from fastapi import Depends, FastAPI, HTTPException +from fastapi import Depends, FastAPI, Header, HTTPException from fastapi.responses import FileResponse, JSONResponse, StreamingResponse from fastapi.staticfiles import StaticFiles from pydantic import BaseModel, Field -from . import agent_session, config, pve +from . import config, pve from .auth import require_auth +from .session import SessionManager, attach_stream app = FastAPI(title="Claude Breakglass") _STATIC_DIR = os.path.join(os.path.dirname(__file__), "static") +manager = SessionManager() + class SessionResponse(BaseModel): session_id: str -class ChatRequest(BaseModel): - session_id: str +class PromptRequest(BaseModel): prompt: str = Field(..., min_length=1) model: str | None = None @@ -44,30 +50,53 @@ async def health(): @app.post("/api/session", response_model=SessionResponse) async def open_session(_identity: str = Depends(require_auth)): - # Claude wants a UUID for --session-id. - return SessionResponse(session_id=str(uuid.uuid4())) + return SessionResponse(session_id=manager.create().id) -@app.post("/api/chat") -async def chat(req: ChatRequest, _identity: str = Depends(require_auth)): - """Stream one chat turn as Server-Sent Events. The browser reads the - response body incrementally (fetch + ReadableStream).""" - - async def _sse(): - try: - async for ev in agent_session.run_turn(req.session_id, req.prompt, req.model): - yield f"data: {json.dumps(ev)}\n\n" - except Exception as exc: # noqa: BLE001 — surface any failure to the UI - yield f"data: {json.dumps({'kind': 'error', 'error': str(exc)[:500]})}\n\n" - yield f"data: {json.dumps({'kind': 'done'})}\n\n" - +@app.get("/api/session/{session_id}/stream") +async def attach( + session_id: str, + _identity: str = Depends(require_auth), + last_event_id: str | None = Header(default=None, alias="Last-Event-ID"), +): + """Attach to a session (SSE). Replays the conversation so far, then tails + live. On an EventSource auto-reconnect the browser sends Last-Event-ID, so we + replay only what was missed.""" + session = manager.get(session_id) + if session is None: + raise HTTPException(status_code=404, detail="session not found") + try: + leid = int(last_event_id) if last_event_id is not None else None + except ValueError: + leid = None return StreamingResponse( - _sse(), + attach_stream(session, leid), media_type="text/event-stream", - headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no", "Connection": "keep-alive"}, ) +@app.post("/api/session/{session_id}/prompt") +async def prompt(session_id: str, req: PromptRequest, _identity: str = Depends(require_auth)): + """Start a turn. It runs DETACHED (keeps going if the client disconnects); + output is delivered via the attach stream, not this response.""" + session = manager.get(session_id) + if session is None: + raise HTTPException(status_code=404, detail="session not found") + if not session.start_turn(req.prompt, req.model): + raise HTTPException(status_code=409, detail="a turn is already running") + return {"status": "started"} + + +@app.post("/api/session/{session_id}/cancel") +async def cancel(session_id: str, _identity: str = Depends(require_auth)): + session = manager.get(session_id) + if session is None: + raise HTTPException(status_code=404, detail="session not found") + cancelled = await session.cancel() + return {"cancelled": cancelled} + + @app.get("/api/pve/verbs") async def pve_verbs(_identity: str = Depends(require_auth)): return { diff --git a/app/breakglass/session.py b/app/breakglass/session.py new file mode 100644 index 0000000..c6558ed --- /dev/null +++ b/app/breakglass/session.py @@ -0,0 +1,201 @@ +"""Attachable server-side sessions — the tmux model for the breakglass chat. + +Instead of the client owning conversation state, the SERVER owns it and clients +*attach*. A turn runs as a detached task that keeps going if the client +disconnects (you can background the phone / hit a tunnel blip and the agent +keeps working); its output is appended to a per-session event log and broadcast +to every attached subscriber. A client attaches over SSE, gets the log replayed +(or only the part it missed, via Last-Event-ID), then tails live — exactly like +re-attaching to a tmux session. ``EventSource`` reconnects natively, so the +"re-attach" needs zero client logic. + +This module owns the lifecycle; ``agent_session`` still provides the claude +argv + the stream-json→UI-event translation (all subprocesses use the no-shell +list-argv form), and ``config`` the knobs. +""" +import asyncio +import json +import os +import uuid +from subprocess import PIPE +from typing import AsyncIterator + +from . import agent_session, config + + +class Session: + """One conversation. Owns the replay log + live subscribers + the in-flight + turn. The claude ``session_id`` is reused with ``--resume`` so the agent + keeps its own context across turns.""" + + def __init__(self, session_id: str): + self.id = session_id + # The replay log: every UI event, in order. Index in the list IS the + # SSE event id, so a reconnecting client replays only what it missed. + self.events: list[dict] = [] + self._subscribers: set[asyncio.Queue] = set() + self._turn: asyncio.Task | None = None + self._proc: asyncio.subprocess.Process | None = None + self._started = False # has claude opened this session id yet? + + # ── event log + fan-out ──────────────────────────────────────────────── + def add_event(self, event: dict) -> dict: + """Append an event to the log and broadcast it to attached clients.""" + stored = {**event, "id": len(self.events)} + self.events.append(stored) + for q in list(self._subscribers): + q.put_nowait(stored) + return stored + + def subscribe(self) -> asyncio.Queue: + q: asyncio.Queue = asyncio.Queue() + self._subscribers.add(q) + return q + + def unsubscribe(self, q: asyncio.Queue) -> None: + self._subscribers.discard(q) + + @property + def turn_active(self) -> bool: + return self._turn is not None and not self._turn.done() + + # ── running a turn (detached from any client) ────────────────────────── + def start_turn(self, prompt: str, model: str | None = None) -> bool: + """Kick off a turn as a background task. Returns False if one is already + running (one turn at a time per session).""" + if self.turn_active: + return False + self.add_event({"kind": "user", "text": prompt}) + self._turn = asyncio.create_task(self._run_turn(prompt, model)) + return True + + async def _run_turn(self, prompt: str, model: str | None) -> None: + model = model or config.DEFAULT_MODEL + resume = self._started + argv = agent_session._turn_argv(self.id, prompt, resume, model) + try: + self._proc = await asyncio.create_subprocess_exec( + *argv, cwd=_workspace_for(self.id), stdout=PIPE, stderr=PIPE, + ) + except Exception as exc: # noqa: BLE001 + self.add_event({"kind": "error", "error": f"could not start agent: {exc}"}) + self.add_event({"kind": "turn_end"}) + return + self._started = True + assert self._proc.stdout is not None and self._proc.stderr is not None + + try: + async def _pump(): + async for raw in self._proc.stdout: + line = raw.decode(errors="replace").strip() + if not line: + continue + try: + obj = json.loads(line) + except json.JSONDecodeError: + continue + ev = agent_session.translate_event(obj) + if ev is None: + continue + if ev.get("kind") == "batch": + for sub in ev["events"]: + self.add_event(sub) + else: + self.add_event(ev) + + await asyncio.wait_for(_pump(), timeout=config.TURN_TIMEOUT_SECONDS) + await self._proc.wait() + if self._proc.returncode not in (0, None): + err = (await self._proc.stderr.read()).decode(errors="replace") + self.add_event({"kind": "error", "error": err.strip()[:500] or f"exit {self._proc.returncode}"}) + except asyncio.TimeoutError: + await self._kill_proc() + self.add_event({"kind": "error", "error": f"turn timed out after {config.TURN_TIMEOUT_SECONDS}s"}) + except asyncio.CancelledError: + await self._kill_proc() + self.add_event({"kind": "cancelled"}) + raise + finally: + self._proc = None + self.add_event({"kind": "turn_end"}) + + async def _kill_proc(self) -> None: + if self._proc and self._proc.returncode is None: + try: + self._proc.kill() + await self._proc.wait() + except ProcessLookupError: + pass + + async def cancel(self) -> bool: + """Stop the in-flight turn. Returns True if a turn was cancelled.""" + if not self.turn_active: + return False + await self._kill_proc() + if self._turn: + self._turn.cancel() + try: + await self._turn + except (asyncio.CancelledError, Exception): # noqa: BLE001 + pass + return True + + +def _workspace_for(session_id: str) -> str: + path = os.path.join(config.SESSIONS_DIR, session_id) + os.makedirs(path, exist_ok=True) + return path + + +class SessionManager: + """Holds all live sessions. The breakglass is single-operator, so callers + typically reuse one persistent session; multiple are still supported.""" + + def __init__(self): + self.sessions: dict[str, Session] = {} + + def create(self) -> Session: + sid = str(uuid.uuid4()) + s = Session(sid) + self.sessions[sid] = s + return s + + def get(self, session_id: str) -> Session | None: + return self.sessions.get(session_id) + + def get_or_create(self, session_id: str | None) -> Session: + if session_id and session_id in self.sessions: + return self.sessions[session_id] + return self.create() + + +async def attach_stream(session: Session, last_event_id: int | None) -> AsyncIterator[str]: + """Yield SSE frames for an attached client: first the replay (everything, or + only events after ``last_event_id`` on a reconnect), then live events as they + arrive. Each frame carries an ``id:`` so EventSource resumes precisely.""" + q = session.subscribe() + try: + start = 0 if last_event_id is None else last_event_id + 1 + backlog = session.events[start:] + for ev in backlog: + yield _sse_frame(ev) + # Tell the client the replay is done and it's now live. + yield "event: caught-up\ndata: {}\n\n" + + seen = backlog[-1]["id"] if backlog else (last_event_id if last_event_id is not None else -1) + while True: + try: + ev = await asyncio.wait_for(q.get(), timeout=config.SSE_KEEPALIVE_SECONDS) + except asyncio.TimeoutError: + yield ": keepalive\n\n" # comment frame keeps the connection warm + continue + if ev["id"] <= seen: + continue + seen = ev["id"] + yield _sse_frame(ev) + finally: + session.unsubscribe(q) + + +def _sse_frame(event: dict) -> str: + return f"id: {event['id']}\ndata: {json.dumps(event)}\n\n" diff --git a/app/breakglass/static/apple-touch-icon.png b/app/breakglass/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e5763f27d44be448e7dc04778c6ae40c08d77b23 GIT binary patch literal 30577 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 hkKu!_O2L;+QsYn?$Vk16B>Wo@summary:where(.svelte-1qihpg4),details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4){cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4)::-webkit-details-marker{display:none}details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4)::-webkit-details-marker{display:none}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4):before,details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4):before{content:"▾";width:11px;color:var(--ink-faint);margin-right:4px;font-size:9px;transition:transform .15s;display:inline-block}details.group.svelte-1qihpg4:not([open])>summary:where(.svelte-1qihpg4):before,details.out.svelte-1qihpg4:not([open])>summary:where(.svelte-1qihpg4):before{transform:rotate(-90deg)}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4){padding:3px 0}.out-head.svelte-1qihpg4 .out-status:where(.svelte-1qihpg4){margin-left:auto}.out-pre.svelte-1qihpg4{max-height:46vh;overflow:auto}.shell.svelte-1n46o8q{max-width:1520px;height:100%;padding-left:var(--safe-left);padding-right:var(--safe-right);flex-direction:column;margin:0 auto;display:flex}.rail.svelte-1n46o8q{padding:max(10px, var(--safe-top)) 14px 10px;border-bottom:1px solid var(--line);background:linear-gradient(#3dd1d608,#0000 60%),linear-gradient(#ffffff04,#0000);flex:none;justify-content:space-between;align-items:center;gap:10px;display:flex}.rail-title.svelte-1n46o8q{align-items:center;gap:10px;min-width:0;display:flex}.brand-mark.svelte-1n46o8q{color:var(--cyan);filter:drop-shadow(0 0 10px #3dd1d659);flex:none;display:inline-flex}.brand-mark.svelte-1n46o8q .frac:where(.svelte-1n46o8q){color:var(--amber);stroke:var(--amber);opacity:.85}h1.svelte-1n46o8q{font-family:var(--mono);letter-spacing:.04em;color:var(--ink);white-space:nowrap;margin:0;font-size:16px;font-weight:600}.accent.svelte-1n46o8q{color:var(--cyan);text-shadow:0 0 18px #3dd1d666}.rail-right.svelte-1n46o8q{flex:none;align-items:center;gap:8px;display:flex}.lamp-wrap.svelte-1n46o8q{font-family:var(--mono);align-items:center;gap:8px;padding:0 4px;font-size:12px;display:inline-flex}.lamp.svelte-1n46o8q{background:var(--ink-faint);border-radius:50%;flex:none;width:10px;height:10px;position:relative}.lamp.svelte-1n46o8q:after{content:"";opacity:0;border:1px solid;border-radius:50%;position:absolute;inset:-4px}.lamp--live.svelte-1n46o8q{background:var(--cyan);color:var(--cyan);animation:3.6s ease-in-out infinite svelte-1n46o8q-lamp-breathe;box-shadow:0 0 10px 1px #3dd1d6a6}.lamp--live.svelte-1n46o8q:after{animation:3.6s ease-out infinite svelte-1n46o8q-lamp-ring}.lamp--connecting.svelte-1n46o8q{background:var(--cyan-dim);color:var(--cyan);animation:1.4s ease-in-out infinite svelte-1n46o8q-lamp-blink}.lamp--working.svelte-1n46o8q{background:var(--amber);color:var(--amber);animation:1s ease-in-out infinite svelte-1n46o8q-lamp-pulse;box-shadow:0 0 10px 1px #f5b657b3}.lamp--working.svelte-1n46o8q:after{animation:1s ease-out infinite svelte-1n46o8q-lamp-ring}.lamp--error.svelte-1n46o8q{background:var(--danger);color:var(--danger);box-shadow:0 0 10px 1px var(--danger-glow);animation:1.2s ease-in-out infinite svelte-1n46o8q-lamp-pulse}@keyframes svelte-1n46o8q-lamp-breathe{0%,to{opacity:.6}50%{opacity:1}}@keyframes svelte-1n46o8q-lamp-blink{0%,to{opacity:.35}50%{opacity:.9}}@keyframes svelte-1n46o8q-lamp-pulse{0%,to{opacity:.75;transform:scale(.82)}50%{opacity:1;transform:scale(1.12)}}@keyframes svelte-1n46o8q-lamp-ring{0%{opacity:.5;transform:scale(.6)}70%{opacity:0;transform:scale(1.8)}to{opacity:0;transform:scale(1.8)}}.lamp-text.svelte-1n46o8q{letter-spacing:.04em;color:var(--ink-dim);text-overflow:ellipsis;white-space:nowrap;max-width:88px;overflow:hidden}.lamp-text--live.svelte-1n46o8q .sid:where(.svelte-1n46o8q){color:var(--cyan);letter-spacing:.06em}.lamp-text--working.svelte-1n46o8q{color:var(--amber)}.lamp-text--error.svelte-1n46o8q{color:var(--danger-bright)}.lamp-text--connecting.svelte-1n46o8q{color:var(--ink-faint)}.sid.svelte-1n46o8q{font-family:var(--mono)}@media (width<=439px){.lamp-text.svelte-1n46o8q{display:none}.lamp-wrap.svelte-1n46o8q{padding:0}}.rail-btn.svelte-1n46o8q{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-2);min-height:44px;color:var(--ink-dim);letter-spacing:.03em;align-items:center;gap:6px;padding:0 14px;font-size:13px;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.rail-btn.svelte-1n46o8q:hover:not(:disabled){border-color:var(--line-bright);color:var(--ink)}.rail-btn.svelte-1n46o8q:active:not(:disabled){background:var(--bg-3)}.rail-btn.svelte-1n46o8q:disabled{opacity:.42}.rail-btn--vm.svelte-1n46o8q{border-color:var(--amber-dim);color:var(--amber)}.rail-btn--vm.svelte-1n46o8q:hover:not(:disabled){border-color:var(--amber);color:var(--amber)}.bolt.svelte-1n46o8q{font-size:13px;line-height:1}.rail-note.svelte-1n46o8q{border:1px solid var(--danger-deep);color:#ffd9d9;border-radius:var(--radius-sm);background:#ff4d4d12;border-left-width:3px;flex-wrap:wrap;flex:none;align-items:center;gap:6px 12px;margin:10px 12px 0;padding:10px 13px;font-size:13px;line-height:1.5;display:flex}.rail-note-aside.svelte-1n46o8q{color:#f0b8b8}.rail-note-aside.svelte-1n46o8q strong:where(.svelte-1n46o8q){color:#fff;font-family:var(--mono)}.rail-note-retry.svelte-1n46o8q{border:1px solid var(--danger-deep);color:var(--danger-bright);background:0 0;border-radius:6px;min-height:36px;margin-left:auto;padding:6px 12px;font-size:12px}.rail-note-retry.svelte-1n46o8q:hover{background:#ff4d4d1f}.toast.svelte-1n46o8q{border:1px solid var(--line-strong);border-left:3px solid var(--amber);background:var(--bg-2);color:var(--amber);border-radius:var(--radius-sm);font-family:var(--mono);flex:none;margin:10px 12px 0;padding:9px 13px;font-size:12.5px;line-height:1.45;animation:.28s ease-out both rise-in}.stage.svelte-1n46o8q{flex:1;min-width:0;min-height:0;padding:10px;display:flex}.chat-pane.svelte-1n46o8q{flex:1;min-width:0;min-height:0;display:flex}.controls-pane.svelte-1n46o8q{z-index:40;background:var(--bg-1);border-top:1px solid var(--line-strong);border-radius:var(--radius-lg) var(--radius-lg) 0 0;max-height:88dvh;box-shadow:var(--shadow-sheet);padding:8px 14px calc(14px + var(--safe-bottom));flex-direction:column;transition:transform .3s cubic-bezier(.32,.72,0,1);display:flex;position:fixed;bottom:0;left:0;right:0;transform:translateY(102%);animation:none!important}.controls-pane.open.svelte-1n46o8q{transform:translateY(0)}.sheet-grip.svelte-1n46o8q{background:var(--line-bright);border-radius:99px;flex:none;width:40px;height:4px;margin:4px auto 10px}.controls-head.svelte-1n46o8q{flex:none;justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.controls-head-title.svelte-1n46o8q{font-family:var(--mono);text-transform:uppercase;letter-spacing:.2em;color:var(--amber);font-size:11px}.sheet-close.svelte-1n46o8q{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-2);width:40px;height:40px;color:var(--ink-dim);font-size:14px}.sheet-close.svelte-1n46o8q:active{background:var(--bg-3)}.sheet-backdrop.svelte-1n46o8q{z-index:30;-webkit-backdrop-filter:blur(1.5px);backdrop-filter:blur(1.5px);opacity:0;pointer-events:none;background:#0204079e;border:0;padding:0;transition:opacity .24s;position:fixed;inset:0}.sheet-backdrop.show.svelte-1n46o8q{opacity:1;pointer-events:auto}@media (width>=900px){.rail.svelte-1n46o8q{padding:14px 18px}h1.svelte-1n46o8q{font-size:19px}.stage.svelte-1n46o8q{grid-template-columns:minmax(0,1fr) 384px;gap:16px;padding:16px 18px 18px;display:grid}.chat-pane.svelte-1n46o8q{display:flex}.rail-btn--vm.svelte-1n46o8q{display:none}.controls-pane.svelte-1n46o8q{max-height:none;box-shadow:none;z-index:auto;border:none;border-radius:0;padding:0;position:static;transform:none;animation:.5s cubic-bezier(.22,.61,.36,1) both rise-in!important;animation-delay:var(--d,0s)!important}.sheet-grip.svelte-1n46o8q,.controls-head.svelte-1n46o8q,.sheet-backdrop.svelte-1n46o8q{display:none}} diff --git a/app/breakglass/static/assets/index-CLbKo1Yx.js b/app/breakglass/static/assets/index-CLbKo1Yx.js new file mode 100644 index 0000000..b6d571b --- /dev/null +++ b/app/breakglass/static/assets/index-CLbKo1Yx.js @@ -0,0 +1,6 @@ +(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)}})(),typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var e={},t=Symbol(`uninitialized`),n=`http://www.w3.org/1999/xhtml`,r=Array.isArray,i=Array.prototype.indexOf,a=Array.prototype.includes,o=Array.from,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyDescriptors,u=Object.prototype,d=Array.prototype,f=Object.getPrototypeOf,p=Object.isExtensible,m=()=>{};function h(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}var _=1024,v=2048,y=4096,b=8192,x=16384,S=32768,C=1<<25,w=65536,T=1<<19,ee=1<<20,te=1<<25,ne=65536,re=1<<21,ie=1<<22,ae=1<<23,oe=Symbol(`$state`),se=Symbol(`legacy props`),ce=Symbol(``),le=Symbol(`attributes`),ue=Symbol(`class`),de=Symbol(`style`),fe=Symbol(`text`),pe=Symbol(`form reset`),me=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},he=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function ge(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function _e(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function ve(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function ye(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function be(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function xe(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Se(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ce(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function we(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Te(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Ee(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function De(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}function Oe(){console.warn(`https://svelte.dev/e/derived_inert`)}function ke(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Ae(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var E=!1;function je(e){E=e}var D;function O(t){if(t===null)throw ke(),e;return D=t}function Me(){return O(on(D))}function k(t){if(E){if(on(D)!==null)throw ke(),e;D=t}}function Ne(e=1){if(E){for(var t=e,n=D;t--;)n=on(n);D=n}}function Pe(e=!0){for(var t=0,n=D;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else (r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=on(n);e&&n.remove(),n=i}}function Fe(t){if(!t||t.nodeType!==8)throw ke(),e;return t.data}function Ie(e){return e===this.v}function Le(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Re(e){return!Le(e,this.v)}var ze=!1,Be=!1,A=null;function Ve(e){A=e}function He(e,t=!1,n){A={p:A,i:!1,c:null,e:null,s:e,x:null,r:W,l:Be&&!t?{s:null,u:null,$:[]}:null}}function Ue(e){var t=A,n=t.e;if(n!==null){t.e=null;for(var r of n)Cn(r)}return e!==void 0&&(t.x=e),t.i=!0,A=t.p,e??{}}function We(){return!Be||A!==null&&A.l===null}var Ge=[];function Ke(){var e=Ge;Ge=[],h(e)}function qe(e){if(Ge.length===0&&!Et){var t=Ge;queueMicrotask(()=>{t===Ge&&Ke()})}Ge.push(e)}function Je(){for(;Ge.length>0;)Ke()}function Ye(e){var t=W;if(t===null)return H.f|=ae,e;if(!(t.f&32768)&&!(t.f&4))throw e;Xe(e,t)}function Xe(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}var Ze=~(v|y|_);function j(e,t){e.f=e.f&Ze|t}function Qe(e){e.f&512||e.deps===null?j(e,_):j(e,y)}function $e(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=ne,$e(t.deps))}function et(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),$e(e.deps),j(e,_)}var tt=!1,nt=!1;function rt(e){var t=nt;try{return nt=!1,[e(),nt]}finally{nt=t}}function it(e){let t=0,n=Gt(0),r;return()=>{bn()&&(J(n),Dn(()=>(t===0&&(r=cr(()=>e(()=>Xt(n)))),t+=1,()=>{qe(()=>{--t,t===0&&(r?.(),r=void 0,Xt(n))})})))}}var at=w|T;function ot(e,t,n,r){new st(e,t,n,r)}var st=class{parent;is_pending=!1;transform_error;#e;#t=E?D:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=it(()=>(this.#m=Gt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=W;t.b=this,t.f|=128,n(e)},this.parent=W.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=On(()=>{if(E){let e=this.#t;Me();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},at),E&&(this.#e=D)}#g(){try{this.#a=B(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=B(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=B(()=>e(this.#e)),qe(()=>{var e=this.#c=document.createDocumentFragment(),t=I();e.append(t),this.#a=this.#x(()=>B(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,Pn(this.#o,()=>{this.#o=null}),this.#b(M))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=B(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Rn(this.#a,e);let t=this.#n.pending;this.#o=B(()=>t(this.#e))}else this.#b(M)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){et(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=W,n=H,r=A;Wn(this.#i),U(this.#i),Ve(this.#i.ctx);try{return Mt.ensure(),e()}catch(e){return Ye(e),null}finally{Wn(t),U(n),Ve(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&Pn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,qe(()=>{this.#d=!1,this.#m&&qt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),J(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;M?.is_fork?(this.#a&&M.skip_effect(this.#a),this.#o&&M.skip_effect(this.#o),this.#s&&M.skip_effect(this.#s),M.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(V(this.#a),null),this.#o&&=(V(this.#o),null),this.#s&&=(V(this.#s),null),E&&(O(this.#t),Ne(),O(Pe()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Ae();return}r=!0,i&&De(),this.#s!==null&&Pn(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){Xe(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return B(()=>{var t=W;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return Xe(e,this.#i.parent),null}}))};qe(()=>{var t;try{t=this.transform_error(e)}catch(e){Xe(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>Xe(e,this.#i&&this.#i.parent)):o(t)})}};function ct(e,t,n,r){let i=We()?ft:gt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=W,c=lt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){Xe(e,s)}ut()}}var d=dt();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>mt(e))).then(u).catch(e=>Xe(e,s)).finally(d)}l?l.then(()=>{c(),f(),ut()}):f()}function lt(){var e=W,t=H,n=A,r=M;return function(i=!0){Wn(e),U(t),Ve(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function ut(e=!0){Wn(null),U(null),Ve(null),e&&M?.deactivate()}function dt(){var e=W,t=e.b,n=M,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function ft(e){var n=2|v;return W!==null&&(W.f|=T),{ctx:A,deps:null,effects:null,equals:Ie,f:n,fn:e,reactions:null,rv:0,v:t,wv:0,parent:W,ac:null}}var pt=Symbol(`obsolete`);function mt(e,n,r){let i=W;i===null&&_e();var a=void 0,o=Gt(t),s=!H,c=new Set;return En(()=>{var t=W,n=g();a=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==me&&n.reject(e)}).finally(ut)}catch(e){n.reject(e),ut()}var r=M;if(s){if(t.f&32768)var l=dt();if(i.b?.is_rendered())r.async_deriveds.get(t)?.reject(pt);else for(let e of c.values())e.reject(pt);c.add(n),r.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),c.delete(n),t!==pt&&(r.activate(),t?(o.f|=ae,qt(o,t)):(o.f&8388608&&(o.f^=ae),qt(o,e)),r.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),xn(()=>{for(let e of c)e.reject(pt)}),new Promise(e=>{function t(n){function r(){n===a?e(o):t(a)}n.then(r,r)}t(a)})}function ht(e){let t=ft(e);return ze||Kn(t),t}function gt(e){let t=ft(e);return t.equals=Re,t}function _t(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;nthis.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)j(r,v),t(r);for(r of n.m)j(r,y),t(r)}this.#p.add(e)}#g(){this.#e=!0,At++>1e3&&(this.#S(),Pt());for(let e of this.#u)this.#d.delete(e),j(e,v),this.schedule(e);for(let e of this.#d)j(e,y),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Ot=[],r=[],i=kt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw Vt(e),this.#h()||this.discard(),t}if(M=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Ot=null,kt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)Bt(e,t);i.length>0&&M.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),wt=this,It(r),It(n),wt=null,this.#s?.resolve();var s=M;if(this.#a===0&&(this.#c.length===0||s!==null)&&(this.#S(),ze&&(this.#x(),M=s)),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=_;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=_:i&4?t.push(r):ze&&i&16777224?n.push(r):$n(r)&&(i&16&&this.#d.add(r),ir(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),j(i,v),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),M=this,this.#g()}#b(e){for(var t=0;t!u.current.get(e)[1]);if(!(!u.#e||r.length===0)){var i=r.filter(e=>!this.current.has(e));if(i.length===0)e&&u.discard();else if(t.length>0){if(e)for(let e of this.#p)u.unskip_effect(e,e=>{e.f&4194320?u.schedule(e):u.#b([e])});u.activate();var a=new Set,o=new Map;for(var s of t)Lt(s,i,a,o);o=new Map;var c=[...u.current].filter(([e,t])=>{let n=this.current.get(e);return n?n[0]!==t[0]||n[1]!==t[1]:!0}).map(([e])=>e);if(c.length>0)for(let e of this.#l)!(e.f&155648)&&Rt(e,c,o)&&(e.f&4194320?(j(e,v),u.schedule(e)):u.#u.add(e));if(u.#c.length>0&&!u.#m){u.apply();for(var l of u.#c)u.#_(l,[],[]);u.#c=[]}u.deactivate()}}}}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,qe(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=g()).promise}static ensure(){if(M===null){let t=M=new e;!Dt&&!Et&&qe(()=>{t.#e||t.flush()})}return M}apply(){if(!ze||!this.is_fork&&this.#t===null&&this.#n===null){N=null;return}N=new Map;for(let[e,[t]]of this.current)N.set(e,t);for(let t=St;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id0)){Ut.clear();for(let e of Ft){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Ft.has(n)&&(Ft.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||ir(n)}}Ft.clear()}}Ft=null}}function Lt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Lt(i,t,n,r):e&4194320&&!(e&2048)&&Rt(i,t,r)&&(j(i,v),zt(i))}}function Rt(e,t,n){let r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(let r of e.deps){if(a.call(t,r))return!0;if(r.f&2&&Rt(r,t,n))return n.set(r,!0),!0}return n.set(e,!1),!1}function zt(e){M.schedule(e)}function Bt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),j(e,_);for(var n=e.first;n!==null;)Bt(n,t),n=n.next}}function Vt(e){j(e,_);for(var t=e.first;t!==null;)Vt(t),t=t.next}var Ht=new Set,Ut=new Map,Wt=!1;function Gt(e,t){return{f:0,v:e,reactions:null,equals:Ie,rv:0,wv:0}}function P(e,t){let n=Gt(e,t);return Kn(n),n}function Kt(e,t=!1,n=!0){let r=Gt(e);return t||(r.equals=Re),Be&&n&&A!==null&&A.l!==null&&(A.l.s??=[]).push(r),r}function F(e,t,n=!1){return H!==null&&(!Un||H.f&131072)&&We()&&H.f&4325394&&(Gn===null||!Gn.has(e))&&Ee(),qt(e,n?Qt(t):t,kt)}function qt(e,t,n=null){if(!e.equals(t)){Ut.set(e,Vn?t:e.v);var r=Mt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&vt(t),N===null&&Qe(t)}e.wv=Qn(),Zt(e,v,n),We()&&W!==null&&W.f&1024&&!(W.f&96)&&(q===null?qn([e]):q.push(e)),!r.is_fork&&Ht.size>0&&!Wt&&Jt()}return t}function Jt(){Wt=!1;for(let e of Ht){e.f&1024&&j(e,y);let t;try{t=$n(e)}catch{t=!0}t&&ir(e)}Ht.clear()}function Yt(e,t=1){var n=J(e),r=t===1?n++:n--;return F(e,n),r}function Xt(e){F(e,e.v+1)}function Zt(e,t,n){var r=e.reactions;if(r!==null)for(var i=We(),a=r.length,o=0;o{if(Xn===l)return e();var t=H,n=Xn;U(null),Zn(l);var r=e();return U(t),Zn(n),r};return a&&i.set(`length`,P(e.length,s)),new Proxy(e,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&we();var r=i.get(t);return r===void 0?p(()=>{var e=P(n.value,s);return i.set(t,e),e}):F(r,n.value,!0),!0},deleteProperty(e,n){var r=i.get(n);if(r===void 0){if(n in e){let e=p(()=>P(t,s));i.set(n,e),Xt(o)}}else F(r,t),Xt(o);return!0},get(n,r,a){if(r===oe)return e;var o=i.get(r),l=r in n;if(o===void 0&&(!l||c(n,r)?.writable)&&(o=p(()=>P(Qt(l?n[r]:t),s)),i.set(r,o)),o!==void 0){var u=J(o);return u===t?void 0:u}return Reflect.get(n,r,a)},getOwnPropertyDescriptor(e,n){var r=Reflect.getOwnPropertyDescriptor(e,n);if(r&&`value`in r){var a=i.get(n);a&&(r.value=J(a))}else if(r===void 0){var o=i.get(n),s=o?.v;if(o!==void 0&&s!==t)return{enumerable:!0,configurable:!0,value:s,writable:!0}}return r},has(e,n){if(n===oe)return!0;var r=i.get(n),a=r!==void 0&&r.v!==t||Reflect.has(e,n);return(r!==void 0||W!==null&&(!a||c(e,n)?.writable))&&(r===void 0&&(r=p(()=>P(a?Qt(e[n]):t,s)),i.set(n,r)),J(r)===t)?!1:a},set(e,n,r,l){var u=i.get(n),d=n in e;if(a&&n===`length`)for(var f=r;fP(t,s)),i.set(f+``,m)):F(m,t)}if(u===void 0)(!d||c(e,n)?.writable)&&(u=p(()=>P(void 0,s)),F(u,Qt(r)),i.set(n,u));else{d=u.v!==t;var h=p(()=>Qt(r));F(u,h)}var g=Reflect.getOwnPropertyDescriptor(e,n);if(g?.set&&g.set.call(l,r),!d){if(a&&typeof n==`string`){var _=i.get(`length`),v=Number(n);Number.isInteger(v)&&v>=_.v&&F(_,v+1)}Xt(o)}return!0},ownKeys(e){J(o);var n=Reflect.ownKeys(e).filter(e=>{var n=i.get(e);return n===void 0||n.v!==t});for(var[r,a]of i)a.v!==t&&!(r in e)&&n.push(r);return n},setPrototypeOf(){Te()}})}new Set([`copyWithin`,`fill`,`pop`,`push`,`reverse`,`shift`,`sort`,`splice`,`unshift`]);var $t,en,tn,nn;function rn(){if($t===void 0){$t=window,en=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;tn=c(t,`firstChild`).get,nn=c(t,`nextSibling`).get,p(e)&&(e[ue]=void 0,e[le]=null,e[de]=void 0,e.__e=void 0),p(n)&&(n[fe]=void 0)}}function I(e=``){return document.createTextNode(e)}function an(e){return tn.call(e)}function on(e){return nn.call(e)}function L(e,t){if(!E)return an(e);var n=an(D);if(n===null)n=D.appendChild(I());else if(t&&n.nodeType!==3){var r=I();return n?.before(r),O(r),r}return t&&dn(n),O(n),n}function sn(e,t=!1){if(!E){var n=an(e);return n instanceof Comment&&n.data===``?on(n):n}if(t){if(D?.nodeType!==3){var r=I();return D?.before(r),O(r),r}dn(D)}return D}function R(e,t=1,n=!1){let r=E?D:e;for(var i;t--;)i=r,r=on(r);if(!E)return r;if(n){if(r?.nodeType!==3){var a=I();return r===null?i?.after(a):r.before(a),O(a),a}dn(r)}return O(r),r}function cn(e){e.textContent=``}function ln(){return!ze||Ft!==null?!1:(W.f&S)!==0}function un(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function dn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function fn(e){E&&an(e)!==null&&cn(e)}var pn=!1;function mn(){pn||(pn=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[pe]?.()})},{capture:!0}))}function hn(e){var t=H,n=W;U(null),Wn(null);try{return e()}finally{U(t),Wn(n)}}function gn(e,t,n,r=n){e.addEventListener(t,()=>hn(n));let i=e[pe];i?e[pe]=()=>{i(),r(!0)}:e[pe]=()=>r(!0),mn()}function _n(e){W===null&&(H===null&&xe(e),be()),Vn&&ye(e)}function vn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function yn(e,t){var n=W;n!==null&&n.f&8192&&(e|=b);var r={ctx:A,deps:null,nodes:null,f:e|v|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};M?.register_created_effect(r);var i=r;if(e&4)Ot===null?Mt.ensure().schedule(r):Ot.push(r);else if(t!==null){try{ir(r)}catch(e){throw V(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=w))}if(i!==null&&(i.parent=n,n!==null&&vn(i,n),H!==null&&H.f&2&&!(e&64))){var a=H;(a.effects??=[]).push(i)}return r}function bn(){return H!==null&&!Un}function xn(e){let t=yn(8,null);return j(t,_),t.teardown=e,t}function Sn(e){_n(`$effect`);var t=W.f;if(!H&&t&32&&A!==null&&!A.i){var n=A;(n.e??=[]).push(e)}else return Cn(e)}function Cn(e){return yn(4|ee,e)}function wn(e){Mt.ensure();let t=yn(64|T,e);return(e={})=>new Promise(n=>{e.outro?Pn(t,()=>{V(t),n(void 0)}):(V(t),n(void 0))})}function Tn(e){return yn(4,e)}function En(e){return yn(ie|T,e)}function Dn(e,t=0){return yn(8|t,e)}function z(e,t=[],n=[],r=[]){ct(r,t,n,t=>{yn(8,()=>{e(...t.map(J))})})}function On(e,t=0){return yn(16|t,e)}function B(e){return yn(32|T,e)}function kn(e){var t=e.teardown;if(t!==null){let e=Vn,n=H;Hn(!0),U(null);try{t.call(null)}finally{Hn(e),U(n)}}}function An(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&hn(()=>{e.abort(me)});var r=n.next;n.f&64?n.parent=null:V(n,t),n=r}}function jn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||V(t),t=n}}function V(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Mn(e.nodes.start,e.nodes.end),n=!0),e.f|=C,An(e,t&&!n),rr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();kn(e),e.f^=C,e.f|=x;var i=e.parent;i!==null&&i.first!==null&&Nn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Mn(e,t){for(;e!==null;){var n=e===t?null:on(e);e.remove(),e=n}}function Nn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Pn(e,t,n=!0){var r=[];Fn(e,r,!0);var i=()=>{n&&V(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Fn(e,t,n){if(!(e.f&8192)){e.f^=b;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Fn(i,t,o?n:!1)}i=a}}}function In(e){Ln(e,!0)}function Ln(e,t){if(e.f&8192){e.f^=b,e.f&1024||(j(e,v),Mt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;Ln(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Rn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:on(n);t.append(n),n=i}}var zn=null,Bn=!1,Vn=!1;function Hn(e){Vn=e}var H=null,Un=!1;function U(e){H=e}var W=null;function Wn(e){W=e}var Gn=null;function Kn(e){H!==null&&(!ze||H.f&2)&&(Gn??=new Set).add(e)}var G=null,K=0,q=null;function qn(e){q=e}var Jn=1,Yn=0,Xn=Yn;function Zn(e){Xn=e}function Qn(){return++Jn}function $n(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~ne),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&N===null&&j(e,_)}return!1}function er(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!ze&&Gn!==null&&Gn.has(e)))for(var i=0;i{e.ac.abort(me)}),e.ac=null);try{e.f|=re;var u=e.fn,d=u();e.f|=S;var f=e.deps,p=M?.is_fork;if(G!==null){var m;if(p||rr(e,K),f!==null&&K>0)for(f.length=K+G.length,m=0;m{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),Nt()}function J(e){var t=(e.f&2)!=0;if(zn?.add(e),H!==null&&!Un&&!(W!==null&&W.f&16384)&&(Gn===null||!Gn.has(e))){var n=H.deps;if(H.f&2097152)e.rvn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?qe(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function pr(e,t,n,r,i){var a={capture:r,passive:i},o=fr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&xn(()=>{t.removeEventListener(e,o,a)})}function Y(e,t,n){(t[lr]??={})[e]=n}function mr(e){for(var t=0;t{throw e});throw p}}finally{e[lr]=t,delete e.currentTarget,U(d),Wn(f)}}}var _r=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function vr(e){return _r?.createHTML(e)??e}function yr(e){var t=un(`template`);return t.innerHTML=vr(e.replaceAll(``,``)),t.content}function br(e,t){var n=W;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function X(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(E)return br(D,null),D;i===void 0&&(i=yr(a?e:``+e),n||(i=an(i)));var t=r||en?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=an(t),s=t.lastChild;br(o,s)}else br(t,t);return t}}function xr(e=``){if(!E){var t=I(e+``);return br(t,t),t}var n=D;return n.nodeType===3?dn(n):(n.before(n=I()),O(n)),br(n,n),n}function Sr(){if(E)return br(D,null),D;var e=document.createDocumentFragment(),t=document.createComment(``),n=I();return e.append(t,n),br(t,n),e}function Z(e,t){if(E){var n=W;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=D),Me();return}e!==null&&e.before(t)}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var Cr=[`touchstart`,`touchmove`];function wr(e){return Cr.includes(e)}function Q(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[fe]??=e.nodeValue)&&(e[fe]=n,e.nodeValue=`${n}`)}function Tr(e,t){return Dr(e,t)}var Er=new Map;function Dr(t,{target:n,anchor:r,props:i={},events:a,context:s,intro:c=!0,transformError:l}){rn();var u=void 0,d=wn(()=>{var c=r??n.appendChild(I());ot(c,{pending:()=>{}},n=>{He({});var r=A;if(s&&(r.c=s),a&&(i.$$events=a),E&&br(n,null),u=t(n,i)||{},E&&(W.nodes.end=D,D===null||D.nodeType!==8||D.data!==`]`))throw ke(),e;Ue()},l);var d=new Set,f=e=>{for(var t=0;t{for(var e of d)for(let r of[n,document]){var t=Er.get(r),i=t.get(e);--i==0?(r.removeEventListener(e,gr),t.delete(e),t.size===0&&Er.delete(r)):t.set(e,i)}dr.delete(f),c!==r&&c.parentNode?.removeChild(c)}});return Or.set(u,d),u}var Or=new WeakMap,kr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)In(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(In(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(V(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Rn(r,t),t.append(I()),this.#n.set(e,{effect:r,fragment:t})}else V(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Pn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(V(n.effect),this.#n.delete(e))};ensure(e,t){var n=M,r=ln();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=I();i.append(a),this.#n.set(e,{effect:B(()=>t(a)),fragment:i})}else this.#t.set(e,B(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else E&&(this.anchor=D),this.#a(n)}};function Ar(e){A===null&&ge(`onMount`),Be&&A.l!==null?Mr(A).m.push(e):Sn(()=>{let t=cr(e);if(typeof t==`function`)return t})}function jr(e){A===null&&ge(`onDestroy`),Ar(()=>()=>cr(e))}function Mr(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}function $(e,t,n=!1){var r;E&&(r=D,Me());var i=new kr(e),a=n?w:0;function o(e,t){if(E){var n=Fe(r);if(e!==parseInt(n.substring(1))){var a=Pe();O(a),i.anchor=a,je(!1),i.ensure(e,t),je(!0);return}}i.ensure(e,t)}On(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Nr(e,t){return t}function Pr(e,t,n){for(var r=[],i=t.length,a,s=t.length,c=0;c{if(a){if(a.pending.delete(n),a.done.add(n),a.pending.size===0){var t=e.outrogroups;Fr(e,o(a.done)),t.delete(a),t.size===0&&(e.outrogroups=null)}}else --s},!1)}if(s===0){var l=r.length===0&&n!==null;if(l){var u=n,d=u.parentNode;cn(d),d.append(u),e.items.clear()}Fr(e,t,!l)}else a={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(a)}function Fr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=n();return r(e)?e:e==null?[]:o(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,zr(v,p,c,t,i),d!==null&&(p.length===0?d.f&33554432?(d.f^=te,Vr(d,null,c)):In(d):Pn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:On(()=>{p=J(f);var e=p.length;let r=!1;E&&Fe(c)===`[!`!=(e===0)&&(c=Pe(),O(c),je(!1),r=!0);for(var o=new Set,u=M,v=ln(),y=0;ys(c)):(d=B(()=>s(Ir??=I())),d.f|=te)),e>o.size&&ve(``,``,``),E&&e>0&&O(Pe()),!h)if(m.set(u,o),v){for(let[e,t]of l)o.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);r&&je(!0),J(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,E&&(c=D)}function Rr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function zr(e,t,n,r,i){var a=(r&8)!=0,s=t.length,c=e.items,l=Rr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(a)for(v=0;v0){var ee=r&4&&s===0?n:null;if(a){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Br(e,t,n,r,i,a,o,s){var c=o&1?o&16?Gt(n):Kt(n,!1,!1):null,l=o&2?Gt(i):null;return{v:c,i:l,e:B(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Vr(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=on(r);if(a.before(r),r===i)return;r=o}}function Hr(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}var Ur=[...` +\r\f\xA0\v`];function Wr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Ur.includes(r[o-1]))&&(s===r.length||Ur.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Gr(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function Kr(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function qr(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(Kr)),i&&c.push(...Object.keys(i).map(Kr));var l=0,u=-1;let t=e.length;for(var d=0;d{var a=i?e.defaultValue:e.value;if(a=ai(e)?oi(a):a,n(a),M!==null&&r.add(M),await ar(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(E&&e.defaultValue!==e.value||cr(t)==null&&e.value)&&(n(ai(e)?oi(e.value):e.value),M!==null&&r.add(M)),Dn(()=>{var n=t();if(e===document.activeElement){var i=ze?wt:M;if(r.has(i))return}ai(e)&&n===oi(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function ai(e){var t=e.type;return t===`number`||t===`range`}function oi(e){return e===``?null:+e}function si(e,t){return e===t||e?.[oe]===t}function ci(e={},t,n,r){var i=A.r,a=W;return Tn(()=>{var o,s;return Dn(()=>{o=s,s=r?.()||[],cr(()=>{si(n(...s),e)||(t(e,...s),o&&si(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&si(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function li(e,t,n,r){var i=!Be||(n&2)!=0,a=(n&8)!=0,o=(n&16)!=0,s=r,l=!0,u=void 0,d=()=>o&&i?(u??=ft(r),J(u)):(l&&(l=!1,s=o?cr(r):r),s);let f;if(a){var p=oe in e||se in e;f=c(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=rt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Ce(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(s=void 0),n===void 0?s:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?ft:gt)(()=>(v=!1,g()));a&&J(y);var b=W;return(function(e,t){if(arguments.length>0){let n=t?J(y):i&&a?Qt(e):e;return F(y,n),v=!0,s!==void 0&&(s=n),e}return Vn&&v||b.f&16384?y.v:J(y)})}var ui=`breakglass.session_id`;function di(){try{return localStorage.getItem(ui)||``}catch{return``}}function fi(e){try{e?localStorage.setItem(ui,e):localStorage.removeItem(ui)}catch{}}function pi(){fi(``)}async function mi(){let e=await fetch(`/api/session`,{method:`POST`,headers:{"content-type":`application/json`}});if(!e.ok)throw Error(`could not open a session (HTTP ${e.status})`);let t=await e.json();if(!t||typeof t.session_id!=`string`)throw Error(`session response missing session_id`);return t.session_id}function hi(e,{onEvent:t,onCaughtUp:n,onOpen:r,onError:i}){let a=new EventSource(`/api/session/${encodeURIComponent(e)}/stream`);return a.onopen=()=>r?.(),a.onmessage=e=>{if(!e||typeof e.data!=`string`||e.data===``)return;let n;try{n=JSON.parse(e.data)}catch{return}(n.id==null||n.id===``)&&e.lastEventId&&(n.id=e.lastEventId),t(n)},a.addEventListener(`caught-up`,()=>n?.()),a.onerror=e=>{i?.(e)},a}async function gi({session_id:e,prompt:t,model:n}){let r={prompt:t};n&&(r.model=n);let i=await fetch(`/api/session/${encodeURIComponent(e)}/prompt`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r)});if(i.status===409)return{status:`busy`};if(i.status===404)return{status:`gone`};if(!i.ok)throw Error(`could not start the turn (HTTP ${i.status})`);return{status:`started`}}async function _i(e){let t=await fetch(`/api/session/${encodeURIComponent(e)}/cancel`,{method:`POST`,headers:{"content-type":`application/json`}});if(!t.ok)throw Error(`could not stop the turn (HTTP ${t.status})`);return!!(await t.json().catch(()=>({}))).cancelled}async function vi(){let e=await fetch(`/api/pve/verbs`);if(!e.ok)throw Error(`could not load VM controls (HTTP ${e.status})`);let t=await e.json();return{verbs:Array.isArray(t.verbs)?t.verbs:[],mutating:Array.isArray(t.mutating)?t.mutating:[]}}async function yi(e){let t=await fetch(`/api/pve/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`}}),n;try{n=await t.json()}catch{throw Error(`VM control '${e}' failed (HTTP ${t.status}, no body)`)}if(t.status===400)throw Error(n?.detail||`'${e}' was rejected by the server`);return{verb:n.verb??e,exit_code:n.exit_code??null,stdout:n.stdout??``,stderr:n.stderr??``,rejected:!!n.rejected}}function bi(e,t){let n=Number(e),r=Number(t);return Number.isFinite(n)&&Number.isFinite(r)&&`${e}`.trim()!==``&&`${t}`.trim()!==``?n>r:String(e)>String(t)}function xi(){return{messages:[],maxId:null,sawId:!1,openAssistant:null,activeUserSeen:!1}}function Si(e,t,n){return t!=null&&`${t}`.trim()!==``?`${e}:${t}`:`${e}:idx:${n}`}function Ci(e,t){return t==null||`${t}`.trim()===``?{apply:!0,maxId:e}:e==null||bi(t,e)?{apply:!0,maxId:t}:{apply:!1,maxId:e}}function wi(e,t){if(!t||typeof t!=`object`)return!1;let{apply:n,maxId:r}=Ci(e.maxId,t.id);if(e.maxId=r,!n)return!1;t.id!=null&&`${t.id}`.trim()!==``&&(e.sawId=!0);let i=()=>{if(!e.openAssistant){let n={role:`assistant`,key:Si(`a`,t.id,e.messages.length),parts:[],ended:!1};e.messages.push(n),e.openAssistant=n}return e.openAssistant};switch(t.kind){case`user`:return e.openAssistant=null,e.messages.push({role:`user`,key:Si(`u`,t.id,e.messages.length),text:typeof t.text==`string`?t.text:``}),e.activeUserSeen=!0,!0;case`session`:return i(),!0;case`text`:{if(typeof t.text!=`string`||t.text===``)return!1;let e=i(),n=e.parts[e.parts.length-1];return n&&n.type===`text`?n.text+=t.text:e.parts.push({type:`text`,text:t.text}),!0}case`tool`:{let e=i(),n=t.input&&typeof t.input.command==`string`?t.input.command:``;return e.parts.push({type:`tool`,name:typeof t.name==`string`&&t.name?t.name:`tool`,command:n,raw:t.input??null}),!0}case`result`:{let e=i();return e.result={is_error:!!t.is_error,text:typeof t.result==`string`?t.result:``,duration_ms:typeof t.duration_ms==`number`?t.duration_ms:null},!0}case`error`:{let e=i();return e.error=typeof t.error==`string`&&t.error?t.error:`unknown error`,!0}case`cancelled`:{let e=i();return e.cancelled=!0,!0}case`turn_end`:return e.openAssistant&&(e.openAssistant.ended=!0),e.openAssistant=null,e.activeUserSeen=!1,!0;default:return!1}}var Ti=X(` `,1),Ei=X(` `);function Di(e,t){let n=li(t,`name`,3,`tool`),r=li(t,`command`,3,``);var i=Ei(),a=R(L(i),2),o=L(a,!0);k(a);var s=R(a,2),c=e=>{var t=Ti(),n=R(sn(t),2),i=L(n,!0);k(n),z(()=>Q(i,r())),Z(e,t)};$(s,e=>{r()&&e(c)}),k(i),z(()=>{ei(i,`title`,r()?`${n()}: ${r()}`:n()),Q(o,n())}),Z(e,i)}var Oi=X(`The cluster or network may be down. You can still power-cycle the VM + with ⚡ Direct VM control — it needs no agent.`,1),ki=X(`Tap a preset below or describe the symptom — "devvm unreachable", + "disk full", "ssh hangs" — and it will connect over SSH, investigate, + and stream its work here. For a hard power action, use ⚡ Direct VM control.`,1),Ai=X(`

`),ji=X(`
`),Mi=X(``),Ni=X(` `),Pi=X(`
error
`),Fi=X(`
stopped turn cancelled
`),Ii=X(` `),Li=X(` `),Ri=X(`
`),zi=X(`
`),Bi=X(``),Vi=X(`
agent working — streaming live
`),Hi=X(``),Ui=X(``),Wi=X(`
Recovery agent SSHes into the devvm to diagnose & repair
`);function Gi(e,t){He(t,!0);let n=li(t,`rev`,3,0),r=li(t,`caughtUp`,3,!1),i=li(t,`turnActive`,3,!1),a=li(t,`sending`,3,!1),o=li(t,`linkState`,3,`connecting`),s=li(t,`onSubmit`,3,e=>{}),c=li(t,`onStop`,3,()=>{}),l=[{label:`Triage`,icon:`◑`,prompt:`Triage the devvm: uptime, load, memory, swap, disk usage, failed systemd units, and the last 30 lines of dmesg. Summarize what's wrong.`},{label:`Memory / OOM`,icon:`▦`,prompt:`Check devvm memory pressure: free -h, top memory consumers, any recent OOM-kills in dmesg/journal, and swap usage. Is it OOMing?`},{label:`Disk`,icon:`▤`,prompt:`What's filling the devvm disk? df -h, then the biggest directories/files under the fullest mount. Anything safe to clear?`},{label:`Services`,icon:`⚙`,prompt:`List failed or stuck systemd units on the devvm (systemctl --failed) and show the status + recent journal lines for any that are down.`},{label:`QEMU wedged?`,icon:`◫`,prompt:`Is the devvm's QEMU wedged (I/O stall)? Check guest responsiveness over SSH, then ssh pve forensics for VM 102's qm status/QMP/guest-agent. Tell me if a cycle is needed.`}],u=P(``),d,f,p=!0,m=ht(()=>n()>=0&&t.tx?t.tx.messages.map(e=>e.role===`assistant`?{...e,parts:e.parts.slice()}:{...e}):[]),h=ht(()=>J(m).length===0),g=ht(()=>o()!==`error`&&!i()&&J(u).trim().length>0),_=ht(()=>!i());function v(){d&&(p=d.scrollHeight-d.scrollTop-d.clientHeight<64)}async function y(e=!1){!e&&!p||(await ar(),d&&(d.scrollTop=d.scrollHeight))}Sn(()=>{n(),y()});function b(e){i()||(p=!0,s()(e),y(!0))}function x(){let e=J(u).trim();!e||i()||(F(u,``),b(e),ar().then(()=>f?.focus()))}function S(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),x())}function C(e){return e==null?``:e<1e3?`${e} ms`:`${(e/1e3).toFixed(+(e<1e4))} s`}function w(e){return r()?Math.min(e,6)*45:0}var T=Wi(),ee=R(L(T),2),te=L(ee),ne=e=>{var t=Ai();let n;var r=R(L(t),2),i=L(r),a=e=>{Z(e,xr(`The agent is unreachable.`))},s=e=>{Z(e,xr(`Attaching to the session…`))},c=e=>{Z(e,xr(`The agent is standing by.`))};$(i,e=>{o()===`error`?e(a):o()===`connecting`?e(s,1):e(c,-1)}),k(r);var l=R(r,2),u=L(l),d=e=>{var t=Oi();Ne(2),Z(e,t)},f=e=>{var t=ki();Ne(2),Z(e,t)};$(u,e=>{o()===`error`?e(d):e(f,-1)}),k(l),k(t),z(()=>n=Jr(t,1,`empty svelte-1bi93vx`,null,n,{dim:o()===`connecting`})),Z(e,t)};$(te,e=>{J(h)&&e(ne)}),Lr(R(te,2),17,()=>J(m),e=>e.key,(e,t)=>{var n=Sr(),r=sn(n),i=e=>{var n=ji(),r=L(n),i=L(r,!0);k(r),k(n),z(e=>{Xr(n,`--d:${e??``}ms`),Q(i,J(t).text)},[()=>w(0)]),Z(e,n)},a=e=>{var n=zi(),r=L(n),i=L(r),a=e=>{Z(e,Mi())};$(i,e=>{J(t).parts.length===0&&!J(t).result&&!J(t).error&&!J(t).cancelled&&e(a)});var o=R(i,2);Lr(o,17,()=>J(t).parts,Nr,(e,t)=>{var n=Sr(),r=sn(n),i=e=>{var n=Ni(),r=L(n,!0);k(n),z(()=>Q(r,J(t).text)),Z(e,n)},a=e=>{Di(e,{get name(){return J(t).name},get command(){return J(t).command}})};$(r,e=>{J(t).type===`text`?e(i):e(a,-1)}),Z(e,n)});var s=R(o,2),c=e=>{var n=Pi(),r=R(L(n),2),i=L(r,!0);k(r),k(n),z(()=>Q(i,J(t).error)),Z(e,n)},l=e=>{Z(e,Fi())},u=e=>{var n=Ri(),r=L(n),i=L(r,!0);k(r);var a=R(r,2),o=e=>{var n=Ii(),r=L(n,!0);k(n),z(()=>Q(r,J(t).result.text)),Z(e,n)};$(a,e=>{J(t).result.text&&e(o)});var s=R(a,2),c=e=>{var n=Li(),r=L(n,!0);k(n),z(e=>Q(r,e),[()=>C(J(t).result.duration_ms)]),Z(e,n)};$(s,e=>{J(t).result.duration_ms!=null&&e(c)}),k(n),z(()=>{Jr(n,1,`turn-note ${J(t).result.is_error?`turn-note--error`:`turn-note--ok`}`,`svelte-1bi93vx`),Q(i,J(t).result.is_error?`failed`:`done`)}),Z(e,n)};$(s,e=>{J(t).error?e(c):J(t).cancelled?e(l,1):J(t).result&&e(u,2)}),k(r),k(n),z(e=>Xr(n,`--d:${e??``}ms`),[()=>w(0)]),Z(e,n)};$(r,e=>{J(t).role===`user`?e(i):e(a,-1)}),Z(e,n)}),k(ee),ci(ee,e=>d=e,()=>d);var re=R(ee,2),ie=L(re);Lr(ie,21,()=>l,e=>e.label,(e,t)=>{var n=Bi(),r=L(n),a=L(r,!0);k(r);var s=R(r,2),c=L(s,!0);k(s),k(n),z(()=>{n.disabled=i()||o()===`error`,ei(n,`title`,J(t).prompt),Q(a,J(t).icon),Q(c,J(t).label)}),Y(`click`,n,()=>b(J(t).prompt)),Z(e,n)}),k(ie);var ae=R(ie,2),oe=L(ae),se=e=>{Z(e,Vi())};$(oe,e=>{i()&&e(se)});var ce=R(oe,2),le=L(ce);fn(le),ci(le,e=>f=e,()=>f);var ue=R(le,2),de=e=>{var t=Hi();Y(`click`,t,function(...e){c()?.apply(this,e)}),Z(e,t)},fe=e=>{var t=Ui(),n=L(t,!0);k(t),z(()=>{t.disabled=!J(g),Q(n,a()?`···`:`Send`)}),Z(e,t)};$(ue,e=>{i()?e(de):e(fe,-1)}),k(ce),k(ae),k(re),k(T),z(()=>{ei(le,`placeholder`,J(_)?`Describe the problem… (Enter to send · Shift+Enter for a new line)`:`A turn is running — Stop it to type, or wait…`),le.disabled=!J(_)}),pr(`scroll`,ee,v),pr(`submit`,ae,e=>{e.preventDefault(),x()}),Y(`keydown`,le,S),ii(le,()=>J(u),e=>F(u,e)),Z(e,T),Ue()}mr([`click`,`keydown`]);var Ki=X(`
Loading controls…
`),qi=X(``),Ji=X(``),Yi=X(``),Xi=X(``),Zi=X(`recovery`),Qi=X(`
Confirm ? This will affect the running VM
`),$i=X(`

`),ea=X(``),ta=X(`rejected`),na=X(` `),ra=X(`
 
`),ia=X(`
stderr
 
`,1),aa=X(`
(no output)
`),oa=X(`
`),sa=X(`
Inspect read-only
Power affects the running VM
`,1),ca=X(`

Direct VM control

No AI in the path — these reach the Proxmox host over a + forced-command SSH key and work even when the agent is down.

`);function la(e,t){He(t,!0);let n={status:{label:`status`,blurb:`qm status — is the VM up?`},forensics:{label:`forensics`,blurb:`capture live diagnostic state`},start:{label:`start`,blurb:`power on a stopped VM`},stop:{label:`stop`,blurb:`hard power-off (pulls the plug)`},reset:{label:`reset`,blurb:`warm reboot — reuses the QEMU process`},cycle:{label:`cycle`,blurb:`stop → start; applies staged config; fixes a wedged QEMU`,headline:!0}},r=[`status`,`forensics`,`start`,`stop`,`reset`,`cycle`],i=P(`loading`),a=P(``),o=P(Qt([])),s=P(``),c=P(``),l=P(null),u=P(``),d=ht(()=>J(c)!==``);Ar(async()=>{try{let{verbs:e,mutating:t}=await vi(),a=new Set(t),s=e.filter(e=>n[e]);F(o,[...r.filter(e=>s.includes(e)),...s.filter(e=>!r.includes(e))].map(e=>({name:e,mutating:a.has(e),...n[e]})),!0),F(i,`ready`)}catch(e){F(i,`error`),F(a,e instanceof Error?e.message:String(e),!0)}});let f=ht(()=>J(o).filter(e=>!e.mutating)),p=ht(()=>J(o).filter(e=>e.mutating));function m(e){J(d)||(e.mutating?F(s,J(s)===e.name?``:e.name,!0):g(e.name))}function h(){F(s,``)}async function g(e){F(s,``),F(u,``),F(l,null),F(c,e,!0);try{F(l,await yi(e),!0)}catch(e){F(u,e instanceof Error?e.message:String(e),!0)}finally{F(c,``)}}let _=ht(()=>!!J(l)&&(J(l).rejected||J(l).exit_code!=null&&J(l).exit_code!==0));var v=ca(),y=R(L(v),2),b=e=>{Z(e,Ki())},x=e=>{var t=qi(),n=L(t),r=R(n);k(t),z(()=>Q(n,`Couldn't load the VM controls — ${J(a)??``}. `)),Y(`click`,r,()=>location.reload()),Z(e,t)},S=e=>{var t=sa(),n=sn(t),r=R(L(n),2);Lr(r,21,()=>J(f),e=>e.name,(e,t)=>{var n=Yi(),r=L(n),i=e=>{Z(e,Ji())};$(r,e=>{J(c)===J(t).name&&e(i)});var a=R(r,2),o=L(a,!0);k(a),k(n),z(()=>{n.disabled=J(d),ei(n,`title`,J(t).blurb),Q(o,J(t).label)}),Y(`click`,n,()=>m(J(t))),Z(e,n)}),k(r),k(n);var i=R(n,2),a=R(L(i),2);Lr(a,21,()=>J(p),e=>e.name,(e,t)=>{var n=$i(),r=L(n),i=L(r),a=e=>{Z(e,Xi())};$(i,e=>{J(c)===J(t).name&&e(a)});var o=R(i,2),l=L(o,!0);k(o);var u=R(o,2),f=e=>{Z(e,Zi())};$(u,e=>{J(t).headline&&e(f)}),k(r);var p=R(r,2),_=L(p,!0);k(p);var v=R(p,2),y=e=>{var n=Qi(),r=L(n),i=R(L(r)),a=L(i,!0);k(i),Ne(),k(r);var o=R(r,2),s=L(o),c=R(s,2);k(o),k(n),z(()=>{ei(n,`aria-label`,`Confirm ${J(t).name??``}`),Q(a,J(t).name),s.disabled=J(d),c.disabled=J(d)}),Y(`click`,s,()=>g(J(t).name)),Y(`click`,c,h),Z(e,n)};$(v,e=>{J(s)===J(t).name&&e(y)}),k(n),z(()=>{Jr(n,1,`danger-item ${J(t).headline?`danger-item--headline`:``}`,`svelte-1qihpg4`),Jr(r,1,`vbtn vbtn--danger ${J(t).headline?`vbtn--headline`:``}`,`svelte-1qihpg4`),r.disabled=J(d),ei(r,`aria-expanded`,J(s)===J(t).name),Q(l,J(t).label),Q(_,J(t).blurb)}),Y(`click`,r,()=>m(J(t))),Z(e,n)}),k(a),k(i);var o=R(i,2),v=e=>{var t=ea(),n=L(t);k(t),z(()=>Q(n,`⚠ Command failed to reach the host — ${J(u)??``}`)),Z(e,t)};$(o,e=>{J(u)&&e(v)});var y=R(o,2),b=e=>{var t=oa(),n=L(t),r=L(n),i=L(r,!0);k(r);var a=R(r,2),o=e=>{Z(e,ta())},s=e=>{var t=na(),n=L(t);k(t),z(()=>{Jr(t,1,`out-status ${J(_)?`out-status--fail`:`out-status--ok`}`,`svelte-1qihpg4`),Q(n,`exit ${J(l).exit_code??``}`)}),Z(e,t)};$(a,e=>{J(l).rejected?e(o):e(s,-1)}),k(n);var c=R(n,2),u=e=>{var t=ra(),n=L(t,!0);k(t),z(()=>Q(n,J(l).stdout)),Z(e,t)};$(c,e=>{J(l).stdout&&e(u)});var d=R(c,2),f=e=>{var t=ia(),n=R(sn(t),2),r=L(n,!0);k(n),z(()=>Q(r,J(l).stderr)),Z(e,t)};$(d,e=>{J(l).stderr&&e(f)});var p=R(d,2),m=e=>{Z(e,aa())};$(p,e=>{!J(l).stdout&&!J(l).stderr&&e(m)}),k(t),z(()=>{Jr(t,1,`out ${J(_)?`out--fail`:`out--ok`}`,`svelte-1qihpg4`),Q(i,J(l).verb)}),Z(e,t)};$(y,e=>{J(l)&&e(b)}),Z(e,t)};$(y,e=>{J(i)===`loading`?e(b):J(i)===`error`?e(x,1):e(S,-1)}),k(v),Z(e,v),Ue()}mr([`click`]);var ua=X(` `),da=X(``),fa=X(`
`),pa=X(`

devvmbreakglass

`);function ma(e,t){He(t,!0);let n=P(`connecting`),r=P(``),i=P(``),a=P(!1),o=P(!1),s=P(!1),c=P(xi()),l=P(0),u=null,d=P(!1);function f(){F(c,xi()),Yt(l)}function p(e){wi(J(c),e)&&(F(o,J(c).activeUserSeen,!0),Yt(l))}function m(){u&&=(u.close(),null)}function h(e){m(),F(i,e,!0),F(a,!1),F(n,`connecting`),F(r,``),u=hi(e,{onOpen:()=>{J(n)!==`attached`&&F(n,`attached`),F(r,``)},onCaughtUp:()=>{F(a,!0),F(n,`attached`)},onEvent:p,onError:()=>{u&&u.readyState===EventSource.CLOSED?(F(n,`error`),F(r,`lost the connection to the session — retrying…`),setTimeout(()=>{J(i)===e&&h(e)},1500)):F(n,`connecting`)}})}async function g(){F(n,`connecting`),F(r,``),f();let e=di();if(e){h(e);return}await _()}async function _(){try{F(n,`connecting`);let e=await mi();fi(e),h(e)}catch(e){F(n,`error`),F(r,e instanceof Error?e.message:String(e),!0)}}async function v(){J(o)||J(s)||(m(),pi(),f(),F(o,!1),await _())}async function y(e){let t=(e||``).trim();if(!(!t||J(o)||J(s))&&!(!J(i)&&(await _(),!J(i)))){F(s,!0),F(o,!0);try{let e=await gi({session_id:J(i),prompt:t});e.status===`busy`?F(x,`A turn is already running.`):e.status===`gone`&&(pi(),await _(),J(i)&&await gi({session_id:J(i),prompt:t}))}catch(e){F(x,e instanceof Error?e.message:String(e),!0),F(o,J(c).activeUserSeen,!0)}finally{F(s,!1)}}}async function b(){if(J(i))try{await _i(J(i))}catch(e){F(x,e instanceof Error?e.message:String(e),!0)}}let x=P(``),S;Sn(()=>{J(x)&&(clearTimeout(S),S=setTimeout(()=>F(x,``),4200))}),Ar(g),jr(m);let C=ht(()=>J(n)===`error`?`error`:J(o)?`working`:J(n)===`attached`?`live`:`connecting`),w=ht(()=>({error:`link down`,working:`agent working`,live:`attached`,connecting:`connecting`})[J(C)]),T=ht(()=>J(i)?J(i).slice(0,8):`········`);var ee=pa(),te=L(ee),ne=R(L(te),2),re=L(ne),ie=L(re),ae=R(ie,2),oe=L(ae),se=e=>{Z(e,xr(`link down`))},ce=e=>{Z(e,xr(`working`))},le=e=>{var t=ua(),n=L(t,!0);k(t),z(()=>Q(n,J(T))),Z(e,t)},ue=e=>{Z(e,xr(`connecting`))};$(oe,e=>{J(C)===`error`?e(se):J(C)===`working`?e(ce,1):J(C)===`live`?e(le,2):e(ue,-1)}),k(ae),k(re);var de=R(re,2),fe=R(de,2);k(ne),k(te);var pe=R(te,2),me=e=>{var t=da(),n=L(t),i=L(n,!0);k(n);var a=R(n,4);k(t),z(()=>Q(i,J(r)||`Can't reach the breakglass backend.`)),Y(`click`,a,g),Z(e,t)};$(pe,e=>{J(n)===`error`&&e(me)});var he=R(pe,2),ge=e=>{var t=fa(),n=L(t,!0);k(t),z(()=>Q(n,J(x))),Z(e,t)};$(he,e=>{J(x)&&e(ge)});var _e=R(he,2),ve=L(_e);Gi(L(ve),{get tx(){return J(c)},get rev(){return J(l)},get caughtUp(){return J(a)},get turnActive(){return J(o)},get sending(){return J(s)},get linkState(){return J(n)},onSubmit:y,onStop:b}),k(ve);var ye=R(ve,2);let be;var xe=R(L(ye),2),Se=R(L(xe),2);k(xe),la(R(xe,2),{}),k(ye),k(_e);var Ce=R(_e,2);let we;k(ee),z(()=>{ei(re,`title`,J(w)),Jr(ie,1,`lamp lamp--${J(C)??``}`,`svelte-1n46o8q`),Jr(ae,1,`lamp-text lamp-text--${J(C)??``}`,`svelte-1n46o8q`),fe.disabled=J(o)||J(s)||J(n)===`connecting`,ei(fe,`title`,J(o)?`wait for the current turn to finish`:`archive this session and start fresh`),be=Jr(ye,1,`controls-pane rise-in svelte-1n46o8q`,null,be,{open:J(d)}),we=Jr(Ce,1,`sheet-backdrop svelte-1n46o8q`,null,we,{show:J(d)})}),Y(`click`,de,()=>F(d,!0)),Y(`click`,fe,v),Y(`click`,Se,()=>F(d,!1)),Y(`click`,Ce,()=>F(d,!1)),Z(e,ee),Ue()}mr([`click`]),Tr(ma,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/app/breakglass/static/assets/index-DWHIP1Zw.css b/app/breakglass/static/assets/index-DWHIP1Zw.css deleted file mode 100644 index 79c9110..0000000 --- a/app/breakglass/static/assets/index-DWHIP1Zw.css +++ /dev/null @@ -1 +0,0 @@ -:root{--bg-0:#07090c;--bg-1:#0c1015;--bg-2:#11171e;--bg-3:#161d26;--bg-term:#06080a;--line:#1d2630;--line-strong:#2a3744;--ink:#e6edf3;--ink-dim:#9bb0c0;--ink-faint:#5d7185;--cyan:#3dd1d6;--cyan-dim:#1f6f72;--amber:#f5b657;--green:#5ddb8e;--green-dim:#1f5f3d;--danger:#ff4d4d;--danger-bright:#ff6363;--danger-deep:#7a1717;--danger-glow:#ff4d4d59;--radius:10px;--radius-sm:7px;--mono:ui-monospace, "JetBrains Mono", "SF Mono", "Cascadia Code", "Fira Code", Menlo, Consolas, "Liberation Mono", monospace;--sans:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--shadow-panel:0 1px 0 #ffffff05 inset, 0 16px 40px -24px #000000e6;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{overscroll-behavior:none;height:100%;margin:0;overflow:hidden}body{background-color:var(--bg-0);color:var(--ink);font-family:var(--sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;background-image:radial-gradient(120% 80% at 85% -10%,#3dd1d612,#0000 55%),radial-gradient(90% 70% at 10% 110%,#f5b6570a,#0000 50%),repeating-linear-gradient(0deg,#ffffff03 0 1px,#0000 1px 3px);background-attachment:fixed}#app{height:100dvh}button{font-family:var(--mono);cursor:pointer}button:disabled{cursor:not-allowed}::selection{background:#3dd1d647}*{scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line-strong);background-clip:content-box;border:2px solid #0000;border-radius:99px}::-webkit-scrollbar-thumb:hover{background:#3a4a5a padding-box content-box}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}.chip.svelte-2zgsrv{background:var(--bg-3);border:1px solid var(--line-strong);border-left:2px solid var(--cyan-dim);max-width:100%;font-family:var(--mono);vertical-align:baseline;border-radius:6px;align-items:baseline;gap:6px;margin:3px 4px 3px 0;padding:3px 9px;font-size:12px;line-height:1.45;display:inline-flex}.cog.svelte-2zgsrv{color:var(--cyan);font-size:11px;transform:translateY(1px)}.name.svelte-2zgsrv{color:var(--ink);font-weight:600}.sep.svelte-2zgsrv{color:var(--ink-faint)}.cmd.svelte-2zgsrv{color:var(--amber);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;max-width:100%;overflow:hidden}.chat.svelte-1bi93vx{background:var(--bg-1);border:1px solid var(--line);border-radius:var(--radius);height:100%;min-height:0;box-shadow:var(--shadow-panel);flex-direction:column;display:flex;overflow:hidden}.chat-head.svelte-1bi93vx{border-bottom:1px solid var(--line);background:linear-gradient(#ffffff04,#0000);align-items:baseline;gap:12px;padding:13px 18px;display:flex}.chat-head-label.svelte-1bi93vx{font-family:var(--mono);text-transform:uppercase;letter-spacing:.2em;color:var(--cyan);font-size:11px}.chat-head-hint.svelte-1bi93vx{color:var(--ink-faint);font-size:12px}.stream.svelte-1bi93vx{scroll-behavior:smooth;flex-direction:column;flex:1;gap:14px;min-height:0;padding:20px 18px 8px;display:flex;overflow-y:auto}.empty.svelte-1bi93vx{text-align:center;max-width:460px;color:var(--ink-dim);margin:auto;padding:28px 12px}.empty-mark.svelte-1bi93vx{color:var(--cyan-dim);text-shadow:0 0 24px #3dd1d640;margin-bottom:14px;font-size:40px;line-height:1}.empty-title.svelte-1bi93vx{font-family:var(--mono);color:var(--ink);margin:0 0 8px;font-size:15px}.empty-sub.svelte-1bi93vx{color:var(--ink-faint);margin:0;font-size:13px;line-height:1.6}.empty-sub.svelte-1bi93vx strong:where(.svelte-1bi93vx){color:var(--ink-dim);font-weight:600}.row.svelte-1bi93vx{display:flex}.row--user.svelte-1bi93vx{justify-content:flex-end}.row--assistant.svelte-1bi93vx{justify-content:flex-start}.bubble.svelte-1bi93vx{word-wrap:break-word;overflow-wrap:anywhere;border-radius:13px;max-width:86%;padding:11px 14px;font-size:14px;line-height:1.6}.bubble--user.svelte-1bi93vx{border:1px solid var(--cyan-dim);color:#d8f6f7;white-space:pre-wrap;font-family:var(--sans);background:linear-gradient(#15333a,#0f262c);border-bottom-right-radius:4px}.bubble--assistant.svelte-1bi93vx{background:var(--bg-2);border:1px solid var(--line-strong);color:var(--ink);border-bottom-left-radius:4px}.prose.svelte-1bi93vx{white-space:pre-wrap}.thinking.svelte-1bi93vx,.working-dots.svelte-1bi93vx{align-items:center;gap:4px;display:inline-flex}.thinking.svelte-1bi93vx span:where(.svelte-1bi93vx),.working-dots.svelte-1bi93vx span:where(.svelte-1bi93vx){background:var(--amber);opacity:.4;border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite svelte-1bi93vx-blink}.thinking.svelte-1bi93vx span:where(.svelte-1bi93vx):nth-child(2),.working-dots.svelte-1bi93vx span:where(.svelte-1bi93vx):nth-child(2){animation-delay:.18s}.thinking.svelte-1bi93vx span:where(.svelte-1bi93vx):nth-child(3),.working-dots.svelte-1bi93vx span:where(.svelte-1bi93vx):nth-child(3){animation-delay:.36s}@keyframes svelte-1bi93vx-blink{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.turn-note.svelte-1bi93vx{border-radius:var(--radius-sm);font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;flex-wrap:wrap;align-items:baseline;gap:8px;margin-top:10px;padding:7px 10px;font-size:12px;line-height:1.5;display:flex}.turn-note--ok.svelte-1bi93vx{border:1px solid var(--green-dim);color:#bff5d3;background:#5ddb8e12}.turn-note--error.svelte-1bi93vx{border:1px solid var(--danger-deep);color:#ffd5d5;background:#ff4d4d14}.turn-note-tag.svelte-1bi93vx{text-transform:uppercase;letter-spacing:.14em;opacity:.85;border:1px solid;border-radius:4px;padding:1px 6px;font-size:10px}.turn-note-body.svelte-1bi93vx{flex:1;min-width:0}.turn-note-time.svelte-1bi93vx{color:var(--ink-faint);margin-left:auto}.composer.svelte-1bi93vx{border-top:1px solid var(--line);background:linear-gradient(#0000,#ffffff03);padding:12px}.working-bar.svelte-1bi93vx{font-family:var(--mono);color:var(--amber);letter-spacing:.02em;align-items:center;gap:10px;padding:0 4px 9px;font-size:12px;display:flex}.composer-row.svelte-1bi93vx{align-items:flex-end;gap:10px;display:flex}textarea.svelte-1bi93vx{resize:none;background:var(--bg-2);min-height:48px;max-height:168px;color:var(--ink);border:1px solid var(--line-strong);border-radius:var(--radius-sm);font-family:var(--sans);field-sizing:content;outline:none;flex:1;padding:12px 13px;font-size:16px;line-height:1.5;transition:border-color .15s,box-shadow .15s}textarea.svelte-1bi93vx::placeholder{color:var(--ink-faint)}textarea.svelte-1bi93vx:focus{border-color:var(--cyan-dim);box-shadow:0 0 0 3px #3dd1d61f}textarea.svelte-1bi93vx:disabled{opacity:.55}.send.svelte-1bi93vx{border-radius:var(--radius-sm);border:1px solid var(--cyan-dim);color:#d8f6f7;letter-spacing:.04em;background:linear-gradient(#19474b,#103539);flex:none;align-self:stretch;min-width:78px;padding:0 18px;font-size:13px;font-weight:600;transition:filter .15s,border-color .15s,opacity .15s}.send.svelte-1bi93vx:hover:not(:disabled){filter:brightness(1.22);border-color:var(--cyan)}.send.svelte-1bi93vx:disabled{opacity:.4;background:var(--bg-2);border-color:var(--line-strong);color:var(--ink-faint)}.panel.svelte-1qihpg4{background:var(--bg-1);border:1px solid var(--line);border-top:2px solid var(--danger-deep);border-radius:var(--radius);height:100%;min-height:0;box-shadow:var(--shadow-panel);flex-direction:column;display:flex;overflow-y:auto}.panel-head.svelte-1qihpg4{border-bottom:1px solid var(--line);padding:14px 16px 12px}.panel-head-row.svelte-1qihpg4{align-items:center;gap:9px;display:flex}.hazard.svelte-1qihpg4{color:var(--danger);filter:drop-shadow(0 0 8px var(--danger-glow));font-size:15px}h2.svelte-1qihpg4{font-family:var(--mono);text-transform:uppercase;letter-spacing:.12em;color:var(--ink);margin:0;font-size:13px}.panel-sub.svelte-1qihpg4{color:var(--ink-faint);margin:9px 0 0;font-size:11.5px;line-height:1.55}.loading.svelte-1qihpg4{font-family:var(--mono);color:var(--ink-faint);padding:22px 16px;font-size:12px}.group.svelte-1qihpg4{border-bottom:1px solid var(--line);padding:14px 16px}.group-label.svelte-1qihpg4{font-family:var(--mono);text-transform:uppercase;letter-spacing:.18em;color:var(--ink-faint);align-items:center;gap:8px;margin-bottom:11px;font-size:10.5px;display:flex}.group-label--danger.svelte-1qihpg4{color:var(--danger-bright)}.group-tag.svelte-1qihpg4{letter-spacing:.1em;border:1px solid var(--line-strong);color:var(--ink-faint);border-radius:4px;padding:2px 6px;font-size:9.5px}.group-tag--danger.svelte-1qihpg4{border-color:var(--danger-deep);color:var(--danger-bright);background:#ff4d4d0f}.btn-row.svelte-1qihpg4{flex-wrap:wrap;gap:9px;display:flex}.vbtn.svelte-1qihpg4{border-radius:var(--radius-sm);letter-spacing:.05em;text-transform:lowercase;justify-content:center;align-items:center;gap:8px;padding:9px 15px;font-size:13px;font-weight:600;transition:filter .14s,border-color .14s,background .14s,transform 60ms;display:inline-flex}.vbtn.svelte-1qihpg4:active:not(:disabled){transform:translateY(1px)}.vbtn.svelte-1qihpg4:disabled{opacity:.4}.vbtn-label.svelte-1qihpg4{line-height:1}.vbtn--safe.svelte-1qihpg4{background:var(--bg-2);color:var(--ink);border:1px solid var(--line-strong)}.vbtn--safe.svelte-1qihpg4:hover:not(:disabled){border-color:var(--cyan-dim);background:var(--bg-3)}.danger-list.svelte-1qihpg4{flex-direction:column;gap:12px;display:flex}.danger-item.svelte-1qihpg4{border-radius:var(--radius-sm);border:1px solid #0000}.danger-item--headline.svelte-1qihpg4{border-color:var(--danger-deep);background:#ff4d4d0b;padding:11px}.vbtn--danger.svelte-1qihpg4{width:100%;color:var(--danger-bright);border:1px solid var(--danger-deep);border-left:3px solid var(--danger);text-shadow:0 0 12px var(--danger-glow);background:linear-gradient(#ff4d4d29,#ff4d4d12)}.vbtn--danger.svelte-1qihpg4:hover:not(:disabled){background:linear-gradient(180deg, var(--danger), var(--danger-bright));color:#1a0606;border-color:var(--danger-bright);text-shadow:none;filter:drop-shadow(0 4px 14px var(--danger-glow))}.vbtn--headline.svelte-1qihpg4{padding:12px 15px;font-size:14px}.headline-badge.svelte-1qihpg4{text-transform:uppercase;letter-spacing:.14em;background:var(--danger);color:#1a0606;border-radius:999px;padding:2px 7px;font-size:9px;font-weight:700}.danger-blurb.svelte-1qihpg4{color:var(--ink-faint);margin:7px 2px 0;font-size:11.5px;line-height:1.5}.danger-item--headline.svelte-1qihpg4 .danger-blurb:where(.svelte-1qihpg4){color:#f0b0b0}.confirm.svelte-1qihpg4{border:1px solid var(--danger);border-radius:var(--radius-sm);background:#ff4d4d1a;margin-top:10px;padding:11px 12px;animation:.16s ease-out svelte-1qihpg4-confirm-in}@keyframes svelte-1qihpg4-confirm-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.confirm-text.svelte-1qihpg4{color:#ffe0e0;margin-bottom:10px;font-size:12.5px;line-height:1.5;display:block}.confirm-text.svelte-1qihpg4 strong:where(.svelte-1qihpg4){color:#fff;font-family:var(--mono);text-transform:uppercase;letter-spacing:.04em}.confirm-actions.svelte-1qihpg4{gap:9px;display:flex}.confirm-yes.svelte-1qihpg4{border-radius:var(--radius-sm);border:1px solid var(--danger-bright);background:var(--danger);color:#1a0606;letter-spacing:.06em;text-transform:uppercase;flex:1;padding:9px;font-size:13px;font-weight:700;transition:filter .14s}.confirm-yes.svelte-1qihpg4:hover:not(:disabled){filter:brightness(1.12)}.confirm-no.svelte-1qihpg4{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-2);color:var(--ink-dim);letter-spacing:.04em;text-transform:uppercase;flex:1;padding:9px;font-size:13px;transition:border-color .14s,color .14s}.confirm-no.svelte-1qihpg4:hover:not(:disabled){border-color:var(--ink-faint);color:var(--ink)}.confirm-yes.svelte-1qihpg4:disabled,.confirm-no.svelte-1qihpg4:disabled{opacity:.5}.spin.svelte-1qihpg4{border:2px solid #e6edf340;border-top-color:var(--cyan);border-radius:50%;flex:none;width:13px;height:13px;animation:.7s linear infinite svelte-1qihpg4-spin}.spin--danger.svelte-1qihpg4{border-color:#ff4d4d4d;border-top-color:var(--danger-bright)}@keyframes svelte-1qihpg4-spin{to{transform:rotate(360deg)}}.out.svelte-1qihpg4{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-term);margin:14px 16px 16px;overflow:hidden}.out--ok.svelte-1qihpg4{border-color:var(--green-dim)}.out--fail.svelte-1qihpg4{border-color:var(--danger-deep)}.out-head.svelte-1qihpg4{border-bottom:1px solid var(--line);background:#ffffff05;justify-content:space-between;align-items:center;padding:8px 11px;display:flex}.out-verb.svelte-1qihpg4{font-family:var(--mono);color:var(--ink);letter-spacing:.04em;font-size:12px}.out-verb.svelte-1qihpg4:before{content:"$ pve ";color:var(--ink-faint)}.out-status.svelte-1qihpg4{font-family:var(--mono);text-transform:uppercase;letter-spacing:.1em;border:1px solid;border-radius:4px;padding:2px 7px;font-size:10.5px}.out-status--ok.svelte-1qihpg4{color:var(--green)}.out-status--fail.svelte-1qihpg4{color:var(--danger-bright)}.out-pre.svelte-1qihpg4{font-family:var(--mono);color:#c7d6e2;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;margin:0;padding:11px 12px;font-size:12px;line-height:1.55;overflow-y:auto}.out-stderr-label.svelte-1qihpg4{font-family:var(--mono);text-transform:uppercase;letter-spacing:.16em;color:var(--danger-bright);padding:6px 12px 0;font-size:10px}.out-pre--stderr.svelte-1qihpg4{color:#f3b6b6}.out-pre--empty.svelte-1qihpg4{color:var(--ink-faint);font-style:italic}.block-error.svelte-1qihpg4{border:1px solid var(--danger-deep);border-left:3px solid var(--danger);border-radius:var(--radius-sm);color:#ffd5d5;background:#ff4d4d12;margin:14px 16px;padding:11px 13px;font-size:12.5px;line-height:1.5}.retry.svelte-1qihpg4{border:1px solid var(--danger-deep);color:var(--danger-bright);background:0 0;border-radius:5px;margin-left:8px;padding:3px 9px;font-size:11px}.retry.svelte-1qihpg4:hover{background:#ff4d4d1f}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4),details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4){cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4)::-webkit-details-marker{display:none}details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4)::-webkit-details-marker{display:none}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4):before,details.out.svelte-1qihpg4>summary:where(.svelte-1qihpg4):before{content:"▾";width:11px;color:var(--ink-faint);margin-right:4px;font-size:9px;transition:transform .15s;display:inline-block}details.group.svelte-1qihpg4:not([open])>summary:where(.svelte-1qihpg4):before,details.out.svelte-1qihpg4:not([open])>summary:where(.svelte-1qihpg4):before{transform:rotate(-90deg)}details.group.svelte-1qihpg4>summary:where(.svelte-1qihpg4){padding:3px 0}.out-head.svelte-1qihpg4 .out-status:where(.svelte-1qihpg4){margin-left:auto}.out-pre.svelte-1qihpg4{max-height:46vh;overflow:auto}.shell.svelte-1n46o8q{flex-direction:column;max-width:1500px;height:100%;margin:0 auto;display:flex}.rail.svelte-1n46o8q{border-bottom:1px solid var(--line);flex:none;justify-content:space-between;align-items:center;gap:10px;padding:10px 14px;display:flex}.rail-title.svelte-1n46o8q{align-items:baseline;gap:9px;min-width:0;display:flex}.glyph.svelte-1n46o8q{filter:saturate(.85);font-size:17px;transform:translateY(2px)}h1.svelte-1n46o8q{font-family:var(--mono);letter-spacing:.02em;color:var(--ink);white-space:nowrap;margin:0;font-size:16px;font-weight:600}.accent.svelte-1n46o8q{color:var(--cyan);text-shadow:0 0 18px #3dd1d659}.rail-right.svelte-1n46o8q{flex:none;align-items:center;gap:8px;display:flex}.rail-status.svelte-1n46o8q{font-family:var(--mono);align-items:center;gap:7px;font-size:12px;display:inline-flex}.session-id.svelte-1n46o8q{color:var(--cyan);letter-spacing:.04em}.session-meta.svelte-1n46o8q{color:var(--amber)}.session-bad.svelte-1n46o8q{color:var(--danger-bright)}.dot.svelte-1n46o8q{background:var(--ink-faint);border-radius:50%;flex:none;width:9px;height:9px}.dot--ready.svelte-1n46o8q{background:var(--cyan);animation:3.4s ease-in-out infinite svelte-1n46o8q-breathe;box-shadow:0 0 10px 1px #3dd1d699}.dot--busy.svelte-1n46o8q{background:var(--amber);animation:1s ease-in-out infinite svelte-1n46o8q-pulse;box-shadow:0 0 10px 1px #f5b657b3}.dot--error.svelte-1n46o8q{background:var(--danger);box-shadow:0 0 10px 1px var(--danger-glow)}@keyframes svelte-1n46o8q-breathe{0%,to{opacity:.55}50%{opacity:1}}@keyframes svelte-1n46o8q-pulse{0%,to{opacity:.7;transform:scale(.82)}50%{opacity:1;transform:scale(1.15)}}.controls-toggle.svelte-1n46o8q,.new-session.svelte-1n46o8q{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-2);min-height:40px;color:var(--ink-dim);letter-spacing:.02em;align-items:center;gap:5px;padding:0 13px;font-size:13px;display:inline-flex}.controls-toggle.svelte-1n46o8q{color:var(--amber);border-color:#5a4a2a}.controls-toggle.svelte-1n46o8q:active,.new-session.svelte-1n46o8q:active{background:var(--bg-3)}.new-session.svelte-1n46o8q:disabled{opacity:.45}.rail-error.svelte-1n46o8q{border:1px solid var(--danger-deep);color:#ffd5d5;border-radius:var(--radius-sm);background:#ff4d4d12;border-left-width:3px;flex:none;margin:10px 12px 0;padding:11px 14px;font-size:13px;line-height:1.5}.stage.svelte-1n46o8q{flex:1;min-width:0;min-height:0;padding:10px;display:flex}.chat-pane.svelte-1n46o8q{flex:1;min-width:0;min-height:0;display:flex}.controls-pane.svelte-1n46o8q{z-index:40;background:var(--bg-1);border-top:1px solid var(--line-strong);max-height:86dvh;padding:8px 14px calc(14px + env(safe-area-inset-bottom));border-radius:16px 16px 0 0;transition:transform .26s cubic-bezier(.32,.72,0,1);position:fixed;bottom:0;left:0;right:0;overflow-y:auto;transform:translateY(101%);box-shadow:0 -18px 40px #0000008c}.controls-pane.open.svelte-1n46o8q{transform:translateY(0)}.sheet-grip.svelte-1n46o8q{background:var(--line-strong);border-radius:99px;width:38px;height:4px;margin:4px auto 10px}.controls-head.svelte-1n46o8q{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.controls-head-title.svelte-1n46o8q{font-family:var(--mono);text-transform:uppercase;letter-spacing:.2em;color:var(--amber);font-size:11px}.sheet-close.svelte-1n46o8q{border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:var(--bg-2);width:34px;height:34px;color:var(--ink-dim);font-size:14px}.sheet-backdrop.svelte-1n46o8q{z-index:30;opacity:0;pointer-events:none;background:#0000008c;border:0;padding:0;transition:opacity .22s;position:fixed;inset:0}.sheet-backdrop.show.svelte-1n46o8q{opacity:1;pointer-events:auto}@media (width>=900px){.rail.svelte-1n46o8q{padding:14px 18px}h1.svelte-1n46o8q{font-size:19px}.stage.svelte-1n46o8q{grid-template-columns:minmax(0,1fr) 372px;gap:16px;padding:16px 18px 18px;display:grid}.chat-pane.svelte-1n46o8q{display:flex}.controls-toggle.svelte-1n46o8q{display:none}.controls-pane.svelte-1n46o8q{max-height:none;box-shadow:none;z-index:auto;border:none;border-radius:0;padding:0;position:static;overflow:visible;transform:none}.sheet-grip.svelte-1n46o8q,.controls-head.svelte-1n46o8q,.sheet-backdrop.svelte-1n46o8q{display:none}} diff --git a/app/breakglass/static/assets/index-DjaW81Sq.js b/app/breakglass/static/assets/index-DjaW81Sq.js deleted file mode 100644 index f829538..0000000 --- a/app/breakglass/static/assets/index-DjaW81Sq.js +++ /dev/null @@ -1,16 +0,0 @@ -(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)}})(),typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var e={},t=Symbol(`uninitialized`),n=`http://www.w3.org/1999/xhtml`,r=Array.isArray,i=Array.prototype.indexOf,a=Array.prototype.includes,o=Array.from,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyDescriptors,u=Object.prototype,d=Array.prototype,f=Object.getPrototypeOf,p=Object.isExtensible,m=()=>{};function h(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}var _=1024,v=2048,y=4096,b=8192,x=16384,S=32768,C=1<<25,w=65536,T=1<<19,ee=1<<20,te=1<<25,ne=65536,re=1<<21,ie=1<<22,ae=1<<23,oe=Symbol(`$state`),se=Symbol(`legacy props`),ce=Symbol(``),le=Symbol(`attributes`),ue=Symbol(`class`),de=Symbol(`style`),fe=Symbol(`text`),pe=Symbol(`form reset`),me=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},he=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function ge(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function _e(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function ve(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function ye(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function be(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function xe(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Se(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ce(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function we(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Te(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Ee(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function De(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}function Oe(){console.warn(`https://svelte.dev/e/derived_inert`)}function ke(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Ae(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var E=!1;function je(e){E=e}var D;function O(t){if(t===null)throw ke(),e;return D=t}function Me(){return O(an(D))}function k(t){if(E){if(an(D)!==null)throw ke(),e;D=t}}function Ne(e=1){if(E){for(var t=e,n=D;t--;)n=an(n);D=n}}function Pe(e=!0){for(var t=0,n=D;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else (r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=an(n);e&&n.remove(),n=i}}function Fe(t){if(!t||t.nodeType!==8)throw ke(),e;return t.data}function Ie(e){return e===this.v}function Le(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Re(e){return!Le(e,this.v)}var ze=!1,Be=!1,A=null;function Ve(e){A=e}function He(e,t=!1,n){A={p:A,i:!1,c:null,e:null,s:e,x:null,r:G,l:Be&&!t?{s:null,u:null,$:[]}:null}}function Ue(e){var t=A,n=t.e;if(n!==null){t.e=null;for(var r of n)Sn(r)}return e!==void 0&&(t.x=e),t.i=!0,A=t.p,e??{}}function We(){return!Be||A!==null&&A.l===null}var Ge=[];function Ke(){var e=Ge;Ge=[],h(e)}function qe(e){if(Ge.length===0&&!Et){var t=Ge;queueMicrotask(()=>{t===Ge&&Ke()})}Ge.push(e)}function Je(){for(;Ge.length>0;)Ke()}function Ye(e){var t=G;if(t===null)return H.f|=ae,e;if(!(t.f&32768)&&!(t.f&4))throw e;Xe(e,t)}function Xe(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}var Ze=~(v|y|_);function j(e,t){e.f=e.f&Ze|t}function Qe(e){e.f&512||e.deps===null?j(e,_):j(e,y)}function $e(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=ne,$e(t.deps))}function et(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),$e(e.deps),j(e,_)}var tt=!1,nt=!1;function rt(e){var t=nt;try{return nt=!1,[e(),nt]}finally{nt=t}}function it(e){let t=0,n=Gt(0),r;return()=>{yn()&&(Y(n),En(()=>(t===0&&(r=or(()=>e(()=>Yt(n)))),t+=1,()=>{qe(()=>{--t,t===0&&(r?.(),r=void 0,Yt(n))})})))}}var at=w|T;function ot(e,t,n,r){new st(e,t,n,r)}var st=class{parent;is_pending=!1;transform_error;#e;#t=E?D:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=it(()=>(this.#m=Gt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=G;t.b=this,t.f|=128,n(e)},this.parent=G.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=Dn(()=>{if(E){let e=this.#t;Me();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},at),E&&(this.#e=D)}#g(){try{this.#a=B(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=B(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=B(()=>e(this.#e)),qe(()=>{var e=this.#c=document.createDocumentFragment(),t=I();e.append(t),this.#a=this.#x(()=>B(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,Nn(this.#o,()=>{this.#o=null}),this.#b(M))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=B(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Ln(this.#a,e);let t=this.#n.pending;this.#o=B(()=>t(this.#e))}else this.#b(M)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){et(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=G,n=H,r=A;Hn(this.#i),W(this.#i),Ve(this.#i.ctx);try{return Mt.ensure(),e()}catch(e){return Ye(e),null}finally{Hn(t),W(n),Ve(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&Nn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,qe(()=>{this.#d=!1,this.#m&&qt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),Y(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;M?.is_fork?(this.#a&&M.skip_effect(this.#a),this.#o&&M.skip_effect(this.#o),this.#s&&M.skip_effect(this.#s),M.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(V(this.#a),null),this.#o&&=(V(this.#o),null),this.#s&&=(V(this.#s),null),E&&(O(this.#t),Ne(),O(Pe()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Ae();return}r=!0,i&&De(),this.#s!==null&&Nn(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){Xe(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return B(()=>{var t=G;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return Xe(e,this.#i.parent),null}}))};qe(()=>{var t;try{t=this.transform_error(e)}catch(e){Xe(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>Xe(e,this.#i&&this.#i.parent)):o(t)})}};function ct(e,t,n,r){let i=We()?ft:gt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=G,c=lt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){Xe(e,s)}ut()}}var d=dt();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>mt(e))).then(u).catch(e=>Xe(e,s)).finally(d)}l?l.then(()=>{c(),f(),ut()}):f()}function lt(){var e=G,t=H,n=A,r=M;return function(i=!0){Hn(e),W(t),Ve(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function ut(e=!0){Hn(null),W(null),Ve(null),e&&M?.deactivate()}function dt(){var e=G,t=e.b,n=M,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function ft(e){var n=2|v;return G!==null&&(G.f|=T),{ctx:A,deps:null,effects:null,equals:Ie,f:n,fn:e,reactions:null,rv:0,v:t,wv:0,parent:G,ac:null}}var pt=Symbol(`obsolete`);function mt(e,n,r){let i=G;i===null&&_e();var a=void 0,o=Gt(t),s=!H,c=new Set;return Tn(()=>{var t=G,n=g();a=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==me&&n.reject(e)}).finally(ut)}catch(e){n.reject(e),ut()}var r=M;if(s){if(t.f&32768)var l=dt();if(i.b?.is_rendered())r.async_deriveds.get(t)?.reject(pt);else for(let e of c.values())e.reject(pt);c.add(n),r.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),c.delete(n),t!==pt&&(r.activate(),t?(o.f|=ae,qt(o,t)):(o.f&8388608&&(o.f^=ae),qt(o,e)),r.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),bn(()=>{for(let e of c)e.reject(pt)}),new Promise(e=>{function t(n){function r(){n===a?e(o):t(a)}n.then(r,r)}t(a)})}function ht(e){let t=ft(e);return ze||Wn(t),t}function gt(e){let t=ft(e);return t.equals=Re,t}function _t(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;nthis.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)j(r,v),t(r);for(r of n.m)j(r,y),t(r)}this.#p.add(e)}#g(){this.#e=!0,At++>1e3&&(this.#S(),Pt());for(let e of this.#u)this.#d.delete(e),j(e,v),this.schedule(e);for(let e of this.#d)j(e,y),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Ot=[],r=[],i=kt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw Vt(e),this.#h()||this.discard(),t}if(M=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Ot=null,kt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)Bt(e,t);i.length>0&&M.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),wt=this,It(r),It(n),wt=null,this.#s?.resolve();var s=M;if(this.#a===0&&(this.#c.length===0||s!==null)&&(this.#S(),ze&&(this.#x(),M=s)),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=_;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=_:i&4?t.push(r):ze&&i&16777224?n.push(r):Zn(r)&&(i&16&&this.#d.add(r),nr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),j(i,v),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),M=this,this.#g()}#b(e){for(var t=0;t!u.current.get(e)[1]);if(!(!u.#e||r.length===0)){var i=r.filter(e=>!this.current.has(e));if(i.length===0)e&&u.discard();else if(t.length>0){if(e)for(let e of this.#p)u.unskip_effect(e,e=>{e.f&4194320?u.schedule(e):u.#b([e])});u.activate();var a=new Set,o=new Map;for(var s of t)Lt(s,i,a,o);o=new Map;var c=[...u.current].filter(([e,t])=>{let n=this.current.get(e);return n?n[0]!==t[0]||n[1]!==t[1]:!0}).map(([e])=>e);if(c.length>0)for(let e of this.#l)!(e.f&155648)&&Rt(e,c,o)&&(e.f&4194320?(j(e,v),u.schedule(e)):u.#u.add(e));if(u.#c.length>0&&!u.#m){u.apply();for(var l of u.#c)u.#_(l,[],[]);u.#c=[]}u.deactivate()}}}}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,qe(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=g()).promise}static ensure(){if(M===null){let t=M=new e;!Dt&&!Et&&qe(()=>{t.#e||t.flush()})}return M}apply(){if(!ze||!this.is_fork&&this.#t===null&&this.#n===null){N=null;return}N=new Map;for(let[e,[t]]of this.current)N.set(e,t);for(let t=St;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id0)){Ut.clear();for(let e of Ft){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Ft.has(n)&&(Ft.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||nr(n)}}Ft.clear()}}Ft=null}}function Lt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Lt(i,t,n,r):e&4194320&&!(e&2048)&&Rt(i,t,r)&&(j(i,v),zt(i))}}function Rt(e,t,n){let r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(let r of e.deps){if(a.call(t,r))return!0;if(r.f&2&&Rt(r,t,n))return n.set(r,!0),!0}return n.set(e,!1),!1}function zt(e){M.schedule(e)}function Bt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),j(e,_);for(var n=e.first;n!==null;)Bt(n,t),n=n.next}}function Vt(e){j(e,_);for(var t=e.first;t!==null;)Vt(t),t=t.next}var Ht=new Set,Ut=new Map,Wt=!1;function Gt(e,t){return{f:0,v:e,reactions:null,equals:Ie,rv:0,wv:0}}function P(e,t){let n=Gt(e,t);return Wn(n),n}function Kt(e,t=!1,n=!0){let r=Gt(e);return t||(r.equals=Re),Be&&n&&A!==null&&A.l!==null&&(A.l.s??=[]).push(r),r}function F(e,t,n=!1){return H!==null&&(!U||H.f&131072)&&We()&&H.f&4325394&&(Un===null||!Un.has(e))&&Ee(),qt(e,n?Zt(t):t,kt)}function qt(e,t,n=null){if(!e.equals(t)){Ut.set(e,Bn?t:e.v);var r=Mt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&vt(t),N===null&&Qe(t)}e.wv=Xn(),Xt(e,v,n),We()&&G!==null&&G.f&1024&&!(G.f&96)&&(J===null?Gn([e]):J.push(e)),!r.is_fork&&Ht.size>0&&!Wt&&Jt()}return t}function Jt(){Wt=!1;for(let e of Ht){e.f&1024&&j(e,y);let t;try{t=Zn(e)}catch{t=!0}t&&nr(e)}Ht.clear()}function Yt(e){F(e,e.v+1)}function Xt(e,t,n){var r=e.reactions;if(r!==null)for(var i=We(),a=r.length,o=0;o{if(Jn===l)return e();var t=H,n=Jn;W(null),Yn(l);var r=e();return W(t),Yn(n),r};return a&&i.set(`length`,P(e.length,s)),new Proxy(e,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&we();var r=i.get(t);return r===void 0?p(()=>{var e=P(n.value,s);return i.set(t,e),e}):F(r,n.value,!0),!0},deleteProperty(e,n){var r=i.get(n);if(r===void 0){if(n in e){let e=p(()=>P(t,s));i.set(n,e),Yt(o)}}else F(r,t),Yt(o);return!0},get(n,r,a){if(r===oe)return e;var o=i.get(r),l=r in n;if(o===void 0&&(!l||c(n,r)?.writable)&&(o=p(()=>P(Zt(l?n[r]:t),s)),i.set(r,o)),o!==void 0){var u=Y(o);return u===t?void 0:u}return Reflect.get(n,r,a)},getOwnPropertyDescriptor(e,n){var r=Reflect.getOwnPropertyDescriptor(e,n);if(r&&`value`in r){var a=i.get(n);a&&(r.value=Y(a))}else if(r===void 0){var o=i.get(n),s=o?.v;if(o!==void 0&&s!==t)return{enumerable:!0,configurable:!0,value:s,writable:!0}}return r},has(e,n){if(n===oe)return!0;var r=i.get(n),a=r!==void 0&&r.v!==t||Reflect.has(e,n);return(r!==void 0||G!==null&&(!a||c(e,n)?.writable))&&(r===void 0&&(r=p(()=>P(a?Zt(e[n]):t,s)),i.set(n,r)),Y(r)===t)?!1:a},set(e,n,r,l){var u=i.get(n),d=n in e;if(a&&n===`length`)for(var f=r;fP(t,s)),i.set(f+``,m)):F(m,t)}if(u===void 0)(!d||c(e,n)?.writable)&&(u=p(()=>P(void 0,s)),F(u,Zt(r)),i.set(n,u));else{d=u.v!==t;var h=p(()=>Zt(r));F(u,h)}var g=Reflect.getOwnPropertyDescriptor(e,n);if(g?.set&&g.set.call(l,r),!d){if(a&&typeof n==`string`){var _=i.get(`length`),v=Number(n);Number.isInteger(v)&&v>=_.v&&F(_,v+1)}Yt(o)}return!0},ownKeys(e){Y(o);var n=Reflect.ownKeys(e).filter(e=>{var n=i.get(e);return n===void 0||n.v!==t});for(var[r,a]of i)a.v!==t&&!(r in e)&&n.push(r);return n},setPrototypeOf(){Te()}})}new Set([`copyWithin`,`fill`,`pop`,`push`,`reverse`,`shift`,`sort`,`splice`,`unshift`]);var Qt,$t,en,tn;function nn(){if(Qt===void 0){Qt=window,$t=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;en=c(t,`firstChild`).get,tn=c(t,`nextSibling`).get,p(e)&&(e[ue]=void 0,e[le]=null,e[de]=void 0,e.__e=void 0),p(n)&&(n[fe]=void 0)}}function I(e=``){return document.createTextNode(e)}function rn(e){return en.call(e)}function an(e){return tn.call(e)}function L(e,t){if(!E)return rn(e);var n=rn(D);if(n===null)n=D.appendChild(I());else if(t&&n.nodeType!==3){var r=I();return n?.before(r),O(r),r}return t&&un(n),O(n),n}function on(e,t=!1){if(!E){var n=rn(e);return n instanceof Comment&&n.data===``?an(n):n}if(t){if(D?.nodeType!==3){var r=I();return D?.before(r),O(r),r}un(D)}return D}function R(e,t=1,n=!1){let r=E?D:e;for(var i;t--;)i=r,r=an(r);if(!E)return r;if(n){if(r?.nodeType!==3){var a=I();return r===null?i?.after(a):r.before(a),O(a),a}un(r)}return O(r),r}function sn(e){e.textContent=``}function cn(){return!ze||Ft!==null?!1:(G.f&S)!==0}function ln(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function un(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function dn(e){E&&rn(e)!==null&&sn(e)}var fn=!1;function pn(){fn||(fn=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[pe]?.()})},{capture:!0}))}function mn(e){var t=H,n=G;W(null),Hn(null);try{return e()}finally{W(t),Hn(n)}}function hn(e,t,n,r=n){e.addEventListener(t,()=>mn(n));let i=e[pe];i?e[pe]=()=>{i(),r(!0)}:e[pe]=()=>r(!0),pn()}function gn(e){G===null&&(H===null&&xe(e),be()),Bn&&ye(e)}function _n(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function vn(e,t){var n=G;n!==null&&n.f&8192&&(e|=b);var r={ctx:A,deps:null,nodes:null,f:e|v|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};M?.register_created_effect(r);var i=r;if(e&4)Ot===null?Mt.ensure().schedule(r):Ot.push(r);else if(t!==null){try{nr(r)}catch(e){throw V(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=w))}if(i!==null&&(i.parent=n,n!==null&&_n(i,n),H!==null&&H.f&2&&!(e&64))){var a=H;(a.effects??=[]).push(i)}return r}function yn(){return H!==null&&!U}function bn(e){let t=vn(8,null);return j(t,_),t.teardown=e,t}function xn(e){gn(`$effect`);var t=G.f;if(!H&&t&32&&A!==null&&!A.i){var n=A;(n.e??=[]).push(e)}else return Sn(e)}function Sn(e){return vn(4|ee,e)}function Cn(e){Mt.ensure();let t=vn(64|T,e);return(e={})=>new Promise(n=>{e.outro?Nn(t,()=>{V(t),n(void 0)}):(V(t),n(void 0))})}function wn(e){return vn(4,e)}function Tn(e){return vn(ie|T,e)}function En(e,t=0){return vn(8|t,e)}function z(e,t=[],n=[],r=[]){ct(r,t,n,t=>{vn(8,()=>{e(...t.map(Y))})})}function Dn(e,t=0){return vn(16|t,e)}function B(e){return vn(32|T,e)}function On(e){var t=e.teardown;if(t!==null){let e=Bn,n=H;Vn(!0),W(null);try{t.call(null)}finally{Vn(e),W(n)}}}function kn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&mn(()=>{e.abort(me)});var r=n.next;n.f&64?n.parent=null:V(n,t),n=r}}function An(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||V(t),t=n}}function V(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(jn(e.nodes.start,e.nodes.end),n=!0),e.f|=C,kn(e,t&&!n),tr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();On(e),e.f^=C,e.f|=x;var i=e.parent;i!==null&&i.first!==null&&Mn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function jn(e,t){for(;e!==null;){var n=e===t?null:an(e);e.remove(),e=n}}function Mn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Nn(e,t,n=!0){var r=[];Pn(e,r,!0);var i=()=>{n&&V(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Pn(e,t,n){if(!(e.f&8192)){e.f^=b;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Pn(i,t,o?n:!1)}i=a}}}function Fn(e){In(e,!0)}function In(e,t){if(e.f&8192){e.f^=b,e.f&1024||(j(e,v),Mt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;In(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Ln(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:an(n);t.append(n),n=i}}var Rn=null,zn=!1,Bn=!1;function Vn(e){Bn=e}var H=null,U=!1;function W(e){H=e}var G=null;function Hn(e){G=e}var Un=null;function Wn(e){H!==null&&(!ze||H.f&2)&&(Un??=new Set).add(e)}var K=null,q=0,J=null;function Gn(e){J=e}var Kn=1,qn=0,Jn=qn;function Yn(e){Jn=e}function Xn(){return++Kn}function Zn(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~ne),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&N===null&&j(e,_)}return!1}function Qn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!ze&&Un!==null&&Un.has(e)))for(var i=0;i{e.ac.abort(me)}),e.ac=null);try{e.f|=re;var u=e.fn,d=u();e.f|=S;var f=e.deps,p=M?.is_fork;if(K!==null){var m;if(p||tr(e,q),f!==null&&q>0)for(f.length=q+K.length,m=0;m{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),Nt()}function Y(e){var t=(e.f&2)!=0;if(Rn?.add(e),H!==null&&!U&&!(G!==null&&G.f&16384)&&(Un===null||!Un.has(e))){var n=H.deps;if(H.f&2097152)e.rvn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?qe(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function dr(e,t,n,r,i){var a={capture:r,passive:i},o=ur(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&bn(()=>{t.removeEventListener(e,o,a)})}function fr(e,t,n){(t[sr]??={})[e]=n}function pr(e){for(var t=0;t{throw e});throw p}}finally{e[sr]=t,delete e.currentTarget,W(d),Hn(f)}}}var gr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function _r(e){return gr?.createHTML(e)??e}function vr(e){var t=ln(`template`);return t.innerHTML=_r(e.replaceAll(``,``)),t.content}function yr(e,t){var n=G;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function X(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(E)return yr(D,null),D;i===void 0&&(i=vr(a?e:``+e),n||(i=rn(i)));var t=r||$t?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=rn(t),s=t.lastChild;yr(o,s)}else yr(t,t);return t}}function br(){if(E)return yr(D,null),D;var e=document.createDocumentFragment(),t=document.createComment(``),n=I();return e.append(t,n),yr(t,n),e}function Z(e,t){if(E){var n=G;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=D),Me();return}e!==null&&e.before(t)}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var xr=[`touchstart`,`touchmove`];function Sr(e){return xr.includes(e)}function Q(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[fe]??=e.nodeValue)&&(e[fe]=n,e.nodeValue=`${n}`)}function Cr(e,t){return Tr(e,t)}var wr=new Map;function Tr(t,{target:n,anchor:r,props:i={},events:a,context:s,intro:c=!0,transformError:l}){nn();var u=void 0,d=Cn(()=>{var c=r??n.appendChild(I());ot(c,{pending:()=>{}},n=>{He({});var r=A;if(s&&(r.c=s),a&&(i.$$events=a),E&&yr(n,null),u=t(n,i)||{},E&&(G.nodes.end=D,D===null||D.nodeType!==8||D.data!==`]`))throw ke(),e;Ue()},l);var d=new Set,f=e=>{for(var t=0;t{for(var e of d)for(let r of[n,document]){var t=wr.get(r),i=t.get(e);--i==0?(r.removeEventListener(e,hr),t.delete(e),t.size===0&&wr.delete(r)):t.set(e,i)}lr.delete(f),c!==r&&c.parentNode?.removeChild(c)}});return Er.set(u,d),u}var Er=new WeakMap,Dr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)Fn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(Fn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(V(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Ln(r,t),t.append(I()),this.#n.set(e,{effect:r,fragment:t})}else V(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Nn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(V(n.effect),this.#n.delete(e))};ensure(e,t){var n=M,r=cn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=I();i.append(a),this.#n.set(e,{effect:B(()=>t(a)),fragment:i})}else this.#t.set(e,B(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else E&&(this.anchor=D),this.#a(n)}};function Or(e){A===null&&ge(`onMount`),Be&&A.l!==null?kr(A).m.push(e):xn(()=>{let t=or(e);if(typeof t==`function`)return t})}function kr(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}function $(e,t,n=!1){var r;E&&(r=D,Me());var i=new Dr(e),a=n?w:0;function o(e,t){if(E){var n=Fe(r);if(e!==parseInt(n.substring(1))){var a=Pe();O(a),i.anchor=a,je(!1),i.ensure(e,t),je(!0);return}}i.ensure(e,t)}Dn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Ar(e,t){return t}function jr(e,t,n){for(var r=[],i=t.length,a,s=t.length,c=0;c{if(a){if(a.pending.delete(n),a.done.add(n),a.pending.size===0){var t=e.outrogroups;Mr(e,o(a.done)),t.delete(a),t.size===0&&(e.outrogroups=null)}}else --s},!1)}if(s===0){var l=r.length===0&&n!==null;if(l){var u=n,d=u.parentNode;sn(d),d.append(u),e.items.clear()}Mr(e,t,!l)}else a={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(a)}function Mr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=n();return r(e)?e:e==null?[]:o(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Ir(v,p,c,t,i),d!==null&&(p.length===0?d.f&33554432?(d.f^=te,Rr(d,null,c)):Fn(d):Nn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:Dn(()=>{p=Y(f);var e=p.length;let r=!1;E&&Fe(c)===`[!`!=(e===0)&&(c=Pe(),O(c),je(!1),r=!0);for(var o=new Set,u=M,v=cn(),y=0;ys(c)):(d=B(()=>s(Nr??=I())),d.f|=te)),e>o.size&&ve(``,``,``),E&&e>0&&O(Pe()),!h)if(m.set(u,o),v){for(let[e,t]of l)o.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);r&&je(!0),Y(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,E&&(c=D)}function Fr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Ir(e,t,n,r,i){var a=(r&8)!=0,s=t.length,c=e.items,l=Fr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(a)for(v=0;v0){var ee=r&4&&s===0?n:null;if(a){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Lr(e,t,n,r,i,a,o,s){var c=o&1?o&16?Gt(n):Kt(n,!1,!1):null,l=o&2?Gt(i):null;return{v:c,i:l,e:B(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Rr(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=an(r);if(a.before(r),r===i)return;r=o}}function zr(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}var Br=[...` -\r\f\xA0\v`];function Vr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Br.includes(r[o-1]))&&(s===r.length||Br.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Hr(e,t,n,r,i,a){var o=e[ue];if(E||o!==n||o===void 0){var s=Vr(n,r,a);(!E||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[ue]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}var Ur=Symbol(`is custom element`),Wr=Symbol(`is html`),Gr=he?`link`:`LINK`;function Kr(e,t,n,r){var i=qr(e);E&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Gr)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[ce]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Yr(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function qr(e){return e[le]??={[Ur]:e.nodeName.includes(`-`),[Wr]:e.namespaceURI===n}}var Jr=new Map;function Yr(e){var t=e.getAttribute(`is`)||e.nodeName,n=Jr.get(t);if(n)return n;Jr.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=l(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.push(o);i=f(i)}return n}function Xr(e,t,n=t){var r=new WeakSet;hn(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Zr(e)?Qr(a):a,n(a),M!==null&&r.add(M),await rr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(E&&e.defaultValue!==e.value||or(t)==null&&e.value)&&(n(Zr(e)?Qr(e.value):e.value),M!==null&&r.add(M)),En(()=>{var n=t();if(e===document.activeElement){var i=ze?wt:M;if(r.has(i))return}Zr(e)&&n===Qr(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function Zr(e){var t=e.type;return t===`number`||t===`range`}function Qr(e){return e===``?null:+e}function $r(e,t){return e===t||e?.[oe]===t}function ei(e={},t,n,r){var i=A.r,a=G;return wn(()=>{var o,s;return En(()=>{o=s,s=r?.()||[],or(()=>{$r(n(...s),e)||(t(e,...s),o&&$r(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&$r(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function ti(e,t,n,r){var i=!Be||(n&2)!=0,a=(n&8)!=0,o=(n&16)!=0,s=r,l=!0,u=void 0,d=()=>o&&i?(u??=ft(r),Y(u)):(l&&(l=!1,s=o?or(r):r),s);let f;if(a){var p=oe in e||se in e;f=c(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=rt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Ce(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(s=void 0),n===void 0?s:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?ft:gt)(()=>(v=!1,g()));a&&Y(y);var b=G;return(function(e,t){if(arguments.length>0){let n=t?Y(y):i&&a?Zt(e):e;return F(y,n),v=!0,s!==void 0&&(s=n),e}return Bn&&v||b.f&16384?y.v:Y(y)})}function ni(e){let t=[];for(let n of e.split(` -`)){let e=n.replace(/\r$/,``);if(!e.startsWith(`:`)){if(e===`data:`||e===`data`)t.push(``);else if(e.startsWith(`data:`)){let n=e.slice(5);n.startsWith(` `)&&(n=n.slice(1)),t.push(n)}}}return t.length===0?null:t.join(` -`)}var ri=class{constructor(){this.buffer=``}push(e){this.buffer+=e;let t=[],n;for(;(n=this._nextDelimiter())!==-1;){let e=this.buffer.slice(0,n.start);this.buffer=this.buffer.slice(n.end),e.length>0&&t.push(e)}return t}flush(){let e=this.buffer.trim();return this.buffer=``,e?[e]:[]}_nextDelimiter(){let e=[{token:`\r -\r -`,i:this.buffer.indexOf(`\r -\r -`)},{token:` - -`,i:this.buffer.indexOf(` - -`)},{token:`\r\r`,i:this.buffer.indexOf(`\r\r`)}].filter(e=>e.i!==-1);if(e.length===0)return-1;e.sort((e,t)=>e.i-t.i);let{token:t,i:n}=e[0];return{start:n,end:n+t.length}}};async function ii(e,t){if(!e.ok)throw Error(`server returned ${e.status} ${e.statusText}`);if(!e.body)throw Error(`response has no readable body (streaming unsupported)`);let n=e.body.getReader(),r=new TextDecoder,i=new ri,a=e=>{let n=ni(e);if(n==null||n.trim()===``)return;let r;try{r=JSON.parse(n)}catch{return}t(r)};try{for(;;){let{value:e,done:t}=await n.read();if(t)break;let o=r.decode(e,{stream:!0});for(let e of i.push(o))a(e)}}finally{n.releaseLock?.()}let o=r.decode();if(o)for(let e of i.push(o))a(e);for(let e of i.flush())a(e)}async function ai(){let e=await fetch(`/api/session`,{method:`POST`,headers:{"content-type":`application/json`}});if(!e.ok)throw Error(`could not open a session (HTTP ${e.status})`);let t=await e.json();if(!t||typeof t.session_id!=`string`)throw Error(`session response missing session_id`);return t.session_id}async function oi({session_id:e,prompt:t,model:n,signal:r},i){let a={session_id:e,prompt:t};n&&(a.model=n),await ii(await fetch(`/api/chat`,{method:`POST`,headers:{"content-type":`application/json`,accept:`text/event-stream`},body:JSON.stringify(a),signal:r}),i)}async function si(){let e=await fetch(`/api/pve/verbs`);if(!e.ok)throw Error(`could not load VM controls (HTTP ${e.status})`);let t=await e.json();return{verbs:Array.isArray(t.verbs)?t.verbs:[],mutating:Array.isArray(t.mutating)?t.mutating:[]}}async function ci(e){let t=await fetch(`/api/pve/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`}}),n;try{n=await t.json()}catch{throw Error(`VM control '${e}' failed (HTTP ${t.status}, no body)`)}if(t.status===400)throw Error(n?.detail||`'${e}' was rejected by the server`);return{verb:n.verb??e,exit_code:n.exit_code??null,stdout:n.stdout??``,stderr:n.stderr??``,rejected:!!n.rejected}}var li=X(` `,1),ui=X(` `);function di(e,t){let n=ti(t,`name`,3,`tool`),r=ti(t,`command`,3,``);var i=ui(),a=R(L(i),2),o=L(a,!0);k(a);var s=R(a,2),c=e=>{var t=li(),n=R(on(t),2),i=L(n,!0);k(n),z(()=>Q(i,r())),Z(e,t)};$(s,e=>{r()&&e(c)}),k(i),z(()=>{Kr(i,`title`,r()?`${n()}: ${r()}`:n()),Q(o,n())}),Z(e,i)}var fi=X(`

The agent is standing by.

Describe the symptom — "devvm is unreachable", "disk full", "ssh hangs" - — and it will connect over SSH, investigate, and stream its work here. - For a hard power action when the agent can't help, use Direct VM control.

`),pi=X(`
`),mi=X(``),hi=X(` `),gi=X(`
`),_i=X(` `),vi=X(` `),yi=X(`
`),bi=X(`
`),xi=X(`
agent working — streaming live
`),Si=X(`
Recovery agent SSHes into the devvm to diagnose & repair
`);function Ci(e,t){He(t,!0);let n=ti(t,`sessionId`,3,``),r=ti(t,`sessionReady`,3,!1),i=ti(t,`onLiveSession`,3,e=>{}),a=ti(t,`onStreamingChange`,3,e=>{}),o=P(Zt([])),s=P(``),c=P(!1),l,u,d=!0,f=ht(()=>r()&&!Y(c)&&Y(s).trim().length>0);function p(){l&&(d=l.scrollHeight-l.scrollTop-l.clientHeight<60)}async function m(e=!1){!e&&!d||(await rr(),l&&(l.scrollTop=l.scrollHeight))}function h(){return Y(o)[Y(o).length-1]}function g(e){let t=h().parts,n=t[t.length-1];n&&n.type===`text`?n.text+=e:t.push({type:`text`,text:e}),F(o,Y(o),!0)}function _(e){switch(e?.kind){case`session`:i()(e.session_id);break;case`text`:e.text&&g(e.text);break;case`tool`:{let t=e.input&&typeof e.input.command==`string`?e.input.command:``;h().parts.push({type:`tool`,name:e.name||`tool`,command:t}),F(o,Y(o),!0);break}case`result`:h().result={is_error:!!e.is_error,text:typeof e.result==`string`?e.result:``,duration_ms:typeof e.duration_ms==`number`?e.duration_ms:null},F(o,Y(o),!0);break;case`error`:h().error=e.error||`unknown error`,F(o,Y(o),!0);break;case`done`:break;default:break}m()}async function v(){let e=Y(s).trim();if(!(!e||Y(c)||!r())){Y(o).push({role:`user`,text:e}),Y(o).push({role:`assistant`,parts:[]}),F(o,Y(o),!0),F(s,``),F(c,!0),a()(!0),d=!0,await m(!0);try{await oi({session_id:n(),prompt:e},_)}catch(e){let t=h();t&&t.role===`assistant`&&!t.error&&(t.error=(e instanceof Error?e.message:String(e))+` — the connection to the agent failed.`,F(o,Y(o),!0))}finally{F(c,!1),a()(!1),await m(),u?.focus()}}}function y(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),v())}function b(e){return e==null?``:e<1e3?`${e} ms`:`${(e/1e3).toFixed(+(e<1e4))} s`}let x=ht(()=>Y(o).length===0);var S=Si(),C=R(L(S),2),w=L(C),T=e=>{Z(e,fi())};$(w,e=>{Y(x)&&e(T)}),Pr(R(w,2),17,()=>Y(o),Ar,(e,t)=>{var n=br(),r=on(n),i=e=>{var n=pi(),r=L(n),i=L(r,!0);k(r),k(n),z(()=>Q(i,Y(t).text)),Z(e,n)},a=e=>{var n=bi(),r=L(n),i=L(r),a=e=>{Z(e,mi())};$(i,e=>{Y(t).parts.length===0&&!Y(t).result&&!Y(t).error&&e(a)});var o=R(i,2);Pr(o,17,()=>Y(t).parts,Ar,(e,t)=>{var n=br(),r=on(n),i=e=>{var n=hi(),r=L(n,!0);k(n),z(()=>Q(r,Y(t).text)),Z(e,n)},a=e=>{di(e,{get name(){return Y(t).name},get command(){return Y(t).command}})};$(r,e=>{Y(t).type===`text`?e(i):e(a,-1)}),Z(e,n)});var s=R(o,2),c=e=>{var n=gi(),r=L(n);k(n),z(()=>Q(r,`⚠ ${Y(t).error??``}`)),Z(e,n)},l=e=>{var n=yi(),r=L(n),i=L(r,!0);k(r);var a=R(r,2),o=e=>{var n=_i(),r=L(n,!0);k(n),z(()=>Q(r,Y(t).result.text)),Z(e,n)};$(a,e=>{Y(t).result.text&&e(o)});var s=R(a,2),c=e=>{var n=vi(),r=L(n,!0);k(n),z(e=>Q(r,e),[()=>b(Y(t).result.duration_ms)]),Z(e,n)};$(s,e=>{Y(t).result.duration_ms!=null&&e(c)}),k(n),z(()=>{Hr(n,1,`turn-note ${Y(t).result.is_error?`turn-note--error`:`turn-note--ok`}`,`svelte-1bi93vx`),Q(i,Y(t).result.is_error?`failed`:`done`)}),Z(e,n)};$(s,e=>{Y(t).error?e(c):Y(t).result&&e(l,1)}),k(r),k(n),Z(e,n)};$(r,e=>{Y(t).role===`user`?e(i):e(a,-1)}),Z(e,n)}),k(C),ei(C,e=>l=e,()=>l);var ee=R(C,2),te=L(ee),ne=e=>{Z(e,xi())};$(te,e=>{Y(c)&&e(ne)});var re=R(te,2),ie=L(re);dn(ie),ei(ie,e=>u=e,()=>u);var ae=R(ie,2),oe=L(ae,!0);k(ae),k(re),k(ee),k(S),z(()=>{Kr(ie,`placeholder`,r()?`Describe the problem… (Enter to send · Shift+Enter for a new line)`:`Waiting for a session…`),ie.disabled=!r()||Y(c),ae.disabled=!Y(f),Q(oe,Y(c)?`…`:`Send`)}),dr(`scroll`,C,p),dr(`submit`,ee,e=>{e.preventDefault(),v()}),fr(`keydown`,ie,y),Xr(ie,()=>Y(s),e=>F(s,e)),Z(e,S),Ue()}pr([`keydown`]);var wi=X(`
Loading controls…
`),Ti=X(``),Ei=X(``),Di=X(``),Oi=X(``),ki=X(`recovery`),Ai=X(`
Confirm ? This will affect the running VM
`),ji=X(`

`),Mi=X(``),Ni=X(`rejected`),Pi=X(` `),Fi=X(`
 
`),Ii=X(`
stderr
 
`,1),Li=X(`
(no output)
`),Ri=X(`
`),zi=X(`
Inspect read-only
Power affects the running VM
`,1),Bi=X(`

Direct VM control

No AI in the path — these reach the Proxmox host over a - forced-command SSH key and work even when the agent is down.

`);function Vi(e,t){He(t,!0);let n={status:{label:`status`,blurb:`qm status — is the VM up?`},forensics:{label:`forensics`,blurb:`capture live diagnostic state`},start:{label:`start`,blurb:`power on a stopped VM`},stop:{label:`stop`,blurb:`hard power-off (pulls the plug)`},reset:{label:`reset`,blurb:`warm reboot — reuses the QEMU process`},cycle:{label:`cycle`,blurb:`stop → start; applies staged config; fixes a wedged QEMU`,headline:!0}},r=[`status`,`forensics`,`start`,`stop`,`reset`,`cycle`],i=P(`loading`),a=P(``),o=P(Zt([])),s=P(``),c=P(``),l=P(null),u=P(``),d=ht(()=>Y(c)!==``);Or(async()=>{try{let{verbs:e,mutating:t}=await si(),a=new Set(t),s=e.filter(e=>n[e]);F(o,[...r.filter(e=>s.includes(e)),...s.filter(e=>!r.includes(e))].map(e=>({name:e,mutating:a.has(e),...n[e]})),!0),F(i,`ready`)}catch(e){F(i,`error`),F(a,e instanceof Error?e.message:String(e),!0)}});let f=ht(()=>Y(o).filter(e=>!e.mutating)),p=ht(()=>Y(o).filter(e=>e.mutating));function m(e){Y(d)||(e.mutating?F(s,Y(s)===e.name?``:e.name,!0):g(e.name))}function h(){F(s,``)}async function g(e){F(s,``),F(u,``),F(l,null),F(c,e,!0);try{F(l,await ci(e),!0)}catch(e){F(u,e instanceof Error?e.message:String(e),!0)}finally{F(c,``)}}let _=ht(()=>!!Y(l)&&(Y(l).rejected||Y(l).exit_code!=null&&Y(l).exit_code!==0));var v=Bi(),y=R(L(v),2),b=e=>{Z(e,wi())},x=e=>{var t=Ti(),n=L(t),r=R(n);k(t),z(()=>Q(n,`Couldn't load the VM controls — ${Y(a)??``}. `)),fr(`click`,r,()=>location.reload()),Z(e,t)},S=e=>{var t=zi(),n=on(t),r=R(L(n),2);Pr(r,21,()=>Y(f),e=>e.name,(e,t)=>{var n=Di(),r=L(n),i=e=>{Z(e,Ei())};$(r,e=>{Y(c)===Y(t).name&&e(i)});var a=R(r,2),o=L(a,!0);k(a),k(n),z(()=>{n.disabled=Y(d),Kr(n,`title`,Y(t).blurb),Q(o,Y(t).label)}),fr(`click`,n,()=>m(Y(t))),Z(e,n)}),k(r),k(n);var i=R(n,2),a=R(L(i),2);Pr(a,21,()=>Y(p),e=>e.name,(e,t)=>{var n=ji(),r=L(n),i=L(r),a=e=>{Z(e,Oi())};$(i,e=>{Y(c)===Y(t).name&&e(a)});var o=R(i,2),l=L(o,!0);k(o);var u=R(o,2),f=e=>{Z(e,ki())};$(u,e=>{Y(t).headline&&e(f)}),k(r);var p=R(r,2),_=L(p,!0);k(p);var v=R(p,2),y=e=>{var n=Ai(),r=L(n),i=R(L(r)),a=L(i,!0);k(i),Ne(),k(r);var o=R(r,2),s=L(o),c=R(s,2);k(o),k(n),z(()=>{Kr(n,`aria-label`,`Confirm ${Y(t).name??``}`),Q(a,Y(t).name),s.disabled=Y(d),c.disabled=Y(d)}),fr(`click`,s,()=>g(Y(t).name)),fr(`click`,c,h),Z(e,n)};$(v,e=>{Y(s)===Y(t).name&&e(y)}),k(n),z(()=>{Hr(n,1,`danger-item ${Y(t).headline?`danger-item--headline`:``}`,`svelte-1qihpg4`),Hr(r,1,`vbtn vbtn--danger ${Y(t).headline?`vbtn--headline`:``}`,`svelte-1qihpg4`),r.disabled=Y(d),Kr(r,`aria-expanded`,Y(s)===Y(t).name),Q(l,Y(t).label),Q(_,Y(t).blurb)}),fr(`click`,r,()=>m(Y(t))),Z(e,n)}),k(a),k(i);var o=R(i,2),v=e=>{var t=Mi(),n=L(t);k(t),z(()=>Q(n,`⚠ Command failed to reach the host — ${Y(u)??``}`)),Z(e,t)};$(o,e=>{Y(u)&&e(v)});var y=R(o,2),b=e=>{var t=Ri(),n=L(t),r=L(n),i=L(r,!0);k(r);var a=R(r,2),o=e=>{Z(e,Ni())},s=e=>{var t=Pi(),n=L(t);k(t),z(()=>{Hr(t,1,`out-status ${Y(_)?`out-status--fail`:`out-status--ok`}`,`svelte-1qihpg4`),Q(n,`exit ${Y(l).exit_code??``}`)}),Z(e,t)};$(a,e=>{Y(l).rejected?e(o):e(s,-1)}),k(n);var c=R(n,2),u=e=>{var t=Fi(),n=L(t,!0);k(t),z(()=>Q(n,Y(l).stdout)),Z(e,t)};$(c,e=>{Y(l).stdout&&e(u)});var d=R(c,2),f=e=>{var t=Ii(),n=R(on(t),2),r=L(n,!0);k(n),z(()=>Q(r,Y(l).stderr)),Z(e,t)};$(d,e=>{Y(l).stderr&&e(f)});var p=R(d,2),m=e=>{Z(e,Li())};$(p,e=>{!Y(l).stdout&&!Y(l).stderr&&e(m)}),k(t),z(()=>{Hr(t,1,`out ${Y(_)?`out--fail`:`out--ok`}`,`svelte-1qihpg4`),Q(i,Y(l).verb)}),Z(e,t)};$(y,e=>{Y(l)&&e(b)}),Z(e,t)};$(y,e=>{Y(i)===`loading`?e(b):Y(i)===`error`?e(x,1):e(S,-1)}),k(v),Z(e,v),Ue()}pr([`click`]);var Hi=X(`offline`),Ui=X(`connecting…`),Wi=X(` `),Gi=X(``),Ki=X(`

devvm breakglass

`);function qi(e,t){He(t,!0);let n=P(``),r=P(`connecting`),i=P(``),a=P(!1),o=P(!1);async function s(){F(r,`connecting`),F(i,``);try{F(n,await ai(),!0),F(r,`ready`)}catch(e){F(r,`error`),F(i,e instanceof Error?e.message:String(e),!0)}}Or(s);function c(e){e&&F(n,e,!0)}let l=ht(()=>Y(n)?Y(n).slice(0,8):`────────`),u=ht(()=>Y(r)===`error`?`error`:Y(a)?`busy`:Y(r)===`ready`?`ready`:`idle`);var d=Ki(),f=L(d),p=R(L(f),2),m=L(p),h=L(m),g=R(h,2),_=e=>{Z(e,Hi())},v=e=>{Z(e,Ui())},y=e=>{var t=Wi(),r=L(t,!0);k(t),z(()=>{Kr(t,`title`,Y(n)),Q(r,Y(l))}),Z(e,t)};$(g,e=>{Y(r)===`error`?e(_):Y(r)===`connecting`?e(v,1):e(y,-1)}),k(m);var b=R(m,2),x=R(b,2);k(p),k(f);var S=R(f,2),C=e=>{var t=Gi(),n=L(t);Ne(2),k(t),z(()=>Q(n,`Can't reach the breakglass backend — ${Y(i)??``}. The cluster or network - may be down. The `)),Z(e,t)};$(S,e=>{Y(r)===`error`&&e(C)});var w=R(S,2),T=L(w),ee=L(T);{let e=ht(()=>Y(r)===`ready`);Ci(ee,{get sessionId(){return Y(n)},get sessionReady(){return Y(e)},onLiveSession:c,onStreamingChange:e=>F(a,e,!0)})}k(T);var te=R(T,2);let ne;var re=R(L(te),2),ie=R(L(re),2);k(re),Vi(R(re,2),{}),k(te),k(w);var ae=R(w,2);let oe;k(d),z(()=>{Hr(h,1,`dot dot--${Y(u)??``}`,`svelte-1n46o8q`),x.disabled=Y(a)||Y(r)===`connecting`,Kr(x,`title`,Y(a)?`wait for the current turn to finish`:`start a fresh session`),ne=Hr(te,1,`controls-pane svelte-1n46o8q`,null,ne,{open:Y(o)}),oe=Hr(ae,1,`sheet-backdrop svelte-1n46o8q`,null,oe,{show:Y(o)})}),fr(`click`,b,()=>F(o,!0)),fr(`click`,x,s),fr(`click`,ie,()=>F(o,!1)),fr(`click`,ae,()=>F(o,!1)),Z(e,d),Ue()}pr([`click`]),Cr(qi,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/app/breakglass/static/icon-192.png b/app/breakglass/static/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..76162e206ff8528761ed54ba42fce7ebd6f0b56b GIT binary patch literal 28637 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 t`3J_Jc*}*WlCQLZAE9TCcm->PbX?+yDODB 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/breakglass/static/index.html b/app/breakglass/static/index.html index 4010b4d..30a748e 100644 --- a/app/breakglass/static/index.html +++ b/app/breakglass/static/index.html @@ -2,12 +2,31 @@ - + + + + + + + + + + + + + + devvm breakglass - - + +
diff --git a/app/breakglass/static/manifest.webmanifest b/app/breakglass/static/manifest.webmanifest new file mode 100644 index 0000000..965ac11 --- /dev/null +++ b/app/breakglass/static/manifest.webmanifest @@ -0,0 +1,31 @@ +{ + "name": "devvm breakglass", + "short_name": "breakglass", + "description": "Emergency recovery console for the devvm — chat with a repair agent or power-cycle the VM directly.", + "start_url": "./", + "scope": "./", + "display": "standalone", + "orientation": "portrait", + "background_color": "#06080b", + "theme_color": "#06080b", + "icons": [ + { + "src": "./icon.svg", + "type": "image/svg+xml", + "sizes": "any", + "purpose": "any maskable" + }, + { + "src": "./icon-192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "any maskable" + }, + { + "src": "./icon-512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "any maskable" + } + ] +} diff --git a/frontend/index.html b/frontend/index.html index e04f111..7226e10 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,9 +2,28 @@ - + + + + + + + + + + + + + + devvm breakglass diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e5763f27d44be448e7dc04778c6ae40c08d77b23 GIT binary patch literal 30577 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
FgJ0N_|9MObObJDI(?#o@R^uHOP|Ci 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 t`3J_Jc*}*WlCQLZAE9TCcm->PbX?+yDODB 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/manifest.webmanifest b/frontend/public/manifest.webmanifest new file mode 100644 index 0000000..965ac11 --- /dev/null +++ b/frontend/public/manifest.webmanifest @@ -0,0 +1,31 @@ +{ + "name": "devvm breakglass", + "short_name": "breakglass", + "description": "Emergency recovery console for the devvm — chat with a repair agent or power-cycle the VM directly.", + "start_url": "./", + "scope": "./", + "display": "standalone", + "orientation": "portrait", + "background_color": "#06080b", + "theme_color": "#06080b", + "icons": [ + { + "src": "./icon.svg", + "type": "image/svg+xml", + "sizes": "any", + "purpose": "any maskable" + }, + { + "src": "./icon-192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "any maskable" + }, + { + "src": "./icon-512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "any maskable" + } + ] +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index e1376d5..0efd5d8 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1,100 +1,294 @@
-
+
- -

devvm breakglass

+ +

devvm breakglass

- - - {#if sessionState === 'error'} - offline - {:else if sessionState === 'connecting'} - connecting… - {:else} - {shortId} - {/if} + + + + {#if lamp === 'error'} + link down + {:else if lamp === 'working'} + working + {:else if lamp === 'live'} + {shortId} + {:else} + connecting + {/if} +
- {#if sessionState === 'error'} - diff --git a/frontend/src/VmControls.svelte b/frontend/src/VmControls.svelte index 4db0019..8359e0c 100644 --- a/frontend/src/VmControls.svelte +++ b/frontend/src/VmControls.svelte @@ -293,7 +293,8 @@ align-items: center; justify-content: center; gap: 8px; - padding: 9px 15px; + min-height: 44px; /* touch target */ + padding: 10px 16px; border-radius: var(--radius-sm); font-size: 13px; font-weight: 600; @@ -408,7 +409,8 @@ } .confirm-yes { flex: 1; - padding: 9px; + min-height: 44px; + padding: 10px; border-radius: var(--radius-sm); border: 1px solid var(--danger-bright); background: var(--danger); @@ -424,7 +426,8 @@ } .confirm-no { flex: 1; - padding: 9px; + min-height: 44px; + padding: 10px; border-radius: var(--radius-sm); border: 1px solid var(--line-strong); background: var(--bg-2); diff --git a/frontend/src/app.css b/frontend/src/app.css index 9e82129..03b9e3b 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1,48 +1,70 @@ /* ─────────────────────────────────────────────────────────────────────────── devvm breakglass — global theme - A recovery console: dark, high-contrast, terminal-adjacent. Calm by default; - danger is the only loud thing on the screen. No external fonts/CDNs — system - monospace carries the identity, system sans carries readable prose. + Emergency recovery console / instrument panel. Dark, high-contrast, monospace + identity, calm by default. Danger (red) is reserved EXCLUSIVELY for the + destructive VM power actions — nothing else on the screen is ever red. No + external fonts/CDNs (air-gapped cluster): a refined system-monospace stack + carries the identity, system-sans carries readable prose. Distinctiveness is + earned through composition, the living "system pulse" lamp, motion, hairlines, + and the reserved danger treatment — not through a downloaded typeface. ─────────────────────────────────────────────────────────────────────────── */ :root { - /* Surfaces — a near-black slate with cool undertone, layered for depth. */ - --bg-0: #07090c; /* page base */ - --bg-1: #0c1015; /* panel */ - --bg-2: #11171e; /* raised panel / input */ - --bg-3: #161d26; /* chips, hover */ - --bg-term: #06080a; /* command-output panels */ + /* Surfaces — a near-black slate with a cool undertone, layered for depth. */ + --bg-0: #06080b; /* page base (darkened from #07090c for crisper AA) */ + --bg-1: #0b0f14; /* panel */ + --bg-2: #10161d; /* raised panel / input */ + --bg-3: #161e27; /* chips, hover */ + --bg-term: #05070a; /* command-output panels */ /* Hairlines & text */ - --line: #1d2630; + --line: #1c2530; --line-strong: #2a3744; - --ink: #e6edf3; /* primary text */ - --ink-dim: #9bb0c0; /* secondary text */ - --ink-faint: #5d7185; /* labels, meta */ + --line-bright: #3a4a5a; + --ink: #e9eff5; /* primary text */ + --ink-dim: #9bb0c0; /* secondary text — 8.0:1 on bg-2 */ + /* labels/meta — was #5d7185 (3.6:1, fails AA). Lifted to 6.1:1 on bg-2. */ + --ink-faint: #8499ab; - /* Accents */ - --cyan: #3dd1d6; /* "system alive" — links, focus, session dot */ + /* Accents — the "alive" cyan is the spine of the calm palette. */ + --cyan: #3dd1d6; /* "system alive" — links, focus, session pulse */ + --cyan-bright: #62e3e7; --cyan-dim: #1f6f72; + --cyan-deep: #0e3133; --amber: #f5b657; /* working / in-flight */ + --amber-dim: #6a5226; --green: #5ddb8e; /* healthy exit */ --green-dim: #1f5f3d; - /* Danger — reserved EXCLUSIVELY for mutating actions. Nothing else is red. */ + /* Danger — reserved EXCLUSIVELY for mutating power actions. Nothing else red. */ --danger: #ff4d4d; --danger-bright: #ff6363; --danger-deep: #7a1717; --danger-glow: rgba(255, 77, 77, 0.35); - --radius: 10px; - --radius-sm: 7px; + --radius: 11px; + --radius-sm: 8px; + --radius-lg: 16px; - --mono: ui-monospace, "JetBrains Mono", "SF Mono", "Cascadia Code", - "Fira Code", Menlo, Consolas, "Liberation Mono", monospace; + /* A refined, deliberately-ordered monospace stack. We lead with faces that + have real character (Berkeley Mono / JetBrains / Cascadia / SF Mono) and + fall back gracefully — but ship nothing; whatever the device has carries + the cockpit-readout identity. */ + --mono: "Berkeley Mono", ui-monospace, "JetBrains Mono", "SF Mono", + "Cascadia Code", "Fira Code", "Source Code Pro", Menlo, Consolas, + "Liberation Mono", monospace; --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - --shadow-panel: 0 1px 0 rgba(255, 255, 255, 0.02) inset, - 0 16px 40px -24px rgba(0, 0, 0, 0.9); + --shadow-panel: 0 1px 0 rgba(255, 255, 255, 0.025) inset, + 0 18px 44px -26px rgba(0, 0, 0, 0.95); + --shadow-sheet: 0 -22px 48px -12px rgba(0, 0, 0, 0.7); + + /* Safe-area shorthands (notch / home-indicator). 0px fallback off-device. */ + --safe-top: env(safe-area-inset-top, 0px); + --safe-bottom: env(safe-area-inset-bottom, 0px); + --safe-left: env(safe-area-inset-left, 0px); + --safe-right: env(safe-area-inset-right, 0px); color-scheme: dark; } @@ -55,23 +77,24 @@ html, body { margin: 0; height: 100%; - /* The page itself never scrolls — the chat stream scrolls internally. This - keeps the composer pinned and stops iOS rubber-banding the whole UI. */ + /* The page itself never scrolls — only the chat stream scrolls internally. + This keeps the composer pinned and stops iOS rubber-banding the whole UI. */ overflow: hidden; overscroll-behavior: none; } body { background-color: var(--bg-0); - /* Atmosphere: a soft cyan corner-glow over a faint scanline weave, so the - surface reads like backlit equipment rather than flat #000. */ + /* Atmosphere: a soft cyan corner-glow + a faint warm counter-glow over a + hairline scanline weave, so the surface reads as backlit equipment rather + than flat black. Fixed so it doesn't drift when the chat scrolls. */ background-image: - radial-gradient(120% 80% at 85% -10%, rgba(61, 209, 214, 0.07), transparent 55%), - radial-gradient(90% 70% at 10% 110%, rgba(245, 182, 87, 0.04), transparent 50%), + radial-gradient(120% 78% at 86% -12%, rgba(61, 209, 214, 0.08), transparent 55%), + radial-gradient(90% 70% at 8% 112%, rgba(245, 182, 87, 0.045), transparent 52%), repeating-linear-gradient( 0deg, - rgba(255, 255, 255, 0.012) 0px, - rgba(255, 255, 255, 0.012) 1px, + rgba(255, 255, 255, 0.013) 0px, + rgba(255, 255, 255, 0.013) 1px, transparent 1px, transparent 3px ); @@ -84,8 +107,8 @@ body { #app { /* 100dvh (dynamic viewport height) — NOT 100vh/100% — so the composer at the - bottom is never hidden behind a mobile browser's address/tool bar. Mobile is - the primary client for this tool. 100vh is the fallback for old engines. */ + bottom is never hidden behind a mobile browser's address/tool bar. 100vh is + the fallback for engines without dvh. Mobile is the primary client. */ height: 100vh; height: 100dvh; } @@ -94,7 +117,6 @@ button { font-family: var(--mono); cursor: pointer; } - button:disabled { cursor: not-allowed; } @@ -119,10 +141,26 @@ button:disabled { background-clip: content-box; } *::-webkit-scrollbar-thumb:hover { - background: #3a4a5a; + background: var(--line-bright); background-clip: content-box; } +/* ── Shared motion primitives ────────────────────────────────────────────── + One well-orchestrated entrance beats scattered micro-interactions: panels + and rows rise a few px with a soft fade, staggered via --d on each element. */ +@keyframes rise-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +.rise-in { + animation: rise-in 0.5s cubic-bezier(0.22, 0.61, 0.36, 1) both; + animation-delay: var(--d, 0ms); +} + @media (prefers-reduced-motion: reduce) { *, *::before, diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js index 6d42dae..fdf6a6c 100644 --- a/frontend/src/lib/api.js +++ b/frontend/src/lib/api.js @@ -1,8 +1,41 @@ -// Same-origin API client. Auth is handled entirely by the edge proxy -// (Authentik / basic-auth / bearer) — this UI never sends or stores a token. -import { readEventStream } from './sse.js'; +// Same-origin API client for the breakglass UI. +// +// Auth is handled entirely by the edge proxy (Authentik / basic-auth / bearer): +// this UI never sends or stores a token, and builds no login screen. +// +// The chat uses the tmux/attach model. The conversation lives SERVER-SIDE; we +// only persist the session_id locally and ATTACH to it over an EventSource. The +// browser's native EventSource auto-reconnects and sends Last-Event-ID, and the +// server resumes from there — so there is ZERO reconnect logic here. We just +// render events idempotently by id (see transcript.js). -/** Open a fresh chat session. @returns {Promise} session_id */ +const SESSION_KEY = 'breakglass.session_id'; + +/** Read the persisted session id, or '' if none. */ +export function loadSessionId() { + try { + return localStorage.getItem(SESSION_KEY) || ''; + } catch { + return ''; + } +} + +/** Persist the session id (best-effort; private-mode storage may throw). */ +export function saveSessionId(id) { + try { + if (id) localStorage.setItem(SESSION_KEY, id); + else localStorage.removeItem(SESSION_KEY); + } catch { + /* ignore — storage is a convenience, not a requirement */ + } +} + +/** Forget the persisted session id (the "New session" archive step). */ +export function clearSessionId() { + saveSessionId(''); +} + +/** Open a fresh server-side session. @returns {Promise} session_id */ export async function openSession() { const res = await fetch('/api/session', { method: 'POST', @@ -19,30 +52,89 @@ export async function openSession() { } /** - * Run one chat turn. Streams events to onEvent until the backend sends - * {kind:"done"} and the connection closes. Pass an AbortSignal to cancel. + * Attach to a session's event stream. Returns the live EventSource so the + * caller can close() it. Events arrive as: + * - default `message` events: .data is JSON {kind, id, ...} + * - a named `caught-up` event once the replay is drained (.data is {}) + * - native `error` events while reconnecting (EventSource retries itself) * - * @param {{session_id: string, prompt: string, model?: string, signal?: AbortSignal}} opts - * @param {(event: object) => void} onEvent + * @param {string} sessionId + * @param {{ + * onEvent: (e: object) => void, + * onCaughtUp?: () => void, + * onOpen?: () => void, + * onError?: (e: Event) => void, + * }} handlers + * @returns {EventSource} */ -export async function streamChat({ session_id, prompt, model, signal }, onEvent) { - const payload = { session_id, prompt }; - if (model) payload.model = model; +export function attachStream(sessionId, { onEvent, onCaughtUp, onOpen, onError }) { + const es = new EventSource(`/api/session/${encodeURIComponent(sessionId)}/stream`); - const res = await fetch('/api/chat', { - method: 'POST', - headers: { - 'content-type': 'application/json', - accept: 'text/event-stream', - }, - body: JSON.stringify(payload), - signal, - }); - await readEventStream(res, onEvent); + es.onopen = () => onOpen?.(); + + es.onmessage = (e) => { + if (!e || typeof e.data !== 'string' || e.data === '') return; + let obj; + try { + obj = JSON.parse(e.data); + } catch { + // A malformed frame must not abort an in-progress recovery stream. + return; + } + // EventSource exposes the SSE `id:` line as e.lastEventId. The server also + // embeds id in the JSON; prefer the JSON id, fall back to lastEventId. + if ((obj.id == null || obj.id === '') && e.lastEventId) obj.id = e.lastEventId; + onEvent(obj); + }; + + es.addEventListener('caught-up', () => onCaughtUp?.()); + + es.onerror = (e) => { + // EventSource auto-reconnects on a transient drop (readyState CONNECTING); + // we only surface a hard, terminal failure (readyState CLOSED). + onError?.(e); + }; + + return es; } /** - * List the PVE power verbs and which of them mutate VM state. + * Start a turn. Output arrives via the attach stream, NOT this response. + * @param {{session_id: string, prompt: string, model?: string}} opts + * @returns {Promise<{status:'started'|'busy'|'gone'}>} + * started — accepted; busy — 409 (a turn already runs); gone — 404 (re-create). + */ +export async function sendPrompt({ session_id, prompt, model }) { + const payload = { prompt }; + if (model) payload.model = model; + const res = await fetch(`/api/session/${encodeURIComponent(session_id)}/prompt`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(payload), + }); + if (res.status === 409) return { status: 'busy' }; + if (res.status === 404) return { status: 'gone' }; + if (!res.ok) throw new Error(`could not start the turn (HTTP ${res.status})`); + return { status: 'started' }; +} + +/** + * Cancel the in-flight turn (the Stop button). + * @param {string} sessionId + * @returns {Promise} whether a turn was cancelled + */ +export async function cancelTurn(sessionId) { + const res = await fetch(`/api/session/${encodeURIComponent(sessionId)}/cancel`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + }); + if (!res.ok) throw new Error(`could not stop the turn (HTTP ${res.status})`); + const body = await res.json().catch(() => ({})); + return Boolean(body.cancelled); +} + +/** + * List the PVE power verbs and which mutate VM state. * @returns {Promise<{verbs: string[], mutating: string[]}>} */ export async function fetchVerbs() { @@ -58,27 +150,26 @@ export async function fetchVerbs() { } /** - * Run a PVE power verb directly (no AI in the path). The backend returns 200 - * on success and 502 when the verb's exit code is non-zero, but the JSON body - * carries {verb, exit_code, stdout, stderr, rejected} in BOTH cases — so we - * read the body regardless of HTTP status and let the caller style on - * exit_code / rejected. + * Run a PVE power verb directly (no AI in the path). The backend returns 200 on + * success and 502 when the verb's exit code is non-zero, but the JSON body + * carries {verb, exit_code, stdout, stderr, rejected} in BOTH cases — so we read + * the body regardless of HTTP status and let the caller style on exit_code. * * @param {string} verb - * @returns {Promise<{verb: string, exit_code: number|null, stdout: string, stderr: string, rejected: boolean}>} + * @returns {Promise<{verb:string, exit_code:number|null, stdout:string, stderr:string, rejected:boolean}>} */ export async function runVerb(verb) { const res = await fetch(`/api/pve/${encodeURIComponent(verb)}`, { method: 'POST', headers: { 'content-type': 'application/json' }, }); - // 400 = unknown verb (FastAPI HTTPException) — has {detail}, not the verb shape. let body; try { body = await res.json(); } catch { throw new Error(`VM control '${verb}' failed (HTTP ${res.status}, no body)`); } + // 400 = unknown verb (FastAPI HTTPException) — has {detail}, not the verb shape. if (res.status === 400) { throw new Error(body?.detail || `'${verb}' was rejected by the server`); } diff --git a/frontend/src/lib/sse.js b/frontend/src/lib/sse.js deleted file mode 100644 index 8375612..0000000 --- a/frontend/src/lib/sse.js +++ /dev/null @@ -1,150 +0,0 @@ -// SSE frame parsing — the load-bearing core of the breakglass UI. -// -// The /api/chat endpoint returns a text/event-stream that we read with -// fetch() + response.body.getReader() (NOT EventSource, which cannot POST). -// The backend emits one frame per event as: -// -// data: {json}\n\n -// -// getReader() hands us bytes at arbitrary boundaries: a single frame can be -// split across reads, and one read can contain several frames. So we keep a -// rolling text buffer, split it on the blank-line frame delimiter, and only -// hand back the JSON payload of *complete* frames. Per the SSE spec a frame may -// carry multiple `data:` lines (joined with "\n"); the backend emits single -// line JSON today, but we handle the general case so a future multi-line -// payload can't silently corrupt the stream. - -/** - * Parse a single SSE event block (the text between blank lines) into its data - * payload string, or null if the block carries no `data:` field (e.g. a bare - * comment or a `:` heartbeat). - * @param {string} block - * @returns {string|null} - */ -export function dataFromEventBlock(block) { - const dataLines = []; - for (const rawLine of block.split('\n')) { - const line = rawLine.replace(/\r$/, ''); - if (line.startsWith(':')) continue; // SSE comment / heartbeat - if (line === 'data:' || line === 'data') { - dataLines.push(''); - } else if (line.startsWith('data:')) { - // Spec: a single leading space after the colon is stripped. - let v = line.slice('data:'.length); - if (v.startsWith(' ')) v = v.slice(1); - dataLines.push(v); - } - // field lines we don't care about (event:, id:, retry:) are ignored - } - if (dataLines.length === 0) return null; - return dataLines.join('\n'); -} - -/** - * A stateful splitter that turns an arbitrary sequence of decoded text chunks - * into a sequence of complete SSE event-block strings. Frames are delimited by - * a blank line; we tolerate both "\n\n" and "\r\n\r\n". - */ -export class SSEFrameSplitter { - constructor() { - this.buffer = ''; - } - - /** - * Feed a decoded text chunk; returns the event blocks that are now complete. - * Any trailing partial frame stays buffered for the next chunk. - * @param {string} chunk - * @returns {string[]} complete event blocks (text between delimiters) - */ - push(chunk) { - this.buffer += chunk; - const blocks = []; - // Normalise CRLF delimiters to LF so a single split rule covers both. - let idx; - // Process every complete frame currently in the buffer. - while ((idx = this._nextDelimiter()) !== -1) { - const block = this.buffer.slice(0, idx.start); - this.buffer = this.buffer.slice(idx.end); - if (block.length > 0) blocks.push(block); - } - return blocks; - } - - /** - * On stream end, return whatever complete-looking content remains. A - * well-behaved backend always terminates the last frame with a blank line, - * so this is usually empty — but if the connection closed mid-trailing-frame - * with a parseable block, surface it rather than dropping data. - * @returns {string[]} - */ - flush() { - const rest = this.buffer.trim(); - this.buffer = ''; - return rest ? [rest] : []; - } - - _nextDelimiter() { - // Find the earliest of "\n\n", "\r\n\r\n", "\r\r". - const candidates = [ - { token: '\r\n\r\n', i: this.buffer.indexOf('\r\n\r\n') }, - { token: '\n\n', i: this.buffer.indexOf('\n\n') }, - { token: '\r\r', i: this.buffer.indexOf('\r\r') }, - ].filter((c) => c.i !== -1); - if (candidates.length === 0) return -1; - candidates.sort((a, b) => a.i - b.i); - const { token, i } = candidates[0]; - return { start: i, end: i + token.length }; - } -} - -/** - * Read an SSE Response body to completion, invoking onEvent for every parsed - * JSON event object. Resolves when the stream ends. Throws if the response is - * not ok or has no readable body (caller shows the error inline). - * - * @param {Response} response a fetch() Response with a streaming body - * @param {(event: object) => void} onEvent called per parsed JSON event - */ -export async function readEventStream(response, onEvent) { - if (!response.ok) { - throw new Error(`server returned ${response.status} ${response.statusText}`); - } - if (!response.body) { - throw new Error('response has no readable body (streaming unsupported)'); - } - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - const splitter = new SSEFrameSplitter(); - - const handleBlock = (block) => { - const payload = dataFromEventBlock(block); - if (payload == null || payload.trim() === '') return; - let obj; - try { - obj = JSON.parse(payload); - } catch { - // A malformed frame must not abort an in-progress recovery stream; - // skip it and keep reading. - return; - } - onEvent(obj); - }; - - try { - for (;;) { - const { value, done } = await reader.read(); - if (done) break; - const text = decoder.decode(value, { stream: true }); - for (const block of splitter.push(text)) handleBlock(block); - } - } finally { - reader.releaseLock?.(); - } - // Drain any trailing bytes the decoder held, then any final frame. - const tail = decoder.decode(); - if (tail) { - for (const block of splitter.push(tail)) handleBlock(block); - } - for (const block of splitter.flush()) handleBlock(block); -} diff --git a/frontend/src/lib/sse.test.mjs b/frontend/src/lib/sse.test.mjs deleted file mode 100644 index 413433f..0000000 --- a/frontend/src/lib/sse.test.mjs +++ /dev/null @@ -1,152 +0,0 @@ -// Standalone test of the SSE frame parser — no test framework, just node. -// Run: node src/lib/sse.test.mjs (exits non-zero on any failure) -// -// These pin the protocol described in the API contract: frames are -// `data: {json}\n\n`, the event `kind` is one of session/text/tool/result/ -// error/done, and bytes arrive at arbitrary boundaries via getReader(). -import { SSEFrameSplitter, dataFromEventBlock, readEventStream } from './sse.js'; - -let failures = 0; -function ok(name, cond) { - if (cond) { - console.log(` ok ${name}`); - } else { - failures++; - console.error(`FAIL ${name}`); - } -} -function eq(name, got, want) { - const g = JSON.stringify(got); - const w = JSON.stringify(want); - ok(`${name} (got ${g})`, g === w); -} - -// --- dataFromEventBlock --------------------------------------------------- -eq( - 'extracts JSON payload from a data: line', - dataFromEventBlock('data: {"kind":"text","text":"hi"}'), - '{"kind":"text","text":"hi"}' -); -eq( - 'strips exactly one space after the colon', - dataFromEventBlock('data: leading-space-kept'), - ' leading-space-kept' -); -eq('ignores comment/heartbeat lines', dataFromEventBlock(': keep-alive'), null); -eq( - 'joins multi-line data fields with newline', - dataFromEventBlock('data: line1\ndata: line2'), - 'line1\nline2' -); - -// --- SSEFrameSplitter: whole frames -------------------------------------- -{ - const s = new SSEFrameSplitter(); - const blocks = s.push('data: {"kind":"session","session_id":"abc"}\n\n'); - eq('one complete frame yields one block', blocks, [ - 'data: {"kind":"session","session_id":"abc"}', - ]); -} - -// --- SSEFrameSplitter: multiple frames in one chunk ---------------------- -{ - const s = new SSEFrameSplitter(); - const blocks = s.push( - 'data: {"kind":"text","text":"a"}\n\ndata: {"kind":"text","text":"b"}\n\n' - ); - eq('two frames in one chunk yield two blocks', blocks.length, 2); - eq('first block', dataFromEventBlock(blocks[0]), '{"kind":"text","text":"a"}'); - eq('second block', dataFromEventBlock(blocks[1]), '{"kind":"text","text":"b"}'); -} - -// --- SSEFrameSplitter: frame split across chunks ------------------------- -{ - const s = new SSEFrameSplitter(); - let blocks = s.push('data: {"kind":"te'); - eq('partial frame yields nothing yet', blocks, []); - blocks = s.push('xt","text":"split"}\n\n'); - eq('completing the frame yields it whole', dataFromEventBlock(blocks[0]), '{"kind":"text","text":"split"}'); -} - -// --- SSEFrameSplitter: delimiter split across chunks --------------------- -{ - const s = new SSEFrameSplitter(); - let blocks = s.push('data: {"kind":"done"}\n'); - eq('frame held while delimiter incomplete', blocks, []); - blocks = s.push('\n'); - eq('frame released once blank line completes', dataFromEventBlock(blocks[0]), '{"kind":"done"}'); -} - -// --- SSEFrameSplitter: CRLF delimiters ----------------------------------- -{ - const s = new SSEFrameSplitter(); - const blocks = s.push('data: {"kind":"text","text":"crlf"}\r\n\r\n'); - eq('CRLF-delimited frame parses', dataFromEventBlock(blocks[0]), '{"kind":"text","text":"crlf"}'); -} - -// --- end-to-end via readEventStream over a mock streaming Response -------- -function mockResponse(chunks) { - const enc = new TextEncoder(); - let i = 0; - return { - ok: true, - status: 200, - body: { - getReader() { - return { - read() { - if (i < chunks.length) { - return Promise.resolve({ value: enc.encode(chunks[i++]), done: false }); - } - return Promise.resolve({ value: undefined, done: true }); - }, - releaseLock() {}, - }; - }, - }, - }; -} - -await (async () => { - // A realistic turn, deliberately chopped at ugly boundaries: - // - the session frame split mid-JSON - // - two text frames glued together - // - a tool frame - // - a result frame and the terminal done frame in one chunk - const chunks = [ - 'data: {"kind":"sess', - 'ion","session_id":"S1"}\n\n', - 'data: {"kind":"text","text":"checking "}\n\ndata: {"kind":"text","text":"disk"}\n\n', - 'data: {"kind":"tool","name":"Bash","input":{"command":"df -h"}}\n\n', - 'data: {"kind":"result","is_error":false,"result":"ok","duration_ms":12}\n\ndata: {"kind":"done"}\n\n', - ]; - const events = []; - await readEventStream(mockResponse(chunks), (e) => events.push(e)); - - eq('event count', events.length, 6); - eq('1: session id', events[0], { kind: 'session', session_id: 'S1' }); - eq('2: first text', events[1], { kind: 'text', text: 'checking ' }); - eq('3: second text', events[2], { kind: 'text', text: 'disk' }); - eq('4: tool kind+name', { kind: events[3].kind, name: events[3].name }, { kind: 'tool', name: 'Bash' }); - eq('4: tool command', events[3].input.command, 'df -h'); - eq('5: result', events[4], { kind: 'result', is_error: false, result: 'ok', duration_ms: 12 }); - eq('6: done terminal', events[5], { kind: 'done' }); -})(); - -// malformed frame in the middle must be skipped, not abort the stream -await (async () => { - const chunks = [ - 'data: {"kind":"text","text":"before"}\n\n', - 'data: {this is not json}\n\n', - 'data: {"kind":"done"}\n\n', - ]; - const events = []; - await readEventStream(mockResponse(chunks), (e) => events.push(e)); - eq('malformed frame skipped, stream continues', events.map((e) => e.kind), ['text', 'done']); -})(); - -if (failures) { - console.error(`\n${failures} assertion(s) FAILED`); - process.exit(1); -} -console.log('\nall SSE parser assertions passed'); diff --git a/frontend/src/lib/transcript.js b/frontend/src/lib/transcript.js new file mode 100644 index 0000000..39624c7 --- /dev/null +++ b/frontend/src/lib/transcript.js @@ -0,0 +1,196 @@ +// transcript.js — the load-bearing core of the breakglass UI. +// +// The attach stream (EventSource) replays the conversation-so-far and then +// tails live. Replayed events are byte-identical to live ones, and on a +// reconnect the server re-replays from Last-Event-ID — so the SAME event id can +// arrive more than once. This module folds a flat, possibly-duplicated event +// sequence into an ordered list of render-ready messages, idempotently. +// +// Contract (every default `message` event's .data is one of these JSON shapes): +// {kind:"user", text, id} → opens a USER bubble +// {kind:"session", session_id, id} → informational (agent's session id) +// {kind:"text", text, id} → assistant prose; concatenated +// {kind:"tool", name, input, id} → inline tool chip (Bash → command) +// {kind:"result", is_error, result, duration_ms, id} → closes the bubble +// {kind:"error", error, id} → error note on the bubble +// {kind:"cancelled", id} → muted "stopped" note +// {kind:"turn_end", id} → the turn finished +// +// Grouping: a `user` event opens a user message; the session/text/tool events +// that follow build ONE assistant message; result/error/cancelled annotate it; +// turn_end ends it. Assistant events with no preceding user (e.g. a session +// banner on a fresh attach) still get an assistant message so nothing is lost. +// +// Idempotency: every event carries a monotonic integer-ish id. We track the +// max id folded so far and DROP any event whose id we've already passed — a +// reconnect replay therefore never double-renders. Ids are compared +// numerically when both parse as numbers, else as strings (defensive). + +/** @typedef {{type:'text',text:string}|{type:'tool',name:string,command:string,raw:any}} Part */ +/** + * @typedef {Object} Message + * @property {'user'|'assistant'} role + * @property {string} key stable key for keyed {#each} + * @property {string} [text] user text + * @property {Part[]} [parts] assistant parts, in emit order + * @property {{is_error:boolean,text:string,duration_ms:number|null}} [result] + * @property {string} [error] + * @property {boolean} [cancelled] + * @property {boolean} [ended] turn_end seen for this message + */ + +/** Compare two ids; numeric when both look numeric, else lexicographic. */ +export function idGreater(a, b) { + const na = Number(a); + const nb = Number(b); + if (Number.isFinite(na) && Number.isFinite(nb) && `${a}`.trim() !== '' && `${b}`.trim() !== '') { + return na > nb; + } + return String(a) > String(b); +} + +/** + * Create an empty transcript-folding state. + * @returns {{messages: Message[], maxId: any, sawId: boolean, openAssistant: Message|null, activeUserSeen: boolean}} + */ +export function createTranscript() { + return { + messages: [], + maxId: null, + sawId: false, + openAssistant: null, + // a turn is "active" once a user event (or local prompt) has no following + // turn_end; the UI reads `active` from reduceEvent's return. + activeUserSeen: false, + }; +} + +function bubbleKey(prefix, id, fallbackIndex) { + if (id != null && `${id}`.trim() !== '') return `${prefix}:${id}`; + return `${prefix}:idx:${fallbackIndex}`; +} + +/** + * Should this event be applied, given the max id folded so far? Updates and + * returns the new max. Events WITHOUT an id are always applied (and don't move + * the watermark) — the protocol always carries ids, but we never drop data on a + * malformed frame. + * @returns {{apply:boolean, maxId:any}} + */ +export function admit(maxId, id) { + if (id == null || `${id}`.trim() === '') return { apply: true, maxId }; + if (maxId == null) return { apply: true, maxId: id }; + if (idGreater(id, maxId)) return { apply: true, maxId: id }; + return { apply: false, maxId }; // already seen — dedupe +} + +/** + * Fold one event into the transcript state, mutating `state` in place. + * Returns true if the state changed (so callers can trigger a re-render). + * + * @param {ReturnType} state + * @param {any} ev parsed event object ({kind, id, ...}) + * @returns {boolean} changed + */ +export function reduceEvent(state, ev) { + if (!ev || typeof ev !== 'object') return false; + const { apply, maxId } = admit(state.maxId, ev.id); + state.maxId = maxId; + if (!apply) return false; + if (ev.id != null && `${ev.id}`.trim() !== '') state.sawId = true; + + const ensureAssistant = () => { + if (!state.openAssistant) { + const msg = { + role: 'assistant', + key: bubbleKey('a', ev.id, state.messages.length), + parts: [], + ended: false, + }; + state.messages.push(msg); + state.openAssistant = msg; + } + return state.openAssistant; + }; + + switch (ev.kind) { + case 'user': { + // A new user turn. Close any dangling assistant bubble first. + state.openAssistant = null; + state.messages.push({ + role: 'user', + key: bubbleKey('u', ev.id, state.messages.length), + text: typeof ev.text === 'string' ? ev.text : '', + }); + state.activeUserSeen = true; + return true; + } + case 'session': { + // Informational — does not itself render a part, but it does open the + // assistant bubble for the turn so subsequent text lands in one place. + ensureAssistant(); + return true; + } + case 'text': { + if (typeof ev.text !== 'string' || ev.text === '') return false; + const msg = ensureAssistant(); + const tail = msg.parts[msg.parts.length - 1]; + if (tail && tail.type === 'text') { + tail.text += ev.text; // concatenate consecutive prose + } else { + msg.parts.push({ type: 'text', text: ev.text }); + } + return true; + } + case 'tool': { + const msg = ensureAssistant(); + const command = + ev.input && typeof ev.input.command === 'string' ? ev.input.command : ''; + msg.parts.push({ + type: 'tool', + name: typeof ev.name === 'string' && ev.name ? ev.name : 'tool', + command, + raw: ev.input ?? null, + }); + return true; + } + case 'result': { + const msg = ensureAssistant(); + msg.result = { + is_error: Boolean(ev.is_error), + text: typeof ev.result === 'string' ? ev.result : '', + duration_ms: typeof ev.duration_ms === 'number' ? ev.duration_ms : null, + }; + return true; + } + case 'error': { + const msg = ensureAssistant(); + msg.error = typeof ev.error === 'string' && ev.error ? ev.error : 'unknown error'; + return true; + } + case 'cancelled': { + const msg = ensureAssistant(); + msg.cancelled = true; + return true; + } + case 'turn_end': { + if (state.openAssistant) state.openAssistant.ended = true; + state.openAssistant = null; + state.activeUserSeen = false; + return true; + } + default: + return false; + } +} + +/** + * Convenience: fold an array of events into a fresh transcript (used by tests + * and by a from-scratch render). Returns the final state. + * @param {any[]} events + */ +export function foldAll(events) { + const state = createTranscript(); + for (const ev of events) reduceEvent(state, ev); + return state; +} diff --git a/frontend/src/lib/transcript.test.mjs b/frontend/src/lib/transcript.test.mjs new file mode 100644 index 0000000..93afeb4 --- /dev/null +++ b/frontend/src/lib/transcript.test.mjs @@ -0,0 +1,162 @@ +// Standalone test of the transcript folder — no test framework, just node. +// Run: node src/lib/transcript.test.mjs (exits non-zero on any failure) +// +// These pin the attach-model contract: events carry monotonic ids, a reconnect +// re-replays already-seen ids (which MUST be deduped), and events group into +// user/assistant messages with consecutive prose concatenated. +import { + admit, + idGreater, + reduceEvent, + createTranscript, + foldAll, +} from './transcript.js'; + +let failures = 0; +function ok(name, cond) { + if (cond) { + console.log(` ok ${name}`); + } else { + failures++; + console.error(`FAIL ${name}`); + } +} +function eq(name, got, want) { + const g = JSON.stringify(got); + const w = JSON.stringify(want); + ok(`${name} (got ${g})`, g === w); +} + +// --- id comparison -------------------------------------------------------- +ok('idGreater numeric', idGreater(10, 9) === true); +ok('idGreater numeric not', idGreater(2, 10) === false); // not string "2" > "10" +ok('idGreater string fallback', idGreater('b', 'a') === true); + +// --- admit / dedupe watermark -------------------------------------------- +{ + let { apply, maxId } = admit(null, 1); + eq('first id admitted', { apply, maxId }, { apply: true, maxId: 1 }); + ({ apply, maxId } = admit(5, 5)); + ok('equal id rejected (already seen)', apply === false && maxId === 5); + ({ apply, maxId } = admit(5, 3)); + ok('lower id rejected', apply === false && maxId === 5); + ({ apply, maxId } = admit(5, 6)); + ok('higher id admitted, watermark moves', apply === true && maxId === 6); + ({ apply, maxId } = admit(5, undefined)); + ok('id-less event always admitted, watermark held', apply === true && maxId === 5); +} + +// --- a full turn groups into user + one assistant bubble ------------------ +{ + const events = [ + { kind: 'user', text: 'triage it', id: 1 }, + { kind: 'session', session_id: 'S1', id: 2 }, + { kind: 'text', text: 'Checking ', id: 3 }, + { kind: 'text', text: 'disk usage.', id: 4 }, + { kind: 'tool', name: 'Bash', input: { command: 'df -h' }, id: 5 }, + { kind: 'result', is_error: false, result: 'ok', duration_ms: 1200, id: 6 }, + { kind: 'turn_end', id: 7 }, + ]; + const s = foldAll(events); + eq('two messages: user + assistant', s.messages.length, 2); + eq('first is user with text', { r: s.messages[0].role, t: s.messages[0].text }, { r: 'user', t: 'triage it' }); + const a = s.messages[1]; + eq('assistant role', a.role, 'assistant'); + // consecutive text concatenated into ONE part; tool is a separate part + eq('parts: one concatenated text + one tool', a.parts.map((p) => p.type), ['text', 'tool']); + eq('prose concatenated in order', a.parts[0].text, 'Checking disk usage.'); + eq('tool command captured', a.parts[1].command, 'df -h'); + eq('result attached', { e: a.result.is_error, ms: a.result.duration_ms }, { e: false, ms: 1200 }); + ok('turn ended', a.ended === true); + ok('no longer active after turn_end', s.activeUserSeen === false); +} + +// --- reconnect replay: re-feeding the SAME events must NOT double-render -- +{ + const events = [ + { kind: 'user', text: 'hi', id: 1 }, + { kind: 'text', text: 'hello', id: 2 }, + { kind: 'turn_end', id: 3 }, + ]; + const s = createTranscript(); + for (const e of events) reduceEvent(s, e); + // simulate an EventSource reconnect that re-replays everything from the top + for (const e of events) reduceEvent(s, e); + eq('still exactly two messages after replay', s.messages.length, 2); + eq('assistant prose not doubled', s.messages[1].parts[0].text, 'hello'); +} + +// --- a partial replay (Last-Event-ID resume) continues the same bubble ---- +{ + const s = createTranscript(); + reduceEvent(s, { kind: 'user', text: 'go', id: 1 }); + reduceEvent(s, { kind: 'text', text: 'part-A ', id: 2 }); + // reconnect: server resumes after id 2; we must drop id<=2 if re-sent and + // keep appending to the open assistant bubble. + reduceEvent(s, { kind: 'text', text: 'part-A ', id: 2 }); // dup, dropped + reduceEvent(s, { kind: 'text', text: 'part-B', id: 3 }); // new, appended + reduceEvent(s, { kind: 'turn_end', id: 4 }); + eq('resume appended to same bubble', s.messages[1].parts[0].text, 'part-A part-B'); + eq('still two messages', s.messages.length, 2); +} + +// --- error / cancelled annotate the open bubble --------------------------- +{ + const s = foldAll([ + { kind: 'user', text: 'x', id: 1 }, + { kind: 'text', text: 'working', id: 2 }, + { kind: 'error', error: 'ssh timeout', id: 3 }, + { kind: 'turn_end', id: 4 }, + ]); + eq('error note on assistant bubble', s.messages[1].error, 'ssh timeout'); +} +{ + const s = foldAll([ + { kind: 'user', text: 'x', id: 1 }, + { kind: 'cancelled', id: 2 }, + { kind: 'turn_end', id: 3 }, + ]); + ok('cancelled flag on assistant bubble', s.messages[1].cancelled === true); +} + +// --- active state: a user event with no turn_end means a turn is running --- +{ + const s = createTranscript(); + reduceEvent(s, { kind: 'user', text: 'go', id: 1 }); + reduceEvent(s, { kind: 'text', text: '...', id: 2 }); + ok('active while no turn_end', s.activeUserSeen === true); + reduceEvent(s, { kind: 'turn_end', id: 3 }); + ok('inactive after turn_end', s.activeUserSeen === false); +} + +// --- assistant-only stream (session banner on a fresh attach) still renders - +{ + const s = foldAll([ + { kind: 'session', session_id: 'S1', id: 1 }, + { kind: 'text', text: 'standing by', id: 2 }, + { kind: 'turn_end', id: 3 }, + ]); + eq('lone assistant message created', s.messages.length, 1); + eq('assistant prose present', s.messages[0].parts[0].text, 'standing by'); +} + +// --- two sequential turns produce two assistant bubbles ------------------- +{ + const s = foldAll([ + { kind: 'user', text: 'q1', id: 1 }, + { kind: 'text', text: 'a1', id: 2 }, + { kind: 'turn_end', id: 3 }, + { kind: 'user', text: 'q2', id: 4 }, + { kind: 'text', text: 'a2', id: 5 }, + { kind: 'turn_end', id: 6 }, + ]); + eq('four messages (u,a,u,a)', s.messages.map((m) => m.role), ['user', 'assistant', 'user', 'assistant']); + eq('second answer in its own bubble', s.messages[3].parts[0].text, 'a2'); + ok('message keys are unique', new Set(s.messages.map((m) => m.key)).size === 4); +} + +if (failures) { + console.error(`\n${failures} assertion(s) FAILED`); + process.exit(1); +} +console.log('\nall transcript assertions passed'); diff --git a/tests/test_breakglass.py b/tests/test_breakglass.py index 6f21c12..caa6b65 100644 --- a/tests/test_breakglass.py +++ b/tests/test_breakglass.py @@ -1,174 +1,251 @@ -"""Tests for the breakglass app: verb whitelist, SSE translation, auth, routes.""" +"""Tests for the breakglass app: session manager (attach model), verb whitelist, +SSE translation, auth, routes.""" import os os.environ.setdefault("API_BEARER_TOKEN", "test-token") +# Turns chdir into a per-session workspace; point it somewhere writable for tests +# (prod uses the /workspace emptyDir). Must be set before the app imports config. +os.environ.setdefault("BREAKGLASS_SESSIONS_DIR", "/tmp/bg-test-sessions") import pytest from fastapi.testclient import TestClient -from app.breakglass import agent_session, pve +from app.breakglass import agent_session, pve, session as sessionmod from app.breakglass.server import app # --------------------------------------------------------------------------- # -# PVE verb whitelist — the security boundary mirrored client-side. +# Fakes for the claude subprocess a turn spawns. # --------------------------------------------------------------------------- # +class _FakeStdout: + def __init__(self, lines): + self._lines = [(l + "\n").encode() for l in lines] + self._i = 0 + def __aiter__(self): + return self + + async def __anext__(self): + if self._i >= len(self._lines): + raise StopAsyncIteration + line = self._lines[self._i] + self._i += 1 + return line + + +class _FakeStderr: + async def read(self): + return b"" + + +class _FakeProc: + def __init__(self, lines, rc=0): + self.stdout = _FakeStdout(lines) + self.stderr = _FakeStderr() + self.returncode = None + self._rc = rc + + async def wait(self): + self.returncode = self._rc + return self._rc + + def kill(self): + self.returncode = -9 + + +def _patch_proc(monkeypatch, lines, rc=0): + async def _fake_spawn(*argv, **kwargs): + return _FakeProc(lines, rc) + monkeypatch.setattr(sessionmod.asyncio, "create_subprocess_exec", _fake_spawn) + + +_TURN_LINES = [ + '{"type":"system","subtype":"init","session_id":"s"}', + '{"type":"system","subtype":"thinking_tokens","estimated_tokens":5}', + '{"type":"assistant","message":{"content":[{"type":"text","text":"checking disk"}]}}', + '{"type":"assistant","message":{"content":[{"type":"tool_use","name":"Bash","input":{"command":"df -h"}}]}}', + '{"type":"result","is_error":false,"result":"done","duration_ms":12}', +] + + +# --------------------------------------------------------------------------- # +# Session: event log + broadcast + replay/Last-Event-ID. +# --------------------------------------------------------------------------- # +def test_add_event_assigns_sequential_ids(): + s = sessionmod.Session("s1") + a = s.add_event({"kind": "user", "text": "hi"}) + b = s.add_event({"kind": "text", "text": "yo"}) + assert a["id"] == 0 and b["id"] == 1 + assert [e["kind"] for e in s.events] == ["user", "text"] + + +def test_subscribe_receives_broadcast(): + s = sessionmod.Session("s1") + q = s.subscribe() + s.add_event({"kind": "text", "text": "live"}) + assert q.get_nowait()["text"] == "live" + s.unsubscribe(q) + s.add_event({"kind": "text", "text": "after"}) + assert q.empty() + + +@pytest.mark.asyncio +async def test_attach_replays_then_signals_caught_up(): + s = sessionmod.Session("s1") + s.add_event({"kind": "user", "text": "diagnose"}) + s.add_event({"kind": "text", "text": "looking"}) + frames = [] + async for frame in sessionmod.attach_stream(s, last_event_id=None): + frames.append(frame) + if "caught-up" in frame: + break + body = "".join(frames) + assert "diagnose" in body and "looking" in body + assert "id: 0" in body and "id: 1" in body + assert "event: caught-up" in frames[-1] + + +@pytest.mark.asyncio +async def test_attach_reconnect_replays_only_missed(): + s = sessionmod.Session("s1") + for i in range(3): + s.add_event({"kind": "text", "text": f"e{i}"}) # ids 0,1,2 + frames = [] + async for frame in sessionmod.attach_stream(s, last_event_id=0): # already saw id 0 + frames.append(frame) + if "caught-up" in frame: + break + body = "".join(frames) + assert "e0" not in body # not re-sent + assert "e1" in body and "e2" in body + + +# --------------------------------------------------------------------------- # +# Session: running a detached turn (mocked subprocess). +# --------------------------------------------------------------------------- # +@pytest.mark.asyncio +async def test_turn_streams_events_into_log(monkeypatch): + _patch_proc(monkeypatch, _TURN_LINES) + s = sessionmod.Session("s1") + assert s.start_turn("diagnose the devvm") is True + await s._turn # wait for the detached turn to finish + kinds = [e["kind"] for e in s.events] + assert kinds[0] == "user" + assert "session" in kinds and "text" in kinds and "tool" in kinds + assert "result" in kinds and kinds[-1] == "turn_end" + assert "thinking_tokens" not in kinds + + +@pytest.mark.asyncio +async def test_one_turn_at_a_time(monkeypatch): + _patch_proc(monkeypatch, _TURN_LINES) + s = sessionmod.Session("s1") + assert s.start_turn("first") is True + assert s.start_turn("second") is False # task not done yet + await s._turn + + +@pytest.mark.asyncio +async def test_resume_after_first_turn(monkeypatch): + captured = {"argvs": []} + + async def _fake_spawn(*argv, **kwargs): + captured["argvs"].append(argv) + return _FakeProc(_TURN_LINES) + + monkeypatch.setattr(sessionmod.asyncio, "create_subprocess_exec", _fake_spawn) + s = sessionmod.Session("s1") + s.start_turn("first"); await s._turn + s.start_turn("second"); await s._turn + assert "--session-id" in captured["argvs"][0] + assert "--resume" in captured["argvs"][1] + + +# --------------------------------------------------------------------------- # +# SessionManager. +# --------------------------------------------------------------------------- # +def test_manager_create_get(): + m = sessionmod.SessionManager() + s = m.create() + assert m.get(s.id) is s + assert m.get("nope") is None + assert m.get_or_create(s.id) is s + assert m.get_or_create(None).id != s.id + + +# --------------------------------------------------------------------------- # +# PVE verb whitelist (unchanged security boundary). +# --------------------------------------------------------------------------- # def test_allowed_verbs_match_host_script(): - assert pve.ALLOWED_VERBS == { - "status", "forensics", "reset", "stop", "start", "cycle" - } + assert pve.ALLOWED_VERBS == {"status", "forensics", "reset", "stop", "start", "cycle"} assert pve.MUTATING_VERBS == {"reset", "stop", "start", "cycle"} - assert pve.MUTATING_VERBS < pve.ALLOWED_VERBS -@pytest.mark.parametrize("bad", [ - "rm -rf /", "status; rm -rf /", "status 103", "shutdown", "", "STATUS", - "cycle 999", "$(reboot)", "../start", -]) +@pytest.mark.parametrize("bad", ["rm -rf /", "status; reboot", "status 103", "", "STATUS"]) @pytest.mark.asyncio async def test_run_verb_rejects_non_whitelisted_without_ssh(bad, monkeypatch): - """A bad verb must be rejected locally — never spawning a subprocess.""" - called = False - async def _boom(*a, **k): - nonlocal called - called = True raise AssertionError("ssh must not run for a rejected verb") - monkeypatch.setattr(pve.asyncio, "create_subprocess_exec", _boom) result = await pve.run_verb(bad) assert result["rejected"] is True - assert result["exit_code"] is None - assert called is False - - -@pytest.mark.asyncio -async def test_run_verb_allowed_invokes_ssh_with_bare_verb(monkeypatch): - captured = {} - - class _FakeProc: - returncode = 0 - - async def communicate(self): - return (b"status: running\n", b"") - - async def _fake_exec(*argv, **kwargs): - captured["argv"] = argv - return _FakeProc() - - monkeypatch.setattr(pve.asyncio, "create_subprocess_exec", _fake_exec) - result = await pve.run_verb("status") - assert result["rejected"] is False - assert result["exit_code"] == 0 - assert "running" in result["stdout"] - # The verb is the LAST argv element, passed as a single token (no shell). - assert captured["argv"][-1] == "status" - assert captured["argv"][0] == "ssh" # --------------------------------------------------------------------------- # -# stream-json -> UI event translation (pure function). +# translate_event (pure). # --------------------------------------------------------------------------- # - -def test_translate_init_to_session(): - ev = agent_session.translate_event( +def test_translate_init_and_noise_and_blocks(): + assert agent_session.translate_event( {"type": "system", "subtype": "init", "session_id": "abc"} + ) == {"kind": "session", "session_id": "abc"} + assert agent_session.translate_event({"type": "system", "subtype": "hook_started"}) is None + assert agent_session.translate_event( + {"type": "assistant", "message": {"content": [{"type": "text", "text": "hi"}]}} + ) == {"kind": "text", "text": "hi"} + tool = agent_session.translate_event( + {"type": "assistant", "message": {"content": [{"type": "tool_use", "name": "Bash", "input": {"command": "df -h"}}]}} ) - assert ev == {"kind": "session", "session_id": "abc"} - - -@pytest.mark.parametrize("noise", [ - {"type": "system", "subtype": "hook_started"}, - {"type": "system", "subtype": "thinking_tokens", "estimated_tokens": 5}, - {"type": "user", "message": {"content": []}}, - {"type": "unknown"}, -]) -def test_translate_drops_noise(noise): - assert agent_session.translate_event(noise) is None - - -def test_translate_assistant_text(): - ev = agent_session.translate_event({ - "type": "assistant", - "message": {"content": [{"type": "text", "text": "checking disk"}]}, - }) - assert ev == {"kind": "text", "text": "checking disk"} - - -def test_translate_assistant_tool_use(): - ev = agent_session.translate_event({ - "type": "assistant", - "message": {"content": [ - {"type": "tool_use", "name": "Bash", "input": {"command": "df -h"}} - ]}, - }) - assert ev["kind"] == "tool" - assert ev["name"] == "Bash" - assert ev["input"]["command"] == "df -h" - - -def test_translate_result(): - ev = agent_session.translate_event({ - "type": "result", "is_error": False, "result": "done", "duration_ms": 1234, - }) - assert ev == {"kind": "result", "is_error": False, "result": "done", "duration_ms": 1234} + assert tool["kind"] == "tool" and tool["input"]["command"] == "df -h" # --------------------------------------------------------------------------- # # Routes + auth. # --------------------------------------------------------------------------- # - client = TestClient(app) AUTH = {"Authorization": "Bearer test-token"} def test_health_no_auth(): - r = client.get("/health") - assert r.status_code == 200 - assert r.json()["service"] == "claude-breakglass" + assert client.get("/health").json()["service"] == "claude-breakglass" def test_api_requires_auth(): assert client.post("/api/session").status_code == 401 assert client.get("/api/pve/verbs").status_code == 401 + assert client.post("/api/session/x/prompt", json={"prompt": "hi"}).status_code == 401 -def test_api_accepts_bearer(): +def test_session_create_and_unknown_session_404(): r = client.post("/api/session", headers=AUTH) - assert r.status_code == 200 - assert "session_id" in r.json() + assert r.status_code == 200 and "session_id" in r.json() + assert client.post("/api/session/nope/prompt", headers=AUTH, json={"prompt": "x"}).status_code == 404 + assert client.post("/api/session/nope/cancel", headers=AUTH).status_code == 404 -def test_api_accepts_authentik_header(): - r = client.post("/api/session", headers={"X-authentik-username": "me@viktorbarzin.me"}) - assert r.status_code == 200 +def test_prompt_starts_turn(monkeypatch): + monkeypatch.setattr(sessionmod.Session, "start_turn", lambda self, *a, **k: True) + sid = client.post("/api/session", headers=AUTH).json()["session_id"] + r = client.post(f"/api/session/{sid}/prompt", headers=AUTH, json={"prompt": "diagnose"}) + assert r.status_code == 200 and r.json()["status"] == "started" -def test_pve_verb_route_rejects_unknown(): - r = client.post("/api/pve/destroy", headers=AUTH) - assert r.status_code == 400 +def test_prompt_409_when_turn_active(monkeypatch): + monkeypatch.setattr(sessionmod.Session, "start_turn", lambda self, *a, **k: False) + sid = client.post("/api/session", headers=AUTH).json()["session_id"] + r = client.post(f"/api/session/{sid}/prompt", headers=AUTH, json={"prompt": "x"}) + assert r.status_code == 409 -def test_pve_verbs_listing(): - r = client.get("/api/pve/verbs", headers=AUTH) - assert r.status_code == 200 - body = r.json() - assert set(body["verbs"]) == pve.ALLOWED_VERBS - assert set(body["mutating"]) == pve.MUTATING_VERBS - - -def test_chat_streams_sse(monkeypatch): - async def _fake_turn(session_id, prompt, model=None): - yield {"kind": "session", "session_id": session_id} - yield {"kind": "text", "text": "hello"} - yield {"kind": "result", "is_error": False, "result": "ok"} - - monkeypatch.setattr(agent_session, "run_turn", _fake_turn) - r = client.post("/api/chat", headers=AUTH, - json={"session_id": "s1", "prompt": "diagnose"}) - assert r.status_code == 200 - assert "text/event-stream" in r.headers["content-type"] - body = r.text - assert "hello" in body - assert '"kind": "done"' in body # terminal frame always emitted +def test_pve_verbs_listing_and_unknown_rejected(): + assert set(client.get("/api/pve/verbs", headers=AUTH).json()["verbs"]) == pve.ALLOWED_VERBS + assert client.post("/api/pve/destroy", headers=AUTH).status_code == 400