diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 22cb359..c3f87e4 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -37,11 +37,16 @@ function applyStatus(s: any) { const host = (s.swap_url || '').replace(/^https?:\/\//, '') dot && (dot.className = 'dot ' + (s.swap_ok ? 'on' : 'off')) label && (label.textContent = (s.swap_ok ? 'LLM-Engine: Online – ' : 'LLM-Engine: Offline – ') + host) - const active = (s.models || []).find((m: any) => m.state === 'running') + const LOADED = ['running', 'ready', 'loading', 'starting'] + const active = (s.models || []).find((m: any) => LOADED.includes(m.state)) if (activeText) { - activeText.innerHTML = active - ? `Geladen: ${active.name}` - : 'Kein Modell im VRAM' + if (active) { + const ctx = active.meta?.ctx ? ` · ${Math.round(active.meta.ctx / 1024)}k ctx` : '' + const stateLabel = active.state === 'loading' || active.state === 'starting' ? ' lädt…' : '' + activeText.innerHTML = `${active.name}${ctx}${stateLabel}` + } else { + activeText.innerHTML = 'Kein Modell im VRAM' + } } if (s.swap_ok) hideAlert() else showAlert(`LLM-Engine nicht erreichbar unter ${host} – läuft der llama-swap Dienst?`, true) diff --git a/frontend/src/panels/CookbookPanel.svelte b/frontend/src/panels/CookbookPanel.svelte index 50eeb61..0d35670 100644 --- a/frontend/src/panels/CookbookPanel.svelte +++ b/frontend/src/panels/CookbookPanel.svelte @@ -302,12 +302,24 @@

Aktuell die besten Modelle für dein System

- {discoverData ? 'aktuell' : ''} + + {#if discoverData?.updated} + {@const ageMin = Math.round((Date.now() / 1000 - discoverData.updated) / 60)} + {#if ageMin < 60} + Quellen befragt vor {ageMin} min + {:else if ageMin < 1440} + Quellen befragt vor {Math.round(ageMin / 60)} h + {:else} + Quellen befragt vor {Math.round(ageMin / 1440)} Tg. + {/if} + {#if discoverStale} · ⚠ Cache veraltet{/if} + {/if} +
-
Täglich aktualisierte Top-Modelle je Kategorie — Hardware-Fit berechnet für dein System. {discoverStale ? '⚠ Cache veraltet.' : ''}
+
Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.
{#if discoverLoading && !discoverData}
Frage Quellen ab…
{:else if discoverData?.categories} diff --git a/frontend/src/panels/OverviewPanel.svelte b/frontend/src/panels/OverviewPanel.svelte index 331ea68..b10417d 100644 --- a/frontend/src/panels/OverviewPanel.svelte +++ b/frontend/src/panels/OverviewPanel.svelte @@ -3,13 +3,15 @@ import { statusStore } from '../stores/status.svelte.js' import { systemStore } from '../stores/system.svelte.js' import { api } from '@core/api.js' - import { confirmModal, icon } from '@core/ui.js' + import { confirmModal, icon, fmtBytes } from '@core/ui.js' const s = $derived(statusStore.value) const sys = $derived(systemStore.value) const allModels = $derived((s?.models || []) as any[]) const swapOk = $derived(s?.swap_ok ?? false) - const activeModel = $derived(allModels.find((m: any) => ['running','ready','loading','starting'].includes(m.state))) + const LOADED = ['running', 'ready', 'loading', 'starting'] + const activeModel = $derived(allModels.find((m: any) => LOADED.includes(m.state))) + const configuredModels = $derived(allModels.filter((m: any) => !m.incomplete)) const heroTitle = $derived( !s ? 'Verbinde…' @@ -21,98 +23,123 @@ !s ? '' : !swapOk ? 'Der llama-swap-Dienst antwortet gerade nicht.' : sys && sys.ram.percent >= 90 ? `Arbeitsspeicher bei ${Math.round(sys.ram.percent)} % — eventuell Speicher freigeben.` - : `${allModels.length} ${allModels.length === 1 ? 'Modell' : 'Modelle'} bereit · ${activeModel ? `„${activeModel.name}" geladen` : 'keins geladen'} · keine Warnungen.` + : `${configuredModels.length} ${configuredModels.length === 1 ? 'Modell' : 'Modelle'} konfiguriert · ${activeModel ? `„${activeModel.name}" geladen` : 'keines geladen'} · keine Warnungen.` ) + const gpuPct = $derived(() => { const g = sys?.gpu if (g && (g.vram.total + g.gtt.total) > 0) return ((g.vram.used + g.gtt.used) / (g.vram.total + g.gtt.total)) * 100 return 0 }) - const tempWord = (t: number | null) => - t == null ? '' : t < 55 ? 'kühl & gesund' : t < 72 ? 'normal' : 'läuft heiß' let news = $state([]) + let preloadingModel = $state(null) onMount(async () => { try { news = ((await api('/api/news')).items || []).slice(0, 4) } catch {} }) async function freeMemory() { - const ok = await confirmModal({ + if (!await confirmModal({ title: 'Speicher freigeben?', - body: 'Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.', + body: 'Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.', confirmLabel: 'Speicher freigeben', - }) - if (!ok) return + })) return await api('/api/unload', { method: 'POST' }) - document.dispatchEvent(new Event('mc:refresh')) + refresh() } + async function preload(modelName: string) { + preloadingModel = modelName + try { await api('/api/preload?model=' + encodeURIComponent(modelName), { method: 'POST' }) } + catch {} + preloadingModel = null + refresh() + } + + function refresh() { document.dispatchEvent(new Event('mc:refresh')) } function go(view: string) { document.querySelector(`.nav-item[data-view="${view}"]`)?.dispatchEvent(new MouseEvent('click')) } - function capTagClass(caps: string[]) { - if (caps?.includes('Bild')) return 'img' - if (caps?.includes('Code')) return 'code' - return 'text' - } - function capTagLabel(caps: string[]) { - if (caps?.includes('Bild')) return 'Bild' - if (caps?.includes('Code')) return 'Code' - return 'Text' - } + function ramColor(pct: number) { return pct >= 90 ? 'red' : pct >= 75 ? '' : 'green' } + function tempColor(t: number | null) { return t == null ? '' : t >= 75 ? 'red' : t >= 55 ? '' : 'green' } + function gpuColor(pct: number) { return pct >= 90 ? 'red' : pct >= 70 ? '' : 'green' } -
+ +
-

{heroTitle}

+

+ {heroTitle} + {#if swapOk && !activeModel} + — bereit für Anfragen + {/if} +

{heroSub}
+
-
-
LLM-Engine
-
{swapOk ? 'Online' : 'Offline'}
-
llama-swap
+
+
+ LLM-Engine + {@html icon('server')} +
+
{swapOk ? 'Online' : 'Offline'}
+
{s?.swap_url?.replace(/^https?:\/\//, '') ?? '—'}
-
-
Aktives Modell
-
{activeModel ? activeModel.name : 'Keins'}
-
{activeModel ? 'im Grafikspeicher' : 'nichts geladen'}
+ +
+
+ Aktives Modell + {@html icon('cpu')} +
+
{activeModel ? activeModel.name : 'Keins'}
+
+ {#if activeModel} + {activeModel.meta?.ctx ? Math.round(activeModel.meta.ctx / 1024) + 'k ctx' : ''} · {activeModel.state} + {:else} + lädt bei erster Anfrage + {/if} +
+ {#if sys} {@const t = sys.gpu_temp ?? sys.cpu?.temp ?? null} -
-
GPU-Temperatur
-
{t != null ? `${Math.round(t)}°` : '–'}
-
{tempWord(t)}
+ {@const tCol = tempColor(t)} +
+
Temperatur (GPU){@html icon('thermo')}
+
{t != null ? `${Math.round(t)}°C` : '–'}
+
{t == null ? 'messe…' : t < 55 ? 'kühl' : t < 75 ? 'normal' : '⚠ heiß'}
{@const free = sys.ram.total - sys.ram.used} -
-
Freier Speicher
-
{Math.round(free / 1024 ** 3)} GB
-
von {Math.round(sys.ram.total / 1024 ** 3)} GB
+ {@const freePct = 100 - sys.ram.percent} +
+
Freier Speicher{@html icon('database')}
+
{Math.round(free / 1024 ** 3)} GB
+
von {Math.round(sys.ram.total / 1024 ** 3)} GB · {Math.round(freePct)} % frei
{:else} -
GPU-Temperatur
messe…
-
Freier Speicher
messe…
+
Temperatur
messe…
+
Freier Speicher
messe…
{/if}
+

System-Gesundheit

-
So ausgelastet ist dein Mini-PC gerade.
+
Auslastung in Echtzeit.
{#if sys} {@const gpu = gpuPct()} {#each [ - ['Prozessor (CPU)', sys.cpu?.percent ?? 0], - ['Arbeitsspeicher (RAM)', sys.ram.percent], - ['Grafikspeicher (VRAM)', gpu] - ] as [label, pct]} + ['Prozessor (CPU)', sys.cpu?.percent ?? 0, ''], + ['Arbeitsspeicher (RAM)', sys.ram.percent, ramColor(sys.ram.percent)], + ['Grafikspeicher (VRAM)', gpu, gpuColor(gpu)] + ] as [label, pct, cls]} {@const p = Math.max(0, Math.min(100, (pct as number) || 0))}
{label}{Math.round(p)} %
@@ -134,7 +161,7 @@ +
+

Dein Stack

- {allModels.length ? allModels.length + ' konfiguriert' : ''} + {configuredModels.length ? configuredModels.length + ' konfiguriert' : ''}
- {#if allModels.length} + {#if configuredModels.length}
- {#each allModels as m} + {#each configuredModels as m} + {@const isLoaded = LOADED.includes(m.state)} {@const downloading = m.state === 'downloading'} - {@const on = ['running','ready','loading','starting'].includes(m.state)} - {@const dot = (m.state === 'loading' || m.state === 'starting' || downloading) ? 'load' : on ? 'on' : ''} + {@const dot = (m.state === 'loading' || m.state === 'starting' || downloading) ? 'load' : isLoaded ? 'on' : ''} {@const statusText = downloading - ? `↓ Download${m.download_progress != null ? ` ${Math.round(m.download_progress)}%` : ''}` - : on ? (m.state === 'loading' ? 'lädt…' : 'geladen') : 'bereit'} -
+ ? `↓ ${m.download_progress != null ? Math.round(m.download_progress) + '%' : '...'}` + : m.state === 'loading' || m.state === 'starting' ? 'lädt…' + : isLoaded ? 'geladen ✓' : 'bereit'} +
-
- {m.name} - {#if m.meta?.caps?.length} - {capTagLabel(m.meta.caps)} - {/if} +
+ {m.name} + {#if m.meta?.caps?.includes('Bild')}Bild + {:else if m.meta?.caps?.includes('Code')}Code + {:else}Text{/if} + {#if m.ttl >= 99999}∞ aktiv{/if}
- {#if m.meta?.filename} -
{m.meta.filename}
+
+ {m.meta?.ctx ? Math.round(m.meta.ctx / 1024) + 'k ctx' : ''} + {m.meta?.quant ? ' · ' + m.meta.quant : ''} + {m.meta?.size_bytes ? ' · ' + (m.meta.size_bytes / 1024 ** 3).toFixed(1) + ' GB' : ''} +
+
+
+ {statusText} + {#if !isLoaded && !downloading && swapOk} + {/if}
- {statusText}
{/each}
@@ -181,6 +227,7 @@
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
+
{/if}
@@ -197,7 +244,7 @@
{n.title}
-
{n.source}
+
{n.source}{n.relevant ? ' · für dich' : ''}
{/each} diff --git a/frontend/src/panels/ServerPanel.svelte b/frontend/src/panels/ServerPanel.svelte index febde21..1afdf09 100644 --- a/frontend/src/panels/ServerPanel.svelte +++ b/frontend/src/panels/ServerPanel.svelte @@ -113,7 +113,8 @@ let swapCheckOk = $state(false) const swapModels = $derived((status?.models || []) as any[]) - const loadedModel = $derived(swapModels.find((m: any) => m.state === 'running' || m.state === 'loading')) + const LOADED = ['running', 'ready', 'loading', 'starting'] + const loadedModel = $derived(swapModels.find((m: any) => LOADED.includes(m.state))) // Job progress helpers function jobPct(j: any) { diff --git a/routers/models.py b/routers/models.py index c2428e6..ea16e22 100644 --- a/routers/models.py +++ b/routers/models.py @@ -342,6 +342,22 @@ def delete_model(req: DeleteReq): return {"ok": True, "alias": req.alias, "freed_bytes": freed, "note": note or "Modell entfernt."} +@router.post("/preload") +def preload(model: str): + """Modell vorwaermen: sendet eine Minimal-Anfrage damit llama-swap es laedt. + max_tokens=1 haelt die Antwort kurz; der Token wird verworfen.""" + try: + with httpx.Client(timeout=60.0) as c: + c.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", json={ + "model": model, + "messages": [{"role": "user", "content": "!"}], + "max_tokens": 1, + }) + return {"ok": True} + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, f"llama-swap nicht erreichbar: {exc}") + + @router.post("/unload") def unload(model: str | None = None): path = f"/api/models/unload/{model}" if model else "/api/models/unload" diff --git a/static/css/base.css b/static/css/base.css index c2903e5..5c5195d 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -91,8 +91,16 @@ a{color:var(--accent);text-decoration:none} .dot.on{background:var(--on);box-shadow:0 0 0 0 rgba(63,185,80,.5);animation:pulse 2.2s infinite} .dot.off{background:var(--err)} @keyframes pulse{0%{box-shadow:0 0 0 0 rgba(63,185,80,.45)}70%{box-shadow:0 0 0 7px rgba(63,185,80,0)}100%{box-shadow:0 0 0 0 rgba(63,185,80,0)}} -.top-stat{font-size:var(--text-sm);color:var(--mut)} -.top-stat b{color:var(--tx);font-family:var(--mono);font-weight:500;margin-left:4px} +.top-stat{font-size:var(--text-sm);color:var(--mut);display:flex;align-items:center;gap:5px} +.top-stat b{color:var(--accent);font-family:var(--mono);font-weight:600;letter-spacing:.01em} +/* Aktives Modell in Topbar — klarer sichtbar wenn geladen */ +#top-active-text{ + font-family:var(--mono);font-size:var(--text-sm); + padding:4px 10px;border-radius:999px; + border:1px solid transparent;transition:border-color .3s,background .3s; +} +#top-active-text b{font-weight:600} +#top-active-text:has(b){border-color:rgba(45,212,191,.25);background:rgba(45,212,191,.07)} .top-clock{font-family:var(--mono);font-size:var(--text-sm);color:var(--accent)} /* Security-Chip (zeigt LAN/Token-Status) */ diff --git a/static/dist/main.js b/static/dist/main.js index a886e11..0023b1e 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,51 +1,53 @@ -var tl=Object.defineProperty;var Si=e=>{throw TypeError(e)};var nl=(e,t,a)=>t in e?tl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var tn=(e,t,a)=>nl(e,typeof t!="symbol"?t+"":t,a),Br=(e,t,a)=>t.has(e)||Si("Cannot "+a);var v=(e,t,a)=>(Br(e,t,"read from private field"),a?a.call(e):t.get(e)),oe=(e,t,a)=>t.has(e)?Si("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),ae=(e,t,a,r)=>(Br(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),we=(e,t,a)=>(Br(e,t,"access private method"),a);var di=Array.isArray,al=Array.prototype.indexOf,mr=Array.prototype.includes,Tr=Array.from,rl=Object.defineProperty,Ua=Object.getOwnPropertyDescriptor,il=Object.getOwnPropertyDescriptors,sl=Object.prototype,ll=Array.prototype,ts=Object.getPrototypeOf,Ei=Object.isExtensible;const ol=()=>{};function dl(e){for(var t=0;t{e=r,t=i});return{promise:a,resolve:e,reject:t}}function Ya(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const r of e)if(a.push(r),a.length===t)break;return a}const Ot=2,Ca=4,$r=8,as=1<<24,yn=16,xn=32,Jn=64,Jr=128,fn=512,gt=1024,Pt=2048,Ln=4096,Ft=8192,pn=16384,Oa=32768,Qr=1<<25,La=65536,br=1<<17,cl=1<<18,Ra=1<<19,ul=1<<20,$n=1<<25,pa=65536,yr=1<<21,wa=1<<22,Wn=1<<23,xa=Symbol("$state"),vl=Symbol(""),vr=Symbol("attributes"),Yr=Symbol("class"),Zr=Symbol("style"),Ia=Symbol("text"),fr=Symbol("form reset"),Ar=new class extends Error{constructor(){super(...arguments);tn(this,"name","StaleReactionError");tn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Yi;const fl=!!((Yi=globalThis.document)!=null&&Yi.contentType)&&globalThis.document.contentType.includes("xml");function rs(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function pl(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function gl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function _l(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ml(e){throw new Error("https://svelte.dev/e/effect_orphan")}function bl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function yl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function wl(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function xl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function kl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Ml=1,Sl=2,is=4,El=8,Tl=16,$l=1,Al=2,ht=Symbol("uninitialized"),ss="http://www.w3.org/1999/xhtml",Cl="http://www.w3.org/2000/svg",Ll="http://www.w3.org/1998/Math/MathML";function zl(){console.warn("https://svelte.dev/e/derived_inert")}function Pl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Dl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function ls(e){return e===this.v}function Ol(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function os(e){return!Ol(e,this.v)}let Dt=null;function za(e){Dt=e}function Yn(e,t=!1,a){Dt={p:Dt,i:!1,c:null,e:null,s:e,x:null,r:pe,l:null}}function Zn(e){var t=Dt,a=t.e;if(a!==null){t.e=null;for(var r of a)Cs(r)}return t.i=!0,Dt=t.p,{}}function ds(){return!0}let ta=[];function cs(){var e=ta;ta=[],dl(e)}function ca(e){if(ta.length===0&&!Va){var t=ta;queueMicrotask(()=>{t===ta&&cs()})}ta.push(e)}function Rl(){for(;ta.length>0;)cs()}function us(e){var t=pe;if(t===null)return ue.f|=Wn,e;if((t.f&Oa)===0&&(t.f&Ca)===0)throw e;Hn(e,t)}function Hn(e,t){if(!(t!==null&&(t.f&pn)!==0)){for(;t!==null;){if((t.f&Jr)!==0){if((t.f&Oa)===0)throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const Bl=-7169;function ot(e,t){e.f=e.f&Bl|t}function ci(e){(e.f&fn)!==0||e.deps===null?ot(e,gt):ot(e,Ln)}function vs(e){if(e!==null)for(const t of e)(t.f&Ot)===0||(t.f&pa)===0||(t.f^=pa,vs(t.deps))}function fs(e,t,a){(e.f&Pt)!==0?t.add(e):(e.f&Ln)!==0&&a.add(e),vs(e.deps),ot(e,gt)}function ql(e){let t=0,a=ga(0),r;return()=>{_i()&&(n(a),Cr(()=>(t===0&&(r=Ba(()=>e(()=>Wa(a)))),t+=1,()=>{ca(()=>{t-=1,t===0&&(r==null||r(),r=void 0,Wa(a))})})))}}var Il=La|Ra;function Nl(e,t,a,r){new Fl(e,t,a,r)}var dn,oi,cn,ia,jt,un,Nt,an,Pn,sa,Gn,ka,tr,nr,Dn,Mr,at,Kl,Gl,Ul,Xr,pr,hr,ei,ti;class Fl{constructor(t,a,r,i){oe(this,at);tn(this,"parent");tn(this,"is_pending",!1);tn(this,"transform_error");oe(this,dn);oe(this,oi,null);oe(this,cn);oe(this,ia);oe(this,jt);oe(this,un,null);oe(this,Nt,null);oe(this,an,null);oe(this,Pn,null);oe(this,sa,0);oe(this,Gn,0);oe(this,ka,!1);oe(this,tr,new Set);oe(this,nr,new Set);oe(this,Dn,null);oe(this,Mr,ql(()=>(ae(this,Dn,ga(v(this,sa))),()=>{ae(this,Dn,null)})));var o;ae(this,dn,t),ae(this,cn,a),ae(this,ia,d=>{var c=pe;c.b=this,c.f|=Jr,r(d)}),this.parent=pe.b,this.transform_error=i??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),ae(this,jt,bi(()=>{we(this,at,Xr).call(this)},Il))}defer_effect(t){fs(t,v(this,tr),v(this,nr))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!v(this,cn).pending}update_pending_count(t,a){we(this,at,ei).call(this,t,a),ae(this,sa,v(this,sa)+t),!(!v(this,Dn)||v(this,ka))&&(ae(this,ka,!0),ca(()=>{ae(this,ka,!1),v(this,Dn)&&Pa(v(this,Dn),v(this,sa))}))}get_effect_pending(){return v(this,Mr).call(this),n(v(this,Dn))}error(t){if(!v(this,cn).onerror&&!v(this,cn).failed)throw t;W!=null&&W.is_fork?(v(this,un)&&W.skip_effect(v(this,un)),v(this,Nt)&&W.skip_effect(v(this,Nt)),v(this,an)&&W.skip_effect(v(this,an)),W.oncommit(()=>{we(this,at,ti).call(this,t)})):we(this,at,ti).call(this,t)}}dn=new WeakMap,oi=new WeakMap,cn=new WeakMap,ia=new WeakMap,jt=new WeakMap,un=new WeakMap,Nt=new WeakMap,an=new WeakMap,Pn=new WeakMap,sa=new WeakMap,Gn=new WeakMap,ka=new WeakMap,tr=new WeakMap,nr=new WeakMap,Dn=new WeakMap,Mr=new WeakMap,at=new WeakSet,Kl=function(){try{ae(this,un,vn(()=>v(this,ia).call(this,v(this,dn))))}catch(t){this.error(t)}},Gl=function(t){const a=v(this,cn).failed;a&&ae(this,an,vn(()=>{a(v(this,dn),()=>t,()=>()=>{})}))},Ul=function(){const t=v(this,cn).pending;t&&(this.is_pending=!0,ae(this,Nt,vn(()=>t(v(this,dn)))),ca(()=>{var a=ae(this,Pn,document.createDocumentFragment()),r=jn();a.append(r),ae(this,un,we(this,at,hr).call(this,()=>vn(()=>v(this,ia).call(this,r)))),v(this,Gn)===0&&(v(this,dn).before(a),ae(this,Pn,null),va(v(this,Nt),()=>{ae(this,Nt,null)}),we(this,at,pr).call(this,W))}))},Xr=function(){try{if(this.is_pending=this.has_pending_snippet(),ae(this,Gn,0),ae(this,sa,0),ae(this,un,vn(()=>{v(this,ia).call(this,v(this,dn))})),v(this,Gn)>0){var t=ae(this,Pn,document.createDocumentFragment());wi(v(this,un),t);const a=v(this,cn).pending;ae(this,Nt,vn(()=>a(v(this,dn))))}else we(this,at,pr).call(this,W)}catch(a){this.error(a)}},pr=function(t){this.is_pending=!1,t.transfer_effects(v(this,tr),v(this,nr))},hr=function(t){var a=pe,r=ue,i=Dt;zn(v(this,jt)),hn(v(this,jt)),za(v(this,jt).ctx);try{return ha.ensure(),t()}catch(o){return us(o),null}finally{zn(a),hn(r),za(i)}},ei=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&we(r=this.parent,at,ei).call(r,t,a);return}ae(this,Gn,v(this,Gn)+t),v(this,Gn)===0&&(we(this,at,pr).call(this,a),v(this,Nt)&&va(v(this,Nt),()=>{ae(this,Nt,null)}),v(this,Pn)&&(v(this,dn).before(v(this,Pn)),ae(this,Pn,null)))},ti=function(t){v(this,un)&&(Yt(v(this,un)),ae(this,un,null)),v(this,Nt)&&(Yt(v(this,Nt)),ae(this,Nt,null)),v(this,an)&&(Yt(v(this,an)),ae(this,an,null));var a=v(this,cn).onerror;let r=v(this,cn).failed;var i=!1,o=!1;const d=()=>{if(i){Dl();return}i=!0,o&&kl(),v(this,an)!==null&&va(v(this,an),()=>{ae(this,an,null)}),we(this,at,hr).call(this,()=>{we(this,at,Xr).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(f){Hn(f,v(this,jt)&&v(this,jt).parent)}r&&ae(this,an,we(this,at,hr).call(this,()=>{try{return vn(()=>{var f=pe;f.b=this,f.f|=Jr,r(v(this,dn),()=>u,()=>d)})}catch(f){return Hn(f,v(this,jt).parent),null}}))};ca(()=>{var u;try{u=this.transform_error(t)}catch(f){Hn(f,v(this,jt)&&v(this,jt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,f=>Hn(f,v(this,jt)&&v(this,jt).parent)):c(u)})};function Hl(e,t,a,r){const i=ui;var o=e.filter(b=>!b.settled),d=t.map(i);if(a.length===0&&o.length===0){r(d);return}var c=pe,u=Vl(),f=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(b=>b.promise)):null;function _(b){if((c.f&pn)===0){u();try{r([...d,...b])}catch(A){Hn(A,c)}wr()}}var T=ps();if(a.length===0){f.then(()=>_([])).finally(T);return}function h(){Promise.all(a.map(b=>Wl(b))).then(_).catch(b=>Hn(b,c)).finally(T)}f?f.then(()=>{u(),h(),wr()}):h()}function Vl(){var e=pe,t=ue,a=Dt,r=W;return function(o=!0){zn(e),hn(t),za(a),o&&(e.f&pn)===0&&(r==null||r.activate(),r==null||r.apply())}}function wr(e=!0){zn(null),hn(null),za(null),e&&(W==null||W.deactivate())}function ps(){var e=pe,t=e.b,a=W,r=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,a),a.increment(r,e),()=>{t==null||t.update_pending_count(-1,a),a.decrement(r,e)}}function ui(e){var t=Ot|Pt;return pe!==null&&(pe.f|=Ra),{ctx:Dt,deps:null,effects:null,equals:ls,f:t,fn:e,reactions:null,rv:0,v:ht,wv:0,parent:pe,ac:null}}const Na=Symbol("obsolete");function Wl(e,t,a){let r=pe;r===null&&pl();var i=void 0,o=ga(ht),d=!ue,c=new Set;return uo(()=>{var b,A;var u=pe,f=ns();i=f.promise;try{Promise.resolve(e()).then(f.resolve,L=>{L!==Ar&&f.reject(L)}).finally(wr)}catch(L){f.reject(L),wr()}var _=W;if(d){if((u.f&Oa)!==0)var T=ps();if((b=r.b)!=null&&b.is_rendered())(A=_.async_deriveds.get(u))==null||A.reject(Na);else for(const L of c.values())L.reject(Na);c.add(f),_.async_deriveds.set(u,f)}const h=(L,S=void 0)=>{T==null||T(),c.delete(f),S!==Na&&(_.activate(),S?(o.f|=Wn,Pa(o,S)):((o.f&Wn)!==0&&(o.f^=Wn),Pa(o,L)),_.deactivate())};f.promise.then(h,L=>h(null,L||"unknown"))}),As(()=>{for(const u of c)u.reject(Na)}),new Promise(u=>{function f(_){function T(){_===i?u(o):f(i)}_.then(T,T)}f(i)})}function q(e){const t=ui(e);return Bs(t),t}function jl(e){const t=ui(e);return t.equals=os,t}function Jl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;athis.schedule(r)){var r=v(this,En).get(t);if(r){v(this,En).delete(t);for(var i of r.d)ot(i,Pt),a(i);for(i of r.m)ot(i,Ln),a(i)}v(this,Aa).add(t)}capture(t,a,r=!1){t.v!==ht&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Wn)===0&&(this.current.set(t,[a,r]),zt==null||zt.set(t,a)),this.is_fork||(t.v=a)}activate(){W=this}deactivate(){W=null,zt=null}flush(){try{Ir=!0,W=this,we(this,$e,Fa).call(this)}finally{Ti=0,ni=null,ya=null,gr=null,Ir=!1,W=null,zt=null,ua.clear()}}discard(){var t;for(const a of v(this,Ea))a(this);v(this,Ea).clear();for(const a of this.async_deriveds.values())a.reject(Na);we(this,$e,Ka).call(this),(t=v(this,$a))==null||t.resolve()}register_created_effect(t){v(this,ar).push(t)}increment(t,a){if(ae(this,Ta,v(this,Ta)+1),t){let r=v(this,On).get(a)??0;v(this,On).set(a,r+1)}}decrement(t,a){if(ae(this,Ta,v(this,Ta)-1),t){let r=v(this,On).get(a)??0;r===1?v(this,On).delete(a):v(this,On).set(a,r-1)}v(this,oa)||(ae(this,oa,!0),ca(()=>{ae(this,oa,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const r of t)v(this,Rn).add(r);for(const r of a)v(this,_n).add(r);t.clear(),a.clear()}oncommit(t){v(this,Sa).add(t)}ondiscard(t){v(this,Ea).add(t)}settled(){return(v(this,$a)??ae(this,$a,ns())).promise}static ensure(){if(W===null){const t=W=new Sr;!Ir&&!Va&&ca(()=>{v(t,Ma)||t.flush()})}return W}apply(){{zt=null;return}}schedule(t){var i;if(ni=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ca|$r|as))!==0&&(t.f&Oa)===0){t.b.defer_effect(t);return}for(var a=t;a.parent!==null;){a=a.parent;var r=a.f;if(ya!==null&&a===pe&&(ue===null||(ue.f&Ot)===0))return;if((r&(Jn|xn))!==0){if((r>)===0)return;a.f^=gt}}v(this,Jt).push(a)}};Ma=new WeakMap,Un=new WeakMap,la=new WeakMap,Sa=new WeakMap,Ea=new WeakMap,Ta=new WeakMap,On=new WeakMap,$a=new WeakMap,Jt=new WeakMap,ar=new WeakMap,Rn=new WeakMap,_n=new WeakMap,En=new WeakMap,Aa=new WeakMap,oa=new WeakMap,$e=new WeakSet,ai=function(){if(this.is_fork)return!0;for(const r of v(this,On).keys()){for(var t=r,a=!1;t.parent!==null;){if(v(this,En).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},Fa=function(){var u,f,_,T;ae(this,Ma,!0),Ti++>1e3&&(we(this,$e,Ka).call(this),eo());for(const h of v(this,Rn))v(this,_n).delete(h),ot(h,Pt),this.schedule(h);for(const h of v(this,_n))ot(h,Ln),this.schedule(h);const t=v(this,Jt);ae(this,Jt,[]),this.apply();var a=ya=[],r=[],i=gr=[];for(const h of t)try{we(this,$e,ri).call(this,h,a,r)}catch(b){throw ws(h),we(this,$e,ai).call(this)||this.discard(),b}if(W=null,i.length>0){var o=Sr.ensure();for(const h of i)o.schedule(h)}if(ya=null,gr=null,we(this,$e,ai).call(this)){we(this,$e,ba).call(this,r),we(this,$e,ba).call(this,a);for(const[h,b]of v(this,En))ys(h,b);i.length>0&&we(u=W,$e,Fa).call(u);return}const d=we(this,$e,_s).call(this);if(d){we(this,$e,ba).call(this,r),we(this,$e,ba).call(this,a),we(f=d,$e,ms).call(f,this);return}v(this,Rn).clear(),v(this,_n).clear();for(const h of v(this,Sa))h(this);v(this,Sa).clear(),Ha=this,$i(r),$i(a),Ha=null,(_=v(this,$a))==null||_.resolve();var c=W;if(v(this,Ta)===0&&(v(this,Jt).length===0||c!==null)&&we(this,$e,Ka).call(this),v(this,Jt).length>0)if(c!==null){const h=c;v(h,Jt).push(...v(this,Jt).filter(b=>!v(h,Jt).includes(b)))}else c=this;c!==null&&we(T=c,$e,Fa).call(T)},ri=function(t,a,r){t.f^=gt;for(var i=t.first;i!==null;){var o=i.f,d=(o&(xn|Jn))!==0,c=d&&(o>)!==0,u=c||(o&Ft)!==0||v(this,En).has(i);if(!u&&i.fn!==null){d?i.f^=gt:(o&Ca)!==0?a.push(i):lr(i)&&((o&yn)!==0&&v(this,_n).add(i),Da(i));var f=i.first;if(f!==null){i=f;continue}}for(;i!==null;){var _=i.next;if(_!==null){i=_;break}i=i.parent}}},_s=function(){for(var t=v(this,Un);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=v(t,Un)}return null},ms=function(t){var r;for(const[i,o]of t.current)!this.previous.has(i)&&t.previous.has(i)&&this.previous.set(i,t.previous.get(i)),this.current.set(i,o);for(const[i,o]of t.async_deriveds){const d=this.async_deriveds.get(i);d&&o.promise.then(d.resolve).catch(d.reject)}t.async_deriveds.clear(),this.transfer_effects(v(t,Rn),v(t,_n));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&Ot)!==0)a(u);else{var c=u;d&(wa|yn)&&!this.async_deriveds.has(c)&&(v(this,_n).delete(c),ot(c,Pt),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),we(r=t,$e,Ka).call(r),W=this,we(this,$e,Fa).call(this)},ba=function(t){for(var a=0;a!h.current.get(b)[1]);if(!(!v(h,Ma)||i.length===0)){var o=i.filter(b=>!this.current.has(b));if(o.length===0)t&&h.discard();else if(a.length>0){if(t)for(const b of v(this,Aa))h.unskip_effect(b,A=>{var L;(A.f&(yn|wa))!==0?h.schedule(A):we(L=h,$e,ba).call(L,[A])});h.activate();var d=new Set,c=new Map;for(var u of a)bs(u,o,d,c);c=new Map;var f=[...h.current].filter(([b,A])=>{const L=this.current.get(b);return L?L[0]!==A[0]||L[1]!==A[1]:!0}).map(([b])=>b);if(f.length>0)for(const b of v(this,ar))(b.f&(pn|Ft|br))===0&&fi(b,f,c)&&((b.f&(wa|yn))!==0?(ot(b,Pt),h.schedule(b)):v(h,Rn).add(b));if(v(h,Jt).length>0&&!v(h,oa)){h.apply();for(var _ of v(h,Jt))we(T=h,$e,ri).call(T,_,[],[]);ae(h,Jt,[])}h.deactivate()}}}},Ka=function(){if(this.linked){var t=v(this,Un),a=v(this,la);t===null?qr=a:ae(t,la,a),a===null?ma=t:ae(a,Un,t),this.linked=!1}};let ha=Sr;function Xl(e){var t=Va;Va=!0;try{for(var a;;){if(Rl(),W===null)return a;W.flush()}}finally{Va=t}}function eo(){try{bl()}catch(e){Hn(e,ni)}}let gn=null;function $i(e){var t=e.length;if(t!==0){for(var a=0;a0)){ua.clear();for(const i of gn){if((i.f&(pn|Ft))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)gn.has(d)&&(gn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(pn|Ft))===0&&Da(u)}}gn.clear()}}gn=null}}function bs(e,t,a,r){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const i of e.reactions){const o=i.f;(o&Ot)!==0?bs(i,t,a,r):(o&(wa|yn))!==0&&(o&Pt)===0&&fi(i,t,r)&&(ot(i,Pt),pi(i))}}function fi(e,t,a){const r=a.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const i of e.deps){if(mr.call(t,i))return!0;if((i.f&Ot)!==0&&fi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function pi(e){W.schedule(e)}function ys(e,t){if(!((e.f&xn)!==0&&(e.f>)!==0)){(e.f&Pt)!==0?t.d.push(e):(e.f&Ln)!==0&&t.m.push(e),ot(e,gt);for(var a=e.first;a!==null;)ys(a,t),a=a.next}}function ws(e){ot(e,gt);for(var t=e.first;t!==null;)ws(t),t=t.next}let xr=new Set;const ua=new Map;let xs=!1;function ga(e,t){var a={f:0,v:e,reactions:null,equals:ls,rv:0,wv:0};return a}function R(e,t){const a=ga(e);return Bs(a),a}function to(e,t=!1,a=!0){const r=ga(e);return t||(r.equals=os),r}function g(e,t,a=!1){ue!==null&&(!wn||(ue.f&br)!==0)&&ds()&&(ue.f&(Ot|yn|wa|br))!==0&&(An===null||!An.has(e))&&xl();let r=a?Bt(t):t;return Pa(e,r,gr)}function Pa(e,t,a=null){if(!e.equals(t)){ua.set(e,Qn?t:e.v);var r=ha.ensure();if(r.capture(e,t),(e.f&Ot)!==0){const i=e;(e.f&Pt)!==0&&vi(i),zt===null&&ci(i)}e.wv=Is(),ks(e,Pt,a),pe!==null&&(pe.f>)!==0&&(pe.f&(xn|Jn))===0&&(on===null?fo([e]):on.push(e)),!r.is_fork&&xr.size>0&&!xs&&no()}return t}function no(){xs=!1;for(const e of xr){(e.f>)!==0&&ot(e,Ln);let t;try{t=lr(e)}catch{t=!0}t&&Da(e)}xr.clear()}function Wa(e){g(e,e.v+1)}function ks(e,t,a){var r=e.reactions;if(r!==null)for(var i=r.length,o=0;o{if(fa===o)return c();var u=ue,f=fa;hn(null),Pi(o);var _=c();return hn(u),Pi(f),_};return r&&a.set("length",R(e.length)),new Proxy(e,{defineProperty(c,u,f){(!("value"in f)||f.configurable===!1||f.enumerable===!1||f.writable===!1)&&yl();var _=a.get(u);return _===void 0?d(()=>{var T=R(f.value);return a.set(u,T),T}):g(_,f.value,!0),!0},deleteProperty(c,u){var f=a.get(u);if(f===void 0){if(u in c){const _=d(()=>R(ht));a.set(u,_),Wa(i)}}else g(f,ht),Wa(i);return!0},get(c,u,f){var b;if(u===xa)return e;var _=a.get(u),T=u in c;if(_===void 0&&(!T||(b=Ua(c,u))!=null&&b.writable)&&(_=d(()=>{var A=Bt(T?c[u]:ht),L=R(A);return L}),a.set(u,_)),_!==void 0){var h=n(_);return h===ht?void 0:h}return Reflect.get(c,u,f)},getOwnPropertyDescriptor(c,u){var f=Reflect.getOwnPropertyDescriptor(c,u);if(f&&"value"in f){var _=a.get(u);_&&(f.value=n(_))}else if(f===void 0){var T=a.get(u),h=T==null?void 0:T.v;if(T!==void 0&&h!==ht)return{enumerable:!0,configurable:!0,value:h,writable:!0}}return f},has(c,u){var h;if(u===xa)return!0;var f=a.get(u),_=f!==void 0&&f.v!==ht||Reflect.has(c,u);if(f!==void 0||pe!==null&&(!_||(h=Ua(c,u))!=null&&h.writable)){f===void 0&&(f=d(()=>{var b=_?Bt(c[u]):ht,A=R(b);return A}),a.set(u,f));var T=n(f);if(T===ht)return!1}return _},set(c,u,f,_){var ee;var T=a.get(u),h=u in c;if(r&&u==="length")for(var b=f;bR(ht)),a.set(b+"",A))}if(T===void 0)(!h||(ee=Ua(c,u))!=null&&ee.writable)&&(T=d(()=>R(void 0)),g(T,Bt(f)),a.set(u,T));else{h=T.v!==ht;var L=d(()=>Bt(f));g(T,L)}var S=Reflect.getOwnPropertyDescriptor(c,u);if(S!=null&&S.set&&S.set.call(_,f),!h){if(r&&typeof u=="string"){var B=a.get("length"),ye=Number(u);Number.isInteger(ye)&&ye>=B.v&&g(B,ye+1)}Wa(i)}return!0},ownKeys(c){n(i);var u=Reflect.ownKeys(c).filter(T=>{var h=a.get(T);return h===void 0||h.v!==ht});for(var[f,_]of a)_.v!==ht&&!(f in c)&&u.push(f);return u},setPrototypeOf(){wl()}})}function Ai(e){try{if(e!==null&&typeof e=="object"&&xa in e)return e[xa]}catch{}return e}function ao(e,t){return Object.is(Ai(e),Ai(t))}var Ci,Ms,Ss,Es;function ro(){if(Ci===void 0){Ci=window,Ms=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;Ss=Ua(t,"firstChild").get,Es=Ua(t,"nextSibling").get,Ei(e)&&(e[Yr]=void 0,e[vr]=null,e[Zr]=void 0,e.__e=void 0),Ei(a)&&(a[Ia]=void 0)}}function jn(e=""){return document.createTextNode(e)}function Vn(e){return Ss.call(e)}function sr(e){return Es.call(e)}function s(e,t){return Vn(e)}function ft(e,t=!1){{var a=Vn(e);return a instanceof Comment&&a.data===""?sr(a):a}}function l(e,t=1,a=!1){let r=e;for(;t--;)r=sr(r);return r}function io(e){e.textContent=""}function Ts(){return!1}function $s(e,t,a){return t==null||t===ss?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Li=!1;function so(){Li||(Li=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[fr])==null||t.call(a)})},{capture:!0}))}function hi(e){var t=ue,a=pe;hn(null),zn(null);try{return e()}finally{hn(t),zn(a)}}function gi(e,t,a,r=a){e.addEventListener(t,()=>hi(a));const i=e[fr];i?e[fr]=()=>{i(),r(!0)}:e[fr]=()=>r(!0),so()}function lo(e){pe===null&&(ue===null&&ml(),_l()),Qn&&gl()}function oo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function qn(e,t){var a=pe;a!==null&&(a.f&Ft)!==0&&(e|=Ft);var r={ctx:Dt,deps:null,nodes:null,f:e|Pt|fn,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};W==null||W.register_created_effect(r);var i=r;if((e&Ca)!==0)ya!==null?ya.push(r):ha.ensure().schedule(r);else if(t!==null){try{Da(r)}catch(d){throw Yt(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ra)===0&&(i=i.first,(e&yn)!==0&&(e&La)!==0&&i!==null&&(i.f|=La))}if(i!==null&&(i.parent=a,a!==null&&oo(i,a),ue!==null&&(ue.f&Ot)!==0&&(e&Jn)===0)){var o=ue;(o.effects??(o.effects=[])).push(i)}return r}function _i(){return ue!==null&&!wn}function As(e){const t=qn($r,null);return ot(t,gt),t.teardown=e,t}function mi(e){lo();var t=pe.f,a=!ue&&(t&xn)!==0&&Dt!==null&&!Dt.i;if(a){var r=Dt;(r.e??(r.e=[])).push(e)}else return Cs(e)}function Cs(e){return qn(Ca|ul,e)}function co(e){ha.ensure();const t=qn(Jn|Ra,e);return(a={})=>new Promise(r=>{a.outro?va(t,()=>{Yt(t),r(void 0)}):(Yt(t),r(void 0))})}function Ls(e){return qn(Ca,e)}function uo(e){return qn(wa|Ra,e)}function Cr(e,t=0){return qn($r|t,e)}function O(e,t=[],a=[],r=[]){Hl(r,t,a,i=>{qn($r,()=>{e(...i.map(n))})})}function bi(e,t=0){var a=qn(yn|t,e);return a}function vn(e){return qn(xn|Ra,e)}function zs(e){var t=e.teardown;if(t!==null){const a=Qn,r=ue;zi(!0),hn(null);try{t.call(null)}finally{zi(a),hn(r)}}}function yi(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&hi(()=>{i.abort(Ar)});var r=a.next;(a.f&Jn)!==0?a.parent=null:Yt(a,t),a=r}}function vo(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&xn)===0&&Yt(t),t=a}}function Yt(e,t=!0){var a=!1;(t||(e.f&cl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Ps(e.nodes.start,e.nodes.end),a=!0),e.f|=Qr,yi(e,t&&!a),Za(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();zs(e),e.f^=Qr,e.f|=pn;var i=e.parent;i!==null&&i.first!==null&&Ds(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Ps(e,t){for(;e!==null;){var a=e===t?null:sr(e);e.remove(),e=a}}function Ds(e){var t=e.parent,a=e.prev,r=e.next;a!==null&&(a.next=r),r!==null&&(r.prev=a),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=a))}function va(e,t,a=!0){var r=[];Os(e,r,!0);var i=()=>{a&&Yt(e),t&&t()},o=r.length;if(o>0){var d=()=>--o||i();for(var c of r)c.out(d)}else i()}function Os(e,t,a){if((e.f&Ft)===0){e.f^=Ft;var r=e.nodes&&e.nodes.t;if(r!==null)for(const c of r)(c.is_global||a)&&t.push(c);for(var i=e.first;i!==null;){var o=i.next;if((i.f&Jn)===0){var d=(i.f&La)!==0||(i.f&xn)!==0&&(e.f&yn)!==0;Os(i,t,d?a:!1)}i=o}}}function kr(e){Rs(e,!0)}function Rs(e,t){if((e.f&Ft)!==0){e.f^=Ft,(e.f>)===0&&(ot(e,Pt),ha.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&La)!==0||(a.f&xn)!==0;Rs(a,i?t:!1),a=r}var o=e.nodes&&e.nodes.t;if(o!==null)for(const d of o)(d.is_global||t)&&d.in()}}function wi(e,t){if(e.nodes)for(var a=e.nodes.start,r=e.nodes.end;a!==null;){var i=a===r?null:sr(a);t.append(a),a=i}}let _r=!1,Qn=!1;function zi(e){Qn=e}let ue=null,wn=!1;function hn(e){ue=e}let pe=null;function zn(e){pe=e}let An=null;function Bs(e){ue!==null&&(An??(An=new Set)).add(e)}let Qt=null,nn=0,on=null;function fo(e){on=e}let qs=1,na=0,fa=na;function Pi(e){fa=e}function Is(){return++qs}function lr(e){var t=e.f;if((t&Pt)!==0)return!0;if(t&Ot&&(e.f&=~pa),(t&Ln)!==0){for(var a=e.deps,r=a.length,i=0;ie.wv)return!0}(t&fn)!==0&&zt===null&&ot(e,gt)}return!1}function Ns(e,t,a=!0){var r=e.reactions;if(r!==null&&!(An!==null&&An.has(e)))for(var i=0;i{e.ac.abort(Ar)}),e.ac=null);try{e.f|=yr;var _=e.fn,T=_();e.f|=Oa;var h=e.deps,b=W==null?void 0:W.is_fork;if(Qt!==null){var A;if(b||Za(e,nn),h!==null&&nn>0)for(h.length=nn+Qt.length,A=0;A{throw B});throw h}}finally{e[aa]=t,delete e.currentTarget,hn(_),zn(T)}}}var Zi;const Nr=((Zi=globalThis==null?void 0:globalThis.window)==null?void 0:Zi.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function mo(e){return(Nr==null?void 0:Nr.createHTML(e))??e}function bo(e){var t=$s("template");return t.innerHTML=mo(e.replaceAll("","")),t.content}function Xa(e,t){var a=pe;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function M(e,t){var a=(t&$l)!==0,r=(t&Al)!==0,i,o=!e.startsWith("");return()=>{i===void 0&&(i=bo(o?e:""+e),a||(i=Vn(i)));var d=r||Ms?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=Vn(d),u=d.lastChild;Xa(c,u)}else Xa(d,d);return d}}function Lr(){var e=document.createDocumentFragment(),t=document.createComment(""),a=jn();return e.append(t,a),Xa(t,a),e}function x(e,t){e!==null&&e.before(t)}function m(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Ia]??(e[Ia]=e.nodeValue))&&(e[Ia]=a,e.nodeValue=`${a}`)}function yo(e,t){return wo(e,t)}const cr=new Map;function wo(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){ro();var u=void 0,f=co(()=>{var _=a??t.appendChild(jn());Nl(_,{pending:()=>{}},b=>{Yn({});var A=Dt;o&&(A.c=o),i&&(r.$$events=i),u=e(b,r)||{},Zn()},c);var T=new Set,h=b=>{for(var A=0;A{var S;for(var b of T)for(const B of[t,document]){var A=cr.get(B),L=A.get(b);--L==0?(B.removeEventListener(b,Oi),A.delete(b),A.size===0&&cr.delete(B)):A.set(b,L)}ii.delete(h),_!==a&&((S=_.parentNode)==null||S.removeChild(_))}});return xo.set(u,f),u}let xo=new WeakMap;var mn,Tn,rn,da,rr,ir,Er;class ko{constructor(t,a=!0){tn(this,"anchor");oe(this,mn,new Map);oe(this,Tn,new Map);oe(this,rn,new Map);oe(this,da,new Set);oe(this,rr,!0);oe(this,ir,t=>{if(v(this,mn).has(t)){var a=v(this,mn).get(t),r=v(this,Tn).get(a);if(r)kr(r),v(this,da).delete(a);else{var i=v(this,rn).get(a);i&&(kr(i.effect),v(this,Tn).set(a,i.effect),v(this,rn).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of v(this,mn)){if(v(this,mn).delete(o),o===t)break;const c=v(this,rn).get(d);c&&(Yt(c.effect),v(this,rn).delete(d))}for(const[o,d]of v(this,Tn)){if(o===a||v(this,da).has(o))continue;const c=()=>{if(Array.from(v(this,mn).values()).includes(o)){var f=document.createDocumentFragment();wi(d,f),f.append(jn()),v(this,rn).set(o,{effect:d,fragment:f})}else Yt(d);v(this,da).delete(o),v(this,Tn).delete(o)};v(this,rr)||!r?(v(this,da).add(o),va(d,c,!1)):c()}}});oe(this,Er,t=>{v(this,mn).delete(t);const a=Array.from(v(this,mn).values());for(const[r,i]of v(this,rn))a.includes(r)||(Yt(i.effect),v(this,rn).delete(r))});this.anchor=t,ae(this,rr,a)}ensure(t,a){var r=W,i=Ts();if(a&&!v(this,Tn).has(t)&&!v(this,rn).has(t))if(i){var o=document.createDocumentFragment(),d=jn();o.append(d),v(this,rn).set(t,{effect:vn(()=>a(d)),fragment:o})}else v(this,Tn).set(t,vn(()=>a(this.anchor)));if(v(this,mn).set(r,t),i){for(const[c,u]of v(this,Tn))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of v(this,rn))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(v(this,ir)),r.ondiscard(v(this,Er))}else v(this,ir).call(this,r)}}mn=new WeakMap,Tn=new WeakMap,rn=new WeakMap,da=new WeakMap,rr=new WeakMap,ir=new WeakMap,Er=new WeakMap;function V(e,t,a=!1){var r=new ko(e),i=a?La:0;function o(d,c){r.ensure(d,c)}bi(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function Ke(e,t){return t}function Mo(e,t,a){for(var r=[],i=t.length,o,d=t.length,c=0;c{if(o){if(o.pending.delete(T),o.done.add(T),o.pending.size===0){var h=e.outrogroups;si(e,Tr(o.done)),h.delete(o),h.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var u=r.length===0&&a!==null;if(u){var f=a,_=f.parentNode;io(_),_.append(f),e.items.clear()}si(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function si(e,t,a=!0){var r;if(e.pending.size>0){r=new Set;for(const d of e.pending.values())for(const c of d)r.add(e.items.get(c).e)}for(var i=0;i{var ee=a();return di(ee)?ee:ee==null?[]:Tr(ee)}),h,b=new Map,A=!0;function L(ee){(ye.effect.f&pn)===0&&(ye.pending.delete(ee),ye.fallback=_,So(ye,h,d,t,r),_!==null&&(h.length===0?(_.f&$n)===0?kr(_):(_.f^=$n,Ga(_,null,d)):va(_,()=>{_=null})))}function S(ee){ye.pending.delete(ee)}var B=bi(()=>{h=n(T);for(var ee=h.length,ce=new Set,_e=W,N=Ts(),G=0;Go(d)):(_=vn(()=>o(Ri??(Ri=jn()))),_.f|=$n)),ee>ce.size&&hl(),!A)if(b.set(_e,ce),N){for(const[Me,Ue]of c)ce.has(Me)||_e.skip_effect(Ue.e);_e.oncommit(L),_e.ondiscard(S)}else L(_e);n(T)}),ye={effect:B,items:c,pending:b,outrogroups:null,fallback:_};A=!1}function qa(e){for(;e!==null&&(e.f&xn)===0;)e=e.next;return e}function So(e,t,a,r,i){var me,Me,Ue,E,Q,de,Ae,Y,be;var o=(r&El)!==0,d=t.length,c=e.items,u=qa(e.effect.first),f,_=null,T,h=[],b=[],A,L,S,B;if(o)for(B=0;B0){var ve=(r&is)!==0&&d===0?a:null;if(o){for(B=0;B{var Z,ze;if(T!==void 0)for(S of T)(ze=(Z=S.nodes)==null?void 0:Z.a)==null||ze.apply()})}function Eo(e,t,a,r,i,o,d,c){var u=(d&Ml)!==0?(d&Tl)===0?to(a,!1,!1):ga(a):null,f=(d&Sl)!==0?ga(i):null;return{v:u,i:f,e:vn(()=>(o(t,u??a,f??i,c),()=>{e.delete(r)}))}}function Ga(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&$n)===0?t.nodes.start:a;r!==null;){var d=sr(r);if(o.before(r),r===i)return;r=d}}function Fn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function Ye(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;O(()=>{var f=pe;if(c!==(c=t()??"")){if(a){f.nodes=null,u.innerHTML=c,c!==""&&Xa(Vn(u),u.lastChild);return}if(f.nodes!==null&&(Ps(f.nodes.start,f.nodes.end),f.nodes=null),c!==""){var _=r?Cl:i?Ll:void 0,T=$s(r?"svg":i?"math":"template",_);T.innerHTML=c;var h=r||i?T:T.content;if(Xa(Vn(h),h.lastChild),r||i)for(;Vn(h);)d.before(Vn(h));else d.before(h)}}})}function To(e,t,a){var r=e==null?"":""+e;return r===""?null:r}function $o(e,t){return e==null?null:String(e)}function lt(e,t,a,r,i,o){var d=e[Yr];if(d!==a||d===void 0){var c=To(a);c==null?e.removeAttribute("class"):e.className=c,e[Yr]=a}return o}function Bn(e,t,a,r){var i=e[Zr];if(i!==t){var o=$o(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[Zr]=t}return r}function Hs(e,t,a=!1){if(e.multiple){if(t==null)return;if(!di(t))return Pl();for(var r of e.options)r.selected=t.includes(Ja(r));return}for(r of e.options){var i=Ja(r);if(ao(i,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function Ao(e){var t=new MutationObserver(()=>{Hs(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),As(()=>{t.disconnect()})}function ja(e,t,a=t){var r=new WeakSet,i=!0;gi(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),Ja);else{var u=e.querySelector(d)??e.querySelector("option:not([disabled])");c=u&&Ja(u)}a(c),e.__value=c,W!==null&&r.add(W)}),Ls(()=>{var o=t();if(e===document.activeElement){var d=W;if(r.has(d))return}if(Hs(e,o,i),i&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=Ja(c),a(o))}e.__value=o,i=!1}),Ao(e)}function Ja(e){return"__value"in e?e.__value:e.value}const Co=Symbol("is custom element"),Lo=Symbol("is html"),zo=fl?"progress":"PROGRESS";function ur(e,t){var a=Vs(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==zo)||(e.value=t??"")}function zr(e,t,a,r){var i=Vs(e);i[t]!==(i[t]=a)&&(t==="loading"&&(e[vl]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Po(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Vs(e){return e[vr]??(e[vr]={[Co]:e.nodeName.includes("-"),[Lo]:e.namespaceURI===ss})}var Bi=new Map;function Po(e){var t=e.getAttribute("is")||e.nodeName,a=Bi.get(t);if(a)return a;Bi.set(t,a=[]);for(var r,i=e,o=Element.prototype;o!==i;){r=il(i);for(var d in r)r[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);i=ts(i)}return a}function Sn(e,t,a=t){var r=new WeakSet;gi(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Fr(e)?Kr(o):o,a(o),W!==null&&r.add(W),await ho(),o!==(o=t())){var d=e.selectionStart,c=e.selectionEnd,u=e.value.length;if(e.value=o??"",c!==null){var f=e.value.length;d===c&&c===u&&f>u?(e.selectionStart=f,e.selectionEnd=f):(e.selectionStart=d,e.selectionEnd=Math.min(c,f))}}}),Ba(t)==null&&e.value&&(a(Fr(e)?Kr(e.value):e.value),W!==null&&r.add(W)),Cr(()=>{var i=t();if(e===document.activeElement){var o=W;if(r.has(o))return}Fr(e)&&i===Kr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function Do(e,t,a=t){gi(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Ba(t)==null&&a(e.checked),Cr(()=>{var r=t();e.checked=!!r})}function Fr(e){var t=e.type;return t==="number"||t==="range"}function Kr(e){return e===""?null:+e}function Gr(e,t){return e===t||(e==null?void 0:e[xa])===t}function Oo(e={},t,a,r){var i=Dt.r,o=pe;return Ls(()=>{var d,c;return Cr(()=>{d=c,c=[],Ba(()=>{Gr(a(...c),e)||(t(e,...c),d&&Gr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.f&Qr;)u=u.parent;const f=()=>{c&&Gr(a(...c),e)&&t(null,...c)},_=u.teardown;u.teardown=()=>{f(),_==null||_()}}}),e}function or(e){Dt===null&&rs(),mi(()=>{const t=Ba(e);if(typeof t=="function")return t})}function Ro(e){Dt===null&&rs(),or(()=>()=>Ba(e))}let er=localStorage.getItem("mc_token")||"";function Ws(){return er}function Bo(e){er=(e||"").trim(),localStorage.setItem("mc_token",er)}function qo(){const e={"Content-Type":"application/json"};return er&&(e["X-MC-Token"]=er),e}function Qa(){return localStorage.getItem("mc_hf_token")||""}function Io(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function fe(e,t={}){const a=await fetch(e,{headers:qo(),...t}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||"HTTP "+a.status);return r}const No=(e,t=document)=>t.querySelector(e),qi=(e,t=document)=>[...t.querySelectorAll(e)];function Cn(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Ii;function X(e,t=!1){const a=No("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Ii),Ii=setTimeout(()=>a.className="toast",3200))}function Fo(e,t){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${t!=null?` ${Math.round(t)}%`:""}`:'bereit'}const Te=e=>`${e}`,Pr={logo:Te(''),grid:Te(''),cpu:Te(''),pulse:Te(''),server:Te(''),book:Te(''),help:Te(''),settings:Te(''),swap:Te(''),monitor:Te(''),layers:Te(''),alert:Te(''),gauge:Te(''),search:Te(''),compass:Te(''),code:Te(''),eye:Te(''),refresh:Te(''),file:Te(''),database:Te(''),thermo:Te(''),shield:Te(''),info:Te(''),chevron:Te(''),bolt:Te(''),x:Te(''),check:Te(''),download:Te(''),clock:Te('')};function ea(e){return Pr[e]||""}function li(e){return`${Pr.info}`}function Xn(e){if(!e&&e!==0)return"–";const t=e/1024/1024/1024;return t>=1?t.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function bn({title:e,body:t,confirmLabel:a="Bestätigen",cancelLabel:r="Abbrechen",danger:i=!1}){return new Promise(o=>{const d=document.createElement("div");d.className="modal-overlay",d.innerHTML=``;const c=u=>{d.remove(),o(u)};d.addEventListener("click",u=>{if(u.target===d)return c(!1);const v=u.target.closest("[data-x]");v&&c(v.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function Ui({title:e,body:t="",placeholder:a="",password:r=!1,confirmLabel:i="Weiter",danger:o=!1}){return new Promise(d=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=``;const u=c.querySelector("input"),f=_=>{c.remove(),d(_)};c.addEventListener("click",_=>{if(_.target===c)return f(null);const T=_.target.closest("[data-x]");T&&f(T.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",_=>{_.key==="Enter"&&f(u.value||""),_.key==="Escape"&&f(null)}),document.body.appendChild(c),u.focus()})}function Ko(e="overview"){const t=qi(".nav-item[data-view]:not(.disabled)"),a=qi(".view[data-view]"),r=new Set(a.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let Fi=R(null);const dr={get value(){return n(Fi)},set(e){g(Fi,e,!0)}};let Ki=R(Bt([])),Kn=R(Bt([]));const ra={get value(){return n(Ki)},set(e){g(Ki,e||[],!0)},get tracked(){return n(Kn)},track(e){n(Kn).includes(e)||g(Kn,[...n(Kn),e],!0)},toggle(e){g(Kn,n(Kn).includes(e)?n(Kn).filter(t=>t!==e):[...n(Kn),e],!0)}};let Gi=R(null);const xi={get value(){return n(Gi)},set(e){g(Gi,e,!0)}},Go="5";var Xi;typeof window<"u"&&((Xi=window.__svelte??(window.__svelte={})).v??(Xi.v=new Set)).add(Go);var Uo=M('
GPU-Temperatur
Freier Speicher
GB
',1),Ho=M('
GPU-Temperatur
messe…
Freier Speicher
messe…
',1),Vo=M('
'),Wo=M('
Warte auf Messwerte…
'),jo=M(" "),Jo=M('
'),Qo=M('
'),Ui=M('
'),Yo=M('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),Zo=M('
'),Xo=M('
News gerade nicht ladbar.
'),ed=M('

LLM-Engine
llama-swap
Aktives Modell

System-Gesundheit

So ausgelastet ist dein Mini-PC gerade.

Schnellstart

Die häufigsten Aufgaben — ein Klick.

Dein Stack

Top-News

Alle →
',1);function td(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>xi.value),i=q(()=>{var p;return((p=n(a))==null?void 0:p.models)||[]}),o=q(()=>{var p;return((p=n(a))==null?void 0:p.swap_ok)??!1}),d=q(()=>n(i).find(p=>["running","ready","loading","starting"].includes(p.state))),c=q(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),u=q(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(n(r).ram.percent)} % — eventuell Speicher freigeben.`:`${n(i).length} ${n(i).length===1?"Modell":"Modelle"} bereit · ${n(d)?`„${n(d).name}" geladen`:"keins geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),f=q(()=>()=>{var D;const p=(D=n(r))==null?void 0:D.gpu;return p&&p.vram.total+p.gtt.total>0?(p.vram.used+p.gtt.used)/(p.vram.total+p.gtt.total)*100:0}),_=p=>p==null?"":p<55?"kühl & gesund":p<72?"normal":"läuft heiß";let T=R(Bt([]));or(async()=>{try{g(T,((await fe("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function h(){await bn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Speicher freigeben"})&&(await fe("/api/unload",{method:"POST"}),document.dispatchEvent(new Event("mc:refresh")))}function b(p){var D;(D=document.querySelector(`.nav-item[data-view="${p}"]`))==null||D.dispatchEvent(new MouseEvent("click"))}function A(p){return p!=null&&p.includes("Bild")?"img":p!=null&&p.includes("Code")?"code":"text"}function L(p){return p!=null&&p.includes("Bild")?"Bild":p!=null&&p.includes("Code")?"Code":"Text"}var S=ed(),B=ft(S),ye=s(B),ee=s(ye),ce=s(ee),_e=l(ee,2),N=s(_e),G=l(B,2),ie=s(G),ve=l(s(ie),2),me=s(ve),Me=l(ie,2),Ue=l(s(Me),2),E=s(Ue),Q=l(Ue,2),de=s(Q),Ae=l(Me,2);{var Y=p=>{const D=q(()=>{var wt;return n(r).gpu_temp??((wt=n(r).cpu)==null?void 0:wt.temp)??null}),se=q(()=>n(r).ram.total-n(r).ram.used);var j=Uo(),xe=ft(j),ge=l(s(xe),2),it=s(ge),Je=l(ge,2),dt=s(Je),Ve=l(xe,2),yt=l(s(Ve),2),Tt=s(yt),Rt=l(yt,2),Gt=s(Rt);O((wt,Ut,Ee,Be)=>{m(it,wt),lt(Je,1,`t-s ${n(D)!=null&&n(D)<72?"ok":""}`),m(dt,Ut),m(Tt,Ee),m(Gt,`von ${Be??""} GB`)},[()=>n(D)!=null?`${Math.round(n(D))}°`:"–",()=>_(n(D)),()=>Math.round(n(se)/1073741824),()=>Math.round(n(r).ram.total/1073741824)]),x(p,j)},be=p=>{var D=Ho();x(p,D)};V(Ae,p=>{n(r)?p(Y):p(be,-1)})}var Z=l(G,2),ze=s(Z),Ce=l(s(ze),4);{var He=p=>{const D=q(()=>n(f)());var se=Lr(),j=ft(se);Ge(j,17,()=>{var xe;return[["Prozessor (CPU)",((xe=n(r).cpu)==null?void 0:xe.percent)??0],["Arbeitsspeicher (RAM)",n(r).ram.percent],["Grafikspeicher (VRAM)",n(D)]]},Ke,(xe,ge)=>{var it=q(()=>Ya(n(ge),2));let Je=()=>n(it)[0],dt=()=>n(it)[1];const Ve=q(()=>Math.max(0,Math.min(100,dt()||0)));var yt=Vo(),Tt=s(yt),Rt=s(Tt),Gt=s(Rt),wt=l(Rt),Ut=s(wt),Ee=l(Tt,2),Be=s(Ee);O(($t,sn)=>{m(Gt,Je()),m(Ut,`${$t??""} %`),lt(Ee,1,`bar ${n(Ve)>=90?"bad":n(Ve)>=75?"warn":""}`),Bn(Be,`width:${sn??""}%`)},[()=>Math.round(n(Ve)),()=>Math.max(2,n(Ve))]),x(xe,yt)}),x(p,se)},Ie=p=>{var D=Wo();x(p,D)};V(Ce,p=>{n(r)?p(He):p(Ie,-1)})}var Re=l(ze,2),_t=l(s(Re),4),mt=s(_t);Ye(mt,()=>ea("search"),!0);var Kt=l(mt,4);Ye(Kt,()=>ea("chevron"),!0);var St=l(_t,2),Et=s(St);Ye(Et,()=>ea("refresh"),!0);var P=l(Et,4);Ye(P,()=>ea("chevron"),!0);var F=l(St,2),J=s(F);Ye(J,()=>ea("file"),!0);var re=l(J,4);Ye(re,()=>ea("chevron"),!0);var w=l(Z,2),C=s(w),I=s(C),te=l(s(I),2),$=s(te),H=l(I,2);{var ne=p=>{var D=Ui();Ge(D,21,()=>n(i),Ke,(se,j)=>{const xe=q(()=>n(j).state==="downloading"),ge=q(()=>["running","ready","loading","starting"].includes(n(j).state)),it=q(()=>n(j).state==="loading"||n(j).state==="starting"||n(xe)?"load":n(ge)?"on":""),Je=q(()=>n(xe)?`↓ Download${n(j).download_progress!=null?` ${Math.round(n(j).download_progress)}%`:""}`:n(ge)?n(j).state==="loading"?"lädt…":"geladen":"bereit");var dt=Qo(),Ve=s(dt),yt=l(Ve,2),Tt=s(yt),Rt=s(Tt),Gt=s(Rt),wt=l(Rt,2);{var Ut=ln=>{var xt=jo(),kn=s(xt);O((Pe,At)=>{lt(xt,1,`tag ${Pe??""}`),m(kn,At)},[()=>A(n(j).meta.caps),()=>L(n(j).meta.caps)]),x(ln,xt)};V(wt,ln=>{var xt,kn;(kn=(xt=n(j).meta)==null?void 0:xt.caps)!=null&&kn.length&&ln(Ut)})}var Ee=l(Tt,2);{var Be=ln=>{var xt=Jo(),kn=s(xt);O(()=>m(kn,n(j).meta.filename)),x(ln,xt)};V(Ee,ln=>{var xt;(xt=n(j).meta)!=null&&xt.filename&&ln(Be)})}var $t=l(yt,2),sn=s($t);O(()=>{lt(Ve,1,`li-dot ${n(it)??""}`),m(Gt,n(j).name),m(sn,n(Je))}),x(se,dt)}),x(p,D)},he=p=>{var D=Yo();x(p,D)};V(H,p=>{n(i).length?p(ne):p(he,-1)})}var Ne=l(C,2),Se=s(Ne),je=l(s(Se),2),rt=l(Se,2);{var bt=p=>{var D=Ui();Ge(D,21,()=>n(T),Ke,(se,j)=>{var xe=Zo(),ge=s(xe),it=s(ge),Je=s(it),dt=l(it,2),Ve=s(dt);O(()=>{zr(xe,"href",n(j).link),m(Je,n(j).title),m(Ve,n(j).source)}),x(se,xe)}),x(p,D)},Ze=p=>{var D=Xo();x(p,D)};V(rt,p=>{n(T).length?p(bt):p(Ze,-1)})}O(()=>{m(ce,n(c)),m(N,n(u)),lt(ve,1,`t-v ${n(o)?"ok":"bad"}`),m(me,n(o)?"Online":"Offline"),m(E,n(d)?n(d).name:"Keins"),m(de,n(d)?"im Grafikspeicher":"nichts geladen"),m($,n(i).length?n(i).length+" konfiguriert":"")}),z("click",_t,()=>b("cookbook")),z("click",St,h),z("click",F,()=>b("server")),z("click",je,()=>b("news")),z("keydown",je,p=>p.key==="Enter"&&b("news")),x(e,S),Zn()}_a(["click","keydown"]);var nd=M(""),ad=M('
'),rd=M('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),id=M('
kein Modell hinterlegt
leere Rolleleer '),sd=M(' '),ld=M('
'),od=M(' '),dd=M('
API-Name:
'),cd=M('
ModellKannDetailsStatusPortAktionen
'),ud=M('
Empfohlen für deine Hardware

'),vd=M(''),fd=M(''),pd=M(''),hd=M('

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 gd(e,t){Yn(t,!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.",r="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.",i=[{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=q(()=>{var w;return((w=dr.value)==null?void 0:w.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=R(""),u=R(""),f=R(""),_=R(!1);const T=q(()=>n(o).filter(w=>!w.incomplete));async function h(){var C;const w=n(c)||((C=n(T)[0])==null?void 0:C.name);if(!(!w||!n(u).trim())){g(_,!0),g(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const I=await fe("/api/chat",{method:"POST",body:JSON.stringify({model:w,message:n(u)})});g(f,I.reply,!0)}catch(I){g(f,"Fehler: "+I.message)}g(_,!1),d()}}const b=300;let A=R(!1),L=R(null),S=R(8192),B=R(!1);function ye(w){var C;g(L,n(o).find(I=>I.name===w),!0),n(L)&&(g(S,((C=n(L).meta)==null?void 0:C.ctx)||8192,!0),g(B,(n(L).ttl??b)>=99999),g(A,!0))}async function ee(){const w=n(B)?99999:b;try{await fe("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(S),ttl:w})}),X("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(C){X(C.message,!0)}}let ce=R(!1),_e=R(""),N=R(""),G=R("");function ie(w){const C=n(o).find(I=>I.name===w);g(_e,w,!0),g(G,(C==null?void 0:C.role)||"",!0),g(N,""),g(ce,!0)}async function ve(w){try{await fe("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(_e),role:w})}),X(w?`Rolle gesetzt: ${w}`:"Rolle entfernt."),g(ce,!1),d()}catch(C){X(C.message,!0)}}async function me(w){if(await bn({title:`„${w}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await fe("/api/unload?model="+encodeURIComponent(w),{method:"POST"}),X("Entladen: "+w),setTimeout(d,600)}catch(C){X(C.message,!0)}}async function Me(w){if(await bn({title:`„${w}" 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 C=await fe("/api/delete_model",{method:"POST",body:JSON.stringify({alias:w})});X(C.note||"Gelöscht: "+w),setTimeout(d,600)}catch(C){X(C.message,!0)}}function Ue(w){return w!=null&&w.length?w.map(C=>C==="Code"?'Code':C==="Bild"?'Bild':'Text').join(" "):"–"}function E(w){if(!w)return"–";const C=w.quant||"?",I=w.ctx?Math.round(w.ctx/1024)+"K":"?",te=w.size_bytes?(w.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${C} · ${I} · ${te}`}function Q(w){var C;(C=navigator.clipboard)==null||C.writeText(w),X("Kopiert: "+w)}var de=hd(),Ae=l(ft(de),2),Y=l(s(Ae),6);Ge(Y,21,()=>n(T),Ke,(w,C)=>{var I=nd(),te=s(I),$={};O(()=>{m(te,n(C).name),$!==($=n(C).name)&&(I.value=(I.__value=n(C).name)??"")}),x(w,I)});var be=l(Y,4),Z=l(be,2),ze=s(Z),Ce=l(Z,2);{var He=w=>{var C=ad(),I=s(C);O(()=>m(I,n(f))),x(w,C)};V(Ce,w=>{n(f)&&w(He)})}var Ie=l(Ae,2),Re=s(Ie),_t=l(s(Re)),mt=s(_t),Kt=l(Re,4);{var St=w=>{var C=rd();x(w,C)},Et=w=>{var C=cd(),I=l(s(C));Ge(I,21,()=>n(o),Ke,(te,$)=>{var H=Lr(),ne=ft(H);{var he=Se=>{var je=id(),rt=s(je),bt=s(rt),Ze=l(rt,5),p=s(Ze),D=l(p,2);O(()=>m(bt,n($).name)),z("click",p,()=>{var se;X("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(se=document.querySelector(".nav-item[data-view='cookbook']"))==null||se.dispatchEvent(new MouseEvent("click"))}),z("click",D,()=>Me(n($).name)),x(Se,je)},Ne=Se=>{var je=dd(),rt=s(je),bt=s(rt),Ze=s(bt),p=l(Ze);{var D=Ee=>{var Be=sd(),$t=s(Be);O(()=>m($t,n($).role)),x(Ee,Be)};V(p,Ee=>{n($).role&&Ee(D)})}var se=l(bt,2);{var j=Ee=>{var Be=ld(),$t=s(Be);O(()=>m($t,n($).meta.filename)),x(Ee,Be)};V(se,Ee=>{var Be;(Be=n($).meta)!=null&&Be.filename&&Ee(j)})}var xe=l(se,2),ge=l(s(xe),2);Ge(ge,17,()=>{var Ee;return(Ee=n($).api_ids)!=null&&Ee.length?n($).api_ids:[n($).name]},Ke,(Ee,Be)=>{var $t=od(),sn=s($t);O(()=>m(sn,n(Be))),z("click",$t,()=>Q(n(Be))),x(Ee,$t)});var it=l(rt);Ye(it,()=>{var Ee;return Ue((Ee=n($).meta)==null?void 0:Ee.caps)},!0);var Je=l(it);Ye(Je,()=>E(n($).meta),!0);var dt=l(Je);Ye(dt,()=>Fo(n($).state,n($).download_progress),!0);var Ve=l(dt),yt=s(Ve),Tt=l(Ve),Rt=s(Tt),Gt=l(Rt,2),wt=l(Gt,2),Ut=l(wt,2);O(()=>{m(Ze,`${n($).name??""} `),m(yt,n($).port??"auto")}),z("click",Rt,()=>ie(n($).name)),z("click",Gt,()=>ye(n($).name)),z("click",wt,()=>me(n($).name)),z("click",Ut,()=>Me(n($).name)),x(Se,je)};V(ne,Se=>{n($).incomplete?Se(he):Se(Ne,-1)})}x(te,H)}),x(w,C)};V(Kt,w=>{n(o).length?w(Et,-1):w(St)})}var P=l(Ie,2);{var F=w=>{var C=vd(),I=s(C),te=s(I),$=l(te,4),H=s($),ne=l($,2),he=l(s(ne));Ye(he,()=>li(a));var Ne=l(ne,2),Se=l(Ne,2);{var je=j=>{var xe=ud(),ge=s(xe),it=l(s(ge),2),Je=s(it),dt=l(Je,2),Ve=l(ge,2);O((yt,Tt)=>{m(Je,`Optimal ~${yt??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(dt,` Aktuell ~${Tt??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),z("click",Ve,()=>g(S,n(L).meta.optimal_ctx,!0)),x(j,xe)};V(Se,j=>{var xe;(xe=n(L).meta)!=null&&xe.optimal_ctx&&j(je)})}var rt=l(Se,4),bt=l(s(rt),2),Ze=s(bt),p=l(Ze,2),D=s(p),se=l(rt,2);O(()=>{m(H,n(L).name),Bn(p,`color:${n(B)?"var(--accent)":"var(--mut)"}`),m(D,n(B)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),z("click",C,j=>{j.target.classList.contains("modal-overlay")&&g(A,!1)}),z("click",te,()=>g(A,!1)),Sn(Ne,()=>n(S),j=>g(S,j)),Do(Ze,()=>n(B),j=>g(B,j)),z("click",se,ee),x(w,C)};V(P,w=>{n(A)&&n(L)&&w(F)})}var J=l(P,2);{var re=w=>{var C=pd(),I=s(C),te=s(I),$=l(te,2),H=l(s($));Ye(H,()=>li(r));var ne=l($,2),he=s(ne),Ne=l(ne,4);Ge(Ne,21,()=>i,Ke,(Ze,p)=>{var D=fd(),se=s(D);O(()=>{lt(D,1,n(G)===n(p).id?"primary":"ghost"),zr(D,"title",n(p).desc),m(se,n(p).label)}),z("click",D,()=>ve(n(p).id)),x(Ze,D)});var Se=l(Ne,4),je=l(Se,2),rt=s(je),bt=l(rt,2);O(()=>m(he,n(_e))),z("click",C,Ze=>{Ze.target.classList.contains("modal-overlay")&&g(ce,!1)}),z("click",te,()=>g(ce,!1)),Sn(Se,()=>n(N),Ze=>g(N,Ze)),z("click",rt,()=>ve("")),z("click",bt,()=>ve(n(N).trim().toLowerCase())),x(w,C)};V(J,w=>{n(ce)&&w(re)})}O(()=>{Z.disabled=n(_),m(ze,n(_)?"…":"Senden"),m(mt,n(o).length?n(o).length+" konfiguriert":"")}),ja(Y,()=>n(c),w=>g(c,w)),Sn(be,()=>n(u),w=>g(u,w)),z("click",Z,h),x(e,de),Zn()}_a(["click"]);var _d=M('
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),md=M(''),bd=M('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),yd=M(' '),wd=M(''),xd=M(''),kd=M('
'),Md=M('
'),Sd=M('
'),Ed=M('

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 Td(e,t){Yn(t,!0);const a=q(()=>ra.value),r=q(()=>ra.tracked),i=q(()=>xi.value);let o=Bt({cpu:[],ram:[],gpu:[]});mi(()=>{var de;if(!n(i))return;const E=n(i).gpu,Q=E&&E.vram.total+E.gtt.total>0?(E.vram.used+E.gtt.used)/(E.vram.total+E.gtt.total)*100:0;o.cpu=[...o.cpu,((de=n(i).cpu)==null?void 0:de.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,Q].slice(-60)});const d=q(()=>()=>{var Q;const E=(Q=n(i))==null?void 0:Q.gpu;return E&&E.vram.total+E.gtt.total>0?(E.vram.used+E.gtt.used)/(E.vram.total+E.gtt.total)*100:0}),c=q(()=>n(a).filter(E=>E.state!=="running"&&E.state!=="queued").length),u=q(()=>n(a).filter(E=>E.state==="failed").length);function f(E){if(E.state!=="running")return null;if(typeof E.progress=="number")return Math.min(100,E.progress);const de=((E.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return de?Math.min(100,parseFloat(de[1])):null}function _(E){return E==null||E<0?"":E>=90?`noch ~${Math.round(E/60)} min`:`noch ~${Math.max(1,Math.round(E))} s`}function T(E){return E==="done"?'fertig':E==="failed"?'fehler':E==="canceled"?'abgebrochen':'läuft…'}function h(E){return E==="done"?"on":E==="failed"||E==="canceled"?"":"load"}async function b(E){try{await fe(`/api/jobs/${E}/cancel`,{method:"POST"}),X("Abbruch angefordert…")}catch(Q){X(Q.message,!0)}}async function A(E){try{await fe(`/api/jobs/${E}`,{method:"DELETE"})}catch(Q){X(Q.message,!0)}}async function L(){try{const E=await fe("/api/jobs/clear",{method:"POST"});X(`${E.removed} Einträge entfernt.`)}catch(E){X(E.message,!0)}}function S(E,Q){return E.map(de=>`
`).join("")}var B=Ed(),ye=l(ft(B),2);{var ee=E=>{const Q=q(()=>n(d)());var de=_d(),Ae=ft(de),Y=s(Ae),be=l(s(Y),2),Z=s(be),ze=l(be,2),Ce=s(ze),He=l(Y,2),Ie=l(s(He),2),Re=s(Ie),_t=l(Ie,2),mt=s(_t),Kt=l(He,2),St=l(s(Kt),2),Et=s(St),P=l(St,2),F=s(P),J=l(Ae,2),re=l(s(J),4),w=s(re),C=l(s(w)),I=s(C),te=l(w,2),$=l(s(te),2),H=s($),ne=l(te,2),he=l(s(ne)),Ne=s(he),Se=l(ne,2),je=l(s(Se),2),rt=s(je),bt=l(re,2),Ze=s(bt),p=l(s(Ze));Ye(p,()=>S(o.cpu,"--accent"),!0);var D=l(Ze,2),se=l(s(D));Ye(se,()=>S(o.ram,"--purple"),!0);var j=l(D,2),xe=l(s(j));Ye(xe,()=>S(o.gpu,"--on"),!0),O((ge,it,Je,dt,Ve,yt,Tt,Rt,Gt,wt,Ut,Ee,Be)=>{m(Z,ge),m(Ce,it),m(Re,Je),m(mt,`${dt??""} / ${Ve??""}`),m(Et,yt),m(F,Tt),m(I,`${Rt??""} / ${Gt??""}`),m(H,wt),m(Ne,`${Ut??""} % belegt`),m(rt,`${Ee??""} / ${Be??""}`)},[()=>{var ge;return Math.round(((ge=n(i).cpu)==null?void 0:ge.percent)??0)},()=>{var ge;return((ge=n(i).cpu)==null?void 0:ge.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>Xn(n(i).ram.used),()=>Xn(n(i).ram.total),()=>Math.round(n(Q)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>Xn(n(i).ram.used),()=>Xn(n(i).ram.total),()=>n(i).gpu?`${Xn(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${Xn(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var ge;return Math.round(((ge=n(i).disk)==null?void 0:ge.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var ge;return((ge=n(i).cpu)==null?void 0:ge.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),x(E,de)};V(ye,E=>{n(i)&&E(ee)})}var ce=l(ye,2),_e=s(ce),N=l(s(_e),2),G=s(N),ie=l(N,2);{var ve=E=>{var Q=md();z("click",Q,L),x(E,Q)};V(ie,E=>{n(c)&&E(ve)})}var me=l(_e,4);{var Me=E=>{var Q=bd();x(E,Q)},Ue=E=>{var Q=Lr(),de=ft(Q);Ge(de,17,()=>n(a),Ke,(Ae,Y)=>{const be=q(()=>f(n(Y))),Z=q(()=>n(Y).state==="running"?_(n(Y).eta_s):""),ze=q(()=>n(Y).state==="running"&&n(Y).rate_bps?Xn(n(Y).rate_bps)+"/s":""),Ce=q(()=>[n(Z),n(ze)].filter(Boolean).join(" · ")),He=q(()=>n(r).includes(n(Y).id));var Ie=Sd(),Re=s(Ie),_t=s(Re),mt=l(_t,2),Kt=s(mt),St=l(mt,2);{var Et=$=>{var H=yd(),ne=s(H);O(he=>m(ne,`${he??""} %${n(Ce)?` · ${n(Ce)}`:""}`),[()=>Math.round(n(be))]),x($,H)};V(St,$=>{n(be)!=null&&$(Et)})}var P=l(St,2);{var F=$=>{var H=wd();O(()=>Bn(H,`${n(be)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),z("click",H,ne=>{ne.stopPropagation(),b(n(Y).id)}),x($,H)},J=$=>{var H=xd();z("click",H,ne=>{ne.stopPropagation(),A(n(Y).id)}),x($,H)};V(P,$=>{n(Y).state==="running"?$(F):$(J,-1)})}var re=l(P,2);Ye(re,()=>T(n(Y).state));var w=l(Re,2);{var C=$=>{var H=kd(),ne=s(H);O(()=>Bn(ne,`width:${n(be)??""}%`)),x($,H)};V(w,$=>{n(be)!=null&&n(Y).state==="running"&&$(C)})}var I=l(w,2);{var te=$=>{var H=Md(),ne=s(H);O(he=>m(ne,he),[()=>(n(Y).log||[]).join(` -`)]),x($,H)};V(I,$=>{n(He)&&$(te)})}O($=>{lt(_t,1,`li-dot ${$??""}`),m(Kt,n(Y).label)},[()=>h(n(Y).state)]),z("click",Re,()=>ra.toggle(n(Y).id)),z("keydown",Re,$=>$.key==="Enter"&&ra.toggle(n(Y).id)),x(Ae,Ie)}),x(E,Q)};V(me,E=>{n(a).length?E(Ue,-1):E(Me)})}O(()=>m(G,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),x(e,B),Zn()}_a(["click","keydown"]);var $d=M(' '),Ad=M(''),Cd=M('✓ fertig'),Ld=M('✗ fehlgeschlagen'),zd=M('abgebrochen'),Pd=M('läuft…'),Dd=M('
'),Od=M('

Aktueller Vorgang

'),Rd=M('

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 Bd(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>ra.value);let i=null,o=R(`Verbinde… -`),d=R("llama-swap"),c,u=R(null),f=R("");const _=new Set,T=q(()=>n(u)?n(r).find(p=>p.id===n(u)):null);mi(()=>{if(!n(T))return;const p=n(T),D=p.state==="done",se=p.state==="failed",j=p.state==="canceled";(D||se||j)&&!_.has(p.id)&&(_.add(p.id),X(D?`✓ ${n(f)} abgeschlossen.`:j?`${n(f)} abgebrochen.`:`✗ ${n(f)} fehlgeschlagen.`,se),D&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function h(p,D){g(u,p,!0),g(f,D,!0),ra.track(p)}or(()=>{b()}),Ro(()=>{i==null||i.close()});function b(){i==null||i.close();const p=n(d);g(o,`Verbinde mit ${p}… -`);const D=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${D}//${location.host}/api/logs/${p}?token=${encodeURIComponent(Ws())}`),i.onmessage=se=>{g(o,n(o)+se.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+` -— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(p,D,se){if(await bn({title:D,body:se,confirmLabel:"Neustarten"}))try{await fe(`/api/service/${p}/restart`,{method:"POST"}),X("Neustart ausgelöst: "+p),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(j){X(j.message,!0)}}async function L(){if(await bn({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 fe("/api/self-update",{method:"POST"});X("Update läuft — Dashboard startet gleich neu."),h(p.job_id,"Mission Control Update")}catch(p){X(p.message,!0)}}async function S(){if(await bn({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."}))try{const p=await fe("/api/update",{method:"POST"});X("LLM-Engine-Update läuft."),h(p.job_id,"LLM-Engine-Update")}catch(p){X(p.message,!0)}}async function B(){if(await bn({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 fe("/api/unload",{method:"POST"}),X("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(p){X(p.message,!0)}}async function ye(){if(!await bn({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 Ni({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 D=await fe("/api/os-update",{method:"POST",body:JSON.stringify({password:p})});X("OS-Update gestartet."),h(D.job_id,"OS-Update")}catch(D){X(D.message,!0)}}async function ee(){if(!await bn({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 Ni({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 fe("/api/reboot",{method:"POST",body:JSON.stringify({password:p})}),X("Reboot ausgelöst — bis gleich.")}catch(D){X(D.message,!0)}}async function ce(){g(_e,"prüfe…");try{const p=await fe("/api/integration/test");g(_e,p.ok?`✓ Engine antwortet — ${p.models.length} Modell(e): ${p.models.join(", ")}`:`✗ keine Verbindung: ${p.error}`,!0),g(N,p.ok,!0)}catch(p){g(_e,"✗ "+p.message),g(N,!1)}}let _e=R(""),N=R(!1);const G=q(()=>{var p;return((p=n(a))==null?void 0:p.models)||[]}),ie=q(()=>n(G).find(p=>p.state==="running"||p.state==="loading"));function ve(p){if(!p||p.state!=="running")return null;if(typeof p.progress=="number")return Math.min(100,p.progress);const se=((p.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return se?Math.min(100,parseFloat(se[1])):null}var me=Rd(),Me=l(ft(me),2),Ue=s(Me),E=l(s(Ue),2),Q=s(E),de=l(Ue,4),Ae=s(de),Y=l(s(Ae)),be=s(Y),Z=l(Ae,2),ze=l(s(Z),2),Ce=s(ze),He=l(Z,2),Ie=l(s(He),2),Re=s(Ie),_t=l(de,2),mt=s(_t),Kt=l(mt,2);{var St=p=>{var D=$d(),se=s(D);O(()=>{Bn(D,`color:${n(N)?"#7ee29a":"#ff9b95"}`),m(se,n(_e))}),x(p,D)};V(Kt,p=>{n(_e)&&p(St)})}var Et=l(Me,2),P=l(s(Et),4),F=l(P,2),J=l(F,2),re=l(J,2),w=l(re,2),C=l(Et,2),I=l(s(C),4),te=l(I,2),$=l(C,2);{var H=p=>{const D=q(()=>n(T)),se=q(()=>n(D).state==="done"),j=q(()=>n(D).state==="failed"),xe=q(()=>n(D).state==="canceled"),ge=q(()=>n(se)||n(j)||n(xe)),it=q(()=>ve(n(D)));var Je=Od(),dt=s(Je),Ve=l(s(dt),2);{var yt=Pe=>{var At=Ad();z("click",At,async()=>{await bn({title:n(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&fe(`/api/jobs/${n(D).id}/cancel`,{method:"POST"})}),x(Pe,At)};V(Ve,Pe=>{n(ge)||Pe(yt)})}var Tt=l(Ve,2),Rt=s(Tt);{var Gt=Pe=>{var At=Cd();x(Pe,At)},wt=Pe=>{var At=Ld();x(Pe,At)},Ut=Pe=>{var At=zd();x(Pe,At)},Ee=Pe=>{var At=Pd();x(Pe,At)};V(Rt,Pe=>{n(se)?Pe(Gt):n(j)?Pe(wt,1):n(xe)?Pe(Ut,2):Pe(Ee,-1)})}var Be=l(dt,2),$t=s(Be),sn=l(Be,2);{var ln=Pe=>{var At=Dd(),Or=s(At);O(()=>Bn(Or,`width:${n(it)??""}%`)),x(Pe,At)};V(sn,Pe=>{n(it)!=null&&!n(ge)&&Pe(ln)})}var xt=l(sn,2),kn=s(xt);O(Pe=>{m($t,`${n(f)??""}${n(ge)?n(se)?" — erfolgreich.":n(xe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(kn,Pe)},[()=>(n(D).log||[]).join(` -`)]),x(p,Je)};V($,p=>{n(T)&&p(H)})}var ne=l($,2),he=s(ne),Ne=l(s(he),2),Se=s(Ne);Se.value=Se.__value="llama-swap";var je=l(Se);je.value=je.__value="mission-control";var rt=l(je);rt.value=rt.__value="system";var bt=l(he,4),Ze=s(bt);Oo(bt,p=>c=p,()=>c),O(p=>{var D,se,j;Bn(E,`margin-left:auto;${(D=n(a))!=null&&D.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"}`),m(Q,(se=n(a))!=null&&se.swap_ok?"● erreichbar":"● offline"),m(be,(((j=n(a))==null?void 0:j.swap_url)||"—")+"/v1"),m(Ce,n(ie)?n(ie).name+` (${n(ie).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Re,p),m(Ze,n(o))},[()=>n(G).filter(p=>!p.incomplete).length||"keine"]),z("click",mt,ce),z("click",P,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),z("click",F,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),z("click",J,L),z("click",re,S),z("click",w,B),z("click",I,ye),z("click",te,ee),z("change",Ne,b),ja(Ne,()=>n(d),p=>g(d,p)),x(e,me),Zn()}_a(["click","change"]);var qd=M('
Lade Setups…
'),Id=M(' ×',1),Ur=M('
★ Beste Wahl für dein System
'),Nd=M('
Dein Setup
'),Fd=M(''),Kd=M('
'),Gd=M('
Frage Quellen ab…
'),Ud=M('
'),Hd=M('✓ installiert'),Vd=M(''),Wd=M('

'),jd=M('

'),Jd=M(''),Qd=M('

'),Yd=M('
'),Zd=M('
'),Xd=M('
'),ec=M(" "),tc=M('
'),nc=M('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),ac=M(''),rc=M('
Lade Dateien von HuggingFace…
'),Hi=M(""),ic=M('
Empfohlener Kontext für deine Hardware: übernehmen
'),sc=M('
Ressourcen-Check
'),lc=M('
',1),oc=M('
Keine GGUF-Dateien im Repo gefunden.
'),dc=M(''),cc=M('
'),uc=M(''),vc=M('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

Use-Case-Setups

Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es auf deinen PC passt.

Aktuell die besten Modelle für dein System

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function fc(e,t){Yn(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="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.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{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(y){const k=(y||"").toLowerCase();for(const U of d)if(U.kw.some(K=>k.includes(K)))return U.label;return"Allrounder"}function u(y=""){const k=y.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(k)||new RegExp("(?{mt(),Kt()});async function mt(){g(L,!0);try{const y=await fe("/api/cookbook/recipes");g(b,y.recipes||[],!0),g(A,y.recommended_id||null,!0)}catch(y){X(y.message,!0)}g(L,!1)}async function Kt(y=!1){g(B,!0);try{const k=await fe("/api/cookbook/discover"+(y?"?force=true":""));g(S,k,!0),g(ye,k.stale,!0)}catch(k){X("Empfehlungen nicht ladbar: "+k.message,!0)}g(B,!1)}function St(y){y=y.trim();const k=y.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return k?k[1]:/^[\w.-]+\/[\w.-]+$/.test(y)?y:null}async function Et(){const y=n(ee).trim(),k=St(y);let U=y;if(n(N)&&!k&&(U=U?U+" "+n(N):n(N)),!U&&!k){g(ce,[],!0);return}g(_e,!0),g(ie,[],!0),g(ve,-1);try{if(k)g(ce,[{id:k,author:k.split("/")[0],downloads:0}],!0);else{const K=`https://huggingface.co/api/models?search=${encodeURIComponent(U)}&filter=gguf&sort=${encodeURIComponent(n(G))}&direction=-1&limit=40`,le=await fetch(K);g(ce,await le.json(),!0)}n(ce).forEach((K,le)=>P(le,K.id))}catch(K){X(K.message,!0),g(ce,[],!0)}g(_e,!1)}async function P(y,k){var U;try{const K=await fe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})});if(!((U=K.files)!=null&&U.length)){n(ie)[y]=null,F();return}const le=K.files.find(Qe=>{var Xe;return(Xe=Qe.quant)==null?void 0:Xe.includes("Q4_K_M")})||K.files[0];n(ie)[y]=le.fit.level,F()}catch{n(ie)[y]=null,F()}}function F(){let y=-1,k=99;n(ie).forEach((U,K)=>{if(U==null)return;const le=i[U]??99;le=0&&k<=1?y:-1,!0)}function J(y){g(me,n(b).find(k=>k.id===y),!0)}async function re(y){const k=document.getElementById("cb-r-install-btn");k&&(k.disabled=!0,k.textContent="Starte…");try{const U=await fe("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:y,hf_token:Qa()})});X(`${U.count} Downloads gestartet — siehe Aktivität.`),g(me,null),_t("activity")}catch(U){X(U.message,!0),k&&(k.disabled=!1,k.textContent="Installieren")}}async function w(y,k){var U,K;g(Me,!0),g(Ue,k,!0),g(E,y,!0),g(Ae,""),g(Y,8192),g(Q,null),g(Z,null),g(de,""),g(be,!0);try{if(g(Q,await fe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})}),!0),(K=(U=n(Q))==null?void 0:U.files)!=null&&K.length){const le=n(Q).files.find(Qe=>{var Xe;return(Xe=Qe.quant)==null?void 0:Xe.includes("Q4_K_M")})||n(Q).files[0];g(de,le.filename,!0),le.optimal_ctx&&n(Y)===8192&&g(Y,le.optimal_ctx,!0),C()}}catch(le){X(le.message,!0)}g(be,!1)}function C(){var y,k,U;!((k=(y=n(Q))==null?void 0:y.files)!=null&&k.length)||!n(de)||(g(Z,n(Q).files.find(K=>K.filename===n(de))||null,!0),(U=n(Z))!=null&&U.optimal_ctx&&n(Y)===8192&&g(Y,n(Z).optimal_ctx,!0))}async function I(){if(!n(E)||!n(de))return X("Bitte eine GGUF-Datei wählen.",!0);g(be,!0);try{const y=await fe("/api/download",{method:"POST",body:JSON.stringify({repo:n(E),file:n(de),hf_token:Qa()})});await fe("/api/register",{method:"POST",body:JSON.stringify({role:n(Ae),model_path:y.expected_path,ctx:n(Y)})}),X("Download gestartet — siehe Aktivität."),g(Me,!1),_t("activity")}catch(y){X("Fehler: "+y.message,!0)}g(be,!1)}async function te(y,k,U,K){K.disabled=!0,K.textContent="Starte…";try{await fe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:y,role:k,params_b:U,quant:"Q4_K_M",hf_token:Qa()})}),X("Download gestartet — siehe Aktivität."),_t("activity")}catch(le){X(le.message,!0),K.disabled=!1,K.textContent="Installieren"}}function $(){g(Re,null),g(Ce,""),g(He,""),g(Ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(ze,!0)}function H(y){const k=n(b).find(U=>U.id===y);k&&(g(Re,y,!0),g(Ce,k.title,!0),g(He,k.desc||"",!0),g(Ie,k.models.map(U=>({repo:U.repo,role:U.role,quant:U.quant||"Q4_K_M"})),!0),g(ze,!0))}async function ne(){if(!n(Ce).trim())return X("Bitte einen Titel angeben.",!0);const y=n(Ie).filter(k=>k.repo.trim());if(!y.length)return X("Mindestens ein Modell (Repo) angeben.",!0);try{n(Re)?(await fe("/api/cookbook/user-recipe/"+encodeURIComponent(n(Re)),{method:"PUT",body:JSON.stringify({title:n(Ce),desc:n(He),models:y})}),X("Setup aktualisiert.")):(await fe("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ce),desc:n(He),models:y})}),X("Setup gespeichert.")),g(ze,!1),mt()}catch(k){X(k.message,!0)}}async function he(y){const k=n(b).find(U=>U.id===y);if(await bn({title:`„${(k==null?void 0:k.title)||y}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await fe("/api/cookbook/user-recipe/"+encodeURIComponent(y),{method:"DELETE"}),X("Setup gelöscht."),mt()}catch(U){X(U.message,!0)}}function Ne(y){if(!u(y))return"";const k=f(y);return`MoE${k?` · ~${k}B aktiv`:""}`}function Se(y){return y?`${Cn(y)}`:""}var je=vc(),rt=l(ft(je),2),bt=s(rt),Ze=l(s(bt),2),p=l(bt,4);{var D=y=>{var k=qd();x(y,k)},se=y=>{var k=Kd();Ge(k,21,()=>n(b),Ke,(U,K)=>{const le=q(()=>n(K).id===n(A));var Qe=Fd(),Xe=s(Qe);{var Zt=Oe=>{var tt=Id(),Xt=ft(tt),ct=l(Xt,2);z("click",Xt,ut=>{ut.stopPropagation(),H(n(K).id)}),z("keydown",Xt,ut=>{ut.key==="Enter"&&(ut.stopPropagation(),H(n(K).id))}),z("click",ct,ut=>{ut.stopPropagation(),he(n(K).id)}),z("keydown",ct,ut=>{ut.key==="Enter"&&(ut.stopPropagation(),he(n(K).id))}),x(Oe,tt)};V(Xe,Oe=>{n(K).user&&Oe(Zt)})}var Ht=l(Xe,2);{var Vt=Oe=>{var tt=Ur();x(Oe,tt)},Wt=Oe=>{var tt=Nd();x(Oe,tt)};V(Ht,Oe=>{n(le)?Oe(Vt):n(K).user&&Oe(Wt,1)})}var Le=l(Ht,2),ke=s(Le),qe=s(ke),Fe=s(qe),De=l(ke,2),pt=s(De),kt=l(Le,2),Ct=s(kt),Lt=l(kt,2),et=s(Lt);O((Oe,tt)=>{lt(Qe,1,`card-btn${n(le)?" cb-best":""}`),m(Fe,n(K).title),lt(De,1,`fit-badge ${Oe??""}`),m(pt,tt),m(Ct,n(K).desc),m(et,`${n(K).models.length??""} Modell${n(K).models.length>1?"e":""} im Setup`)},[()=>_(n(K).fit_level),()=>T(n(K).fit_level)]),z("click",Qe,()=>J(n(K).id)),x(U,Qe)}),x(y,k)};V(p,y=>{n(L)?y(D):y(se,-1)})}var j=l(rt,2),xe=s(j),ge=l(s(xe),2),it=s(ge),Je=l(ge,2),dt=s(Je),Ve=l(xe,2),yt=s(Ve),Tt=l(Ve,2);{var Rt=y=>{var k=Gd();x(y,k)},Gt=y=>{var k=Lr(),U=ft(k);Ge(U,17,()=>n(S).categories,Ke,(K,le)=>{var Qe=jd(),Xe=s(Qe),Zt=s(Xe),Ht=s(Zt),Vt=l(Xe,2);Ge(Vt,21,()=>n(le).models,Ke,(Wt,Le)=>{const ke=q(()=>n(le).recommended&&n(Le).repo===n(le).recommended);var qe=Wd(),Fe=s(qe);{var De=Mt=>{var It=Ur();x(Mt,It)};V(Fe,Mt=>{n(ke)&&Mt(De)})}var pt=l(Fe,2),kt=s(pt),Ct=s(kt),Lt=s(Ct),et=l(Ct,2),Oe=s(et),tt=l(kt,2),Xt=s(tt),ct=l(pt,2),ut=s(ct);Ye(ut,()=>Se(o[n(Le).role]||c(n(Le).repo)));var Mn=l(ut,2);Ye(Mn,()=>Ne(n(Le).repo));var In=l(ct,2),We=s(In),nt=l(In,2);Ge(nt,17,()=>n(Le).requirements||[],Ke,(Mt,It)=>{var Nn=Ud(),Rr=s(Nn);O(()=>m(Rr,`⚠ ${n(It)??""}`)),x(Mt,Nn)});var st=l(nt,4),vt=s(st);{var en=Mt=>{var It=Hd();O(()=>zr(It,"title",`bereits eingerichtet als ${n(Le).installed??""}`)),x(Mt,It)},qt=Mt=>{var It=Vd();z("click",It,Nn=>te(n(Le).repo,n(Le).role,n(Le).params_b,Nn.currentTarget)),x(Mt,It)};V(vt,Mt=>{n(Le).installed?Mt(en):Mt(qt,-1)})}O((Mt,It,Nn)=>{lt(qe,1,`card${n(ke)?" res-best":""}`),m(Lt,n(Le).name),m(Oe,`${n(Le).author??""} · ${n(Le).params_b??""}B`),lt(tt,1,`fit-badge ${Mt??""}`),m(Xt,n(Le).fit.text),m(We,`${It??""} · ⬇ ${Nn??""}`)},[()=>_(n(Le).fit.level),()=>h(n(Le).fit),()=>(n(Le).downloads||0).toLocaleString()]),x(Wt,qe)}),O(()=>m(Ht,n(le).title)),x(K,Qe)}),x(y,k)};V(Tt,y=>{var k;n(B)&&!n(S)?y(Rt):(k=n(S))!=null&&k.categories&&y(Gt,1)})}var wt=l(j,2),Ut=l(s(wt),4),Ee=s(Ut),Be=l(Ee,2),$t=s(Be);$t.value=$t.__value="downloads";var sn=l($t);sn.value=sn.__value="trending";var ln=l(sn);ln.value=ln.__value="created_at";var xt=l(Be,2),kn=s(xt),Pe=l(Ut,2);Ge(Pe,20,()=>["","coder","vision","reasoning","chat","agent"],Ke,(y,k)=>{var U=Jd(),K=s(U);O(()=>{lt(U,1,n(N)===k?"primary":"ghost"),m(K,k||"Alle")}),z("click",U,()=>{g(N,k,!0),Et()}),x(y,U)});var At=l(Pe,2);{var Or=y=>{var k=Yd();Ge(k,21,()=>n(ce),Ke,(U,K,le)=>{var Qe=Qd(),Xe=s(Qe);{var Zt=ct=>{var ut=Ur();x(ct,ut)};V(Xe,ct=>{le===n(ve)&&ct(Zt)})}var Ht=l(Xe,2),Vt=s(Ht),Wt=s(Vt),Le=s(Wt),ke=l(Wt,2),qe=s(ke),Fe=l(Vt,2),De=s(Fe),pt=l(Ht,2),kt=s(pt);Ye(kt,()=>Se(c(n(K).id)));var Ct=l(kt,2);Ye(Ct,()=>Ne(n(K).id));var Lt=l(pt,4),et=s(Lt),Oe=s(et),tt=l(et,2),Xt=s(tt);O((ct,ut,Mn,In,We)=>{lt(Qe,1,`card${le===n(ve)?" res-best":""}`),m(Le,ct),m(qe,n(K).author||""),lt(Fe,1,`fit-badge ${ut??""}`),m(De,Mn),m(Oe,In),m(Xt,`⬇ ${We??""}`)},[()=>n(K).id.split("/").pop(),()=>n(ie)[le]?_(n(ie)[le]):"warn",()=>n(ie)[le]?T(n(ie)[le]):"prüfe…",()=>n(ie)[le]?h({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(K).downloads||0).toLocaleString()]),z("click",Qe,()=>w(n(K).id,n(K).id.split("/").pop())),x(U,Qe)}),x(y,k)};V(At,y=>{n(ce).length&&y(Or)})}var ki=l(wt,2);{var Ys=y=>{const k=q(()=>n(me));var U=ac(),K=s(U),le=s(K),Qe=l(le,2),Xe=s(Qe),Zt=l(Qe,2),Ht=s(Zt),Vt=l(Zt,2);Ge(Vt,21,()=>n(k).models,Ke,(Fe,De)=>{var pt=tc(),kt=s(pt),Ct=s(kt),Lt=s(Ct),et=s(Lt),Oe=l(Lt,2),tt=s(Oe),Xt=l(Oe,2);Ye(Xt,()=>Ne(n(De).repo));var ct=l(Ct,2);{var ut=st=>{var vt=Zd(),en=s(vt);O(()=>m(en,n(De).why)),x(st,vt)};V(ct,st=>{n(De).why&&st(ut)})}var Mn=l(ct,2);{var In=st=>{var vt=Xd(),en=s(vt);O((qt,Mt,It)=>m(en,`~${qt??""} GB · ~${Mt??""} Tok/s · optimal ~${It??""}k Kontext`),[()=>(n(De).fit.req_gb??0).toFixed(1),()=>Math.round(n(De).fit.tps??0),()=>Math.round((n(De).optimal_ctx||8192)/1024)]),x(st,vt)};V(Mn,st=>{n(De).fit&&st(In)})}var We=l(kt,2);{var nt=st=>{var vt=ec(),en=s(vt);O(qt=>{lt(vt,1,`fit-badge ${qt??""}`),m(en,n(De).fit.text)},[()=>_(n(De).fit.level)]),x(st,vt)};V(We,st=>{n(De).fit&&st(nt)})}O(()=>{m(et,n(De).name),m(tt,n(De).role)}),x(Fe,pt)});var Wt=l(Vt,2);{var Le=Fe=>{const De=q(()=>Math.max(...n(k).models.map(Lt=>{var et;return((et=Lt.fit)==null?void 0:et.req_gb)??0})));var pt=nc(),kt=l(s(pt)),Ct=s(kt);O(Lt=>m(Ct,`~${Lt??""} GB`),[()=>n(De).toFixed(1)]),x(Fe,pt)};V(Wt,Fe=>{n(k).models.length&&n(k).models[0].fit&&Fe(Le)})}var ke=l(Wt,2),qe=s(ke);O(()=>{m(Xe,n(k).title),m(Ht,n(k).desc),lt(ke,1,`primary${n(k).fit_level==="too_tight"?" warn":""}`),m(qe,n(k).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),z("click",U,Fe=>{Fe.target.classList.contains("modal-overlay")&&g(me,null)}),z("click",le,()=>g(me,null)),z("click",ke,()=>re(n(k).id)),x(y,U)};V(ki,y=>{n(me)&&y(Ys)})}var Mi=l(ki,2);{var Zs=y=>{var k=dc(),U=s(k),K=s(U),le=l(K,2),Qe=s(le),Xe=l(le,2),Zt=s(Xe),Ht=l(Xe,2);{var Vt=ke=>{var qe=rc();x(ke,qe)},Wt=ke=>{var qe=lc(),Fe=l(ft(qe),2);Ge(Fe,21,()=>n(Q).files,Ke,(We,nt)=>{const st=q(()=>n(nt).fit.level==="perfect"?"●":n(nt).fit.level==="marginal"?"◐":"○");var vt=Hi(),en=s(vt),qt={};O(()=>{m(en,`${n(st)??""} ${n(nt).filename??""}`),qt!==(qt=n(nt).filename)&&(vt.value=(vt.__value=n(nt).filename)??"")}),x(We,vt)});var De=l(Fe,2),pt=s(De),kt=l(s(pt),2),Ct=l(pt,2),Lt=s(Ct),et=l(s(Lt));Ye(et,()=>li(a));var Oe=l(Lt,2),tt=l(De,2);{var Xt=We=>{var nt=ic(),st=l(s(nt)),vt=s(st),en=l(st,2);O(qt=>m(vt,`~${qt??""}k`),[()=>Math.round(n(Z).optimal_ctx/1024)]),z("click",en,qt=>{qt.preventDefault(),g(Y,n(Z).optimal_ctx,!0)}),x(We,nt)};V(tt,We=>{var nt;(nt=n(Z))!=null&&nt.optimal_ctx&&We(Xt)})}var ct=l(tt,2);{var ut=We=>{var nt=sc(),st=s(nt),vt=l(s(st),2),en=s(vt),qt=l(st,2),Mt=s(qt);O((It,Nn,Rr)=>{m(en,`~${It??""} GB · ~${Nn??""} Tok/s · ${(n(Z).quant||"GGUF")??""}`),lt(qt,1,`fit-badge ${Rr??""}`),m(Mt,n(Z).fit.text)},[()=>(n(Z).fit.req_gb??0).toFixed(1),()=>Math.round(n(Z).fit.tps??0),()=>_(n(Z).fit.level)]),x(We,nt)};V(ct,We=>{n(Z)&&We(ut)})}var Mn=l(ct,2),In=s(Mn);O(()=>{var We,nt;lt(Mn,1,`primary${((We=n(Z))==null?void 0:We.fit.level)==="too_tight"?" warn":""}`),Mn.disabled=n(be),m(In,n(be)?"Starte…":((nt=n(Z))==null?void 0:nt.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),z("change",Fe,C),ja(Fe,()=>n(de),We=>g(de,We)),Sn(kt,()=>n(Ae),We=>g(Ae,We)),Sn(Oe,()=>n(Y),We=>g(Y,We)),z("click",Mn,I),x(ke,qe)},Le=ke=>{var qe=oc();x(ke,qe)};V(Ht,ke=>{var qe,Fe;n(be)&&!n(Q)?ke(Vt):(Fe=(qe=n(Q))==null?void 0:qe.files)!=null&&Fe.length?ke(Wt,1):n(be)||ke(Le,2)})}O(()=>{m(Qe,n(Ue)),m(Zt,n(E))}),z("click",k,ke=>{ke.target.classList.contains("modal-overlay")&&g(Me,!1)}),z("click",K,()=>g(Me,!1)),x(y,k)};V(Mi,y=>{n(Me)&&y(Zs)})}var Xs=l(Mi,2);{var el=y=>{var k=uc(),U=s(k),K=s(U),le=l(K,2),Qe=s(le),Xe=l(le,6),Zt=l(Xe,4),Ht=l(Zt,4);Ge(Ht,17,()=>n(Ie),Ke,(ke,qe,Fe)=>{var De=cc(),pt=s(De),kt=l(pt,2),Ct=l(kt,2);Ge(Ct,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ke,(et,Oe)=>{var tt=Hi(),Xt=s(tt),ct={};O(()=>{m(Xt,Oe),ct!==(ct=Oe)&&(tt.__value=Oe)}),x(et,tt)});var Lt=l(Ct,2);Sn(pt,()=>n(qe).repo,et=>n(qe).repo=et),Sn(kt,()=>n(qe).role,et=>n(qe).role=et),ja(Ct,()=>n(qe).quant,et=>n(qe).quant=et),z("click",Lt,()=>g(Ie,n(Ie).filter((et,Oe)=>Oe!==Fe),!0)),x(ke,De)});var Vt=l(Ht,2),Wt=l(Vt,4),Le=s(Wt);O(()=>{m(Qe,n(Re)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Le,n(Re)?"Änderungen speichern":"Setup speichern")}),z("click",k,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),z("click",K,()=>g(ze,!1)),Sn(Xe,()=>n(Ce),ke=>g(Ce,ke)),Sn(Zt,()=>n(He),ke=>g(He,ke)),z("click",Vt,()=>g(Ie,[...n(Ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),z("click",Wt,ne),x(y,k)};V(Xs,y=>{n(ze)&&y(el)})}O(()=>{m(it,n(S)?"aktuell":""),Je.disabled=n(B),m(dt,n(B)?"Suche…":"Aktualisieren"),m(yt,`Täglich aktualisierte Top-Modelle je Kategorie — Hardware-Fit berechnet für dein System. ${n(ye)?"⚠ Cache veraltet.":""}`),xt.disabled=n(_e),m(kn,n(_e)?"Lade…":"Suchen")}),z("click",Ze,$),z("click",Je,()=>Kt(!0)),z("keydown",Ee,y=>y.key==="Enter"&&Et()),Sn(Ee,()=>n(ee),y=>g(ee,y)),ja(Be,()=>n(G),y=>g(G,y)),z("click",xt,Et),x(e,je),Zn()}_a(["click","keydown","change"]);var pc=M(`
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.
`),hc=M(' '),gc=M('
'),_c=M(' '),mc=M(''),bc=M('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.
'),yc=M(''),wc=M('

Ö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.
',1),xc=M('

Datei anlegen oder öffnen:

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

Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.

Danach in OpenCode /models wählen.

',1),kc=M('

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

API-Key: ein beliebiger Wert (z.B. local).
',1),Mc=M('

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

',1),Sc=M('

Bilder einbinden (Vision)

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

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?

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?

4 · Config-Snippet

',1);function Tc(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>{var P;return(((P=n(a))==null?void 0:P.models)||[]).filter(F=>!F.incomplete)}),i=q(f);let o=R("zed"),d=R(Bt([])),c=R(""),u=R(!1);function f(){return`http://${location.hostname}:8080/v1`}function _(P){return/^\d{1,3}(\.\d{1,3}){3}$/.test(P)}function T(){return location.protocol==="https:"||!_(location.hostname)}const h=q(()=>n(d).length?n(d):n(r).map(P=>P.name)),b=q(()=>n(h)[0]||"coder"),A=q(()=>{var P;return(P=n(r).find(F=>{var J,re;return(re=(J=F.meta)==null?void 0:J.caps)==null?void 0:re.includes("Bild")}))==null?void 0:P.name});function L(P,F){const re=(F.length?n(r).filter(w=>F.includes(w.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(w=>{var te,$;const C=(((te=w.meta)==null?void 0:te.caps)||[]).some(H=>/Bild|Vision/i.test(H)),I=(($=w.meta)==null?void 0:$.ctx)||131072;return` { "name": "${w.name}", "display_name": "${w.name}", "max_tokens": ${I}${C?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, + +
`;const u=c.querySelector("input"),v=h=>{c.remove(),d(h)};c.addEventListener("click",h=>{if(h.target===c)return v(null);const E=h.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",h=>{h.key==="Enter"&&v(u.value||""),h.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Ko(e="overview"){const t=Ki(".nav-item[data-view]:not(.disabled)"),a=Ki(".view[data-view]"),r=new Set(a.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let Hi=B(null);const gr={get value(){return n(Hi)},set(e){g(Hi,e,!0)}};let Vi=B(Dt([])),Qn=B(Dt([]));const ca={get value(){return n(Vi)},set(e){g(Vi,e||[],!0)},get tracked(){return n(Qn)},track(e){n(Qn).includes(e)||g(Qn,[...n(Qn),e],!0)},toggle(e){g(Qn,n(Qn).includes(e)?n(Qn).filter(t=>t!==e):[...n(Qn),e],!0)}};let Wi=B(null);const $i={get value(){return n(Wi)},set(e){g(Wi,e,!0)}},Go="5";var as;typeof window<"u"&&((as=window.__svelte??(window.__svelte={})).v??(as.v=new Set)).add(Go);var Uo=k('— bereit für Anfragen'),Ho=k('
Temperatur (GPU)
Freier Speicher
GB
',1),Vo=k('
Temperatur
messe…
Freier Speicher
messe…
',1),Wo=k('
'),jo=k('
Warte auf Messwerte…
'),Jo=k('Bild'),Qo=k('Code'),Yo=k('Text'),Zo=k('∞ aktiv'),Xo=k(''),ed=k('
'),ji=k('
'),td=k('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),nd=k('
'),ad=k('
News gerade nicht ladbar.
'),rd=k('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Die häufigsten Aufgaben — ein Klick.

Dein Stack

Top-News

Alle →
',1);function id(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>$i.value),i=I(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),o=I(()=>{var S;return((S=n(a))==null?void 0:S.swap_ok)??!1}),d=["running","ready","loading","starting"],c=I(()=>n(i).find(S=>d.includes(S.state))),u=I(()=>n(i).filter(S=>!S.incomplete)),v=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),h=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(n(r).ram.percent)} % — eventuell Speicher freigeben.`:`${n(u).length} ${n(u).length===1?"Modell":"Modelle"} konfiguriert · ${n(c)?`„${n(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=I(()=>()=>{var ee;const S=(ee=n(r))==null?void 0:ee.gpu;return S&&S.vram.total+S.gtt.total>0?(S.vram.used+S.gtt.used)/(S.vram.total+S.gtt.total)*100:0});let p=B(Dt([])),w=B(null);hr(async()=>{try{g(p,((await ge("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function A(){await Mn({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 ge("/api/unload",{method:"POST"}),M())}async function L(S){g(w,S,!0);try{await ge("/api/preload?model="+encodeURIComponent(S),{method:"POST"})}catch{}g(w,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function R(S){var ee;(ee=document.querySelector(`.nav-item[data-view="${S}"]`))==null||ee.dispatchEvent(new MouseEvent("click"))}function Se(S){return S>=90?"red":S>=75?"":"green"}function re(S){return S==null?"":S>=75?"red":S>=55?"":"green"}function ve(S){return S>=90?"red":S>=70?"":"green"}var be=rd(),F=_t(be),H=l(F),ue=l(H),fe=l(ue),Ee=s(fe);{var ze=S=>{var ee=Uo();b(S,ee)};G(Ee,S=>{n(o)&&!n(c)&&S(ze)})}var nt=s(ue,2),T=l(nt),J=s(F,2),oe=l(J),Pe=l(oe),Q=s(l(Pe),2);qe(Q,()=>tn("server"),!0);var ye=s(Pe,2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(oe,2),Ve=l(He),We=s(l(Ve),2);qe(We,()=>tn("cpu"),!0);var Tt=s(Ve,2),Pt=l(Tt),Ot=s(Tt,2),Rt=l(Ot);{var qt=S=>{var ee=tr();O(st=>m(ee,`${st??""} · ${n(c).state??""}`),[()=>{var st;return(st=n(c).meta)!=null&&st.ctx?Math.round(n(c).meta.ctx/1024)+"k ctx":""}]),b(S,ee)},D=S=>{var ee=tr("lädt bei erster Anfrage");b(S,ee)};G(Rt,S=>{n(c)?S(qt):S(D,-1)})}var U=s(He,2);{var Z=S=>{const ee=I(()=>{var lt;return n(r).gpu_temp??((lt=n(r).cpu)==null?void 0:lt.temp)??null}),st=I(()=>re(n(ee))),xe=I(()=>n(r).ram.total-n(r).ram.used),rt=I(()=>100-n(r).ram.percent);var Vt=Ho(),_e=_t(Vt),Qe=l(_e),dn=s(l(Qe));qe(dn,()=>tn("thermo"),!0);var Nt=s(Qe,2),In=l(Nt),Nn=s(Nt,2),An=l(Nn),_=s(_e,2),y=l(_),N=s(l(y));qe(N,()=>tn("database"),!0);var q=s(y,2),Y=l(q),Ce=s(q,2),Le=l(Ce);O((lt,yt,Te,De)=>{vt(_e,1,`kpi ${n(st)??""}`),m(In,lt),m(An,n(ee)==null?"messe…":n(ee)<55?"kühl":n(ee)<75?"normal":"⚠ heiß"),vt(_,1,`kpi ${n(rt)<15?"red":n(rt)<30?"":"green"}`),m(Y,yt),m(Le,`von ${Te??""} GB · ${De??""} % frei`)},[()=>n(ee)!=null?`${Math.round(n(ee))}°C`:"–",()=>Math.round(n(xe)/1073741824),()=>Math.round(n(r).ram.total/1073741824),()=>Math.round(n(rt))]),b(S,Vt)},le=S=>{var ee=Vo();b(S,ee)};G(U,S=>{n(r)?S(Z):S(le,-1)})}var x=s(J,2),z=l(x),K=s(l(z),4);{var ie=S=>{const ee=I(()=>n(E)());var st=Br(),xe=_t(st);Ze(xe,17,()=>{var rt;return[["Prozessor (CPU)",((rt=n(r).cpu)==null?void 0:rt.percent)??0,""],["Arbeitsspeicher (RAM)",n(r).ram.percent,Se(n(r).ram.percent)],["Grafikspeicher (VRAM)",n(ee),ve(n(ee))]]},Ye,(rt,Vt)=>{var _e=I(()=>ir(n(Vt),3));let Qe=()=>n(_e)[0],dn=()=>n(_e)[1];const Nt=I(()=>Math.max(0,Math.min(100,dn()||0)));var In=Wo(),Nn=l(In),An=l(Nn),_=l(An),y=s(An),N=l(y),q=s(Nn,2),Y=l(q);O((Ce,Le)=>{m(_,Qe()),m(N,`${Ce??""} %`),vt(q,1,`bar ${n(Nt)>=90?"bad":n(Nt)>=75?"warn":""}`),hn(Y,`width:${Le??""}%`)},[()=>Math.round(n(Nt)),()=>Math.max(2,n(Nt))]),b(rt,In)}),b(S,st)},$=S=>{var ee=jo();b(S,ee)};G(K,S=>{n(r)?S(ie):S($,-1)})}var V=s(z,2),ae=s(l(V),4),we=l(ae);qe(we,()=>tn("search"),!0);var Xe=s(we,4);qe(Xe,()=>tn("chevron"),!0);var Ae=s(ae,2),at=l(Ae);qe(at,()=>tn("refresh"),!0);var it=s(at,4);qe(it,()=>tn("chevron"),!0);var mt=s(Ae,2),et=l(mt);qe(et,()=>tn("file"),!0);var bt=s(et,4);qe(bt,()=>tn("chevron"),!0);var C=s(mt,2),X=l(C);qe(X,()=>tn("swap"),!0);var pe=s(X,4);qe(pe,()=>tn("chevron"),!0);var je=s(x,2),Ne=l(je),Bt=l(Ne),Ht=s(l(Bt),2),It=l(Ht),Yt=s(Bt,2);{var sn=S=>{var ee=ji();Ze(ee,21,()=>n(u),Ye,(st,xe)=>{const rt=I(()=>d.includes(n(xe).state)),Vt=I(()=>n(xe).state==="downloading"),_e=I(()=>n(xe).state==="loading"||n(xe).state==="starting"||n(Vt)?"load":n(rt)?"on":""),Qe=I(()=>n(Vt)?`↓ ${n(xe).download_progress!=null?Math.round(n(xe).download_progress)+"%":"..."}`:n(xe).state==="loading"||n(xe).state==="starting"?"lädt…":n(rt)?"geladen ✓":"bereit");var dn=ed(),Nt=l(dn),In=s(Nt,2),Nn=l(In),An=l(Nn),_=l(An),y=s(An,2);{var N=j=>{var ce=Jo();b(j,ce)},q=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Bild")}),Y=j=>{var ce=Qo();b(j,ce)},Ce=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Code")}),Le=j=>{var ce=Yo();b(j,ce)};G(y,j=>{n(q)?j(N):n(Ce)?j(Y,1):j(Le,-1)})}var lt=s(y,2);{var yt=j=>{var ce=Zo();b(j,ce)};G(lt,j=>{n(xe).ttl>=99999&&j(yt)})}var Te=s(Nn,2),De=l(Te),Me=s(In,2),ke=l(Me),Fe=l(ke),Ge=s(ke,2);{var Oe=j=>{var ce=Xo(),ot=l(ce);O(()=>{hn(ce,`padding:3px 9px;font-size:12px;opacity:${n(w)===n(xe).name?".5":"1"}`),ce.disabled=n(w)===n(xe).name,m(ot,n(w)===n(xe).name?"…":"Laden")}),P("click",ce,()=>L(n(xe).name)),b(j,ce)};G(Ge,j=>{!n(rt)&&!n(Vt)&&n(o)&&j(Oe)})}O((j,ce)=>{var ot;vt(Nt,1,`li-dot ${n(_e)??""}`),hn(An,n(rt)?"color:var(--accent)":""),m(_,n(xe).name),m(De,`${j??""} + ${(ot=n(xe).meta)!=null&&ot.quant?" · "+n(xe).meta.quant:""} + ${ce??""}`),hn(ke,`white-space:nowrap;color:${n(rt)?"var(--on)":"var(--mut)"}`),m(Fe,n(Qe))},[()=>{var j;return(j=n(xe).meta)!=null&&j.ctx?Math.round(n(xe).meta.ctx/1024)+"k ctx":""},()=>{var j;return(j=n(xe).meta)!=null&&j.size_bytes?" · "+(n(xe).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),b(st,dn)}),b(S,ee)},bn=S=>{var ee=td(),st=s(l(ee),4);P("click",st,()=>R("cookbook")),b(S,ee)};G(Yt,S=>{n(u).length?S(sn):S(bn,-1)})}var $n=s(Ne,2),ln=l($n),on=s(l(ln),2),yn=s(ln,2);{var Je=S=>{var ee=ji();Ze(ee,21,()=>n(p),Ye,(st,xe)=>{var rt=nd(),Vt=l(rt),_e=l(Vt),Qe=l(_e),dn=s(_e,2),Nt=l(dn);O(()=>{Ir(rt,"href",n(xe).link),m(Qe,n(xe).title),m(Nt,`${n(xe).source??""}${n(xe).relevant?" · für dich":""}`)}),b(st,rt)}),b(S,ee)},pt=S=>{var ee=ad();b(S,ee)};G(yn,S=>{n(p).length?S(Je):S(pt,-1)})}O(S=>{m(fe,`${n(v)??""} `),m(T,n(h)),vt(oe,1,`kpi ${n(o)?"green":"red"}`),m(ne,n(o)?"Online":"Offline"),m(Ie,S),vt(He,1,`kpi ${n(c)?"blue":"muted"}`),m(Pt,n(c)?n(c).name:"Keins"),m(It,n(u).length?n(u).length+" konfiguriert":"")},[()=>{var S,ee;return((ee=(S=n(a))==null?void 0:S.swap_url)==null?void 0:ee.replace(/^https?:\/\//,""))??"—"}]),P("click",ae,()=>R("cookbook")),P("click",Ae,A),P("click",mt,()=>R("server")),P("click",C,()=>R("connect")),P("click",on,()=>R("news")),P("keydown",on,S=>S.key==="Enter"&&R("news")),b(e,be),ia()}ka(["click","keydown"]);var sd=k(""),ld=k('
'),od=k('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),dd=k('
kein Modell hinterlegt
leere Rolleleer '),cd=k(' '),ud=k('
'),vd=k(' '),fd=k('
API-Name:
'),pd=k('
ModellKannDetailsStatusPortAktionen
'),hd=k('
Empfohlen für deine Hardware

'),gd=k(''),_d=k(''),md=k(''),bd=k('

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 yd(e,t){ra(t,!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.",r="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.",i=[{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=I(()=>{var x;return((x=gr.value)==null?void 0:x.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=B(""),u=B(""),v=B(""),h=B(!1);const E=I(()=>n(o).filter(x=>!x.incomplete));async function p(){var z;const x=n(c)||((z=n(E)[0])==null?void 0:z.name);if(!(!x||!n(u).trim())){g(h,!0),g(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const K=await ge("/api/chat",{method:"POST",body:JSON.stringify({model:x,message:n(u)})});g(v,K.reply,!0)}catch(K){g(v,"Fehler: "+K.message)}g(h,!1),d()}}const w=300;let A=B(!1),L=B(null),M=B(8192),R=B(!1);function Se(x){var z;g(L,n(o).find(K=>K.name===x),!0),n(L)&&(g(M,((z=n(L).meta)==null?void 0:z.ctx)||8192,!0),g(R,(n(L).ttl??w)>=99999),g(A,!0))}async function re(){const x=n(R)?99999:w;try{await ge("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(M),ttl:x})}),te("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(z){te(z.message,!0)}}let ve=B(!1),be=B(""),F=B(""),H=B("");function ue(x){const z=n(o).find(K=>K.name===x);g(be,x,!0),g(H,(z==null?void 0:z.role)||"",!0),g(F,""),g(ve,!0)}async function fe(x){try{await ge("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(be),role:x})}),te(x?`Rolle gesetzt: ${x}`:"Rolle entfernt."),g(ve,!1),d()}catch(z){te(z.message,!0)}}async function Ee(x){if(await Mn({title:`„${x}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await ge("/api/unload?model="+encodeURIComponent(x),{method:"POST"}),te("Entladen: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}async function ze(x){if(await Mn({title:`„${x}" 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 z=await ge("/api/delete_model",{method:"POST",body:JSON.stringify({alias:x})});te(z.note||"Gelöscht: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}function nt(x){return x!=null&&x.length?x.map(z=>z==="Code"?'Code':z==="Bild"?'Bild':'Text').join(" "):"–"}function T(x){if(!x)return"–";const z=x.quant||"?",K=x.ctx?Math.round(x.ctx/1024)+"K":"?",ie=x.size_bytes?(x.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${z} · ${K} · ${ie}`}function J(x){var z;(z=navigator.clipboard)==null||z.writeText(x),te("Kopiert: "+x)}var oe=bd(),Pe=s(_t(oe),2),Q=s(l(Pe),6);Ze(Q,21,()=>n(E),Ye,(x,z)=>{var K=sd(),ie=l(K),$={};O(()=>{m(ie,n(z).name),$!==($=n(z).name)&&(K.value=(K.__value=n(z).name)??"")}),b(x,K)});var ye=s(Q,4),ne=s(ye,2),Ke=l(ne),Ie=s(ne,2);{var He=x=>{var z=ld(),K=l(z);O(()=>m(K,n(v))),b(x,z)};G(Ie,x=>{n(v)&&x(He)})}var Ve=s(Pe,2),We=l(Ve),Tt=s(l(We)),Pt=l(Tt),Ot=s(We,4);{var Rt=x=>{var z=od();b(x,z)},qt=x=>{var z=pd(),K=s(l(z));Ze(K,21,()=>n(o),Ye,(ie,$)=>{var V=Br(),ae=_t(V);{var we=Ae=>{var at=dd(),it=l(at),mt=l(it),et=s(it,5),bt=l(et),C=s(bt,2);O(()=>m(mt,n($).name)),P("click",bt,()=>{var X;te("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(X=document.querySelector(".nav-item[data-view='cookbook']"))==null||X.dispatchEvent(new MouseEvent("click"))}),P("click",C,()=>ze(n($).name)),b(Ae,at)},Xe=Ae=>{var at=fd(),it=l(at),mt=l(it),et=l(mt),bt=s(et);{var C=Je=>{var pt=cd(),S=l(pt);O(()=>m(S,n($).role)),b(Je,pt)};G(bt,Je=>{n($).role&&Je(C)})}var X=s(mt,2);{var pe=Je=>{var pt=ud(),S=l(pt);O(()=>m(S,n($).meta.filename)),b(Je,pt)};G(X,Je=>{var pt;(pt=n($).meta)!=null&&pt.filename&&Je(pe)})}var je=s(X,2),Ne=s(l(je),2);Ze(Ne,17,()=>{var Je;return(Je=n($).api_ids)!=null&&Je.length?n($).api_ids:[n($).name]},Ye,(Je,pt)=>{var S=vd(),ee=l(S);O(()=>m(ee,n(pt))),P("click",S,()=>J(n(pt))),b(Je,S)});var Bt=s(it);qe(Bt,()=>{var Je;return nt((Je=n($).meta)==null?void 0:Je.caps)},!0);var Ht=s(Bt);qe(Ht,()=>T(n($).meta),!0);var It=s(Ht);qe(It,()=>Fo(n($).state,n($).download_progress),!0);var Yt=s(It),sn=l(Yt),bn=s(Yt),$n=l(bn),ln=s($n,2),on=s(ln,2),yn=s(on,2);O(()=>{m(et,`${n($).name??""} `),m(sn,n($).port??"auto")}),P("click",$n,()=>ue(n($).name)),P("click",ln,()=>Se(n($).name)),P("click",on,()=>Ee(n($).name)),P("click",yn,()=>ze(n($).name)),b(Ae,at)};G(ae,Ae=>{n($).incomplete?Ae(we):Ae(Xe,-1)})}b(ie,V)}),b(x,z)};G(Ot,x=>{n(o).length?x(qt,-1):x(Rt)})}var D=s(Ve,2);{var U=x=>{var z=gd(),K=l(z),ie=l(K),$=s(ie,4),V=l($),ae=s($,2),we=s(l(ae));qe(we,()=>fi(a));var Xe=s(ae,2),Ae=s(Xe,2);{var at=pe=>{var je=hd(),Ne=l(je),Bt=s(l(Ne),2),Ht=l(Bt),It=s(Ht,2),Yt=s(Ne,2);O((sn,bn)=>{m(Ht,`Optimal ~${sn??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(It,` Aktuell ~${bn??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),P("click",Yt,()=>g(M,n(L).meta.optimal_ctx,!0)),b(pe,je)};G(Ae,pe=>{var je;(je=n(L).meta)!=null&&je.optimal_ctx&&pe(at)})}var it=s(Ae,4),mt=s(l(it),2),et=l(mt),bt=s(et,2),C=l(bt),X=s(it,2);O(()=>{m(V,n(L).name),hn(bt,`color:${n(R)?"var(--accent)":"var(--mut)"}`),m(C,n(R)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),P("click",z,pe=>{pe.target.classList.contains("modal-overlay")&&g(A,!1)}),P("click",ie,()=>g(A,!1)),Ln(Xe,()=>n(M),pe=>g(M,pe)),Do(et,()=>n(R),pe=>g(R,pe)),P("click",X,re),b(x,z)};G(D,x=>{n(A)&&n(L)&&x(U)})}var Z=s(D,2);{var le=x=>{var z=md(),K=l(z),ie=l(K),$=s(ie,2),V=s(l($));qe(V,()=>fi(r));var ae=s($,2),we=l(ae),Xe=s(ae,4);Ze(Xe,21,()=>i,Ye,(et,bt)=>{var C=_d(),X=l(C);O(()=>{vt(C,1,n(H)===n(bt).id?"primary":"ghost"),Ir(C,"title",n(bt).desc),m(X,n(bt).label)}),P("click",C,()=>fe(n(bt).id)),b(et,C)});var Ae=s(Xe,4),at=s(Ae,2),it=l(at),mt=s(it,2);O(()=>m(we,n(be))),P("click",z,et=>{et.target.classList.contains("modal-overlay")&&g(ve,!1)}),P("click",ie,()=>g(ve,!1)),Ln(Ae,()=>n(F),et=>g(F,et)),P("click",it,()=>fe("")),P("click",mt,()=>fe(n(F).trim().toLowerCase())),b(x,z)};G(Z,x=>{n(ve)&&x(le)})}O(()=>{ne.disabled=n(h),m(Ke,n(h)?"…":"Senden"),m(Pt,n(o).length?n(o).length+" konfiguriert":"")}),nr(Q,()=>n(c),x=>g(c,x)),Ln(ye,()=>n(u),x=>g(u,x)),P("click",ne,p),b(e,oe),ia()}ka(["click"]);var wd=k('
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),xd=k(''),kd=k('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Md=k(' '),Sd=k(''),Ed=k(''),Td=k('
'),$d=k('
'),Ad=k('
'),Cd=k('

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 Ld(e,t){ra(t,!0);const a=I(()=>ca.value),r=I(()=>ca.tracked),i=I(()=>$i.value);let o=Dt({cpu:[],ram:[],gpu:[]});Mi(()=>{var oe;if(!n(i))return;const T=n(i).gpu,J=T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0;o.cpu=[...o.cpu,((oe=n(i).cpu)==null?void 0:oe.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,J].slice(-60)});const d=I(()=>()=>{var J;const T=(J=n(i))==null?void 0:J.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0}),c=I(()=>n(a).filter(T=>T.state!=="running"&&T.state!=="queued").length),u=I(()=>n(a).filter(T=>T.state==="failed").length);function v(T){if(T.state!=="running")return null;if(typeof T.progress=="number")return Math.min(100,T.progress);const oe=((T.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return oe?Math.min(100,parseFloat(oe[1])):null}function h(T){return T==null||T<0?"":T>=90?`noch ~${Math.round(T/60)} min`:`noch ~${Math.max(1,Math.round(T))} s`}function E(T){return T==="done"?'fertig':T==="failed"?'fehler':T==="canceled"?'abgebrochen':'läuft…'}function p(T){return T==="done"?"on":T==="failed"||T==="canceled"?"":"load"}async function w(T){try{await ge(`/api/jobs/${T}/cancel`,{method:"POST"}),te("Abbruch angefordert…")}catch(J){te(J.message,!0)}}async function A(T){try{await ge(`/api/jobs/${T}`,{method:"DELETE"})}catch(J){te(J.message,!0)}}async function L(){try{const T=await ge("/api/jobs/clear",{method:"POST"});te(`${T.removed} Einträge entfernt.`)}catch(T){te(T.message,!0)}}function M(T,J){return T.map(oe=>`
`).join("")}var R=Cd(),Se=s(_t(R),2);{var re=T=>{const J=I(()=>n(d)());var oe=wd(),Pe=_t(oe),Q=l(Pe),ye=s(l(Q),2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(Q,2),Ve=s(l(He),2),We=l(Ve),Tt=s(Ve,2),Pt=l(Tt),Ot=s(He,2),Rt=s(l(Ot),2),qt=l(Rt),D=s(Rt,2),U=l(D),Z=s(Pe,2),le=s(l(Z),4),x=l(le),z=s(l(x)),K=l(z),ie=s(x,2),$=s(l(ie),2),V=l($),ae=s(ie,2),we=s(l(ae)),Xe=l(we),Ae=s(ae,2),at=s(l(Ae),2),it=l(at),mt=s(le,2),et=l(mt),bt=s(l(et));qe(bt,()=>M(o.cpu,"--accent"),!0);var C=s(et,2),X=s(l(C));qe(X,()=>M(o.ram,"--purple"),!0);var pe=s(C,2),je=s(l(pe));qe(je,()=>M(o.gpu,"--on"),!0),O((Ne,Bt,Ht,It,Yt,sn,bn,$n,ln,on,yn,Je,pt)=>{m(ne,Ne),m(Ie,Bt),m(We,Ht),m(Pt,`${It??""} / ${Yt??""}`),m(qt,sn),m(U,bn),m(K,`${$n??""} / ${ln??""}`),m(V,on),m(Xe,`${yn??""} % belegt`),m(it,`${Je??""} / ${pt??""}`)},[()=>{var Ne;return Math.round(((Ne=n(i).cpu)==null?void 0:Ne.percent)??0)},()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>Math.round(n(J)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>n(i).gpu?`${sa(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${sa(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var Ne;return Math.round(((Ne=n(i).disk)==null?void 0:Ne.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),b(T,oe)};G(Se,T=>{n(i)&&T(re)})}var ve=s(Se,2),be=l(ve),F=s(l(be),2),H=l(F),ue=s(F,2);{var fe=T=>{var J=xd();P("click",J,L),b(T,J)};G(ue,T=>{n(c)&&T(fe)})}var Ee=s(be,4);{var ze=T=>{var J=kd();b(T,J)},nt=T=>{var J=Br(),oe=_t(J);Ze(oe,17,()=>n(a),Ye,(Pe,Q)=>{const ye=I(()=>v(n(Q))),ne=I(()=>n(Q).state==="running"?h(n(Q).eta_s):""),Ke=I(()=>n(Q).state==="running"&&n(Q).rate_bps?sa(n(Q).rate_bps)+"/s":""),Ie=I(()=>[n(ne),n(Ke)].filter(Boolean).join(" · ")),He=I(()=>n(r).includes(n(Q).id));var Ve=Ad(),We=l(Ve),Tt=l(We),Pt=s(Tt,2),Ot=l(Pt),Rt=s(Pt,2);{var qt=$=>{var V=Md(),ae=l(V);O(we=>m(ae,`${we??""} %${n(Ie)?` · ${n(Ie)}`:""}`),[()=>Math.round(n(ye))]),b($,V)};G(Rt,$=>{n(ye)!=null&&$(qt)})}var D=s(Rt,2);{var U=$=>{var V=Sd();O(()=>hn(V,`${n(ye)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),P("click",V,ae=>{ae.stopPropagation(),w(n(Q).id)}),b($,V)},Z=$=>{var V=Ed();P("click",V,ae=>{ae.stopPropagation(),A(n(Q).id)}),b($,V)};G(D,$=>{n(Q).state==="running"?$(U):$(Z,-1)})}var le=s(D,2);qe(le,()=>E(n(Q).state));var x=s(We,2);{var z=$=>{var V=Td(),ae=l(V);O(()=>hn(ae,`width:${n(ye)??""}%`)),b($,V)};G(x,$=>{n(ye)!=null&&n(Q).state==="running"&&$(z)})}var K=s(x,2);{var ie=$=>{var V=$d(),ae=l(V);O(we=>m(ae,we),[()=>(n(Q).log||[]).join(` +`)]),b($,V)};G(K,$=>{n(He)&&$(ie)})}O($=>{vt(Tt,1,`li-dot ${$??""}`),m(Ot,n(Q).label)},[()=>p(n(Q).state)]),P("click",We,()=>ca.toggle(n(Q).id)),P("keydown",We,$=>$.key==="Enter"&&ca.toggle(n(Q).id)),b(Pe,Ve)}),b(T,J)};G(Ee,T=>{n(a).length?T(nt,-1):T(ze)})}O(()=>m(H,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),b(e,R),ia()}ka(["click","keydown"]);var zd=k(' '),Pd=k(''),Dd=k('✓ fertig'),Od=k('✗ fehlgeschlagen'),Rd=k('abgebrochen'),qd=k('läuft…'),Bd=k('
'),Id=k('

Aktueller Vorgang

'),Nd=k('

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 Fd(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>ca.value);let i=null,o=B(`Verbinde… +`),d=B("llama-swap"),c,u=B(null),v=B("");const h=new Set,E=I(()=>n(u)?n(r).find(C=>C.id===n(u)):null);Mi(()=>{if(!n(E))return;const C=n(E),X=C.state==="done",pe=C.state==="failed",je=C.state==="canceled";(X||pe||je)&&!h.has(C.id)&&(h.add(C.id),te(X?`✓ ${n(v)} abgeschlossen.`:je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,pe),X&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(C,X){g(u,C,!0),g(v,X,!0),ca.track(C)}hr(()=>{w()}),Ro(()=>{i==null||i.close()});function w(){i==null||i.close();const C=n(d);g(o,`Verbinde mit ${C}… +`);const X=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${X}//${location.host}/api/logs/${C}?token=${encodeURIComponent(Ys())}`),i.onmessage=pe=>{g(o,n(o)+pe.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+` +— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(C,X,pe){if(await Mn({title:X,body:pe,confirmLabel:"Neustarten"}))try{await ge(`/api/service/${C}/restart`,{method:"POST"}),te("Neustart ausgelöst: "+C),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(je){te(je.message,!0)}}async function L(){if(await Mn({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 C=await ge("/api/self-update",{method:"POST"});te("Update läuft — Dashboard startet gleich neu."),p(C.job_id,"Mission Control Update")}catch(C){te(C.message,!0)}}async function M(){if(await Mn({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."}))try{const C=await ge("/api/update",{method:"POST"});te("LLM-Engine-Update läuft."),p(C.job_id,"LLM-Engine-Update")}catch(C){te(C.message,!0)}}async function R(){if(await Mn({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 ge("/api/unload",{method:"POST"}),te("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(C){te(C.message,!0)}}async function Se(){if(!await Mn({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 C=await Ui({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(C)try{const X=await ge("/api/os-update",{method:"POST",body:JSON.stringify({password:C})});te("OS-Update gestartet."),p(X.job_id,"OS-Update")}catch(X){te(X.message,!0)}}async function re(){if(!await Mn({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 C=await Ui({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(C)try{await ge("/api/reboot",{method:"POST",body:JSON.stringify({password:C})}),te("Reboot ausgelöst — bis gleich.")}catch(X){te(X.message,!0)}}async function ve(){g(be,"prüfe…");try{const C=await ge("/api/integration/test");g(be,C.ok?`✓ Engine antwortet — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ keine Verbindung: ${C.error}`,!0),g(F,C.ok,!0)}catch(C){g(be,"✗ "+C.message),g(F,!1)}}let be=B(""),F=B(!1);const H=I(()=>{var C;return((C=n(a))==null?void 0:C.models)||[]}),ue=["running","ready","loading","starting"],fe=I(()=>n(H).find(C=>ue.includes(C.state)));function Ee(C){if(!C||C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const pe=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return pe?Math.min(100,parseFloat(pe[1])):null}var ze=Nd(),nt=s(_t(ze),2),T=l(nt),J=s(l(T),2),oe=l(J),Pe=s(T,4),Q=l(Pe),ye=s(l(Q)),ne=l(ye),Ke=s(Q,2),Ie=s(l(Ke),2),He=l(Ie),Ve=s(Ke,2),We=s(l(Ve),2),Tt=l(We),Pt=s(Pe,2),Ot=l(Pt),Rt=s(Ot,2);{var qt=C=>{var X=zd(),pe=l(X);O(()=>{hn(X,`color:${n(F)?"#7ee29a":"#ff9b95"}`),m(pe,n(be))}),b(C,X)};G(Rt,C=>{n(be)&&C(qt)})}var D=s(nt,2),U=s(l(D),4),Z=s(U,2),le=s(Z,2),x=s(le,2),z=s(x,2),K=s(D,2),ie=s(l(K),4),$=s(ie,2),V=s(K,2);{var ae=C=>{const X=I(()=>n(E)),pe=I(()=>n(X).state==="done"),je=I(()=>n(X).state==="failed"),Ne=I(()=>n(X).state==="canceled"),Bt=I(()=>n(pe)||n(je)||n(Ne)),Ht=I(()=>Ee(n(X)));var It=Id(),Yt=l(It),sn=s(l(Yt),2);{var bn=_e=>{var Qe=Pd();P("click",Qe,async()=>{await Mn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&ge(`/api/jobs/${n(X).id}/cancel`,{method:"POST"})}),b(_e,Qe)};G(sn,_e=>{n(Bt)||_e(bn)})}var $n=s(sn,2),ln=l($n);{var on=_e=>{var Qe=Dd();b(_e,Qe)},yn=_e=>{var Qe=Od();b(_e,Qe)},Je=_e=>{var Qe=Rd();b(_e,Qe)},pt=_e=>{var Qe=qd();b(_e,Qe)};G(ln,_e=>{n(pe)?_e(on):n(je)?_e(yn,1):n(Ne)?_e(Je,2):_e(pt,-1)})}var S=s(Yt,2),ee=l(S),st=s(S,2);{var xe=_e=>{var Qe=Bd(),dn=l(Qe);O(()=>hn(dn,`width:${n(Ht)??""}%`)),b(_e,Qe)};G(st,_e=>{n(Ht)!=null&&!n(Bt)&&_e(xe)})}var rt=s(st,2),Vt=l(rt);O(_e=>{m(ee,`${n(v)??""}${n(Bt)?n(pe)?" — erfolgreich.":n(Ne)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(Vt,_e)},[()=>(n(X).log||[]).join(` +`)]),b(C,It)};G(V,C=>{n(E)&&C(ae)})}var we=s(V,2),Xe=l(we),Ae=s(l(Xe),2),at=l(Ae);at.value=at.__value="llama-swap";var it=s(at);it.value=it.__value="mission-control";var mt=s(it);mt.value=mt.__value="system";var et=s(Xe,4),bt=l(et);Oo(et,C=>c=C,()=>c),O(C=>{var X,pe,je;hn(J,`margin-left:auto;${(X=n(a))!=null&&X.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"}`),m(oe,(pe=n(a))!=null&&pe.swap_ok?"● erreichbar":"● offline"),m(ne,(((je=n(a))==null?void 0:je.swap_url)||"—")+"/v1"),m(He,n(fe)?n(fe).name+` (${n(fe).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Tt,C),m(bt,n(o))},[()=>n(H).filter(C=>!C.incomplete).length||"keine"]),P("click",Ot,ve),P("click",U,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),P("click",Z,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),P("click",le,L),P("click",x,M),P("click",z,R),P("click",ie,Se),P("click",$,re),P("change",Ae,w),nr(Ae,()=>n(d),C=>g(d,C)),b(e,ze),ia()}ka(["click","change"]);var Kd=k('
Lade Setups…
'),Gd=k(' ×',1),Qr=k('
★ Beste Wahl für dein System
'),Ud=k('
Dein Setup
'),Hd=k(''),Vd=k('
'),Wd=k('· ⚠ Cache veraltet'),jd=k(" ",1),Jd=k('
Frage Quellen ab…
'),Qd=k('
'),Yd=k('✓ installiert'),Zd=k(''),Xd=k('

'),ec=k('

'),tc=k(''),nc=k('

'),ac=k('
'),rc=k('
'),ic=k('
'),sc=k(" "),lc=k('
'),oc=k('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),dc=k(''),cc=k('
Lade Dateien von HuggingFace…
'),Ji=k(""),uc=k('
Empfohlener Kontext für deine Hardware: übernehmen
'),vc=k('
Ressourcen-Check
'),fc=k('
',1),pc=k('
Keine GGUF-Dateien im Repo gefunden.
'),hc=k(''),gc=k('
'),_c=k(''),mc=k('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

Use-Case-Setups

Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es 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 bc(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="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.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{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(_){const y=(_||"").toLowerCase();for(const N of d)if(N.kw.some(q=>y.includes(q)))return N.label;return"Allrounder"}function u(_=""){const y=_.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(y)||new RegExp("(?{Pt(),Ot()});async function Pt(){g(L,!0);try{const _=await ge("/api/cookbook/recipes");g(w,_.recipes||[],!0),g(A,_.recommended_id||null,!0)}catch(_){te(_.message,!0)}g(L,!1)}async function Ot(_=!1){g(R,!0);try{const y=await ge("/api/cookbook/discover"+(_?"?force=true":""));g(M,y,!0),g(Se,y.stale,!0)}catch(y){te("Empfehlungen nicht ladbar: "+y.message,!0)}g(R,!1)}function Rt(_){_=_.trim();const y=_.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return y?y[1]:/^[\w.-]+\/[\w.-]+$/.test(_)?_:null}async function qt(){const _=n(re).trim(),y=Rt(_);let N=_;if(n(F)&&!y&&(N=N?N+" "+n(F):n(F)),!N&&!y){g(ve,[],!0);return}g(be,!0),g(ue,[],!0),g(fe,-1);try{if(y)g(ve,[{id:y,author:y.split("/")[0],downloads:0}],!0);else{const q=`https://huggingface.co/api/models?search=${encodeURIComponent(N)}&filter=gguf&sort=${encodeURIComponent(n(H))}&direction=-1&limit=40`,Y=await fetch(q);g(ve,await Y.json(),!0)}n(ve).forEach((q,Y)=>D(Y,q.id))}catch(q){te(q.message,!0),g(ve,[],!0)}g(be,!1)}async function D(_,y){var N;try{const q=await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})});if(!((N=q.files)!=null&&N.length)){n(ue)[_]=null,U();return}const Y=q.files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||q.files[0];n(ue)[_]=Y.fit.level,U()}catch{n(ue)[_]=null,U()}}function U(){let _=-1,y=99;n(ue).forEach((N,q)=>{if(N==null)return;const Y=i[N]??99;Y=0&&y<=1?_:-1,!0)}function Z(_){g(Ee,n(w).find(y=>y.id===_),!0)}async function le(_){const y=document.getElementById("cb-r-install-btn");y&&(y.disabled=!0,y.textContent="Starte…");try{const N=await ge("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:_,hf_token:rr()})});te(`${N.count} Downloads gestartet — siehe Aktivität.`),g(Ee,null),Tt("activity")}catch(N){te(N.message,!0),y&&(y.disabled=!1,y.textContent="Installieren")}}async function x(_,y){var N,q;g(ze,!0),g(nt,y,!0),g(T,_,!0),g(Pe,""),g(Q,8192),g(J,null),g(ne,null),g(oe,""),g(ye,!0);try{if(g(J,await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})}),!0),(q=(N=n(J))==null?void 0:N.files)!=null&&q.length){const Y=n(J).files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||n(J).files[0];g(oe,Y.filename,!0),Y.optimal_ctx&&n(Q)===8192&&g(Q,Y.optimal_ctx,!0),z()}}catch(Y){te(Y.message,!0)}g(ye,!1)}function z(){var _,y,N;!((y=(_=n(J))==null?void 0:_.files)!=null&&y.length)||!n(oe)||(g(ne,n(J).files.find(q=>q.filename===n(oe))||null,!0),(N=n(ne))!=null&&N.optimal_ctx&&n(Q)===8192&&g(Q,n(ne).optimal_ctx,!0))}async function K(){if(!n(T)||!n(oe))return te("Bitte eine GGUF-Datei wählen.",!0);g(ye,!0);try{const _=await ge("/api/download",{method:"POST",body:JSON.stringify({repo:n(T),file:n(oe),hf_token:rr()})});await ge("/api/register",{method:"POST",body:JSON.stringify({role:n(Pe),model_path:_.expected_path,ctx:n(Q)})}),te("Download gestartet — siehe Aktivität."),g(ze,!1),Tt("activity")}catch(_){te("Fehler: "+_.message,!0)}g(ye,!1)}async function ie(_,y,N,q){q.disabled=!0,q.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:_,role:y,params_b:N,quant:"Q4_K_M",hf_token:rr()})}),te("Download gestartet — siehe Aktivität."),Tt("activity")}catch(Y){te(Y.message,!0),q.disabled=!1,q.textContent="Installieren"}}function $(){g(We,null),g(Ie,""),g(He,""),g(Ve,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(Ke,!0)}function V(_){const y=n(w).find(N=>N.id===_);y&&(g(We,_,!0),g(Ie,y.title,!0),g(He,y.desc||"",!0),g(Ve,y.models.map(N=>({repo:N.repo,role:N.role,quant:N.quant||"Q4_K_M"})),!0),g(Ke,!0))}async function ae(){if(!n(Ie).trim())return te("Bitte einen Titel angeben.",!0);const _=n(Ve).filter(y=>y.repo.trim());if(!_.length)return te("Mindestens ein Modell (Repo) angeben.",!0);try{n(We)?(await ge("/api/cookbook/user-recipe/"+encodeURIComponent(n(We)),{method:"PUT",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup aktualisiert.")):(await ge("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup gespeichert.")),g(Ke,!1),Pt()}catch(y){te(y.message,!0)}}async function we(_){const y=n(w).find(N=>N.id===_);if(await Mn({title:`„${(y==null?void 0:y.title)||_}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await ge("/api/cookbook/user-recipe/"+encodeURIComponent(_),{method:"DELETE"}),te("Setup gelöscht."),Pt()}catch(N){te(N.message,!0)}}function Xe(_){if(!u(_))return"";const y=v(_);return`MoE${y?` · ~${y}B aktiv`:""}`}function Ae(_){return _?`${Rn(_)}`:""}var at=mc(),it=s(_t(at),2),mt=l(it),et=s(l(mt),2),bt=s(mt,4);{var C=_=>{var y=Kd();b(_,y)},X=_=>{var y=Vd();Ze(y,21,()=>n(w),Ye,(N,q)=>{const Y=I(()=>n(q).id===n(A));var Ce=Hd(),Le=l(Ce);{var lt=Ue=>{var ct=Gd(),Zt=_t(ct),wt=s(Zt,2);P("click",Zt,xt=>{xt.stopPropagation(),V(n(q).id)}),P("keydown",Zt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),V(n(q).id))}),P("click",wt,xt=>{xt.stopPropagation(),we(n(q).id)}),P("keydown",wt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),we(n(q).id))}),b(Ue,ct)};G(Le,Ue=>{n(q).user&&Ue(lt)})}var yt=s(Le,2);{var Te=Ue=>{var ct=Qr();b(Ue,ct)},De=Ue=>{var ct=Ud();b(Ue,ct)};G(yt,Ue=>{n(Y)?Ue(Te):n(q).user&&Ue(De,1)})}var Me=s(yt,2),ke=l(Me),Fe=l(ke),Ge=l(Fe),Oe=s(ke,2),j=l(Oe),ce=s(Me,2),ot=l(ce),$t=s(ce,2),dt=l($t);O((Ue,ct)=>{vt(Ce,1,`card-btn${n(Y)?" cb-best":""}`),m(Ge,n(q).title),vt(Oe,1,`fit-badge ${Ue??""}`),m(j,ct),m(ot,n(q).desc),m(dt,`${n(q).models.length??""} Modell${n(q).models.length>1?"e":""} im Setup`)},[()=>h(n(q).fit_level),()=>E(n(q).fit_level)]),P("click",Ce,()=>Z(n(q).id)),b(N,Ce)}),b(_,y)};G(bt,_=>{n(L)?_(C):_(X,-1)})}var pe=s(it,2),je=l(pe),Ne=s(l(je),2),Bt=l(Ne);{var Ht=_=>{const y=I(()=>Math.round((Date.now()/1e3-n(M).updated)/60));var N=jd(),q=_t(N);{var Y=Te=>{var De=tr();O(()=>m(De,`Quellen befragt vor ${n(y)??""} min`)),b(Te,De)},Ce=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} h`),[()=>Math.round(n(y)/60)]),b(Te,De)},Le=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} Tg.`),[()=>Math.round(n(y)/1440)]),b(Te,De)};G(q,Te=>{n(y)<60?Te(Y):n(y)<1440?Te(Ce,1):Te(Le,-1)})}var lt=s(q,2);{var yt=Te=>{var De=Wd();b(Te,De)};G(lt,Te=>{n(Se)&&Te(yt)})}b(_,N)};G(Bt,_=>{var y;(y=n(M))!=null&&y.updated&&_(Ht)})}var It=s(Ne,2),Yt=l(It),sn=s(je,4);{var bn=_=>{var y=Jd();b(_,y)},$n=_=>{var y=Br(),N=_t(y);Ze(N,17,()=>n(M).categories,Ye,(q,Y)=>{var Ce=ec(),Le=l(Ce),lt=l(Le),yt=l(lt),Te=s(Le,2);Ze(Te,21,()=>n(Y).models,Ye,(De,Me)=>{const ke=I(()=>n(Y).recommended&&n(Me).repo===n(Y).recommended);var Fe=Xd(),Ge=l(Fe);{var Oe=Et=>{var Kt=Qr();b(Et,Kt)};G(Ge,Et=>{n(ke)&&Et(Oe)})}var j=s(Ge,2),ce=l(j),ot=l(ce),$t=l(ot),dt=s(ot,2),Ue=l(dt),ct=s(ce,2),Zt=l(ct),wt=s(j,2),xt=l(wt);qe(xt,()=>Ae(o[n(Me).role]||c(n(Me).repo)));var Cn=s(xt,2);qe(Cn,()=>Xe(n(Me).repo));var Wn=s(wt,2),tt=l(Wn),ut=s(Wn,2);Ze(ut,17,()=>n(Me).requirements||[],Ye,(Et,Kt)=>{var jn=Qd(),Kr=l(jn);O(()=>m(Kr,`⚠ ${n(Kt)??""}`)),b(Et,jn)});var ht=s(ut,4),kt=l(ht);{var Xt=Et=>{var Kt=Yd();O(()=>Ir(Kt,"title",`bereits eingerichtet als ${n(Me).installed??""}`)),b(Et,Kt)},Ft=Et=>{var Kt=Zd();P("click",Kt,jn=>ie(n(Me).repo,n(Me).role,n(Me).params_b,jn.currentTarget)),b(Et,Kt)};G(kt,Et=>{n(Me).installed?Et(Xt):Et(Ft,-1)})}O((Et,Kt,jn)=>{vt(Fe,1,`card${n(ke)?" res-best":""}`),m($t,n(Me).name),m(Ue,`${n(Me).author??""} · ${n(Me).params_b??""}B`),vt(ct,1,`fit-badge ${Et??""}`),m(Zt,n(Me).fit.text),m(tt,`${Kt??""} · ⬇ ${jn??""}`)},[()=>h(n(Me).fit.level),()=>p(n(Me).fit),()=>(n(Me).downloads||0).toLocaleString()]),b(De,Fe)}),O(()=>m(yt,n(Y).title)),b(q,Ce)}),b(_,y)};G(sn,_=>{var y;n(R)&&!n(M)?_(bn):(y=n(M))!=null&&y.categories&&_($n,1)})}var ln=s(pe,2),on=s(l(ln),4),yn=l(on),Je=s(yn,2),pt=l(Je);pt.value=pt.__value="downloads";var S=s(pt);S.value=S.__value="trending";var ee=s(S);ee.value=ee.__value="created_at";var st=s(Je,2),xe=l(st),rt=s(on,2);Ze(rt,20,()=>["","coder","vision","reasoning","chat","agent"],Ye,(_,y)=>{var N=tc(),q=l(N);O(()=>{vt(N,1,n(F)===y?"primary":"ghost"),m(q,y||"Alle")}),P("click",N,()=>{g(F,y,!0),qt()}),b(_,N)});var Vt=s(rt,2);{var _e=_=>{var y=ac();Ze(y,21,()=>n(ve),Ye,(N,q,Y)=>{var Ce=nc(),Le=l(Ce);{var lt=wt=>{var xt=Qr();b(wt,xt)};G(Le,wt=>{Y===n(fe)&&wt(lt)})}var yt=s(Le,2),Te=l(yt),De=l(Te),Me=l(De),ke=s(De,2),Fe=l(ke),Ge=s(Te,2),Oe=l(Ge),j=s(yt,2),ce=l(j);qe(ce,()=>Ae(c(n(q).id)));var ot=s(ce,2);qe(ot,()=>Xe(n(q).id));var $t=s(j,4),dt=l($t),Ue=l(dt),ct=s(dt,2),Zt=l(ct);O((wt,xt,Cn,Wn,tt)=>{vt(Ce,1,`card${Y===n(fe)?" res-best":""}`),m(Me,wt),m(Fe,n(q).author||""),vt(Ge,1,`fit-badge ${xt??""}`),m(Oe,Cn),m(Ue,Wn),m(Zt,`⬇ ${tt??""}`)},[()=>n(q).id.split("/").pop(),()=>n(ue)[Y]?h(n(ue)[Y]):"warn",()=>n(ue)[Y]?E(n(ue)[Y]):"prüfe…",()=>n(ue)[Y]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(q).downloads||0).toLocaleString()]),P("click",Ce,()=>x(n(q).id,n(q).id.split("/").pop())),b(N,Ce)}),b(_,y)};G(Vt,_=>{n(ve).length&&_(_e)})}var Qe=s(ln,2);{var dn=_=>{const y=I(()=>n(Ee));var N=dc(),q=l(N),Y=l(q),Ce=s(Y,2),Le=l(Ce),lt=s(Ce,2),yt=l(lt),Te=s(lt,2);Ze(Te,21,()=>n(y).models,Ye,(Ge,Oe)=>{var j=lc(),ce=l(j),ot=l(ce),$t=l(ot),dt=l($t),Ue=s($t,2),ct=l(Ue),Zt=s(Ue,2);qe(Zt,()=>Xe(n(Oe).repo));var wt=s(ot,2);{var xt=ht=>{var kt=rc(),Xt=l(kt);O(()=>m(Xt,n(Oe).why)),b(ht,kt)};G(wt,ht=>{n(Oe).why&&ht(xt)})}var Cn=s(wt,2);{var Wn=ht=>{var kt=ic(),Xt=l(kt);O((Ft,Et,Kt)=>m(Xt,`~${Ft??""} GB · ~${Et??""} Tok/s · optimal ~${Kt??""}k Kontext`),[()=>(n(Oe).fit.req_gb??0).toFixed(1),()=>Math.round(n(Oe).fit.tps??0),()=>Math.round((n(Oe).optimal_ctx||8192)/1024)]),b(ht,kt)};G(Cn,ht=>{n(Oe).fit&&ht(Wn)})}var tt=s(ce,2);{var ut=ht=>{var kt=sc(),Xt=l(kt);O(Ft=>{vt(kt,1,`fit-badge ${Ft??""}`),m(Xt,n(Oe).fit.text)},[()=>h(n(Oe).fit.level)]),b(ht,kt)};G(tt,ht=>{n(Oe).fit&&ht(ut)})}O(()=>{m(dt,n(Oe).name),m(ct,n(Oe).role)}),b(Ge,j)});var De=s(Te,2);{var Me=Ge=>{const Oe=I(()=>Math.max(...n(y).models.map($t=>{var dt;return((dt=$t.fit)==null?void 0:dt.req_gb)??0})));var j=oc(),ce=s(l(j)),ot=l(ce);O($t=>m(ot,`~${$t??""} GB`),[()=>n(Oe).toFixed(1)]),b(Ge,j)};G(De,Ge=>{n(y).models.length&&n(y).models[0].fit&&Ge(Me)})}var ke=s(De,2),Fe=l(ke);O(()=>{m(Le,n(y).title),m(yt,n(y).desc),vt(ke,1,`primary${n(y).fit_level==="too_tight"?" warn":""}`),m(Fe,n(y).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),P("click",N,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ee,null)}),P("click",Y,()=>g(Ee,null)),P("click",ke,()=>le(n(y).id)),b(_,N)};G(Qe,_=>{n(Ee)&&_(dn)})}var Nt=s(Qe,2);{var In=_=>{var y=hc(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,2),lt=l(Le),yt=s(Le,2);{var Te=ke=>{var Fe=cc();b(ke,Fe)},De=ke=>{var Fe=fc(),Ge=s(_t(Fe),2);Ze(Ge,21,()=>n(J).files,Ye,(tt,ut)=>{const ht=I(()=>n(ut).fit.level==="perfect"?"●":n(ut).fit.level==="marginal"?"◐":"○");var kt=Ji(),Xt=l(kt),Ft={};O(()=>{m(Xt,`${n(ht)??""} ${n(ut).filename??""}`),Ft!==(Ft=n(ut).filename)&&(kt.value=(kt.__value=n(ut).filename)??"")}),b(tt,kt)});var Oe=s(Ge,2),j=l(Oe),ce=s(l(j),2),ot=s(j,2),$t=l(ot),dt=s(l($t));qe(dt,()=>fi(a));var Ue=s($t,2),ct=s(Oe,2);{var Zt=tt=>{var ut=uc(),ht=s(l(ut)),kt=l(ht),Xt=s(ht,2);O(Ft=>m(kt,`~${Ft??""}k`),[()=>Math.round(n(ne).optimal_ctx/1024)]),P("click",Xt,Ft=>{Ft.preventDefault(),g(Q,n(ne).optimal_ctx,!0)}),b(tt,ut)};G(ct,tt=>{var ut;(ut=n(ne))!=null&&ut.optimal_ctx&&tt(Zt)})}var wt=s(ct,2);{var xt=tt=>{var ut=vc(),ht=l(ut),kt=s(l(ht),2),Xt=l(kt),Ft=s(ht,2),Et=l(Ft);O((Kt,jn,Kr)=>{m(Xt,`~${Kt??""} GB · ~${jn??""} Tok/s · ${(n(ne).quant||"GGUF")??""}`),vt(Ft,1,`fit-badge ${Kr??""}`),m(Et,n(ne).fit.text)},[()=>(n(ne).fit.req_gb??0).toFixed(1),()=>Math.round(n(ne).fit.tps??0),()=>h(n(ne).fit.level)]),b(tt,ut)};G(wt,tt=>{n(ne)&&tt(xt)})}var Cn=s(wt,2),Wn=l(Cn);O(()=>{var tt,ut;vt(Cn,1,`primary${((tt=n(ne))==null?void 0:tt.fit.level)==="too_tight"?" warn":""}`),Cn.disabled=n(ye),m(Wn,n(ye)?"Starte…":((ut=n(ne))==null?void 0:ut.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),P("change",Ge,z),nr(Ge,()=>n(oe),tt=>g(oe,tt)),Ln(ce,()=>n(Pe),tt=>g(Pe,tt)),Ln(Ue,()=>n(Q),tt=>g(Q,tt)),P("click",Cn,K),b(ke,Fe)},Me=ke=>{var Fe=pc();b(ke,Fe)};G(yt,ke=>{var Fe,Ge;n(ye)&&!n(J)?ke(Te):(Ge=(Fe=n(J))==null?void 0:Fe.files)!=null&&Ge.length?ke(De,1):n(ye)||ke(Me,2)})}O(()=>{m(Ce,n(nt)),m(lt,n(T))}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),P("click",q,()=>g(ze,!1)),b(_,y)};G(Nt,_=>{n(ze)&&_(In)})}var Nn=s(Nt,2);{var An=_=>{var y=_c(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,6),lt=s(Le,4),yt=s(lt,4);Ze(yt,17,()=>n(Ve),Ye,(ke,Fe,Ge)=>{var Oe=gc(),j=l(Oe),ce=s(j,2),ot=s(ce,2);Ze(ot,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ye,(dt,Ue)=>{var ct=Ji(),Zt=l(ct),wt={};O(()=>{m(Zt,Ue),wt!==(wt=Ue)&&(ct.__value=Ue)}),b(dt,ct)});var $t=s(ot,2);Ln(j,()=>n(Fe).repo,dt=>n(Fe).repo=dt),Ln(ce,()=>n(Fe).role,dt=>n(Fe).role=dt),nr(ot,()=>n(Fe).quant,dt=>n(Fe).quant=dt),P("click",$t,()=>g(Ve,n(Ve).filter((dt,Ue)=>Ue!==Ge),!0)),b(ke,Oe)});var Te=s(yt,2),De=s(Te,4),Me=l(De);O(()=>{m(Ce,n(We)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Me,n(We)?"Änderungen speichern":"Setup speichern")}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(Ke,!1)}),P("click",q,()=>g(Ke,!1)),Ln(Le,()=>n(Ie),ke=>g(Ie,ke)),Ln(lt,()=>n(He),ke=>g(He,ke)),P("click",Te,()=>g(Ve,[...n(Ve),{repo:"",role:"",quant:"Q4_K_M"}],!0)),P("click",De,ae),b(_,y)};G(Nn,_=>{n(Ke)&&_(An)})}O(()=>{It.disabled=n(R),m(Yt,n(R)?"Suche…":"Aktualisieren"),st.disabled=n(be),m(xe,n(be)?"Lade…":"Suchen")}),P("click",et,$),P("click",It,()=>Ot(!0)),P("keydown",yn,_=>_.key==="Enter"&&qt()),Ln(yn,()=>n(re),_=>g(re,_)),nr(Je,()=>n(H),_=>g(H,_)),P("click",st,qt),b(e,at),ia()}ka(["click","keydown","change"]);var yc=k(`
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.
`),wc=k(' '),xc=k('
'),kc=k(' '),Mc=k(''),Sc=k('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.
'),Ec=k(''),Tc=k('

Ö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.
',1),$c=k('

Datei anlegen oder öffnen:

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

Nur den "provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt.

Danach in OpenCode /models wählen.

',1),Ac=k('

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

API-Key: ein beliebiger Wert (z.B. local).
',1),Cc=k('

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

',1),Lc=k('

Bilder einbinden (Vision)

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

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?

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?

4 · Config-Snippet

',1);function Pc(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>{var D;return(((D=n(a))==null?void 0:D.models)||[]).filter(U=>!U.incomplete)}),i=I(v);let o=B("zed"),d=B(Dt([])),c=B(""),u=B(!1);function v(){return`http://${location.hostname}:8080/v1`}function h(D){return/^\d{1,3}(\.\d{1,3}){3}$/.test(D)}function E(){return location.protocol==="https:"||!h(location.hostname)}const p=I(()=>n(d).length?n(d):n(r).map(D=>D.name)),w=I(()=>n(p)[0]||"coder"),A=I(()=>{var D;return(D=n(r).find(U=>{var Z,le;return(le=(Z=U.meta)==null?void 0:Z.caps)==null?void 0:le.includes("Bild")}))==null?void 0:D.name});function L(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var ie,$;const z=(((ie=x.meta)==null?void 0:ie.caps)||[]).some(V=>/Bild|Vision/i.test(V)),K=(($=x.meta)==null?void 0:$.ctx)||131072;return` { "name": "${x.name}", "display_name": "${x.name}", "max_tokens": ${K}${z?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${P}", + "api_url": "${D}", "available_models": [ -${re} +${le} ] } } -}`}function S(P,F){const re=(F.length?n(r).filter(w=>F.includes(w.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(w=>{var I;const C=((I=w.meta)==null?void 0:I.ctx)||131072;return` "${w.name}": { "name": "${w.name}", "contextWindowSize": ${C} }`}).join(`, +}`}function M(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var K;const z=((K=x.meta)==null?void 0:K.ctx)||131072;return` "${x.name}": { "name": "${x.name}", "contextWindowSize": ${z} }`}).join(`, `);return`"provider": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${P}", + "baseURL": "${D}", "apiKey": "local" }, "models": { -${re} +${le} } } -}`}async function B(){g(c,"Teste…");try{const P=await fe("/api/integration/test");g(u,P.ok,!0),g(c,P.ok?`✓ Verbunden — ${P.models.length} Modell(e): ${P.models.join(", ")}`:`✗ Keine Verbindung: ${P.error}`,!0)}catch(P){g(u,!1),g(c,"✗ "+P.message)}}function ye(P){var J;const F=P.querySelector("code");F&&((J=navigator.clipboard)==null||J.writeText(F.textContent||""))}function ee(P){var F;(F=navigator.clipboard)==null||F.writeText(P.value)}var ce=Ec(),_e=l(ft(ce),2),N=l(s(_e),6),G=s(N),ie=l(G,2),ve=l(N,2);{var me=P=>{var F=pc();x(P,F)},Me=q(()=>T());V(ve,P=>{n(Me)&&P(me)})}var Ue=l(ve,2),E=s(Ue),Q=l(E,2);{var de=P=>{var F=hc(),J=s(F);O(()=>{Bn(F,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(J,n(c))}),x(P,F)};V(Q,P=>{n(c)&&P(de)})}var Ae=l(_e,2),Y=l(s(Ae),2);Ge(Y,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."]],Ke,(P,F)=>{var J=q(()=>Ya(F,3));let re=()=>n(J)[0],w=()=>n(J)[1],C=()=>n(J)[2];var I=gc(),te=s(I),$=s(te),H=l(te,2),ne=s(H),he=s(ne),Ne=l(ne,2),Se=s(Ne);O(()=>{m($,re()),m(he,w()),m(Se,C())}),x(P,I)});var be=l(Ae,2);{var Z=P=>{var F=bc(),J=s(F),re=l(s(J),2),w=s(re),C=l(J,4);Ge(C,21,()=>n(r),Ke,($,H)=>{const ne=q(()=>n(d).includes(n(H).name));var he=_c(),Ne=s(he);O(()=>{Bn(he,`cursor:pointer;${n(ne)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Ne,n(H).name)}),z("click",he,()=>g(d,n(ne)?n(d).filter(Se=>Se!==n(H).name):[...n(d),n(H).name],!0)),z("keydown",he,Se=>Se.key==="Enter"&&g(d,n(ne)?n(d).filter(je=>je!==n(H).name):[...n(d),n(H).name],!0)),x($,he)});var I=l(C,2);{var te=$=>{var H=mc(),ne=s(H);z("click",ne,he=>{he.preventDefault(),g(d,[],!0)}),x($,H)};V(I,$=>{n(d).length&&$(te)})}O(()=>m(w,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),x(P,F)};V(be,P=>{n(r).length&&P(Z)})}var ze=l(be,2),Ce=l(s(ze),4);Ge(Ce,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],Ke,(P,F)=>{var J=q(()=>Ya(F,3));let re=()=>n(J)[0],w=()=>n(J)[1],C=()=>n(J)[2];var I=yc(),te=s(I),$=s(te),H=l(te,2),ne=s(H);O(()=>{lt(I,1,`card-btn${n(o)===re()?" cb-best":""}`),m($,w()),m(ne,C())}),z("click",I,()=>g(o,re(),!0)),x(P,I)});var He=l(ze,2),Ie=l(s(He),2);{var Re=P=>{const F=q(()=>L(n(i),n(h)));var J=wc(),re=l(ft(J),4),w=s(re),C=l(w,2),I=s(C),te=s(I),$=l(re,4),H=l(s($)),ne=s(H);O(()=>{m(te,n(F)),m(ne,`bosgame / ${n(b)??""}`)}),z("click",w,he=>ye(he.currentTarget.parentElement)),x(P,J)},_t=P=>{const F=q(()=>S(n(i),n(h)));var J=xc(),re=l(ft(J),6),w=s(re),C=l(w,2),I=s(C),te=s(I),$=l(re,2),H=l(s($),3),ne=s(H);O(()=>{m(te,n(F)),m(ne,`llama-swap/${n(b)??""}`)}),z("click",w,he=>ye(he.currentTarget.parentElement)),x(P,J)},mt=P=>{var F=kc(),J=l(ft(F),4),re=s(J),w=l(re,2),C=l(J,4),I=s(C),te=l(I,2);O(()=>{ur(re,n(i)),ur(I,n(b))}),z("click",w,$=>ee($.currentTarget.previousElementSibling)),z("click",te,$=>ee($.currentTarget.previousElementSibling)),x(P,F)},Kt=P=>{var F=Mc(),J=l(ft(F),4),re=s(J),w=l(re,2),C=l(J,4),I=s(C),te=l(I,2);O(()=>ur(re,n(i))),z("click",w,$=>ee($.currentTarget.previousElementSibling)),z("click",te,$=>ee($.currentTarget.previousElementSibling)),x(P,F)};V(Ie,P=>{n(o)==="zed"?P(Re):n(o)==="opencode"?P(_t,1):n(o)==="cline"?P(mt,2):n(o)==="openwebui"&&P(Kt,3)})}var St=l(He,2);{var Et=P=>{const F=q(()=>`curl ${n(i)}/chat/completions \\ +}`}async function R(){g(c,"Teste…");try{const D=await ge("/api/integration/test");g(u,D.ok,!0),g(c,D.ok?`✓ Verbunden — ${D.models.length} Modell(e): ${D.models.join(", ")}`:`✗ Keine Verbindung: ${D.error}`,!0)}catch(D){g(u,!1),g(c,"✗ "+D.message)}}function Se(D){var Z;const U=D.querySelector("code");U&&((Z=navigator.clipboard)==null||Z.writeText(U.textContent||""))}function re(D){var U;(U=navigator.clipboard)==null||U.writeText(D.value)}var ve=zc(),be=s(_t(ve),2),F=s(l(be),6),H=l(F),ue=s(H,2),fe=s(F,2);{var Ee=D=>{var U=yc();b(D,U)},ze=I(()=>E());G(fe,D=>{n(ze)&&D(Ee)})}var nt=s(fe,2),T=l(nt),J=s(T,2);{var oe=D=>{var U=wc(),Z=l(U);O(()=>{hn(U,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(Z,n(c))}),b(D,U)};G(J,D=>{n(c)&&D(oe)})}var Pe=s(be,2),Q=s(l(Pe),2);Ze(Q,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."]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=xc(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V),we=l(ae),Xe=s(ae,2),Ae=l(Xe);O(()=>{m($,le()),m(we,x()),m(Ae,z())}),b(D,K)});var ye=s(Pe,2);{var ne=D=>{var U=Sc(),Z=l(U),le=s(l(Z),2),x=l(le),z=s(Z,4);Ze(z,21,()=>n(r),Ye,($,V)=>{const ae=I(()=>n(d).includes(n(V).name));var we=kc(),Xe=l(we);O(()=>{hn(we,`cursor:pointer;${n(ae)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Xe,n(V).name)}),P("click",we,()=>g(d,n(ae)?n(d).filter(Ae=>Ae!==n(V).name):[...n(d),n(V).name],!0)),P("keydown",we,Ae=>Ae.key==="Enter"&&g(d,n(ae)?n(d).filter(at=>at!==n(V).name):[...n(d),n(V).name],!0)),b($,we)});var K=s(z,2);{var ie=$=>{var V=Mc(),ae=l(V);P("click",ae,we=>{we.preventDefault(),g(d,[],!0)}),b($,V)};G(K,$=>{n(d).length&&$(ie)})}O(()=>m(x,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),b(D,U)};G(ye,D=>{n(r).length&&D(ne)})}var Ke=s(ye,2),Ie=s(l(Ke),4);Ze(Ie,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=Ec(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V);O(()=>{vt(K,1,`card-btn${n(o)===le()?" cb-best":""}`),m($,x()),m(ae,z())}),P("click",K,()=>g(o,le(),!0)),b(D,K)});var He=s(Ke,2),Ve=s(l(He),2);{var We=D=>{const U=I(()=>L(n(i),n(p)));var Z=Tc(),le=s(_t(Z),4),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,4),V=s(l($)),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`bosgame / ${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Tt=D=>{const U=I(()=>M(n(i),n(p)));var Z=$c(),le=s(_t(Z),6),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,2),V=s(l($),3),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`llama-swap/${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Pt=D=>{var U=Ac(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>{mr(le,n(i)),mr(K,n(w))}),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)},Ot=D=>{var U=Cc(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>mr(le,n(i))),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)};G(Ve,D=>{n(o)==="zed"?D(We):n(o)==="opencode"?D(Tt,1):n(o)==="cline"?D(Pt,2):n(o)==="openwebui"&&D(Ot,3)})}var Rt=s(He,2);{var qt=D=>{const U=I(()=>`curl ${n(i)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ "model": "${n(A)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var J=Sc(),re=s(J),w=l(s(re),2),C=s(w);Ye(C,()=>ea("check"));var I=l(C),te=l(re,4),$=s(te),H=l($,2),ne=s(H),he=s(ne);O(()=>{m(I,` „${n(A)??""}" bereit`),m(he,n(F))}),z("click",$,Ne=>ye(Ne.currentTarget.parentElement)),x(P,J)};V(St,P=>{n(A)&&P(Et)})}O(()=>ur(G,n(i))),z("click",ie,P=>{const F=P.currentTarget.previousElementSibling;ee(F)}),z("click",E,B),x(e,ce),Zn()}_a(["click","keydown"]);var $c=M('
'),Ac=M('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),Cc=M('
Lade News… (erstes Laden kann kurz dauern)
'),Lc=M('
'),zc=M('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Pc=M('für dich'),Dc=M('
'),Oc=M('
'),Rc=M('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Bc(e,t){Yn(t,!0);let a=R(Bt([])),r=R(Bt([])),i=R(!0),o=R("");const d=N=>N==="perfect"?"ok":N==="marginal"?"warn":"bad";function c(N){const G=Math.max(0,Date.now()/1e3-N);return G<60?G+"s":G<3600?Math.floor(G/60)+"m":G<86400?Math.floor(G/3600)+"h":Math.floor(G/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await fe("/api/news")).items||[],!0)}catch(N){g(o,N.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function f(){try{g(r,(await fe("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function _(N,G){var ie;G.disabled=!0,G.textContent="Starte…";try{await fe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:N.repo,role:N.role,params_b:N.params_b,quant:N.quant,hf_token:Qa()})}),(ie=document.querySelector(".nav-item[data-view='activity']"))==null||ie.dispatchEvent(new MouseEvent("click"))}catch(ve){G.disabled=!1,G.textContent="Installieren",alert("Fehler: "+ve.message)}}function T(){u(),f()}or(()=>{u(),f()});var h=Rc(),b=ft(h),A=l(s(b),2),L=l(b,2);{var S=N=>{var G=Ac(),ie=s(G),ve=l(s(ie),2),me=s(ve),Me=l(ie,4);Ge(Me,21,()=>n(r),Ke,(Ue,E)=>{var Q=$c(),de=s(Q),Ae=s(de),Y=s(Ae),be=s(Y),Z=l(Y,2),ze=s(Z),Ce=l(Ae,2),He=s(Ce),Ie=l(de,2);O(Re=>{m(be,n(E).name),lt(Z,1,`fit-badge ${Re??""}`),m(ze,n(E).fit.text),m(He,`Ersetzt dein „${n(E).old??""}". ${n(E).why??""}`)},[()=>d(n(E).fit.level)]),z("click",Ie,Re=>_(n(E),Re.currentTarget)),x(Ue,Q)}),O(()=>m(me,n(r).length)),x(N,G)};V(L,N=>{n(r).length&&N(S)})}var B=l(L,2);{var ye=N=>{var G=Cc();x(N,G)},ee=N=>{var G=Lc(),ie=s(G);O(()=>m(ie,n(o))),x(N,G)},ce=N=>{var G=zc();x(N,G)},_e=N=>{var G=Oc();Ge(G,21,()=>n(a),Ke,(ie,ve,me)=>{var Me=Dc();lt(Me,1,`news-card${me===0?" featured":""}`);var Ue=s(Me),E=s(Ue),Q=s(E),de=l(E,2);{var Ae=Ce=>{var He=Pc();x(Ce,He)};V(de,Ce=>{n(ve).relevant&&Ce(Ae)})}var Y=l(de,2),be=s(Y),Z=l(Ue,2),ze=s(Z);O(Ce=>{zr(Me,"href",n(ve).link),m(Q,n(ve).source),m(be,Ce),m(ze,n(ve).title)},[()=>n(ve).ts?c(n(ve).ts):""]),x(ie,Me)}),x(N,G)};V(B,N=>{n(i)?N(ye):n(o)?N(ee,1):n(a).length?N(_e,-1):N(ce,2)})}z("click",A,T),x(e,h),Zn()}_a(["click"]);const qc=[["Dein erster Workflow — in 3 Schritten",` +}'`);var Z=Lc(),le=l(Z),x=s(l(le),2),z=l(x);qe(z,()=>tn("check"));var K=s(z),ie=s(le,4),$=l(ie),V=s($,2),ae=l(V),we=l(ae);O(()=>{m(K,` „${n(A)??""}" bereit`),m(we,n(U))}),P("click",$,Xe=>Se(Xe.currentTarget.parentElement)),b(D,Z)};G(Rt,D=>{n(A)&&D(qt)})}O(()=>mr(H,n(i))),P("click",ue,D=>{const U=D.currentTarget.previousElementSibling;re(U)}),P("click",T,R),b(e,ve),ia()}ka(["click","keydown"]);var Dc=k('
'),Oc=k('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),Rc=k('
Lade News… (erstes Laden kann kurz dauern)
'),qc=k('
'),Bc=k('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Ic=k('für dich'),Nc=k('
'),Fc=k('
'),Kc=k('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function Gc(e,t){ra(t,!0);let a=B(Dt([])),r=B(Dt([])),i=B(!0),o=B("");const d=F=>F==="perfect"?"ok":F==="marginal"?"warn":"bad";function c(F){const H=Math.max(0,Date.now()/1e3-F);return H<60?H+"s":H<3600?Math.floor(H/60)+"m":H<86400?Math.floor(H/3600)+"h":Math.floor(H/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await ge("/api/news")).items||[],!0)}catch(F){g(o,F.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function v(){try{g(r,(await ge("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(F,H){var ue;H.disabled=!0,H.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:F.repo,role:F.role,params_b:F.params_b,quant:F.quant,hf_token:rr()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(fe){H.disabled=!1,H.textContent="Installieren",alert("Fehler: "+fe.message)}}function E(){u(),v()}hr(()=>{u(),v()});var p=Kc(),w=_t(p),A=s(l(w),2),L=s(w,2);{var M=F=>{var H=Oc(),ue=l(H),fe=s(l(ue),2),Ee=l(fe),ze=s(ue,4);Ze(ze,21,()=>n(r),Ye,(nt,T)=>{var J=Dc(),oe=l(J),Pe=l(oe),Q=l(Pe),ye=l(Q),ne=s(Q,2),Ke=l(ne),Ie=s(Pe,2),He=l(Ie),Ve=s(oe,2);O(We=>{m(ye,n(T).name),vt(ne,1,`fit-badge ${We??""}`),m(Ke,n(T).fit.text),m(He,`Ersetzt dein „${n(T).old??""}". ${n(T).why??""}`)},[()=>d(n(T).fit.level)]),P("click",Ve,We=>h(n(T),We.currentTarget)),b(nt,J)}),O(()=>m(Ee,n(r).length)),b(F,H)};G(L,F=>{n(r).length&&F(M)})}var R=s(L,2);{var Se=F=>{var H=Rc();b(F,H)},re=F=>{var H=qc(),ue=l(H);O(()=>m(ue,n(o))),b(F,H)},ve=F=>{var H=Bc();b(F,H)},be=F=>{var H=Fc();Ze(H,21,()=>n(a),Ye,(ue,fe,Ee)=>{var ze=Nc();vt(ze,1,`news-card${Ee===0?" featured":""}`);var nt=l(ze),T=l(nt),J=l(T),oe=s(T,2);{var Pe=Ie=>{var He=Ic();b(Ie,He)};G(oe,Ie=>{n(fe).relevant&&Ie(Pe)})}var Q=s(oe,2),ye=l(Q),ne=s(nt,2),Ke=l(ne);O(Ie=>{Ir(ze,"href",n(fe).link),m(J,n(fe).source),m(ye,Ie),m(Ke,n(fe).title)},[()=>n(fe).ts?c(n(fe).ts):""]),b(ue,ze)}),b(F,H)};G(R,F=>{n(i)?F(Se):n(o)?F(re,1):n(a).length?F(be,-1):F(ve,2)})}P("click",A,E),b(e,p),ia()}ka(["click"]);const Uc=[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → wähle deinen Anwendungsfall (z.B. „Coden") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität.
  2. @@ -109,4 +111,4 @@ ${re}
  3. OpenWebUI: Klassische Chat-Oberfläche für Fragen/Texte.
  4. Tipp: starkes Modell (coder) für schwere Aufgaben, schnelles - (scout) für einfache — du wählst es einfach im Tool aus.

    `]],Ic=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie 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 beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var Nc=M('
    '),Fc=M('

    '),Kc=M('

    Guide für Einsteiger

    Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.

    Tutorials & Workflows

    Konzepte kurz erklärt

    ',1);function Gc(e){var t=Kc(),a=l(ft(t),4);Ge(a,21,()=>qc,Ke,(i,o,d)=>{var c=q(()=>Ya(n(o),2));let u=()=>n(c)[0],f=()=>n(c)[1];var _=Nc();_.open=d===0;var T=s(_),h=s(T),b=l(T,2);Ye(b,f,!0),O(()=>m(h,u())),x(i,_)});var r=l(a,4);Ge(r,21,()=>Ic,Ke,(i,o)=>{var d=q(()=>Ya(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var f=Fc(),_=s(f),T=s(_),h=l(_,2),b=s(h);O(()=>{m(T,c()),m(b,u())}),x(i,f)}),x(e,t)}let Vi={};function Uc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Wi(e){const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),ji("Backend nicht erreichbar – läuft uvicorn?",!1);else{const i=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+i);const o=(e.models||[]).find(c=>c.state==="running");r&&(r.innerHTML=o?`Geladen: ${o.name}`:"Kein Modell im VRAM"),e.swap_ok?jc():ji(`LLM-Engine nicht erreichbar unter ${i} – läuft der llama-swap Dienst?`,!0);const d={};for(const c of e.models||[])d[c.name]=c.state;for(const[c,u]of Object.entries(d)){const f=Vi[c];if(f&&f!==u&&(u==="running"||u==="loading")){Uc();break}}Vi=d}Hc(e),dr.set(e)}function Hc(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Vc(e){ra.set(e||[])}function Wc(e){xi.set(e)}function ji(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function jc(){const e=document.getElementById("alert");e&&(e.style.display="none")}const Jc=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function Hr(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>Jc(a),i}async function js(){try{const e=await fe("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(Hr(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(Hr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Hr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Dr(){try{Wi(await fe("/api/status"))}catch{Wi(null)}}async function Js(){try{Vc(await fe("/api/jobs"))}catch{}}function Qs(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{Wc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(Qs,3e3)},t.onerror=()=>t.close()}var es;((es=document.getElementById("logo"))==null?void 0:es.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Pr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Pr[e.dataset.ic||""]||""});const Qc=[["overview",td],["models",gd],["activity",Td],["server",Bd],["cookbook",fc],["connect",Tc],["news",Bc],["guides",Gc]];for(const[e,t]of Qc){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Vr=document.getElementById("token");Vr&&(Vr.value=Ws(),Vr.addEventListener("change",e=>{Bo(e.target.value),Dr()}));const Wr=document.getElementById("hf-token");Wr&&(Wr.value=Qa(),Wr.addEventListener("change",e=>Io(e.target.value)));const Ji=document.getElementById("nav-settings"),jr=document.getElementById("settings-modal"),Qi=document.getElementById("sm-close");Ji&&jr&&Qi&&(Ji.addEventListener("click",()=>jr.style.display="flex"),Qi.addEventListener("click",()=>jr.style.display="none"));function Yc(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Dr);Dr();Js();Qs();setInterval(Yc,1e3);setInterval(Dr,3e3);setInterval(Js,1500);js();setInterval(js,6e4); + (scout) für einfache — du wählst es einfach im Tool aus.

    `]],Hc=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie 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 beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var Vc=k('
    '),Wc=k('

    '),jc=k('

    Guide für Einsteiger

    Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.

    Tutorials & Workflows

    Konzepte kurz erklärt

    ',1);function Jc(e){var t=jc(),a=s(_t(t),4);Ze(a,21,()=>Uc,Ye,(i,o,d)=>{var c=I(()=>ir(n(o),2));let u=()=>n(c)[0],v=()=>n(c)[1];var h=Vc();h.open=d===0;var E=l(h),p=l(E),w=s(E,2);qe(w,v,!0),O(()=>m(p,u())),b(i,h)});var r=s(a,4);Ze(r,21,()=>Hc,Ye,(i,o)=>{var d=I(()=>ir(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=Wc(),h=l(v),E=l(h),p=s(h,2),w=l(p);O(()=>{m(E,c()),m(w,u())}),b(i,v)}),b(e,t)}let Qi={};function Qc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Yi(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),Zi("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",h=c.state==="loading"||c.state==="starting"?' lädt…':"";r.innerHTML=`${c.name}${v}${h}`}else r.innerHTML='Kein Modell im VRAM';e.swap_ok?eu():Zi(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,h]of Object.entries(u)){const E=Qi[v];if(E&&E!==h&&(h==="running"||h==="loading")){Qc();break}}Qi=u}Yc(e),gr.set(e)}function Yc(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Zc(e){ca.set(e||[])}function Xc(e){$i.set(e)}function Zi(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function eu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const tu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function Yr(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>tu(a),i}async function Zs(){try{const e=await ge("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(Yr(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(Yr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Yr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Fr(){try{Yi(await ge("/api/status"))}catch{Yi(null)}}async function Xs(){try{Zc(await ge("/api/jobs"))}catch{}}function el(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{Xc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(el,3e3)},t.onerror=()=>t.close()}var rs;((rs=document.getElementById("logo"))==null?void 0:rs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Nr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Nr[e.dataset.ic||""]||""});const nu=[["overview",id],["models",yd],["activity",Ld],["server",Fd],["cookbook",bc],["connect",Pc],["news",Gc],["guides",Jc]];for(const[e,t]of nu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Zr=document.getElementById("token");Zr&&(Zr.value=Ys(),Zr.addEventListener("change",e=>{qo(e.target.value),Fr()}));const Xr=document.getElementById("hf-token");Xr&&(Xr.value=rr(),Xr.addEventListener("change",e=>Io(e.target.value)));const Xi=document.getElementById("nav-settings"),ei=document.getElementById("settings-modal"),es=document.getElementById("sm-close");Xi&&ei&&es&&(Xi.addEventListener("click",()=>ei.style.display="flex"),es.addEventListener("click",()=>ei.style.display="none"));function au(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Fr);Fr();Xs();el();setInterval(au,1e3);setInterval(Fr,3e3);setInterval(Xs,1500);Zs();setInterval(Zs,6e4);