From 40d9efee187eb3891b90798ae5602b2c3dbb7f0c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Wed, 24 Jun 2026 16:20:19 +0200 Subject: [PATCH] docs(v9): Phase 4 (Agent-Cockpit) dokumentiert + Versions-Chip-Fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HermesPanel: version-Chip zeigt PINNED_VERSION ohne doppeltes "v". - ROADMAP/CLAUDE.md: Phase 4 als live markiert, HERMES_HOME/BIN ergänzt. Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 7 ++-- ROADMAP.md | 2 +- frontend/src/panels/HermesPanel.svelte | 2 +- static/dist/main.js | 44 +++++++++++++------------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 78f4651..3fa16c6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,7 +23,8 @@ FastAPI-Backend + Svelte 5-Frontend (Vite-Build). **Leitprinzip: KISS — SoC oh - `integration.py` — test (Engine-Verbindungstest) - `news.py` — RSS-Aggregation via stdlib - `memory.py` — Gedächtnis-CRUD (SQLite, WAL-Mode), 5 Kategorien - - `hermes.py` — Chat-WS **proxyt zum Hermes-Agent-Server (:8642)** + transcribe(Whisper)/tts(Piper)/status/pubkey + - `hermes.py` — Chat-WS **proxyt zum Hermes-Agent-Server (:8642)** + transcribe(Whisper)/tts(Piper)/status/pubkey + **Cockpit-Reads** agent/cron/skills (Phase 4) +- **`hermes_control.py`** — read-only Control-Plane: liest Agent-Status (`gateway_state.json` + Cron-Heartbeat), Cron-Jobs & Skills via `hermes`-CLI (`COLUMNS=400`, Rich-Tabelle geparst). TTL-Cache. **Frontend** (`frontend/src/`, Svelte 5 + Vite, Build → `static/dist/`): - **`index.html`** — Gerüst: Sidebar-Nav (10 Tabs), Topbar, Alert-Banner, View-Container je Bereich. @@ -86,6 +87,8 @@ Oder über den Self-Update-Button in Mission Control (empfohlen). | `MC_MEMORY_DB` | `{MODELS_DIR}/mission-control-memory.db` | SQLite Gedächtnis | | `HERMES_API_URL` | `http://127.0.0.1:8642/v1` | Hermes-Agent-Server (OpenAI-API) | | `HERMES_API_KEY` | aus `~/.hermes/.env` | API-Key des Hermes-Servers (sonst Env) | +| `HERMES_HOME` | `~/.hermes` | Hermes-Agent State-Dir (Cockpit-Reads) | +| `HERMES_BIN` | `~/.local/bin/hermes` | Hermes-CLI (Cron/Skills-Reads) | | `HERMES_WINDOWS_HOST` | leer | Windows-PC IP für SSH | | `HERMES_WINDOWS_USER` | `TobisPC` | Windows SSH-Username | | `HERMES_SSH_KEY` | `~/.ssh/id_ed25519_hermes_agent` | SSH-Key für Hermes | @@ -124,7 +127,7 @@ Oder über den Self-Update-Button in Mission Control (empfohlen). **v8.1 (Bug-Fix)**: system_status-Keys, Model-Routing, asyncio, sudo-PW für Engine-Update, Chat-History in sessionStorage. **v8.2 (UX)**: Guide-Tabs + Begriffe oben, Mobile Bottom-Nav (≤520px), Download-Links, ConnectPanel-Fixes. **v8.3 (Memory Import)**: Import aus Cloud-KIs (Claude/Gemini/ChatGPT) — zeilenweiser Batch-POST. -**v9 (Hermes-Agent-Adoption, Entscheidung 2026-06-23)**: Eigenbau-Agent → Nous Hermes-Agent-Framework (MIT). MC wird Control-Plane. Eigenes Memory bleibt via MCP erhalten. Phasen 0–2 live + Phase 3 (harter Cutover): `hermes_agent.py` entfernt, `routers/hermes.py` proxyt zu `:8642`, Modell-Routing macht Hermes selbst. Offen: Self-Update auch für `hermes-gateway`, Status-/Scheduler-/Skills-Panels (Phase 4). Siehe ROADMAP v9. +**v9 (Hermes-Agent-Adoption, Entscheidung 2026-06-23)**: Eigenbau-Agent → Nous Hermes-Agent-Framework (MIT). MC wird Control-Plane. Eigenes Memory bleibt via MCP erhalten. Phasen 0–3 live (harter Cutover: `hermes_agent.py` entfernt, `routers/hermes.py` proxyt zu `:8642`) **+ Phase 4 live**: Agent-**Cockpit** in HermesPanel (Status/Cron/Skills) via `hermes_control.py`. Offen: Self-Update auch für `hermes-gateway`, Cockpit-Schreibaktionen (Job/Skill steuern). Siehe ROADMAP v9. Offene v8-Einrichtungsschritte (kein Code, nur Setup): - Piper Binary + Kerstin-Stimme installieren (Befehle im Hermes-Tab → ⚙ Setup) diff --git a/ROADMAP.md b/ROADMAP.md index 5290df4..c350ef6 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -22,7 +22,7 @@ - [x] **Phase 1 — Memory-Bridge (✅ 2026-06-23):** `mcp_memory.py` via `hermes mcp add mission-control-memory --command /opt/mission-control/.venv/bin/python --env MC_URL=http://127.0.0.1:9000 --args …/mcp_memory.py` registriert (5/5 Tools, Test ✓). Erkenntnis: `mcp_memory.py` ist stdio-MCP→HTTP-Wrapper auf MC `/api/memory` — **MC :9000 muss laufen**. Proof: Hermes liest beide Bestands-Memories *und* schrieb neuen Eintrag (verifiziert in SQLite, 2→3). v7/v8.3-Gedächtnis ohne Migration im Agenten. Hinweis: Hermes' **eigenes** Session-Memory läuft zusätzlich → zwei Schichten im Blick behalten. - [x] **Phase 2 — Control-Plane (✅ 2026-06-23):** Hermes als **systemd-User-Service** `hermes-gateway` (`hermes gateway install`, Linger aktiv → boot-/logout-fest, kein sudo). API-Server `:8642` aktiviert (`~/.hermes/.env`: `API_SERVER_ENABLED/KEY/PORT/HOST`). Produktionspfad bewiesen: Tool-Call via `curl :8642/v1/chat/completions`. mcp_memory.py läuft als Kindprozess im Dienst. **UI-Hälfte:** `routers/hermes.py`-Chat-WS proxyt jetzt streamend zu `:8642` (Key aus `~/.hermes/.env`); WS-Contract (`thinking/token/done/error`) beibehalten → **HermesPanel unverändert, kein Frontend-Build nötig**. Status-Endpoint meldet zusätzlich Hermes-Erreichbarkeit. - [x] **Phase 3 — Aufräumen (✅ 2026-06-23, harter Cutover):** `hermes_agent.py` gelöscht (ReAct-Loop, tote Tools, Modell-Routing weg); `config.py` um `HERMES_SIMPLE/COMPLEX_MODEL` bereinigt, `HERMES_API_URL/KEY` ergänzt; `routers/hermes.py` zu reinem Proxy verschlankt. **Rest-offen:** Self-Update auch für `hermes-gateway` (aktuell nur `mission-control`); HermesPanel-Altlast (Windows-SSH-Setup-Sektion) ist nur noch kosmetisch. -- [ ] **Phase 4 — Auszahlung:** Cron-Scheduler + Skills im Dashboard sichtbar machen (das geschenkte v9). +- [x] **Phase 4 — Auszahlung (✅ 2026-06-24):** Agent-**Cockpit** in der HermesPanel (aufklappbar, „📡 Cockpit"). Read-only Control-Plane-Reads in `hermes_control.py` (TTL-Cache 10 s): **Status** aus `~/.hermes/gateway_state.json` + Cron-Heartbeat (Liveness), **Cron-Jobs** via `hermes cron list --all`, **Skills** via `hermes skills list` + `.usage.json` (Nutzungszähler). Rich-Tabellen werden mit `COLUMNS=400` ohne Truncation erzeugt und über `│`/`┃` geparst. Endpunkte `GET /api/hermes/{agent,cron,skills}`. Auf der Box verifiziert: Status `running`/Scheduler aktiv, 71 Skills geparst, 0 Cron-Jobs. **Offen-Rest:** Schreib-Aktionen (Job anlegen/pausieren, Skill an/aus) aus der UI — bewusst später, erst Sichtbarkeit. - [x] **Memory-Feintuning (✅ 2026-06-23):** `~/.hermes/SOUL.md` (Persona, frisch je Nachricht geladen) instruiert Hermes, das MCP-Gedächtnis bei Nutzer-/Projektfragen **proaktiv** via `get_memories` zu konsultieren, bevor er nachfragt — Name/Profil bleiben im Gedächtnis (nicht hart in SOUL.md). Verifiziert: weicher Prompt „nenne meinen Namen" → „Hallo Tobi!". **Hinweis:** SOUL.md liegt auf dem Bosgame (`~/.hermes/`), nicht im Repo — bei Neuaufsetzen mitschreiben. **Entscheidungen (gesetzt):** Memory via MCP einbinden (nicht migrieren) · HermesPanel behalten (nicht hermes-webui, das ist an Interna gekoppelt) · erst Qwen3-coder behalten, dann Hermes-4.3-36B A/B-testen · WebUI = Lockstep-Falle, stattdessen stabiler OpenAI-API-Server. diff --git a/frontend/src/panels/HermesPanel.svelte b/frontend/src/panels/HermesPanel.svelte index bc7fb37..97c8255 100644 --- a/frontend/src/panels/HermesPanel.svelte +++ b/frontend/src/panels/HermesPanel.svelte @@ -316,7 +316,7 @@ Ticker vor {agent.heartbeat_age_s}s {/if} {#if agent?.version} - v{agent.version} + {agent.version.split(' · ')[0]} {/if} diff --git a/static/dist/main.js b/static/dist/main.js index 6f02eb0..f5085fb 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,4 +1,4 @@ -var ll=Object.defineProperty;var Dr=e=>{throw TypeError(e)};var ol=(e,n,a)=>n in e?ll(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a;var un=(e,n,a)=>ol(e,typeof n!="symbol"?n+"":n,a),Ui=(e,n,a)=>n.has(e)||Dr("Cannot "+a);var m=(e,n,a)=>(Ui(e,n,"read from private field"),a?a.call(e):n.get(e)),Ve=(e,n,a)=>n.has(e)?Dr("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(e):n.set(e,a),Ke=(e,n,a,s)=>(Ui(e,n,"write to private field"),s?s.call(e,a):n.set(e,a),a),pt=(e,n,a)=>(Ui(e,n,"access private method"),a);var xr=Array.isArray,dl=Array.prototype.indexOf,zi=Array.prototype.includes,Fi=Array.from,cl=Object.defineProperty,ii=Object.getOwnPropertyDescriptor,vl=Object.getOwnPropertyDescriptors,ul=Object.prototype,pl=Array.prototype,vs=Object.getPrototypeOf,Ir=Object.isExtensible;const fl=()=>{};function hl(e){for(var n=0;n{e=s,n=l});return{promise:a,resolve:e,reject:n}}function Jn(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 nn=2,qa=4,Ki=8,ps=1<<24,Cn=16,zn=32,oa=64,sr=128,kn=512,Qt=1024,en=2048,Kn=4096,sn=8192,wn=16384,Ja=32768,lr=1<<25,Va=65536,Pi=1<<17,gl=1<<18,Qa=1<<19,ml=1<<20,Bn=1<<25,Sa=65536,$i=1<<21,Da=1<<22,la=1<<23,Ia=Symbol("$state"),bl=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);un(this,"name","StaleReactionError");un(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ls;const _l=!!((ls=globalThis.document)!=null&&ls.contentType)&&globalThis.document.contentType.includes("xml");function fs(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function xl(){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 kl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function wl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Sl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Ml(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function El(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Al(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Cl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Tl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const zl=1,Pl=2,hs=4,$l=8,Dl=16,Il=1,Ll=2,Jt=Symbol("uninitialized"),gs="http://www.w3.org/1999/xhtml",Ol="http://www.w3.org/2000/svg",Bl="http://www.w3.org/1998/Math/MathML";function Rl(){console.warn("https://svelte.dev/e/derived_inert")}function Fl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Kl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function ms(e){return e===this.v}function Nl(e,n){return e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function"}function bs(e){return!Nl(e,this.v)}let tn=null;function Wa(e){tn=e}function Pn(e,n=!1,a){tn={p:tn,i:!1,c:null,e:null,s:e,x:null,r:et,l:null}}function $n(e){var n=tn,a=n.e;if(a!==null){n.e=null;for(var s of a)Ks(s)}return n.i=!0,tn=n.p,{}}function _s(){return!0}let va=[];function xs(){var e=va;va=[],hl(e)}function xa(e){if(va.length===0&&!si){var n=va;queueMicrotask(()=>{n===va&&xs()})}va.push(e)}function ql(){for(;va.length>0;)xs()}function ys(e){var n=et;if(n===null)return Ye.f|=la,e;if((n.f&Ja)===0&&(n.f&qa)===0)throw e;ra(e,n)}function ra(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 Vl=-7169;function Wt(e,n){e.f=e.f&Vl|n}function yr(e){(e.f&kn)!==0||e.deps===null?Wt(e,Qt):Wt(e,Kn)}function ks(e){if(e!==null)for(const n of e)(n.f&nn)===0||(n.f&Sa)===0||(n.f^=Sa,ks(n.deps))}function ws(e,n,a){(e.f&en)!==0?n.add(e):(e.f&Kn)!==0&&a.add(e),ks(e.deps),Wt(e,Qt)}function Wl(e){let n=0,a=Ea(0),s;return()=>{Cr()&&(t(a),qi(()=>(n===0&&(s=Za(()=>e(()=>li(a)))),n+=1,()=>{xa(()=>{n-=1,n===0&&(s==null||s(),s=void 0,li(a))})})))}}var Gl=Va|Qa;function jl(e,n,a,s){new Ul(e,n,a,s)}var mn,_r,bn,ha,on,_n,an,fn,Gn,ga,aa,La,pi,fi,jn,Oi,Rt,Hl,Jl,Ql,cr,Ei,Ai,vr,ur;class Ul{constructor(n,a,s,l){Ve(this,Rt);un(this,"parent");un(this,"is_pending",!1);un(this,"transform_error");Ve(this,mn);Ve(this,_r,null);Ve(this,bn);Ve(this,ha);Ve(this,on);Ve(this,_n,null);Ve(this,an,null);Ve(this,fn,null);Ve(this,Gn,null);Ve(this,ga,0);Ve(this,aa,0);Ve(this,La,!1);Ve(this,pi,new Set);Ve(this,fi,new Set);Ve(this,jn,null);Ve(this,Oi,Wl(()=>(Ke(this,jn,Ea(m(this,ga))),()=>{Ke(this,jn,null)})));var o;Ke(this,mn,n),Ke(this,bn,a),Ke(this,ha,v=>{var c=et;c.b=this,c.f|=sr,s(v)}),this.parent=et.b,this.transform_error=l??((o=this.parent)==null?void 0:o.transform_error)??(v=>v),Ke(this,on,Tr(()=>{pt(this,Rt,cr).call(this)},Gl))}defer_effect(n){ws(n,m(this,pi),m(this,fi))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!m(this,bn).pending}update_pending_count(n,a){pt(this,Rt,vr).call(this,n,a),Ke(this,ga,m(this,ga)+n),!(!m(this,jn)||m(this,La))&&(Ke(this,La,!0),xa(()=>{Ke(this,La,!1),m(this,jn)&&Ga(m(this,jn),m(this,ga))}))}get_effect_pending(){return m(this,Oi).call(this),t(m(this,jn))}error(n){if(!m(this,bn).onerror&&!m(this,bn).failed)throw n;_e!=null&&_e.is_fork?(m(this,_n)&&_e.skip_effect(m(this,_n)),m(this,an)&&_e.skip_effect(m(this,an)),m(this,fn)&&_e.skip_effect(m(this,fn)),_e.oncommit(()=>{pt(this,Rt,ur).call(this,n)})):pt(this,Rt,ur).call(this,n)}}mn=new WeakMap,_r=new WeakMap,bn=new WeakMap,ha=new WeakMap,on=new WeakMap,_n=new WeakMap,an=new WeakMap,fn=new WeakMap,Gn=new WeakMap,ga=new WeakMap,aa=new WeakMap,La=new WeakMap,pi=new WeakMap,fi=new WeakMap,jn=new WeakMap,Oi=new WeakMap,Rt=new WeakSet,Hl=function(){try{Ke(this,_n,xn(()=>m(this,ha).call(this,m(this,mn))))}catch(n){this.error(n)}},Jl=function(n){const a=m(this,bn).failed;a&&Ke(this,fn,xn(()=>{a(m(this,mn),()=>n,()=>()=>{})}))},Ql=function(){const n=m(this,bn).pending;n&&(this.is_pending=!0,Ke(this,an,xn(()=>n(m(this,mn)))),xa(()=>{var a=Ke(this,Gn,document.createDocumentFragment()),s=Zn();a.append(s),Ke(this,_n,pt(this,Rt,Ai).call(this,()=>xn(()=>m(this,ha).call(this,s)))),m(this,aa)===0&&(m(this,mn).before(a),Ke(this,Gn,null),ka(m(this,an),()=>{Ke(this,an,null)}),pt(this,Rt,Ei).call(this,_e))}))},cr=function(){try{if(this.is_pending=this.has_pending_snippet(),Ke(this,aa,0),Ke(this,ga,0),Ke(this,_n,xn(()=>{m(this,ha).call(this,m(this,mn))})),m(this,aa)>0){var n=Ke(this,Gn,document.createDocumentFragment());Pr(m(this,_n),n);const a=m(this,bn).pending;Ke(this,an,xn(()=>a(m(this,mn))))}else pt(this,Rt,Ei).call(this,_e)}catch(a){this.error(a)}},Ei=function(n){this.is_pending=!1,n.transfer_effects(m(this,pi),m(this,fi))},Ai=function(n){var a=et,s=Ye,l=tn;Nn(m(this,on)),Sn(m(this,on)),Wa(m(this,on).ctx);try{return Ma.ensure(),n()}catch(o){return ys(o),null}finally{Nn(a),Sn(s),Wa(l)}},vr=function(n,a){var s;if(!this.has_pending_snippet()){this.parent&&pt(s=this.parent,Rt,vr).call(s,n,a);return}Ke(this,aa,m(this,aa)+n),m(this,aa)===0&&(pt(this,Rt,Ei).call(this,a),m(this,an)&&ka(m(this,an),()=>{Ke(this,an,null)}),m(this,Gn)&&(m(this,mn).before(m(this,Gn)),Ke(this,Gn,null)))},ur=function(n){m(this,_n)&&(vn(m(this,_n)),Ke(this,_n,null)),m(this,an)&&(vn(m(this,an)),Ke(this,an,null)),m(this,fn)&&(vn(m(this,fn)),Ke(this,fn,null));var a=m(this,bn).onerror;let s=m(this,bn).failed;var l=!1,o=!1;const v=()=>{if(l){Kl();return}l=!0,o&&Tl(),m(this,fn)!==null&&ka(m(this,fn),()=>{Ke(this,fn,null)}),pt(this,Rt,Ai).call(this,()=>{pt(this,Rt,cr).call(this)})},c=u=>{try{o=!0,a==null||a(u,v),o=!1}catch(p){ra(p,m(this,on)&&m(this,on).parent)}s&&Ke(this,fn,pt(this,Rt,Ai).call(this,()=>{try{return xn(()=>{var p=et;p.b=this,p.f|=sr,s(m(this,mn),()=>u,()=>v)})}catch(p){return ra(p,m(this,on).parent),null}}))};xa(()=>{var u;try{u=this.transform_error(n)}catch(p){ra(p,m(this,on)&&m(this,on).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,p=>ra(p,m(this,on)&&m(this,on).parent)):c(u)})};function Zl(e,n,a,s){const l=kr;var o=e.filter(x=>!x.settled),v=n.map(l);if(a.length===0&&o.length===0){s(v);return}var c=et,u=Yl(),p=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(x=>x.promise)):null;function _(x){if((c.f&wn)===0){u();try{s([...v,...x])}catch(D){ra(D,c)}Di()}}var C=Ss();if(a.length===0){p.then(()=>_([])).finally(C);return}function b(){Promise.all(a.map(x=>Xl(x))).then(_).catch(x=>ra(x,c)).finally(C)}p?p.then(()=>{u(),b(),Di()}):b()}function Yl(){var e=et,n=Ye,a=tn,s=_e;return function(o=!0){Nn(e),Sn(n),Wa(a),o&&(e.f&wn)===0&&(s==null||s.activate(),s==null||s.apply())}}function Di(e=!0){Nn(null),Sn(null),Wa(null),e&&(_e==null||_e.deactivate())}function Ss(){var e=et,n=e.b,a=_e,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=nn|en;return et!==null&&(et.f|=Qa),{ctx:tn,deps:null,effects:null,equals:ms,f:n,fn:e,reactions:null,rv:0,v:Jt,wv:0,parent:et,ac:null}}const ei=Symbol("obsolete");function Xl(e,n,a){let s=et;s===null&&xl();var l=void 0,o=Ea(Jt),v=!Ye,c=new Set;return mo(()=>{var x,D;var u=et,p=us();l=p.promise;try{Promise.resolve(e()).then(p.resolve,O=>{O!==Ni&&p.reject(O)}).finally(Di)}catch(O){p.reject(O),Di()}var _=_e;if(v){if((u.f&Ja)!==0)var C=Ss();if((x=s.b)!=null&&x.is_rendered())(D=_.async_deriveds.get(u))==null||D.reject(ei);else for(const O of c.values())O.reject(ei);c.add(p),_.async_deriveds.set(u,p)}const b=(O,E=void 0)=>{C==null||C(),c.delete(p),E!==ei&&(_.activate(),E?(o.f|=la,Ga(o,E)):((o.f&la)!==0&&(o.f^=la),Ga(o,O)),_.deactivate())};p.promise.then(b,O=>b(null,O||"unknown"))}),Fs(()=>{for(const u of c)u.reject(ei)}),new Promise(u=>{function p(_){function C(){_===l?u(o):p(l)}_.then(C,C)}p(l)})}function N(e){const n=kr(e);return Us(n),n}function eo(e){const n=kr(e);return n.equals=bs,n}function to(e){var n=e.effects;if(n!==null){e.effects=null;for(var a=0;athis.schedule(s)){var s=m(this,Ln).get(n);if(s){m(this,Ln).delete(n);for(var l of s.d)Wt(l,en),a(l);for(l of s.m)Wt(l,Kn),a(l)}m(this,Na).add(n)}capture(n,a,s=!1){n.v!==Jt&&!this.previous.has(n)&&this.previous.set(n,n.v),(n.f&la)===0&&(this.current.set(n,[a,s]),Xt==null||Xt.set(n,a)),this.is_fork||(n.v=a)}activate(){_e=this}deactivate(){_e=null,Xt=null}flush(){try{Ji=!0,_e=this,pt(this,wt,ti).call(this)}finally{Lr=0,pr=null,$a=null,Ci=null,Ji=!1,_e=null,Xt=null,ya.clear()}}discard(){var n;for(const a of m(this,Ra))a(this);m(this,Ra).clear();for(const a of this.async_deriveds.values())a.reject(ei);pt(this,wt,ni).call(this),(n=m(this,Ka))==null||n.resolve()}register_created_effect(n){m(this,hi).push(n)}increment(n,a){if(Ke(this,Fa,m(this,Fa)+1),n){let s=m(this,Un).get(a)??0;m(this,Un).set(a,s+1)}}decrement(n,a){if(Ke(this,Fa,m(this,Fa)-1),n){let s=m(this,Un).get(a)??0;s===1?m(this,Un).delete(a):m(this,Un).set(a,s-1)}m(this,ba)||(Ke(this,ba,!0),xa(()=>{Ke(this,ba,!1),this.linked&&this.flush()}))}transfer_effects(n,a){for(const s of n)m(this,Hn).add(s);for(const s of a)m(this,En).add(s);n.clear(),a.clear()}oncommit(n){m(this,Ba).add(n)}ondiscard(n){m(this,Ra).add(n)}settled(){return(m(this,Ka)??Ke(this,Ka,us())).promise}static ensure(){if(_e===null){const n=_e=new Bi;!Ji&&!si&&xa(()=>{m(n,Oa)||n.flush()})}return _e}apply(){{Xt=null;return}}schedule(n){var l;if(pr=n,(l=n.b)!=null&&l.is_pending&&(n.f&(qa|Ki|ps))!==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($a!==null&&a===et&&(Ye===null||(Ye.f&nn)===0))return;if((s&(oa|zn))!==0){if((s&Qt)===0)return;a.f^=Qt}}m(this,dn).push(a)}};Oa=new WeakMap,ia=new WeakMap,ma=new WeakMap,Ba=new WeakMap,Ra=new WeakMap,Fa=new WeakMap,Un=new WeakMap,Ka=new WeakMap,dn=new WeakMap,hi=new WeakMap,Hn=new WeakMap,En=new WeakMap,Ln=new WeakMap,Na=new WeakMap,ba=new WeakMap,wt=new WeakSet,fr=function(){if(this.is_fork)return!0;for(const s of m(this,Un).keys()){for(var n=s,a=!1;n.parent!==null;){if(m(this,Ln).has(n)){a=!0;break}n=n.parent}if(!a)return!0}return!1},ti=function(){var u,p,_,C;Ke(this,Oa,!0),Lr++>1e3&&(pt(this,wt,ni).call(this),so());for(const b of m(this,Hn))m(this,En).delete(b),Wt(b,en),this.schedule(b);for(const b of m(this,En))Wt(b,Kn),this.schedule(b);const n=m(this,dn);Ke(this,dn,[]),this.apply();var a=$a=[],s=[],l=Ci=[];for(const b of n)try{pt(this,wt,hr).call(this,b,a,s)}catch(x){throw Ps(b),pt(this,wt,fr).call(this)||this.discard(),x}if(_e=null,l.length>0){var o=Bi.ensure();for(const b of l)o.schedule(b)}if($a=null,Ci=null,pt(this,wt,fr).call(this)){pt(this,wt,Pa).call(this,s),pt(this,wt,Pa).call(this,a);for(const[b,x]of m(this,Ln))zs(b,x);l.length>0&&pt(u=_e,wt,ti).call(u);return}const v=pt(this,wt,As).call(this);if(v){pt(this,wt,Pa).call(this,s),pt(this,wt,Pa).call(this,a),pt(p=v,wt,Cs).call(p,this);return}m(this,Hn).clear(),m(this,En).clear();for(const b of m(this,Ba))b(this);m(this,Ba).clear(),ri=this,Or(s),Or(a),ri=null,(_=m(this,Ka))==null||_.resolve();var c=_e;if(m(this,Fa)===0&&(m(this,dn).length===0||c!==null)&&pt(this,wt,ni).call(this),m(this,dn).length>0)if(c!==null){const b=c;m(b,dn).push(...m(this,dn).filter(x=>!m(b,dn).includes(x)))}else c=this;c!==null&&pt(C=c,wt,ti).call(C)},hr=function(n,a,s){n.f^=Qt;for(var l=n.first;l!==null;){var o=l.f,v=(o&(zn|oa))!==0,c=v&&(o&Qt)!==0,u=c||(o&sn)!==0||m(this,Ln).has(l);if(!u&&l.fn!==null){v?l.f^=Qt:(o&qa)!==0?a.push(l):_i(l)&&((o&Cn)!==0&&m(this,En).add(l),Ua(l));var p=l.first;if(p!==null){l=p;continue}}for(;l!==null;){var _=l.next;if(_!==null){l=_;break}l=l.parent}}},As=function(){for(var n=m(this,ia);n!==null;){if(!n.is_fork){for(const[a,[,s]]of this.current)if(n.current.has(a)&&!s)return n}n=m(n,ia)}return null},Cs=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(m(n,Hn),m(n,En));const a=l=>{var o=l.reactions;if(o!==null)for(const u of o){var v=u.f;if((v&nn)!==0)a(u);else{var c=u;v&(Da|Cn)&&!this.async_deriveds.has(c)&&(m(this,En).delete(c),Wt(c,en),this.schedule(c))}}};for(const l of this.current.keys())a(l);this.oncommit(()=>n.discard()),pt(s=n,wt,ni).call(s),_e=this,pt(this,wt,ti).call(this)},Pa=function(n){for(var a=0;a!b.current.get(x)[1]);if(!(!m(b,Oa)||l.length===0)){var o=l.filter(x=>!this.current.has(x));if(o.length===0)n&&b.discard();else if(a.length>0){if(n)for(const x of m(this,Na))b.unskip_effect(x,D=>{var O;(D.f&(Cn|Da))!==0?b.schedule(D):pt(O=b,wt,Pa).call(O,[D])});b.activate();var v=new Set,c=new Map;for(var u of a)Ts(u,o,v,c);c=new Map;var p=[...b.current].filter(([x,D])=>{const O=this.current.get(x);return O?O[0]!==D[0]||O[1]!==D[1]:!0}).map(([x])=>x);if(p.length>0)for(const x of m(this,hi))(x.f&(wn|sn|Pi))===0&&Sr(x,p,c)&&((x.f&(Da|Cn))!==0?(Wt(x,en),b.schedule(x)):m(b,Hn).add(x));if(m(b,dn).length>0&&!m(b,ba)){b.apply();for(var _ of m(b,dn))pt(C=b,wt,hr).call(C,_,[],[]);Ke(b,dn,[])}b.deactivate()}}}},ni=function(){if(this.linked){var n=m(this,ia),a=m(this,ma);n===null?Hi=a:Ke(n,ma,a),a===null?za=n:Ke(a,ia,n),this.linked=!1}};let Ma=Bi;function ro(e){var n=si;si=!0;try{for(var a;;){if(ql(),_e===null)return a;_e.flush()}}finally{si=n}}function so(){try{Ml()}catch(e){ra(e,pr)}}let Mn=null;function Or(e){var n=e.length;if(n!==0){for(var a=0;a0)){ya.clear();for(const l of Mn){if((l.f&(wn|sn))!==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 c=o.length-1;c>=0;c--){const u=o[c];(u.f&(wn|sn))===0&&Ua(u)}}Mn.clear()}}Mn=null}}function Ts(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&nn)!==0?Ts(l,n,a,s):(o&(Da|Cn))!==0&&(o&en)===0&&Sr(l,n,s)&&(Wt(l,en),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&nn)!==0&&Sr(l,n,a))return a.set(l,!0),!0}return a.set(e,!1),!1}function Mr(e){_e.schedule(e)}function zs(e,n){if(!((e.f&zn)!==0&&(e.f&Qt)!==0)){(e.f&en)!==0?n.d.push(e):(e.f&Kn)!==0&&n.m.push(e),Wt(e,Qt);for(var a=e.first;a!==null;)zs(a,n),a=a.next}}function Ps(e){Wt(e,Qt);for(var n=e.first;n!==null;)Ps(n),n=n.next}let Ii=new Set;const ya=new Map;let $s=!1;function Ea(e,n){var a={f:0,v:e,reactions:null,equals:ms,rv:0,wv:0};return a}function $(e,n){const a=Ea(e);return Us(a),a}function lo(e,n=!1,a=!0){const s=Ea(e);return n||(s.equals=bs),s}function d(e,n,a=!1){Ye!==null&&(!Tn||(Ye.f&Pi)!==0)&&_s()&&(Ye.f&(nn|Cn|Da|Pi))!==0&&(Rn===null||!Rn.has(e))&&Cl();let s=a?Gt(n):n;return Ga(e,s,Ci)}function Ga(e,n,a=null){if(!e.equals(n)){ya.set(e,da?n:e.v);var s=Ma.ensure();if(s.capture(e,n),(e.f&nn)!==0){const l=e;(e.f&en)!==0&&wr(l),Xt===null&&yr(l)}e.wv=Js(),Ds(e,en,a),et!==null&&(et.f&Qt)!==0&&(et.f&(zn|oa))===0&&(gn===null?_o([e]):gn.push(e)),!s.is_fork&&Ii.size>0&&!$s&&oo()}return n}function oo(){$s=!1;for(const e of Ii){(e.f&Qt)!==0&&Wt(e,Kn);let n;try{n=_i(e)}catch{n=!0}n&&Ua(e)}Ii.clear()}function li(e){d(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 c();var u=Ye,p=wa;Sn(null),Nr(o);var _=c();return Sn(u),Nr(p),_};return s&&a.set("length",$(e.length)),new Proxy(e,{defineProperty(c,u,p){(!("value"in p)||p.configurable===!1||p.enumerable===!1||p.writable===!1)&&El();var _=a.get(u);return _===void 0?v(()=>{var C=$(p.value);return a.set(u,C),C}):d(_,p.value,!0),!0},deleteProperty(c,u){var p=a.get(u);if(p===void 0){if(u in c){const _=v(()=>$(Jt));a.set(u,_),li(l)}}else d(p,Jt),li(l);return!0},get(c,u,p){var x;if(u===Ia)return e;var _=a.get(u),C=u in c;if(_===void 0&&(!C||(x=ii(c,u))!=null&&x.writable)&&(_=v(()=>{var D=Gt(C?c[u]:Jt),O=$(D);return O}),a.set(u,_)),_!==void 0){var b=t(_);return b===Jt?void 0:b}return Reflect.get(c,u,p)},getOwnPropertyDescriptor(c,u){var p=Reflect.getOwnPropertyDescriptor(c,u);if(p&&"value"in p){var _=a.get(u);_&&(p.value=t(_))}else if(p===void 0){var C=a.get(u),b=C==null?void 0:C.v;if(C!==void 0&&b!==Jt)return{enumerable:!0,configurable:!0,value:b,writable:!0}}return p},has(c,u){var b;if(u===Ia)return!0;var p=a.get(u),_=p!==void 0&&p.v!==Jt||Reflect.has(c,u);if(p!==void 0||et!==null&&(!_||(b=ii(c,u))!=null&&b.writable)){p===void 0&&(p=v(()=>{var x=_?Gt(c[u]):Jt,D=$(x);return D}),a.set(u,p));var C=t(p);if(C===Jt)return!1}return _},set(c,u,p,_){var Me;var C=a.get(u),b=u in c;if(s&&u==="length")for(var x=p;x$(Jt)),a.set(x+"",D))}if(C===void 0)(!b||(Me=ii(c,u))!=null&&Me.writable)&&(C=v(()=>$(void 0)),d(C,Gt(p)),a.set(u,C));else{b=C.v!==Jt;var O=v(()=>Gt(p));d(C,O)}var E=Reflect.getOwnPropertyDescriptor(c,u);if(E!=null&&E.set&&E.set.call(_,p),!b){if(s&&typeof u=="string"){var B=a.get("length"),xe=Number(u);Number.isInteger(xe)&&xe>=B.v&&d(B,xe+1)}li(l)}return!0},ownKeys(c){t(l);var u=Reflect.ownKeys(c).filter(C=>{var b=a.get(C);return b===void 0||b.v!==Jt});for(var[p,_]of a)_.v!==Jt&&!(p in c)&&u.push(p);return u},setPrototypeOf(){Al()}})}function Br(e){try{if(e!==null&&typeof e=="object"&&Ia in e)return e[Ia]}catch{}return e}function co(e,n){return Object.is(Br(e),Br(n))}var Rr,Is,Ls,Os;function vo(){if(Rr===void 0){Rr=window,Is=/Firefox/.test(navigator.userAgent);var e=Element.prototype,n=Node.prototype,a=Text.prototype;Ls=ii(n,"firstChild").get,Os=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 Zn(e=""){return document.createTextNode(e)}function sa(e){return Ls.call(e)}function bi(e){return Os.call(e)}function r(e,n){return sa(e)}function ot(e,n=!1){{var a=sa(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 uo(e){e.textContent=""}function Bs(){return!1}function Rs(e,n,a){return n==null||n===gs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(n,e,{is:a}):document.createElementNS(n,e)}let Fr=!1;function po(){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=Ye,a=et;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),po()}function fo(e){et===null&&(Ye===null&&Sl(),wl()),da&&kl()}function ho(e,n){var a=n.last;a===null?n.last=n.first=e:(a.next=e,e.prev=a,n.last=e)}function Yn(e,n){var a=et;a!==null&&(a.f&sn)!==0&&(e|=sn);var s={ctx:tn,deps:null,nodes:null,f:e|en|kn,first:null,fn:n,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};_e==null||_e.register_created_effect(s);var l=s;if((e&qa)!==0)$a!==null?$a.push(s):Ma.ensure().schedule(s);else if(n!==null){try{Ua(s)}catch(v){throw vn(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&Va)!==0&&l!==null&&(l.f|=Va))}if(l!==null&&(l.parent=a,a!==null&&ho(l,a),Ye!==null&&(Ye.f&nn)!==0&&(e&oa)===0)){var o=Ye;(o.effects??(o.effects=[])).push(l)}return s}function Cr(){return Ye!==null&&!Tn}function Fs(e){const n=Yn(Ki,null);return Wt(n,Qt),n.teardown=e,n}function ja(e){fo();var n=et.f,a=!Ye&&(n&zn)!==0&&tn!==null&&!tn.i;if(a){var s=tn;(s.e??(s.e=[])).push(e)}else return Ks(e)}function Ks(e){return Yn(qa|ml,e)}function go(e){Ma.ensure();const n=Yn(oa|Qa,e);return(a={})=>new Promise(s=>{a.outro?ka(n,()=>{vn(n),s(void 0)}):(vn(n),s(void 0))})}function Ns(e){return Yn(qa,e)}function mo(e){return Yn(Da|Qa,e)}function qi(e,n=0){return Yn(Ki|n,e)}function z(e,n=[],a=[],s=[]){Zl(s,n,a,l=>{Yn(Ki,()=>{e(...l.map(t))})})}function Tr(e,n=0){var a=Yn(Cn|n,e);return a}function xn(e){return Yn(zn|Qa,e)}function qs(e){var n=e.teardown;if(n!==null){const a=da,s=Ye;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&oa)!==0?a.parent=null:vn(a,n),a=s}}function bo(e){for(var n=e.first;n!==null;){var a=n.next;(n.f&zn)===0&&vn(n),n=a}}function vn(e,n=!0){var a=!1;(n||(e.f&gl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Vs(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();qs(e),e.f^=lr,e.f|=wn;var l=e.parent;l!==null&&l.first!==null&&Ws(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Vs(e,n){for(;e!==null;){var a=e===n?null:bi(e);e.remove(),e=a}}function Ws(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=[];Gs(e,s,!0);var l=()=>{a&&vn(e),n&&n()},o=s.length;if(o>0){var v=()=>--o||l();for(var c of s)c.out(v)}else l()}function Gs(e,n,a){if((e.f&sn)===0){e.f^=sn;var s=e.nodes&&e.nodes.t;if(s!==null)for(const c of s)(c.is_global||a)&&n.push(c);for(var l=e.first;l!==null;){var o=l.next;if((l.f&oa)===0){var v=(l.f&Va)!==0||(l.f&zn)!==0&&(e.f&Cn)!==0;Gs(l,n,v?a:!1)}l=o}}}function Li(e){js(e,!0)}function js(e,n){if((e.f&sn)!==0){e.f^=sn,(e.f&Qt)===0&&(Wt(e,en),Ma.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,l=(a.f&Va)!==0||(a.f&zn)!==0;js(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,da=!1;function Kr(e){da=e}let Ye=null,Tn=!1;function Sn(e){Ye=e}let et=null;function Nn(e){et=e}let Rn=null;function Us(e){Ye!==null&&(Rn??(Rn=new Set)).add(e)}let cn=null,pn=0,gn=null;function _o(e){gn=e}let Hs=1,ua=0,wa=ua;function Nr(e){wa=e}function Js(){return++Hs}function _i(e){var n=e.f;if((n&en)!==0)return!0;if(n&nn&&(e.f&=~Sa),(n&Kn)!==0){for(var a=e.deps,s=a.length,l=0;le.wv)return!0}(n&kn)!==0&&Xt===null&&Wt(e,Qt)}return!1}function Qs(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|=$i;var _=e.fn,C=_();e.f|=Ja;var b=e.deps,x=_e==null?void 0:_e.is_fork;if(cn!==null){var D;if(x||vi(e,pn),b!==null&&pn>0)for(b.length=pn+cn.length,D=0;D{throw B});throw b}}finally{e[pa]=n,delete e.currentTarget,Sn(_),Nn(C)}}}var os;const Qi=((os=globalThis==null?void 0:globalThis.window)==null?void 0:os.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function So(e){return(Qi==null?void 0:Qi.createHTML(e))??e}function Mo(e){var n=Rs("template");return n.innerHTML=So(e.replaceAll("","")),n.content}function Ha(e,n){var a=et;a.nodes===null&&(a.nodes={start:e,end:n,a:null,t:null})}function g(e,n){var a=(n&Il)!==0,s=(n&Ll)!==0,l,o=!e.startsWith("");return()=>{l===void 0&&(l=Mo(o?e:""+e),a||(l=sa(l)));var v=s||Is?document.importNode(l,!0):l.cloneNode(!0);if(a){var c=sa(v),u=v.lastChild;Ha(c,u)}else Ha(v,v);return v}}function oi(e=""){{var n=Zn(e+"");return Ha(n,n),n}}function Aa(){var e=document.createDocumentFragment(),n=document.createComment(""),a=Zn();return e.append(n,a),Ha(n,a),e}function f(e,n){e!==null&&e.before(n)}function h(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 Eo(e,n){return Ao(e,n)}const wi=new Map;function Ao(e,{target:n,anchor:a,props:s={},events:l,context:o,intro:v=!0,transformError:c}){vo();var u=void 0,p=go(()=>{var _=a??n.appendChild(Zn());jl(_,{pending:()=>{}},x=>{Pn({});var D=tn;o&&(D.c=o),l&&(s.$$events=l),u=e(x,s)||{},$n()},c);var C=new Set,b=x=>{for(var D=0;D{var E;for(var x of C)for(const B of[n,document]){var D=wi.get(B),O=D.get(x);--O==0?(B.removeEventListener(x,Vr),D.delete(x),D.size===0&&wi.delete(B)):D.set(x,O)}gr.delete(b),_!==a&&((E=_.parentNode)==null||E.removeChild(_))}});return Co.set(u,p),u}let Co=new WeakMap;var An,On,hn,_a,gi,mi,Ri;class To{constructor(n,a=!0){un(this,"anchor");Ve(this,An,new Map);Ve(this,On,new Map);Ve(this,hn,new Map);Ve(this,_a,new Set);Ve(this,gi,!0);Ve(this,mi,n=>{if(m(this,An).has(n)){var a=m(this,An).get(n),s=m(this,On).get(a);if(s)Li(s),m(this,_a).delete(a);else{var l=m(this,hn).get(a);l&&(Li(l.effect),m(this,On).set(a,l.effect),m(this,hn).delete(a),l.fragment.lastChild.remove(),this.anchor.before(l.fragment),s=l.effect)}for(const[o,v]of m(this,An)){if(m(this,An).delete(o),o===n)break;const c=m(this,hn).get(v);c&&(vn(c.effect),m(this,hn).delete(v))}for(const[o,v]of m(this,On)){if(o===a||m(this,_a).has(o))continue;const c=()=>{if(Array.from(m(this,An).values()).includes(o)){var p=document.createDocumentFragment();Pr(v,p),p.append(Zn()),m(this,hn).set(o,{effect:v,fragment:p})}else vn(v);m(this,_a).delete(o),m(this,On).delete(o)};m(this,gi)||!s?(m(this,_a).add(o),ka(v,c,!1)):c()}}});Ve(this,Ri,n=>{m(this,An).delete(n);const a=Array.from(m(this,An).values());for(const[s,l]of m(this,hn))a.includes(s)||(vn(l.effect),m(this,hn).delete(s))});this.anchor=n,Ke(this,gi,a)}ensure(n,a){var s=_e,l=Bs();if(a&&!m(this,On).has(n)&&!m(this,hn).has(n))if(l){var o=document.createDocumentFragment(),v=Zn();o.append(v),m(this,hn).set(n,{effect:xn(()=>a(v)),fragment:o})}else m(this,On).set(n,xn(()=>a(this.anchor)));if(m(this,An).set(s,n),l){for(const[c,u]of m(this,On))c===n?s.unskip_effect(u):s.skip_effect(u);for(const[c,u]of m(this,hn))c===n?s.unskip_effect(u.effect):s.skip_effect(u.effect);s.oncommit(m(this,mi)),s.ondiscard(m(this,Ri))}else m(this,mi).call(this,s)}}An=new WeakMap,On=new WeakMap,hn=new WeakMap,_a=new WeakMap,gi=new WeakMap,mi=new WeakMap,Ri=new WeakMap;function F(e,n,a=!1){var s=new To(e),l=a?Va:0;function o(v,c){s.ensure(v,c)}Tr(()=>{var v=!1;n((c,u=0)=>{v=!0,o(u,c)}),v||o(-1,null)},l)}function lt(e,n){return n}function zo(e,n,a){for(var s=[],l=n.length,o,v=n.length,c=0;c{if(o){if(o.pending.delete(C),o.done.add(C),o.pending.size===0){var b=e.outrogroups;mr(e,Fi(o.done)),b.delete(o),b.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;uo(_),_.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 c of v)s.add(e.items.get(c).e)}for(var l=0;l{var Me=a();return xr(Me)?Me:Me==null?[]:Fi(Me)}),b,x=new Map,D=!0;function O(Me){(xe.effect.f&wn)===0&&(xe.pending.delete(Me),xe.fallback=_,Po(xe,b,v,n,s),_!==null&&(b.length===0?(_.f&Bn)===0?Li(_):(_.f^=Bn,ai(_,null,v)):ka(_,()=>{_=null})))}function E(Me){xe.pending.delete(Me)}var B=Tr(()=>{b=t(C);for(var Me=b.length,Ae=new Set,Re=_e,ne=Bs(),J=0;Jo(v)):(_=xn(()=>o(Wr??(Wr=Zn()))),_.f|=Bn)),Me>Ae.size&&yl(),!D)if(x.set(Re,Ae),ne){for(const[tt,_t]of c)Ae.has(tt)||Re.skip_effect(_t.e);Re.oncommit(O),Re.ondiscard(E)}else O(Re);t(C)}),xe={effect:B,items:c,pending:x,outrogroups:null,fallback:_};D=!1}function Ya(e){for(;e!==null&&(e.f&zn)===0;)e=e.next;return e}function Po(e,n,a,s,l){var We,tt,_t,I,oe,we,it,ge,He;var o=(s&$l)!==0,v=n.length,c=e.items,u=Ya(e.effect.first),p,_=null,C,b=[],x=[],D,O,E,B;if(o)for(B=0;B0){var Ie=(s&hs)!==0&&v===0?a:null;if(o){for(B=0;B{var ye,dt;if(C!==void 0)for(E of C)(dt=(ye=E.nodes)==null?void 0:ye.a)==null||dt.apply()})}function $o(e,n,a,s,l,o,v,c){var u=(v&zl)!==0?(v&Dl)===0?lo(a,!1,!1):Ea(a):null,p=(v&Pl)!==0?Ea(l):null;return{v:u,i:p,e:xn(()=>(o(n,u??a,p??l,c),()=>{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 ea(e,n,a){n===null?e.effect.first=a:n.next=a,a===null?e.effect.last=n:a.prev=n}function at(e,n,a=!1,s=!1,l=!1,o=!1){var v=e,c="";if(a)var u=e;z(()=>{var p=et;if(c!==(c=n()??"")){if(a){p.nodes=null,u.innerHTML=c,c!==""&&Ha(sa(u),u.lastChild);return}if(p.nodes!==null&&(Vs(p.nodes.start,p.nodes.end),p.nodes=null),c!==""){var _=s?Ol:l?Bl:void 0,C=Rs(s?"svg":l?"math":"template",_);C.innerHTML=c;var b=s||l?C:C.content;if(Ha(sa(b),b.lastChild),s||l)for(;sa(b);)v.before(sa(b));else v.before(b)}}})}function Do(e,n,a){var s=e==null?"":""+e;return n&&(s=s?s+" "+n:n),s===""?null:s}function Io(e,n){return e==null?null:String(e)}function Dt(e,n,a,s,l,o){var v=e[or];if(v!==a||v===void 0){var c=Do(a,s);c==null?e.removeAttribute("class"):e.className=c,e[or]=a}return o}function Pt(e,n,a,s){var l=e[dr];if(l!==n){var o=Io(n);o==null?e.removeAttribute("style"):e.style.cssText=o,e[dr]=n}return s}function tl(e,n,a=!1){if(e.multiple){if(n==null)return;if(!xr(n))return Fl();for(var s of e.options)s.selected=n.includes(di(s));return}for(s of e.options){var l=di(s);if(co(l,n)){s.selected=!0;return}}(!a||n!==void 0)&&(e.selectedIndex=-1)}function Lo(e){var n=new MutationObserver(()=>{tl(e,e.__value)});n.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Fs(()=>{n.disconnect()})}function Qn(e,n,a=n){var s=new WeakSet,l=!0;Ar(e,"change",o=>{var v=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(v),di);else{var u=e.querySelector(v)??e.querySelector("option:not([disabled])");c=u&&di(u)}a(c),e.__value=c,_e!==null&&s.add(_e)}),Ns(()=>{var o=n();if(e===document.activeElement){var v=_e;if(s.has(v))return}if(tl(e,o,l),l&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=di(c),a(o))}e.__value=o,l=!1}),Lo(e)}function di(e){return"__value"in e?e.__value:e.value}const Oo=Symbol("is custom element"),Bo=Symbol("is html"),Ro=_l?"progress":"PROGRESS";function ta(e,n){var a=nl(e);a.value===(a.value=n??void 0)||e.value===n&&(n!==0||e.nodeName!==Ro)||(e.value=n??"")}function Ca(e,n,a,s){var l=nl(e);l[n]!==(l[n]=a)&&(n==="loading"&&(e[bl]=a),a==null?e.removeAttribute(n):typeof a!="string"&&Fo(e).includes(n)?e[n]=a:e.setAttribute(n,a))}function nl(e){return e[Si]??(e[Si]={[Oo]:e.nodeName.includes("-"),[Bo]:e.namespaceURI===gs})}var Gr=new Map;function Fo(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=vl(l);for(var v in s)s[v].set&&v!=="innerHTML"&&v!=="textContent"&&v!=="innerText"&&a.push(v);l=vs(l)}return a}function rn(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),_e!==null&&s.add(_e),await yo(),o!==(o=n())){var v=e.selectionStart,c=e.selectionEnd,u=e.value.length;if(e.value=o??"",c!==null){var p=e.value.length;v===c&&c===u&&p>u?(e.selectionStart=p,e.selectionEnd=p):(e.selectionStart=v,e.selectionEnd=Math.min(c,p))}}}),Za(n)==null&&e.value&&(a(Zi(e)?Yi(e.value):e.value),_e!==null&&s.add(_e)),qi(()=>{var l=n();if(e===document.activeElement){var o=_e;if(s.has(o))return}Zi(e)&&l===Yi(e.value)||e.type==="date"&&!l&&!e.value||l!==e.value&&(e.value=l??"")})}function Ko(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[Ia])===n}function No(e={},n,a,s){var l=tn.r,o=et;return Ns(()=>{var v,c;return qi(()=>{v=c,c=[],Za(()=>{Xi(a(...c),e)||(n(e,...c),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=()=>{c&&Xi(a(...c),e)&&n(null,...c)},_=u.teardown;u.teardown=()=>{p(),_==null||_()}}}),e}function xi(e){tn===null&&fs(),ja(()=>{const n=Za(e);if(typeof n=="function")return n})}function qo(e){tn===null&&fs(),xi(()=>()=>Za(e))}let ui=localStorage.getItem("mc_token")||"";function al(){return ui}function Vo(e){ui=(e||"").trim(),localStorage.setItem("mc_token",ui)}function Wo(){const e={"Content-Type":"application/json"};return ui&&(e["X-MC-Token"]=ui),e}function ci(){return localStorage.getItem("mc_hf_token")||""}function Go(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function Pe(e,n={}){const a=await fetch(e,{headers:Wo(),...n}),s=await a.json().catch(()=>({}));if(!a.ok)throw new Error(s.error||"HTTP "+a.status);return s}const jo=(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 le(e,n=!1){const a=jo("#toast");a&&(a.textContent=e,a.className="toast show"+(n?" err":""),clearTimeout(Ur),Ur=setTimeout(()=>a.className="toast",3200))}function Uo(e,n){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${n!=null?` ${Math.round(n)}%`:""}`:'bereit'}const kt=e=>`${e}`,Vi={logo:kt(''),grid:kt(''),cpu:kt(''),pulse:kt(''),server:kt(''),book:kt(''),help:kt(''),settings:kt(''),swap:kt(''),monitor:kt(''),layers:kt(''),alert:kt(''),gauge:kt(''),search:kt(''),compass:kt(''),code:kt(''),eye:kt(''),refresh:kt(''),file:kt(''),database:kt(''),thermo:kt(''),shield:kt(''),info:kt(''),chevron:kt(''),bolt:kt(''),x:kt(''),check:kt(''),download:kt(''),clock:kt('')};function Ht(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 yn({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 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 ha={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),ie=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(ie,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=Ca(),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 ie=Xo(),re=r(ie),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,ie)}),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 ie=i(V,4);at(ie,()=>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 ie=i(V,4);at(ie,()=>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),ve=i(r(be),2),Ce=r(ve),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),ie=i(V,2),re=r(ie),Be=r(re),Fe=r(Be),de=i(Be,2);{var H=ae=>{var ze=ad();f(ae,ze)},se=N(()=>{var ae,ze;return(ze=(ae=t(X).meta)==null?void 0:ae.caps)==null?void 0:ze.includes("Bild")}),vt=ae=>{var ze=id();f(ae,ze)},ht=N(()=>{var ae,ze;return(ze=(ae=t(X).meta)==null?void 0:ae.caps)==null?void 0:ze.includes("Code")}),St=ae=>{var ze=rd();f(ae,ze)};F(de,ae=>{t(se)?ae(H):t(ht)?ae(vt,1):ae(St,-1)})}var ln=i(de,2);{var Vn=ae=>{var ze=sd();f(ae,ze)};F(ln,ae=>{t(X).ttl>=99999&&ae(Vn)})}var S=i(re,2),w=r(S),ee=i(ie,2),Z=r(ee),j=r(Z),ce=i(Z,2);{var Je=ae=>{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(ae,ze)};F(ce,ae=>{!t(pe)&&!t(De)&&t(o)&&ae(Je)})}z((ae,ze)=>{var Ue;Dt(V,1,`li-dot ${t(je)??""}`),Pt(Be,t(pe)?"color:var(--accent)":""),h(Fe,t(X).name),h(w,`${ae??""} ${(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}… + ${ze??""}`),Pt(Z,`white-space:nowrap;color:${t(pe)?"var(--on)":"var(--mut)"}`),h(j,t(Oe))},[()=>{var ae;return(ae=t(X).meta)!=null&&ae.ctx?Math.round(t(X).meta.ctx/1024)+"k ctx":""},()=>{var ae;return(ae=t(X).meta)!=null&&ae.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)},ue=M=>{var W=vd();f(M,W)};F(Se,M=>{t(b).length?M(Ge):M(ue,-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=Ca(),Le=ot(he);{var Ne=K=>{var U=md(),be=r(U),ve=r(be),Ce=i(be,5),Ee=r(Ce),P=i(Ee,2);z(()=>h(ve,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),ve=r(be),Ce=r(ve),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(ve,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(),ie=r(V);z(()=>h(ie,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 ue=i(Ge);at(ue,()=>Uo(t(q).state,t(q).download_progress),!0);var M=i(ue),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),ue=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(ue,` 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),ve=i(r(be),2),Ce=r(ve),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),ve=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",ve,()=>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(()=>ha.value),s=N(()=>ha.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),ve=i(me,2),Ce=r(ve),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,ue,M,W,Te,X,pe,De,je,Oe,G)=>{h(ye,Y),h(rt,Se),h(ft,Ge),h(Ft,`${ue??""} / ${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),()=>va(t(l).ram.used),()=>va(t(l).ram.total),()=>Math.round(t(oe)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>va(t(l).ram.used),()=>va(t(l).ram.total),()=>t(l).gpu?`${va(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${va(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=Ca(),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?va(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,()=>ha.toggle(t(ge).id)),k("keydown",ft,q=>q.key==="Enter"&&ha.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(()=>ha.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),ha.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. +— 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 ue=Ud(),M=r(ue),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),ie=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(ie,`${t(p)??""}${t(Se)?t(y)?" — erfolgreich.":t(Y)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(de,H)},[()=>(t(te).log||[]).join(` +`)]),f(P,ue)};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 ve=i(be);ve.value=ve.__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(ce=>{var Je;return(Je=ce.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(ce=>{var Je;return(Je=ce.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),ve=r(be),Ce=i(r(ve),2),Ee=i(ve,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 ce=Xd(),Je=r(ce);{var ae=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(ae)})}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(ce,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",ce,()=>Q(t(Z).id)),f(ee,ce)}),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)},ce=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(ce,1):Ue(Je,-1)})}var ae=i(Z,2);{var ze=Ue=>{var ut=tc();f(Ue,ut)};F(ae,Ue=>{t(xe)&&Ue(ze)})}f(S,ee)};F(Se,S=>{var w;(w=t(E))!=null&&w.updated&&S(Ge)})}var ue=i(Y,2),M=r(ue),W=i(L,4);{var Te=S=>{var w=ac();f(S,w)},X=S=>{var w=Ca(),ee=ot(w);Xe(ee,17,()=>t(E).categories,lt,(Z,j)=>{var ce=oc(),Je=r(ce),ae=r(Je),ze=r(ae),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,ce)}),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 ie=i(V);ie.value=ie.__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 ce=cc(),Je=r(ce);{var ae=Vt=>{var Ot=tr();f(Vt,Ot)};F(Je,Vt=>{j===t(Ie)&&Vt(ae)})}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(ce,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",ce,()=>A(t(Z).id,t(Z).id.split("/").pop())),f(ee,ce)}),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),ce=i(j,2),Je=r(ce),ae=i(ce,2),ze=r(ae),Ue=i(ae,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),ce=r(j),Je=i(j,2),ae=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=Ca(),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(ce,t(_t)),h(ae,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),ce=r(j),Je=i(j,6),ae=i(Je,4),ze=i(ae,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(ce,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(ae,()=>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(()=>{ue.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",ue,()=>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(`, + ü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(ve=>K.includes(ve.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ve=>{var P,te;const Ce=(((P=ve.meta)==null?void 0:P.caps)||[]).some(y=>/Bild|Vision/i.test(y)),Ee=((te=ve.meta)==null?void 0:te.ctx)||131072;return` { "name": "${ve.name}", "display_name": "${ve.name}", "max_tokens": ${Ee}${Ce?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { @@ -30,7 +30,7 @@ ${be} ] } } -}`}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(`, +}`}function Ae(T,K){const be=(K.length?t(s).filter(ve=>K.includes(ve.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ve=>{var Ee;const Ce=((Ee=ve.meta)==null?void 0:Ee.ctx)||131072;return` "${ve.name}": { "name": "${ve.name}", "contextWindowSize": ${Ce} }`}).join(`, `);return`"providers": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", @@ -45,10 +45,10 @@ ${be} } }`}function Re(T,K){return`{ "models": [ -${(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}", +${(K.length?t(s).filter(ve=>K.includes(ve.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ve=>` { + "title": "llama-swap / ${ve.name}", "provider": "openai", - "model": "${ce.name}", + "model": "${ve.name}", "apiBase": "${T}", "apiKey": "local" }`).join(`, @@ -64,12 +64,12 @@ ${(K.length?t(s).filter(ce=>K.includes(ce.name)):t(s).length?t(s):[{name:"coder" } } } -}`}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 \\ +}`}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],ve=()=>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,ve()),h(Ge,Ce())}),f(T,Ee)});var Ft=i(ft,2);{var Lt=T=>{var K=Gc(),U=ot(K),be=r(U),ve=i(r(be),2),Ce=r(ve),Ee=i(be,4);Xe(Ee,21,()=>t(s),lt,(G,V)=>{const ie=N(()=>t(o).includes(t(V).name));var re=Lc(),Be=r(re);z(()=>{Pt(re,`cursor:pointer;${t(ie)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(Be,t(V).name)}),k("click",re,()=>d(o,t(ie)?t(o).filter(Fe=>Fe!==t(V).name):[...t(o),t(V).name],!0)),k("keydown",re,Fe=>Fe.key==="Enter"&&d(o,t(ie)?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(),ie=r(V);k("click",ie,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 ie=N(()=>Jn(V,3));let re=()=>t(ie)[0],Be=()=>t(ie)[1],Fe=()=>t(ie)[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 ie=N(()=>Jn(V,3));let re=()=>t(ie)[0],Be=()=>t(ie)[1],Fe=()=>t(ie)[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 ue=G=>{var V=Bc(),ie=i(ot(V),6),re=r(ie),Be=i(re,2),Fe=i(ie,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 ie=Rc(),re=i(ot(ie),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,ie)},W=G=>{var V=Fc(),ie=i(ot(V),6),re=r(ie),Be=i(re,2),Fe=i(ie,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 ie=Kc(),re=i(ot(ie),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,ie)},X=G=>{const V=N(()=>Ae(t(x),t(E)));var ie=Nc(),re=i(ot(ie),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,ie)},pe=G=>{var V=qc(),ie=i(ot(V),4),re=r(ie),Be=i(re,2),Fe=i(ie,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(),ie=i(ot(V),4),re=r(ie),Be=i(re,2),Fe=i(ie,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(ue):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(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 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",` +}'`);var ie=Wc(),re=r(ie),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,ie)};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 ve;return(ve=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:ve.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],ve=()=>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,ve()),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,13 +649,13 @@ src/
    Strg+Shift+R (Hard Reload). Wenn das nicht hilft: Tab Server → Mission Control → Neu starten.
    - `]]}],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. +
    `]]}],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 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. +`).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 R=i(A,2),ke=r(R),$e=i(r(ke),2),q=r($e);q.value=q.__value="user";var he=i(q);he.value=he.__value="instruction";var Le=i(he);Le.value=Le.__value="stable";var Ne=i(Le);Ne.value=Ne.__value="versioned";var T=i(Ne);T.value=T.__value="ephemeral";var K=i(ke,2),U=i(r(K),2),be=r(U);be.value=be.__value="import";var ce=i(be);ce.value=ce.__value="claude";var Ce=i(ce);Ce.value=Ce.__value="gemini";var Ee=i(Ce);Ee.value=Ee.__value="chatgpt";var P=i(Ee);P.value=P.__value="manual";var te=i(R,2);{var y=ve=>{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. +...`);var R=i(A,2),ke=r(R),$e=i(r(ke),2),q=r($e);q.value=q.__value="user";var he=i(q);he.value=he.__value="instruction";var Le=i(he);Le.value=Le.__value="stable";var Ne=i(Le);Ne.value=Ne.__value="versioned";var T=i(Ne);T.value=T.__value="ephemeral";var K=i(ke,2),U=i(r(K),2),be=r(U);be.value=be.__value="import";var ve=i(be);ve.value=ve.__value="claude";var Ce=i(ve);Ce.value=Ce.__value="gemini";var Ee=i(Ce);Ee.value=Ee.__value="chatgpt";var P=i(Ee);P.value=P.__value="manual";var te=i(R,2);{var y=ue=>{var M=gv(),W=r(M);z(()=>h(W,`${t(E).length??""} Eintrag/Einträge erkannt`)),f(ue,M)};F(te,ue=>{t(E).length>0&&ue(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),ue=>d(b,ue)),Qn($e,()=>t(x),ue=>d(x,ue)),Qn(U,()=>t(D),ue=>d(D,ue)),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 ve=i(be);ve.value=ve.__value="instruction";var Ce=i(ve);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),ve=i(U,2),Ce=r(ve),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(ue=>{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,ue)},[()=>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(`
    `),Zv=g('
    '),Yv=g(`
    `),Xv=g(`
    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; + 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 ue=JSON.parse(Ge.data);if(ue.type==="thinking")d(o,!0);else if(ue.type!=="info")if(ue.type==="token"){d(o,!1),d(xe,t(xe)+ue.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(ue.type==="tool_call"){d(o,!1);const M=ue.args||{},W=Object.values(M).join(" ").slice(0,60);d(s,[...t(s),{role:"tool",content:W,tool:ue.name}],!0)}else if(ue.type==="tool_result"){const M=[...t(s)].reverse().find(W=>W.role==="tool"&&W.tool===ue.name);M&&(M.content=ue.content),d(s,[...t(s)],!0)}else ue.type==="error"?(d(o,!1),d(s,[...t(s),{role:"error",content:ue.content}],!0)):ue.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),ue=i(Y,2),M=r(ue),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 ce=ts(),Je=r(ce);z(()=>h(Je,`Ticker vor ${t(x).heartbeat_age_s??""}s`)),f(j,ce)};F(je,j=>{var ce;((ce=t(x))==null?void 0:ce.heartbeat_age_s)!=null&&j(Oe)})}var G=i(je,2);{var V=j=>{var ce=ts(),Je=r(ce);z(ae=>{ca(ce,"title",t(x).version),h(Je,ae)},[()=>t(x).version.split(" · ")[0]]),f(j,ce)};F(G,j=>{var ce;(ce=t(x))!=null&&ce.version&&j(V)})}var ie=i(ue,2),re=r(ie),Be=r(re),Fe=i(r(Be)),de=r(Fe),H=i(re,2);{var se=j=>{var ce=Tv();f(j,ce)},vt=j=>{var ce=$v();Xe(ce,21,()=>t(D),lt,(Je,ae)=>{var ze=Pv();Xe(ze,21,()=>Object.entries(t(ae)),lt,(Ue,ut)=>{var Ze=N(()=>Jn(t(ut),2));let nt=()=>t(Ze)[0],gt=()=>t(Ze)[1];var Ct=Ca(),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,ce)};F(H,j=>{t(D).length===0?j(se):j(vt,-1)})}var ht=i(ie,2),St=r(ht),ln=r(St),Vn=i(r(ln)),S=r(Vn),w=i(St,2);{var ee=j=>{var ce=Dv();f(j,ce)},Z=j=>{var ce=Bv();Xe(ce,21,()=>t(it),lt,(Je,ae)=>{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(ae).category)),f(st,Mt)};F(nt,st=>{t(ae).category&&st(gt)})}var Ct=i(nt,4);{var Zt=st=>{var Mt=Lv(),bt=r(Mt);z(()=>h(bt,`${t(ae).use_count??""}× genutzt`)),f(st,Mt)};F(Ct,st=>{t(ae).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); + background:${Mt??""}`),h(Ze,t(ae).name),h(Qe,t(ae).source)},[()=>(t(ae).status||"").includes("enabled")?"":"opacity:.45",()=>(t(ae).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),f(Je,ze)}),f(j,ce)};F(w,j=>{t(O).length===0?j(ee):j(Z,-1)})}z(()=>{var j,ce,Je,ae;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,`● ${((ce=t(x))==null?void 0:ce.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 ${(ae=t(x))!=null&&ae.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),ue=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),ie=i(r(V),2),re=r(ie),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 ce=Nv(),Je=i(r(ce),2),ae=r(Je),ze=i(ae,2),Ue=r(ze),ut=r(Ue);z(()=>h(ut,'echo "'+t(E)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),k("click",ae,ye),f(j,ce)},ee=j=>{var ce=qv();f(j,ce)};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(ue,((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(ie,`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 ue=Gv(),M=r(ue);z(()=>h(M,Ge)),k("click",ue,()=>{d(l,Ge,!0),Re()}),f(Se,ue)}),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=Ca(),Se=ot(Y);{var Ge=X=>{var pe=Uv(),De=r(pe),je=r(De);z(()=>h(je,L.content)),f(X,pe)},ue=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 ie=Jv(),re=r(ie);z(()=>h(re,L.content)),f(V,ie)};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(ue,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),ve=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(ve,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,ue;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":(ue=t(p))!=null&&ue.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){ha.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);