From ecf974d9c06e0099d05db3c542c9177d0bcba68b Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Wed, 24 Jun 2026 16:18:00 +0200 Subject: [PATCH] =?UTF-8?q?feat(v9):=20Phase=204=20=E2=80=94=20Agent-Cockp?= =?UTF-8?q?it=20(Status/Cron/Skills)=20im=20Dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Macht das "geschenkte v9" sichtbar. Read-only Control-Plane-Reads: - hermes_control.py: gateway_state.json + cron-Heartbeat (Status), `hermes cron list` + `hermes skills list` via COLUMNS=400 (kein Rich-Truncation) als kanonische Quelle, .usage.json fuer Nutzung. TTL-Cache (10s) gegen Polling-Last. - routers/hermes.py: GET /api/hermes/{agent,cron,skills}. - HermesPanel: aufklappbares "Cockpit" — Status-Badges, Cron-Jobs, Skills (sortiert nach Nutzung, aktiv/inaktiv). - config.py: HERMES_HOME, HERMES_BIN. Co-Authored-By: Claude Opus 4.8 --- config.py | 5 + frontend/src/panels/HermesPanel.svelte | 124 ++++++++++++++++++++ hermes_control.py | 151 +++++++++++++++++++++++++ routers/hermes.py | 21 ++++ static/dist/main.js | 86 +++++++------- 5 files changed, 346 insertions(+), 41 deletions(-) create mode 100644 hermes_control.py diff --git a/config.py b/config.py index 185b0b5..2f4b2d0 100644 --- a/config.py +++ b/config.py @@ -69,6 +69,11 @@ def _read_hermes_api_key() -> str: HERMES_API_KEY = _read_hermes_api_key() +# Control-Plane-Reads (Phase 4): Hermes legt Status/Cron/Skills lokal unter +# ~/.hermes ab; die `hermes`-CLI ist die kanonische Quelle fuer Cron/Skills. +# MC laeuft als hitonabi auf der Box -> direkter Lese-/Exec-Zugriff. +HERMES_HOME = Path(os.path.expanduser(os.environ.get("HERMES_HOME", "~/.hermes"))) +HERMES_BIN = os.path.expanduser(os.environ.get("HERMES_BIN", "~/.local/bin/hermes")) HERMES_WINDOWS_HOST = os.environ.get("HERMES_WINDOWS_HOST", "") HERMES_WINDOWS_USER = os.environ.get("HERMES_WINDOWS_USER", "TobisPC") HERMES_SSH_KEY = Path(os.path.expanduser(os.environ.get("HERMES_SSH_KEY", "~/.ssh/id_ed25519_hermes_agent"))) diff --git a/frontend/src/panels/HermesPanel.svelte b/frontend/src/panels/HermesPanel.svelte index 5501a65..bc7fb37 100644 --- a/frontend/src/panels/HermesPanel.svelte +++ b/frontend/src/panels/HermesPanel.svelte @@ -19,6 +19,11 @@ let recording = $state(false) let status = $state(null) let setupOpen = $state(false) + let cockpitOpen = $state(false) + let cockpitLoading = $state(false) + let agent = $state(null) + let cronJobs = $state([]) + let skills = $state([]) let pubkey = $state('') let ws = $state(null) let currentBot = $state('') // aktuell gestreamter Hermes-Token @@ -195,6 +200,29 @@ } catch { pubkey = '' } } + // ---- Cockpit (Phase 4): Agent-Status, Cron, Skills ---- + async function loadCockpit() { + cockpitLoading = true + try { + const [a, c, s] = await Promise.all([ + api('/api/hermes/agent'), + api('/api/hermes/cron'), + api('/api/hermes/skills'), + ]) + agent = a + cronJobs = c.jobs || [] + skills = s.skills || [] + } catch { agent = null } + cockpitLoading = false + } + + // Skills sortiert: meistgenutzt zuerst, dann alphabetisch + let skillsSorted = $derived( + [...skills].sort((a, b) => + (b.use_count || 0) - (a.use_count || 0) || (a.name || '').localeCompare(b.name || '')) + ) + let skillsEnabled = $derived(skills.filter(s => (s.status || '').includes('enabled')).length) + // ---- Hilfsfunktionen ---- function toolLabel(name: string) { const map: Record = { @@ -245,6 +273,11 @@ onclick={() => voiceOn = !voiceOn}> 🔊 Voice {voiceOn ? 'an' : 'aus'} + + + + + +
+
+
+ Status +
Hermes-Gateway-Dienst (:8642) auf dem Bosgame
+
+
+ + ● {agent?.gateway_state ?? 'offline'} + + + ⏱ Scheduler {agent?.cron_running ? 'läuft' : 'inaktiv'} + + {#if agent?.heartbeat_age_s != null} + Ticker vor {agent.heartbeat_age_s}s + {/if} + {#if agent?.version} + v{agent.version} + {/if} +
+
+
+ + +
+
+ Geplante Aufgaben ({cronJobs.length}) +
+ {#if cronJobs.length === 0} +
+ Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B. + „Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades". +
+ {:else} +
+ {#each cronJobs as job} +
+ {#each Object.entries(job) as [k, v]} + {#if v}{k}: {v}{/if} + {/each} +
+ {/each} +
+ {/if} +
+ + +
+
+ Skills ({skillsEnabled} aktiv von {skills.length}) +
+ {#if skills.length === 0} +
Keine Skills geladen (oder Agent offline).
+ {:else} +
+ {#each skillsSorted as s} +
+ + {s.name} + {#if s.category}{s.category}{/if} + + {#if s.use_count > 0} + + {s.use_count}× genutzt + + {/if} + {s.source} +
+ {/each} +
+ {/if} +
+ +{/if} + {#if setupOpen}
diff --git a/hermes_control.py b/hermes_control.py new file mode 100644 index 0000000..3d23c6f --- /dev/null +++ b/hermes_control.py @@ -0,0 +1,151 @@ +""" +Hermes-Agent Control-Plane — read-only Einblicke fuer das Dashboard (Phase 4). + +Macht das "geschenkte v9" sichtbar: Agent-Status, Cron-Scheduler und Skills des +Nous-Hermes-Agent-Frameworks. Quellen (MC laeuft als hitonabi auf dem Bosgame, +also direkter Zugriff): + + - Status : ~/.hermes/gateway_state.json + cron-Heartbeat-Datei (sauberes JSON, + kein Parsing). Liveness kommt aus dem Heartbeat, nicht aus dem evtl. + beim Start eingefrorenen gateway_state.json. + - Cron : `hermes cron list --all` (kanonisch; kein stabiles Storage-Schema). + - Skills : `hermes skills list` (kanonisch) + ~/.hermes/skills/.usage.json + (Nutzungszaehler). Rich-Tabellen werden mit COLUMNS=400 ohne + Truncation erzeugt und ueber die `│`/`┃`-Spalten geparst. + +Alles mit kurzem TTL-Cache, damit Dashboard-Polling die CLI nicht haemmert. +""" + +import json +import os +import re +import subprocess +import time +from typing import Callable + +from config import HERMES_HOME, HERMES_BIN + +_CACHE_TTL = 10.0 # Sekunden +_cache: dict[str, tuple[float, object]] = {} + + +def _cached(key: str, fn: Callable[[], object]) -> object: + now = time.monotonic() + hit = _cache.get(key) + if hit and now - hit[0] < _CACHE_TTL: + return hit[1] + val = fn() + _cache[key] = (now, val) + return val + + +def _run_cli(args: list[str], timeout: float = 45.0) -> str: + """`hermes ` ausfuehren. COLUMNS=400 verhindert Rich-Truncation.""" + env = dict(os.environ, COLUMNS="400", NO_COLOR="1") + try: + p = subprocess.run( + [HERMES_BIN, *args], + capture_output=True, text=True, timeout=timeout, env=env, + ) + return p.stdout or "" + except Exception: + return "" + + +def _parse_rich_table(text: str) -> list[dict]: + """Eine Rich-Box-Tabelle in list[dict] verwandeln. + + Erste Zeile mit Spaltentrennern (`│` oder `┃`) ist der Header, der Rest sind + Datenzeilen. Trenn-/Rahmenzeilen (┏━┓ usw.) enthalten keine Trenner -> ignoriert. + """ + header: list[str] | None = None + rows: list[list[str]] = [] + for ln in text.splitlines(): + if "│" not in ln and "┃" not in ln: + continue + cells = [c.strip() for c in re.split(r"[│┃]", ln)] + # fuehrende/abschliessende Rahmen-Leerzellen entfernen + while cells and cells[0] == "": + cells.pop(0) + while cells and cells[-1] == "": + cells.pop() + if not cells: + continue + if header is None: + header = [c.lower() for c in cells] + else: + rows.append(cells) + if not header: + return [] + out = [] + for r in rows: + if len(r) != len(header): + continue + out.append(dict(zip(header, r))) + return out + + +# --------------------------------------------------------------------------- +# Oeffentliche Reads +# --------------------------------------------------------------------------- + +def agent_status() -> dict: + """Live-Status des Hermes-Gateways + Cron-Tickers.""" + def _load() -> dict: + st = { + "gateway_state": "unknown", + "pid": None, + "active_agents": None, + "api_server": "unknown", + "cron_running": False, + "heartbeat_age_s": None, + "version": None, + } + try: + d = json.loads((HERMES_HOME / "gateway_state.json").read_text()) + st["gateway_state"] = d.get("gateway_state", "unknown") + st["pid"] = d.get("pid") + st["active_agents"] = d.get("active_agents") + api = (d.get("platforms") or {}).get("api_server") or {} + st["api_server"] = api.get("state", "unknown") + except Exception: + pass + # Liveness: Cron-Ticker-Heartbeat (Unix-Timestamp). < 120s = laeuft. + try: + ts = float((HERMES_HOME / "cron" / "ticker_heartbeat").read_text().strip()) + age = max(0, int(time.time() - ts)) + st["heartbeat_age_s"] = age + st["cron_running"] = age < 120 + except Exception: + pass + try: + st["version"] = (HERMES_HOME / "PINNED_VERSION").read_text().strip() or None + except Exception: + pass + return st + + return _cached("agent", _load) + + +def cron_jobs() -> list[dict]: + """Geplante Jobs (inkl. pausierter).""" + return _cached("cron", lambda: _parse_rich_table(_run_cli(["cron", "list", "--all"]))) # type: ignore[return-value] + + +def skills() -> list[dict]: + """Installierte Skills, angereichert um Nutzungszaehler aus .usage.json.""" + def _load() -> list[dict]: + rows = _parse_rich_table(_run_cli(["skills", "list"])) + usage = {} + try: + usage = json.loads((HERMES_HOME / "skills" / ".usage.json").read_text()) + except Exception: + pass + for r in rows: + u = usage.get(r.get("name", ""), {}) + r["use_count"] = u.get("use_count", 0) + r["last_used_at"] = u.get("last_used_at") + r["pinned"] = bool(u.get("pinned", False)) + return rows + + return _cached("skills", _load) # type: ignore[return-value] diff --git a/routers/hermes.py b/routers/hermes.py index aa8d2d8..46183f4 100644 --- a/routers/hermes.py +++ b/routers/hermes.py @@ -268,6 +268,27 @@ def hermes_status(): } +@router.get("/hermes/agent", dependencies=[Depends(auth)]) +def hermes_agent_status(): + """Phase 4 — Live-Status des Hermes-Agent-Gateways + Cron-Tickers.""" + from hermes_control import agent_status + return agent_status() + + +@router.get("/hermes/cron", dependencies=[Depends(auth)]) +def hermes_cron(): + """Phase 4 — geplante Cron-Jobs des Hermes-Agenten (inkl. pausierter).""" + from hermes_control import cron_jobs + return {"jobs": cron_jobs()} + + +@router.get("/hermes/skills", dependencies=[Depends(auth)]) +def hermes_skills(): + """Phase 4 — installierte Skills des Hermes-Agenten + Nutzungszaehler.""" + from hermes_control import skills + return {"skills": skills()} + + @router.get("/hermes/pubkey", dependencies=[Depends(auth)]) def hermes_pubkey(): """Gibt den SSH-Public-Key des Hermes Agent zurueck (fuer Windows authorized_keys).""" diff --git a/static/dist/main.js b/static/dist/main.js index eec2637..6f02eb0 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,75 +1,75 @@ -var sl=Object.defineProperty;var $r=e=>{throw TypeError(e)};var ll=(e,n,a)=>n in e?sl(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a;var vn=(e,n,a)=>ll(e,typeof n!="symbol"?n+"":n,a),Ui=(e,n,a)=>n.has(e)||$r("Cannot "+a);var h=(e,n,a)=>(Ui(e,n,"read from private field"),a?a.call(e):n.get(e)),Oe=(e,n,a)=>n.has(e)?$r("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(e):n.set(e,a),Pe=(e,n,a,s)=>(Ui(e,n,"write to private field"),s?s.call(e,a):n.set(e,a),a),nt=(e,n,a)=>(Ui(e,n,"access private method"),a);var yr=Array.isArray,ol=Array.prototype.indexOf,zi=Array.prototype.includes,Fi=Array.from,dl=Object.defineProperty,ii=Object.getOwnPropertyDescriptor,cl=Object.getOwnPropertyDescriptors,vl=Object.prototype,ul=Array.prototype,cs=Object.getPrototypeOf,Ir=Object.isExtensible;const pl=()=>{};function fl(e){for(var n=0;n{e=s,n=l});return{promise:a,resolve:e,reject:n}}function aa(e,n){if(Array.isArray(e))return e;if(n===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const s of e)if(a.push(s),a.length===n)break;return a}const tn=2,Na=4,Ki=8,us=1<<24,Cn=16,zn=32,la=64,sr=128,kn=512,Ht=1024,Xt=2048,Kn=4096,rn=8192,wn=16384,Ja=32768,lr=1<<25,qa=65536,Pi=1<<17,hl=1<<18,Qa=1<<19,gl=1<<20,Bn=1<<25,Sa=65536,Di=1<<21,Da=1<<22,sa=1<<23,$a=Symbol("$state"),ml=Symbol(""),Si=Symbol("attributes"),or=Symbol("class"),dr=Symbol("style"),Xa=Symbol("text"),Mi=Symbol("form reset"),Ni=new class extends Error{constructor(){super(...arguments);vn(this,"name","StaleReactionError");vn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ss;const bl=!!((ss=globalThis.document)!=null&&ss.contentType)&&globalThis.document.contentType.includes("xml");function ps(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function _l(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function yl(e,n,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function xl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function kl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function wl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Sl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Ml(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function El(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Al(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Cl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Tl=1,zl=2,fs=4,Pl=8,Dl=16,$l=1,Il=2,Ut=Symbol("uninitialized"),hs="http://www.w3.org/1999/xhtml",Ll="http://www.w3.org/2000/svg",Ol="http://www.w3.org/1998/Math/MathML";function Bl(){console.warn("https://svelte.dev/e/derived_inert")}function Rl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Fl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function gs(e){return e===this.v}function Kl(e,n){return e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function"}function ms(e){return!Kl(e,this.v)}let en=null;function Va(e){en=e}function Pn(e,n=!1,a){en={p:en,i:!1,c:null,e:null,s:e,x:null,r:Ge,l:null}}function Dn(e){var n=en,a=n.e;if(a!==null){n.e=null;for(var s of a)Fs(s)}return n.i=!0,en=n.p,{}}function bs(){return!0}let va=[];function _s(){var e=va;va=[],fl(e)}function ya(e){if(va.length===0&&!si){var n=va;queueMicrotask(()=>{n===va&&_s()})}va.push(e)}function Nl(){for(;va.length>0;)_s()}function ys(e){var n=Ge;if(n===null)return Ve.f|=sa,e;if((n.f&Ja)===0&&(n.f&Na)===0)throw e;ia(e,n)}function ia(e,n){if(!(n!==null&&(n.f&wn)!==0)){for(;n!==null;){if((n.f&sr)!==0){if((n.f&Ja)===0)throw e;try{n.b.error(e);return}catch(a){e=a}}n=n.parent}throw e}}const ql=-7169;function Nt(e,n){e.f=e.f&ql|n}function xr(e){(e.f&kn)!==0||e.deps===null?Nt(e,Ht):Nt(e,Kn)}function xs(e){if(e!==null)for(const n of e)(n.f&tn)===0||(n.f&Sa)===0||(n.f^=Sa,xs(n.deps))}function ks(e,n,a){(e.f&Xt)!==0?n.add(e):(e.f&Kn)!==0&&a.add(e),xs(e.deps),Nt(e,Ht)}function Vl(e){let n=0,a=Ea(0),s;return()=>{Cr()&&(t(a),qi(()=>(n===0&&(s=Za(()=>e(()=>li(a)))),n+=1,()=>{ya(()=>{n-=1,n===0&&(s==null||s(),s=void 0,li(a))})})))}}var Wl=qa|Qa;function Gl(e,n,a,s){new jl(e,n,a,s)}var mn,_r,bn,ha,ln,_n,nn,pn,Wn,ga,ta,Ia,pi,fi,Gn,Oi,It,Ul,Hl,Jl,cr,Ei,Ai,vr,ur;class jl{constructor(n,a,s,l){Oe(this,It);vn(this,"parent");vn(this,"is_pending",!1);vn(this,"transform_error");Oe(this,mn);Oe(this,_r,null);Oe(this,bn);Oe(this,ha);Oe(this,ln);Oe(this,_n,null);Oe(this,nn,null);Oe(this,pn,null);Oe(this,Wn,null);Oe(this,ga,0);Oe(this,ta,0);Oe(this,Ia,!1);Oe(this,pi,new Set);Oe(this,fi,new Set);Oe(this,Gn,null);Oe(this,Oi,Vl(()=>(Pe(this,Gn,Ea(h(this,ga))),()=>{Pe(this,Gn,null)})));var o;Pe(this,mn,n),Pe(this,bn,a),Pe(this,ha,v=>{var d=Ge;d.b=this,d.f|=sr,s(v)}),this.parent=Ge.b,this.transform_error=l??((o=this.parent)==null?void 0:o.transform_error)??(v=>v),Pe(this,ln,Tr(()=>{nt(this,It,cr).call(this)},Wl))}defer_effect(n){ks(n,h(this,pi),h(this,fi))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!h(this,bn).pending}update_pending_count(n,a){nt(this,It,vr).call(this,n,a),Pe(this,ga,h(this,ga)+n),!(!h(this,Gn)||h(this,Ia))&&(Pe(this,Ia,!0),ya(()=>{Pe(this,Ia,!1),h(this,Gn)&&Wa(h(this,Gn),h(this,ga))}))}get_effect_pending(){return h(this,Oi).call(this),t(h(this,Gn))}error(n){if(!h(this,bn).onerror&&!h(this,bn).failed)throw n;ge!=null&&ge.is_fork?(h(this,_n)&&ge.skip_effect(h(this,_n)),h(this,nn)&&ge.skip_effect(h(this,nn)),h(this,pn)&&ge.skip_effect(h(this,pn)),ge.oncommit(()=>{nt(this,It,ur).call(this,n)})):nt(this,It,ur).call(this,n)}}mn=new WeakMap,_r=new WeakMap,bn=new WeakMap,ha=new WeakMap,ln=new WeakMap,_n=new WeakMap,nn=new WeakMap,pn=new WeakMap,Wn=new WeakMap,ga=new WeakMap,ta=new WeakMap,Ia=new WeakMap,pi=new WeakMap,fi=new WeakMap,Gn=new WeakMap,Oi=new WeakMap,It=new WeakSet,Ul=function(){try{Pe(this,_n,yn(()=>h(this,ha).call(this,h(this,mn))))}catch(n){this.error(n)}},Hl=function(n){const a=h(this,bn).failed;a&&Pe(this,pn,yn(()=>{a(h(this,mn),()=>n,()=>()=>{})}))},Jl=function(){const n=h(this,bn).pending;n&&(this.is_pending=!0,Pe(this,nn,yn(()=>n(h(this,mn)))),ya(()=>{var a=Pe(this,Wn,document.createDocumentFragment()),s=Jn();a.append(s),Pe(this,_n,nt(this,It,Ai).call(this,()=>yn(()=>h(this,ha).call(this,s)))),h(this,ta)===0&&(h(this,mn).before(a),Pe(this,Wn,null),ka(h(this,nn),()=>{Pe(this,nn,null)}),nt(this,It,Ei).call(this,ge))}))},cr=function(){try{if(this.is_pending=this.has_pending_snippet(),Pe(this,ta,0),Pe(this,ga,0),Pe(this,_n,yn(()=>{h(this,ha).call(this,h(this,mn))})),h(this,ta)>0){var n=Pe(this,Wn,document.createDocumentFragment());Pr(h(this,_n),n);const a=h(this,bn).pending;Pe(this,nn,yn(()=>a(h(this,mn))))}else nt(this,It,Ei).call(this,ge)}catch(a){this.error(a)}},Ei=function(n){this.is_pending=!1,n.transfer_effects(h(this,pi),h(this,fi))},Ai=function(n){var a=Ge,s=Ve,l=en;Nn(h(this,ln)),Sn(h(this,ln)),Va(h(this,ln).ctx);try{return Ma.ensure(),n()}catch(o){return ys(o),null}finally{Nn(a),Sn(s),Va(l)}},vr=function(n,a){var s;if(!this.has_pending_snippet()){this.parent&&nt(s=this.parent,It,vr).call(s,n,a);return}Pe(this,ta,h(this,ta)+n),h(this,ta)===0&&(nt(this,It,Ei).call(this,a),h(this,nn)&&ka(h(this,nn),()=>{Pe(this,nn,null)}),h(this,Wn)&&(h(this,mn).before(h(this,Wn)),Pe(this,Wn,null)))},ur=function(n){h(this,_n)&&(cn(h(this,_n)),Pe(this,_n,null)),h(this,nn)&&(cn(h(this,nn)),Pe(this,nn,null)),h(this,pn)&&(cn(h(this,pn)),Pe(this,pn,null));var a=h(this,bn).onerror;let s=h(this,bn).failed;var l=!1,o=!1;const v=()=>{if(l){Fl();return}l=!0,o&&Cl(),h(this,pn)!==null&&ka(h(this,pn),()=>{Pe(this,pn,null)}),nt(this,It,Ai).call(this,()=>{nt(this,It,cr).call(this)})},d=u=>{try{o=!0,a==null||a(u,v),o=!1}catch(p){ia(p,h(this,ln)&&h(this,ln).parent)}s&&Pe(this,pn,nt(this,It,Ai).call(this,()=>{try{return yn(()=>{var p=Ge;p.b=this,p.f|=sr,s(h(this,mn),()=>u,()=>v)})}catch(p){return ia(p,h(this,ln).parent),null}}))};ya(()=>{var u;try{u=this.transform_error(n)}catch(p){ia(p,h(this,ln)&&h(this,ln).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(d,p=>ia(p,h(this,ln)&&h(this,ln).parent)):d(u)})};function Ql(e,n,a,s){const l=kr;var o=e.filter(y=>!y.settled),v=n.map(l);if(a.length===0&&o.length===0){s(v);return}var d=Ge,u=Zl(),p=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(y=>y.promise)):null;function _(y){if((d.f&wn)===0){u();try{s([...v,...y])}catch($){ia($,d)}$i()}}var C=ws();if(a.length===0){p.then(()=>_([])).finally(C);return}function m(){Promise.all(a.map(y=>Yl(y))).then(_).catch(y=>ia(y,d)).finally(C)}p?p.then(()=>{u(),m(),$i()}):m()}function Zl(){var e=Ge,n=Ve,a=en,s=ge;return function(o=!0){Nn(e),Sn(n),Va(a),o&&(e.f&wn)===0&&(s==null||s.activate(),s==null||s.apply())}}function $i(e=!0){Nn(null),Sn(null),Va(null),e&&(ge==null||ge.deactivate())}function ws(){var e=Ge,n=e.b,a=ge,s=!!(n!=null&&n.is_rendered());return n==null||n.update_pending_count(1,a),a.increment(s,e),()=>{n==null||n.update_pending_count(-1,a),a.decrement(s,e)}}function kr(e){var n=tn|Xt;return Ge!==null&&(Ge.f|=Qa),{ctx:en,deps:null,effects:null,equals:gs,f:n,fn:e,reactions:null,rv:0,v:Ut,wv:0,parent:Ge,ac:null}}const ei=Symbol("obsolete");function Yl(e,n,a){let s=Ge;s===null&&_l();var l=void 0,o=Ea(Ut),v=!Ve,d=new Set;return go(()=>{var y,$;var u=Ge,p=vs();l=p.promise;try{Promise.resolve(e()).then(p.resolve,O=>{O!==Ni&&p.reject(O)}).finally($i)}catch(O){p.reject(O),$i()}var _=ge;if(v){if((u.f&Ja)!==0)var C=ws();if((y=s.b)!=null&&y.is_rendered())($=_.async_deriveds.get(u))==null||$.reject(ei);else for(const O of d.values())O.reject(ei);d.add(p),_.async_deriveds.set(u,p)}const m=(O,M=void 0)=>{C==null||C(),d.delete(p),M!==ei&&(_.activate(),M?(o.f|=sa,Wa(o,M)):((o.f&sa)!==0&&(o.f^=sa),Wa(o,O)),_.deactivate())};p.promise.then(m,O=>m(null,O||"unknown"))}),Rs(()=>{for(const u of d)u.reject(ei)}),new Promise(u=>{function p(_){function C(){_===l?u(o):p(l)}_.then(C,C)}p(l)})}function G(e){const n=kr(e);return js(n),n}function Xl(e){const n=kr(e);return n.equals=ms,n}function eo(e){var n=e.effects;if(n!==null){e.effects=null;for(var a=0;athis.schedule(s)){var s=h(this,Ln).get(n);if(s){h(this,Ln).delete(n);for(var l of s.d)Nt(l,Xt),a(l);for(l of s.m)Nt(l,Kn),a(l)}h(this,Ka).add(n)}capture(n,a,s=!1){n.v!==Ut&&!this.previous.has(n)&&this.previous.set(n,n.v),(n.f&sa)===0&&(this.current.set(n,[a,s]),Yt==null||Yt.set(n,a)),this.is_fork||(n.v=a)}activate(){ge=this}deactivate(){ge=null,Yt=null}flush(){try{Ji=!0,ge=this,nt(this,pt,ti).call(this)}finally{Lr=0,pr=null,Pa=null,Ci=null,Ji=!1,ge=null,Yt=null,xa.clear()}}discard(){var n;for(const a of h(this,Ba))a(this);h(this,Ba).clear();for(const a of this.async_deriveds.values())a.reject(ei);nt(this,pt,ni).call(this),(n=h(this,Fa))==null||n.resolve()}register_created_effect(n){h(this,hi).push(n)}increment(n,a){if(Pe(this,Ra,h(this,Ra)+1),n){let s=h(this,jn).get(a)??0;h(this,jn).set(a,s+1)}}decrement(n,a){if(Pe(this,Ra,h(this,Ra)-1),n){let s=h(this,jn).get(a)??0;s===1?h(this,jn).delete(a):h(this,jn).set(a,s-1)}h(this,ba)||(Pe(this,ba,!0),ya(()=>{Pe(this,ba,!1),this.linked&&this.flush()}))}transfer_effects(n,a){for(const s of n)h(this,Un).add(s);for(const s of a)h(this,En).add(s);n.clear(),a.clear()}oncommit(n){h(this,Oa).add(n)}ondiscard(n){h(this,Ba).add(n)}settled(){return(h(this,Fa)??Pe(this,Fa,vs())).promise}static ensure(){if(ge===null){const n=ge=new Bi;!Ji&&!si&&ya(()=>{h(n,La)||n.flush()})}return ge}apply(){{Yt=null;return}}schedule(n){var l;if(pr=n,(l=n.b)!=null&&l.is_pending&&(n.f&(Na|Ki|us))!==0&&(n.f&Ja)===0){n.b.defer_effect(n);return}for(var a=n;a.parent!==null;){a=a.parent;var s=a.f;if(Pa!==null&&a===Ge&&(Ve===null||(Ve.f&tn)===0))return;if((s&(la|zn))!==0){if((s&Ht)===0)return;a.f^=Ht}}h(this,on).push(a)}};La=new WeakMap,na=new WeakMap,ma=new WeakMap,Oa=new WeakMap,Ba=new WeakMap,Ra=new WeakMap,jn=new WeakMap,Fa=new WeakMap,on=new WeakMap,hi=new WeakMap,Un=new WeakMap,En=new WeakMap,Ln=new WeakMap,Ka=new WeakMap,ba=new WeakMap,pt=new WeakSet,fr=function(){if(this.is_fork)return!0;for(const s of h(this,jn).keys()){for(var n=s,a=!1;n.parent!==null;){if(h(this,Ln).has(n)){a=!0;break}n=n.parent}if(!a)return!0}return!1},ti=function(){var u,p,_,C;Pe(this,La,!0),Lr++>1e3&&(nt(this,pt,ni).call(this),ro());for(const m of h(this,Un))h(this,En).delete(m),Nt(m,Xt),this.schedule(m);for(const m of h(this,En))Nt(m,Kn),this.schedule(m);const n=h(this,on);Pe(this,on,[]),this.apply();var a=Pa=[],s=[],l=Ci=[];for(const m of n)try{nt(this,pt,hr).call(this,m,a,s)}catch(y){throw zs(m),nt(this,pt,fr).call(this)||this.discard(),y}if(ge=null,l.length>0){var o=Bi.ensure();for(const m of l)o.schedule(m)}if(Pa=null,Ci=null,nt(this,pt,fr).call(this)){nt(this,pt,za).call(this,s),nt(this,pt,za).call(this,a);for(const[m,y]of h(this,Ln))Ts(m,y);l.length>0&&nt(u=ge,pt,ti).call(u);return}const v=nt(this,pt,Es).call(this);if(v){nt(this,pt,za).call(this,s),nt(this,pt,za).call(this,a),nt(p=v,pt,As).call(p,this);return}h(this,Un).clear(),h(this,En).clear();for(const m of h(this,Oa))m(this);h(this,Oa).clear(),ri=this,Or(s),Or(a),ri=null,(_=h(this,Fa))==null||_.resolve();var d=ge;if(h(this,Ra)===0&&(h(this,on).length===0||d!==null)&&nt(this,pt,ni).call(this),h(this,on).length>0)if(d!==null){const m=d;h(m,on).push(...h(this,on).filter(y=>!h(m,on).includes(y)))}else d=this;d!==null&&nt(C=d,pt,ti).call(C)},hr=function(n,a,s){n.f^=Ht;for(var l=n.first;l!==null;){var o=l.f,v=(o&(zn|la))!==0,d=v&&(o&Ht)!==0,u=d||(o&rn)!==0||h(this,Ln).has(l);if(!u&&l.fn!==null){v?l.f^=Ht:(o&Na)!==0?a.push(l):_i(l)&&((o&Cn)!==0&&h(this,En).add(l),ja(l));var p=l.first;if(p!==null){l=p;continue}}for(;l!==null;){var _=l.next;if(_!==null){l=_;break}l=l.parent}}},Es=function(){for(var n=h(this,na);n!==null;){if(!n.is_fork){for(const[a,[,s]]of this.current)if(n.current.has(a)&&!s)return n}n=h(n,na)}return null},As=function(n){var s;for(const[l,o]of n.current)!this.previous.has(l)&&n.previous.has(l)&&this.previous.set(l,n.previous.get(l)),this.current.set(l,o);for(const[l,o]of n.async_deriveds){const v=this.async_deriveds.get(l);v&&o.promise.then(v.resolve).catch(v.reject)}n.async_deriveds.clear(),this.transfer_effects(h(n,Un),h(n,En));const a=l=>{var o=l.reactions;if(o!==null)for(const u of o){var v=u.f;if((v&tn)!==0)a(u);else{var d=u;v&(Da|Cn)&&!this.async_deriveds.has(d)&&(h(this,En).delete(d),Nt(d,Xt),this.schedule(d))}}};for(const l of this.current.keys())a(l);this.oncommit(()=>n.discard()),nt(s=n,pt,ni).call(s),ge=this,nt(this,pt,ti).call(this)},za=function(n){for(var a=0;a!m.current.get(y)[1]);if(!(!h(m,La)||l.length===0)){var o=l.filter(y=>!this.current.has(y));if(o.length===0)n&&m.discard();else if(a.length>0){if(n)for(const y of h(this,Ka))m.unskip_effect(y,$=>{var O;($.f&(Cn|Da))!==0?m.schedule($):nt(O=m,pt,za).call(O,[$])});m.activate();var v=new Set,d=new Map;for(var u of a)Cs(u,o,v,d);d=new Map;var p=[...m.current].filter(([y,$])=>{const O=this.current.get(y);return O?O[0]!==$[0]||O[1]!==$[1]:!0}).map(([y])=>y);if(p.length>0)for(const y of h(this,hi))(y.f&(wn|rn|Pi))===0&&Sr(y,p,d)&&((y.f&(Da|Cn))!==0?(Nt(y,Xt),m.schedule(y)):h(m,Un).add(y));if(h(m,on).length>0&&!h(m,ba)){m.apply();for(var _ of h(m,on))nt(C=m,pt,hr).call(C,_,[],[]);Pe(m,on,[])}m.deactivate()}}}},ni=function(){if(this.linked){var n=h(this,na),a=h(this,ma);n===null?Hi=a:Pe(n,ma,a),a===null?Ta=n:Pe(a,na,n),this.linked=!1}};let Ma=Bi;function io(e){var n=si;si=!0;try{for(var a;;){if(Nl(),ge===null)return a;ge.flush()}}finally{si=n}}function ro(){try{Sl()}catch(e){ia(e,pr)}}let Mn=null;function Or(e){var n=e.length;if(n!==0){for(var a=0;a0)){xa.clear();for(const l of Mn){if((l.f&(wn|rn))!==0)continue;const o=[l];let v=l.parent;for(;v!==null;)Mn.has(v)&&(Mn.delete(v),o.push(v)),v=v.parent;for(let d=o.length-1;d>=0;d--){const u=o[d];(u.f&(wn|rn))===0&&ja(u)}}Mn.clear()}}Mn=null}}function Cs(e,n,a,s){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const l of e.reactions){const o=l.f;(o&tn)!==0?Cs(l,n,a,s):(o&(Da|Cn))!==0&&(o&Xt)===0&&Sr(l,n,s)&&(Nt(l,Xt),Mr(l))}}function Sr(e,n,a){const s=a.get(e);if(s!==void 0)return s;if(e.deps!==null)for(const l of e.deps){if(zi.call(n,l))return!0;if((l.f&tn)!==0&&Sr(l,n,a))return a.set(l,!0),!0}return a.set(e,!1),!1}function Mr(e){ge.schedule(e)}function Ts(e,n){if(!((e.f&zn)!==0&&(e.f&Ht)!==0)){(e.f&Xt)!==0?n.d.push(e):(e.f&Kn)!==0&&n.m.push(e),Nt(e,Ht);for(var a=e.first;a!==null;)Ts(a,n),a=a.next}}function zs(e){Nt(e,Ht);for(var n=e.first;n!==null;)zs(n),n=n.next}let Ii=new Set;const xa=new Map;let Ps=!1;function Ea(e,n){var a={f:0,v:e,reactions:null,equals:gs,rv:0,wv:0};return a}function L(e,n){const a=Ea(e);return js(a),a}function so(e,n=!1,a=!0){const s=Ea(e);return n||(s.equals=ms),s}function c(e,n,a=!1){Ve!==null&&(!Tn||(Ve.f&Pi)!==0)&&bs()&&(Ve.f&(tn|Cn|Da|Pi))!==0&&(Rn===null||!Rn.has(e))&&Al();let s=a?Jt(n):n;return Wa(e,s,Ci)}function Wa(e,n,a=null){if(!e.equals(n)){xa.set(e,oa?n:e.v);var s=Ma.ensure();if(s.capture(e,n),(e.f&tn)!==0){const l=e;(e.f&Xt)!==0&&wr(l),Yt===null&&xr(l)}e.wv=Hs(),Ds(e,Xt,a),Ge!==null&&(Ge.f&Ht)!==0&&(Ge.f&(zn|la))===0&&(gn===null?bo([e]):gn.push(e)),!s.is_fork&&Ii.size>0&&!Ps&&lo()}return n}function lo(){Ps=!1;for(const e of Ii){(e.f&Ht)!==0&&Nt(e,Kn);let n;try{n=_i(e)}catch{n=!0}n&&ja(e)}Ii.clear()}function li(e){c(e,e.v+1)}function Ds(e,n,a){var s=e.reactions;if(s!==null)for(var l=s.length,o=0;o{if(wa===o)return d();var u=Ve,p=wa;Sn(null),Nr(o);var _=d();return Sn(u),Nr(p),_};return s&&a.set("length",L(e.length)),new Proxy(e,{defineProperty(d,u,p){(!("value"in p)||p.configurable===!1||p.enumerable===!1||p.writable===!1)&&Ml();var _=a.get(u);return _===void 0?v(()=>{var C=L(p.value);return a.set(u,C),C}):c(_,p.value,!0),!0},deleteProperty(d,u){var p=a.get(u);if(p===void 0){if(u in d){const _=v(()=>L(Ut));a.set(u,_),li(l)}}else c(p,Ut),li(l);return!0},get(d,u,p){var y;if(u===$a)return e;var _=a.get(u),C=u in d;if(_===void 0&&(!C||(y=ii(d,u))!=null&&y.writable)&&(_=v(()=>{var $=Jt(C?d[u]:Ut),O=L($);return O}),a.set(u,_)),_!==void 0){var m=t(_);return m===Ut?void 0:m}return Reflect.get(d,u,p)},getOwnPropertyDescriptor(d,u){var p=Reflect.getOwnPropertyDescriptor(d,u);if(p&&"value"in p){var _=a.get(u);_&&(p.value=t(_))}else if(p===void 0){var C=a.get(u),m=C==null?void 0:C.v;if(C!==void 0&&m!==Ut)return{enumerable:!0,configurable:!0,value:m,writable:!0}}return p},has(d,u){var m;if(u===$a)return!0;var p=a.get(u),_=p!==void 0&&p.v!==Ut||Reflect.has(d,u);if(p!==void 0||Ge!==null&&(!_||(m=ii(d,u))!=null&&m.writable)){p===void 0&&(p=v(()=>{var y=_?Jt(d[u]):Ut,$=L(y);return $}),a.set(u,p));var C=t(p);if(C===Ut)return!1}return _},set(d,u,p,_){var xe;var C=a.get(u),m=u in d;if(s&&u==="length")for(var y=p;yL(Ut)),a.set(y+"",$))}if(C===void 0)(!m||(xe=ii(d,u))!=null&&xe.writable)&&(C=v(()=>L(void 0)),c(C,Jt(p)),a.set(u,C));else{m=C.v!==Ut;var O=v(()=>Jt(p));c(C,O)}var M=Reflect.getOwnPropertyDescriptor(d,u);if(M!=null&&M.set&&M.set.call(_,p),!m){if(s&&typeof u=="string"){var F=a.get("length"),ye=Number(u);Number.isInteger(ye)&&ye>=F.v&&c(F,ye+1)}li(l)}return!0},ownKeys(d){t(l);var u=Reflect.ownKeys(d).filter(C=>{var m=a.get(C);return m===void 0||m.v!==Ut});for(var[p,_]of a)_.v!==Ut&&!(p in d)&&u.push(p);return u},setPrototypeOf(){El()}})}function Br(e){try{if(e!==null&&typeof e=="object"&&$a in e)return e[$a]}catch{}return e}function oo(e,n){return Object.is(Br(e),Br(n))}var Rr,$s,Is,Ls;function co(){if(Rr===void 0){Rr=window,$s=/Firefox/.test(navigator.userAgent);var e=Element.prototype,n=Node.prototype,a=Text.prototype;Is=ii(n,"firstChild").get,Ls=ii(n,"nextSibling").get,Ir(e)&&(e[or]=void 0,e[Si]=null,e[dr]=void 0,e.__e=void 0),Ir(a)&&(a[Xa]=void 0)}}function Jn(e=""){return document.createTextNode(e)}function ra(e){return Is.call(e)}function bi(e){return Ls.call(e)}function r(e,n){return ra(e)}function Xe(e,n=!1){{var a=ra(e);return a instanceof Comment&&a.data===""?bi(a):a}}function i(e,n=1,a=!1){let s=e;for(;n--;)s=bi(s);return s}function vo(e){e.textContent=""}function Os(){return!1}function Bs(e,n,a){return n==null||n===hs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(n,e,{is:a}):document.createElementNS(n,e)}let Fr=!1;function uo(){Fr||(Fr=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var n;if(!e.defaultPrevented)for(const a of e.target.elements)(n=a[Mi])==null||n.call(a)})},{capture:!0}))}function Er(e){var n=Ve,a=Ge;Sn(null),Nn(null);try{return e()}finally{Sn(n),Nn(a)}}function Ar(e,n,a,s=a){e.addEventListener(n,()=>Er(a));const l=e[Mi];l?e[Mi]=()=>{l(),s(!0)}:e[Mi]=()=>s(!0),uo()}function po(e){Ge===null&&(Ve===null&&wl(),kl()),oa&&xl()}function fo(e,n){var a=n.last;a===null?n.last=n.first=e:(a.next=e,e.prev=a,n.last=e)}function Qn(e,n){var a=Ge;a!==null&&(a.f&rn)!==0&&(e|=rn);var s={ctx:en,deps:null,nodes:null,f:e|Xt|kn,first:null,fn:n,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};ge==null||ge.register_created_effect(s);var l=s;if((e&Na)!==0)Pa!==null?Pa.push(s):Ma.ensure().schedule(s);else if(n!==null){try{ja(s)}catch(v){throw cn(s),v}l.deps===null&&l.teardown===null&&l.nodes===null&&l.first===l.last&&(l.f&Qa)===0&&(l=l.first,(e&Cn)!==0&&(e&qa)!==0&&l!==null&&(l.f|=qa))}if(l!==null&&(l.parent=a,a!==null&&fo(l,a),Ve!==null&&(Ve.f&tn)!==0&&(e&la)===0)){var o=Ve;(o.effects??(o.effects=[])).push(l)}return s}function Cr(){return Ve!==null&&!Tn}function Rs(e){const n=Qn(Ki,null);return Nt(n,Ht),n.teardown=e,n}function Ga(e){po();var n=Ge.f,a=!Ve&&(n&zn)!==0&&en!==null&&!en.i;if(a){var s=en;(s.e??(s.e=[])).push(e)}else return Fs(e)}function Fs(e){return Qn(Na|gl,e)}function ho(e){Ma.ensure();const n=Qn(la|Qa,e);return(a={})=>new Promise(s=>{a.outro?ka(n,()=>{cn(n),s(void 0)}):(cn(n),s(void 0))})}function Ks(e){return Qn(Na,e)}function go(e){return Qn(Da|Qa,e)}function qi(e,n=0){return Qn(Ki|n,e)}function D(e,n=[],a=[],s=[]){Ql(s,n,a,l=>{Qn(Ki,()=>{e(...l.map(t))})})}function Tr(e,n=0){var a=Qn(Cn|n,e);return a}function yn(e){return Qn(zn|Qa,e)}function Ns(e){var n=e.teardown;if(n!==null){const a=oa,s=Ve;Kr(!0),Sn(null);try{n.call(null)}finally{Kr(a),Sn(s)}}}function zr(e,n=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const l=a.ac;l!==null&&Er(()=>{l.abort(Ni)});var s=a.next;(a.f&la)!==0?a.parent=null:cn(a,n),a=s}}function mo(e){for(var n=e.first;n!==null;){var a=n.next;(n.f&zn)===0&&cn(n),n=a}}function cn(e,n=!0){var a=!1;(n||(e.f&hl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(qs(e.nodes.start,e.nodes.end),a=!0),e.f|=lr,zr(e,n&&!a),vi(e,0);var s=e.nodes&&e.nodes.t;if(s!==null)for(const o of s)o.stop();Ns(e),e.f^=lr,e.f|=wn;var l=e.parent;l!==null&&l.first!==null&&Vs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function qs(e,n){for(;e!==null;){var a=e===n?null:bi(e);e.remove(),e=a}}function Vs(e){var n=e.parent,a=e.prev,s=e.next;a!==null&&(a.next=s),s!==null&&(s.prev=a),n!==null&&(n.first===e&&(n.first=s),n.last===e&&(n.last=a))}function ka(e,n,a=!0){var s=[];Ws(e,s,!0);var l=()=>{a&&cn(e),n&&n()},o=s.length;if(o>0){var v=()=>--o||l();for(var d of s)d.out(v)}else l()}function Ws(e,n,a){if((e.f&rn)===0){e.f^=rn;var s=e.nodes&&e.nodes.t;if(s!==null)for(const d of s)(d.is_global||a)&&n.push(d);for(var l=e.first;l!==null;){var o=l.next;if((l.f&la)===0){var v=(l.f&qa)!==0||(l.f&zn)!==0&&(e.f&Cn)!==0;Ws(l,n,v?a:!1)}l=o}}}function Li(e){Gs(e,!0)}function Gs(e,n){if((e.f&rn)!==0){e.f^=rn,(e.f&Ht)===0&&(Nt(e,Xt),Ma.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,l=(a.f&qa)!==0||(a.f&zn)!==0;Gs(a,l?n:!1),a=s}var o=e.nodes&&e.nodes.t;if(o!==null)for(const v of o)(v.is_global||n)&&v.in()}}function Pr(e,n){if(e.nodes)for(var a=e.nodes.start,s=e.nodes.end;a!==null;){var l=a===s?null:bi(a);n.append(a),a=l}}let Ti=!1,oa=!1;function Kr(e){oa=e}let Ve=null,Tn=!1;function Sn(e){Ve=e}let Ge=null;function Nn(e){Ge=e}let Rn=null;function js(e){Ve!==null&&(Rn??(Rn=new Set)).add(e)}let dn=null,un=0,gn=null;function bo(e){gn=e}let Us=1,ua=0,wa=ua;function Nr(e){wa=e}function Hs(){return++Us}function _i(e){var n=e.f;if((n&Xt)!==0)return!0;if(n&tn&&(e.f&=~Sa),(n&Kn)!==0){for(var a=e.deps,s=a.length,l=0;le.wv)return!0}(n&kn)!==0&&Yt===null&&Nt(e,Ht)}return!1}function Js(e,n,a=!0){var s=e.reactions;if(s!==null&&!(Rn!==null&&Rn.has(e)))for(var l=0;l{e.ac.abort(Ni)}),e.ac=null);try{e.f|=Di;var _=e.fn,C=_();e.f|=Ja;var m=e.deps,y=ge==null?void 0:ge.is_fork;if(dn!==null){var $;if(y||vi(e,un),m!==null&&un>0)for(m.length=un+dn.length,$=0;${throw F});throw m}}finally{e[pa]=n,delete e.currentTarget,Sn(_),Nn(C)}}}var ls;const Qi=((ls=globalThis==null?void 0:globalThis.window)==null?void 0:ls.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function wo(e){return(Qi==null?void 0:Qi.createHTML(e))??e}function So(e){var n=Bs("template");return n.innerHTML=wo(e.replaceAll("","")),n.content}function Ua(e,n){var a=Ge;a.nodes===null&&(a.nodes={start:e,end:n,a:null,t:null})}function b(e,n){var a=(n&$l)!==0,s=(n&Il)!==0,l,o=!e.startsWith("");return()=>{l===void 0&&(l=So(o?e:""+e),a||(l=ra(l)));var v=s||$s?document.importNode(l,!0):l.cloneNode(!0);if(a){var d=ra(v),u=v.lastChild;Ua(d,u)}else Ua(v,v);return v}}function oi(e=""){{var n=Jn(e+"");return Ua(n,n),n}}function Ha(){var e=document.createDocumentFragment(),n=document.createComment(""),a=Jn();return e.append(n,a),Ua(n,a),e}function f(e,n){e!==null&&e.before(n)}function g(e,n){var a=n==null?"":typeof n=="object"?`${n}`:n;a!==(e[Xa]??(e[Xa]=e.nodeValue))&&(e[Xa]=a,e.nodeValue=`${a}`)}function Mo(e,n){return Eo(e,n)}const wi=new Map;function Eo(e,{target:n,anchor:a,props:s={},events:l,context:o,intro:v=!0,transformError:d}){co();var u=void 0,p=ho(()=>{var _=a??n.appendChild(Jn());Gl(_,{pending:()=>{}},y=>{Pn({});var $=en;o&&($.c=o),l&&(s.$$events=l),u=e(y,s)||{},Dn()},d);var C=new Set,m=y=>{for(var $=0;${var M;for(var y of C)for(const F of[n,document]){var $=wi.get(F),O=$.get(y);--O==0?(F.removeEventListener(y,Vr),$.delete(y),$.size===0&&wi.delete(F)):$.set(y,O)}gr.delete(m),_!==a&&((M=_.parentNode)==null||M.removeChild(_))}});return Ao.set(u,p),u}let Ao=new WeakMap;var An,On,fn,_a,gi,mi,Ri;class Co{constructor(n,a=!0){vn(this,"anchor");Oe(this,An,new Map);Oe(this,On,new Map);Oe(this,fn,new Map);Oe(this,_a,new Set);Oe(this,gi,!0);Oe(this,mi,n=>{if(h(this,An).has(n)){var a=h(this,An).get(n),s=h(this,On).get(a);if(s)Li(s),h(this,_a).delete(a);else{var l=h(this,fn).get(a);l&&(Li(l.effect),h(this,On).set(a,l.effect),h(this,fn).delete(a),l.fragment.lastChild.remove(),this.anchor.before(l.fragment),s=l.effect)}for(const[o,v]of h(this,An)){if(h(this,An).delete(o),o===n)break;const d=h(this,fn).get(v);d&&(cn(d.effect),h(this,fn).delete(v))}for(const[o,v]of h(this,On)){if(o===a||h(this,_a).has(o))continue;const d=()=>{if(Array.from(h(this,An).values()).includes(o)){var p=document.createDocumentFragment();Pr(v,p),p.append(Jn()),h(this,fn).set(o,{effect:v,fragment:p})}else cn(v);h(this,_a).delete(o),h(this,On).delete(o)};h(this,gi)||!s?(h(this,_a).add(o),ka(v,d,!1)):d()}}});Oe(this,Ri,n=>{h(this,An).delete(n);const a=Array.from(h(this,An).values());for(const[s,l]of h(this,fn))a.includes(s)||(cn(l.effect),h(this,fn).delete(s))});this.anchor=n,Pe(this,gi,a)}ensure(n,a){var s=ge,l=Os();if(a&&!h(this,On).has(n)&&!h(this,fn).has(n))if(l){var o=document.createDocumentFragment(),v=Jn();o.append(v),h(this,fn).set(n,{effect:yn(()=>a(v)),fragment:o})}else h(this,On).set(n,yn(()=>a(this.anchor)));if(h(this,An).set(s,n),l){for(const[d,u]of h(this,On))d===n?s.unskip_effect(u):s.skip_effect(u);for(const[d,u]of h(this,fn))d===n?s.unskip_effect(u.effect):s.skip_effect(u.effect);s.oncommit(h(this,mi)),s.ondiscard(h(this,Ri))}else h(this,mi).call(this,s)}}An=new WeakMap,On=new WeakMap,fn=new WeakMap,_a=new WeakMap,gi=new WeakMap,mi=new WeakMap,Ri=new WeakMap;function q(e,n,a=!1){var s=new Co(e),l=a?qa:0;function o(v,d){s.ensure(v,d)}Tr(()=>{var v=!1;n((d,u=0)=>{v=!0,o(u,d)}),v||o(-1,null)},l)}function lt(e,n){return n}function To(e,n,a){for(var s=[],l=n.length,o,v=n.length,d=0;d{if(o){if(o.pending.delete(C),o.done.add(C),o.pending.size===0){var m=e.outrogroups;mr(e,Fi(o.done)),m.delete(o),m.size===0&&(e.outrogroups=null)}}else v-=1},!1)}if(v===0){var u=s.length===0&&a!==null;if(u){var p=a,_=p.parentNode;vo(_),_.append(p),e.items.clear()}mr(e,n,!u)}else o={pending:new Set(n),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function mr(e,n,a=!0){var s;if(e.pending.size>0){s=new Set;for(const v of e.pending.values())for(const d of v)s.add(e.items.get(d).e)}for(var l=0;l{var xe=a();return yr(xe)?xe:xe==null?[]:Fi(xe)}),m,y=new Map,$=!0;function O(xe){(ye.effect.f&wn)===0&&(ye.pending.delete(xe),ye.fallback=_,zo(ye,m,v,n,s),_!==null&&(m.length===0?(_.f&Bn)===0?Li(_):(_.f^=Bn,ai(_,null,v)):ka(_,()=>{_=null})))}function M(xe){ye.pending.delete(xe)}var F=Tr(()=>{m=t(C);for(var xe=m.length,ke=new Set,Ie=ge,Z=Os(),X=0;Xo(v)):(_=yn(()=>o(Wr??(Wr=Jn()))),_.f|=Bn)),xe>ke.size&&yl(),!$)if(y.set(Ie,ke),Z){for(const[je,ot]of d)ke.has(je)||Ie.skip_effect(ot.e);Ie.oncommit(O),Ie.ondiscard(M)}else O(Ie);t(C)}),ye={effect:F,items:d,pending:y,outrogroups:null,fallback:_};$=!1}function Ya(e){for(;e!==null&&(e.f&zn)===0;)e=e.next;return e}function zo(e,n,a,s,l){var Re,je,ot,I,re,be,Je,de,Fe;var o=(s&Pl)!==0,v=n.length,d=e.items,u=Ya(e.effect.first),p,_=null,C,m=[],y=[],$,O,M,F;if(o)for(F=0;F0){var ze=(s&fs)!==0&&v===0?a:null;if(o){for(F=0;F{var ue,at;if(C!==void 0)for(M of C)(at=(ue=M.nodes)==null?void 0:ue.a)==null||at.apply()})}function Po(e,n,a,s,l,o,v,d){var u=(v&Tl)!==0?(v&Dl)===0?so(a,!1,!1):Ea(a):null,p=(v&zl)!==0?Ea(l):null;return{v:u,i:p,e:yn(()=>(o(n,u??a,p??l,d),()=>{e.delete(s)}))}}function ai(e,n,a){if(e.nodes)for(var s=e.nodes.start,l=e.nodes.end,o=n&&(n.f&Bn)===0?n.nodes.start:a;s!==null;){var v=bi(s);if(o.before(s),s===l)return;s=v}}function Yn(e,n,a){n===null?e.effect.first=a:n.next=a,a===null?e.effect.last=n:a.prev=n}function He(e,n,a=!1,s=!1,l=!1,o=!1){var v=e,d="";if(a)var u=e;D(()=>{var p=Ge;if(d!==(d=n()??"")){if(a){p.nodes=null,u.innerHTML=d,d!==""&&Ua(ra(u),u.lastChild);return}if(p.nodes!==null&&(qs(p.nodes.start,p.nodes.end),p.nodes=null),d!==""){var _=s?Ll:l?Ol:void 0,C=Bs(s?"svg":l?"math":"template",_);C.innerHTML=d;var m=s||l?C:C.content;if(Ua(ra(m),m.lastChild),s||l)for(;ra(m);)v.before(ra(m));else v.before(m)}}})}function Do(e,n,a){var s=e==null?"":""+e;return n&&(s=s?s+" "+n:n),s===""?null:s}function $o(e,n){return e==null?null:String(e)}function At(e,n,a,s,l,o){var v=e[or];if(v!==a||v===void 0){var d=Do(a,s);d==null?e.removeAttribute("class"):e.className=d,e[or]=a}return o}function $t(e,n,a,s){var l=e[dr];if(l!==n){var o=$o(n);o==null?e.removeAttribute("style"):e.style.cssText=o,e[dr]=n}return s}function el(e,n,a=!1){if(e.multiple){if(n==null)return;if(!yr(n))return Rl();for(var s of e.options)s.selected=n.includes(di(s));return}for(s of e.options){var l=di(s);if(oo(l,n)){s.selected=!0;return}}(!a||n!==void 0)&&(e.selectedIndex=-1)}function Io(e){var n=new MutationObserver(()=>{el(e,e.__value)});n.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Rs(()=>{n.disconnect()})}function Hn(e,n,a=n){var s=new WeakSet,l=!0;Ar(e,"change",o=>{var v=o?"[selected]":":checked",d;if(e.multiple)d=[].map.call(e.querySelectorAll(v),di);else{var u=e.querySelector(v)??e.querySelector("option:not([disabled])");d=u&&di(u)}a(d),e.__value=d,ge!==null&&s.add(ge)}),Ks(()=>{var o=n();if(e===document.activeElement){var v=ge;if(s.has(v))return}if(el(e,o,l),l&&o===void 0){var d=e.querySelector(":checked");d!==null&&(o=di(d),a(o))}e.__value=o,l=!1}),Io(e)}function di(e){return"__value"in e?e.__value:e.value}const Lo=Symbol("is custom element"),Oo=Symbol("is html"),Bo=bl?"progress":"PROGRESS";function Xn(e,n){var a=tl(e);a.value===(a.value=n??void 0)||e.value===n&&(n!==0||e.nodeName!==Bo)||(e.value=n??"")}function Aa(e,n,a,s){var l=tl(e);l[n]!==(l[n]=a)&&(n==="loading"&&(e[ml]=a),a==null?e.removeAttribute(n):typeof a!="string"&&Ro(e).includes(n)?e[n]=a:e.setAttribute(n,a))}function tl(e){return e[Si]??(e[Si]={[Lo]:e.nodeName.includes("-"),[Oo]:e.namespaceURI===hs})}var Gr=new Map;function Ro(e){var n=e.getAttribute("is")||e.nodeName,a=Gr.get(n);if(a)return a;Gr.set(n,a=[]);for(var s,l=e,o=Element.prototype;o!==l;){s=cl(l);for(var v in s)s[v].set&&v!=="innerHTML"&&v!=="textContent"&&v!=="innerText"&&a.push(v);l=cs(l)}return a}function an(e,n,a=n){var s=new WeakSet;Ar(e,"input",async l=>{var o=l?e.defaultValue:e.value;if(o=Zi(e)?Yi(o):o,a(o),ge!==null&&s.add(ge),await yo(),o!==(o=n())){var v=e.selectionStart,d=e.selectionEnd,u=e.value.length;if(e.value=o??"",d!==null){var p=e.value.length;v===d&&d===u&&p>u?(e.selectionStart=p,e.selectionEnd=p):(e.selectionStart=v,e.selectionEnd=Math.min(d,p))}}}),Za(n)==null&&e.value&&(a(Zi(e)?Yi(e.value):e.value),ge!==null&&s.add(ge)),qi(()=>{var l=n();if(e===document.activeElement){var o=ge;if(s.has(o))return}Zi(e)&&l===Yi(e.value)||e.type==="date"&&!l&&!e.value||l!==e.value&&(e.value=l??"")})}function Fo(e,n,a=n){Ar(e,"change",s=>{var l=s?e.defaultChecked:e.checked;a(l)}),Za(n)==null&&a(e.checked),qi(()=>{var s=n();e.checked=!!s})}function Zi(e){var n=e.type;return n==="number"||n==="range"}function Yi(e){return e===""?null:+e}function Xi(e,n){return e===n||(e==null?void 0:e[$a])===n}function Ko(e={},n,a,s){var l=en.r,o=Ge;return Ks(()=>{var v,d;return qi(()=>{v=d,d=[],Za(()=>{Xi(a(...d),e)||(n(e,...d),v&&Xi(a(...v),e)&&n(null,...v))})}),()=>{let u=o;for(;u!==l&&u.parent!==null&&u.parent.f&lr;)u=u.parent;const p=()=>{d&&Xi(a(...d),e)&&n(null,...d)},_=u.teardown;u.teardown=()=>{p(),_==null||_()}}}),e}function yi(e){en===null&&ps(),Ga(()=>{const n=Za(e);if(typeof n=="function")return n})}function No(e){en===null&&ps(),yi(()=>()=>Za(e))}let ui=localStorage.getItem("mc_token")||"";function nl(){return ui}function qo(e){ui=(e||"").trim(),localStorage.setItem("mc_token",ui)}function Vo(){const e={"Content-Type":"application/json"};return ui&&(e["X-MC-Token"]=ui),e}function ci(){return localStorage.getItem("mc_hf_token")||""}function Wo(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function De(e,n={}){const a=await fetch(e,{headers:Vo(),...n}),s=await a.json().catch(()=>({}));if(!a.ok)throw new Error(s.error||"HTTP "+a.status);return s}const Go=(e,n=document)=>n.querySelector(e),jr=(e,n=document)=>[...n.querySelectorAll(e)];function Fn(e){return String(e??"").replace(/[&<>]/g,n=>({"&":"&","<":"<",">":">"})[n])}let Ur;function ie(e,n=!1){const a=Go("#toast");a&&(a.textContent=e,a.className="toast show"+(n?" err":""),clearTimeout(Ur),Ur=setTimeout(()=>a.className="toast",3200))}function jo(e,n){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${n!=null?` ${Math.round(n)}%`:""}`:'bereit'}const ut=e=>`${e}`,Vi={logo:ut(''),grid:ut(''),cpu:ut(''),pulse:ut(''),server:ut(''),book:ut(''),help:ut(''),settings:ut(''),swap:ut(''),monitor:ut(''),layers:ut(''),alert:ut(''),gauge:ut(''),search:ut(''),compass:ut(''),code:ut(''),eye:ut(''),refresh:ut(''),file:ut(''),database:ut(''),thermo:ut(''),shield:ut(''),info:ut(''),chevron:ut(''),bolt:ut(''),x:ut(''),check:ut(''),download:ut(''),clock:ut('')};function jt(e){return Vi[e]||""}function br(e){return`${Vi.info}`}function ca(e){if(!e&&e!==0)return"–";const n=e/1024/1024/1024;return n>=1?n.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function xn({title:e,body:n,confirmLabel:a="Bestätigen",cancelLabel:s="Abbrechen",danger:l=!1}){return new Promise(o=>{const v=document.createElement("div");v.className="modal-overlay",v.innerHTML=``;const c=u=>{v.remove(),o(u)};v.addEventListener("click",u=>{if(u.target===v)return c(!1);const p=u.target.closest("[data-x]");p&&c(p.getAttribute("data-x")==="1")}),document.body.appendChild(v),v.querySelector('[data-x="1"]').focus()})}function er({title:e,body:n="",placeholder:a="",password:s=!1,confirmLabel:l="Weiter",danger:o=!1}){return new Promise(v=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=``;const u=d.querySelector("input"),p=_=>{d.remove(),v(_)};d.addEventListener("click",_=>{if(_.target===d)return p(null);const C=_.target.closest("[data-x]");C&&p(C.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",_=>{_.key==="Enter"&&p(u.value||""),_.key==="Escape"&&p(null)}),document.body.appendChild(d),u.focus()})}function Uo(e="overview"){const n=jr(".nav-item[data-view]:not(.disabled)"),a=jr(".view[data-view]"),s=new Set(a.map(o=>o.dataset.view));function l(o){s.has(o)||(o=e),a.forEach(v=>v.hidden=v.dataset.view!==o),n.forEach(v=>v.classList.toggle("active",v.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",v=>{v.preventDefault(),l(o.dataset.view)})),window.addEventListener("hashchange",()=>l(location.hash.replace("#/",""))),l(location.hash.replace("#/","")||e),{show:l}}let Hr=L(null);const xi={get value(){return t(Hr)},set(e){c(Hr,e,!0)}};let Jr=L(Jt([])),ea=L(Jt([]));const fa={get value(){return t(Jr)},set(e){c(Jr,e||[],!0)},get tracked(){return t(ea)},track(e){t(ea).includes(e)||c(ea,[...t(ea),e],!0)},toggle(e){c(ea,t(ea).includes(e)?t(ea).filter(n=>n!==e):[...t(ea),e],!0)}};let Qr=L(null);const Dr={get value(){return t(Qr)},set(e){c(Qr,e,!0)}},Ho="5";var os;typeof window<"u"&&((os=window.__svelte??(window.__svelte={})).v??(os.v=new Set)).add(Ho);var Jo=b('— bereit für Anfragen'),Qo=b('
Temperatur (GPU)
Freier Speicher
GB
',1),Zo=b('
Temperatur
messe…
Freier Speicher
messe…
',1),Yo=b('
'),Xo=b('
Warte auf Messwerte…
'),ed=b('
Noch kein Modell eingerichtet — starte hier:
',1),td=b('
Die häufigsten Aufgaben — ein Klick.
',1),nd=b('Bild'),ad=b('Code'),id=b('Text'),rd=b('∞ aktiv'),sd=b(''),ld=b('
'),Zr=b('
'),od=b('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),dd=b('
'),cd=b('
News gerade nicht ladbar.
'),vd=b('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function ud(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>Dr.value),l=G(()=>{var T;return((T=t(a))==null?void 0:T.models)||[]}),o=G(()=>{var T;return((T=t(a))==null?void 0:T.swap_ok)??!1}),v=["running","ready","loading","starting"],d=G(()=>t(l).find(T=>v.includes(T.state))),u=G(()=>t(l).filter(T=>!T.incomplete)),p=G(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),_=G(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(t(s).ram.percent)} % — eventuell Speicher freigeben.`:`${t(u).length} ${t(u).length===1?"Modell":"Modelle"} konfiguriert · ${t(d)?`„${t(d).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),C=G(()=>()=>{var Q;const T=(Q=t(s))==null?void 0:Q.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0});let m=L(Jt([])),y=L(null);yi(async()=>{try{c(m,((await De("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function $(){await xn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await De("/api/unload",{method:"POST"}),M())}async function O(T){c(y,T,!0);try{await De("/api/preload?model="+encodeURIComponent(T),{method:"POST"})}catch(Q){ie("Laden fehlgeschlagen: "+(Q.message||"Engine nicht erreichbar?"),!0)}c(y,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function F(T){var Q;(Q=document.querySelector(`.nav-item[data-view="${T}"]`))==null||Q.dispatchEvent(new MouseEvent("click"))}function ye(T){return T>=90?"red":T>=75?"":"green"}function xe(T){return T==null?"":T>=75?"red":T>=55?"":"green"}function ke(T){return T>=90?"red":T>=70?"":"green"}var Ie=vd(),Z=Xe(Ie),X=r(Z),ve=r(X),ze=r(ve),Re=i(ze);{var je=T=>{var Q=Jo();f(T,Q)};q(Re,T=>{t(o)&&!t(d)&&T(je)})}var ot=i(ve,2),I=r(ot),re=i(Z,2),be=r(re),Je=r(be),de=i(r(Je),2);He(de,()=>jt("server"),!0);var Fe=i(Je,2),ue=r(Fe),at=i(Fe,2),Qe=r(at),it=i(be,2),dt=r(it),rt=i(r(dt),2);He(rt,()=>jt("cpu"),!0);var Tt=i(dt,2),zt=r(Tt),Wt=i(Tt,2),qt=r(Wt);{var Gt=T=>{var Q=oi();D(Be=>g(Q,`${Be??""} · ${t(d).state??""}`),[()=>{var Be;return(Be=t(d).meta)!=null&&Be.ctx?Math.round(t(d).meta.ctx/1024)+"k ctx":""}]),f(T,Q)},Lt=T=>{var Q=oi("lädt bei erster Anfrage");f(T,Q)};q(qt,T=>{t(d)?T(Gt):T(Lt,-1)})}var Ot=i(it,2);{var U=T=>{const Q=G(()=>{var hn;return t(s).gpu_temp??((hn=t(s).cpu)==null?void 0:hn.temp)??null}),Be=G(()=>xe(t(Q))),ne=G(()=>t(s).ram.total-t(s).ram.used),he=G(()=>100-t(s).ram.percent);var Ne=Qo(),We=Xe(Ne),Ee=r(We),W=i(r(Ee));He(W,()=>jt("thermo"),!0);var J=i(Ee,2),le=r(J),oe=i(J,2),$e=r(oe),Le=i(We,2),Te=r(Le),se=i(r(Te));He(se,()=>jt("database"),!0);var ce=i(Te,2),wt=r(ce),St=i(ce,2),Bt=r(St);D((hn,da,E,S)=>{At(We,1,`kpi ${t(Be)??""}`),g(le,hn),g($e,t(Q)==null?"messe…":t(Q)<55?"kühl":t(Q)<75?"normal":"⚠ heiß"),At(Le,1,`kpi ${t(he)<15?"red":t(he)<30?"":"green"}`),g(wt,da),g(Bt,`von ${E??""} GB · ${S??""} % frei`)},[()=>t(Q)!=null?`${Math.round(t(Q))}°C`:"–",()=>Math.round(t(ne)/1073741824),()=>Math.round(t(s).ram.total/1073741824),()=>Math.round(t(he))]),f(T,Ne)},ae=T=>{var Q=Zo();f(T,Q)};q(Ot,T=>{t(s)?T(U):T(ae,-1)})}var A=i(re,2),B=r(A),_e=i(r(B),4);{var Ce=T=>{const Q=G(()=>t(C)());var Be=Ha(),ne=Xe(Be);Ye(ne,17,()=>{var he;return[["Prozessor (CPU)",((he=t(s).cpu)==null?void 0:he.percent)??0,""],["Arbeitsspeicher (RAM)",t(s).ram.percent,ye(t(s).ram.percent)],["Grafikspeicher (VRAM)",t(Q),ke(t(Q))]]},lt,(he,Ne)=>{var We=G(()=>aa(t(Ne),3));let Ee=()=>t(We)[0],W=()=>t(We)[1];const J=G(()=>Math.max(0,Math.min(100,W()||0)));var le=Yo(),oe=r(le),$e=r(oe),Le=r($e),Te=i($e),se=r(Te),ce=i(oe,2),wt=r(ce);D((St,Bt)=>{g(Le,Ee()),g(se,`${St??""} %`),At(ce,1,`bar ${t(J)>=90?"bad":t(J)>=75?"warn":""}`),$t(wt,`width:${Bt??""}%`)},[()=>Math.round(t(J)),()=>Math.max(2,t(J))]),f(he,le)}),f(T,Be)},V=T=>{var Q=Xo();f(T,Q)};q(_e,T=>{t(s)?T(Ce):T(V,-1)})}var pe=i(B,2),z=i(r(pe),2);{var R=T=>{var Q=ed(),Be=i(Xe(Q),2),ne=r(Be);He(ne,()=>jt("search"),!0);var he=i(ne,4);He(he,()=>jt("chevron"),!0);var Ne=i(Be,2),We=r(Ne);He(We,()=>jt("swap"),!0);var Ee=i(We,4);He(Ee,()=>jt("chevron"),!0);var W=i(Ne,2),J=r(W);He(J,()=>jt("file"),!0);var le=i(J,4);He(le,()=>jt("chevron"),!0),k("click",Be,()=>F("cookbook")),k("click",Ne,()=>F("connect")),k("click",W,()=>F("guides")),f(T,Q)},x=T=>{var Q=td(),Be=i(Xe(Q),2),ne=r(Be);He(ne,()=>jt("search"),!0);var he=i(ne,4);He(he,()=>jt("chevron"),!0);var Ne=i(Be,2),We=r(Ne);He(We,()=>jt("refresh"),!0);var Ee=i(We,4);He(Ee,()=>jt("chevron"),!0);var W=i(Ne,2),J=r(W);He(J,()=>jt("file"),!0);var le=i(J,4);He(le,()=>jt("chevron"),!0);var oe=i(W,2),$e=r(oe);He($e,()=>jt("swap"),!0);var Le=i($e,4);He(Le,()=>jt("chevron"),!0),k("click",Be,()=>F("cookbook")),k("click",Ne,$),k("click",W,()=>F("server")),k("click",oe,()=>F("connect")),f(T,Q)};q(z,T=>{t(u).length?T(x,-1):T(R)})}var P=i(A,2),N=r(P),j=r(N),H=i(r(j),2),fe=r(H),me=i(j,2);{var w=T=>{var Q=Zr();Ye(Q,21,()=>t(u),lt,(Be,ne)=>{const he=G(()=>v.includes(t(ne).state)),Ne=G(()=>t(ne).state==="downloading"),We=G(()=>t(ne).state==="loading"||t(ne).state==="starting"||t(Ne)?"load":t(he)?"on":""),Ee=G(()=>t(Ne)?`↓ ${t(ne).download_progress!=null?Math.round(t(ne).download_progress)+"%":"..."}`:t(ne).state==="loading"||t(ne).state==="starting"?"lädt…":t(he)?"geladen ✓":"bereit");var W=ld(),J=r(W),le=i(J,2),oe=r(le),$e=r(oe),Le=r($e),Te=i($e,2);{var se=Me=>{var qe=nd();f(Me,qe)},ce=G(()=>{var Me,qe;return(qe=(Me=t(ne).meta)==null?void 0:Me.caps)==null?void 0:qe.includes("Bild")}),wt=Me=>{var qe=ad();f(Me,qe)},St=G(()=>{var Me,qe;return(qe=(Me=t(ne).meta)==null?void 0:Me.caps)==null?void 0:qe.includes("Code")}),Bt=Me=>{var qe=id();f(Me,qe)};q(Te,Me=>{t(ce)?Me(se):t(St)?Me(wt,1):Me(Bt,-1)})}var hn=i(Te,2);{var da=Me=>{var qe=rd();f(Me,qe)};q(hn,Me=>{t(ne).ttl>=99999&&Me(da)})}var E=i(oe,2),S=r(E),te=i(le,2),Y=r(te),Ae=r(Y),mt=i(Y,2);{var yt=Me=>{var qe=sd(),Ze=r(qe);D(()=>{$t(qe,`padding:3px 9px;font-size:12px;opacity:${t(y)===t(ne).name?".5":"1"}`),qe.disabled=t(y)===t(ne).name,g(Ze,t(y)===t(ne).name?"…":"Laden")}),k("click",qe,()=>O(t(ne).name)),f(Me,qe)};q(mt,Me=>{!t(he)&&!t(Ne)&&t(o)&&Me(yt)})}D((Me,qe)=>{var Ze;At(J,1,`li-dot ${t(We)??""}`),$t($e,t(he)?"color:var(--accent)":""),g(Le,t(ne).name),g(S,`${Me??""} - ${(Ze=t(ne).meta)!=null&&Ze.quant?" · "+t(ne).meta.quant:""} - ${qe??""}`),$t(Y,`white-space:nowrap;color:${t(he)?"var(--on)":"var(--mut)"}`),g(Ae,t(Ee))},[()=>{var Me;return(Me=t(ne).meta)!=null&&Me.ctx?Math.round(t(ne).meta.ctx/1024)+"k ctx":""},()=>{var Me;return(Me=t(ne).meta)!=null&&Me.size_bytes?" · "+(t(ne).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),f(Be,W)}),f(T,Q)},K=T=>{var Q=od(),Be=i(r(Q),4);k("click",Be,()=>F("cookbook")),f(T,Q)};q(me,T=>{t(u).length?T(w):T(K,-1)})}var ee=i(N,2),we=r(ee),Se=i(r(we),2),ft=i(we,2);{var st=T=>{var Q=Zr();Ye(Q,21,()=>t(m),lt,(Be,ne)=>{var he=dd(),Ne=r(he),We=r(Ne),Ee=r(We),W=i(We,2),J=r(W);D(()=>{Aa(he,"href",t(ne).link),g(Ee,t(ne).title),g(J,`${t(ne).source??""}${t(ne).relevant?" · für dich":""}`)}),f(Be,he)}),f(T,Q)},Ue=T=>{var Q=cd();f(T,Q)};q(ft,T=>{t(m).length?T(st):T(Ue,-1)})}D(T=>{g(ze,`${t(p)??""} `),g(I,t(_)),At(be,1,`kpi ${t(o)?"green":"red"}`),g(ue,t(o)?"Online":"Offline"),g(Qe,T),At(it,1,`kpi ${t(d)?"blue":"muted"}`),g(zt,t(d)?t(d).name:"Keins"),g(fe,t(u).length?t(u).length+" konfiguriert":"")},[()=>{var T,Q;return((Q=(T=t(a))==null?void 0:T.swap_url)==null?void 0:Q.replace(/^https?:\/\//,""))??"—"}]),k("click",Se,()=>F("news")),k("keydown",Se,T=>T.key==="Enter"&&F("news")),f(e,Ie),Dn()}qn(["click","keydown"]);var pd=b(""),fd=b('
'),hd=b('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),gd=b('
kein Modell hinterlegt
leere Rolleleer '),md=b(' '),bd=b('
'),_d=b(' '),yd=b('
API-Name:
'),xd=b('
ModellKannDetailsStatusPortAktionen
'),kd=b('
Empfohlen für deine Hardware

'),wd=b(''),Sd=b(''),Md=b(''),Ed=b('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Ad(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",s="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",l=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=G(()=>{var A;return((A=xi.value)==null?void 0:A.models)||[]});function v(){document.dispatchEvent(new Event("mc:refresh"))}let d=L(""),u=L(""),p=L(""),_=L(!1);const C=G(()=>t(o).filter(A=>!A.incomplete));async function m(){var B;const A=t(d)||((B=t(C)[0])==null?void 0:B.name);if(!(!A||!t(u).trim())){c(_,!0),c(p,"(wecke Modell, kann beim Laden kurz dauern…)");try{const _e=await De("/api/chat",{method:"POST",body:JSON.stringify({model:A,message:t(u)})});c(p,_e.reply,!0)}catch(_e){c(p,"Fehler: "+_e.message)}c(_,!1),v()}}const y=300;let $=L(!1),O=L(null),M=L(8192),F=L(!1);function ye(A){var B;c(O,t(o).find(_e=>_e.name===A),!0),t(O)&&(c(M,((B=t(O).meta)==null?void 0:B.ctx)||8192,!0),c(F,(t(O).ttl??y)>=99999),c($,!0))}async function xe(){const A=t(F)?99999:y;try{await De("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(M),ttl:A})}),ie("Gespeichert — aktiv beim nächsten Modell-Start."),c($,!1),v()}catch(B){ie(B.message,!0)}}let ke=L(!1),Ie=L(""),Z=L(""),X=L("");function ve(A){const B=t(o).find(_e=>_e.name===A);c(Ie,A,!0),c(X,(B==null?void 0:B.role)||"",!0),c(Z,""),c(ke,!0)}async function ze(A){try{await De("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Ie),role:A})}),ie(A?`Rolle gesetzt: ${A}`:"Rolle entfernt."),c(ke,!1),v()}catch(B){ie(B.message,!0)}}async function Re(A){if(await xn({title:`„${A}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await De("/api/unload?model="+encodeURIComponent(A),{method:"POST"}),ie("Entladen: "+A),setTimeout(v,600)}catch(B){ie(B.message,!0)}}async function je(A){if(await xn({title:`„${A}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const B=await De("/api/delete_model",{method:"POST",body:JSON.stringify({alias:A})});ie(B.note||"Gelöscht: "+A),setTimeout(v,600)}catch(B){ie(B.message,!0)}}function ot(A){return A!=null&&A.length?A.map(B=>B==="Code"?'Code':B==="Bild"?'Bild':'Text').join(" "):"–"}function I(A){if(!A)return"–";const B=A.quant||"?",_e=A.ctx?Math.round(A.ctx/1024)+"K":"?",Ce=A.size_bytes?(A.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${B} · ${_e} · ${Ce}`}function re(A){var B;(B=navigator.clipboard)==null||B.writeText(A),ie("Kopiert: "+A)}var be=Ed(),Je=i(Xe(be),2),de=i(r(Je),6);Ye(de,21,()=>t(C),lt,(A,B)=>{var _e=pd(),Ce=r(_e),V={};D(()=>{g(Ce,t(B).name),V!==(V=t(B).name)&&(_e.value=(_e.__value=t(B).name)??"")}),f(A,_e)});var Fe=i(de,4),ue=i(Fe,2),at=r(ue),Qe=i(ue,2);{var it=A=>{var B=fd(),_e=r(B);D(()=>g(_e,t(p))),f(A,B)};q(Qe,A=>{t(p)&&A(it)})}var dt=i(Je,2),rt=r(dt),Tt=i(r(rt)),zt=r(Tt),Wt=i(rt,4);{var qt=A=>{var B=hd();f(A,B)},Gt=A=>{var B=xd(),_e=i(r(B));Ye(_e,21,()=>t(o),lt,(Ce,V)=>{var pe=Ha(),z=Xe(pe);{var R=P=>{var N=gd(),j=r(N),H=r(j),fe=i(j,5),me=r(fe),w=i(me,2);D(()=>g(H,t(V).name)),k("click",me,()=>{var K;ie("Lade im Cookbook ein Modell und setze den Alias auf: "+t(V).name),(K=document.querySelector(".nav-item[data-view='cookbook']"))==null||K.dispatchEvent(new MouseEvent("click"))}),k("click",w,()=>je(t(V).name)),f(P,N)},x=P=>{var N=yd(),j=r(N),H=r(j),fe=r(H),me=i(fe);{var w=Ee=>{var W=md(),J=r(W);D(()=>g(J,t(V).role)),f(Ee,W)};q(me,Ee=>{t(V).role&&Ee(w)})}var K=i(H,2);{var ee=Ee=>{var W=bd(),J=r(W);D(()=>g(J,t(V).meta.filename)),f(Ee,W)};q(K,Ee=>{var W;(W=t(V).meta)!=null&&W.filename&&Ee(ee)})}var we=i(K,2),Se=i(r(we),2);Ye(Se,17,()=>{var Ee;return(Ee=t(V).api_ids)!=null&&Ee.length?t(V).api_ids:[t(V).name]},lt,(Ee,W)=>{var J=_d(),le=r(J);D(()=>g(le,t(W))),k("click",J,()=>re(t(W))),f(Ee,J)});var ft=i(j);He(ft,()=>{var Ee;return ot((Ee=t(V).meta)==null?void 0:Ee.caps)},!0);var st=i(ft);He(st,()=>I(t(V).meta),!0);var Ue=i(st);He(Ue,()=>jo(t(V).state,t(V).download_progress),!0);var T=i(Ue),Q=r(T),Be=i(T),ne=r(Be),he=i(ne,2),Ne=i(he,2),We=i(Ne,2);D(()=>{g(fe,`${t(V).name??""} `),g(Q,t(V).port??"auto")}),k("click",ne,()=>ve(t(V).name)),k("click",he,()=>ye(t(V).name)),k("click",Ne,()=>Re(t(V).name)),k("click",We,()=>je(t(V).name)),f(P,N)};q(z,P=>{t(V).incomplete?P(R):P(x,-1)})}f(Ce,pe)}),f(A,B)};q(Wt,A=>{t(o).length?A(Gt,-1):A(qt)})}var Lt=i(dt,2);{var Ot=A=>{var B=wd(),_e=r(B),Ce=r(_e),V=i(Ce,4),pe=r(V),z=i(V,2),R=i(r(z));He(R,()=>br(a));var x=i(z,2),P=i(x,2);{var N=ee=>{var we=kd(),Se=r(we),ft=i(r(Se),2),st=r(ft),Ue=i(st,2),T=i(Se,2);D((Q,Be)=>{g(st,`Optimal ~${Q??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),g(Ue,` Aktuell ~${Be??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),k("click",T,()=>c(M,t(O).meta.optimal_ctx,!0)),f(ee,we)};q(P,ee=>{var we;(we=t(O).meta)!=null&&we.optimal_ctx&&ee(N)})}var j=i(P,4),H=i(r(j),2),fe=r(H),me=i(fe,2),w=r(me),K=i(j,2);D(()=>{g(pe,t(O).name),$t(me,`color:${t(F)?"var(--accent)":"var(--mut)"}`),g(w,t(F)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),k("click",B,ee=>{ee.target.classList.contains("modal-overlay")&&c($,!1)}),k("click",Ce,()=>c($,!1)),an(x,()=>t(M),ee=>c(M,ee)),Fo(fe,()=>t(F),ee=>c(F,ee)),k("click",K,xe),f(A,B)};q(Lt,A=>{t($)&&t(O)&&A(Ot)})}var U=i(Lt,2);{var ae=A=>{var B=Md(),_e=r(B),Ce=r(_e),V=i(Ce,2),pe=i(r(V));He(pe,()=>br(s));var z=i(V,2),R=r(z),x=i(z,4);Ye(x,21,()=>l,lt,(fe,me)=>{var w=Sd(),K=r(w);D(()=>{At(w,1,t(X)===t(me).id?"primary":"ghost"),Aa(w,"title",t(me).desc),g(K,t(me).label)}),k("click",w,()=>ze(t(me).id)),f(fe,w)});var P=i(x,4),N=i(P,2),j=r(N),H=i(j,2);D(()=>g(R,t(Ie))),k("click",B,fe=>{fe.target.classList.contains("modal-overlay")&&c(ke,!1)}),k("click",Ce,()=>c(ke,!1)),an(P,()=>t(Z),fe=>c(Z,fe)),k("click",j,()=>ze("")),k("click",H,()=>ze(t(Z).trim().toLowerCase())),f(A,B)};q(U,A=>{t(ke)&&A(ae)})}D(()=>{ue.disabled=t(_),g(at,t(_)?"…":"Senden"),g(zt,t(o).length?t(o).length+" konfiguriert":"")}),Hn(de,()=>t(d),A=>c(d,A)),an(Fe,()=>t(u),A=>c(u,A)),k("click",ue,m),f(e,be),Dn()}qn(["click"]);var Cd=b('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Td=b(''),zd=b('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Pd=b(' '),Dd=b(''),$d=b(''),Id=b('
'),Ld=b('
'),Od=b('
'),Bd=b('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Rd(e,n){Pn(n,!0);const a=G(()=>fa.value),s=G(()=>fa.tracked),l=G(()=>Dr.value);let o=Jt({cpu:[],ram:[],gpu:[]});Ga(()=>{var be;if(!t(l))return;const I=t(l).gpu,re=I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0;o.cpu=[...o.cpu,((be=t(l).cpu)==null?void 0:be.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,re].slice(-60)});const v=G(()=>()=>{var re;const I=(re=t(l))==null?void 0:re.gpu;return I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0}),d=G(()=>t(a).filter(I=>I.state!=="running"&&I.state!=="queued").length),u=G(()=>t(a).filter(I=>I.state==="failed").length);function p(I){if(I.state!=="running")return null;if(typeof I.progress=="number")return Math.min(100,I.progress);const be=((I.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return be?Math.min(100,parseFloat(be[1])):null}function _(I){return I==null||I<0?"":I>=90?`noch ~${Math.round(I/60)} min`:`noch ~${Math.max(1,Math.round(I))} s`}function C(I){return I==="done"?'fertig':I==="failed"?'fehler':I==="canceled"?'abgebrochen':'läuft…'}function m(I){return I==="done"?"on":I==="failed"||I==="canceled"?"":"load"}async function y(I){try{await De(`/api/jobs/${I}/cancel`,{method:"POST"}),ie("Abbruch angefordert…")}catch(re){ie(re.message,!0)}}async function $(I){try{await De(`/api/jobs/${I}`,{method:"DELETE"})}catch(re){ie(re.message,!0)}}async function O(){try{const I=await De("/api/jobs/clear",{method:"POST"});ie(`${I.removed} Einträge entfernt.`)}catch(I){ie(I.message,!0)}}function M(I,re){return I.map(be=>`
`).join("")}var F=Bd(),ye=i(Xe(F),2);{var xe=I=>{const re=G(()=>t(v)());var be=Cd(),Je=Xe(be),de=r(Je),Fe=i(r(de),2),ue=r(Fe),at=i(Fe,2),Qe=r(at),it=i(de,2),dt=i(r(it),2),rt=r(dt),Tt=i(dt,2),zt=r(Tt),Wt=i(it,2),qt=i(r(Wt),2),Gt=r(qt),Lt=i(qt,2),Ot=r(Lt),U=i(Je,2),ae=i(r(U),4),A=r(ae),B=i(r(A)),_e=r(B),Ce=i(A,2),V=i(r(Ce),2),pe=r(V),z=i(Ce,2),R=i(r(z)),x=r(R),P=i(z,2),N=i(r(P),2),j=r(N),H=i(ae,2),fe=r(H),me=i(r(fe));He(me,()=>M(o.cpu,"--accent"),!0);var w=i(fe,2),K=i(r(w));He(K,()=>M(o.ram,"--purple"),!0);var ee=i(w,2),we=i(r(ee));He(we,()=>M(o.gpu,"--on"),!0),D((Se,ft,st,Ue,T,Q,Be,ne,he,Ne,We,Ee,W)=>{g(ue,Se),g(Qe,ft),g(rt,st),g(zt,`${Ue??""} / ${T??""}`),g(Gt,Q),g(Ot,Be),g(_e,`${ne??""} / ${he??""}`),g(pe,Ne),g(x,`${We??""} % belegt`),g(j,`${Ee??""} / ${W??""}`)},[()=>{var Se;return Math.round(((Se=t(l).cpu)==null?void 0:Se.percent)??0)},()=>{var Se;return((Se=t(l).cpu)==null?void 0:Se.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>Math.round(t(re)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>t(l).gpu?`${ca(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${ca(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var Se;return Math.round(((Se=t(l).disk)==null?void 0:Se.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var Se;return((Se=t(l).cpu)==null?void 0:Se.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),f(I,be)};q(ye,I=>{t(l)&&I(xe)})}var ke=i(ye,2),Ie=r(ke),Z=i(r(Ie),2),X=r(Z),ve=i(Z,2);{var ze=I=>{var re=Td();k("click",re,O),f(I,re)};q(ve,I=>{t(d)&&I(ze)})}var Re=i(Ie,4);{var je=I=>{var re=zd();f(I,re)},ot=I=>{var re=Ha(),be=Xe(re);Ye(be,17,()=>t(a),lt,(Je,de)=>{const Fe=G(()=>p(t(de))),ue=G(()=>t(de).state==="running"?_(t(de).eta_s):""),at=G(()=>t(de).state==="running"&&t(de).rate_bps?ca(t(de).rate_bps)+"/s":""),Qe=G(()=>[t(ue),t(at)].filter(Boolean).join(" · ")),it=G(()=>t(s).includes(t(de).id));var dt=Od(),rt=r(dt),Tt=r(rt),zt=i(Tt,2),Wt=r(zt),qt=i(zt,2);{var Gt=V=>{var pe=Pd(),z=r(pe);D(R=>g(z,`${R??""} %${t(Qe)?` · ${t(Qe)}`:""}`),[()=>Math.round(t(Fe))]),f(V,pe)};q(qt,V=>{t(Fe)!=null&&V(Gt)})}var Lt=i(qt,2);{var Ot=V=>{var pe=Dd();D(()=>$t(pe,`${t(Fe)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),k("click",pe,z=>{z.stopPropagation(),y(t(de).id)}),f(V,pe)},U=V=>{var pe=$d();k("click",pe,z=>{z.stopPropagation(),$(t(de).id)}),f(V,pe)};q(Lt,V=>{t(de).state==="running"?V(Ot):V(U,-1)})}var ae=i(Lt,2);He(ae,()=>C(t(de).state));var A=i(rt,2);{var B=V=>{var pe=Id(),z=r(pe);D(()=>$t(z,`width:${t(Fe)??""}%`)),f(V,pe)};q(A,V=>{t(Fe)!=null&&t(de).state==="running"&&V(B)})}var _e=i(A,2);{var Ce=V=>{var pe=Ld(),z=r(pe);D(R=>g(z,R),[()=>(t(de).log||[]).join(` -`)]),f(V,pe)};q(_e,V=>{t(it)&&V(Ce)})}D(V=>{At(Tt,1,`li-dot ${V??""}`),g(Wt,t(de).label)},[()=>m(t(de).state)]),k("click",rt,()=>fa.toggle(t(de).id)),k("keydown",rt,V=>V.key==="Enter"&&fa.toggle(t(de).id)),f(Je,dt)}),f(I,re)};q(Re,I=>{t(a).length?I(ot,-1):I(je)})}D(()=>g(X,t(a).length?t(u)?t(u)+" Fehler":t(a).length+" gesamt":"")),f(e,F),Dn()}qn(["click","keydown"]);var Fd=b(' '),Kd=b(''),Nd=b('✓ fertig'),qd=b('✗ fehlgeschlagen'),Vd=b('abgebrochen'),Wd=b('läuft…'),Gd=b('
'),jd=b('

Aktueller Vorgang

'),Ud=b('

Server & Wartung

Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Hd(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>fa.value);let l=null,o=L(`Verbinde… -`),v=L("llama-swap"),d,u=L(null),p=L("");const _=new Set,C=G(()=>t(u)?t(s).find(w=>w.id===t(u)):null);Ga(()=>{if(!t(C))return;const w=t(C),K=w.state==="done",ee=w.state==="failed",we=w.state==="canceled";(K||ee||we)&&!_.has(w.id)&&(_.add(w.id),ie(K?`✓ ${t(p)} abgeschlossen.`:we?`${t(p)} abgebrochen.`:`✗ ${t(p)} fehlgeschlagen.`,ee),K&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function m(w,K){c(u,w,!0),c(p,K,!0),fa.track(w)}yi(()=>{y()}),No(()=>{l==null||l.close()});function y(){l==null||l.close();const w=t(v);c(o,`Verbinde mit ${w}… -`);const K=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${K}//${location.host}/api/logs/${w}?token=${encodeURIComponent(nl())}`),l.onmessage=ee=>{c(o,t(o)+ee.data),d&&(d.scrollTop=d.scrollHeight)},l.onclose=()=>{c(o,t(o)+` -— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function $(w,K,ee){if(await xn({title:K,body:ee,confirmLabel:"Neustarten"}))try{await De(`/api/service/${w}/restart`,{method:"POST"}),ie("Neustart ausgelöst: "+w),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(we){ie(we.message,!0)}}async function O(){if(await xn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const w=await De("/api/self-update",{method:"POST"});ie("Update läuft — Dashboard startet gleich neu."),m(w.job_id,"Mission Control Update")}catch(w){ie(w.message,!0)}}async function M(){if(!await xn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))return;const w=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(w!==null)try{const K=await De("/api/update",{method:"POST",body:JSON.stringify({password:w})});ie("LLM-Engine-Update läuft."),m(K.job_id,"LLM-Engine-Update")}catch(K){ie(K.message,!0)}}async function F(){if(await xn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await De("/api/unload",{method:"POST"}),ie("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(w){ie(w.message,!0)}}async function ye(){if(!await xn({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const w=await er({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(w)try{const K=await De("/api/os-update",{method:"POST",body:JSON.stringify({password:w})});ie("OS-Update gestartet."),m(K.job_id,"OS-Update")}catch(K){ie(K.message,!0)}}async function xe(){if(!await xn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const w=await er({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(w)try{await De("/api/reboot",{method:"POST",body:JSON.stringify({password:w})}),ie("Reboot ausgelöst — bis gleich.")}catch(K){ie(K.message,!0)}}async function ke(){c(Ie,"prüfe…");try{const w=await De("/api/integration/test");c(Ie,w.ok?`✓ Engine antwortet — ${w.models.length} Modell(e): ${w.models.join(", ")}`:`✗ keine Verbindung: ${w.error}`,!0),c(Z,w.ok,!0)}catch(w){c(Ie,"✗ "+w.message),c(Z,!1)}}let Ie=L(""),Z=L(!1);const X=G(()=>{var w;return((w=t(a))==null?void 0:w.models)||[]}),ve=["running","ready","loading","starting"],ze=G(()=>t(X).find(w=>ve.includes(w.state)));function Re(w){if(!w||w.state!=="running")return null;if(typeof w.progress=="number")return Math.min(100,w.progress);const ee=((w.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ee?Math.min(100,parseFloat(ee[1])):null}var je=Ud(),ot=i(Xe(je),2),I=r(ot),re=i(r(I),2),be=r(re),Je=i(I,4),de=r(Je),Fe=i(r(de)),ue=r(Fe),at=i(de,2),Qe=i(r(at),2),it=r(Qe),dt=i(at,2),rt=i(r(dt),2),Tt=r(rt),zt=i(Je,2),Wt=r(zt),qt=i(Wt,2);{var Gt=w=>{var K=Fd(),ee=r(K);D(()=>{$t(K,`color:${t(Z)?"#7ee29a":"#ff9b95"}`),g(ee,t(Ie))}),f(w,K)};q(qt,w=>{t(Ie)&&w(Gt)})}var Lt=i(ot,2),Ot=i(r(Lt),4),U=i(Ot,2),ae=i(U,2),A=i(ae,2),B=i(A,2),_e=i(Lt,2),Ce=i(r(_e),4),V=i(Ce,2),pe=i(_e,2);{var z=w=>{const K=G(()=>t(C)),ee=G(()=>t(K).state==="done"),we=G(()=>t(K).state==="failed"),Se=G(()=>t(K).state==="canceled"),ft=G(()=>t(ee)||t(we)||t(Se)),st=G(()=>Re(t(K)));var Ue=jd(),T=r(Ue),Q=i(r(T),2);{var Be=se=>{var ce=Kd();k("click",ce,async()=>{await xn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&De(`/api/jobs/${t(K).id}/cancel`,{method:"POST"})}),f(se,ce)};q(Q,se=>{t(ft)||se(Be)})}var ne=i(Q,2),he=r(ne);{var Ne=se=>{var ce=Nd();f(se,ce)},We=se=>{var ce=qd();f(se,ce)},Ee=se=>{var ce=Vd();f(se,ce)},W=se=>{var ce=Wd();f(se,ce)};q(he,se=>{t(ee)?se(Ne):t(we)?se(We,1):t(Se)?se(Ee,2):se(W,-1)})}var J=i(T,2),le=r(J),oe=i(J,2);{var $e=se=>{var ce=Gd(),wt=r(ce);D(()=>$t(wt,`width:${t(st)??""}%`)),f(se,ce)};q(oe,se=>{t(st)!=null&&!t(ft)&&se($e)})}var Le=i(oe,2),Te=r(Le);D(se=>{g(le,`${t(p)??""}${t(ft)?t(ee)?" — erfolgreich.":t(Se)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),g(Te,se)},[()=>(t(K).log||[]).join(` -`)]),f(w,Ue)};q(pe,w=>{t(C)&&w(z)})}var R=i(pe,2),x=r(R),P=i(r(x),2),N=r(P);N.value=N.__value="llama-swap";var j=i(N);j.value=j.__value="mission-control";var H=i(j);H.value=H.__value="system";var fe=i(x,4),me=r(fe);Ko(fe,w=>d=w,()=>d),D(w=>{var K,ee,we;$t(re,`margin-left:auto;${(K=t(a))!=null&&K.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),g(be,(ee=t(a))!=null&&ee.swap_ok?"● erreichbar":"● offline"),g(ue,(((we=t(a))==null?void 0:we.swap_url)||"—")+"/v1"),g(it,t(ze)?t(ze).name+` (${t(ze).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),g(Tt,w),g(me,t(o))},[()=>t(X).filter(w=>!w.incomplete).length||"keine"]),k("click",Wt,ke),k("click",Ot,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),k("click",U,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),k("click",ae,O),k("click",A,M),k("click",B,F),k("click",Ce,ye),k("click",V,xe),k("change",P,y),Hn(P,()=>t(v),w=>c(v,w)),f(e,je),Dn()}qn(["click","change"]);var Jd=b('
Lade Setups…
'),Qd=b(' ×',1),tr=b('
★ Beste Wahl für dein System
'),Zd=b('
Dein Setup
'),Yd=b(''),Xd=b('
'),ec=b('· ⚠ Cache veraltet'),tc=b(" ",1),nc=b('
Frage Quellen ab…
'),ac=b('
'),ic=b('✓ installiert'),rc=b(''),sc=b('

'),lc=b('

'),oc=b(''),dc=b('

'),cc=b('
'),vc=b('
'),uc=b('
'),pc=b(" "),fc=b('
'),hc=b('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),gc=b('Alternative: — passt auf dein System.',1),mc=b('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),bc=b(''),_c=b('
Lade Dateien von HuggingFace…
'),Yr=b(""),yc=b('
Empfohlener Kontext für deine Hardware: übernehmen
'),xc=b('
Ressourcen-Check
'),kc=b('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),wc=b('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Sc=b('
',1),Mc=b('
Keine GGUF-Dateien im Repo gefunden.
'),Ec=b(''),Ac=b('
'),Cc=b(''),Tc=b('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function zc(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",l={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},v=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function d(E){const S=(E||"").toLowerCase();for(const te of v)if(te.kw.some(Y=>S.includes(Y)))return te.label;return"Allrounder"}function u(E=""){const S=E.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(S)||new RegExp("(?{zt(),Wt()});async function zt(){c(O,!0);try{const E=await De("/api/cookbook/recipes");c(y,E.recipes||[],!0),c($,E.recommended_id||null,!0)}catch(E){ie(E.message,!0)}c(O,!1)}async function Wt(E=!1){c(F,!0);try{const S=await De("/api/cookbook/discover"+(E?"?force=true":""));c(M,S,!0),c(ye,S.stale,!0)}catch(S){ie("Empfehlungen nicht ladbar: "+S.message,!0)}c(F,!1)}function qt(E){E=E.trim();const S=E.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return S?S[1]:/^[\w.-]+\/[\w.-]+$/.test(E)?E:null}async function Gt(){const E=t(xe).trim(),S=qt(E);let te=E;if(t(Z)&&!S&&(te=te?te+" "+t(Z):t(Z)),!te&&!S){c(ke,[],!0);return}c(Ie,!0),c(ve,[],!0),c(ze,-1);try{if(S)c(ke,[{id:S,author:S.split("/")[0],downloads:0}],!0);else{const Y=`https://huggingface.co/api/models?search=${encodeURIComponent(te)}&filter=gguf&sort=${encodeURIComponent(t(X))}&direction=-1&limit=40`,Ae=await fetch(Y);c(ke,await Ae.json(),!0)}t(ke).forEach((Y,Ae)=>Lt(Ae,Y.id))}catch(Y){ie(Y.message,!0),c(ke,[],!0)}c(Ie,!1)}async function Lt(E,S){var te;try{const Y=await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:S,ctx:8192})});if(!((te=Y.files)!=null&&te.length)){t(ve)[E]=null,Ot();return}const Ae=Y.files.find(mt=>{var yt;return(yt=mt.quant)==null?void 0:yt.includes("Q4_K_M")})||Y.files[0];t(ve)[E]=Ae.fit.level,Ot()}catch{t(ve)[E]=null,Ot()}}function Ot(){let E=-1,S=99;t(ve).forEach((te,Y)=>{if(te==null)return;const Ae=l[te]??99;Ae=0&&S<=1?E:-1,!0)}function U(E){c(Re,t(y).find(S=>S.id===E),!0)}async function ae(E){const S=document.getElementById("cb-r-install-btn");S&&(S.disabled=!0,S.textContent="Starte…");try{const te=await De("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:E,hf_token:ci()})});ie(`${te.count} Download${te.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),c(Re,null),Tt("activity")}catch(te){ie(te.message,!0),S&&(S.disabled=!1,S.textContent="Installieren")}}async function A(E,S){var te,Y;c(je,!0),c(ot,S,!0),c(I,E,!0),c(Je,""),c(de,8192),c(re,null),c(ue,null),c(be,""),c(Fe,!0);try{if(c(re,await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:E,ctx:8192})}),!0),(Y=(te=t(re))==null?void 0:te.files)!=null&&Y.length){const Ae=t(re).files.find(mt=>{var yt;return(yt=mt.quant)==null?void 0:yt.includes("Q4_K_M")})||t(re).files[0];c(be,Ae.filename,!0),Ae.optimal_ctx&&t(de)===8192&&c(de,Ae.optimal_ctx,!0),B()}}catch(Ae){ie(Ae.message,!0)}c(Fe,!1)}function B(){var E,S,te;!((S=(E=t(re))==null?void 0:E.files)!=null&&S.length)||!t(be)||(c(ue,t(re).files.find(Y=>Y.filename===t(be))||null,!0),(te=t(ue))!=null&&te.optimal_ctx&&t(de)===8192&&c(de,t(ue).optimal_ctx,!0))}async function _e(){var E,S;if(!t(I)||!t(be))return ie("Bitte eine GGUF-Datei wählen.",!0);c(Fe,!0);try{const te=((E=t(re))==null?void 0:E.params_b)??7,Y=((S=t(ue))==null?void 0:S.quant)??"Q4_K_M";await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(I),role:t(Je),params_b:te,quant:Y,file:t(be),ctx:t(de),hf_token:ci()})}),ie("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),c(je,!1),Tt("activity")}catch(te){ie("Fehler: "+te.message,!0)}c(Fe,!1)}async function Ce(E,S,te,Y){Y.disabled=!0,Y.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:E,role:S,params_b:te,quant:"Q4_K_M",hf_token:ci()})}),ie("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Tt("activity")}catch(Ae){ie(Ae.message,!0),Y.disabled=!1,Y.textContent="Installieren"}}function V(){c(rt,null),c(Qe,""),c(it,""),c(dt,[{repo:"",role:"",quant:"Q4_K_M"}],!0),c(at,!0)}function pe(E){const S=t(y).find(te=>te.id===E);S&&(c(rt,E,!0),c(Qe,S.title,!0),c(it,S.desc||"",!0),c(dt,S.models.map(te=>({repo:te.repo,role:te.role,quant:te.quant||"Q4_K_M"})),!0),c(at,!0))}async function z(){if(!t(Qe).trim())return ie("Bitte einen Titel angeben.",!0);const E=t(dt).filter(S=>S.repo.trim());if(!E.length)return ie("Mindestens ein Modell (Repo) angeben.",!0);try{t(rt)?(await De("/api/cookbook/user-recipe/"+encodeURIComponent(t(rt)),{method:"PUT",body:JSON.stringify({title:t(Qe),desc:t(it),models:E})}),ie("Setup aktualisiert.")):(await De("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(Qe),desc:t(it),models:E})}),ie("Setup gespeichert.")),c(at,!1),zt()}catch(S){ie(S.message,!0)}}async function R(E){const S=t(y).find(te=>te.id===E);if(await xn({title:`„${(S==null?void 0:S.title)||E}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await De("/api/cookbook/user-recipe/"+encodeURIComponent(E),{method:"DELETE"}),ie("Setup gelöscht."),zt()}catch(te){ie(te.message,!0)}}function x(E){if(!u(E))return"";const S=p(E);return`MoE${S?` · ~${S}B aktiv`:""}`}function P(E){return E?`${Fn(E)}`:""}var N=Tc(),j=i(Xe(N),2),H=r(j),fe=i(r(H),2),me=i(H,4);{var w=E=>{var S=Jd();f(E,S)},K=E=>{var S=Xd();Ye(S,21,()=>t(y),lt,(te,Y)=>{const Ae=G(()=>t(Y).id===t($));var mt=Yd(),yt=r(mt);{var Me=Ke=>{var ht=Qd(),Zt=Xe(ht),Kt=i(Zt,2);k("click",Zt,Pt=>{Pt.stopPropagation(),pe(t(Y).id)}),k("keydown",Zt,Pt=>{Pt.key==="Enter"&&(Pt.stopPropagation(),pe(t(Y).id))}),k("click",Kt,Pt=>{Pt.stopPropagation(),R(t(Y).id)}),k("keydown",Kt,Pt=>{Pt.key==="Enter"&&(Pt.stopPropagation(),R(t(Y).id))}),f(Ke,ht)};q(yt,Ke=>{t(Y).user&&Ke(Me)})}var qe=i(yt,2);{var Ze=Ke=>{var ht=tr();f(Ke,ht)},Mt=Ke=>{var ht=Zd();f(Ke,ht)};q(qe,Ke=>{t(Ae)?Ke(Ze):t(Y).user&&Ke(Mt,1)})}var et=i(qe,2),ct=r(et),xt=r(ct),Rt=r(xt),sn=i(ct,2),Et=r(sn),tt=i(et,2),Ft=r(tt),Qt=i(tt,2),Ct=r(Qt);D((Ke,ht)=>{At(mt,1,`card-btn${t(Ae)?" cb-best":""}`),g(Rt,t(Y).title),At(sn,1,`fit-badge ${Ke??""}`),g(Et,ht),g(Ft,t(Y).desc),g(Ct,`${t(Y).models.length??""} Modell${t(Y).models.length>1?"e":""} im Setup`)},[()=>_(t(Y).fit_level),()=>C(t(Y).fit_level)]),k("click",mt,()=>U(t(Y).id)),f(te,mt)}),f(E,S)};q(me,E=>{t(O)?E(w):E(K,-1)})}var ee=i(j,2),we=r(ee),Se=i(r(we),2),ft=r(Se);{var st=E=>{const S=G(()=>Math.round((Date.now()/1e3-t(M).updated)/60));var te=tc(),Y=Xe(te);{var Ae=Ze=>{var Mt=oi();D(()=>g(Mt,`Quellen befragt vor ${t(S)??""} min`)),f(Ze,Mt)},mt=Ze=>{var Mt=oi();D(et=>g(Mt,`Quellen befragt vor ${et??""} h`),[()=>Math.round(t(S)/60)]),f(Ze,Mt)},yt=Ze=>{var Mt=oi();D(et=>g(Mt,`Quellen befragt vor ${et??""} Tg.`),[()=>Math.round(t(S)/1440)]),f(Ze,Mt)};q(Y,Ze=>{t(S)<60?Ze(Ae):t(S)<1440?Ze(mt,1):Ze(yt,-1)})}var Me=i(Y,2);{var qe=Ze=>{var Mt=ec();f(Ze,Mt)};q(Me,Ze=>{t(ye)&&Ze(qe)})}f(E,te)};q(ft,E=>{var S;(S=t(M))!=null&&S.updated&&E(st)})}var Ue=i(Se,2),T=r(Ue),Q=i(we,4);{var Be=E=>{var S=nc();f(E,S)},ne=E=>{var S=Ha(),te=Xe(S);Ye(te,17,()=>t(M).categories,lt,(Y,Ae)=>{var mt=lc(),yt=r(mt),Me=r(yt),qe=r(Me),Ze=i(yt,2);Ye(Ze,21,()=>t(Ae).models,lt,(Mt,et)=>{const ct=G(()=>t(Ae).recommended&&t(et).repo===t(Ae).recommended);var xt=sc(),Rt=r(xt);{var sn=gt=>{var _t=tr();f(gt,_t)};q(Rt,gt=>{t(ct)&>(sn)})}var Et=i(Rt,2),tt=r(Et),Ft=r(tt),Qt=r(Ft),Ct=i(Ft,2),Ke=r(Ct),ht=i(tt,2),Zt=r(ht),Kt=i(Et,2),Pt=r(Kt);He(Pt,()=>P(o[t(et).role]||d(t(et).repo)));var Vn=i(Pt,2);He(Vn,()=>x(t(et).repo));var Zn=i(Kt,2),$n=r(Zn),Ca=i(Zn,2);Ye(Ca,17,()=>t(et).requirements||[],lt,(gt,_t)=>{var Vt=ac(),In=r(Vt);D(()=>g(In,`⚠ ${t(_t)??""}`)),f(gt,Vt)});var kt=i(Ca,4),vt=r(kt);{var bt=gt=>{var _t=ic();D(()=>Aa(_t,"title",`bereits eingerichtet als ${t(et).installed??""}`)),f(gt,_t)},Dt=gt=>{var _t=rc();k("click",_t,Vt=>Ce(t(et).repo,t(et).role,t(et).params_b,Vt.currentTarget)),f(gt,_t)};q(vt,gt=>{t(et).installed?gt(bt):gt(Dt,-1)})}D((gt,_t,Vt)=>{At(xt,1,`card${t(ct)?" res-best":""}`),g(Qt,t(et).name),g(Ke,`${t(et).author??""} · ${t(et).params_b??""}B`),At(ht,1,`fit-badge ${gt??""}`),g(Zt,t(et).fit.text),g($n,`${_t??""} · ⬇ ${Vt??""}`)},[()=>_(t(et).fit.level),()=>m(t(et).fit),()=>(t(et).downloads||0).toLocaleString()]),f(Mt,xt)}),D(()=>g(qe,t(Ae).title)),f(Y,mt)}),f(E,S)};q(Q,E=>{var S;t(F)&&!t(M)?E(Be):(S=t(M))!=null&&S.categories&&E(ne,1)})}var he=i(ee,2),Ne=i(r(he),4),We=r(Ne),Ee=i(We,2),W=r(Ee);W.value=W.__value="downloads";var J=i(W);J.value=J.__value="trending";var le=i(J);le.value=le.__value="created_at";var oe=i(Ee,2),$e=r(oe),Le=i(Ne,2);Ye(Le,20,()=>["","coder","vision","reasoning","chat","agent"],lt,(E,S)=>{var te=oc(),Y=r(te);D(()=>{At(te,1,t(Z)===S?"primary":"ghost"),g(Y,S||"Alle")}),k("click",te,()=>{c(Z,S,!0),Gt()}),f(E,te)});var Te=i(Le,2);{var se=E=>{var S=cc();Ye(S,21,()=>t(ke),lt,(te,Y,Ae)=>{var mt=dc(),yt=r(mt);{var Me=Kt=>{var Pt=tr();f(Kt,Pt)};q(yt,Kt=>{Ae===t(ze)&&Kt(Me)})}var qe=i(yt,2),Ze=r(qe),Mt=r(Ze),et=r(Mt),ct=i(Mt,2),xt=r(ct),Rt=i(Ze,2),sn=r(Rt),Et=i(qe,2),tt=r(Et);He(tt,()=>P(d(t(Y).id)));var Ft=i(tt,2);He(Ft,()=>x(t(Y).id));var Qt=i(Et,4),Ct=r(Qt),Ke=r(Ct),ht=i(Ct,2),Zt=r(ht);D((Kt,Pt,Vn,Zn,$n)=>{At(mt,1,`card${Ae===t(ze)?" res-best":""}`),g(et,Kt),g(xt,t(Y).author||""),At(Rt,1,`fit-badge ${Pt??""}`),g(sn,Vn),g(Ke,Zn),g(Zt,`⬇ ${$n??""}`)},[()=>t(Y).id.split("/").pop(),()=>t(ve)[Ae]?_(t(ve)[Ae]):"warn",()=>t(ve)[Ae]?C(t(ve)[Ae]):"prüfe…",()=>t(ve)[Ae]?m({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(Y).downloads||0).toLocaleString()]),k("click",mt,()=>A(t(Y).id,t(Y).id.split("/").pop())),f(te,mt)}),f(E,S)};q(Te,E=>{t(ke).length&&E(se)})}var ce=i(he,2);{var wt=E=>{const S=G(()=>t(Re));var te=bc(),Y=r(te),Ae=r(Y),mt=i(Ae,2),yt=r(mt),Me=i(mt,2),qe=r(Me),Ze=i(Me,2);Ye(Ze,21,()=>t(S).models,lt,(Et,tt)=>{var Ft=fc(),Qt=r(Ft),Ct=r(Qt),Ke=r(Ct),ht=r(Ke),Zt=i(Ke,2),Kt=r(Zt),Pt=i(Zt,2);He(Pt,()=>x(t(tt).repo));var Vn=i(Ct,2);{var Zn=bt=>{var Dt=vc(),gt=r(Dt);D(()=>g(gt,t(tt).why)),f(bt,Dt)};q(Vn,bt=>{t(tt).why&&bt(Zn)})}var $n=i(Vn,2);{var Ca=bt=>{var Dt=uc(),gt=r(Dt);D((_t,Vt,In)=>g(gt,`~${_t??""} GB · ~${Vt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(tt).fit.req_gb??0).toFixed(1),()=>Math.round(t(tt).fit.tps??0),()=>Math.round((t(tt).optimal_ctx||8192)/1024)]),f(bt,Dt)};q($n,bt=>{t(tt).fit&&bt(Ca)})}var kt=i(Qt,2);{var vt=bt=>{var Dt=pc(),gt=r(Dt);D(_t=>{At(Dt,1,`fit-badge ${_t??""}`),g(gt,t(tt).fit.text)},[()=>_(t(tt).fit.level)]),f(bt,Dt)};q(kt,bt=>{t(tt).fit&&bt(vt)})}D(()=>{g(ht,t(tt).name),g(Kt,t(tt).role)}),f(Et,Ft)});var Mt=i(Ze,2);{var et=Et=>{const tt=G(()=>Math.max(...t(S).models.map(Ke=>{var ht;return((ht=Ke.fit)==null?void 0:ht.req_gb)??0})));var Ft=hc(),Qt=i(r(Ft)),Ct=r(Qt);D(Ke=>g(Ct,`~${Ke??""} GB`),[()=>t(tt).toFixed(1)]),f(Et,Ft)};q(Mt,Et=>{t(S).models.length&&t(S).models[0].fit&&Et(et)})}var ct=i(Mt,2);{var xt=Et=>{const tt=G(()=>t(y).find(Ke=>!Ke.user&&Ke.fit_level!=="too_tight"&&Ke.id!==t(S).id));var Ft=mc(),Qt=i(r(Ft));{var Ct=Ke=>{var ht=gc(),Zt=i(Xe(ht)),Kt=r(Zt);D(()=>g(Kt,`„${t(tt).title??""}" ansehen`)),k("click",Zt,Pt=>{Pt.preventDefault(),c(Re,null),setTimeout(()=>U(t(tt).id),50)}),f(Ke,ht)};q(Qt,Ke=>{t(tt)&&Ke(Ct)})}f(Et,Ft)};q(ct,Et=>{t(S).fit_level==="too_tight"&&Et(xt)})}var Rt=i(ct,2),sn=r(Rt);D(()=>{g(yt,t(S).title),g(qe,t(S).desc),At(Rt,1,`primary${t(S).fit_level==="too_tight"?" warn":""}`),g(sn,t(S).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),k("click",te,Et=>{Et.target.classList.contains("modal-overlay")&&c(Re,null)}),k("click",Ae,()=>c(Re,null)),k("click",Rt,()=>ae(t(S).id)),f(E,te)};q(ce,E=>{t(Re)&&E(wt)})}var St=i(ce,2);{var Bt=E=>{var S=Ec(),te=r(S),Y=r(te),Ae=i(Y,2),mt=r(Ae),yt=i(Ae,2),Me=r(yt),qe=i(yt,2);{var Ze=ct=>{var xt=_c();f(ct,xt)},Mt=ct=>{var xt=Sc(),Rt=i(Xe(xt),2);Ye(Rt,21,()=>t(re).files,lt,(kt,vt)=>{const bt=G(()=>t(vt).fit.level==="perfect"?"●":t(vt).fit.level==="marginal"?"◐":"○");var Dt=Yr(),gt=r(Dt),_t={};D(()=>{g(gt,`${t(bt)??""} ${t(vt).filename??""}`),_t!==(_t=t(vt).filename)&&(Dt.value=(Dt.__value=t(vt).filename)??"")}),f(kt,Dt)});var sn=i(Rt,2),Et=r(sn),tt=i(r(Et),2),Ft=i(Et,2),Qt=r(Ft),Ct=i(r(Qt));He(Ct,()=>br(a));var Ke=i(Qt,2),ht=i(sn,2);{var Zt=kt=>{var vt=yc(),bt=i(r(vt)),Dt=r(bt),gt=i(bt,2);D(_t=>g(Dt,`~${_t??""}k`),[()=>Math.round(t(ue).optimal_ctx/1024)]),k("click",gt,_t=>{_t.preventDefault(),c(de,t(ue).optimal_ctx,!0)}),f(kt,vt)};q(ht,kt=>{var vt;(vt=t(ue))!=null&&vt.optimal_ctx&&kt(Zt)})}var Kt=i(ht,2);{var Pt=kt=>{var vt=xc(),bt=r(vt),Dt=i(r(bt),2),gt=r(Dt),_t=i(bt,2),Vt=r(_t);D((In,ki,Gi)=>{g(gt,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(ue).quant||"GGUF")??""}`),At(_t,1,`fit-badge ${Gi??""}`),g(Vt,t(ue).fit.text)},[()=>(t(ue).fit.req_gb??0).toFixed(1),()=>Math.round(t(ue).fit.tps??0),()=>_(t(ue).fit.level)]),f(kt,vt)};q(Kt,kt=>{t(ue)&&kt(Pt)})}var Vn=i(Kt,2);{var Zn=kt=>{const vt=G(()=>t(re).files.find(Vt=>Vt.fit.level!=="too_tight"&&Vt.filename!==t(be)));var bt=Ha(),Dt=Xe(bt);{var gt=Vt=>{var In=kc(),ki=i(r(In)),Gi=r(ki);D(ji=>g(Gi,`${t(vt).filename??""} (${ji??""})`),[()=>C(t(vt).fit.level)]),k("click",ki,ji=>{ji.preventDefault(),c(be,t(vt).filename,!0),B()}),f(Vt,In)},_t=Vt=>{var In=wc();f(Vt,In)};q(Dt,Vt=>{t(vt)?Vt(gt):Vt(_t,-1)})}f(kt,bt)};q(Vn,kt=>{var vt,bt;((vt=t(ue))==null?void 0:vt.fit.level)==="too_tight"&&((bt=t(re))!=null&&bt.files)&&kt(Zn)})}var $n=i(Vn,2),Ca=r($n);D(()=>{var kt,vt;At($n,1,`primary${((kt=t(ue))==null?void 0:kt.fit.level)==="too_tight"?" warn":""}`),$n.disabled=t(Fe),g(Ca,t(Fe)?"Starte…":((vt=t(ue))==null?void 0:vt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),k("change",Rt,B),Hn(Rt,()=>t(be),kt=>c(be,kt)),an(tt,()=>t(Je),kt=>c(Je,kt)),an(Ke,()=>t(de),kt=>c(de,kt)),k("click",$n,_e),f(ct,xt)},et=ct=>{var xt=Mc();f(ct,xt)};q(qe,ct=>{var xt,Rt;t(Fe)&&!t(re)?ct(Ze):(Rt=(xt=t(re))==null?void 0:xt.files)!=null&&Rt.length?ct(Mt,1):t(Fe)||ct(et,2)})}D(()=>{g(mt,t(ot)),g(Me,t(I))}),k("click",S,ct=>{ct.target.classList.contains("modal-overlay")&&c(je,!1)}),k("click",Y,()=>c(je,!1)),f(E,S)};q(St,E=>{t(je)&&E(Bt)})}var hn=i(St,2);{var da=E=>{var S=Cc(),te=r(S),Y=r(te),Ae=i(Y,2),mt=r(Ae),yt=i(Ae,6),Me=i(yt,4),qe=i(Me,4);Ye(qe,17,()=>t(dt),lt,(ct,xt,Rt)=>{var sn=Ac(),Et=r(sn),tt=i(Et,2),Ft=i(tt,2);Ye(Ft,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],lt,(Ct,Ke)=>{var ht=Yr(),Zt=r(ht),Kt={};D(()=>{g(Zt,Ke),Kt!==(Kt=Ke)&&(ht.__value=Ke)}),f(Ct,ht)});var Qt=i(Ft,2);an(Et,()=>t(xt).repo,Ct=>t(xt).repo=Ct),an(tt,()=>t(xt).role,Ct=>t(xt).role=Ct),Hn(Ft,()=>t(xt).quant,Ct=>t(xt).quant=Ct),k("click",Qt,()=>c(dt,t(dt).filter((Ct,Ke)=>Ke!==Rt),!0)),f(ct,sn)});var Ze=i(qe,2),Mt=i(Ze,4),et=r(Mt);D(()=>{g(mt,t(rt)?"Setup bearbeiten":"Eigenes Setup erstellen"),g(et,t(rt)?"Änderungen speichern":"Setup speichern")}),k("click",S,ct=>{ct.target.classList.contains("modal-overlay")&&c(at,!1)}),k("click",Y,()=>c(at,!1)),an(yt,()=>t(Qe),ct=>c(Qe,ct)),an(Me,()=>t(it),ct=>c(it,ct)),k("click",Ze,()=>c(dt,[...t(dt),{repo:"",role:"",quant:"Q4_K_M"}],!0)),k("click",Mt,z),f(E,S)};q(hn,E=>{t(at)&&E(da)})}D(()=>{Ue.disabled=t(F),g(T,t(F)?"Suche…":"Aktualisieren"),oe.disabled=t(Ie),g($e,t(Ie)?"Lade…":"Suchen")}),k("click",fe,V),k("click",Ue,()=>Wt(!0)),k("keydown",We,E=>E.key==="Enter"&&Gt()),an(We,()=>t(xe),E=>c(xe,E)),Hn(Ee,()=>t(X),E=>c(X,E)),k("click",oe,Gt),f(e,N),Dn()}qn(["click","keydown","change"]);var Pc=b(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame. - Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
`),Dc=b(' '),$c=b('
'),Ic=b(' '),Lc=b(''),Xr=b(''),Oc=b('

Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.

Jan AI öffnen → linke Leiste → Remote-Modelle+ Modell hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
',1),Bc=b('

Datei anlegen oder öffnen: ~/.continue/config.json

Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.

Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.

Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
',1),Rc=b('

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Fc=b('

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

Danach im Agent-Panel das Modell auswählen.
Zed herunterladen: zed.dev — kostenlos, native Performance, Windows/macOS/Linux.
',1),Kc=b('

Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):

Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc

Den "providers"-Block in die bestehende opencode.jsonc einfügen (nicht die ganze Datei ersetzen). Falls bereits ein "llama-swap"-Eintrag existiert: vorher löschen.

Danach in OpenCode /models wählen.

OpenCode Desktop: opencode.ai
',1),Nc=b('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
Cline für VS Code: VS Code Marketplace · für JetBrains: JetBrains Marketplace
',1),qc=b('

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

',1),Vc=b('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Wc=b('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?
Chat
Coding-Assistenten

4 · Config-Snippet

',1),Gc=b('

2 · Erst ein Modell installieren

Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),jc=b(''),Uc=b('

In Cline: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.

In Claude Code: Block in ~/.claude/settings.json unter "mcpServers" einfügen.

Einmalig auf dem Windows-PC: pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).
',1),Hc=b('

Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.

Einmalig: pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.
',1),Jc=b('

Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad /opt/mission-control/mcp_memory.py ist bereits korrekt — kein weiteres Setup nötig.

'),Qc=b(`

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

Gedächtnis-MCP

Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen - über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Zc(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>{var x;return(((x=t(a))==null?void 0:x.models)||[]).filter(P=>!P.incomplete)});let l=L("zed"),o=L(Jt([])),v=L(""),d=L(!1),u=L("cline"),p=L(Jt(localStorage.getItem("mc_ip_override")||""));function _(x){return/^\d{1,3}(\.\d{1,3}){3}$/.test(x)}function C(){return location.protocol==="https:"||!_(location.hostname)}function m(){return`http://${t(p).trim()||location.hostname}:8080/v1`}const y=G(m);function $(){const x=t(p).trim();x?localStorage.setItem("mc_ip_override",x):localStorage.removeItem("mc_ip_override")}const O=G(()=>ze(t(u))),M=G(()=>t(o).length?t(o):t(s).map(x=>x.name)),F=G(()=>t(M)[0]||"coder"),ye=G(()=>{var x;return(x=t(s).find(P=>{var N,j;return(j=(N=P.meta)==null?void 0:N.caps)==null?void 0:j.includes("Bild")}))==null?void 0:x.name});function xe(x,P){const j=(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>{var w,K;const fe=(((w=H.meta)==null?void 0:w.caps)||[]).some(ee=>/Bild|Vision/i.test(ee)),me=((K=H.meta)==null?void 0:K.ctx)||131072;return` { "name": "${H.name}", "display_name": "${H.name}", "max_tokens": ${me}${fe?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, +
`;const u=c.querySelector("input"),p=_=>{c.remove(),v(_)};c.addEventListener("click",_=>{if(_.target===c)return p(null);const C=_.target.closest("[data-x]");C&&p(C.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",_=>{_.key==="Enter"&&p(u.value||""),_.key==="Escape"&&p(null)}),document.body.appendChild(c),u.focus()})}function Ho(e="overview"){const n=jr(".nav-item[data-view]:not(.disabled)"),a=jr(".view[data-view]"),s=new Set(a.map(o=>o.dataset.view));function l(o){s.has(o)||(o=e),a.forEach(v=>v.hidden=v.dataset.view!==o),n.forEach(v=>v.classList.toggle("active",v.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",v=>{v.preventDefault(),l(o.dataset.view)})),window.addEventListener("hashchange",()=>l(location.hash.replace("#/",""))),l(location.hash.replace("#/","")||e),{show:l}}let Hr=$(null);const yi={get value(){return t(Hr)},set(e){d(Hr,e,!0)}};let Jr=$(Gt([])),na=$(Gt([]));const fa={get value(){return t(Jr)},set(e){d(Jr,e||[],!0)},get tracked(){return t(na)},track(e){t(na).includes(e)||d(na,[...t(na),e],!0)},toggle(e){d(na,t(na).includes(e)?t(na).filter(n=>n!==e):[...t(na),e],!0)}};let Qr=$(null);const $r={get value(){return t(Qr)},set(e){d(Qr,e,!0)}},Jo="5";var ds;typeof window<"u"&&((ds=window.__svelte??(window.__svelte={})).v??(ds.v=new Set)).add(Jo);var Qo=g('— bereit für Anfragen'),Zo=g('
Temperatur (GPU)
Freier Speicher
GB
',1),Yo=g('
Temperatur
messe…
Freier Speicher
messe…
',1),Xo=g('
'),ed=g('
Warte auf Messwerte…
'),td=g('
Noch kein Modell eingerichtet — starte hier:
',1),nd=g('
Die häufigsten Aufgaben — ein Klick.
',1),ad=g('Bild'),id=g('Code'),rd=g('Text'),sd=g('∞ aktiv'),ld=g(''),od=g('
'),Zr=g('
'),dd=g('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),cd=g('
'),vd=g('
News gerade nicht ladbar.
'),ud=g('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function pd(e,n){Pn(n,!0);const a=N(()=>yi.value),s=N(()=>$r.value),l=N(()=>{var M;return((M=t(a))==null?void 0:M.models)||[]}),o=N(()=>{var M;return((M=t(a))==null?void 0:M.swap_ok)??!1}),v=["running","ready","loading","starting"],c=N(()=>t(l).find(M=>v.includes(M.state))),u=N(()=>t(l).filter(M=>!M.incomplete)),p=N(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),_=N(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(t(s).ram.percent)} % — eventuell Speicher freigeben.`:`${t(u).length} ${t(u).length===1?"Modell":"Modelle"} konfiguriert · ${t(c)?`„${t(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),C=N(()=>()=>{var W;const M=(W=t(s))==null?void 0:W.gpu;return M&&M.vram.total+M.gtt.total>0?(M.vram.used+M.gtt.used)/(M.vram.total+M.gtt.total)*100:0});let b=$(Gt([])),x=$(null);xi(async()=>{try{d(b,((await Pe("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function D(){await yn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await Pe("/api/unload",{method:"POST"}),E())}async function O(M){d(x,M,!0);try{await Pe("/api/preload?model="+encodeURIComponent(M),{method:"POST"})}catch(W){le("Laden fehlgeschlagen: "+(W.message||"Engine nicht erreichbar?"),!0)}d(x,null),E()}function E(){document.dispatchEvent(new Event("mc:refresh"))}function B(M){var W;(W=document.querySelector(`.nav-item[data-view="${M}"]`))==null||W.dispatchEvent(new MouseEvent("click"))}function xe(M){return M>=90?"red":M>=75?"":"green"}function Me(M){return M==null?"":M>=75?"red":M>=55?"":"green"}function Ae(M){return M>=90?"red":M>=70?"":"green"}var Re=ud(),ne=ot(Re),J=r(ne),fe=r(J),Ie=r(fe),We=i(Ie);{var tt=M=>{var W=Qo();f(M,W)};F(We,M=>{t(o)&&!t(c)&&M(tt)})}var _t=i(fe,2),I=r(_t),oe=i(ne,2),we=r(oe),it=r(we),ge=i(r(it),2);at(ge,()=>Ht("server"),!0);var He=i(it,2),ye=r(He),dt=i(He,2),rt=r(dt),mt=i(we,2),ct=r(mt),ft=i(r(ct),2);at(ft,()=>Ht("cpu"),!0);var It=i(ct,2),Ft=r(It),Lt=i(It,2),Ut=r(Lt);{var Kt=M=>{var W=oi();z(Te=>h(W,`${Te??""} · ${t(c).state??""}`),[()=>{var Te;return(Te=t(c).meta)!=null&&Te.ctx?Math.round(t(c).meta.ctx/1024)+"k ctx":""}]),f(M,W)},Nt=M=>{var W=oi("lädt bei erster Anfrage");f(M,W)};F(Ut,M=>{t(c)?M(Kt):M(Nt,-1)})}var qt=i(mt,2);{var Q=M=>{const W=N(()=>{var ln;return t(s).gpu_temp??((ln=t(s).cpu)==null?void 0:ln.temp)??null}),Te=N(()=>Me(t(W))),X=N(()=>t(s).ram.total-t(s).ram.used),pe=N(()=>100-t(s).ram.percent);var De=Zo(),je=ot(De),Oe=r(je),G=i(r(Oe));at(G,()=>Ht("thermo"),!0);var V=i(Oe,2),ae=r(V),re=i(V,2),Be=r(re),Fe=i(je,2),de=r(Fe),H=i(r(de));at(H,()=>Ht("database"),!0);var se=i(de,2),vt=r(se),ht=i(se,2),St=r(ht);z((ln,Vn,S,w)=>{Dt(je,1,`kpi ${t(Te)??""}`),h(ae,ln),h(Be,t(W)==null?"messe…":t(W)<55?"kühl":t(W)<75?"normal":"⚠ heiß"),Dt(Fe,1,`kpi ${t(pe)<15?"red":t(pe)<30?"":"green"}`),h(vt,Vn),h(St,`von ${S??""} GB · ${w??""} % frei`)},[()=>t(W)!=null?`${Math.round(t(W))}°C`:"–",()=>Math.round(t(X)/1073741824),()=>Math.round(t(s).ram.total/1073741824),()=>Math.round(t(pe))]),f(M,De)},me=M=>{var W=Yo();f(M,W)};F(qt,M=>{t(s)?M(Q):M(me,-1)})}var A=i(oe,2),R=r(A),ke=i(r(R),4);{var $e=M=>{const W=N(()=>t(C)());var Te=Aa(),X=ot(Te);Xe(X,17,()=>{var pe;return[["Prozessor (CPU)",((pe=t(s).cpu)==null?void 0:pe.percent)??0,""],["Arbeitsspeicher (RAM)",t(s).ram.percent,xe(t(s).ram.percent)],["Grafikspeicher (VRAM)",t(W),Ae(t(W))]]},lt,(pe,De)=>{var je=N(()=>Jn(t(De),3));let Oe=()=>t(je)[0],G=()=>t(je)[1];const V=N(()=>Math.max(0,Math.min(100,G()||0)));var ae=Xo(),re=r(ae),Be=r(re),Fe=r(Be),de=i(Be),H=r(de),se=i(re,2),vt=r(se);z((ht,St)=>{h(Fe,Oe()),h(H,`${ht??""} %`),Dt(se,1,`bar ${t(V)>=90?"bad":t(V)>=75?"warn":""}`),Pt(vt,`width:${St??""}%`)},[()=>Math.round(t(V)),()=>Math.max(2,t(V))]),f(pe,ae)}),f(M,Te)},q=M=>{var W=ed();f(M,W)};F(ke,M=>{t(s)?M($e):M(q,-1)})}var he=i(R,2),Le=i(r(he),2);{var Ne=M=>{var W=td(),Te=i(ot(W),2),X=r(Te);at(X,()=>Ht("search"),!0);var pe=i(X,4);at(pe,()=>Ht("chevron"),!0);var De=i(Te,2),je=r(De);at(je,()=>Ht("swap"),!0);var Oe=i(je,4);at(Oe,()=>Ht("chevron"),!0);var G=i(De,2),V=r(G);at(V,()=>Ht("file"),!0);var ae=i(V,4);at(ae,()=>Ht("chevron"),!0),k("click",Te,()=>B("cookbook")),k("click",De,()=>B("connect")),k("click",G,()=>B("guides")),f(M,W)},T=M=>{var W=nd(),Te=i(ot(W),2),X=r(Te);at(X,()=>Ht("search"),!0);var pe=i(X,4);at(pe,()=>Ht("chevron"),!0);var De=i(Te,2),je=r(De);at(je,()=>Ht("refresh"),!0);var Oe=i(je,4);at(Oe,()=>Ht("chevron"),!0);var G=i(De,2),V=r(G);at(V,()=>Ht("file"),!0);var ae=i(V,4);at(ae,()=>Ht("chevron"),!0);var re=i(G,2),Be=r(re);at(Be,()=>Ht("swap"),!0);var Fe=i(Be,4);at(Fe,()=>Ht("chevron"),!0),k("click",Te,()=>B("cookbook")),k("click",De,D),k("click",G,()=>B("server")),k("click",re,()=>B("connect")),f(M,W)};F(Le,M=>{t(u).length?M(T,-1):M(Ne)})}var K=i(A,2),U=r(K),be=r(U),ce=i(r(be),2),Ce=r(ce),Ee=i(be,2);{var P=M=>{var W=Zr();Xe(W,21,()=>t(u),lt,(Te,X)=>{const pe=N(()=>v.includes(t(X).state)),De=N(()=>t(X).state==="downloading"),je=N(()=>t(X).state==="loading"||t(X).state==="starting"||t(De)?"load":t(pe)?"on":""),Oe=N(()=>t(De)?`↓ ${t(X).download_progress!=null?Math.round(t(X).download_progress)+"%":"..."}`:t(X).state==="loading"||t(X).state==="starting"?"lädt…":t(pe)?"geladen ✓":"bereit");var G=od(),V=r(G),ae=i(V,2),re=r(ae),Be=r(re),Fe=r(Be),de=i(Be,2);{var H=ie=>{var ze=ad();f(ie,ze)},se=N(()=>{var ie,ze;return(ze=(ie=t(X).meta)==null?void 0:ie.caps)==null?void 0:ze.includes("Bild")}),vt=ie=>{var ze=id();f(ie,ze)},ht=N(()=>{var ie,ze;return(ze=(ie=t(X).meta)==null?void 0:ie.caps)==null?void 0:ze.includes("Code")}),St=ie=>{var ze=rd();f(ie,ze)};F(de,ie=>{t(se)?ie(H):t(ht)?ie(vt,1):ie(St,-1)})}var ln=i(de,2);{var Vn=ie=>{var ze=sd();f(ie,ze)};F(ln,ie=>{t(X).ttl>=99999&&ie(Vn)})}var S=i(re,2),w=r(S),ee=i(ae,2),Z=r(ee),j=r(Z),ue=i(Z,2);{var Je=ie=>{var ze=ld(),Ue=r(ze);z(()=>{Pt(ze,`padding:3px 9px;font-size:12px;opacity:${t(x)===t(X).name?".5":"1"}`),ze.disabled=t(x)===t(X).name,h(Ue,t(x)===t(X).name?"…":"Laden")}),k("click",ze,()=>O(t(X).name)),f(ie,ze)};F(ue,ie=>{!t(pe)&&!t(De)&&t(o)&&ie(Je)})}z((ie,ze)=>{var Ue;Dt(V,1,`li-dot ${t(je)??""}`),Pt(Be,t(pe)?"color:var(--accent)":""),h(Fe,t(X).name),h(w,`${ie??""} + ${(Ue=t(X).meta)!=null&&Ue.quant?" · "+t(X).meta.quant:""} + ${ze??""}`),Pt(Z,`white-space:nowrap;color:${t(pe)?"var(--on)":"var(--mut)"}`),h(j,t(Oe))},[()=>{var ie;return(ie=t(X).meta)!=null&&ie.ctx?Math.round(t(X).meta.ctx/1024)+"k ctx":""},()=>{var ie;return(ie=t(X).meta)!=null&&ie.size_bytes?" · "+(t(X).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),f(Te,G)}),f(M,W)},te=M=>{var W=dd(),Te=i(r(W),4);k("click",Te,()=>B("cookbook")),f(M,W)};F(Ee,M=>{t(u).length?M(P):M(te,-1)})}var y=i(U,2),L=r(y),Y=i(r(L),2),Se=i(L,2);{var Ge=M=>{var W=Zr();Xe(W,21,()=>t(b),lt,(Te,X)=>{var pe=cd(),De=r(pe),je=r(De),Oe=r(je),G=i(je,2),V=r(G);z(()=>{Ca(pe,"href",t(X).link),h(Oe,t(X).title),h(V,`${t(X).source??""}${t(X).relevant?" · für dich":""}`)}),f(Te,pe)}),f(M,W)},ve=M=>{var W=vd();f(M,W)};F(Se,M=>{t(b).length?M(Ge):M(ve,-1)})}z(M=>{h(Ie,`${t(p)??""} `),h(I,t(_)),Dt(we,1,`kpi ${t(o)?"green":"red"}`),h(ye,t(o)?"Online":"Offline"),h(rt,M),Dt(mt,1,`kpi ${t(c)?"blue":"muted"}`),h(Ft,t(c)?t(c).name:"Keins"),h(Ce,t(u).length?t(u).length+" konfiguriert":"")},[()=>{var M,W;return((W=(M=t(a))==null?void 0:M.swap_url)==null?void 0:W.replace(/^https?:\/\//,""))??"—"}]),k("click",Y,()=>B("news")),k("keydown",Y,M=>M.key==="Enter"&&B("news")),f(e,Re),$n()}qn(["click","keydown"]);var fd=g(""),hd=g('
'),gd=g('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),md=g('
kein Modell hinterlegt
leere Rolleleer '),bd=g(' '),_d=g('
'),xd=g(' '),yd=g('
API-Name:
'),kd=g('
ModellKannDetailsStatusPortAktionen
'),wd=g('
Empfohlen für deine Hardware

'),Sd=g(''),Md=g(''),Ed=g(''),Ad=g('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Cd(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",s="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",l=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=N(()=>{var A;return((A=yi.value)==null?void 0:A.models)||[]});function v(){document.dispatchEvent(new Event("mc:refresh"))}let c=$(""),u=$(""),p=$(""),_=$(!1);const C=N(()=>t(o).filter(A=>!A.incomplete));async function b(){var R;const A=t(c)||((R=t(C)[0])==null?void 0:R.name);if(!(!A||!t(u).trim())){d(_,!0),d(p,"(wecke Modell, kann beim Laden kurz dauern…)");try{const ke=await Pe("/api/chat",{method:"POST",body:JSON.stringify({model:A,message:t(u)})});d(p,ke.reply,!0)}catch(ke){d(p,"Fehler: "+ke.message)}d(_,!1),v()}}const x=300;let D=$(!1),O=$(null),E=$(8192),B=$(!1);function xe(A){var R;d(O,t(o).find(ke=>ke.name===A),!0),t(O)&&(d(E,((R=t(O).meta)==null?void 0:R.ctx)||8192,!0),d(B,(t(O).ttl??x)>=99999),d(D,!0))}async function Me(){const A=t(B)?99999:x;try{await Pe("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(E),ttl:A})}),le("Gespeichert — aktiv beim nächsten Modell-Start."),d(D,!1),v()}catch(R){le(R.message,!0)}}let Ae=$(!1),Re=$(""),ne=$(""),J=$("");function fe(A){const R=t(o).find(ke=>ke.name===A);d(Re,A,!0),d(J,(R==null?void 0:R.role)||"",!0),d(ne,""),d(Ae,!0)}async function Ie(A){try{await Pe("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Re),role:A})}),le(A?`Rolle gesetzt: ${A}`:"Rolle entfernt."),d(Ae,!1),v()}catch(R){le(R.message,!0)}}async function We(A){if(await yn({title:`„${A}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Pe("/api/unload?model="+encodeURIComponent(A),{method:"POST"}),le("Entladen: "+A),setTimeout(v,600)}catch(R){le(R.message,!0)}}async function tt(A){if(await yn({title:`„${A}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const R=await Pe("/api/delete_model",{method:"POST",body:JSON.stringify({alias:A})});le(R.note||"Gelöscht: "+A),setTimeout(v,600)}catch(R){le(R.message,!0)}}function _t(A){return A!=null&&A.length?A.map(R=>R==="Code"?'Code':R==="Bild"?'Bild':'Text').join(" "):"–"}function I(A){if(!A)return"–";const R=A.quant||"?",ke=A.ctx?Math.round(A.ctx/1024)+"K":"?",$e=A.size_bytes?(A.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${R} · ${ke} · ${$e}`}function oe(A){var R;(R=navigator.clipboard)==null||R.writeText(A),le("Kopiert: "+A)}var we=Ad(),it=i(ot(we),2),ge=i(r(it),6);Xe(ge,21,()=>t(C),lt,(A,R)=>{var ke=fd(),$e=r(ke),q={};z(()=>{h($e,t(R).name),q!==(q=t(R).name)&&(ke.value=(ke.__value=t(R).name)??"")}),f(A,ke)});var He=i(ge,4),ye=i(He,2),dt=r(ye),rt=i(ye,2);{var mt=A=>{var R=hd(),ke=r(R);z(()=>h(ke,t(p))),f(A,R)};F(rt,A=>{t(p)&&A(mt)})}var ct=i(it,2),ft=r(ct),It=i(r(ft)),Ft=r(It),Lt=i(ft,4);{var Ut=A=>{var R=gd();f(A,R)},Kt=A=>{var R=kd(),ke=i(r(R));Xe(ke,21,()=>t(o),lt,($e,q)=>{var he=Aa(),Le=ot(he);{var Ne=K=>{var U=md(),be=r(U),ce=r(be),Ce=i(be,5),Ee=r(Ce),P=i(Ee,2);z(()=>h(ce,t(q).name)),k("click",Ee,()=>{var te;le("Lade im Cookbook ein Modell und setze den Alias auf: "+t(q).name),(te=document.querySelector(".nav-item[data-view='cookbook']"))==null||te.dispatchEvent(new MouseEvent("click"))}),k("click",P,()=>tt(t(q).name)),f(K,U)},T=K=>{var U=yd(),be=r(U),ce=r(be),Ce=r(ce),Ee=i(Ce);{var P=Oe=>{var G=bd(),V=r(G);z(()=>h(V,t(q).role)),f(Oe,G)};F(Ee,Oe=>{t(q).role&&Oe(P)})}var te=i(ce,2);{var y=Oe=>{var G=_d(),V=r(G);z(()=>h(V,t(q).meta.filename)),f(Oe,G)};F(te,Oe=>{var G;(G=t(q).meta)!=null&&G.filename&&Oe(y)})}var L=i(te,2),Y=i(r(L),2);Xe(Y,17,()=>{var Oe;return(Oe=t(q).api_ids)!=null&&Oe.length?t(q).api_ids:[t(q).name]},lt,(Oe,G)=>{var V=xd(),ae=r(V);z(()=>h(ae,t(G))),k("click",V,()=>oe(t(G))),f(Oe,V)});var Se=i(be);at(Se,()=>{var Oe;return _t((Oe=t(q).meta)==null?void 0:Oe.caps)},!0);var Ge=i(Se);at(Ge,()=>I(t(q).meta),!0);var ve=i(Ge);at(ve,()=>Uo(t(q).state,t(q).download_progress),!0);var M=i(ve),W=r(M),Te=i(M),X=r(Te),pe=i(X,2),De=i(pe,2),je=i(De,2);z(()=>{h(Ce,`${t(q).name??""} `),h(W,t(q).port??"auto")}),k("click",X,()=>fe(t(q).name)),k("click",pe,()=>xe(t(q).name)),k("click",De,()=>We(t(q).name)),k("click",je,()=>tt(t(q).name)),f(K,U)};F(Le,K=>{t(q).incomplete?K(Ne):K(T,-1)})}f($e,he)}),f(A,R)};F(Lt,A=>{t(o).length?A(Kt,-1):A(Ut)})}var Nt=i(ct,2);{var qt=A=>{var R=Sd(),ke=r(R),$e=r(ke),q=i($e,4),he=r(q),Le=i(q,2),Ne=i(r(Le));at(Ne,()=>br(a));var T=i(Le,2),K=i(T,2);{var U=y=>{var L=wd(),Y=r(L),Se=i(r(Y),2),Ge=r(Se),ve=i(Ge,2),M=i(Y,2);z((W,Te)=>{h(Ge,`Optimal ~${W??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(ve,` Aktuell ~${Te??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),k("click",M,()=>d(E,t(O).meta.optimal_ctx,!0)),f(y,L)};F(K,y=>{var L;(L=t(O).meta)!=null&&L.optimal_ctx&&y(U)})}var be=i(K,4),ce=i(r(be),2),Ce=r(ce),Ee=i(Ce,2),P=r(Ee),te=i(be,2);z(()=>{h(he,t(O).name),Pt(Ee,`color:${t(B)?"var(--accent)":"var(--mut)"}`),h(P,t(B)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),k("click",R,y=>{y.target.classList.contains("modal-overlay")&&d(D,!1)}),k("click",$e,()=>d(D,!1)),rn(T,()=>t(E),y=>d(E,y)),Ko(Ce,()=>t(B),y=>d(B,y)),k("click",te,Me),f(A,R)};F(Nt,A=>{t(D)&&t(O)&&A(qt)})}var Q=i(Nt,2);{var me=A=>{var R=Ed(),ke=r(R),$e=r(ke),q=i($e,2),he=i(r(q));at(he,()=>br(s));var Le=i(q,2),Ne=r(Le),T=i(Le,4);Xe(T,21,()=>l,lt,(Ce,Ee)=>{var P=Md(),te=r(P);z(()=>{Dt(P,1,t(J)===t(Ee).id?"primary":"ghost"),Ca(P,"title",t(Ee).desc),h(te,t(Ee).label)}),k("click",P,()=>Ie(t(Ee).id)),f(Ce,P)});var K=i(T,4),U=i(K,2),be=r(U),ce=i(be,2);z(()=>h(Ne,t(Re))),k("click",R,Ce=>{Ce.target.classList.contains("modal-overlay")&&d(Ae,!1)}),k("click",$e,()=>d(Ae,!1)),rn(K,()=>t(ne),Ce=>d(ne,Ce)),k("click",be,()=>Ie("")),k("click",ce,()=>Ie(t(ne).trim().toLowerCase())),f(A,R)};F(Q,A=>{t(Ae)&&A(me)})}z(()=>{ye.disabled=t(_),h(dt,t(_)?"…":"Senden"),h(Ft,t(o).length?t(o).length+" konfiguriert":"")}),Qn(ge,()=>t(c),A=>d(c,A)),rn(He,()=>t(u),A=>d(u,A)),k("click",ye,b),f(e,we),$n()}qn(["click"]);var Td=g('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),zd=g(''),Pd=g('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),$d=g(' '),Dd=g(''),Id=g(''),Ld=g('
'),Od=g('
'),Bd=g('
'),Rd=g('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Fd(e,n){Pn(n,!0);const a=N(()=>fa.value),s=N(()=>fa.tracked),l=N(()=>$r.value);let o=Gt({cpu:[],ram:[],gpu:[]});ja(()=>{var we;if(!t(l))return;const I=t(l).gpu,oe=I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0;o.cpu=[...o.cpu,((we=t(l).cpu)==null?void 0:we.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,oe].slice(-60)});const v=N(()=>()=>{var oe;const I=(oe=t(l))==null?void 0:oe.gpu;return I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0}),c=N(()=>t(a).filter(I=>I.state!=="running"&&I.state!=="queued").length),u=N(()=>t(a).filter(I=>I.state==="failed").length);function p(I){if(I.state!=="running")return null;if(typeof I.progress=="number")return Math.min(100,I.progress);const we=((I.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return we?Math.min(100,parseFloat(we[1])):null}function _(I){return I==null||I<0?"":I>=90?`noch ~${Math.round(I/60)} min`:`noch ~${Math.max(1,Math.round(I))} s`}function C(I){return I==="done"?'fertig':I==="failed"?'fehler':I==="canceled"?'abgebrochen':'läuft…'}function b(I){return I==="done"?"on":I==="failed"||I==="canceled"?"":"load"}async function x(I){try{await Pe(`/api/jobs/${I}/cancel`,{method:"POST"}),le("Abbruch angefordert…")}catch(oe){le(oe.message,!0)}}async function D(I){try{await Pe(`/api/jobs/${I}`,{method:"DELETE"})}catch(oe){le(oe.message,!0)}}async function O(){try{const I=await Pe("/api/jobs/clear",{method:"POST"});le(`${I.removed} Einträge entfernt.`)}catch(I){le(I.message,!0)}}function E(I,oe){return I.map(we=>`
`).join("")}var B=Rd(),xe=i(ot(B),2);{var Me=I=>{const oe=N(()=>t(v)());var we=Td(),it=ot(we),ge=r(it),He=i(r(ge),2),ye=r(He),dt=i(He,2),rt=r(dt),mt=i(ge,2),ct=i(r(mt),2),ft=r(ct),It=i(ct,2),Ft=r(It),Lt=i(mt,2),Ut=i(r(Lt),2),Kt=r(Ut),Nt=i(Ut,2),qt=r(Nt),Q=i(it,2),me=i(r(Q),4),A=r(me),R=i(r(A)),ke=r(R),$e=i(A,2),q=i(r($e),2),he=r(q),Le=i($e,2),Ne=i(r(Le)),T=r(Ne),K=i(Le,2),U=i(r(K),2),be=r(U),ce=i(me,2),Ce=r(ce),Ee=i(r(Ce));at(Ee,()=>E(o.cpu,"--accent"),!0);var P=i(Ce,2),te=i(r(P));at(te,()=>E(o.ram,"--purple"),!0);var y=i(P,2),L=i(r(y));at(L,()=>E(o.gpu,"--on"),!0),z((Y,Se,Ge,ve,M,W,Te,X,pe,De,je,Oe,G)=>{h(ye,Y),h(rt,Se),h(ft,Ge),h(Ft,`${ve??""} / ${M??""}`),h(Kt,W),h(qt,Te),h(ke,`${X??""} / ${pe??""}`),h(he,De),h(T,`${je??""} % belegt`),h(be,`${Oe??""} / ${G??""}`)},[()=>{var Y;return Math.round(((Y=t(l).cpu)==null?void 0:Y.percent)??0)},()=>{var Y;return((Y=t(l).cpu)==null?void 0:Y.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>Math.round(t(oe)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>t(l).gpu?`${ca(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${ca(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var Y;return Math.round(((Y=t(l).disk)==null?void 0:Y.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var Y;return((Y=t(l).cpu)==null?void 0:Y.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),f(I,we)};F(xe,I=>{t(l)&&I(Me)})}var Ae=i(xe,2),Re=r(Ae),ne=i(r(Re),2),J=r(ne),fe=i(ne,2);{var Ie=I=>{var oe=zd();k("click",oe,O),f(I,oe)};F(fe,I=>{t(c)&&I(Ie)})}var We=i(Re,4);{var tt=I=>{var oe=Pd();f(I,oe)},_t=I=>{var oe=Aa(),we=ot(oe);Xe(we,17,()=>t(a),lt,(it,ge)=>{const He=N(()=>p(t(ge))),ye=N(()=>t(ge).state==="running"?_(t(ge).eta_s):""),dt=N(()=>t(ge).state==="running"&&t(ge).rate_bps?ca(t(ge).rate_bps)+"/s":""),rt=N(()=>[t(ye),t(dt)].filter(Boolean).join(" · ")),mt=N(()=>t(s).includes(t(ge).id));var ct=Bd(),ft=r(ct),It=r(ft),Ft=i(It,2),Lt=r(Ft),Ut=i(Ft,2);{var Kt=q=>{var he=$d(),Le=r(he);z(Ne=>h(Le,`${Ne??""} %${t(rt)?` · ${t(rt)}`:""}`),[()=>Math.round(t(He))]),f(q,he)};F(Ut,q=>{t(He)!=null&&q(Kt)})}var Nt=i(Ut,2);{var qt=q=>{var he=Dd();z(()=>Pt(he,`${t(He)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),k("click",he,Le=>{Le.stopPropagation(),x(t(ge).id)}),f(q,he)},Q=q=>{var he=Id();k("click",he,Le=>{Le.stopPropagation(),D(t(ge).id)}),f(q,he)};F(Nt,q=>{t(ge).state==="running"?q(qt):q(Q,-1)})}var me=i(Nt,2);at(me,()=>C(t(ge).state));var A=i(ft,2);{var R=q=>{var he=Ld(),Le=r(he);z(()=>Pt(Le,`width:${t(He)??""}%`)),f(q,he)};F(A,q=>{t(He)!=null&&t(ge).state==="running"&&q(R)})}var ke=i(A,2);{var $e=q=>{var he=Od(),Le=r(he);z(Ne=>h(Le,Ne),[()=>(t(ge).log||[]).join(` +`)]),f(q,he)};F(ke,q=>{t(mt)&&q($e)})}z(q=>{Dt(It,1,`li-dot ${q??""}`),h(Lt,t(ge).label)},[()=>b(t(ge).state)]),k("click",ft,()=>fa.toggle(t(ge).id)),k("keydown",ft,q=>q.key==="Enter"&&fa.toggle(t(ge).id)),f(it,ct)}),f(I,oe)};F(We,I=>{t(a).length?I(_t,-1):I(tt)})}z(()=>h(J,t(a).length?t(u)?t(u)+" Fehler":t(a).length+" gesamt":"")),f(e,B),$n()}qn(["click","keydown"]);var Kd=g(' '),Nd=g(''),qd=g('✓ fertig'),Vd=g('✗ fehlgeschlagen'),Wd=g('abgebrochen'),Gd=g('läuft…'),jd=g('
'),Ud=g('

Aktueller Vorgang

'),Hd=g('

Server & Wartung

Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Jd(e,n){Pn(n,!0);const a=N(()=>yi.value),s=N(()=>fa.value);let l=null,o=$(`Verbinde… +`),v=$("llama-swap"),c,u=$(null),p=$("");const _=new Set,C=N(()=>t(u)?t(s).find(P=>P.id===t(u)):null);ja(()=>{if(!t(C))return;const P=t(C),te=P.state==="done",y=P.state==="failed",L=P.state==="canceled";(te||y||L)&&!_.has(P.id)&&(_.add(P.id),le(te?`✓ ${t(p)} abgeschlossen.`:L?`${t(p)} abgebrochen.`:`✗ ${t(p)} fehlgeschlagen.`,y),te&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function b(P,te){d(u,P,!0),d(p,te,!0),fa.track(P)}xi(()=>{x()}),qo(()=>{l==null||l.close()});function x(){l==null||l.close();const P=t(v);d(o,`Verbinde mit ${P}… +`);const te=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${te}//${location.host}/api/logs/${P}?token=${encodeURIComponent(al())}`),l.onmessage=y=>{d(o,t(o)+y.data),c&&(c.scrollTop=c.scrollHeight)},l.onclose=()=>{d(o,t(o)+` +— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function D(P,te,y){if(await yn({title:te,body:y,confirmLabel:"Neustarten"}))try{await Pe(`/api/service/${P}/restart`,{method:"POST"}),le("Neustart ausgelöst: "+P),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(L){le(L.message,!0)}}async function O(){if(await yn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const P=await Pe("/api/self-update",{method:"POST"});le("Update läuft — Dashboard startet gleich neu."),b(P.job_id,"Mission Control Update")}catch(P){le(P.message,!0)}}async function E(){if(!await yn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))return;const P=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(P!==null)try{const te=await Pe("/api/update",{method:"POST",body:JSON.stringify({password:P})});le("LLM-Engine-Update läuft."),b(te.job_id,"LLM-Engine-Update")}catch(te){le(te.message,!0)}}async function B(){if(await yn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await Pe("/api/unload",{method:"POST"}),le("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(P){le(P.message,!0)}}async function xe(){if(!await yn({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const P=await er({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(P)try{const te=await Pe("/api/os-update",{method:"POST",body:JSON.stringify({password:P})});le("OS-Update gestartet."),b(te.job_id,"OS-Update")}catch(te){le(te.message,!0)}}async function Me(){if(!await yn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const P=await er({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(P)try{await Pe("/api/reboot",{method:"POST",body:JSON.stringify({password:P})}),le("Reboot ausgelöst — bis gleich.")}catch(te){le(te.message,!0)}}async function Ae(){d(Re,"prüfe…");try{const P=await Pe("/api/integration/test");d(Re,P.ok?`✓ Engine antwortet — ${P.models.length} Modell(e): ${P.models.join(", ")}`:`✗ keine Verbindung: ${P.error}`,!0),d(ne,P.ok,!0)}catch(P){d(Re,"✗ "+P.message),d(ne,!1)}}let Re=$(""),ne=$(!1);const J=N(()=>{var P;return((P=t(a))==null?void 0:P.models)||[]}),fe=["running","ready","loading","starting"],Ie=N(()=>t(J).find(P=>fe.includes(P.state)));function We(P){if(!P||P.state!=="running")return null;if(typeof P.progress=="number")return Math.min(100,P.progress);const y=((P.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return y?Math.min(100,parseFloat(y[1])):null}var tt=Hd(),_t=i(ot(tt),2),I=r(_t),oe=i(r(I),2),we=r(oe),it=i(I,4),ge=r(it),He=i(r(ge)),ye=r(He),dt=i(ge,2),rt=i(r(dt),2),mt=r(rt),ct=i(dt,2),ft=i(r(ct),2),It=r(ft),Ft=i(it,2),Lt=r(Ft),Ut=i(Lt,2);{var Kt=P=>{var te=Kd(),y=r(te);z(()=>{Pt(te,`color:${t(ne)?"#7ee29a":"#ff9b95"}`),h(y,t(Re))}),f(P,te)};F(Ut,P=>{t(Re)&&P(Kt)})}var Nt=i(_t,2),qt=i(r(Nt),4),Q=i(qt,2),me=i(Q,2),A=i(me,2),R=i(A,2),ke=i(Nt,2),$e=i(r(ke),4),q=i($e,2),he=i(ke,2);{var Le=P=>{const te=N(()=>t(C)),y=N(()=>t(te).state==="done"),L=N(()=>t(te).state==="failed"),Y=N(()=>t(te).state==="canceled"),Se=N(()=>t(y)||t(L)||t(Y)),Ge=N(()=>We(t(te)));var ve=Ud(),M=r(ve),W=i(r(M),2);{var Te=H=>{var se=Nd();k("click",se,async()=>{await yn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Pe(`/api/jobs/${t(te).id}/cancel`,{method:"POST"})}),f(H,se)};F(W,H=>{t(Se)||H(Te)})}var X=i(W,2),pe=r(X);{var De=H=>{var se=qd();f(H,se)},je=H=>{var se=Vd();f(H,se)},Oe=H=>{var se=Wd();f(H,se)},G=H=>{var se=Gd();f(H,se)};F(pe,H=>{t(y)?H(De):t(L)?H(je,1):t(Y)?H(Oe,2):H(G,-1)})}var V=i(M,2),ae=r(V),re=i(V,2);{var Be=H=>{var se=jd(),vt=r(se);z(()=>Pt(vt,`width:${t(Ge)??""}%`)),f(H,se)};F(re,H=>{t(Ge)!=null&&!t(Se)&&H(Be)})}var Fe=i(re,2),de=r(Fe);z(H=>{h(ae,`${t(p)??""}${t(Se)?t(y)?" — erfolgreich.":t(Y)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(de,H)},[()=>(t(te).log||[]).join(` +`)]),f(P,ve)};F(he,P=>{t(C)&&P(Le)})}var Ne=i(he,2),T=r(Ne),K=i(r(T),2),U=r(K);U.value=U.__value="llama-swap";var be=i(U);be.value=be.__value="mission-control";var ce=i(be);ce.value=ce.__value="system";var Ce=i(T,4),Ee=r(Ce);No(Ce,P=>c=P,()=>c),z(P=>{var te,y,L;Pt(oe,`margin-left:auto;${(te=t(a))!=null&&te.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),h(we,(y=t(a))!=null&&y.swap_ok?"● erreichbar":"● offline"),h(ye,(((L=t(a))==null?void 0:L.swap_url)||"—")+"/v1"),h(mt,t(Ie)?t(Ie).name+` (${t(Ie).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(It,P),h(Ee,t(o))},[()=>t(J).filter(P=>!P.incomplete).length||"keine"]),k("click",Lt,Ae),k("click",qt,()=>D("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),k("click",Q,()=>D("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),k("click",me,O),k("click",A,E),k("click",R,B),k("click",$e,xe),k("click",q,Me),k("change",K,x),Qn(K,()=>t(v),P=>d(v,P)),f(e,tt),$n()}qn(["click","change"]);var Qd=g('
Lade Setups…
'),Zd=g(' ×',1),tr=g('
★ Beste Wahl für dein System
'),Yd=g('
Dein Setup
'),Xd=g(''),ec=g('
'),tc=g('· ⚠ Cache veraltet'),nc=g(" ",1),ac=g('
Frage Quellen ab…
'),ic=g('
'),rc=g('✓ installiert'),sc=g(''),lc=g('

'),oc=g('

'),dc=g(''),cc=g('

'),vc=g('
'),uc=g('
'),pc=g('
'),fc=g(" "),hc=g('
'),gc=g('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),mc=g('Alternative: — passt auf dein System.',1),bc=g('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),_c=g(''),xc=g('
Lade Dateien von HuggingFace…
'),Yr=g(""),yc=g('
Empfohlener Kontext für deine Hardware: übernehmen
'),kc=g('
Ressourcen-Check
'),wc=g('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),Sc=g('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Mc=g('
',1),Ec=g('
Keine GGUF-Dateien im Repo gefunden.
'),Ac=g(''),Cc=g('
'),Tc=g(''),zc=g('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function Pc(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",l={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},v=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(S){const w=(S||"").toLowerCase();for(const ee of v)if(ee.kw.some(Z=>w.includes(Z)))return ee.label;return"Allrounder"}function u(S=""){const w=S.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(w)||new RegExp("(?{Ft(),Lt()});async function Ft(){d(O,!0);try{const S=await Pe("/api/cookbook/recipes");d(x,S.recipes||[],!0),d(D,S.recommended_id||null,!0)}catch(S){le(S.message,!0)}d(O,!1)}async function Lt(S=!1){d(B,!0);try{const w=await Pe("/api/cookbook/discover"+(S?"?force=true":""));d(E,w,!0),d(xe,w.stale,!0)}catch(w){le("Empfehlungen nicht ladbar: "+w.message,!0)}d(B,!1)}function Ut(S){S=S.trim();const w=S.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return w?w[1]:/^[\w.-]+\/[\w.-]+$/.test(S)?S:null}async function Kt(){const S=t(Me).trim(),w=Ut(S);let ee=S;if(t(ne)&&!w&&(ee=ee?ee+" "+t(ne):t(ne)),!ee&&!w){d(Ae,[],!0);return}d(Re,!0),d(fe,[],!0),d(Ie,-1);try{if(w)d(Ae,[{id:w,author:w.split("/")[0],downloads:0}],!0);else{const Z=`https://huggingface.co/api/models?search=${encodeURIComponent(ee)}&filter=gguf&sort=${encodeURIComponent(t(J))}&direction=-1&limit=40`,j=await fetch(Z);d(Ae,await j.json(),!0)}t(Ae).forEach((Z,j)=>Nt(j,Z.id))}catch(Z){le(Z.message,!0),d(Ae,[],!0)}d(Re,!1)}async function Nt(S,w){var ee;try{const Z=await Pe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})});if(!((ee=Z.files)!=null&&ee.length)){t(fe)[S]=null,qt();return}const j=Z.files.find(ue=>{var Je;return(Je=ue.quant)==null?void 0:Je.includes("Q4_K_M")})||Z.files[0];t(fe)[S]=j.fit.level,qt()}catch{t(fe)[S]=null,qt()}}function qt(){let S=-1,w=99;t(fe).forEach((ee,Z)=>{if(ee==null)return;const j=l[ee]??99;j=0&&w<=1?S:-1,!0)}function Q(S){d(We,t(x).find(w=>w.id===S),!0)}async function me(S){const w=document.getElementById("cb-r-install-btn");w&&(w.disabled=!0,w.textContent="Starte…");try{const ee=await Pe("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:S,hf_token:ci()})});le(`${ee.count} Download${ee.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),d(We,null),It("activity")}catch(ee){le(ee.message,!0),w&&(w.disabled=!1,w.textContent="Installieren")}}async function A(S,w){var ee,Z;d(tt,!0),d(_t,w,!0),d(I,S,!0),d(it,""),d(ge,8192),d(oe,null),d(ye,null),d(we,""),d(He,!0);try{if(d(oe,await Pe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:S,ctx:8192})}),!0),(Z=(ee=t(oe))==null?void 0:ee.files)!=null&&Z.length){const j=t(oe).files.find(ue=>{var Je;return(Je=ue.quant)==null?void 0:Je.includes("Q4_K_M")})||t(oe).files[0];d(we,j.filename,!0),j.optimal_ctx&&t(ge)===8192&&d(ge,j.optimal_ctx,!0),R()}}catch(j){le(j.message,!0)}d(He,!1)}function R(){var S,w,ee;!((w=(S=t(oe))==null?void 0:S.files)!=null&&w.length)||!t(we)||(d(ye,t(oe).files.find(Z=>Z.filename===t(we))||null,!0),(ee=t(ye))!=null&&ee.optimal_ctx&&t(ge)===8192&&d(ge,t(ye).optimal_ctx,!0))}async function ke(){var S,w;if(!t(I)||!t(we))return le("Bitte eine GGUF-Datei wählen.",!0);d(He,!0);try{const ee=((S=t(oe))==null?void 0:S.params_b)??7,Z=((w=t(ye))==null?void 0:w.quant)??"Q4_K_M";await Pe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(I),role:t(it),params_b:ee,quant:Z,file:t(we),ctx:t(ge),hf_token:ci()})}),le("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),d(tt,!1),It("activity")}catch(ee){le("Fehler: "+ee.message,!0)}d(He,!1)}async function $e(S,w,ee,Z){Z.disabled=!0,Z.textContent="Starte…";try{await Pe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:S,role:w,params_b:ee,quant:"Q4_K_M",hf_token:ci()})}),le("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),It("activity")}catch(j){le(j.message,!0),Z.disabled=!1,Z.textContent="Installieren"}}function q(){d(ft,null),d(rt,""),d(mt,""),d(ct,[{repo:"",role:"",quant:"Q4_K_M"}],!0),d(dt,!0)}function he(S){const w=t(x).find(ee=>ee.id===S);w&&(d(ft,S,!0),d(rt,w.title,!0),d(mt,w.desc||"",!0),d(ct,w.models.map(ee=>({repo:ee.repo,role:ee.role,quant:ee.quant||"Q4_K_M"})),!0),d(dt,!0))}async function Le(){if(!t(rt).trim())return le("Bitte einen Titel angeben.",!0);const S=t(ct).filter(w=>w.repo.trim());if(!S.length)return le("Mindestens ein Modell (Repo) angeben.",!0);try{t(ft)?(await Pe("/api/cookbook/user-recipe/"+encodeURIComponent(t(ft)),{method:"PUT",body:JSON.stringify({title:t(rt),desc:t(mt),models:S})}),le("Setup aktualisiert.")):(await Pe("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(rt),desc:t(mt),models:S})}),le("Setup gespeichert.")),d(dt,!1),Ft()}catch(w){le(w.message,!0)}}async function Ne(S){const w=t(x).find(ee=>ee.id===S);if(await yn({title:`„${(w==null?void 0:w.title)||S}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Pe("/api/cookbook/user-recipe/"+encodeURIComponent(S),{method:"DELETE"}),le("Setup gelöscht."),Ft()}catch(ee){le(ee.message,!0)}}function T(S){if(!u(S))return"";const w=p(S);return`MoE${w?` · ~${w}B aktiv`:""}`}function K(S){return S?`${Fn(S)}`:""}var U=zc(),be=i(ot(U),2),ce=r(be),Ce=i(r(ce),2),Ee=i(ce,4);{var P=S=>{var w=Qd();f(S,w)},te=S=>{var w=ec();Xe(w,21,()=>t(x),lt,(ee,Z)=>{const j=N(()=>t(Z).id===t(D));var ue=Xd(),Je=r(ue);{var ie=qe=>{var Et=Zd(),Yt=ot(Et),Vt=i(Yt,2);k("click",Yt,Ot=>{Ot.stopPropagation(),he(t(Z).id)}),k("keydown",Yt,Ot=>{Ot.key==="Enter"&&(Ot.stopPropagation(),he(t(Z).id))}),k("click",Vt,Ot=>{Ot.stopPropagation(),Ne(t(Z).id)}),k("keydown",Vt,Ot=>{Ot.key==="Enter"&&(Ot.stopPropagation(),Ne(t(Z).id))}),f(qe,Et)};F(Je,qe=>{t(Z).user&&qe(ie)})}var ze=i(Je,2);{var Ue=qe=>{var Et=tr();f(qe,Et)},ut=qe=>{var Et=Yd();f(qe,Et)};F(ze,qe=>{t(j)?qe(Ue):t(Z).user&&qe(ut,1)})}var Ze=i(ze,2),nt=r(Ze),gt=r(nt),Ct=r(gt),Zt=i(nt,2),xt=r(Zt),Qe=i(Ze,2),st=r(Qe),Mt=i(Qe,2),bt=r(Mt);z((qe,Et)=>{Dt(ue,1,`card-btn${t(j)?" cb-best":""}`),h(Ct,t(Z).title),Dt(Zt,1,`fit-badge ${qe??""}`),h(xt,Et),h(st,t(Z).desc),h(bt,`${t(Z).models.length??""} Modell${t(Z).models.length>1?"e":""} im Setup`)},[()=>_(t(Z).fit_level),()=>C(t(Z).fit_level)]),k("click",ue,()=>Q(t(Z).id)),f(ee,ue)}),f(S,w)};F(Ee,S=>{t(O)?S(P):S(te,-1)})}var y=i(be,2),L=r(y),Y=i(r(L),2),Se=r(Y);{var Ge=S=>{const w=N(()=>Math.round((Date.now()/1e3-t(E).updated)/60));var ee=nc(),Z=ot(ee);{var j=Ue=>{var ut=oi();z(()=>h(ut,`Quellen befragt vor ${t(w)??""} min`)),f(Ue,ut)},ue=Ue=>{var ut=oi();z(Ze=>h(ut,`Quellen befragt vor ${Ze??""} h`),[()=>Math.round(t(w)/60)]),f(Ue,ut)},Je=Ue=>{var ut=oi();z(Ze=>h(ut,`Quellen befragt vor ${Ze??""} Tg.`),[()=>Math.round(t(w)/1440)]),f(Ue,ut)};F(Z,Ue=>{t(w)<60?Ue(j):t(w)<1440?Ue(ue,1):Ue(Je,-1)})}var ie=i(Z,2);{var ze=Ue=>{var ut=tc();f(Ue,ut)};F(ie,Ue=>{t(xe)&&Ue(ze)})}f(S,ee)};F(Se,S=>{var w;(w=t(E))!=null&&w.updated&&S(Ge)})}var ve=i(Y,2),M=r(ve),W=i(L,4);{var Te=S=>{var w=ac();f(S,w)},X=S=>{var w=Aa(),ee=ot(w);Xe(ee,17,()=>t(E).categories,lt,(Z,j)=>{var ue=oc(),Je=r(ue),ie=r(Je),ze=r(ie),Ue=i(Je,2);Xe(Ue,21,()=>t(j).models,lt,(ut,Ze)=>{const nt=N(()=>t(j).recommended&&t(Ze).repo===t(j).recommended);var gt=lc(),Ct=r(gt);{var Zt=At=>{var zt=tr();f(At,zt)};F(Ct,At=>{t(nt)&&At(Zt)})}var xt=i(Ct,2),Qe=r(xt),st=r(Qe),Mt=r(st),bt=i(st,2),qe=r(bt),Et=i(Qe,2),Yt=r(Et),Vt=i(xt,2),Ot=r(Vt);at(Ot,()=>K(o[t(Ze).role]||c(t(Ze).repo)));var Wn=i(Ot,2);at(Wn,()=>T(t(Ze).repo));var Xn=i(Vt,2),Dn=r(Xn),Ta=i(Xn,2);Xe(Ta,17,()=>t(Ze).requirements||[],lt,(At,zt)=>{var jt=ic(),In=r(jt);z(()=>h(In,`⚠ ${t(zt)??""}`)),f(At,jt)});var $t=i(Ta,4),yt=r($t);{var Tt=At=>{var zt=rc();z(()=>Ca(zt,"title",`bereits eingerichtet als ${t(Ze).installed??""}`)),f(At,zt)},Bt=At=>{var zt=sc();k("click",zt,jt=>$e(t(Ze).repo,t(Ze).role,t(Ze).params_b,jt.currentTarget)),f(At,zt)};F(yt,At=>{t(Ze).installed?At(Tt):At(Bt,-1)})}z((At,zt,jt)=>{Dt(gt,1,`card${t(nt)?" res-best":""}`),h(Mt,t(Ze).name),h(qe,`${t(Ze).author??""} · ${t(Ze).params_b??""}B`),Dt(Et,1,`fit-badge ${At??""}`),h(Yt,t(Ze).fit.text),h(Dn,`${zt??""} · ⬇ ${jt??""}`)},[()=>_(t(Ze).fit.level),()=>b(t(Ze).fit),()=>(t(Ze).downloads||0).toLocaleString()]),f(ut,gt)}),z(()=>h(ze,t(j).title)),f(Z,ue)}),f(S,w)};F(W,S=>{var w;t(B)&&!t(E)?S(Te):(w=t(E))!=null&&w.categories&&S(X,1)})}var pe=i(y,2),De=i(r(pe),4),je=r(De),Oe=i(je,2),G=r(Oe);G.value=G.__value="downloads";var V=i(G);V.value=V.__value="trending";var ae=i(V);ae.value=ae.__value="created_at";var re=i(Oe,2),Be=r(re),Fe=i(De,2);Xe(Fe,20,()=>["","coder","vision","reasoning","chat","agent"],lt,(S,w)=>{var ee=dc(),Z=r(ee);z(()=>{Dt(ee,1,t(ne)===w?"primary":"ghost"),h(Z,w||"Alle")}),k("click",ee,()=>{d(ne,w,!0),Kt()}),f(S,ee)});var de=i(Fe,2);{var H=S=>{var w=vc();Xe(w,21,()=>t(Ae),lt,(ee,Z,j)=>{var ue=cc(),Je=r(ue);{var ie=Vt=>{var Ot=tr();f(Vt,Ot)};F(Je,Vt=>{j===t(Ie)&&Vt(ie)})}var ze=i(Je,2),Ue=r(ze),ut=r(Ue),Ze=r(ut),nt=i(ut,2),gt=r(nt),Ct=i(Ue,2),Zt=r(Ct),xt=i(ze,2),Qe=r(xt);at(Qe,()=>K(c(t(Z).id)));var st=i(Qe,2);at(st,()=>T(t(Z).id));var Mt=i(xt,4),bt=r(Mt),qe=r(bt),Et=i(bt,2),Yt=r(Et);z((Vt,Ot,Wn,Xn,Dn)=>{Dt(ue,1,`card${j===t(Ie)?" res-best":""}`),h(Ze,Vt),h(gt,t(Z).author||""),Dt(Ct,1,`fit-badge ${Ot??""}`),h(Zt,Wn),h(qe,Xn),h(Yt,`⬇ ${Dn??""}`)},[()=>t(Z).id.split("/").pop(),()=>t(fe)[j]?_(t(fe)[j]):"warn",()=>t(fe)[j]?C(t(fe)[j]):"prüfe…",()=>t(fe)[j]?b({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(Z).downloads||0).toLocaleString()]),k("click",ue,()=>A(t(Z).id,t(Z).id.split("/").pop())),f(ee,ue)}),f(S,w)};F(de,S=>{t(Ae).length&&S(H)})}var se=i(pe,2);{var vt=S=>{const w=N(()=>t(We));var ee=_c(),Z=r(ee),j=r(Z),ue=i(j,2),Je=r(ue),ie=i(ue,2),ze=r(ie),Ue=i(ie,2);Xe(Ue,21,()=>t(w).models,lt,(xt,Qe)=>{var st=hc(),Mt=r(st),bt=r(Mt),qe=r(bt),Et=r(qe),Yt=i(qe,2),Vt=r(Yt),Ot=i(Yt,2);at(Ot,()=>T(t(Qe).repo));var Wn=i(bt,2);{var Xn=Tt=>{var Bt=uc(),At=r(Bt);z(()=>h(At,t(Qe).why)),f(Tt,Bt)};F(Wn,Tt=>{t(Qe).why&&Tt(Xn)})}var Dn=i(Wn,2);{var Ta=Tt=>{var Bt=pc(),At=r(Bt);z((zt,jt,In)=>h(At,`~${zt??""} GB · ~${jt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(Qe).fit.req_gb??0).toFixed(1),()=>Math.round(t(Qe).fit.tps??0),()=>Math.round((t(Qe).optimal_ctx||8192)/1024)]),f(Tt,Bt)};F(Dn,Tt=>{t(Qe).fit&&Tt(Ta)})}var $t=i(Mt,2);{var yt=Tt=>{var Bt=fc(),At=r(Bt);z(zt=>{Dt(Bt,1,`fit-badge ${zt??""}`),h(At,t(Qe).fit.text)},[()=>_(t(Qe).fit.level)]),f(Tt,Bt)};F($t,Tt=>{t(Qe).fit&&Tt(yt)})}z(()=>{h(Et,t(Qe).name),h(Vt,t(Qe).role)}),f(xt,st)});var ut=i(Ue,2);{var Ze=xt=>{const Qe=N(()=>Math.max(...t(w).models.map(qe=>{var Et;return((Et=qe.fit)==null?void 0:Et.req_gb)??0})));var st=gc(),Mt=i(r(st)),bt=r(Mt);z(qe=>h(bt,`~${qe??""} GB`),[()=>t(Qe).toFixed(1)]),f(xt,st)};F(ut,xt=>{t(w).models.length&&t(w).models[0].fit&&xt(Ze)})}var nt=i(ut,2);{var gt=xt=>{const Qe=N(()=>t(x).find(qe=>!qe.user&&qe.fit_level!=="too_tight"&&qe.id!==t(w).id));var st=bc(),Mt=i(r(st));{var bt=qe=>{var Et=mc(),Yt=i(ot(Et)),Vt=r(Yt);z(()=>h(Vt,`„${t(Qe).title??""}" ansehen`)),k("click",Yt,Ot=>{Ot.preventDefault(),d(We,null),setTimeout(()=>Q(t(Qe).id),50)}),f(qe,Et)};F(Mt,qe=>{t(Qe)&&qe(bt)})}f(xt,st)};F(nt,xt=>{t(w).fit_level==="too_tight"&&xt(gt)})}var Ct=i(nt,2),Zt=r(Ct);z(()=>{h(Je,t(w).title),h(ze,t(w).desc),Dt(Ct,1,`primary${t(w).fit_level==="too_tight"?" warn":""}`),h(Zt,t(w).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),k("click",ee,xt=>{xt.target.classList.contains("modal-overlay")&&d(We,null)}),k("click",j,()=>d(We,null)),k("click",Ct,()=>me(t(w).id)),f(S,ee)};F(se,S=>{t(We)&&S(vt)})}var ht=i(se,2);{var St=S=>{var w=Ac(),ee=r(w),Z=r(ee),j=i(Z,2),ue=r(j),Je=i(j,2),ie=r(Je),ze=i(Je,2);{var Ue=nt=>{var gt=xc();f(nt,gt)},ut=nt=>{var gt=Mc(),Ct=i(ot(gt),2);Xe(Ct,21,()=>t(oe).files,lt,($t,yt)=>{const Tt=N(()=>t(yt).fit.level==="perfect"?"●":t(yt).fit.level==="marginal"?"◐":"○");var Bt=Yr(),At=r(Bt),zt={};z(()=>{h(At,`${t(Tt)??""} ${t(yt).filename??""}`),zt!==(zt=t(yt).filename)&&(Bt.value=(Bt.__value=t(yt).filename)??"")}),f($t,Bt)});var Zt=i(Ct,2),xt=r(Zt),Qe=i(r(xt),2),st=i(xt,2),Mt=r(st),bt=i(r(Mt));at(bt,()=>br(a));var qe=i(Mt,2),Et=i(Zt,2);{var Yt=$t=>{var yt=yc(),Tt=i(r(yt)),Bt=r(Tt),At=i(Tt,2);z(zt=>h(Bt,`~${zt??""}k`),[()=>Math.round(t(ye).optimal_ctx/1024)]),k("click",At,zt=>{zt.preventDefault(),d(ge,t(ye).optimal_ctx,!0)}),f($t,yt)};F(Et,$t=>{var yt;(yt=t(ye))!=null&&yt.optimal_ctx&&$t(Yt)})}var Vt=i(Et,2);{var Ot=$t=>{var yt=kc(),Tt=r(yt),Bt=i(r(Tt),2),At=r(Bt),zt=i(Tt,2),jt=r(zt);z((In,ki,Gi)=>{h(At,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(ye).quant||"GGUF")??""}`),Dt(zt,1,`fit-badge ${Gi??""}`),h(jt,t(ye).fit.text)},[()=>(t(ye).fit.req_gb??0).toFixed(1),()=>Math.round(t(ye).fit.tps??0),()=>_(t(ye).fit.level)]),f($t,yt)};F(Vt,$t=>{t(ye)&&$t(Ot)})}var Wn=i(Vt,2);{var Xn=$t=>{const yt=N(()=>t(oe).files.find(jt=>jt.fit.level!=="too_tight"&&jt.filename!==t(we)));var Tt=Aa(),Bt=ot(Tt);{var At=jt=>{var In=wc(),ki=i(r(In)),Gi=r(ki);z(ji=>h(Gi,`${t(yt).filename??""} (${ji??""})`),[()=>C(t(yt).fit.level)]),k("click",ki,ji=>{ji.preventDefault(),d(we,t(yt).filename,!0),R()}),f(jt,In)},zt=jt=>{var In=Sc();f(jt,In)};F(Bt,jt=>{t(yt)?jt(At):jt(zt,-1)})}f($t,Tt)};F(Wn,$t=>{var yt,Tt;((yt=t(ye))==null?void 0:yt.fit.level)==="too_tight"&&((Tt=t(oe))!=null&&Tt.files)&&$t(Xn)})}var Dn=i(Wn,2),Ta=r(Dn);z(()=>{var $t,yt;Dt(Dn,1,`primary${(($t=t(ye))==null?void 0:$t.fit.level)==="too_tight"?" warn":""}`),Dn.disabled=t(He),h(Ta,t(He)?"Starte…":((yt=t(ye))==null?void 0:yt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),k("change",Ct,R),Qn(Ct,()=>t(we),$t=>d(we,$t)),rn(Qe,()=>t(it),$t=>d(it,$t)),rn(qe,()=>t(ge),$t=>d(ge,$t)),k("click",Dn,ke),f(nt,gt)},Ze=nt=>{var gt=Ec();f(nt,gt)};F(ze,nt=>{var gt,Ct;t(He)&&!t(oe)?nt(Ue):(Ct=(gt=t(oe))==null?void 0:gt.files)!=null&&Ct.length?nt(ut,1):t(He)||nt(Ze,2)})}z(()=>{h(ue,t(_t)),h(ie,t(I))}),k("click",w,nt=>{nt.target.classList.contains("modal-overlay")&&d(tt,!1)}),k("click",Z,()=>d(tt,!1)),f(S,w)};F(ht,S=>{t(tt)&&S(St)})}var ln=i(ht,2);{var Vn=S=>{var w=Tc(),ee=r(w),Z=r(ee),j=i(Z,2),ue=r(j),Je=i(j,6),ie=i(Je,4),ze=i(ie,4);Xe(ze,17,()=>t(ct),lt,(nt,gt,Ct)=>{var Zt=Cc(),xt=r(Zt),Qe=i(xt,2),st=i(Qe,2);Xe(st,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],lt,(bt,qe)=>{var Et=Yr(),Yt=r(Et),Vt={};z(()=>{h(Yt,qe),Vt!==(Vt=qe)&&(Et.__value=qe)}),f(bt,Et)});var Mt=i(st,2);rn(xt,()=>t(gt).repo,bt=>t(gt).repo=bt),rn(Qe,()=>t(gt).role,bt=>t(gt).role=bt),Qn(st,()=>t(gt).quant,bt=>t(gt).quant=bt),k("click",Mt,()=>d(ct,t(ct).filter((bt,qe)=>qe!==Ct),!0)),f(nt,Zt)});var Ue=i(ze,2),ut=i(Ue,4),Ze=r(ut);z(()=>{h(ue,t(ft)?"Setup bearbeiten":"Eigenes Setup erstellen"),h(Ze,t(ft)?"Änderungen speichern":"Setup speichern")}),k("click",w,nt=>{nt.target.classList.contains("modal-overlay")&&d(dt,!1)}),k("click",Z,()=>d(dt,!1)),rn(Je,()=>t(rt),nt=>d(rt,nt)),rn(ie,()=>t(mt),nt=>d(mt,nt)),k("click",Ue,()=>d(ct,[...t(ct),{repo:"",role:"",quant:"Q4_K_M"}],!0)),k("click",ut,Le),f(S,w)};F(ln,S=>{t(dt)&&S(Vn)})}z(()=>{ve.disabled=t(B),h(M,t(B)?"Suche…":"Aktualisieren"),re.disabled=t(Re),h(Be,t(Re)?"Lade…":"Suchen")}),k("click",Ce,q),k("click",ve,()=>Lt(!0)),k("keydown",je,S=>S.key==="Enter"&&Kt()),rn(je,()=>t(Me),S=>d(Me,S)),Qn(Oe,()=>t(J),S=>d(J,S)),k("click",re,Kt),f(e,U),$n()}qn(["click","keydown","change"]);var $c=g(`
Du öffnest Mission Control über einen Proxy/Namen. Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame. + Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
`),Dc=g(' '),Ic=g('
'),Lc=g(' '),Oc=g(''),Xr=g(''),Bc=g('

Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.

Jan AI öffnen → linke Leiste → Remote-Modelle+ Modell hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
',1),Rc=g('

Datei anlegen oder öffnen: ~/.continue/config.json

Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.

Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.

Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
',1),Fc=g('

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Kc=g('

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).

Danach im Agent-Panel das Modell auswählen.
Zed herunterladen: zed.dev — kostenlos, native Performance, Windows/macOS/Linux.
',1),Nc=g('

Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):

Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc

Den "providers"-Block in die bestehende opencode.jsonc einfügen (nicht die ganze Datei ersetzen). Falls bereits ein "llama-swap"-Eintrag existiert: vorher löschen.

Danach in OpenCode /models wählen.

OpenCode Desktop: opencode.ai
',1),qc=g('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
Cline für VS Code: VS Code Marketplace · für JetBrains: JetBrains Marketplace
',1),Vc=g('

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

',1),Wc=g('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Gc=g('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?
Chat
Coding-Assistenten

4 · Config-Snippet

',1),jc=g('

2 · Erst ein Modell installieren

Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),Uc=g(''),Hc=g('

In Cline: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.

In Claude Code: Block in ~/.claude/settings.json unter "mcpServers" einfügen.

Einmalig auf dem Windows-PC: pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).
',1),Jc=g('

Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.

Einmalig: pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.
',1),Qc=g('

Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad /opt/mission-control/mcp_memory.py ist bereits korrekt — kein weiteres Setup nötig.

'),Zc=g(`

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

Gedächtnis-MCP

Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen + über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Yc(e,n){Pn(n,!0);const a=N(()=>yi.value),s=N(()=>{var T;return(((T=t(a))==null?void 0:T.models)||[]).filter(K=>!K.incomplete)});let l=$("zed"),o=$(Gt([])),v=$(""),c=$(!1),u=$("cline"),p=$(Gt(localStorage.getItem("mc_ip_override")||""));function _(T){return/^\d{1,3}(\.\d{1,3}){3}$/.test(T)}function C(){return location.protocol==="https:"||!_(location.hostname)}function b(){return`http://${t(p).trim()||location.hostname}:8080/v1`}const x=N(b);function D(){const T=t(p).trim();T?localStorage.setItem("mc_ip_override",T):localStorage.removeItem("mc_ip_override")}const O=N(()=>Ie(t(u))),E=N(()=>t(o).length?t(o):t(s).map(T=>T.name)),B=N(()=>t(E)[0]||"coder"),xe=N(()=>{var T;return(T=t(s).find(K=>{var U,be;return(be=(U=K.meta)==null?void 0:U.caps)==null?void 0:be.includes("Bild")}))==null?void 0:T.name});function Me(T,K){const be=(K.length?t(s).filter(ce=>K.includes(ce.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ce=>{var P,te;const Ce=(((P=ce.meta)==null?void 0:P.caps)||[]).some(y=>/Bild|Vision/i.test(y)),Ee=((te=ce.meta)==null?void 0:te.ctx)||131072;return` { "name": "${ce.name}", "display_name": "${ce.name}", "max_tokens": ${Ee}${Ce?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${x}", + "api_url": "${T}", "available_models": [ -${j} +${be} ] } } -}`}function ke(x,P){const j=(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>{var me;const fe=((me=H.meta)==null?void 0:me.ctx)||131072;return` "${H.name}": { "name": "${H.name}", "contextWindowSize": ${fe} }`}).join(`, +}`}function Ae(T,K){const be=(K.length?t(s).filter(ce=>K.includes(ce.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ce=>{var Ee;const Ce=((Ee=ce.meta)==null?void 0:Ee.ctx)||131072;return` "${ce.name}": { "name": "${ce.name}", "contextWindowSize": ${Ce} }`}).join(`, `);return`"providers": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${x}", + "baseURL": "${T}", "apiKey": "local" }, "models": { -${j} +${be} } } -}`}function Ie(x,P){return`{ +}`}function Re(T,K){return`{ "models": [ -${(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>` { - "title": "llama-swap / ${H.name}", +${(K.length?t(s).filter(ce=>K.includes(ce.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ce=>` { + "title": "llama-swap / ${ce.name}", "provider": "openai", - "model": "${H.name}", - "apiBase": "${x}", + "model": "${ce.name}", + "apiBase": "${T}", "apiKey": "local" }`).join(`, `)} ] -}`}async function Z(){c(v,"Teste…");try{const x=await De("/api/integration/test");c(d,x.ok,!0),c(v,x.ok?`✓ Verbunden — ${x.models.length} Modell(e): ${x.models.join(", ")}`:`✗ Keine Verbindung: ${x.error}`,!0)}catch(x){c(d,!1),c(v,"✗ "+x.message)}}function X(x){var N;const P=x.querySelector("code");P&&((N=navigator.clipboard)==null||N.writeText(P.textContent||""))}function ve(x){var P;(P=navigator.clipboard)==null||P.writeText(x.value)}function ze(x){return`{ +}`}async function ne(){d(v,"Teste…");try{const T=await Pe("/api/integration/test");d(c,T.ok,!0),d(v,T.ok?`✓ Verbunden — ${T.models.length} Modell(e): ${T.models.join(", ")}`:`✗ Keine Verbindung: ${T.error}`,!0)}catch(T){d(c,!1),d(v,"✗ "+T.message)}}function J(T){var U;const K=T.querySelector("code");K&&((U=navigator.clipboard)==null||U.writeText(K.textContent||""))}function fe(T){var K;(K=navigator.clipboard)==null||K.writeText(T.value)}function Ie(T){return`{ "mcpServers": { "mission-control-memory": { - "command": "${x==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", - "args": ["${x==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], + "command": "${T==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", + "args": ["${T==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], "env": { "MC_URL": "http://192.168.178.151:9000" } } } -}`}var Re=Qc(),je=i(Xe(Re),2),ot=i(r(je),6),I=r(ot),re=i(I,2),be=i(ot,2),Je=r(be),de=i(be,2);{var Fe=x=>{var P=Pc();f(x,P)},ue=G(()=>C());q(de,x=>{t(ue)&&x(Fe)})}var at=i(de,2),Qe=r(at),it=i(Qe,2);{var dt=x=>{var P=Dc(),N=r(P);D(()=>{$t(P,`color:${t(d)?"#7ee29a":"#ff9b95"}`),g(N,t(v))}),f(x,P)};q(it,x=>{t(v)&&x(dt)})}var rt=i(je,2),Tt=i(r(rt),2);Ye(Tt,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],lt,(x,P)=>{var N=G(()=>aa(P,3));let j=()=>t(N)[0],H=()=>t(N)[1],fe=()=>t(N)[2];var me=$c(),w=r(me),K=r(w),ee=i(w,2),we=r(ee),Se=r(we),ft=i(we,2),st=r(ft);D(()=>{g(K,j()),g(Se,H()),g(st,fe())}),f(x,me)});var zt=i(rt,2);{var Wt=x=>{var P=Wc(),N=Xe(P),j=r(N),H=i(r(j),2),fe=r(H),me=i(j,4);Ye(me,21,()=>t(s),lt,(W,J)=>{const le=G(()=>t(o).includes(t(J).name));var oe=Ic(),$e=r(oe);D(()=>{$t(oe,`cursor:pointer;${t(le)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),g($e,t(J).name)}),k("click",oe,()=>c(o,t(le)?t(o).filter(Le=>Le!==t(J).name):[...t(o),t(J).name],!0)),k("keydown",oe,Le=>Le.key==="Enter"&&c(o,t(le)?t(o).filter(Te=>Te!==t(J).name):[...t(o),t(J).name],!0)),f(W,oe)});var w=i(me,2);{var K=W=>{var J=Lc(),le=r(J);k("click",le,oe=>{oe.preventDefault(),c(o,[],!0)}),f(W,J)};q(w,W=>{t(o).length&&W(K)})}var ee=i(N,2),we=i(r(ee),6);Ye(we,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],lt,(W,J)=>{var le=G(()=>aa(J,3));let oe=()=>t(le)[0],$e=()=>t(le)[1],Le=()=>t(le)[2];var Te=Xr(),se=r(Te),ce=r(se),wt=i(se,2),St=r(wt);D(()=>{At(Te,1,`card-btn${t(l)===oe()?" cb-best":""}`),g(ce,$e()),g(St,Le())}),k("click",Te,()=>c(l,oe(),!0)),f(W,Te)});var Se=i(we,4);Ye(Se,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],lt,(W,J)=>{var le=G(()=>aa(J,3));let oe=()=>t(le)[0],$e=()=>t(le)[1],Le=()=>t(le)[2];var Te=Xr(),se=r(Te),ce=r(se),wt=i(se,2),St=r(wt);D(()=>{At(Te,1,`card-btn${t(l)===oe()?" cb-best":""}`),g(ce,$e()),g(St,Le())}),k("click",Te,()=>c(l,oe(),!0)),f(W,Te)});var ft=i(ee,2),st=i(r(ft),2);{var Ue=W=>{var J=Oc(),le=i(Xe(J),6),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>{Xn(oe,t(y)),Xn(Te,t(F))}),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)},T=W=>{const J=G(()=>Ie(t(y),t(M)));var le=Bc(),oe=i(Xe(le),4),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,2),wt=i(r(ce)),St=r(wt);D(()=>{g(se,t(J)),g(St,`llama-swap / ${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},Q=W=>{var J=Rc(),le=i(Xe(J),6),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2),ce=i(Le,2),wt=i(r(ce),3),St=r(wt);D(()=>{Xn(oe,t(y)),Xn(Te,t(F)),g(St,t(F))}),k("click",$e,Bt=>ve(Bt.currentTarget.previousElementSibling)),k("click",se,Bt=>ve(Bt.currentTarget.previousElementSibling)),f(W,J)},Be=W=>{const J=G(()=>xe(t(y),t(M)));var le=Fc(),oe=i(Xe(le),4),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,4),wt=i(r(ce)),St=r(wt);D(()=>{g(se,t(J)),g(St,`bosgame / ${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},ne=W=>{const J=G(()=>ke(t(y),t(M)));var le=Kc(),oe=i(Xe(le),6),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,2),wt=i(r(ce),3),St=r(wt);D(()=>{g(se,t(J)),g(St,`llama-swap/${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},he=W=>{var J=Nc(),le=i(Xe(J),4),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>{Xn(oe,t(y)),Xn(Te,t(F))}),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)},Ne=W=>{var J=qc(),le=i(Xe(J),4),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>Xn(oe,t(y))),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)};q(st,W=>{t(l)==="janai"?W(Ue):t(l)==="continue"?W(T,1):t(l)==="antigravity"?W(Q,2):t(l)==="zed"?W(Be,3):t(l)==="opencode"?W(ne,4):t(l)==="cline"?W(he,5):t(l)==="openwebui"&&W(Ne,6)})}var We=i(ft,2);{var Ee=W=>{const J=G(()=>`curl ${t(y)}/chat/completions \\ +}`}var We=Zc(),tt=i(ot(We),2),_t=i(r(tt),6),I=r(_t),oe=i(I,2),we=i(_t,2),it=r(we),ge=i(we,2);{var He=T=>{var K=$c();f(T,K)},ye=N(()=>C());F(ge,T=>{t(ye)&&T(He)})}var dt=i(ge,2),rt=r(dt),mt=i(rt,2);{var ct=T=>{var K=Dc(),U=r(K);z(()=>{Pt(K,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(U,t(v))}),f(T,K)};F(mt,T=>{t(v)&&T(ct)})}var ft=i(tt,2),It=i(r(ft),2);Xe(It,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],lt,(T,K)=>{var U=N(()=>Jn(K,3));let be=()=>t(U)[0],ce=()=>t(U)[1],Ce=()=>t(U)[2];var Ee=Ic(),P=r(Ee),te=r(P),y=i(P,2),L=r(y),Y=r(L),Se=i(L,2),Ge=r(Se);z(()=>{h(te,be()),h(Y,ce()),h(Ge,Ce())}),f(T,Ee)});var Ft=i(ft,2);{var Lt=T=>{var K=Gc(),U=ot(K),be=r(U),ce=i(r(be),2),Ce=r(ce),Ee=i(be,4);Xe(Ee,21,()=>t(s),lt,(G,V)=>{const ae=N(()=>t(o).includes(t(V).name));var re=Lc(),Be=r(re);z(()=>{Pt(re,`cursor:pointer;${t(ae)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(Be,t(V).name)}),k("click",re,()=>d(o,t(ae)?t(o).filter(Fe=>Fe!==t(V).name):[...t(o),t(V).name],!0)),k("keydown",re,Fe=>Fe.key==="Enter"&&d(o,t(ae)?t(o).filter(de=>de!==t(V).name):[...t(o),t(V).name],!0)),f(G,re)});var P=i(Ee,2);{var te=G=>{var V=Oc(),ae=r(V);k("click",ae,re=>{re.preventDefault(),d(o,[],!0)}),f(G,V)};F(P,G=>{t(o).length&&G(te)})}var y=i(U,2),L=i(r(y),6);Xe(L,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],lt,(G,V)=>{var ae=N(()=>Jn(V,3));let re=()=>t(ae)[0],Be=()=>t(ae)[1],Fe=()=>t(ae)[2];var de=Xr(),H=r(de),se=r(H),vt=i(H,2),ht=r(vt);z(()=>{Dt(de,1,`card-btn${t(l)===re()?" cb-best":""}`),h(se,Be()),h(ht,Fe())}),k("click",de,()=>d(l,re(),!0)),f(G,de)});var Y=i(L,4);Xe(Y,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],lt,(G,V)=>{var ae=N(()=>Jn(V,3));let re=()=>t(ae)[0],Be=()=>t(ae)[1],Fe=()=>t(ae)[2];var de=Xr(),H=r(de),se=r(H),vt=i(H,2),ht=r(vt);z(()=>{Dt(de,1,`card-btn${t(l)===re()?" cb-best":""}`),h(se,Be()),h(ht,Fe())}),k("click",de,()=>d(l,re(),!0)),f(G,de)});var Se=i(y,2),Ge=i(r(Se),2);{var ve=G=>{var V=Bc(),ae=i(ot(V),6),re=r(ae),Be=i(re,2),Fe=i(ae,4),de=r(Fe),H=i(de,2);z(()=>{ta(re,t(x)),ta(de,t(B))}),k("click",Be,se=>fe(se.currentTarget.previousElementSibling)),k("click",H,se=>fe(se.currentTarget.previousElementSibling)),f(G,V)},M=G=>{const V=N(()=>Re(t(x),t(E)));var ae=Rc(),re=i(ot(ae),4),Be=r(re),Fe=i(Be,2),de=r(Fe),H=r(de),se=i(re,2),vt=i(r(se)),ht=r(vt);z(()=>{h(H,t(V)),h(ht,`llama-swap / ${t(B)??""}`)}),k("click",Be,St=>J(St.currentTarget.parentElement)),f(G,ae)},W=G=>{var V=Fc(),ae=i(ot(V),6),re=r(ae),Be=i(re,2),Fe=i(ae,4),de=r(Fe),H=i(de,2),se=i(Fe,2),vt=i(r(se),3),ht=r(vt);z(()=>{ta(re,t(x)),ta(de,t(B)),h(ht,t(B))}),k("click",Be,St=>fe(St.currentTarget.previousElementSibling)),k("click",H,St=>fe(St.currentTarget.previousElementSibling)),f(G,V)},Te=G=>{const V=N(()=>Me(t(x),t(E)));var ae=Kc(),re=i(ot(ae),4),Be=r(re),Fe=i(Be,2),de=r(Fe),H=r(de),se=i(re,4),vt=i(r(se)),ht=r(vt);z(()=>{h(H,t(V)),h(ht,`bosgame / ${t(B)??""}`)}),k("click",Be,St=>J(St.currentTarget.parentElement)),f(G,ae)},X=G=>{const V=N(()=>Ae(t(x),t(E)));var ae=Nc(),re=i(ot(ae),6),Be=r(re),Fe=i(Be,2),de=r(Fe),H=r(de),se=i(re,2),vt=i(r(se),3),ht=r(vt);z(()=>{h(H,t(V)),h(ht,`llama-swap/${t(B)??""}`)}),k("click",Be,St=>J(St.currentTarget.parentElement)),f(G,ae)},pe=G=>{var V=qc(),ae=i(ot(V),4),re=r(ae),Be=i(re,2),Fe=i(ae,4),de=r(Fe),H=i(de,2);z(()=>{ta(re,t(x)),ta(de,t(B))}),k("click",Be,se=>fe(se.currentTarget.previousElementSibling)),k("click",H,se=>fe(se.currentTarget.previousElementSibling)),f(G,V)},De=G=>{var V=Vc(),ae=i(ot(V),4),re=r(ae),Be=i(re,2),Fe=i(ae,4),de=r(Fe),H=i(de,2);z(()=>ta(re,t(x))),k("click",Be,se=>fe(se.currentTarget.previousElementSibling)),k("click",H,se=>fe(se.currentTarget.previousElementSibling)),f(G,V)};F(Ge,G=>{t(l)==="janai"?G(ve):t(l)==="continue"?G(M,1):t(l)==="antigravity"?G(W,2):t(l)==="zed"?G(Te,3):t(l)==="opencode"?G(X,4):t(l)==="cline"?G(pe,5):t(l)==="openwebui"&&G(De,6)})}var je=i(Se,2);{var Oe=G=>{const V=N(()=>`curl ${t(x)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${t(ye)}", + "model": "${t(xe)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var le=Vc(),oe=r(le),$e=i(r(oe),2),Le=r($e);He(Le,()=>jt("check"));var Te=i(Le),se=i(oe,4),ce=r(se),wt=i(ce,2),St=r(wt),Bt=r(St);D(()=>{g(Te,` „${t(ye)??""}" bereit`),g(Bt,t(J))}),k("click",ce,hn=>X(hn.currentTarget.parentElement)),f(W,le)};q(We,W=>{t(ye)&&W(Ee)})}D(()=>g(fe,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),f(x,P)},qt=x=>{var P=Gc(),N=i(r(P),2),j=i(r(N),4);k("click",j,()=>{var H;return(H=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:H.dispatchEvent(new MouseEvent("click"))}),f(x,P)};q(zt,x=>{t(s).length?x(Wt):x(qt,-1)})}var Gt=i(zt,2),Lt=i(r(Gt),2),Ot=i(r(Lt)),U=i(Lt,2);Ye(U,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],lt,(x,P)=>{var N=G(()=>aa(P,3));let j=()=>t(N)[0],H=()=>t(N)[1],fe=()=>t(N)[2];var me=jc(),w=r(me),K=r(w),ee=i(w,2),we=r(ee);D(()=>{At(me,1,`card-btn${t(u)===j()?" cb-best":""}`),g(K,H()),g(we,fe())}),k("click",me,()=>c(u,j(),!0)),f(x,me)});var ae=i(U,2),A=r(ae),B=i(A,2),_e=r(B),Ce=r(_e),V=i(ae,2);{var pe=x=>{var P=Uc();f(x,P)},z=x=>{var P=Hc();f(x,P)},R=x=>{var P=Jc();f(x,P)};q(V,x=>{t(u)==="cline"?x(pe):t(u)==="opencode"?x(z,1):x(R,-1)})}D(()=>{Xn(I,t(y)),g(Ce,t(O))}),k("click",re,x=>{const P=x.currentTarget.previousElementSibling;ve(P)}),k("input",Je,$),an(Je,()=>t(p),x=>c(p,x)),k("click",Qe,Z),k("click",Ot,x=>{var P;x.preventDefault(),(P=document.querySelector(".nav-item[data-view='memory']"))==null||P.click()}),k("click",A,x=>X(x.currentTarget.parentElement)),f(e,Re),Dn()}qn(["click","input","keydown"]);var Yc=b('
'),Xc=b('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),ev=b('
Lade News… (erstes Laden kann kurz dauern)
'),tv=b('
'),nv=b('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),av=b('für dich'),iv=b('
'),rv=b('
'),sv=b('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function lv(e,n){Pn(n,!0);let a=L(Jt([])),s=L(Jt([])),l=L(!0),o=L("");const v=Z=>Z==="perfect"?"ok":Z==="marginal"?"warn":"bad";function d(Z){const X=Math.max(0,Date.now()/1e3-Z);return X<60?X+"s":X<3600?Math.floor(X/60)+"m":X<86400?Math.floor(X/3600)+"h":Math.floor(X/86400)+"d"}async function u(){c(l,!0),c(o,"");try{c(a,(await De("/api/news")).items||[],!0)}catch(Z){c(o,Z.message||"Fehler beim Laden",!0)}finally{c(l,!1)}}async function p(){try{c(s,(await De("/api/cookbook/upgrades")).upgrades||[],!0)}catch{c(s,[],!0)}}async function _(Z,X){var ve;X.disabled=!0,X.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:Z.repo,role:Z.role,params_b:Z.params_b,quant:Z.quant,hf_token:ci()})}),(ve=document.querySelector(".nav-item[data-view='activity']"))==null||ve.dispatchEvent(new MouseEvent("click"))}catch(ze){X.disabled=!1,X.textContent="Installieren",alert("Fehler: "+ze.message)}}function C(){u(),p()}yi(()=>{u(),p()});var m=sv(),y=Xe(m),$=i(r(y),2),O=i(y,2);{var M=Z=>{var X=Xc(),ve=r(X),ze=i(r(ve),2),Re=r(ze),je=i(ve,4);Ye(je,21,()=>t(s),lt,(ot,I)=>{var re=Yc(),be=r(re),Je=r(be),de=r(Je),Fe=r(de),ue=i(de,2),at=r(ue),Qe=i(Je,2),it=r(Qe),dt=i(be,2);D(rt=>{g(Fe,t(I).name),At(ue,1,`fit-badge ${rt??""}`),g(at,t(I).fit.text),g(it,`Ersetzt dein „${t(I).old??""}". ${t(I).why??""}`)},[()=>v(t(I).fit.level)]),k("click",dt,rt=>_(t(I),rt.currentTarget)),f(ot,re)}),D(()=>g(Re,t(s).length)),f(Z,X)};q(O,Z=>{t(s).length&&Z(M)})}var F=i(O,2);{var ye=Z=>{var X=ev();f(Z,X)},xe=Z=>{var X=tv(),ve=r(X);D(()=>g(ve,t(o))),f(Z,X)},ke=Z=>{var X=nv();f(Z,X)},Ie=Z=>{var X=rv();Ye(X,21,()=>t(a),lt,(ve,ze,Re)=>{var je=iv();At(je,1,`news-card${Re===0?" featured":""}`);var ot=r(je),I=r(ot),re=r(I),be=i(I,2);{var Je=Qe=>{var it=av();f(Qe,it)};q(be,Qe=>{t(ze).relevant&&Qe(Je)})}var de=i(be,2),Fe=r(de),ue=i(ot,2),at=r(ue);D(Qe=>{Aa(je,"href",t(ze).link),g(re,t(ze).source),g(Fe,Qe),g(at,t(ze).title)},[()=>t(ze).ts?d(t(ze).ts):""]),f(ve,je)}),f(Z,X)};q(F,Z=>{t(l)?Z(ye):t(o)?Z(xe,1):t(a).length?Z(Ie,-1):Z(ke,2)})}k("click",$,C),f(e,m),Dn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",` +}'`);var ae=Wc(),re=r(ae),Be=i(r(re),2),Fe=r(Be);at(Fe,()=>Ht("check"));var de=i(Fe),H=i(re,4),se=r(H),vt=i(se,2),ht=r(vt),St=r(ht);z(()=>{h(de,` „${t(xe)??""}" bereit`),h(St,t(V))}),k("click",se,ln=>J(ln.currentTarget.parentElement)),f(G,ae)};F(je,G=>{t(xe)&&G(Oe)})}z(()=>h(Ce,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),f(T,K)},Ut=T=>{var K=jc(),U=i(r(K),2),be=i(r(U),4);k("click",be,()=>{var ce;return(ce=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:ce.dispatchEvent(new MouseEvent("click"))}),f(T,K)};F(Ft,T=>{t(s).length?T(Lt):T(Ut,-1)})}var Kt=i(Ft,2),Nt=i(r(Kt),2),qt=i(r(Nt)),Q=i(Nt,2);Xe(Q,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],lt,(T,K)=>{var U=N(()=>Jn(K,3));let be=()=>t(U)[0],ce=()=>t(U)[1],Ce=()=>t(U)[2];var Ee=Uc(),P=r(Ee),te=r(P),y=i(P,2),L=r(y);z(()=>{Dt(Ee,1,`card-btn${t(u)===be()?" cb-best":""}`),h(te,ce()),h(L,Ce())}),k("click",Ee,()=>d(u,be(),!0)),f(T,Ee)});var me=i(Q,2),A=r(me),R=i(A,2),ke=r(R),$e=r(ke),q=i(me,2);{var he=T=>{var K=Hc();f(T,K)},Le=T=>{var K=Jc();f(T,K)},Ne=T=>{var K=Qc();f(T,K)};F(q,T=>{t(u)==="cline"?T(he):t(u)==="opencode"?T(Le,1):T(Ne,-1)})}z(()=>{ta(I,t(x)),h($e,t(O))}),k("click",oe,T=>{const K=T.currentTarget.previousElementSibling;fe(K)}),k("input",it,D),rn(it,()=>t(p),T=>d(p,T)),k("click",rt,ne),k("click",qt,T=>{var K;T.preventDefault(),(K=document.querySelector(".nav-item[data-view='memory']"))==null||K.click()}),k("click",A,T=>J(T.currentTarget.parentElement)),f(e,We),$n()}qn(["click","input","keydown"]);var Xc=g('
'),ev=g('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),tv=g('
Lade News… (erstes Laden kann kurz dauern)
'),nv=g('
'),av=g('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),iv=g('für dich'),rv=g('
'),sv=g('
'),lv=g('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function ov(e,n){Pn(n,!0);let a=$(Gt([])),s=$(Gt([])),l=$(!0),o=$("");const v=ne=>ne==="perfect"?"ok":ne==="marginal"?"warn":"bad";function c(ne){const J=Math.max(0,Date.now()/1e3-ne);return J<60?J+"s":J<3600?Math.floor(J/60)+"m":J<86400?Math.floor(J/3600)+"h":Math.floor(J/86400)+"d"}async function u(){d(l,!0),d(o,"");try{d(a,(await Pe("/api/news")).items||[],!0)}catch(ne){d(o,ne.message||"Fehler beim Laden",!0)}finally{d(l,!1)}}async function p(){try{d(s,(await Pe("/api/cookbook/upgrades")).upgrades||[],!0)}catch{d(s,[],!0)}}async function _(ne,J){var fe;J.disabled=!0,J.textContent="Starte…";try{await Pe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:ne.repo,role:ne.role,params_b:ne.params_b,quant:ne.quant,hf_token:ci()})}),(fe=document.querySelector(".nav-item[data-view='activity']"))==null||fe.dispatchEvent(new MouseEvent("click"))}catch(Ie){J.disabled=!1,J.textContent="Installieren",alert("Fehler: "+Ie.message)}}function C(){u(),p()}xi(()=>{u(),p()});var b=lv(),x=ot(b),D=i(r(x),2),O=i(x,2);{var E=ne=>{var J=ev(),fe=r(J),Ie=i(r(fe),2),We=r(Ie),tt=i(fe,4);Xe(tt,21,()=>t(s),lt,(_t,I)=>{var oe=Xc(),we=r(oe),it=r(we),ge=r(it),He=r(ge),ye=i(ge,2),dt=r(ye),rt=i(it,2),mt=r(rt),ct=i(we,2);z(ft=>{h(He,t(I).name),Dt(ye,1,`fit-badge ${ft??""}`),h(dt,t(I).fit.text),h(mt,`Ersetzt dein „${t(I).old??""}". ${t(I).why??""}`)},[()=>v(t(I).fit.level)]),k("click",ct,ft=>_(t(I),ft.currentTarget)),f(_t,oe)}),z(()=>h(We,t(s).length)),f(ne,J)};F(O,ne=>{t(s).length&&ne(E)})}var B=i(O,2);{var xe=ne=>{var J=tv();f(ne,J)},Me=ne=>{var J=nv(),fe=r(J);z(()=>h(fe,t(o))),f(ne,J)},Ae=ne=>{var J=av();f(ne,J)},Re=ne=>{var J=sv();Xe(J,21,()=>t(a),lt,(fe,Ie,We)=>{var tt=rv();Dt(tt,1,`news-card${We===0?" featured":""}`);var _t=r(tt),I=r(_t),oe=r(I),we=i(I,2);{var it=rt=>{var mt=iv();f(rt,mt)};F(we,rt=>{t(Ie).relevant&&rt(it)})}var ge=i(we,2),He=r(ge),ye=i(_t,2),dt=r(ye);z(rt=>{Ca(tt,"href",t(Ie).link),h(oe,t(Ie).source),h(He,rt),h(dt,t(Ie).title)},[()=>t(Ie).ts?c(t(Ie).ts):""]),f(fe,tt)}),f(ne,J)};F(B,ne=>{t(l)?ne(xe):t(o)?ne(Me,1):t(a).length?ne(Re,-1):ne(Ae,2)})}k("click",D,C),f(e,b),$n()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → Anwendungsfall wählen (z.B. „Coden & Programmieren") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität — einfach warten bis der Job grün wird.
  2. @@ -649,24 +649,28 @@ src/
    Strg+Shift+R (Hard Reload). Wenn das nicht hilft: Tab Server → Mission Control → Neu starten.
    - `]]}],ov=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var dv=b('

    '),cv=b(""),vv=b('
    '),uv=b('
    '),pv=b('

    Guide

    Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

    Begriffe kurz erklärt

    ',1);function fv(e,n){Pn(n,!0);let a=L(0);function s(p){var _;c(a,p,!0),(_=document.getElementById(`guide-group-${p}`))==null||_.scrollIntoView({behavior:"smooth",block:"start"})}var l=pv(),o=i(Xe(l),2),v=i(r(o),2);Ye(v,21,()=>ov,lt,(p,_)=>{var C=G(()=>aa(t(_),2));let m=()=>t(C)[0],y=()=>t(C)[1];var $=dv(),O=r($),M=r(O),F=i(O,2),ye=r(F);D(()=>{g(M,m()),g(ye,y())}),f(p,$)});var d=i(o,2);Ye(d,21,()=>es,lt,(p,_,C)=>{var m=cv(),y=r(m);D(()=>{At(m,1,`guide-tab${t(a)===C?" active":""}`,"svelte-112sh7i"),g(y,t(_).label)}),k("click",m,()=>s(C)),f(p,m)});var u=i(d,2);Ye(u,17,()=>es,lt,(p,_,C)=>{var m=uv();Aa(m,"id",`guide-group-${C}`);var y=r(m),$=r(y),O=i(y,2);Ye(O,17,()=>t(_).tutorials,lt,(M,F,ye)=>{var xe=G(()=>aa(t(F),2));let ke=()=>t(xe)[0],Ie=()=>t(xe)[1];var Z=vv();Z.open=C===0&&ye===0;var X=r(Z),ve=r(X),ze=i(X,2);He(ze,Ie,!0),D(()=>g(ve,ke())),f(M,Z)}),D(()=>g($,t(_).label)),f(p,m)}),f(e,l),Dn()}qn(["click"]);var hv=b('
    '),gv=b('

    Import aus Claude / Gemini / ChatGPT

    Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag.
    '),mv=b('

    Neuer Eintrag

    Strg+Enter zum Speichern
    '),bv=b(' '),_v=b('
    Lade…
    '),yv=b(''),xv=b('
    '),kv=b('
    ',1),wv=b('
    '),Sv=b("
    "),Mv=b('
    '),Ev=b(`

    Gedächtnis

    Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
    Filter:

    Wie KI-Tools dieses Gedächtnis nutzen

    Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu. +
    `]]}],dv=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var cv=g('

    '),vv=g(""),uv=g('
    '),pv=g('
    '),fv=g('

    Guide

    Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

    Begriffe kurz erklärt

    ',1);function hv(e,n){Pn(n,!0);let a=$(0);function s(p){var _;d(a,p,!0),(_=document.getElementById(`guide-group-${p}`))==null||_.scrollIntoView({behavior:"smooth",block:"start"})}var l=fv(),o=i(ot(l),2),v=i(r(o),2);Xe(v,21,()=>dv,lt,(p,_)=>{var C=N(()=>Jn(t(_),2));let b=()=>t(C)[0],x=()=>t(C)[1];var D=cv(),O=r(D),E=r(O),B=i(O,2),xe=r(B);z(()=>{h(E,b()),h(xe,x())}),f(p,D)});var c=i(o,2);Xe(c,21,()=>es,lt,(p,_,C)=>{var b=vv(),x=r(b);z(()=>{Dt(b,1,`guide-tab${t(a)===C?" active":""}`,"svelte-112sh7i"),h(x,t(_).label)}),k("click",b,()=>s(C)),f(p,b)});var u=i(c,2);Xe(u,17,()=>es,lt,(p,_,C)=>{var b=pv();Ca(b,"id",`guide-group-${C}`);var x=r(b),D=r(x),O=i(x,2);Xe(O,17,()=>t(_).tutorials,lt,(E,B,xe)=>{var Me=N(()=>Jn(t(B),2));let Ae=()=>t(Me)[0],Re=()=>t(Me)[1];var ne=uv();ne.open=C===0&&xe===0;var J=r(ne),fe=r(J),Ie=i(J,2);at(Ie,Re,!0),z(()=>h(fe,Ae())),f(E,ne)}),z(()=>h(D,t(_).label)),f(p,b)}),f(e,l),$n()}qn(["click"]);var gv=g('
    '),mv=g('

    Import aus Claude / Gemini / ChatGPT

    Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag.
    '),bv=g('

    Neuer Eintrag

    Strg+Enter zum Speichern
    '),_v=g(' '),xv=g('
    Lade…
    '),yv=g(''),kv=g('
    '),wv=g('
    ',1),Sv=g('
    '),Mv=g("
    "),Ev=g('
    '),Av=g(`

    Gedächtnis

    Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
    Filter:

    Wie KI-Tools dieses Gedächtnis nutzen

    Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu. Beim Start einer Session lädt der Agent automatisch alle Einträge — er kennt dann deinen Stack, - deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Av(e,n){Pn(n,!0);let a=L(Jt([])),s=L(!0),l=L("all"),o=L(!1),v=L(""),d=L("stable"),u=L(null),p=L(""),_=L("stable"),C=L(!1),m=L(""),y=L("stable"),$=L("import"),O=L(!1);const M=G(()=>t(m).split(` -`).map(U=>U.trim()).filter(U=>U.length>0)),F=G(()=>t(l)==="all"?t(a):t(a).filter(U=>U.category===t(l))),ye={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function xe(U){const ae=Math.floor((Date.now()-new Date(U).getTime())/1e3);return ae<60?"gerade eben":ae<3600?`vor ${Math.floor(ae/60)} Min`:ae<86400?`vor ${Math.floor(ae/3600)} Std`:`vor ${Math.floor(ae/86400)} Tagen`}function ke(U){return t(a).filter(ae=>ae.category===U).length}async function Ie(){try{c(a,await De("/api/memory"),!0)}catch(U){ie("Laden fehlgeschlagen: "+U.message,!0)}finally{c(s,!1)}}async function Z(){if(t(v).trim())try{const U=await De("/api/memory",{method:"POST",body:JSON.stringify({content:t(v).trim(),category:t(d),source:"manual"})});c(a,[U,...t(a)],!0),c(v,""),c(d,"stable"),c(o,!1),ie("Gespeichert")}catch(U){ie("Fehler: "+U.message,!0)}}async function X(U){try{const ae=await De(`/api/memory/${U.id}`,{method:"PUT",body:JSON.stringify({content:t(p),category:t(_)})});c(a,t(a).map(A=>A.id===U.id?ae:A),!0),c(u,null),ie("Aktualisiert")}catch(ae){ie("Fehler: "+ae.message,!0)}}async function ve(U){if(await xn({title:"Eintrag löschen?",body:`„${U.content.length>80?U.content.slice(0,80)+"…":U.content}" wird dauerhaft entfernt.`,danger:!0}))try{await De(`/api/memory/${U.id}`,{method:"DELETE"}),c(a,t(a).filter(A=>A.id!==U.id),!0),ie("Gelöscht")}catch(A){ie("Fehler: "+A.message,!0)}}function ze(U){c(u,U.id,!0),c(p,U.content,!0),c(_,U.category,!0)}async function Re(){if(t(M).length===0)return;c(O,!0);let U=0;for(const ae of t(M))try{const A=await De("/api/memory",{method:"POST",body:JSON.stringify({content:ae,category:t(y),source:t($)})});c(a,[A,...t(a)],!0),U++}catch{}c(O,!1),c(C,!1),c(m,""),ie(`${U} von ${t(M).length} Einträgen importiert`)}Ga(()=>{Ie()});var je=Ev(),ot=Xe(je),I=i(r(ot),2),re=r(I),be=r(re),Je=i(re,2),de=r(Je),Fe=i(ot,2);{var ue=U=>{var ae=gv(),A=i(r(ae),6);Aa(A,"placeholder",`Tobi arbeitet am liebsten abends. + deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Cv(e,n){Pn(n,!0);let a=$(Gt([])),s=$(!0),l=$("all"),o=$(!1),v=$(""),c=$("stable"),u=$(null),p=$(""),_=$("stable"),C=$(!1),b=$(""),x=$("stable"),D=$("import"),O=$(!1);const E=N(()=>t(b).split(` +`).map(Q=>Q.trim()).filter(Q=>Q.length>0)),B=N(()=>t(l)==="all"?t(a):t(a).filter(Q=>Q.category===t(l))),xe={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function Me(Q){const me=Math.floor((Date.now()-new Date(Q).getTime())/1e3);return me<60?"gerade eben":me<3600?`vor ${Math.floor(me/60)} Min`:me<86400?`vor ${Math.floor(me/3600)} Std`:`vor ${Math.floor(me/86400)} Tagen`}function Ae(Q){return t(a).filter(me=>me.category===Q).length}async function Re(){try{d(a,await Pe("/api/memory"),!0)}catch(Q){le("Laden fehlgeschlagen: "+Q.message,!0)}finally{d(s,!1)}}async function ne(){if(t(v).trim())try{const Q=await Pe("/api/memory",{method:"POST",body:JSON.stringify({content:t(v).trim(),category:t(c),source:"manual"})});d(a,[Q,...t(a)],!0),d(v,""),d(c,"stable"),d(o,!1),le("Gespeichert")}catch(Q){le("Fehler: "+Q.message,!0)}}async function J(Q){try{const me=await Pe(`/api/memory/${Q.id}`,{method:"PUT",body:JSON.stringify({content:t(p),category:t(_)})});d(a,t(a).map(A=>A.id===Q.id?me:A),!0),d(u,null),le("Aktualisiert")}catch(me){le("Fehler: "+me.message,!0)}}async function fe(Q){if(await yn({title:"Eintrag löschen?",body:`„${Q.content.length>80?Q.content.slice(0,80)+"…":Q.content}" wird dauerhaft entfernt.`,danger:!0}))try{await Pe(`/api/memory/${Q.id}`,{method:"DELETE"}),d(a,t(a).filter(A=>A.id!==Q.id),!0),le("Gelöscht")}catch(A){le("Fehler: "+A.message,!0)}}function Ie(Q){d(u,Q.id,!0),d(p,Q.content,!0),d(_,Q.category,!0)}async function We(){if(t(E).length===0)return;d(O,!0);let Q=0;for(const me of t(E))try{const A=await Pe("/api/memory",{method:"POST",body:JSON.stringify({content:me,category:t(x),source:t(D)})});d(a,[A,...t(a)],!0),Q++}catch{}d(O,!1),d(C,!1),d(b,""),le(`${Q} von ${t(E).length} Einträgen importiert`)}ja(()=>{Re()});var tt=Av(),_t=ot(tt),I=i(r(_t),2),oe=r(I),we=r(oe),it=i(oe,2),ge=r(it),He=i(_t,2);{var ye=Q=>{var me=mv(),A=i(r(me),6);Ca(A,"placeholder",`Tobi arbeitet am liebsten abends. Projektsprache: Deutsch. Bosgame M5 läuft mit Ubuntu 26.04. -...`);var B=i(A,2),_e=r(B),Ce=i(r(_e),2),V=r(Ce);V.value=V.__value="user";var pe=i(V);pe.value=pe.__value="instruction";var z=i(pe);z.value=z.__value="stable";var R=i(z);R.value=R.__value="versioned";var x=i(R);x.value=x.__value="ephemeral";var P=i(_e,2),N=i(r(P),2),j=r(N);j.value=j.__value="import";var H=i(j);H.value=H.__value="claude";var fe=i(H);fe.value=fe.__value="gemini";var me=i(fe);me.value=me.__value="chatgpt";var w=i(me);w.value=w.__value="manual";var K=i(B,2);{var ee=Ue=>{var T=hv(),Q=r(T);D(()=>g(Q,`${t(M).length??""} Eintrag/Einträge erkannt`)),f(Ue,T)};q(K,Ue=>{t(M).length>0&&Ue(ee)})}var we=i(K,2),Se=r(we),ft=r(Se),st=i(Se,2);D(()=>{Se.disabled=t(M).length===0||t(O),g(ft,t(O)?"Importiere…":`${t(M).length} Einträge speichern`)}),an(A,()=>t(m),Ue=>c(m,Ue)),Hn(Ce,()=>t(y),Ue=>c(y,Ue)),Hn(N,()=>t($),Ue=>c($,Ue)),k("click",Se,Re),k("click",st,()=>{c(C,!1),c(m,"")}),f(U,ae)};q(Fe,U=>{t(C)&&U(ue)})}var at=i(Fe,2);{var Qe=U=>{var ae=mv(),A=i(r(ae),4),B=i(A,4),_e=r(B);_e.value=_e.__value="user";var Ce=i(_e);Ce.value=Ce.__value="instruction";var V=i(Ce);V.value=V.__value="stable";var pe=i(V);pe.value=pe.__value="versioned";var z=i(pe);z.value=z.__value="ephemeral";var R=i(B,2),x=r(R),P=i(x,2);D(N=>x.disabled=N,[()=>!t(v).trim()]),k("keydown",A,N=>{N.key==="Enter"&&(N.ctrlKey||N.metaKey)&&Z()}),an(A,()=>t(v),N=>c(v,N)),Hn(B,()=>t(d),N=>c(d,N)),k("click",x,Z),k("click",P,()=>{c(o,!1),c(v,"")}),f(U,ae)};q(at,U=>{t(o)&&U(Qe)})}var it=i(at,2),dt=r(it),rt=i(r(dt),2);Ye(rt,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",ke("user")],["instruction","Verhalten","#fb923c",ke("instruction")],["stable","Stabil","var(--accent)",ke("stable")],["versioned","Versioniert","#f59e0b",ke("versioned")],["ephemeral","Temporär","var(--mut)",ke("ephemeral")]],lt,(U,ae)=>{var A=G(()=>aa(t(ae),4));let B=()=>t(A)[0],_e=()=>t(A)[1],Ce=()=>t(A)[2],V=()=>t(A)[3];var pe=bv(),z=r(pe),R=i(z),x=r(R);D(()=>{$t(pe,`cursor:pointer;${t(l)===B()?`background:rgba(45,212,191,.12);border-color:${Ce()||"var(--accent)"};color:${Ce()||"var(--accent)"}`:""}`),g(z,`${_e()??""} `),g(x,V())}),k("click",pe,()=>c(l,B(),!0)),k("keydown",pe,P=>P.key==="Enter"&&c(l,B(),!0)),f(U,pe)});var Tt=i(it,2);{var zt=U=>{var ae=_v();f(U,ae)},Wt=U=>{var ae=xv(),A=r(ae),B=r(A),_e=r(B),Ce=i(B,2),V=r(Ce),pe=i(Ce,2);{var z=R=>{var x=yv();k("click",x,()=>c(o,!0)),f(R,x)};q(pe,R=>{t(a).length===0&&R(z)})}D(()=>{g(_e,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),g(V,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),f(U,ae)},qt=U=>{var ae=Mv();Ye(ae,23,()=>t(F),A=>A.id,(A,B,_e)=>{var Ce=Sv(),V=r(Ce);{var pe=R=>{var x=kv(),P=Xe(x),N=i(P,2),j=r(N);j.value=j.__value="user";var H=i(j);H.value=H.__value="instruction";var fe=i(H);fe.value=fe.__value="stable";var me=i(fe);me.value=me.__value="versioned";var w=i(me);w.value=w.__value="ephemeral";var K=i(N,2),ee=r(K),we=i(ee,2);an(P,()=>t(p),Se=>c(p,Se)),Hn(N,()=>t(_),Se=>c(_,Se)),k("click",ee,()=>X(t(B))),k("click",we,()=>c(u,null)),f(R,x)},z=R=>{var x=wv(),P=r(x),N=r(P),j=r(N),H=i(N,2),fe=r(H),me=r(fe),w=i(fe,2),K=r(w),ee=i(w,2),we=r(ee),Se=i(P,2),ft=r(Se),st=i(ft,2);D(Ue=>{var T,Q,Be;g(j,t(B).content),$t(fe,`border-color:${(((T=ye[t(B).category])==null?void 0:T.color)||"var(--mut)")??""};color:${(((Q=ye[t(B).category])==null?void 0:Q.color)||"var(--mut)")??""}`),g(me,((Be=ye[t(B).category])==null?void 0:Be.label)||t(B).category),g(K,t(B).source),g(we,Ue)},[()=>xe(t(B).updated_at)]),k("click",ft,()=>ze(t(B))),k("click",st,()=>ve(t(B))),f(R,x)};q(V,R=>{t(u)===t(B).id?R(pe):R(z,-1)})}D(()=>$t(Ce,`padding:14px 16px;${t(_e){t(s)?U(zt):t(F).length===0?U(Wt,1):U(qt,-1)})}var Gt=i(Tt,2),Lt=i(r(Gt),2),Ot=i(r(Lt),3);D(()=>{g(be,t(C)?"Abbrechen":"⇩ Import"),g(de,t(o)?"Abbrechen":"+ Eintrag")}),k("click",re,()=>{c(C,!t(C)),c(o,!1),c(m,"")}),k("click",Je,()=>{c(o,!t(o)),c(C,!1),c(v,"")}),k("click",Ot,U=>{var ae;U.preventDefault(),(ae=document.querySelector(".nav-item[data-view='connect']"))==null||ae.click()}),f(e,je),Dn()}qn(["click","keydown"]);var Cv=b('
    pip install faster-whisper
    '),Tv=b('
    '),zv=b('
    4. Bosgame-Key eintragen (in Windows PowerShell):
    '),Pv=b('
    SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
    '),Dv=b('
    Einrichtung (einmalig, ~3 Minuten):
    1. PowerShell als Admin — OpenSSH Server installieren:
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    2. Dienst starten und dauerhaft aktivieren:
    3. SSH-Ordner erstellen:
    5. Windows-IP in Mission Control Env-Var setzen:
    HERMES_WINDOWS_HOST=192.168.178.XXX
    '),$v=b('

    Hermes Setup-Wizard

    Whisper (Sprache → Text)
    faster-whisper muss auf dem Bosgame installiert sein
    Piper TTS (Text → Sprache)
    Piper-Binary + deutsche Stimme
    Windows SSH-Verbindung
    Damit Hermes Dateien auf deinem Windows-PC ändern kann
    '),Iv=b(''),Lv=b('
    Hermes ist bereit
    Stelle eine Frage oder gib einen Auftrag — per Text oder Sprache.
    '),Ov=b(`
    {var M=gv(),W=r(M);z(()=>h(W,`${t(E).length??""} Eintrag/Einträge erkannt`)),f(ve,M)};F(te,ve=>{t(E).length>0&&ve(y)})}var L=i(te,2),Y=r(L),Se=r(Y),Ge=i(Y,2);z(()=>{Y.disabled=t(E).length===0||t(O),h(Se,t(O)?"Importiere…":`${t(E).length} Einträge speichern`)}),rn(A,()=>t(b),ve=>d(b,ve)),Qn($e,()=>t(x),ve=>d(x,ve)),Qn(U,()=>t(D),ve=>d(D,ve)),k("click",Y,We),k("click",Ge,()=>{d(C,!1),d(b,"")}),f(Q,me)};F(He,Q=>{t(C)&&Q(ye)})}var dt=i(He,2);{var rt=Q=>{var me=bv(),A=i(r(me),4),R=i(A,4),ke=r(R);ke.value=ke.__value="user";var $e=i(ke);$e.value=$e.__value="instruction";var q=i($e);q.value=q.__value="stable";var he=i(q);he.value=he.__value="versioned";var Le=i(he);Le.value=Le.__value="ephemeral";var Ne=i(R,2),T=r(Ne),K=i(T,2);z(U=>T.disabled=U,[()=>!t(v).trim()]),k("keydown",A,U=>{U.key==="Enter"&&(U.ctrlKey||U.metaKey)&&ne()}),rn(A,()=>t(v),U=>d(v,U)),Qn(R,()=>t(c),U=>d(c,U)),k("click",T,ne),k("click",K,()=>{d(o,!1),d(v,"")}),f(Q,me)};F(dt,Q=>{t(o)&&Q(rt)})}var mt=i(dt,2),ct=r(mt),ft=i(r(ct),2);Xe(ft,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",Ae("user")],["instruction","Verhalten","#fb923c",Ae("instruction")],["stable","Stabil","var(--accent)",Ae("stable")],["versioned","Versioniert","#f59e0b",Ae("versioned")],["ephemeral","Temporär","var(--mut)",Ae("ephemeral")]],lt,(Q,me)=>{var A=N(()=>Jn(t(me),4));let R=()=>t(A)[0],ke=()=>t(A)[1],$e=()=>t(A)[2],q=()=>t(A)[3];var he=_v(),Le=r(he),Ne=i(Le),T=r(Ne);z(()=>{Pt(he,`cursor:pointer;${t(l)===R()?`background:rgba(45,212,191,.12);border-color:${$e()||"var(--accent)"};color:${$e()||"var(--accent)"}`:""}`),h(Le,`${ke()??""} `),h(T,q())}),k("click",he,()=>d(l,R(),!0)),k("keydown",he,K=>K.key==="Enter"&&d(l,R(),!0)),f(Q,he)});var It=i(mt,2);{var Ft=Q=>{var me=xv();f(Q,me)},Lt=Q=>{var me=kv(),A=r(me),R=r(A),ke=r(R),$e=i(R,2),q=r($e),he=i($e,2);{var Le=Ne=>{var T=yv();k("click",T,()=>d(o,!0)),f(Ne,T)};F(he,Ne=>{t(a).length===0&&Ne(Le)})}z(()=>{h(ke,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(q,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),f(Q,me)},Ut=Q=>{var me=Ev();Xe(me,23,()=>t(B),A=>A.id,(A,R,ke)=>{var $e=Mv(),q=r($e);{var he=Ne=>{var T=wv(),K=ot(T),U=i(K,2),be=r(U);be.value=be.__value="user";var ce=i(be);ce.value=ce.__value="instruction";var Ce=i(ce);Ce.value=Ce.__value="stable";var Ee=i(Ce);Ee.value=Ee.__value="versioned";var P=i(Ee);P.value=P.__value="ephemeral";var te=i(U,2),y=r(te),L=i(y,2);rn(K,()=>t(p),Y=>d(p,Y)),Qn(U,()=>t(_),Y=>d(_,Y)),k("click",y,()=>J(t(R))),k("click",L,()=>d(u,null)),f(Ne,T)},Le=Ne=>{var T=Sv(),K=r(T),U=r(K),be=r(U),ce=i(U,2),Ce=r(ce),Ee=r(Ce),P=i(Ce,2),te=r(P),y=i(P,2),L=r(y),Y=i(K,2),Se=r(Y),Ge=i(Se,2);z(ve=>{var M,W,Te;h(be,t(R).content),Pt(Ce,`border-color:${(((M=xe[t(R).category])==null?void 0:M.color)||"var(--mut)")??""};color:${(((W=xe[t(R).category])==null?void 0:W.color)||"var(--mut)")??""}`),h(Ee,((Te=xe[t(R).category])==null?void 0:Te.label)||t(R).category),h(te,t(R).source),h(L,ve)},[()=>Me(t(R).updated_at)]),k("click",Se,()=>Ie(t(R))),k("click",Ge,()=>fe(t(R))),f(Ne,T)};F(q,Ne=>{t(u)===t(R).id?Ne(he):Ne(Le,-1)})}z(()=>Pt($e,`padding:14px 16px;${t(ke){t(s)?Q(Ft):t(B).length===0?Q(Lt,1):Q(Ut,-1)})}var Kt=i(It,2),Nt=i(r(Kt),2),qt=i(r(Nt),3);z(()=>{h(we,t(C)?"Abbrechen":"⇩ Import"),h(ge,t(o)?"Abbrechen":"+ Eintrag")}),k("click",oe,()=>{d(C,!t(C)),d(o,!1),d(b,"")}),k("click",it,()=>{d(o,!t(o)),d(C,!1),d(v,"")}),k("click",qt,Q=>{var me;Q.preventDefault(),(me=document.querySelector(".nav-item[data-view='connect']"))==null||me.click()}),f(e,tt),$n()}qn(["click","keydown"]);var ts=g(' '),Tv=g(`
    Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B. + „Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades".
    `),zv=g(' '),Pv=g(`
    `),$v=g('
    '),Dv=g('
    Keine Skills geladen (oder Agent offline).
    '),Iv=g(' '),Lv=g(' '),Ov=g('
    '),Bv=g('
    '),Rv=g('

    Agent-Cockpit

    Status
    Hermes-Gateway-Dienst (:8642) auf dem Bosgame
    Geplante Aufgaben
    Skills
    '),Fv=g('
    pip install faster-whisper
    '),Kv=g('
    '),Nv=g('
    4. Bosgame-Key eintragen (in Windows PowerShell):
    '),qv=g('
    SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
    '),Vv=g('
    Einrichtung (einmalig, ~3 Minuten):
    1. PowerShell als Admin — OpenSSH Server installieren:
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    2. Dienst starten und dauerhaft aktivieren:
    3. SSH-Ordner erstellen:
    5. Windows-IP in Mission Control Env-Var setzen:
    HERMES_WINDOWS_HOST=192.168.178.XXX
    '),Wv=g('

    Hermes Setup-Wizard

    Whisper (Sprache → Text)
    faster-whisper muss auf dem Bosgame installiert sein
    Piper TTS (Text → Sprache)
    Piper-Binary + deutsche Stimme
    Windows SSH-Verbindung
    Damit Hermes Dateien auf deinem Windows-PC ändern kann
    '),Gv=g(''),jv=g('
    Hermes ist bereit
    Stelle eine Frage oder gib einen Auftrag — per Text oder Sprache.
    '),Uv=g(`
    `),Bv=b(`
    `),Hv=g(`
    H
    `),Rv=b(` `),Fv=b(`
    `),Kv=b('
    '),Nv=b(`
    `),qv=b(`
    `),Jv=g(` `),Qv=g(`
    `),Zv=g('
    '),Yv=g(`
    `),Xv=g(`
    H
    denkt nach…
    `),Vv=b(''),Wv=b(''),Gv=b('
    '),jv=b('

    Hermes

    Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
    ',1);function Uv(e,n){Pn(n,!0);const a="hermes_chat_history";let s=L(Jt((()=>{try{return JSON.parse(sessionStorage.getItem(a)||"[]")}catch{return[]}})())),l=L(""),o=L(!1),v=L(!1),d=L(!1),u=L(!1),p=L(null),_=L(!1),C=L(""),m=L(null),y=L("");Ga(()=>{try{sessionStorage.setItem(a,JSON.stringify(t(s)))}catch{}});function $(){const z=location.protocol==="https:"?"wss:":"ws:",R=localStorage.getItem("mc_token")||"",x=`${z}//${location.host}/api/hermes/chat${R?"?token="+R:""}`,P=new WebSocket(x);P.onmessage=N=>{const j=JSON.parse(N.data);if(j.type==="thinking")c(o,!0);else if(j.type!=="info")if(j.type==="token"){c(o,!1),c(y,t(y)+j.content);const H=t(s)[t(s).length-1];(H==null?void 0:H.role)==="hermes"?c(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)}],!0):c(s,[...t(s),{role:"hermes",content:t(y)}],!0)}else if(j.type==="tool_call"){c(o,!1);const H=j.args||{},fe=Object.values(H).join(" ").slice(0,60);c(s,[...t(s),{role:"tool",content:fe,tool:j.name}],!0)}else if(j.type==="tool_result"){const H=[...t(s)].reverse().find(fe=>fe.role==="tool"&&fe.tool===j.name);H&&(H.content=j.content),c(s,[...t(s)],!0)}else j.type==="error"?(c(o,!1),c(s,[...t(s),{role:"error",content:j.content}],!0)):j.type==="done"&&(c(o,!1),c(v,!1),c(y,""),t(d)&&X())},P.onclose=()=>{c(m,null),setTimeout($,3e3)},P.onerror=()=>P.close(),c(m,P,!0)}function O(){var z;c(v,!0),c(o,!1),t(y)&&c(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)+" ✋"}],!0),c(y,""),(z=t(m))==null||z.close()}async function M(){const z=t(l).trim();!z||!t(m)||t(m).readyState!==1||(c(s,[...t(s),{role:"user",content:z}],!0),c(l,""),c(y,""),c(v,!1),t(m).send(JSON.stringify({message:z})))}function F(){c(s,[],!0),c(y,"");try{sessionStorage.removeItem(a)}catch{}}let ye=null,xe=[];async function ke(){try{const z=await navigator.mediaDevices.getUserMedia({audio:!0});xe=[],ye=new MediaRecorder(z),ye.ondataavailable=R=>xe.push(R.data),ye.onstop=()=>{z.getTracks().forEach(R=>R.stop()),Z()},ye.start(),c(u,!0)}catch(z){ie("Mikrofon-Zugriff verweigert: "+z.message,!0)}}function Ie(){ye==null||ye.stop(),c(u,!1)}async function Z(){const z=new Blob(xe,{type:"audio/webm"}),R=new FormData;R.append("audio",z,"voice.webm");try{const P=await(await fetch("/api/hermes/transcribe",{method:"POST",headers:localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{},body:R})).json();P.text?(c(l,P.text,!0),M()):ie("Konnte Audio nicht verstehen.",!0)}catch(x){ie("Transkription fehlgeschlagen: "+x.message,!0)}}async function X(){const z=[...t(s)].reverse().find(R=>R.role==="hermes");if(z)try{const R=await fetch("/api/hermes/tts",{method:"POST",headers:{"Content-Type":"application/json",...localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{}},body:JSON.stringify({text:z.content})});if(!R.ok)return;const x=await R.blob(),P=URL.createObjectURL(x),N=new Audio(P);N.onended=()=>URL.revokeObjectURL(P),N.play()}catch{}}async function ve(){try{c(p,await De("/api/hermes/status"),!0)}catch{c(p,null)}}async function ze(){try{const z=await De("/api/hermes/pubkey");c(C,z.pubkey,!0)}catch{c(C,"")}}function Re(z){return{read_file:"📄 Lese Datei",list_directory:"📁 Liste Verzeichnis",run_command:"⚡ Befehl",get_system_status:"📊 System-Status",get_memories:"🧠 Gedächtnis",add_memory:"💾 Speichern",web_search:"🌐 Websuche"}[z]||z}function je(){var z;(z=navigator.clipboard)==null||z.writeText(t(C)),ie("SSH-Key kopiert")}Ga(()=>{$(),ve()});var ot=jv(),I=Xe(ot),re=i(r(I),2),be=r(re),Je=r(be),de=i(be,2),Fe=r(de),ue=i(de,2),at=r(ue),Qe=i(ue,2),it=i(I,2);{var dt=z=>{var R=$v(),x=i(r(R),2),P=r(x),N=i(r(P),2),j=r(N),H=i(P,2);{var fe=ne=>{var he=Cv();f(ne,he)};q(H,ne=>{var he;((he=t(p))==null?void 0:he.whisper)==="not_installed"&&ne(fe)})}var me=i(x,2),w=r(me),K=i(r(w),2),ee=r(K),we=i(w,2);{var Se=ne=>{var he=Tv(),Ne=r(he),We=r(Ne);D(Ee=>g(We,Ee),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` -`)]),f(ne,he)};q(we,ne=>{var he;((he=t(p))==null?void 0:he.piper)!=="ready"&&ne(Se)})}var ft=i(me,2),st=r(ft),Ue=i(r(st),2),T=r(Ue),Q=i(st,2);{var Be=ne=>{var he=Dv(),Ne=i(r(he),4),We=i(r(Ne),2),Ee=r(We);Ee.textContent=`Start-Service sshd -Set-Service -Name sshd -StartupType Automatic`;var W=i(Ne,2),J=i(r(W),2),le=r(J);le.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var oe=i(W,2);{var $e=se=>{var ce=zv(),wt=i(r(ce),2),St=r(wt),Bt=i(St,2),hn=r(Bt),da=r(hn);D(()=>g(da,'echo "'+t(C)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),k("click",St,je),f(se,ce)},Le=se=>{var ce=Pv();f(se,ce)};q(oe,se=>{t(C)?se($e):se(Le,-1)})}var Te=i(oe,4);k("click",Te,()=>{ve(),ie("Status aktualisiert")}),f(ne,he)};q(Q,ne=>{var he;(he=t(p))!=null&&he.ssh_ok||ne(Be)})}D(()=>{var ne,he,Ne,We,Ee,W;$t(N,`font-size:11px;${((ne=t(p))==null?void 0:ne.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),g(j,((he=t(p))==null?void 0:he.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),$t(K,`font-size:11px;${((Ne=t(p))==null?void 0:Ne.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),g(ee,((We=t(p))==null?void 0:We.piper)==="ready"?"✓ OK":"✗ fehlt"),$t(Ue,`font-size:11px;${(Ee=t(p))!=null&&Ee.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),g(T,(W=t(p))!=null&&W.ssh_ok?"✓ verbunden":"optional")}),f(z,R)};q(it,z=>{t(_)&&z(dt)})}var rt=i(it,2),Tt=r(rt),zt=r(Tt);{var Wt=z=>{var R=Lv(),x=i(r(R),4);Ye(x,20,()=>["Was läuft gerade auf dem System?","Zeig mir den Inhalt von /etc/llama-swap/config.yaml","Suche nach den neuesten Qwen3-Modellen"],lt,(P,N)=>{var j=Iv(),H=r(j);D(()=>g(H,N)),k("click",j,()=>{c(l,N,!0),M()}),f(P,j)}),f(z,R)};q(zt,z=>{t(s).length===0&&z(Wt)})}var qt=i(zt,2);Ye(qt,16,()=>t(s),z=>z,(z,R)=>{var x=Ha(),P=Xe(x);{var N=w=>{var K=Ov(),ee=r(K),we=r(ee);D(()=>g(we,R.content)),f(w,K)},j=w=>{var K=Bv(),ee=i(r(K),2),we=r(ee);D(()=>g(we,R.content)),f(w,K)},H=w=>{var K=Fv(),ee=r(K),we=r(ee),Se=i(ee,2);{var ft=st=>{var Ue=Rv(),T=r(Ue);D(()=>g(T,R.content)),f(st,Ue)};q(Se,st=>{R.content&&st(ft)})}D(st=>g(we,st),[()=>Re(R.tool||"")]),f(w,K)},fe=w=>{var K=Kv(),ee=r(K);D(()=>g(ee,R.content)),f(w,K)},me=w=>{var K=Nv(),ee=r(K);D(()=>g(ee,`⚠ ${R.content??""}`)),f(w,K)};q(P,w=>{R.role==="user"?w(N):R.role==="hermes"?w(j,1):R.role==="tool"?w(H,2):R.role==="info"?w(fe,3):R.role==="error"&&w(me,4)})}f(z,x)});var Gt=i(qt,2);{var Lt=z=>{var R=qv();f(z,R)};q(Gt,z=>{t(o)&&z(Lt)})}var Ot=i(Tt,2),U=r(Ot),ae=i(U,2),A=r(ae),B=i(ae,2);{var _e=z=>{var R=Vv();k("click",R,O),f(z,R)},Ce=z=>{var R=Wv();D(x=>R.disabled=x,[()=>!t(l).trim()||!t(m)||t(m).readyState!==1]),k("click",R,M),f(z,R)};q(B,z=>{t(o)||t(v)?z(_e):z(Ce,-1)})}var V=i(Ot,2);{var pe=z=>{var R=Gv(),x=r(R);k("click",x,F),f(z,R)};q(V,z=>{t(s).length>0&&!t(o)&&z(pe)})}D(()=>{var z,R,x,P,N,j;$t(be,`font-size:11px;${((z=t(p))==null?void 0:z.whisper)==="ready"||((R=t(p))==null?void 0:R.whisper)==="installed"?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Je,`🎙 Whisper: ${((x=t(p))==null?void 0:x.whisper)??"…"??""}`),$t(de,`font-size:11px;${(P=t(p))!=null&&P.ssh_ok?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Fe,`🔑 SSH: ${(N=t(p))!=null&&N.ssh_ok?"verbunden":(j=t(p))!=null&&j.ssh_configured?"Fehler":"nicht eingerichtet"}`),$t(ue,`padding:4px 12px;font-size:12px;${t(d)?"border-color:var(--accent);color:var(--accent)":""}`),g(at,`🔊 Voice ${t(d)?"an":"aus"}`),$t(ae,`padding:10px 12px;flex-shrink:0;font-size:18px;line-height:1; - ${t(u)?"border-color:var(--err);color:var(--err)":""}`),Aa(ae,"title",t(u)?"Aufnahme stoppen":"Spracheingabe"),g(A,t(u)?"⏹":"🎤")}),k("click",ue,()=>c(d,!t(d))),k("click",Qe,()=>{c(_,!t(_)),t(_)&&(ve(),ze())}),k("keydown",U,z=>{z.key==="Enter"&&!z.shiftKey&&(z.preventDefault(),M())}),an(U,()=>t(l),z=>c(l,z)),k("mousedown",ae,ke),k("mouseup",ae,Ie),k("touchstart",ae,ke),k("touchend",ae,Ie),f(e,ot),Dn()}qn(["click","keydown","mousedown","mouseup","touchstart","touchend"]);let ts={};function Hv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ns(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),as("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const v=["running","ready","loading","starting"],d=(e.models||[]).find(p=>v.includes(p.state));if(s)if(d){const p=(l=d.meta)!=null&&l.ctx?` · ${Math.round(d.meta.ctx/1024)}k ctx`:"",_=d.state==="loading"||d.state==="starting"?' lädt…':"";s.innerHTML=`${d.name}${p}${_}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?Yv():as(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const p of e.models||[])u[p.name]=p.state;for(const[p,_]of Object.entries(u)){const C=ts[p];if(C&&C!==_&&(_==="running"||_==="loading")){Hv();break}}ts=u}Jv(e),xi.set(e)}function Jv(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Qv(e){fa.set(e||[])}function Zv(e){Dr.set(e)}function as(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function Yv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const Xv=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>Xv(a),l}async function al(){try{const e=await De("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Wi(){try{ns(await De("/api/status"))}catch{ns(null)}}async function il(){try{Qv(await De("/api/jobs"))}catch{}}function rl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{Zv(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(rl,3e3)},n.onerror=()=>n.close()}var ds;((ds=document.getElementById("logo"))==null?void 0:ds.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Vi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Vi[e.dataset.ic||""]||""});const eu=[["overview",ud],["models",Ad],["activity",Rd],["server",Hd],["cookbook",zc],["connect",Zc],["news",lv],["guides",fv],["memory",Av],["hermes",Uv]];for(const[e,n]of eu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Mo(n,{target:a})}Uo("overview");const ar=document.getElementById("token");ar&&(ar.value=nl(),ar.addEventListener("change",e=>{qo(e.target.value),Wi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=ci(),ir.addEventListener("change",e=>Wo(e.target.value)));const is=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),rs=document.getElementById("sm-close");is&&rr&&rs&&(is.addEventListener("click",()=>rr.style.display="flex"),rs.addEventListener("click",()=>rr.style.display="none"));function tu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Wi);Wi();il();rl();setInterval(tu,1e3);setInterval(Wi,3e3);setInterval(il,1500);al();setInterval(al,6e4); + justify-content:center;font-size:14px" class="svelte-h40163">H
    denkt nach…
    `),eu=g(''),tu=g(''),nu=g('
    '),au=g('

    Hermes

    Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
    ',1);function iu(e,n){Pn(n,!0);const a="hermes_chat_history";let s=$(Gt((()=>{try{return JSON.parse(sessionStorage.getItem(a)||"[]")}catch{return[]}})())),l=$(""),o=$(!1),v=$(!1),c=$(!1),u=$(!1),p=$(null),_=$(!1),C=$(!1),b=$(!1),x=$(null),D=$(Gt([])),O=$(Gt([])),E=$(""),B=$(null),xe=$("");ja(()=>{try{sessionStorage.setItem(a,JSON.stringify(t(s)))}catch{}});function Me(){const y=location.protocol==="https:"?"wss:":"ws:",L=localStorage.getItem("mc_token")||"",Y=`${y}//${location.host}/api/hermes/chat${L?"?token="+L:""}`,Se=new WebSocket(Y);Se.onmessage=Ge=>{const ve=JSON.parse(Ge.data);if(ve.type==="thinking")d(o,!0);else if(ve.type!=="info")if(ve.type==="token"){d(o,!1),d(xe,t(xe)+ve.content);const M=t(s)[t(s).length-1];(M==null?void 0:M.role)==="hermes"?d(s,[...t(s).slice(0,-1),{role:"hermes",content:t(xe)}],!0):d(s,[...t(s),{role:"hermes",content:t(xe)}],!0)}else if(ve.type==="tool_call"){d(o,!1);const M=ve.args||{},W=Object.values(M).join(" ").slice(0,60);d(s,[...t(s),{role:"tool",content:W,tool:ve.name}],!0)}else if(ve.type==="tool_result"){const M=[...t(s)].reverse().find(W=>W.role==="tool"&&W.tool===ve.name);M&&(M.content=ve.content),d(s,[...t(s)],!0)}else ve.type==="error"?(d(o,!1),d(s,[...t(s),{role:"error",content:ve.content}],!0)):ve.type==="done"&&(d(o,!1),d(v,!1),d(xe,""),t(c)&&_t())},Se.onclose=()=>{d(B,null),setTimeout(Me,3e3)},Se.onerror=()=>Se.close(),d(B,Se,!0)}function Ae(){var y;d(v,!0),d(o,!1),t(xe)&&d(s,[...t(s).slice(0,-1),{role:"hermes",content:t(xe)+" ✋"}],!0),d(xe,""),(y=t(B))==null||y.close()}async function Re(){const y=t(l).trim();!y||!t(B)||t(B).readyState!==1||(d(s,[...t(s),{role:"user",content:y}],!0),d(l,""),d(xe,""),d(v,!1),t(B).send(JSON.stringify({message:y})))}function ne(){d(s,[],!0),d(xe,"");try{sessionStorage.removeItem(a)}catch{}}let J=null,fe=[];async function Ie(){try{const y=await navigator.mediaDevices.getUserMedia({audio:!0});fe=[],J=new MediaRecorder(y),J.ondataavailable=L=>fe.push(L.data),J.onstop=()=>{y.getTracks().forEach(L=>L.stop()),tt()},J.start(),d(u,!0)}catch(y){le("Mikrofon-Zugriff verweigert: "+y.message,!0)}}function We(){J==null||J.stop(),d(u,!1)}async function tt(){const y=new Blob(fe,{type:"audio/webm"}),L=new FormData;L.append("audio",y,"voice.webm");try{const Se=await(await fetch("/api/hermes/transcribe",{method:"POST",headers:localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{},body:L})).json();Se.text?(d(l,Se.text,!0),Re()):le("Konnte Audio nicht verstehen.",!0)}catch(Y){le("Transkription fehlgeschlagen: "+Y.message,!0)}}async function _t(){const y=[...t(s)].reverse().find(L=>L.role==="hermes");if(y)try{const L=await fetch("/api/hermes/tts",{method:"POST",headers:{"Content-Type":"application/json",...localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{}},body:JSON.stringify({text:y.content})});if(!L.ok)return;const Y=await L.blob(),Se=URL.createObjectURL(Y),Ge=new Audio(Se);Ge.onended=()=>URL.revokeObjectURL(Se),Ge.play()}catch{}}async function I(){try{d(p,await Pe("/api/hermes/status"),!0)}catch{d(p,null)}}async function oe(){try{const y=await Pe("/api/hermes/pubkey");d(E,y.pubkey,!0)}catch{d(E,"")}}async function we(){d(b,!0);try{const[y,L,Y]=await Promise.all([Pe("/api/hermes/agent"),Pe("/api/hermes/cron"),Pe("/api/hermes/skills")]);d(x,y,!0),d(D,L.jobs||[],!0),d(O,Y.skills||[],!0)}catch{d(x,null)}d(b,!1)}let it=N(()=>[...t(O)].sort((y,L)=>(L.use_count||0)-(y.use_count||0)||(y.name||"").localeCompare(L.name||""))),ge=N(()=>t(O).filter(y=>(y.status||"").includes("enabled")).length);function He(y){return{read_file:"📄 Lese Datei",list_directory:"📁 Liste Verzeichnis",run_command:"⚡ Befehl",get_system_status:"📊 System-Status",get_memories:"🧠 Gedächtnis",add_memory:"💾 Speichern",web_search:"🌐 Websuche"}[y]||y}function ye(){var y;(y=navigator.clipboard)==null||y.writeText(t(E)),le("SSH-Key kopiert")}ja(()=>{Me(),I()});var dt=au(),rt=ot(dt),mt=i(r(rt),2),ct=r(mt),ft=r(ct),It=i(ct,2),Ft=r(It),Lt=i(It,2),Ut=r(Lt),Kt=i(Lt,2),Nt=i(Kt,2),qt=i(rt,2);{var Q=y=>{var L=Rv(),Y=r(L),Se=i(r(Y),2),Ge=r(Se),ve=i(Y,2),M=r(ve),W=i(r(M),2),Te=r(W),X=r(Te),pe=i(Te,2),De=r(pe),je=i(pe,2);{var Oe=j=>{var ue=ts(),Je=r(ue);z(()=>h(Je,`Ticker vor ${t(x).heartbeat_age_s??""}s`)),f(j,ue)};F(je,j=>{var ue;((ue=t(x))==null?void 0:ue.heartbeat_age_s)!=null&&j(Oe)})}var G=i(je,2);{var V=j=>{var ue=ts(),Je=r(ue);z(()=>h(Je,`v${t(x).version??""}`)),f(j,ue)};F(G,j=>{var ue;(ue=t(x))!=null&&ue.version&&j(V)})}var ae=i(ve,2),re=r(ae),Be=r(re),Fe=i(r(Be)),de=r(Fe),H=i(re,2);{var se=j=>{var ue=Tv();f(j,ue)},vt=j=>{var ue=$v();Xe(ue,21,()=>t(D),lt,(Je,ie)=>{var ze=Pv();Xe(ze,21,()=>Object.entries(t(ie)),lt,(Ue,ut)=>{var Ze=N(()=>Jn(t(ut),2));let nt=()=>t(Ze)[0],gt=()=>t(Ze)[1];var Ct=Aa(),Zt=ot(Ct);{var xt=Qe=>{var st=zv(),Mt=r(st),bt=r(Mt),qe=i(Mt);z(()=>{h(bt,`${nt()??""}:`),h(qe,` ${gt()??""}`)}),f(Qe,st)};F(Zt,Qe=>{gt()&&Qe(xt)})}f(Ue,Ct)}),f(Je,ze)}),f(j,ue)};F(H,j=>{t(D).length===0?j(se):j(vt,-1)})}var ht=i(ae,2),St=r(ht),ln=r(St),Vn=i(r(ln)),S=r(Vn),w=i(St,2);{var ee=j=>{var ue=Dv();f(j,ue)},Z=j=>{var ue=Bv();Xe(ue,21,()=>t(it),lt,(Je,ie)=>{var ze=Ov(),Ue=r(ze),ut=i(Ue,2),Ze=r(ut),nt=i(ut,2);{var gt=st=>{var Mt=Iv(),bt=r(Mt);z(()=>h(bt,t(ie).category)),f(st,Mt)};F(nt,st=>{t(ie).category&&st(gt)})}var Ct=i(nt,4);{var Zt=st=>{var Mt=Lv(),bt=r(Mt);z(()=>h(bt,`${t(ie).use_count??""}× genutzt`)),f(st,Mt)};F(Ct,st=>{t(ie).use_count>0&&st(Zt)})}var xt=i(Ct,2),Qe=r(xt);z((st,Mt)=>{Pt(ze,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; + border-radius:6px;${st??""}`),Pt(Ue,`width:7px;height:7px;border-radius:50%;flex-shrink:0; + background:${Mt??""}`),h(Ze,t(ie).name),h(Qe,t(ie).source)},[()=>(t(ie).status||"").includes("enabled")?"":"opacity:.45",()=>(t(ie).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),f(Je,ze)}),f(j,ue)};F(w,j=>{t(O).length===0?j(ee):j(Z,-1)})}z(()=>{var j,ue,Je,ie;h(Ge,t(b)?"…":"↻ Aktualisieren"),Pt(Te,`font-size:11px;${((j=t(x))==null?void 0:j.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(X,`● ${((ue=t(x))==null?void 0:ue.gateway_state)??"offline"??""}`),Pt(pe,`font-size:11px;${(Je=t(x))!=null&&Je.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(De,`⏱ Scheduler ${(ie=t(x))!=null&&ie.cron_running?"läuft":"inaktiv"}`),h(de,`(${t(D).length??""})`),h(S,`(${t(ge)??""} aktiv von ${t(O).length??""})`)}),k("click",Se,we),f(y,L)};F(qt,y=>{t(C)&&y(Q)})}var me=i(qt,2);{var A=y=>{var L=Wv(),Y=i(r(L),2),Se=r(Y),Ge=i(r(Se),2),ve=r(Ge),M=i(Se,2);{var W=de=>{var H=Fv();f(de,H)};F(M,de=>{var H;((H=t(p))==null?void 0:H.whisper)==="not_installed"&&de(W)})}var Te=i(Y,2),X=r(Te),pe=i(r(X),2),De=r(pe),je=i(X,2);{var Oe=de=>{var H=Kv(),se=r(H),vt=r(se);z(ht=>h(vt,ht),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` +`)]),f(de,H)};F(je,de=>{var H;((H=t(p))==null?void 0:H.piper)!=="ready"&&de(Oe)})}var G=i(Te,2),V=r(G),ae=i(r(V),2),re=r(ae),Be=i(V,2);{var Fe=de=>{var H=Vv(),se=i(r(H),4),vt=i(r(se),2),ht=r(vt);ht.textContent=`Start-Service sshd +Set-Service -Name sshd -StartupType Automatic`;var St=i(se,2),ln=i(r(St),2),Vn=r(ln);Vn.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var S=i(St,2);{var w=j=>{var ue=Nv(),Je=i(r(ue),2),ie=r(Je),ze=i(ie,2),Ue=r(ze),ut=r(Ue);z(()=>h(ut,'echo "'+t(E)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),k("click",ie,ye),f(j,ue)},ee=j=>{var ue=qv();f(j,ue)};F(S,j=>{t(E)?j(w):j(ee,-1)})}var Z=i(S,4);k("click",Z,()=>{I(),le("Status aktualisiert")}),f(de,H)};F(Be,de=>{var H;(H=t(p))!=null&&H.ssh_ok||de(Fe)})}z(()=>{var de,H,se,vt,ht,St;Pt(Ge,`font-size:11px;${((de=t(p))==null?void 0:de.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),h(ve,((H=t(p))==null?void 0:H.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),Pt(pe,`font-size:11px;${((se=t(p))==null?void 0:se.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),h(De,((vt=t(p))==null?void 0:vt.piper)==="ready"?"✓ OK":"✗ fehlt"),Pt(ae,`font-size:11px;${(ht=t(p))!=null&&ht.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),h(re,(St=t(p))!=null&&St.ssh_ok?"✓ verbunden":"optional")}),f(y,L)};F(me,y=>{t(_)&&y(A)})}var R=i(me,2),ke=r(R),$e=r(ke);{var q=y=>{var L=jv(),Y=i(r(L),4);Xe(Y,20,()=>["Was läuft gerade auf dem System?","Zeig mir den Inhalt von /etc/llama-swap/config.yaml","Suche nach den neuesten Qwen3-Modellen"],lt,(Se,Ge)=>{var ve=Gv(),M=r(ve);z(()=>h(M,Ge)),k("click",ve,()=>{d(l,Ge,!0),Re()}),f(Se,ve)}),f(y,L)};F($e,y=>{t(s).length===0&&y(q)})}var he=i($e,2);Xe(he,16,()=>t(s),y=>y,(y,L)=>{var Y=Aa(),Se=ot(Y);{var Ge=X=>{var pe=Uv(),De=r(pe),je=r(De);z(()=>h(je,L.content)),f(X,pe)},ve=X=>{var pe=Hv(),De=i(r(pe),2),je=r(De);z(()=>h(je,L.content)),f(X,pe)},M=X=>{var pe=Qv(),De=r(pe),je=r(De),Oe=i(De,2);{var G=V=>{var ae=Jv(),re=r(ae);z(()=>h(re,L.content)),f(V,ae)};F(Oe,V=>{L.content&&V(G)})}z(V=>h(je,V),[()=>He(L.tool||"")]),f(X,pe)},W=X=>{var pe=Zv(),De=r(pe);z(()=>h(De,L.content)),f(X,pe)},Te=X=>{var pe=Yv(),De=r(pe);z(()=>h(De,`⚠ ${L.content??""}`)),f(X,pe)};F(Se,X=>{L.role==="user"?X(Ge):L.role==="hermes"?X(ve,1):L.role==="tool"?X(M,2):L.role==="info"?X(W,3):L.role==="error"&&X(Te,4)})}f(y,Y)});var Le=i(he,2);{var Ne=y=>{var L=Xv();f(y,L)};F(Le,y=>{t(o)&&y(Ne)})}var T=i(ke,2),K=r(T),U=i(K,2),be=r(U),ce=i(U,2);{var Ce=y=>{var L=eu();k("click",L,Ae),f(y,L)},Ee=y=>{var L=tu();z(Y=>L.disabled=Y,[()=>!t(l).trim()||!t(B)||t(B).readyState!==1]),k("click",L,Re),f(y,L)};F(ce,y=>{t(o)||t(v)?y(Ce):y(Ee,-1)})}var P=i(T,2);{var te=y=>{var L=nu(),Y=r(L);k("click",Y,ne),f(y,L)};F(P,y=>{t(s).length>0&&!t(o)&&y(te)})}z(()=>{var y,L,Y,Se,Ge,ve;Pt(ct,`font-size:11px;${((y=t(p))==null?void 0:y.whisper)==="ready"||((L=t(p))==null?void 0:L.whisper)==="installed"?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(ft,`🎙 Whisper: ${((Y=t(p))==null?void 0:Y.whisper)??"…"??""}`),Pt(It,`font-size:11px;${(Se=t(p))!=null&&Se.ssh_ok?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Ft,`🔑 SSH: ${(Ge=t(p))!=null&&Ge.ssh_ok?"verbunden":(ve=t(p))!=null&&ve.ssh_configured?"Fehler":"nicht eingerichtet"}`),Pt(Lt,`padding:4px 12px;font-size:12px;${t(c)?"border-color:var(--accent);color:var(--accent)":""}`),h(Ut,`🔊 Voice ${t(c)?"an":"aus"}`),Pt(Kt,`padding:4px 10px;font-size:12px;${t(C)?"border-color:var(--accent);color:var(--accent)":""}`),Pt(U,`padding:10px 12px;flex-shrink:0;font-size:18px;line-height:1; + ${t(u)?"border-color:var(--err);color:var(--err)":""}`),Ca(U,"title",t(u)?"Aufnahme stoppen":"Spracheingabe"),h(be,t(u)?"⏹":"🎤")}),k("click",Lt,()=>d(c,!t(c))),k("click",Kt,()=>{d(C,!t(C)),t(C)&&we()}),k("click",Nt,()=>{d(_,!t(_)),t(_)&&(I(),oe())}),k("keydown",K,y=>{y.key==="Enter"&&!y.shiftKey&&(y.preventDefault(),Re())}),rn(K,()=>t(l),y=>d(l,y)),k("mousedown",U,Ie),k("mouseup",U,We),k("touchstart",U,Ie),k("touchend",U,We),f(e,dt),$n()}qn(["click","keydown","mousedown","mouseup","touchstart","touchend"]);let ns={};function ru(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function as(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),is("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const v=["running","ready","loading","starting"],c=(e.models||[]).find(p=>v.includes(p.state));if(s)if(c){const p=(l=c.meta)!=null&&l.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",_=c.state==="loading"||c.state==="starting"?' lädt…':"";s.innerHTML=`${c.name}${p}${_}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?du():is(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const p of e.models||[])u[p.name]=p.state;for(const[p,_]of Object.entries(u)){const C=ns[p];if(C&&C!==_&&(_==="running"||_==="loading")){ru();break}}ns=u}su(e),yi.set(e)}function su(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function lu(e){fa.set(e||[])}function ou(e){$r.set(e)}function is(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function du(){const e=document.getElementById("alert");e&&(e.style.display="none")}const cu=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>cu(a),l}async function il(){try{const e=await Pe("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Wi(){try{as(await Pe("/api/status"))}catch{as(null)}}async function rl(){try{lu(await Pe("/api/jobs"))}catch{}}function sl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{ou(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(sl,3e3)},n.onerror=()=>n.close()}var cs;((cs=document.getElementById("logo"))==null?void 0:cs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Vi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Vi[e.dataset.ic||""]||""});const vu=[["overview",pd],["models",Cd],["activity",Fd],["server",Jd],["cookbook",Pc],["connect",Yc],["news",ov],["guides",hv],["memory",Cv],["hermes",iu]];for(const[e,n]of vu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Eo(n,{target:a})}Ho("overview");const ar=document.getElementById("token");ar&&(ar.value=al(),ar.addEventListener("change",e=>{Vo(e.target.value),Wi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=ci(),ir.addEventListener("change",e=>Go(e.target.value)));const rs=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),ss=document.getElementById("sm-close");rs&&rr&&ss&&(rs.addEventListener("click",()=>rr.style.display="flex"),ss.addEventListener("click",()=>rr.style.display="none"));function uu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Wi);Wi();rl();sl();setInterval(uu,1e3);setInterval(Wi,3e3);setInterval(rl,1500);il();setInterval(il,6e4);