From d4aa7eb8cfec7c6c2d1d442ddfea4b44319c4224 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Wed, 24 Jun 2026 17:06:51 +0200 Subject: [PATCH] =?UTF-8?q?feat(v9):=20Phase=208=20=E2=80=94=20Cockpit=20z?= =?UTF-8?q?eigt=20Lernen=20&=20Aktivit=C3=A4t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - hermes_control.py: learned_profile() liest USER.md (Curator-Nutzerprofil, § -getrennt) + MEMORY.md; insights() zieht Sessions/Tokens/Tool-Calls + Top-Tools aus `hermes insights` (Regex, best effort). - routers/hermes.py: GET /api/hermes/{learned,insights}. - HermesPanel-Cockpit: Kachel "Aktivität" (Kennzahlen + Top-Tool-Balken) und "Was Hermes über dich gelernt hat" (USER.md-Fakten) — beantwortet sichtbar, dass der Agent automatisch mitlernt. Co-Authored-By: Claude Opus 4.8 --- frontend/src/panels/HermesPanel.svelte | 56 +++++++++++++++++- hermes_control.py | 55 ++++++++++++++++++ routers/hermes.py | 14 +++++ static/dist/main.js | 78 +++++++++++++------------- 4 files changed, 163 insertions(+), 40 deletions(-) diff --git a/frontend/src/panels/HermesPanel.svelte b/frontend/src/panels/HermesPanel.svelte index 3a8f42e..a41982d 100644 --- a/frontend/src/panels/HermesPanel.svelte +++ b/frontend/src/panels/HermesPanel.svelte @@ -10,6 +10,8 @@ let agent = $state(null) let cronJobs = $state([]) let skills = $state([]) + let learned = $state(null) + let insights = $state(null) let pubkey = $state('') // ---- Status laden ---- @@ -29,14 +31,18 @@ async function loadCockpit() { cockpitLoading = true try { - const [a, c, s] = await Promise.all([ + const [a, c, s, l, i] = await Promise.all([ api('/api/hermes/agent'), api('/api/hermes/cron'), api('/api/hermes/skills'), + api('/api/hermes/learned'), + api('/api/hermes/insights'), ]) agent = a cronJobs = c.jobs || [] skills = s.skills || [] + learned = l + insights = i } catch { agent = null } cockpitLoading = false } @@ -118,6 +124,54 @@ + + {#if insights && (insights.sessions || insights.total_tokens)} +
+
Aktivität (letzte 30 Tage)
+
+ {#if insights.sessions}{insights.sessions} Sessions{/if} + {#if insights.messages}{insights.messages} Nachrichten{/if} + {#if insights.tool_calls}{insights.tool_calls} Tool-Calls{/if} + {#if insights.total_tokens}{insights.total_tokens} Tokens{/if} + {#if insights.active_time}{insights.active_time} aktiv{/if} +
+ {#if insights.top_tools?.length} +
Meistgenutzte Tools
+
+ {#each insights.top_tools.slice(0, 6) as t} +
+ {t.name} + + + + {t.calls}× · {t.pct}% +
+ {/each} +
+ {/if} +
+ {/if} + + + {#if learned?.user_facts?.length || learned?.memory} +
+
Was Hermes über dich gelernt hat + (automatisches Profil)
+ {#if learned.user_facts?.length} +
    + {#each learned.user_facts as f} +
  • {f}
  • + {/each} +
+ {/if} + {#if learned.memory} +
+ {learned.memory} +
+ {/if} +
+ {/if} +
diff --git a/hermes_control.py b/hermes_control.py index 3d23c6f..0917ed6 100644 --- a/hermes_control.py +++ b/hermes_control.py @@ -149,3 +149,58 @@ def skills() -> list[dict]: return rows return _cached("skills", _load) # type: ignore[return-value] + + +def learned_profile() -> dict: + """Was Hermes ueber den Nutzer gelernt hat (Phase 8). + + `~/.hermes/memories/USER.md` ist das vom Curator destillierte Nutzerprofil + (Eintraege mit `§` getrennt), `MEMORY.md` allgemeine gelernte Fakten. Direkter + Beleg, dass der Agent automatisch mitlernt. + """ + def _read(name: str) -> str: + try: + return (HERMES_HOME / "memories" / name).read_text(errors="replace").strip() + except Exception: + return "" + + def _load() -> dict: + user_raw = _read("USER.md") + facts = [s.strip() for s in user_raw.split("§") if s.strip()] + return {"user_facts": facts, "memory": _read("MEMORY.md")} + + return _cached("learned", _load) # type: ignore[return-value] + + +def insights() -> dict: + """Aktivitaets-Kennzahlen via `hermes insights` (Phase 8). + + Die CLI rendert ein Box-Art-Layout (kein --json) -> Headline-Zahlen + Top-Tools + per Regex herausziehen (best effort; faellt leer aus, wenn sich das Format aendert). + """ + def _num(pat: str, text: str): + m = re.search(pat, text) + return m.group(1).strip() if m else None + + def _load() -> dict: + txt = _run_cli(["insights", "--days", "30"]) + out: dict = { + "sessions": _num(r"Sessions:\s+([\d,]+)", txt), + "messages": _num(r"Messages:\s+([\d,]+)", txt), + "tool_calls": _num(r"Tool calls:\s+([\d,]+)", txt), + "total_tokens": _num(r"Total tokens:\s+([\d,]+)", txt), + "active_time": _num(r"Active time:\s+(~?[\dhm ]+?)\s{2,}", txt), + "top_tools": [], + } + # "Top Tools"-Sektion: Zeilen % + sec = txt.split("Top Tools", 1) + if len(sec) == 2: + for ln in sec[1].splitlines(): + m = re.match(r"\s*(\S.*?)\s+(\d+)\s+([\d.]+)%\s*$", ln) + if m: + out["top_tools"].append( + {"name": m.group(1), "calls": int(m.group(2)), "pct": float(m.group(3))} + ) + return out + + return _cached("insights", _load) # type: ignore[return-value] diff --git a/routers/hermes.py b/routers/hermes.py index 99001dd..3d5d6c6 100644 --- a/routers/hermes.py +++ b/routers/hermes.py @@ -210,6 +210,20 @@ def hermes_skills(): return {"skills": skills()} +@router.get("/hermes/learned", dependencies=[Depends(auth)]) +def hermes_learned(): + """Phase 8 — was Hermes ueber den Nutzer gelernt hat (USER.md/MEMORY.md).""" + from hermes_control import learned_profile + return learned_profile() + + +@router.get("/hermes/insights", dependencies=[Depends(auth)]) +def hermes_insights(): + """Phase 8 — Aktivitaets-Kennzahlen (Sessions/Tokens/Top-Tools).""" + from hermes_control import insights + return insights() + + @router.get("/hermes/pubkey", dependencies=[Depends(auth)]) def hermes_pubkey(): """Gibt den SSH-Public-Key des Hermes Agent zurueck (fuer Windows authorized_keys).""" diff --git a/static/dist/main.js b/static/dist/main.js index e3685ab..b63f3d9 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,75 +1,75 @@ -var ll=Object.defineProperty;var Dr=e=>{throw TypeError(e)};var ol=(e,n,a)=>n in e?ll(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a;var vn=(e,n,a)=>ol(e,typeof n!="symbol"?n+"":n,a),Ui=(e,n,a)=>n.has(e)||Dr("Cannot "+a);var g=(e,n,a)=>(Ui(e,n,"read from private field"),a?a.call(e):n.get(e)),Be=(e,n,a)=>n.has(e)?Dr("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(e):n.set(e,a),$e=(e,n,a,s)=>(Ui(e,n,"write to private field"),s?s.call(e,a):n.set(e,a),a),lt=(e,n,a)=>(Ui(e,n,"access private method"),a);var yr=Array.isArray,dl=Array.prototype.indexOf,zi=Array.prototype.includes,Fi=Array.from,cl=Object.defineProperty,ai=Object.getOwnPropertyDescriptor,vl=Object.getOwnPropertyDescriptors,ul=Object.prototype,pl=Array.prototype,vs=Object.getPrototypeOf,Ir=Object.isExtensible;const fl=()=>{};function hl(e){for(var n=0;n{e=s,n=l});return{promise:a,resolve:e,reject:n}}function Hn(e,n){if(Array.isArray(e))return e;if(n===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const s of e)if(a.push(s),a.length===n)break;return a}const tn=2,Ka=4,Ki=8,ps=1<<24,An=16,Tn=32,la=64,sr=128,kn=512,Jt=1024,Xt=2048,Kn=4096,an=8192,xn=16384,Ua=32768,lr=1<<25,Na=65536,Pi=1<<17,gl=1<<18,Ha=1<<19,ml=1<<20,Bn=1<<25,wa=65536,$i=1<<21,Pa=1<<22,sa=1<<23,$a=Symbol("$state"),bl=Symbol(""),Si=Symbol("attributes"),or=Symbol("class"),dr=Symbol("style"),Ya=Symbol("text"),Mi=Symbol("form reset"),Ni=new class extends Error{constructor(){super(...arguments);vn(this,"name","StaleReactionError");vn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ls;const _l=!!((ls=globalThis.document)!=null&&ls.contentType)&&globalThis.document.contentType.includes("xml");function fs(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function yl(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function kl(e,n,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function xl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function wl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Sl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Ml(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function El(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Al(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Cl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Tl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const zl=1,Pl=2,hs=4,$l=8,Dl=16,Il=1,Ll=2,Ht=Symbol("uninitialized"),gs="http://www.w3.org/1999/xhtml",Ol="http://www.w3.org/2000/svg",Bl="http://www.w3.org/1998/Math/MathML";function Rl(){console.warn("https://svelte.dev/e/derived_inert")}function Fl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Kl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function ms(e){return e===this.v}function Nl(e,n){return e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function"}function bs(e){return!Nl(e,this.v)}let en=null;function qa(e){en=e}function zn(e,n=!1,a){en={p:en,i:!1,c:null,e:null,s:e,x:null,r:We,l:null}}function Pn(e){var n=en,a=n.e;if(a!==null){n.e=null;for(var s of a)Ks(s)}return n.i=!0,en=n.p,{}}function _s(){return!0}let ca=[];function ys(){var e=ca;ca=[],hl(e)}function _a(e){if(ca.length===0&&!ri){var n=ca;queueMicrotask(()=>{n===ca&&ys()})}ca.push(e)}function ql(){for(;ca.length>0;)ys()}function ks(e){var n=We;if(n===null)return Ve.f|=sa,e;if((n.f&Ua)===0&&(n.f&Ka)===0)throw e;ia(e,n)}function ia(e,n){if(!(n!==null&&(n.f&xn)!==0)){for(;n!==null;){if((n.f&sr)!==0){if((n.f&Ua)===0)throw e;try{n.b.error(e);return}catch(a){e=a}}n=n.parent}throw e}}const Gl=-7169;function Gt(e,n){e.f=e.f&Gl|n}function kr(e){(e.f&kn)!==0||e.deps===null?Gt(e,Jt):Gt(e,Kn)}function xs(e){if(e!==null)for(const n of e)(n.f&tn)===0||(n.f&wa)===0||(n.f^=wa,xs(n.deps))}function ws(e,n,a){(e.f&Xt)!==0?n.add(e):(e.f&Kn)!==0&&a.add(e),xs(e.deps),Gt(e,Jt)}function Vl(e){let n=0,a=Ma(0),s;return()=>{Cr()&&(t(a),qi(()=>(n===0&&(s=Ja(()=>e(()=>si(a)))),n+=1,()=>{_a(()=>{n-=1,n===0&&(s==null||s(),s=void 0,si(a))})})))}}var Wl=Na|Ha;function jl(e,n,a,s){new Ul(e,n,a,s)}var gn,_r,mn,fa,sn,bn,nn,pn,Vn,ha,na,Da,ui,pi,Wn,Oi,Bt,Hl,Jl,Ql,cr,Ei,Ai,vr,ur;class Ul{constructor(n,a,s,l){Be(this,Bt);vn(this,"parent");vn(this,"is_pending",!1);vn(this,"transform_error");Be(this,gn);Be(this,_r,null);Be(this,mn);Be(this,fa);Be(this,sn);Be(this,bn,null);Be(this,nn,null);Be(this,pn,null);Be(this,Vn,null);Be(this,ha,0);Be(this,na,0);Be(this,Da,!1);Be(this,ui,new Set);Be(this,pi,new Set);Be(this,Wn,null);Be(this,Oi,Vl(()=>($e(this,Wn,Ma(g(this,ha))),()=>{$e(this,Wn,null)})));var o;$e(this,gn,n),$e(this,mn,a),$e(this,fa,d=>{var c=We;c.b=this,c.f|=sr,s(d)}),this.parent=We.b,this.transform_error=l??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),$e(this,sn,Tr(()=>{lt(this,Bt,cr).call(this)},Wl))}defer_effect(n){ws(n,g(this,ui),g(this,pi))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!g(this,mn).pending}update_pending_count(n,a){lt(this,Bt,vr).call(this,n,a),$e(this,ha,g(this,ha)+n),!(!g(this,Wn)||g(this,Da))&&($e(this,Da,!0),_a(()=>{$e(this,Da,!1),g(this,Wn)&&Ga(g(this,Wn),g(this,ha))}))}get_effect_pending(){return g(this,Oi).call(this),t(g(this,Wn))}error(n){if(!g(this,mn).onerror&&!g(this,mn).failed)throw n;he!=null&&he.is_fork?(g(this,bn)&&he.skip_effect(g(this,bn)),g(this,nn)&&he.skip_effect(g(this,nn)),g(this,pn)&&he.skip_effect(g(this,pn)),he.oncommit(()=>{lt(this,Bt,ur).call(this,n)})):lt(this,Bt,ur).call(this,n)}}gn=new WeakMap,_r=new WeakMap,mn=new WeakMap,fa=new WeakMap,sn=new WeakMap,bn=new WeakMap,nn=new WeakMap,pn=new WeakMap,Vn=new WeakMap,ha=new WeakMap,na=new WeakMap,Da=new WeakMap,ui=new WeakMap,pi=new WeakMap,Wn=new WeakMap,Oi=new WeakMap,Bt=new WeakSet,Hl=function(){try{$e(this,bn,_n(()=>g(this,fa).call(this,g(this,gn))))}catch(n){this.error(n)}},Jl=function(n){const a=g(this,mn).failed;a&&$e(this,pn,_n(()=>{a(g(this,gn),()=>n,()=>()=>{})}))},Ql=function(){const n=g(this,mn).pending;n&&(this.is_pending=!0,$e(this,nn,_n(()=>n(g(this,gn)))),_a(()=>{var a=$e(this,Vn,document.createDocumentFragment()),s=Qn();a.append(s),$e(this,bn,lt(this,Bt,Ai).call(this,()=>_n(()=>g(this,fa).call(this,s)))),g(this,na)===0&&(g(this,gn).before(a),$e(this,Vn,null),ka(g(this,nn),()=>{$e(this,nn,null)}),lt(this,Bt,Ei).call(this,he))}))},cr=function(){try{if(this.is_pending=this.has_pending_snippet(),$e(this,na,0),$e(this,ha,0),$e(this,bn,_n(()=>{g(this,fa).call(this,g(this,gn))})),g(this,na)>0){var n=$e(this,Vn,document.createDocumentFragment());Pr(g(this,bn),n);const a=g(this,mn).pending;$e(this,nn,_n(()=>a(g(this,gn))))}else lt(this,Bt,Ei).call(this,he)}catch(a){this.error(a)}},Ei=function(n){this.is_pending=!1,n.transfer_effects(g(this,ui),g(this,pi))},Ai=function(n){var a=We,s=Ve,l=en;Nn(g(this,sn)),wn(g(this,sn)),qa(g(this,sn).ctx);try{return Sa.ensure(),n()}catch(o){return ks(o),null}finally{Nn(a),wn(s),qa(l)}},vr=function(n,a){var s;if(!this.has_pending_snippet()){this.parent&<(s=this.parent,Bt,vr).call(s,n,a);return}$e(this,na,g(this,na)+n),g(this,na)===0&&(lt(this,Bt,Ei).call(this,a),g(this,nn)&&ka(g(this,nn),()=>{$e(this,nn,null)}),g(this,Vn)&&(g(this,gn).before(g(this,Vn)),$e(this,Vn,null)))},ur=function(n){g(this,bn)&&(cn(g(this,bn)),$e(this,bn,null)),g(this,nn)&&(cn(g(this,nn)),$e(this,nn,null)),g(this,pn)&&(cn(g(this,pn)),$e(this,pn,null));var a=g(this,mn).onerror;let s=g(this,mn).failed;var l=!1,o=!1;const d=()=>{if(l){Kl();return}l=!0,o&&Tl(),g(this,pn)!==null&&ka(g(this,pn),()=>{$e(this,pn,null)}),lt(this,Bt,Ai).call(this,()=>{lt(this,Bt,cr).call(this)})},c=v=>{try{o=!0,a==null||a(v,d),o=!1}catch(p){ia(p,g(this,sn)&&g(this,sn).parent)}s&&$e(this,pn,lt(this,Bt,Ai).call(this,()=>{try{return _n(()=>{var p=We;p.b=this,p.f|=sr,s(g(this,gn),()=>v,()=>d)})}catch(p){return ia(p,g(this,sn).parent),null}}))};_a(()=>{var v;try{v=this.transform_error(n)}catch(p){ia(p,g(this,sn)&&g(this,sn).parent);return}v!==null&&typeof v=="object"&&typeof v.then=="function"?v.then(c,p=>ia(p,g(this,sn)&&g(this,sn).parent)):c(v)})};function Zl(e,n,a,s){const l=xr;var o=e.filter(y=>!y.settled),d=n.map(l);if(a.length===0&&o.length===0){s(d);return}var c=We,v=Yl(),p=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(y=>y.promise)):null;function _(y){if((c.f&xn)===0){v();try{s([...d,...y])}catch($){ia($,c)}Di()}}var T=Ss();if(a.length===0){p.then(()=>_([])).finally(T);return}function b(){Promise.all(a.map(y=>Xl(y))).then(_).catch(y=>ia(y,c)).finally(T)}p?p.then(()=>{v(),b(),Di()}):b()}function Yl(){var e=We,n=Ve,a=en,s=he;return function(o=!0){Nn(e),wn(n),qa(a),o&&(e.f&xn)===0&&(s==null||s.activate(),s==null||s.apply())}}function Di(e=!0){Nn(null),wn(null),qa(null),e&&(he==null||he.deactivate())}function Ss(){var e=We,n=e.b,a=he,s=!!(n!=null&&n.is_rendered());return n==null||n.update_pending_count(1,a),a.increment(s,e),()=>{n==null||n.update_pending_count(-1,a),a.decrement(s,e)}}function xr(e){var n=tn|Xt;return We!==null&&(We.f|=Ha),{ctx:en,deps:null,effects:null,equals:ms,f:n,fn:e,reactions:null,rv:0,v:Ht,wv:0,parent:We,ac:null}}const Xa=Symbol("obsolete");function Xl(e,n,a){let s=We;s===null&&yl();var l=void 0,o=Ma(Ht),d=!Ve,c=new Set;return mo(()=>{var y,$;var v=We,p=us();l=p.promise;try{Promise.resolve(e()).then(p.resolve,I=>{I!==Ni&&p.reject(I)}).finally(Di)}catch(I){p.reject(I),Di()}var _=he;if(d){if((v.f&Ua)!==0)var T=Ss();if((y=s.b)!=null&&y.is_rendered())($=_.async_deriveds.get(v))==null||$.reject(Xa);else for(const I of c.values())I.reject(Xa);c.add(p),_.async_deriveds.set(v,p)}const b=(I,S=void 0)=>{T==null||T(),c.delete(p),S!==Xa&&(_.activate(),S?(o.f|=sa,Ga(o,S)):((o.f&sa)!==0&&(o.f^=sa),Ga(o,I)),_.deactivate())};p.promise.then(b,I=>b(null,I||"unknown"))}),Fs(()=>{for(const v of c)v.reject(Xa)}),new Promise(v=>{function p(_){function T(){_===l?v(o):p(l)}_.then(T,T)}p(l)})}function N(e){const n=xr(e);return Us(n),n}function eo(e){const n=xr(e);return n.equals=bs,n}function to(e){var n=e.effects;if(n!==null){e.effects=null;for(var a=0;athis.schedule(s)){var s=g(this,Ln).get(n);if(s){g(this,Ln).delete(n);for(var l of s.d)Gt(l,Xt),a(l);for(l of s.m)Gt(l,Kn),a(l)}g(this,Fa).add(n)}capture(n,a,s=!1){n.v!==Ht&&!this.previous.has(n)&&this.previous.set(n,n.v),(n.f&sa)===0&&(this.current.set(n,[a,s]),Yt==null||Yt.set(n,a)),this.is_fork||(n.v=a)}activate(){he=this}deactivate(){he=null,Yt=null}flush(){try{Ji=!0,he=this,lt(this,pt,ei).call(this)}finally{Lr=0,pr=null,za=null,Ci=null,Ji=!1,he=null,Yt=null,ya.clear()}}discard(){var n;for(const a of g(this,Oa))a(this);g(this,Oa).clear();for(const a of this.async_deriveds.values())a.reject(Xa);lt(this,pt,ti).call(this),(n=g(this,Ra))==null||n.resolve()}register_created_effect(n){g(this,fi).push(n)}increment(n,a){if($e(this,Ba,g(this,Ba)+1),n){let s=g(this,jn).get(a)??0;g(this,jn).set(a,s+1)}}decrement(n,a){if($e(this,Ba,g(this,Ba)-1),n){let s=g(this,jn).get(a)??0;s===1?g(this,jn).delete(a):g(this,jn).set(a,s-1)}g(this,ma)||($e(this,ma,!0),_a(()=>{$e(this,ma,!1),this.linked&&this.flush()}))}transfer_effects(n,a){for(const s of n)g(this,Un).add(s);for(const s of a)g(this,Mn).add(s);n.clear(),a.clear()}oncommit(n){g(this,La).add(n)}ondiscard(n){g(this,Oa).add(n)}settled(){return(g(this,Ra)??$e(this,Ra,us())).promise}static ensure(){if(he===null){const n=he=new Bi;!Ji&&!ri&&_a(()=>{g(n,Ia)||n.flush()})}return he}apply(){{Yt=null;return}}schedule(n){var l;if(pr=n,(l=n.b)!=null&&l.is_pending&&(n.f&(Ka|Ki|ps))!==0&&(n.f&Ua)===0){n.b.defer_effect(n);return}for(var a=n;a.parent!==null;){a=a.parent;var s=a.f;if(za!==null&&a===We&&(Ve===null||(Ve.f&tn)===0))return;if((s&(la|Tn))!==0){if((s&Jt)===0)return;a.f^=Jt}}g(this,ln).push(a)}};Ia=new WeakMap,aa=new WeakMap,ga=new WeakMap,La=new WeakMap,Oa=new WeakMap,Ba=new WeakMap,jn=new WeakMap,Ra=new WeakMap,ln=new WeakMap,fi=new WeakMap,Un=new WeakMap,Mn=new WeakMap,Ln=new WeakMap,Fa=new WeakMap,ma=new WeakMap,pt=new WeakSet,fr=function(){if(this.is_fork)return!0;for(const s of g(this,jn).keys()){for(var n=s,a=!1;n.parent!==null;){if(g(this,Ln).has(n)){a=!0;break}n=n.parent}if(!a)return!0}return!1},ei=function(){var v,p,_,T;$e(this,Ia,!0),Lr++>1e3&&(lt(this,pt,ti).call(this),so());for(const b of g(this,Un))g(this,Mn).delete(b),Gt(b,Xt),this.schedule(b);for(const b of g(this,Mn))Gt(b,Kn),this.schedule(b);const n=g(this,ln);$e(this,ln,[]),this.apply();var a=za=[],s=[],l=Ci=[];for(const b of n)try{lt(this,pt,hr).call(this,b,a,s)}catch(y){throw Ps(b),lt(this,pt,fr).call(this)||this.discard(),y}if(he=null,l.length>0){var o=Bi.ensure();for(const b of l)o.schedule(b)}if(za=null,Ci=null,lt(this,pt,fr).call(this)){lt(this,pt,Ta).call(this,s),lt(this,pt,Ta).call(this,a);for(const[b,y]of g(this,Ln))zs(b,y);l.length>0&<(v=he,pt,ei).call(v);return}const d=lt(this,pt,As).call(this);if(d){lt(this,pt,Ta).call(this,s),lt(this,pt,Ta).call(this,a),lt(p=d,pt,Cs).call(p,this);return}g(this,Un).clear(),g(this,Mn).clear();for(const b of g(this,La))b(this);g(this,La).clear(),ii=this,Or(s),Or(a),ii=null,(_=g(this,Ra))==null||_.resolve();var c=he;if(g(this,Ba)===0&&(g(this,ln).length===0||c!==null)&<(this,pt,ti).call(this),g(this,ln).length>0)if(c!==null){const b=c;g(b,ln).push(...g(this,ln).filter(y=>!g(b,ln).includes(y)))}else c=this;c!==null&<(T=c,pt,ei).call(T)},hr=function(n,a,s){n.f^=Jt;for(var l=n.first;l!==null;){var o=l.f,d=(o&(Tn|la))!==0,c=d&&(o&Jt)!==0,v=c||(o&an)!==0||g(this,Ln).has(l);if(!v&&l.fn!==null){d?l.f^=Jt:(o&Ka)!==0?a.push(l):_i(l)&&((o&An)!==0&&g(this,Mn).add(l),Va(l));var p=l.first;if(p!==null){l=p;continue}}for(;l!==null;){var _=l.next;if(_!==null){l=_;break}l=l.parent}}},As=function(){for(var n=g(this,aa);n!==null;){if(!n.is_fork){for(const[a,[,s]]of this.current)if(n.current.has(a)&&!s)return n}n=g(n,aa)}return null},Cs=function(n){var s;for(const[l,o]of n.current)!this.previous.has(l)&&n.previous.has(l)&&this.previous.set(l,n.previous.get(l)),this.current.set(l,o);for(const[l,o]of n.async_deriveds){const d=this.async_deriveds.get(l);d&&o.promise.then(d.resolve).catch(d.reject)}n.async_deriveds.clear(),this.transfer_effects(g(n,Un),g(n,Mn));const a=l=>{var o=l.reactions;if(o!==null)for(const v of o){var d=v.f;if((d&tn)!==0)a(v);else{var c=v;d&(Pa|An)&&!this.async_deriveds.has(c)&&(g(this,Mn).delete(c),Gt(c,Xt),this.schedule(c))}}};for(const l of this.current.keys())a(l);this.oncommit(()=>n.discard()),lt(s=n,pt,ti).call(s),he=this,lt(this,pt,ei).call(this)},Ta=function(n){for(var a=0;a!b.current.get(y)[1]);if(!(!g(b,Ia)||l.length===0)){var o=l.filter(y=>!this.current.has(y));if(o.length===0)n&&b.discard();else if(a.length>0){if(n)for(const y of g(this,Fa))b.unskip_effect(y,$=>{var I;($.f&(An|Pa))!==0?b.schedule($):lt(I=b,pt,Ta).call(I,[$])});b.activate();var d=new Set,c=new Map;for(var v of a)Ts(v,o,d,c);c=new Map;var p=[...b.current].filter(([y,$])=>{const I=this.current.get(y);return I?I[0]!==$[0]||I[1]!==$[1]:!0}).map(([y])=>y);if(p.length>0)for(const y of g(this,fi))(y.f&(xn|an|Pi))===0&&Sr(y,p,c)&&((y.f&(Pa|An))!==0?(Gt(y,Xt),b.schedule(y)):g(b,Un).add(y));if(g(b,ln).length>0&&!g(b,ma)){b.apply();for(var _ of g(b,ln))lt(T=b,pt,hr).call(T,_,[],[]);$e(b,ln,[])}b.deactivate()}}}},ti=function(){if(this.linked){var n=g(this,aa),a=g(this,ga);n===null?Hi=a:$e(n,ga,a),a===null?Ca=n:$e(a,aa,n),this.linked=!1}};let Sa=Bi;function ro(e){var n=ri;ri=!0;try{for(var a;;){if(ql(),he===null)return a;he.flush()}}finally{ri=n}}function so(){try{Ml()}catch(e){ia(e,pr)}}let Sn=null;function Or(e){var n=e.length;if(n!==0){for(var a=0;a0)){ya.clear();for(const l of Sn){if((l.f&(xn|an))!==0)continue;const o=[l];let d=l.parent;for(;d!==null;)Sn.has(d)&&(Sn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const v=o[c];(v.f&(xn|an))===0&&Va(v)}}Sn.clear()}}Sn=null}}function Ts(e,n,a,s){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const l of e.reactions){const o=l.f;(o&tn)!==0?Ts(l,n,a,s):(o&(Pa|An))!==0&&(o&Xt)===0&&Sr(l,n,s)&&(Gt(l,Xt),Mr(l))}}function Sr(e,n,a){const s=a.get(e);if(s!==void 0)return s;if(e.deps!==null)for(const l of e.deps){if(zi.call(n,l))return!0;if((l.f&tn)!==0&&Sr(l,n,a))return a.set(l,!0),!0}return a.set(e,!1),!1}function Mr(e){he.schedule(e)}function zs(e,n){if(!((e.f&Tn)!==0&&(e.f&Jt)!==0)){(e.f&Xt)!==0?n.d.push(e):(e.f&Kn)!==0&&n.m.push(e),Gt(e,Jt);for(var a=e.first;a!==null;)zs(a,n),a=a.next}}function Ps(e){Gt(e,Jt);for(var n=e.first;n!==null;)Ps(n),n=n.next}let Ii=new Set;const ya=new Map;let $s=!1;function Ma(e,n){var a={f:0,v:e,reactions:null,equals:ms,rv:0,wv:0};return a}function L(e,n){const a=Ma(e);return Us(a),a}function lo(e,n=!1,a=!0){const s=Ma(e);return n||(s.equals=bs),s}function u(e,n,a=!1){Ve!==null&&(!Cn||(Ve.f&Pi)!==0)&&_s()&&(Ve.f&(tn|An|Pa|Pi))!==0&&(Rn===null||!Rn.has(e))&&Cl();let s=a?Wt(n):n;return Ga(e,s,Ci)}function Ga(e,n,a=null){if(!e.equals(n)){ya.set(e,oa?n:e.v);var s=Sa.ensure();if(s.capture(e,n),(e.f&tn)!==0){const l=e;(e.f&Xt)!==0&&wr(l),Yt===null&&kr(l)}e.wv=Js(),Ds(e,Xt,a),We!==null&&(We.f&Jt)!==0&&(We.f&(Tn|la))===0&&(hn===null?_o([e]):hn.push(e)),!s.is_fork&&Ii.size>0&&!$s&&oo()}return n}function oo(){$s=!1;for(const e of Ii){(e.f&Jt)!==0&&Gt(e,Kn);let n;try{n=_i(e)}catch{n=!0}n&&Va(e)}Ii.clear()}function si(e){u(e,e.v+1)}function Ds(e,n,a){var s=e.reactions;if(s!==null)for(var l=s.length,o=0;o{if(xa===o)return c();var v=Ve,p=xa;wn(null),Nr(o);var _=c();return wn(v),Nr(p),_};return s&&a.set("length",L(e.length)),new Proxy(e,{defineProperty(c,v,p){(!("value"in p)||p.configurable===!1||p.enumerable===!1||p.writable===!1)&&El();var _=a.get(v);return _===void 0?d(()=>{var T=L(p.value);return a.set(v,T),T}):u(_,p.value,!0),!0},deleteProperty(c,v){var p=a.get(v);if(p===void 0){if(v in c){const _=d(()=>L(Ht));a.set(v,_),si(l)}}else u(p,Ht),si(l);return!0},get(c,v,p){var y;if(v===$a)return e;var _=a.get(v),T=v in c;if(_===void 0&&(!T||(y=ai(c,v))!=null&&y.writable)&&(_=d(()=>{var $=Wt(T?c[v]:Ht),I=L($);return I}),a.set(v,_)),_!==void 0){var b=t(_);return b===Ht?void 0:b}return Reflect.get(c,v,p)},getOwnPropertyDescriptor(c,v){var p=Reflect.getOwnPropertyDescriptor(c,v);if(p&&"value"in p){var _=a.get(v);_&&(p.value=t(_))}else if(p===void 0){var T=a.get(v),b=T==null?void 0:T.v;if(T!==void 0&&b!==Ht)return{enumerable:!0,configurable:!0,value:b,writable:!0}}return p},has(c,v){var b;if(v===$a)return!0;var p=a.get(v),_=p!==void 0&&p.v!==Ht||Reflect.has(c,v);if(p!==void 0||We!==null&&(!_||(b=ai(c,v))!=null&&b.writable)){p===void 0&&(p=d(()=>{var y=_?Wt(c[v]):Ht,$=L(y);return $}),a.set(v,p));var T=t(p);if(T===Ht)return!1}return _},set(c,v,p,_){var ke;var T=a.get(v),b=v in c;if(s&&v==="length")for(var y=p;yL(Ht)),a.set(y+"",$))}if(T===void 0)(!b||(ke=ai(c,v))!=null&&ke.writable)&&(T=d(()=>L(void 0)),u(T,Wt(p)),a.set(v,T));else{b=T.v!==Ht;var I=d(()=>Wt(p));u(T,I)}var S=Reflect.getOwnPropertyDescriptor(c,v);if(S!=null&&S.set&&S.set.call(_,p),!b){if(s&&typeof v=="string"){var O=a.get("length"),Te=Number(v);Number.isInteger(Te)&&Te>=O.v&&u(O,Te+1)}si(l)}return!0},ownKeys(c){t(l);var v=Reflect.ownKeys(c).filter(T=>{var b=a.get(T);return b===void 0||b.v!==Ht});for(var[p,_]of a)_.v!==Ht&&!(p in c)&&v.push(p);return v},setPrototypeOf(){Al()}})}function Br(e){try{if(e!==null&&typeof e=="object"&&$a in e)return e[$a]}catch{}return e}function co(e,n){return Object.is(Br(e),Br(n))}var Rr,Is,Ls,Os;function vo(){if(Rr===void 0){Rr=window,Is=/Firefox/.test(navigator.userAgent);var e=Element.prototype,n=Node.prototype,a=Text.prototype;Ls=ai(n,"firstChild").get,Os=ai(n,"nextSibling").get,Ir(e)&&(e[or]=void 0,e[Si]=null,e[dr]=void 0,e.__e=void 0),Ir(a)&&(a[Ya]=void 0)}}function Qn(e=""){return document.createTextNode(e)}function ra(e){return Ls.call(e)}function mi(e){return Os.call(e)}function r(e,n){return ra(e)}function at(e,n=!1){{var a=ra(e);return a instanceof Comment&&a.data===""?mi(a):a}}function i(e,n=1,a=!1){let s=e;for(;n--;)s=mi(s);return s}function uo(e){e.textContent=""}function Bs(){return!1}function Rs(e,n,a){return n==null||n===gs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(n,e,{is:a}):document.createElementNS(n,e)}let Fr=!1;function po(){Fr||(Fr=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var n;if(!e.defaultPrevented)for(const a of e.target.elements)(n=a[Mi])==null||n.call(a)})},{capture:!0}))}function Er(e){var n=Ve,a=We;wn(null),Nn(null);try{return e()}finally{wn(n),Nn(a)}}function Ar(e,n,a,s=a){e.addEventListener(n,()=>Er(a));const l=e[Mi];l?e[Mi]=()=>{l(),s(!0)}:e[Mi]=()=>s(!0),po()}function fo(e){We===null&&(Ve===null&&Sl(),wl()),oa&&xl()}function ho(e,n){var a=n.last;a===null?n.last=n.first=e:(a.next=e,e.prev=a,n.last=e)}function Zn(e,n){var a=We;a!==null&&(a.f&an)!==0&&(e|=an);var s={ctx:en,deps:null,nodes:null,f:e|Xt|kn,first:null,fn:n,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};he==null||he.register_created_effect(s);var l=s;if((e&Ka)!==0)za!==null?za.push(s):Sa.ensure().schedule(s);else if(n!==null){try{Va(s)}catch(d){throw cn(s),d}l.deps===null&&l.teardown===null&&l.nodes===null&&l.first===l.last&&(l.f&Ha)===0&&(l=l.first,(e&An)!==0&&(e&Na)!==0&&l!==null&&(l.f|=Na))}if(l!==null&&(l.parent=a,a!==null&&ho(l,a),Ve!==null&&(Ve.f&tn)!==0&&(e&la)===0)){var o=Ve;(o.effects??(o.effects=[])).push(l)}return s}function Cr(){return Ve!==null&&!Cn}function Fs(e){const n=Zn(Ki,null);return Gt(n,Jt),n.teardown=e,n}function bi(e){fo();var n=We.f,a=!Ve&&(n&Tn)!==0&&en!==null&&!en.i;if(a){var s=en;(s.e??(s.e=[])).push(e)}else return Ks(e)}function Ks(e){return Zn(Ka|ml,e)}function go(e){Sa.ensure();const n=Zn(la|Ha,e);return(a={})=>new Promise(s=>{a.outro?ka(n,()=>{cn(n),s(void 0)}):(cn(n),s(void 0))})}function Ns(e){return Zn(Ka,e)}function mo(e){return Zn(Pa|Ha,e)}function qi(e,n=0){return Zn(Ki|n,e)}function P(e,n=[],a=[],s=[]){Zl(s,n,a,l=>{Zn(Ki,()=>{e(...l.map(t))})})}function Tr(e,n=0){var a=Zn(An|n,e);return a}function _n(e){return Zn(Tn|Ha,e)}function qs(e){var n=e.teardown;if(n!==null){const a=oa,s=Ve;Kr(!0),wn(null);try{n.call(null)}finally{Kr(a),wn(s)}}}function zr(e,n=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const l=a.ac;l!==null&&Er(()=>{l.abort(Ni)});var s=a.next;(a.f&la)!==0?a.parent=null:cn(a,n),a=s}}function bo(e){for(var n=e.first;n!==null;){var a=n.next;(n.f&Tn)===0&&cn(n),n=a}}function cn(e,n=!0){var a=!1;(n||(e.f&gl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Gs(e.nodes.start,e.nodes.end),a=!0),e.f|=lr,zr(e,n&&!a),ci(e,0);var s=e.nodes&&e.nodes.t;if(s!==null)for(const o of s)o.stop();qs(e),e.f^=lr,e.f|=xn;var l=e.parent;l!==null&&l.first!==null&&Vs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Gs(e,n){for(;e!==null;){var a=e===n?null:mi(e);e.remove(),e=a}}function Vs(e){var n=e.parent,a=e.prev,s=e.next;a!==null&&(a.next=s),s!==null&&(s.prev=a),n!==null&&(n.first===e&&(n.first=s),n.last===e&&(n.last=a))}function ka(e,n,a=!0){var s=[];Ws(e,s,!0);var l=()=>{a&&cn(e),n&&n()},o=s.length;if(o>0){var d=()=>--o||l();for(var c of s)c.out(d)}else l()}function Ws(e,n,a){if((e.f&an)===0){e.f^=an;var s=e.nodes&&e.nodes.t;if(s!==null)for(const c of s)(c.is_global||a)&&n.push(c);for(var l=e.first;l!==null;){var o=l.next;if((l.f&la)===0){var d=(l.f&Na)!==0||(l.f&Tn)!==0&&(e.f&An)!==0;Ws(l,n,d?a:!1)}l=o}}}function Li(e){js(e,!0)}function js(e,n){if((e.f&an)!==0){e.f^=an,(e.f&Jt)===0&&(Gt(e,Xt),Sa.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,l=(a.f&Na)!==0||(a.f&Tn)!==0;js(a,l?n:!1),a=s}var o=e.nodes&&e.nodes.t;if(o!==null)for(const d of o)(d.is_global||n)&&d.in()}}function Pr(e,n){if(e.nodes)for(var a=e.nodes.start,s=e.nodes.end;a!==null;){var l=a===s?null:mi(a);n.append(a),a=l}}let Ti=!1,oa=!1;function Kr(e){oa=e}let Ve=null,Cn=!1;function wn(e){Ve=e}let We=null;function Nn(e){We=e}let Rn=null;function Us(e){Ve!==null&&(Rn??(Rn=new Set)).add(e)}let on=null,un=0,hn=null;function _o(e){hn=e}let Hs=1,va=0,xa=va;function Nr(e){xa=e}function Js(){return++Hs}function _i(e){var n=e.f;if((n&Xt)!==0)return!0;if(n&tn&&(e.f&=~wa),(n&Kn)!==0){for(var a=e.deps,s=a.length,l=0;le.wv)return!0}(n&kn)!==0&&Yt===null&&Gt(e,Jt)}return!1}function Qs(e,n,a=!0){var s=e.reactions;if(s!==null&&!(Rn!==null&&Rn.has(e)))for(var l=0;l{e.ac.abort(Ni)}),e.ac=null);try{e.f|=$i;var _=e.fn,T=_();e.f|=Ua;var b=e.deps,y=he==null?void 0:he.is_fork;if(on!==null){var $;if(y||ci(e,un),b!==null&&un>0)for(b.length=un+on.length,$=0;${throw O});throw b}}finally{e[ua]=n,delete e.currentTarget,wn(_),Nn(T)}}}var os;const Qi=((os=globalThis==null?void 0:globalThis.window)==null?void 0:os.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function So(e){return(Qi==null?void 0:Qi.createHTML(e))??e}function Mo(e){var n=Rs("template");return n.innerHTML=So(e.replaceAll("","")),n.content}function Wa(e,n){var a=We;a.nodes===null&&(a.nodes={start:e,end:n,a:null,t:null})}function m(e,n){var a=(n&Il)!==0,s=(n&Ll)!==0,l,o=!e.startsWith("");return()=>{l===void 0&&(l=Mo(o?e:""+e),a||(l=ra(l)));var d=s||Is?document.importNode(l,!0):l.cloneNode(!0);if(a){var c=ra(d),v=d.lastChild;Wa(c,v)}else Wa(d,d);return d}}function li(e=""){{var n=Qn(e+"");return Wa(n,n),n}}function ja(){var e=document.createDocumentFragment(),n=document.createComment(""),a=Qn();return e.append(n,a),Wa(n,a),e}function f(e,n){e!==null&&e.before(n)}function h(e,n){var a=n==null?"":typeof n=="object"?`${n}`:n;a!==(e[Ya]??(e[Ya]=e.nodeValue))&&(e[Ya]=a,e.nodeValue=`${a}`)}function Eo(e,n){return Ao(e,n)}const wi=new Map;function Ao(e,{target:n,anchor:a,props:s={},events:l,context:o,intro:d=!0,transformError:c}){vo();var v=void 0,p=go(()=>{var _=a??n.appendChild(Qn());jl(_,{pending:()=>{}},y=>{zn({});var $=en;o&&($.c=o),l&&(s.$$events=l),v=e(y,s)||{},Pn()},c);var T=new Set,b=y=>{for(var $=0;${var S;for(var y of T)for(const O of[n,document]){var $=wi.get(O),I=$.get(y);--I==0?(O.removeEventListener(y,Gr),$.delete(y),$.size===0&&wi.delete(O)):$.set(y,I)}gr.delete(b),_!==a&&((S=_.parentNode)==null||S.removeChild(_))}});return Co.set(v,p),v}let Co=new WeakMap;var En,On,fn,ba,hi,gi,Ri;class To{constructor(n,a=!0){vn(this,"anchor");Be(this,En,new Map);Be(this,On,new Map);Be(this,fn,new Map);Be(this,ba,new Set);Be(this,hi,!0);Be(this,gi,n=>{if(g(this,En).has(n)){var a=g(this,En).get(n),s=g(this,On).get(a);if(s)Li(s),g(this,ba).delete(a);else{var l=g(this,fn).get(a);l&&(Li(l.effect),g(this,On).set(a,l.effect),g(this,fn).delete(a),l.fragment.lastChild.remove(),this.anchor.before(l.fragment),s=l.effect)}for(const[o,d]of g(this,En)){if(g(this,En).delete(o),o===n)break;const c=g(this,fn).get(d);c&&(cn(c.effect),g(this,fn).delete(d))}for(const[o,d]of g(this,On)){if(o===a||g(this,ba).has(o))continue;const c=()=>{if(Array.from(g(this,En).values()).includes(o)){var p=document.createDocumentFragment();Pr(d,p),p.append(Qn()),g(this,fn).set(o,{effect:d,fragment:p})}else cn(d);g(this,ba).delete(o),g(this,On).delete(o)};g(this,hi)||!s?(g(this,ba).add(o),ka(d,c,!1)):c()}}});Be(this,Ri,n=>{g(this,En).delete(n);const a=Array.from(g(this,En).values());for(const[s,l]of g(this,fn))a.includes(s)||(cn(l.effect),g(this,fn).delete(s))});this.anchor=n,$e(this,hi,a)}ensure(n,a){var s=he,l=Bs();if(a&&!g(this,On).has(n)&&!g(this,fn).has(n))if(l){var o=document.createDocumentFragment(),d=Qn();o.append(d),g(this,fn).set(n,{effect:_n(()=>a(d)),fragment:o})}else g(this,On).set(n,_n(()=>a(this.anchor)));if(g(this,En).set(s,n),l){for(const[c,v]of g(this,On))c===n?s.unskip_effect(v):s.skip_effect(v);for(const[c,v]of g(this,fn))c===n?s.unskip_effect(v.effect):s.skip_effect(v.effect);s.oncommit(g(this,gi)),s.ondiscard(g(this,Ri))}else g(this,gi).call(this,s)}}En=new WeakMap,On=new WeakMap,fn=new WeakMap,ba=new WeakMap,hi=new WeakMap,gi=new WeakMap,Ri=new WeakMap;function K(e,n,a=!1){var s=new To(e),l=a?Na:0;function o(d,c){s.ensure(d,c)}Tr(()=>{var d=!1;n((c,v=0)=>{d=!0,o(v,c)}),d||o(-1,null)},l)}function nt(e,n){return n}function zo(e,n,a){for(var s=[],l=n.length,o,d=n.length,c=0;c{if(o){if(o.pending.delete(T),o.done.add(T),o.pending.size===0){var b=e.outrogroups;mr(e,Fi(o.done)),b.delete(o),b.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var v=s.length===0&&a!==null;if(v){var p=a,_=p.parentNode;uo(_),_.append(p),e.items.clear()}mr(e,n,!v)}else o={pending:new Set(n),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function mr(e,n,a=!0){var s;if(e.pending.size>0){s=new Set;for(const d of e.pending.values())for(const c of d)s.add(e.items.get(c).e)}for(var l=0;l{var ke=a();return yr(ke)?ke:ke==null?[]:Fi(ke)}),b,y=new Map,$=!0;function I(ke){(Te.effect.f&xn)===0&&(Te.pending.delete(ke),Te.fallback=_,Po(Te,b,d,n,s),_!==null&&(b.length===0?(_.f&Bn)===0?Li(_):(_.f^=Bn,ni(_,null,d)):ka(_,()=>{_=null})))}function S(ke){Te.pending.delete(ke)}var O=Tr(()=>{b=t(T);for(var ke=b.length,xe=new Set,De=he,Q=Bs(),Z=0;Zo(d)):(_=_n(()=>o(Vr??(Vr=Qn()))),_.f|=Bn)),ke>xe.size&&kl(),!$)if(y.set(De,xe),Q){for(const[je,dt]of c)xe.has(je)||De.skip_effect(dt.e);De.oncommit(I),De.ondiscard(S)}else I(De);t(T)}),Te={effect:O,items:c,pending:y,outrogroups:null,fallback:_};$=!1}function Za(e){for(;e!==null&&(e.f&Tn)===0;)e=e.next;return e}function Po(e,n,a,s,l){var Ke,je,dt,D,ie,V,fe,ae,ze;var o=(s&$l)!==0,d=n.length,c=e.items,v=Za(e.effect.first),p,_=null,T,b=[],y=[],$,I,S,O;if(o)for(O=0;O0){var Ce=(s&hs)!==0&&d===0?a:null;if(o){for(O=0;O{var ve,Ze;if(T!==void 0)for(S of T)(Ze=(ve=S.nodes)==null?void 0:ve.a)==null||Ze.apply()})}function $o(e,n,a,s,l,o,d,c){var v=(d&zl)!==0?(d&Dl)===0?lo(a,!1,!1):Ma(a):null,p=(d&Pl)!==0?Ma(l):null;return{v,i:p,e:_n(()=>(o(n,v??a,p??l,c),()=>{e.delete(s)}))}}function ni(e,n,a){if(e.nodes)for(var s=e.nodes.start,l=e.nodes.end,o=n&&(n.f&Bn)===0?n.nodes.start:a;s!==null;){var d=mi(s);if(o.before(s),s===l)return;s=d}}function Xn(e,n,a){n===null?e.effect.first=a:n.next=a,a===null?e.effect.last=n:a.prev=n}function Qe(e,n,a=!1,s=!1,l=!1,o=!1){var d=e,c="";if(a)var v=e;P(()=>{var p=We;if(c!==(c=n()??"")){if(a){p.nodes=null,v.innerHTML=c,c!==""&&Wa(ra(v),v.lastChild);return}if(p.nodes!==null&&(Gs(p.nodes.start,p.nodes.end),p.nodes=null),c!==""){var _=s?Ol:l?Bl:void 0,T=Rs(s?"svg":l?"math":"template",_);T.innerHTML=c;var b=s||l?T:T.content;if(Wa(ra(b),b.lastChild),s||l)for(;ra(b);)d.before(ra(b));else d.before(b)}}})}function Do(e,n,a){var s=e==null?"":""+e;return n&&(s=s?s+" "+n:n),s===""?null:s}function Io(e,n){return e==null?null:String(e)}function Et(e,n,a,s,l,o){var d=e[or];if(d!==a||d===void 0){var c=Do(a,s);c==null?e.removeAttribute("class"):e.className=c,e[or]=a}return o}function zt(e,n,a,s){var l=e[dr];if(l!==n){var o=Io(n);o==null?e.removeAttribute("style"):e.style.cssText=o,e[dr]=n}return s}function tl(e,n,a=!1){if(e.multiple){if(n==null)return;if(!yr(n))return Fl();for(var s of e.options)s.selected=n.includes(oi(s));return}for(s of e.options){var l=oi(s);if(co(l,n)){s.selected=!0;return}}(!a||n!==void 0)&&(e.selectedIndex=-1)}function Lo(e){var n=new MutationObserver(()=>{tl(e,e.__value)});n.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Fs(()=>{n.disconnect()})}function Jn(e,n,a=n){var s=new WeakSet,l=!0;Ar(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),oi);else{var v=e.querySelector(d)??e.querySelector("option:not([disabled])");c=v&&oi(v)}a(c),e.__value=c,he!==null&&s.add(he)}),Ns(()=>{var o=n();if(e===document.activeElement){var d=he;if(s.has(d))return}if(tl(e,o,l),l&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=oi(c),a(o))}e.__value=o,l=!1}),Lo(e)}function oi(e){return"__value"in e?e.__value:e.value}const Oo=Symbol("is custom element"),Bo=Symbol("is html"),Ro=_l?"progress":"PROGRESS";function ea(e,n){var a=nl(e);a.value===(a.value=n??void 0)||e.value===n&&(n!==0||e.nodeName!==Ro)||(e.value=n??"")}function Ea(e,n,a,s){var l=nl(e);l[n]!==(l[n]=a)&&(n==="loading"&&(e[bl]=a),a==null?e.removeAttribute(n):typeof a!="string"&&Fo(e).includes(n)?e[n]=a:e.setAttribute(n,a))}function nl(e){return e[Si]??(e[Si]={[Oo]:e.nodeName.includes("-"),[Bo]:e.namespaceURI===gs})}var Wr=new Map;function Fo(e){var n=e.getAttribute("is")||e.nodeName,a=Wr.get(n);if(a)return a;Wr.set(n,a=[]);for(var s,l=e,o=Element.prototype;o!==l;){s=vl(l);for(var d in s)s[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);l=vs(l)}return a}function dn(e,n,a=n){var s=new WeakSet;Ar(e,"input",async l=>{var o=l?e.defaultValue:e.value;if(o=Zi(e)?Yi(o):o,a(o),he!==null&&s.add(he),await ko(),o!==(o=n())){var d=e.selectionStart,c=e.selectionEnd,v=e.value.length;if(e.value=o??"",c!==null){var p=e.value.length;d===c&&c===v&&p>v?(e.selectionStart=p,e.selectionEnd=p):(e.selectionStart=d,e.selectionEnd=Math.min(c,p))}}}),Ja(n)==null&&e.value&&(a(Zi(e)?Yi(e.value):e.value),he!==null&&s.add(he)),qi(()=>{var l=n();if(e===document.activeElement){var o=he;if(s.has(o))return}Zi(e)&&l===Yi(e.value)||e.type==="date"&&!l&&!e.value||l!==e.value&&(e.value=l??"")})}function Ko(e,n,a=n){Ar(e,"change",s=>{var l=s?e.defaultChecked:e.checked;a(l)}),Ja(n)==null&&a(e.checked),qi(()=>{var s=n();e.checked=!!s})}function Zi(e){var n=e.type;return n==="number"||n==="range"}function Yi(e){return e===""?null:+e}function Xi(e,n){return e===n||(e==null?void 0:e[$a])===n}function No(e={},n,a,s){var l=en.r,o=We;return Ns(()=>{var d,c;return qi(()=>{d=c,c=[],Ja(()=>{Xi(a(...c),e)||(n(e,...c),d&&Xi(a(...d),e)&&n(null,...d))})}),()=>{let v=o;for(;v!==l&&v.parent!==null&&v.parent.f&lr;)v=v.parent;const p=()=>{c&&Xi(a(...c),e)&&n(null,...c)},_=v.teardown;v.teardown=()=>{p(),_==null||_()}}}),e}function yi(e){en===null&&fs(),bi(()=>{const n=Ja(e);if(typeof n=="function")return n})}function qo(e){en===null&&fs(),yi(()=>()=>Ja(e))}let vi=localStorage.getItem("mc_token")||"";function al(){return vi}function Go(e){vi=(e||"").trim(),localStorage.setItem("mc_token",vi)}function Vo(){const e={"Content-Type":"application/json"};return vi&&(e["X-MC-Token"]=vi),e}function di(){return localStorage.getItem("mc_hf_token")||""}function Wo(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function Ee(e,n={}){const a=await fetch(e,{headers:Vo(),...n}),s=await a.json().catch(()=>({}));if(!a.ok)throw new Error(s.error||"HTTP "+a.status);return s}const jo=(e,n=document)=>n.querySelector(e),jr=(e,n=document)=>[...n.querySelectorAll(e)];function Fn(e){return String(e??"").replace(/[&<>]/g,n=>({"&":"&","<":"<",">":">"})[n])}let Ur;function se(e,n=!1){const a=jo("#toast");a&&(a.textContent=e,a.className="toast show"+(n?" err":""),clearTimeout(Ur),Ur=setTimeout(()=>a.className="toast",3200))}function Uo(e,n){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${n!=null?` ${Math.round(n)}%`:""}`:'bereit'}const ut=e=>`${e}`,Gi={logo:ut(''),grid:ut(''),cpu:ut(''),pulse:ut(''),server:ut(''),book:ut(''),help:ut(''),settings:ut(''),swap:ut(''),monitor:ut(''),layers:ut(''),alert:ut(''),gauge:ut(''),search:ut(''),compass:ut(''),code:ut(''),eye:ut(''),refresh:ut(''),file:ut(''),database:ut(''),thermo:ut(''),shield:ut(''),info:ut(''),chevron:ut(''),bolt:ut(''),x:ut(''),check:ut(''),download:ut(''),clock:ut('')};function Ut(e){return Gi[e]||""}function br(e){return`${Gi.info}`}function da(e){if(!e&&e!==0)return"–";const n=e/1024/1024/1024;return n>=1?n.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function yn({title:e,body:n,confirmLabel:a="Bestätigen",cancelLabel:s="Abbrechen",danger:l=!1}){return new Promise(o=>{const d=document.createElement("div");d.className="modal-overlay",d.innerHTML=``;const c=v=>{d.remove(),o(v)};d.addEventListener("click",v=>{if(v.target===d)return c(!1);const f=v.target.closest("[data-x]");f&&c(f.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function er({title:e,body:n="",placeholder:a="",password:s=!1,confirmLabel:l="Weiter",danger:o=!1}){return new Promise(d=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=``;const v=c.querySelector("input"),p=_=>{c.remove(),d(_)};c.addEventListener("click",_=>{if(_.target===c)return p(null);const T=_.target.closest("[data-x]");T&&p(T.getAttribute("data-x")==="1"?v.value||"":null)}),v.addEventListener("keydown",_=>{_.key==="Enter"&&p(v.value||""),_.key==="Escape"&&p(null)}),document.body.appendChild(c),v.focus()})}function Ho(e="overview"){const n=jr(".nav-item[data-view]:not(.disabled)"),a=jr(".view[data-view]"),s=new Set(a.map(o=>o.dataset.view));function l(o){s.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),n.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),l(o.dataset.view)})),window.addEventListener("hashchange",()=>l(location.hash.replace("#/",""))),l(location.hash.replace("#/","")||e),{show:l}}let Hr=L(null);const ki={get value(){return t(Hr)},set(e){u(Hr,e,!0)}};let Jr=L(Wt([])),ta=L(Wt([]));const pa={get value(){return t(Jr)},set(e){u(Jr,e||[],!0)},get tracked(){return t(ta)},track(e){t(ta).includes(e)||u(ta,[...t(ta),e],!0)},toggle(e){u(ta,t(ta).includes(e)?t(ta).filter(n=>n!==e):[...t(ta),e],!0)}};let Qr=L(null);const $r={get value(){return t(Qr)},set(e){u(Qr,e,!0)}},Jo="5";var ds;typeof window<"u"&&((ds=window.__svelte??(window.__svelte={})).v??(ds.v=new Set)).add(Jo);var Qo=m('— bereit für Anfragen'),Zo=m('
Temperatur (GPU)
Freier Speicher
GB
',1),Yo=m('
Temperatur
messe…
Freier Speicher
messe…
',1),Xo=m('
'),ed=m('
Warte auf Messwerte…
'),td=m('
Noch kein Modell eingerichtet — starte hier:
',1),nd=m('
Die häufigsten Aufgaben — ein Klick.
',1),ad=m('Bild'),id=m('Code'),rd=m('Text'),sd=m('∞ aktiv'),ld=m(''),od=m('
'),Zr=m('
'),dd=m('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),cd=m('
'),vd=m('
News gerade nicht ladbar.
'),ud=m('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

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

'),Sd=m(''),Md=m(''),Ed=m(''),Ad=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 Cd(e,n){zn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",s="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",l=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=N(()=>{var E;return((E=ki.value)==null?void 0:E.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=L(""),v=L(""),p=L(""),_=L(!1);const T=N(()=>t(o).filter(E=>!E.incomplete));async function b(){var z;const E=t(c)||((z=t(T)[0])==null?void 0:z.name);if(!(!E||!t(v).trim())){u(_,!0),u(p,"(wecke Modell, kann beim Laden kurz dauern…)");try{const U=await Ee("/api/chat",{method:"POST",body:JSON.stringify({model:E,message:t(v)})});u(p,U.reply,!0)}catch(U){u(p,"Fehler: "+U.message)}u(_,!1),d()}}const y=300;let $=L(!1),I=L(null),S=L(8192),O=L(!1);function Te(E){var z;u(I,t(o).find(U=>U.name===E),!0),t(I)&&(u(S,((z=t(I).meta)==null?void 0:z.ctx)||8192,!0),u(O,(t(I).ttl??y)>=99999),u($,!0))}async function ke(){const E=t(O)?99999:y;try{await Ee("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(I).name,ctx:t(S),ttl:E})}),se("Gespeichert — aktiv beim nächsten Modell-Start."),u($,!1),d()}catch(z){se(z.message,!0)}}let xe=L(!1),De=L(""),Q=L(""),Z=L("");function pe(E){const z=t(o).find(U=>U.name===E);u(De,E,!0),u(Z,(z==null?void 0:z.role)||"",!0),u(Q,""),u(xe,!0)}async function Ce(E){try{await Ee("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(De),role:E})}),se(E?`Rolle gesetzt: ${E}`:"Rolle entfernt."),u(xe,!1),d()}catch(z){se(z.message,!0)}}async function Ke(E){if(await yn({title:`„${E}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Ee("/api/unload?model="+encodeURIComponent(E),{method:"POST"}),se("Entladen: "+E),setTimeout(d,600)}catch(z){se(z.message,!0)}}async function je(E){if(await yn({title:`„${E}" 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 Ee("/api/delete_model",{method:"POST",body:JSON.stringify({alias:E})});se(z.note||"Gelöscht: "+E),setTimeout(d,600)}catch(z){se(z.message,!0)}}function dt(E){return E!=null&&E.length?E.map(z=>z==="Code"?'Code':z==="Bild"?'Bild':'Text').join(" "):"–"}function D(E){if(!E)return"–";const z=E.quant||"?",U=E.ctx?Math.round(E.ctx/1024)+"K":"?",ge=E.size_bytes?(E.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${z} · ${U} · ${ge}`}function ie(E){var z;(z=navigator.clipboard)==null||z.writeText(E),se("Kopiert: "+E)}var V=Ad(),fe=i(at(V),2),ae=i(r(fe),6);et(ae,21,()=>t(T),nt,(E,z)=>{var U=fd(),ge=r(U),R={};P(()=>{h(ge,t(z).name),R!==(R=t(z).name)&&(U.value=(U.__value=t(z).name)??"")}),f(E,U)});var ze=i(ae,4),ve=i(ze,2),Ze=r(ve),Ue=i(ve,2);{var it=E=>{var z=hd(),U=r(z);P(()=>h(U,t(p))),f(E,z)};K(Ue,E=>{t(p)&&E(it)})}var He=i(fe,2),Ye=r(He),gt=i(r(Ye)),Pt=r(gt),Dt=i(Ye,4);{var Rt=E=>{var z=gd();f(E,z)},Ft=E=>{var z=xd(),U=i(r(z));et(U,21,()=>t(o),nt,(ge,R)=>{var ne=ja(),be=at(ne);{var Pe=B=>{var H=md(),de=r(H),re=r(de),q=i(de,5),G=r(q),x=i(G,2);P(()=>h(re,t(R).name)),M("click",G,()=>{var F;se("Lade im Cookbook ein Modell und setze den Alias auf: "+t(R).name),(F=document.querySelector(".nav-item[data-view='cookbook']"))==null||F.dispatchEvent(new MouseEvent("click"))}),M("click",x,()=>je(t(R).name)),f(B,H)},A=B=>{var H=kd(),de=r(H),re=r(de),q=r(re),G=i(q);{var x=Re=>{var j=bd(),Y=r(j);P(()=>h(Y,t(R).role)),f(Re,j)};K(G,Re=>{t(R).role&&Re(x)})}var F=i(re,2);{var te=Re=>{var j=_d(),Y=r(j);P(()=>h(Y,t(R).meta.filename)),f(Re,j)};K(F,Re=>{var j;(j=t(R).meta)!=null&&j.filename&&Re(te)})}var we=i(F,2),ye=i(r(we),2);et(ye,17,()=>{var Re;return(Re=t(R).api_ids)!=null&&Re.length?t(R).api_ids:[t(R).name]},nt,(Re,j)=>{var Y=yd(),le=r(Y);P(()=>h(le,t(j))),M("click",Y,()=>ie(t(j))),f(Re,Y)});var ct=i(de);Qe(ct,()=>{var Re;return dt((Re=t(R).meta)==null?void 0:Re.caps)},!0);var mt=i(ct);Qe(mt,()=>D(t(R).meta),!0);var Xe=i(mt);Qe(Xe,()=>Uo(t(R).state,t(R).download_progress),!0);var C=i(Xe),J=r(C),Ie=i(C),ue=r(Ie),Se=i(ue,2),Oe=i(Se,2),Je=i(Oe,2);P(()=>{h(q,`${t(R).name??""} `),h(J,t(R).port??"auto")}),M("click",ue,()=>pe(t(R).name)),M("click",Se,()=>Te(t(R).name)),M("click",Oe,()=>Ke(t(R).name)),M("click",Je,()=>je(t(R).name)),f(B,H)};K(be,B=>{t(R).incomplete?B(Pe):B(A,-1)})}f(ge,ne)}),f(E,z)};K(Dt,E=>{t(o).length?E(Ft,-1):E(Rt)})}var At=i(He,2);{var Ct=E=>{var z=Sd(),U=r(z),ge=r(U),R=i(ge,4),ne=r(R),be=i(R,2),Pe=i(r(be));Qe(Pe,()=>br(a));var A=i(be,2),B=i(A,2);{var H=te=>{var we=wd(),ye=r(we),ct=i(r(ye),2),mt=r(ct),Xe=i(mt,2),C=i(ye,2);P((J,Ie)=>{h(mt,`Optimal ~${J??""}k → ~${t(I).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(Xe,` Aktuell ~${Ie??""}k → ~${t(I).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(I).meta.optimal_ctx/1024),()=>Math.round((t(I).meta.ctx||0)/1024)]),M("click",C,()=>u(S,t(I).meta.optimal_ctx,!0)),f(te,we)};K(B,te=>{var we;(we=t(I).meta)!=null&&we.optimal_ctx&&te(H)})}var de=i(B,4),re=i(r(de),2),q=r(re),G=i(q,2),x=r(G),F=i(de,2);P(()=>{h(ne,t(I).name),zt(G,`color:${t(O)?"var(--accent)":"var(--mut)"}`),h(x,t(O)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),M("click",z,te=>{te.target.classList.contains("modal-overlay")&&u($,!1)}),M("click",ge,()=>u($,!1)),dn(A,()=>t(S),te=>u(S,te)),Ko(q,()=>t(O),te=>u(O,te)),M("click",F,ke),f(E,z)};K(At,E=>{t($)&&t(I)&&E(Ct)})}var W=i(At,2);{var oe=E=>{var z=Ed(),U=r(z),ge=r(U),R=i(ge,2),ne=i(r(R));Qe(ne,()=>br(s));var be=i(R,2),Pe=r(be),A=i(be,4);et(A,21,()=>l,nt,(q,G)=>{var x=Md(),F=r(x);P(()=>{Et(x,1,t(Z)===t(G).id?"primary":"ghost"),Ea(x,"title",t(G).desc),h(F,t(G).label)}),M("click",x,()=>Ce(t(G).id)),f(q,x)});var B=i(A,4),H=i(B,2),de=r(H),re=i(de,2);P(()=>h(Pe,t(De))),M("click",z,q=>{q.target.classList.contains("modal-overlay")&&u(xe,!1)}),M("click",ge,()=>u(xe,!1)),dn(B,()=>t(Q),q=>u(Q,q)),M("click",de,()=>Ce("")),M("click",re,()=>Ce(t(Q).trim().toLowerCase())),f(E,z)};K(W,E=>{t(xe)&&E(oe)})}P(()=>{ve.disabled=t(_),h(Ze,t(_)?"…":"Senden"),h(Pt,t(o).length?t(o).length+" konfiguriert":"")}),Jn(ae,()=>t(c),E=>u(c,E)),dn(ze,()=>t(v),E=>u(v,E)),M("click",ve,b),f(e,V),Pn()}qn(["click"]);var Td=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),zd=m(''),Pd=m('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),$d=m(' '),Dd=m(''),Id=m(''),Ld=m('
'),Od=m('
'),Bd=m('
'),Rd=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 Fd(e,n){zn(n,!0);const a=N(()=>pa.value),s=N(()=>pa.tracked),l=N(()=>$r.value);let o=Wt({cpu:[],ram:[],gpu:[]});bi(()=>{var V;if(!t(l))return;const D=t(l).gpu,ie=D&&D.vram.total+D.gtt.total>0?(D.vram.used+D.gtt.used)/(D.vram.total+D.gtt.total)*100:0;o.cpu=[...o.cpu,((V=t(l).cpu)==null?void 0:V.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,ie].slice(-60)});const d=N(()=>()=>{var ie;const D=(ie=t(l))==null?void 0:ie.gpu;return D&&D.vram.total+D.gtt.total>0?(D.vram.used+D.gtt.used)/(D.vram.total+D.gtt.total)*100:0}),c=N(()=>t(a).filter(D=>D.state!=="running"&&D.state!=="queued").length),v=N(()=>t(a).filter(D=>D.state==="failed").length);function p(D){if(D.state!=="running")return null;if(typeof D.progress=="number")return Math.min(100,D.progress);const V=((D.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return V?Math.min(100,parseFloat(V[1])):null}function _(D){return D==null||D<0?"":D>=90?`noch ~${Math.round(D/60)} min`:`noch ~${Math.max(1,Math.round(D))} s`}function T(D){return D==="done"?'fertig':D==="failed"?'fehler':D==="canceled"?'abgebrochen':'läuft…'}function b(D){return D==="done"?"on":D==="failed"||D==="canceled"?"":"load"}async function y(D){try{await Ee(`/api/jobs/${D}/cancel`,{method:"POST"}),se("Abbruch angefordert…")}catch(ie){se(ie.message,!0)}}async function $(D){try{await Ee(`/api/jobs/${D}`,{method:"DELETE"})}catch(ie){se(ie.message,!0)}}async function I(){try{const D=await Ee("/api/jobs/clear",{method:"POST"});se(`${D.removed} Einträge entfernt.`)}catch(D){se(D.message,!0)}}function S(D,ie){return D.map(V=>`
`).join("")}var O=Rd(),Te=i(at(O),2);{var ke=D=>{const ie=N(()=>t(d)());var V=Td(),fe=at(V),ae=r(fe),ze=i(r(ae),2),ve=r(ze),Ze=i(ze,2),Ue=r(Ze),it=i(ae,2),He=i(r(it),2),Ye=r(He),gt=i(He,2),Pt=r(gt),Dt=i(it,2),Rt=i(r(Dt),2),Ft=r(Rt),At=i(Rt,2),Ct=r(At),W=i(fe,2),oe=i(r(W),4),E=r(oe),z=i(r(E)),U=r(z),ge=i(E,2),R=i(r(ge),2),ne=r(R),be=i(ge,2),Pe=i(r(be)),A=r(Pe),B=i(be,2),H=i(r(B),2),de=r(H),re=i(oe,2),q=r(re),G=i(r(q));Qe(G,()=>S(o.cpu,"--accent"),!0);var x=i(q,2),F=i(r(x));Qe(F,()=>S(o.ram,"--purple"),!0);var te=i(x,2),we=i(r(te));Qe(we,()=>S(o.gpu,"--on"),!0),P((ye,ct,mt,Xe,C,J,Ie,ue,Se,Oe,Je,Re,j)=>{h(ve,ye),h(Ue,ct),h(Ye,mt),h(Pt,`${Xe??""} / ${C??""}`),h(Ft,J),h(Ct,Ie),h(U,`${ue??""} / ${Se??""}`),h(ne,Oe),h(A,`${Je??""} % belegt`),h(de,`${Re??""} / ${j??""}`)},[()=>{var ye;return Math.round(((ye=t(l).cpu)==null?void 0:ye.percent)??0)},()=>{var ye;return((ye=t(l).cpu)==null?void 0:ye.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>da(t(l).ram.used),()=>da(t(l).ram.total),()=>Math.round(t(ie)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>da(t(l).ram.used),()=>da(t(l).ram.total),()=>t(l).gpu?`${da(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${da(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var ye;return Math.round(((ye=t(l).disk)==null?void 0:ye.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var ye;return((ye=t(l).cpu)==null?void 0:ye.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),f(D,V)};K(Te,D=>{t(l)&&D(ke)})}var xe=i(Te,2),De=r(xe),Q=i(r(De),2),Z=r(Q),pe=i(Q,2);{var Ce=D=>{var ie=zd();M("click",ie,I),f(D,ie)};K(pe,D=>{t(c)&&D(Ce)})}var Ke=i(De,4);{var je=D=>{var ie=Pd();f(D,ie)},dt=D=>{var ie=ja(),V=at(ie);et(V,17,()=>t(a),nt,(fe,ae)=>{const ze=N(()=>p(t(ae))),ve=N(()=>t(ae).state==="running"?_(t(ae).eta_s):""),Ze=N(()=>t(ae).state==="running"&&t(ae).rate_bps?da(t(ae).rate_bps)+"/s":""),Ue=N(()=>[t(ve),t(Ze)].filter(Boolean).join(" · ")),it=N(()=>t(s).includes(t(ae).id));var He=Bd(),Ye=r(He),gt=r(Ye),Pt=i(gt,2),Dt=r(Pt),Rt=i(Pt,2);{var Ft=R=>{var ne=$d(),be=r(ne);P(Pe=>h(be,`${Pe??""} %${t(Ue)?` · ${t(Ue)}`:""}`),[()=>Math.round(t(ze))]),f(R,ne)};K(Rt,R=>{t(ze)!=null&&R(Ft)})}var At=i(Rt,2);{var Ct=R=>{var ne=Dd();P(()=>zt(ne,`${t(ze)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),M("click",ne,be=>{be.stopPropagation(),y(t(ae).id)}),f(R,ne)},W=R=>{var ne=Id();M("click",ne,be=>{be.stopPropagation(),$(t(ae).id)}),f(R,ne)};K(At,R=>{t(ae).state==="running"?R(Ct):R(W,-1)})}var oe=i(At,2);Qe(oe,()=>T(t(ae).state));var E=i(Ye,2);{var z=R=>{var ne=Ld(),be=r(ne);P(()=>zt(be,`width:${t(ze)??""}%`)),f(R,ne)};K(E,R=>{t(ze)!=null&&t(ae).state==="running"&&R(z)})}var U=i(E,2);{var ge=R=>{var ne=Od(),be=r(ne);P(Pe=>h(be,Pe),[()=>(t(ae).log||[]).join(` -`)]),f(R,ne)};K(U,R=>{t(it)&&R(ge)})}P(R=>{Et(gt,1,`li-dot ${R??""}`),h(Dt,t(ae).label)},[()=>b(t(ae).state)]),M("click",Ye,()=>pa.toggle(t(ae).id)),M("keydown",Ye,R=>R.key==="Enter"&&pa.toggle(t(ae).id)),f(fe,He)}),f(D,ie)};K(Ke,D=>{t(a).length?D(dt,-1):D(je)})}P(()=>h(Z,t(a).length?t(v)?t(v)+" Fehler":t(a).length+" gesamt":"")),f(e,O),Pn()}qn(["click","keydown"]);var Kd=m(' '),Nd=m(''),qd=m('✓ fertig'),Gd=m('✗ fehlgeschlagen'),Vd=m('abgebrochen'),Wd=m('läuft…'),jd=m('
'),Ud=m('

Aktueller Vorgang

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

'),oc=m('

'),dc=m(''),cc=m('

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

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

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

Aktuell die besten Modelle für dein System

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

Profi-Suche (HuggingFace)

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

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

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

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

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

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

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

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

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

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Kc=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.
Zed herunterladen: zed.dev — kostenlos, native Performance, Windows/macOS/Linux.
',1),Nc=m('

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

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

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

Danach in OpenCode /models wählen.

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

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

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

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

',1),Vc=m('

Bilder einbinden (Vision)

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

2 · Modelle auswählen

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

3 · Tool wählen

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

4 · Config-Snippet

',1),jc=m('

2 · Erst ein Modell installieren

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

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

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

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

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

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

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

'),Zc=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?

Gedächtnis-MCP

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

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

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

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

Modelle

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

Schnelltest

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

Modelle & Ports

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

System-Metriken (Bosgame)

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

Aktivität

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

Hintergrund-Aufgaben

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

Aktueller Vorgang

'),Hd=g('

Server & Wartung

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

LLM-Engine (llama-swap)

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

Dienste & Applikation

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

Betriebssystem (Bosgame)

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

Live-Konsole

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

'),oc=g('

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

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

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

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

Aktuell die besten Modelle für dein System

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

Profi-Suche (HuggingFace)

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

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

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

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

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

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

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

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

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

Settings → Models → Custom Endpoint+ hinzufügen:

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

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

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

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

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

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

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

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

Danach in OpenCode /models wählen.

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

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

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

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

',1),Vc=g('

Bilder einbinden (Vision)

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

2 · Modelle auswählen

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

3 · Tool wählen

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

4 · Config-Snippet

',1),jc=g('

2 · Erst ein Modell installieren

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

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

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

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

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

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

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

'),Zc=g(`

Verbinden

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

1 · Verbindung prüfen

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

Wie funktioniert das Auto-Swap?

Gedächtnis-MCP

Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen + über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Yc(e,n){$n(n,!0);const a=q(()=>xi.value),s=q(()=>{var M;return(((M=t(a))==null?void 0:M.models)||[]).filter(K=>!K.incomplete)});let l=I("zed"),o=I(jt([])),d=I(""),c=I(!1),v=I("cline"),f=I(jt(localStorage.getItem("mc_ip_override")||""));function b(M){return/^\d{1,3}(\.\d{1,3}){3}$/.test(M)}function T(){return location.protocol==="https:"||!b(location.hostname)}function _(){return`http://${t(f).trim()||location.hostname}:8080/v1`}const y=q(_);function P(){const M=t(f).trim();M?localStorage.setItem("mc_ip_override",M):localStorage.removeItem("mc_ip_override")}const O=q(()=>Be(t(v))),S=q(()=>t(o).length?t(o):t(s).map(M=>M.name)),F=q(()=>t(S)[0]||"coder"),Oe=q(()=>{var M;return(M=t(s).find(K=>{var Q,fe;return(fe=(Q=K.meta)==null?void 0:Q.caps)==null?void 0:fe.includes("Bild")}))==null?void 0:M.name});function Ee(M,K){const fe=(K.length?t(s).filter(se=>K.includes(se.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(se=>{var C,H;const Me=(((C=se.meta)==null?void 0:C.caps)||[]).some(ve=>/Bild|Vision/i.test(ve)),Se=((H=se.meta)==null?void 0:H.ctx)||131072;return` { "name": "${se.name}", "display_name": "${se.name}", "max_tokens": ${Se}${Me?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${A}", + "api_url": "${M}", "available_models": [ -${de} +${fe} ] } } -}`}function xe(A,B){const de=(B.length?t(s).filter(re=>B.includes(re.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(re=>{var G;const q=((G=re.meta)==null?void 0:G.ctx)||131072;return` "${re.name}": { "name": "${re.name}", "contextWindowSize": ${q} }`}).join(`, +}`}function ze(M,K){const fe=(K.length?t(s).filter(se=>K.includes(se.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(se=>{var Se;const Me=((Se=se.meta)==null?void 0:Se.ctx)||131072;return` "${se.name}": { "name": "${se.name}", "contextWindowSize": ${Me} }`}).join(`, `);return`"providers": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${A}", + "baseURL": "${M}", "apiKey": "local" }, "models": { -${de} +${fe} } } -}`}function De(A,B){return`{ +}`}function Ke(M,K){return`{ "models": [ -${(B.length?t(s).filter(re=>B.includes(re.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(re=>` { - "title": "llama-swap / ${re.name}", +${(K.length?t(s).filter(se=>K.includes(se.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(se=>` { + "title": "llama-swap / ${se.name}", "provider": "openai", - "model": "${re.name}", - "apiBase": "${A}", + "model": "${se.name}", + "apiBase": "${M}", "apiKey": "local" }`).join(`, `)} ] -}`}async function Q(){u(d,"Teste…");try{const A=await Ee("/api/integration/test");u(c,A.ok,!0),u(d,A.ok?`✓ Verbunden — ${A.models.length} Modell(e): ${A.models.join(", ")}`:`✗ Keine Verbindung: ${A.error}`,!0)}catch(A){u(c,!1),u(d,"✗ "+A.message)}}function Z(A){var H;const B=A.querySelector("code");B&&((H=navigator.clipboard)==null||H.writeText(B.textContent||""))}function pe(A){var B;(B=navigator.clipboard)==null||B.writeText(A.value)}function Ce(A){return`{ +}`}async function Y(){u(d,"Teste…");try{const M=await Te("/api/integration/test");u(c,M.ok,!0),u(d,M.ok?`✓ Verbunden — ${M.models.length} Modell(e): ${M.models.join(", ")}`:`✗ Keine Verbindung: ${M.error}`,!0)}catch(M){u(c,!1),u(d,"✗ "+M.message)}}function Z(M){var Q;const K=M.querySelector("code");K&&((Q=navigator.clipboard)==null||Q.writeText(K.textContent||""))}function me(M){var K;(K=navigator.clipboard)==null||K.writeText(M.value)}function Be(M){return`{ "mcpServers": { "mission-control-memory": { - "command": "${A==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", - "args": ["${A==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], + "command": "${M==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", + "args": ["${M==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], "env": { "MC_URL": "http://192.168.178.151:9000" } } } -}`}var Ke=Zc(),je=i(at(Ke),2),dt=i(r(je),6),D=r(dt),ie=i(D,2),V=i(dt,2),fe=r(V),ae=i(V,2);{var ze=A=>{var B=$c();f(A,B)},ve=N(()=>T());K(ae,A=>{t(ve)&&A(ze)})}var Ze=i(ae,2),Ue=r(Ze),it=i(Ue,2);{var He=A=>{var B=Dc(),H=r(B);P(()=>{zt(B,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(H,t(d))}),f(A,B)};K(it,A=>{t(d)&&A(He)})}var Ye=i(je,2),gt=i(r(Ye),2);et(gt,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."]],nt,(A,B)=>{var H=N(()=>Hn(B,3));let de=()=>t(H)[0],re=()=>t(H)[1],q=()=>t(H)[2];var G=Ic(),x=r(G),F=r(x),te=i(x,2),we=r(te),ye=r(we),ct=i(we,2),mt=r(ct);P(()=>{h(F,de()),h(ye,re()),h(mt,q())}),f(A,G)});var Pt=i(Ye,2);{var Dt=A=>{var B=Wc(),H=at(B),de=r(H),re=i(r(de),2),q=r(re),G=i(de,4);et(G,21,()=>t(s),nt,(j,Y)=>{const le=N(()=>t(o).includes(t(Y).name));var ce=Lc(),Fe=r(ce);P(()=>{zt(ce,`cursor:pointer;${t(le)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(Fe,t(Y).name)}),M("click",ce,()=>u(o,t(le)?t(o).filter(Ne=>Ne!==t(Y).name):[...t(o),t(Y).name],!0)),M("keydown",ce,Ne=>Ne.key==="Enter"&&u(o,t(le)?t(o).filter(Le=>Le!==t(Y).name):[...t(o),t(Y).name],!0)),f(j,ce)});var x=i(G,2);{var F=j=>{var Y=Oc(),le=r(Y);M("click",le,ce=>{ce.preventDefault(),u(o,[],!0)}),f(j,Y)};K(x,j=>{t(o).length&&j(F)})}var te=i(H,2),we=i(r(te),6);et(we,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],nt,(j,Y)=>{var le=N(()=>Hn(Y,3));let ce=()=>t(le)[0],Fe=()=>t(le)[1],Ne=()=>t(le)[2];var Le=Xr(),me=r(Le),_e=r(me),$t=i(me,2),It=r($t);P(()=>{Et(Le,1,`card-btn${t(l)===ce()?" cb-best":""}`),h(_e,Fe()),h(It,Ne())}),M("click",Le,()=>u(l,ce(),!0)),f(j,Le)});var ye=i(we,4);et(ye,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],nt,(j,Y)=>{var le=N(()=>Hn(Y,3));let ce=()=>t(le)[0],Fe=()=>t(le)[1],Ne=()=>t(le)[2];var Le=Xr(),me=r(Le),_e=r(me),$t=i(me,2),It=r($t);P(()=>{Et(Le,1,`card-btn${t(l)===ce()?" cb-best":""}`),h(_e,Fe()),h(It,Ne())}),M("click",Le,()=>u(l,ce(),!0)),f(j,Le)});var ct=i(te,2),mt=i(r(ct),2);{var Xe=j=>{var Y=Bc(),le=i(at(Y),6),ce=r(le),Fe=i(ce,2),Ne=i(le,4),Le=r(Ne),me=i(Le,2);P(()=>{ea(ce,t(y)),ea(Le,t(O))}),M("click",Fe,_e=>pe(_e.currentTarget.previousElementSibling)),M("click",me,_e=>pe(_e.currentTarget.previousElementSibling)),f(j,Y)},C=j=>{const Y=N(()=>De(t(y),t(S)));var le=Rc(),ce=i(at(le),4),Fe=r(ce),Ne=i(Fe,2),Le=r(Ne),me=r(Le),_e=i(ce,2),$t=i(r(_e)),It=r($t);P(()=>{h(me,t(Y)),h(It,`llama-swap / ${t(O)??""}`)}),M("click",Fe,jt=>Z(jt.currentTarget.parentElement)),f(j,le)},J=j=>{var Y=Fc(),le=i(at(Y),6),ce=r(le),Fe=i(ce,2),Ne=i(le,4),Le=r(Ne),me=i(Le,2),_e=i(Ne,2),$t=i(r(_e),3),It=r($t);P(()=>{ea(ce,t(y)),ea(Le,t(O)),h(It,t(O))}),M("click",Fe,jt=>pe(jt.currentTarget.previousElementSibling)),M("click",me,jt=>pe(jt.currentTarget.previousElementSibling)),f(j,Y)},Ie=j=>{const Y=N(()=>ke(t(y),t(S)));var le=Kc(),ce=i(at(le),4),Fe=r(ce),Ne=i(Fe,2),Le=r(Ne),me=r(Le),_e=i(ce,4),$t=i(r(_e)),It=r($t);P(()=>{h(me,t(Y)),h(It,`bosgame / ${t(O)??""}`)}),M("click",Fe,jt=>Z(jt.currentTarget.parentElement)),f(j,le)},ue=j=>{const Y=N(()=>xe(t(y),t(S)));var le=Nc(),ce=i(at(le),6),Fe=r(ce),Ne=i(Fe,2),Le=r(Ne),me=r(Le),_e=i(ce,2),$t=i(r(_e),3),It=r($t);P(()=>{h(me,t(Y)),h(It,`llama-swap/${t(O)??""}`)}),M("click",Fe,jt=>Z(jt.currentTarget.parentElement)),f(j,le)},Se=j=>{var Y=qc(),le=i(at(Y),4),ce=r(le),Fe=i(ce,2),Ne=i(le,4),Le=r(Ne),me=i(Le,2);P(()=>{ea(ce,t(y)),ea(Le,t(O))}),M("click",Fe,_e=>pe(_e.currentTarget.previousElementSibling)),M("click",me,_e=>pe(_e.currentTarget.previousElementSibling)),f(j,Y)},Oe=j=>{var Y=Gc(),le=i(at(Y),4),ce=r(le),Fe=i(ce,2),Ne=i(le,4),Le=r(Ne),me=i(Le,2);P(()=>ea(ce,t(y))),M("click",Fe,_e=>pe(_e.currentTarget.previousElementSibling)),M("click",me,_e=>pe(_e.currentTarget.previousElementSibling)),f(j,Y)};K(mt,j=>{t(l)==="janai"?j(Xe):t(l)==="continue"?j(C,1):t(l)==="antigravity"?j(J,2):t(l)==="zed"?j(Ie,3):t(l)==="opencode"?j(ue,4):t(l)==="cline"?j(Se,5):t(l)==="openwebui"&&j(Oe,6)})}var Je=i(ct,2);{var Re=j=>{const Y=N(()=>`curl ${t(y)}/chat/completions \\ +}`}var Ve=Zc(),Qe=i(nt(Ve),2),vt=i(r(Qe),6),D=r(vt),le=i(D,2),Ae=i(vt,2),tt=r(Ae),N=i(Ae,2);{var oe=M=>{var K=Pc();p(M,K)},de=q(()=>T());L(N,M=>{t(de)&&M(oe)})}var He=i(N,2),je=r(He),at=i(je,2);{var st=M=>{var K=Dc(),Q=r(K);z(()=>{Ct(K,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(Q,t(d))}),p(M,K)};L(at,M=>{t(d)&&M(st)})}var it=i(Qe,2),mt=i(r(it),2);Ze(mt,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."]],et,(M,K)=>{var Q=q(()=>Hn(K,3));let fe=()=>t(Q)[0],se=()=>t(Q)[1],Me=()=>t(Q)[2];var Se=Ic(),C=r(Se),H=r(C),ve=i(C,2),De=r(ve),G=r(De),ie=i(De,2),Re=r(ie);z(()=>{h(H,fe()),h(G,se()),h(Re,Me())}),p(M,Se)});var Tt=i(it,2);{var zt=M=>{var K=Wc(),Q=nt(K),fe=r(Q),se=i(r(fe),2),Me=r(se),Se=i(fe,4);Ze(Se,21,()=>t(s),et,(V,U)=>{const J=q(()=>t(o).includes(t(U).name));var R=Lc(),X=r(R);z(()=>{Ct(R,`cursor:pointer;${t(J)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(X,t(U).name)}),w("click",R,()=>u(o,t(J)?t(o).filter(ye=>ye!==t(U).name):[...t(o),t(U).name],!0)),w("keydown",R,ye=>ye.key==="Enter"&&u(o,t(J)?t(o).filter(he=>he!==t(U).name):[...t(o),t(U).name],!0)),p(V,R)});var C=i(Se,2);{var H=V=>{var U=Oc(),J=r(U);w("click",J,R=>{R.preventDefault(),u(o,[],!0)}),p(V,U)};L(C,V=>{t(o).length&&V(H)})}var ve=i(Q,2),De=i(r(ve),6);Ze(De,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],et,(V,U)=>{var J=q(()=>Hn(U,3));let R=()=>t(J)[0],X=()=>t(J)[1],ye=()=>t(J)[2];var he=Xr(),ue=r(he),ge=r(ue),xt=i(ue,2),$t=r(xt);z(()=>{At(he,1,`card-btn${t(l)===R()?" cb-best":""}`),h(ge,X()),h($t,ye())}),w("click",he,()=>u(l,R(),!0)),p(V,he)});var G=i(De,4);Ze(G,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],et,(V,U)=>{var J=q(()=>Hn(U,3));let R=()=>t(J)[0],X=()=>t(J)[1],ye=()=>t(J)[2];var he=Xr(),ue=r(he),ge=r(ue),xt=i(ue,2),$t=r(xt);z(()=>{At(he,1,`card-btn${t(l)===R()?" cb-best":""}`),h(ge,X()),h($t,ye())}),w("click",he,()=>u(l,R(),!0)),p(V,he)});var ie=i(ve,2),Re=i(r(ie),2);{var be=V=>{var U=Bc(),J=i(nt(U),6),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>{ea(R,t(y)),ea(he,t(F))}),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)},E=V=>{const U=q(()=>Ke(t(y),t(S)));var J=Rc(),R=i(nt(J),4),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,2),xt=i(r(ge)),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`llama-swap / ${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},W=V=>{var U=Fc(),J=i(nt(U),6),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2),ge=i(ye,2),xt=i(r(ge),3),$t=r(xt);z(()=>{ea(R,t(y)),ea(he,t(F)),h($t,t(F))}),w("click",X,Ot=>me(Ot.currentTarget.previousElementSibling)),w("click",ue,Ot=>me(Ot.currentTarget.previousElementSibling)),p(V,U)},_e=V=>{const U=q(()=>Ee(t(y),t(S)));var J=Kc(),R=i(nt(J),4),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,4),xt=i(r(ge)),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`bosgame / ${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},te=V=>{const U=q(()=>ze(t(y),t(S)));var J=Nc(),R=i(nt(J),6),X=r(R),ye=i(X,2),he=r(ye),ue=r(he),ge=i(R,2),xt=i(r(ge),3),$t=r(xt);z(()=>{h(ue,t(U)),h($t,`llama-swap/${t(F)??""}`)}),w("click",X,Ot=>Z(Ot.currentTarget.parentElement)),p(V,J)},Ie=V=>{var U=qc(),J=i(nt(U),4),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>{ea(R,t(y)),ea(he,t(F))}),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)},qe=V=>{var U=Gc(),J=i(nt(U),4),R=r(J),X=i(R,2),ye=i(J,4),he=r(ye),ue=i(he,2);z(()=>ea(R,t(y))),w("click",X,ge=>me(ge.currentTarget.previousElementSibling)),w("click",ue,ge=>me(ge.currentTarget.previousElementSibling)),p(V,U)};L(Re,V=>{t(l)==="janai"?V(be):t(l)==="continue"?V(E,1):t(l)==="antigravity"?V(W,2):t(l)==="zed"?V(_e,3):t(l)==="opencode"?V(te,4):t(l)==="cline"?V(Ie,5):t(l)==="openwebui"&&V(qe,6)})}var Ge=i(ie,2);{var Pe=V=>{const U=q(()=>`curl ${t(y)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${t(Te)}", + "model": "${t(Oe)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var le=Vc(),ce=r(le),Fe=i(r(ce),2),Ne=r(Fe);Qe(Ne,()=>Ut("check"));var Le=i(Ne),me=i(ce,4),_e=r(me),$t=i(_e,2),It=r($t),jt=r(It);P(()=>{h(Le,` „${t(Te)??""}" bereit`),h(jt,t(Y))}),M("click",_e,$n=>Z($n.currentTarget.parentElement)),f(j,le)};K(Je,j=>{t(Te)&&j(Re)})}P(()=>h(q,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),f(A,B)},Rt=A=>{var B=jc(),H=i(r(B),2),de=i(r(H),4);M("click",de,()=>{var re;return(re=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:re.dispatchEvent(new MouseEvent("click"))}),f(A,B)};K(Pt,A=>{t(s).length?A(Dt):A(Rt,-1)})}var Ft=i(Pt,2),At=i(r(Ft),2),Ct=i(r(At)),W=i(At,2);et(W,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],nt,(A,B)=>{var H=N(()=>Hn(B,3));let de=()=>t(H)[0],re=()=>t(H)[1],q=()=>t(H)[2];var G=Uc(),x=r(G),F=r(x),te=i(x,2),we=r(te);P(()=>{Et(G,1,`card-btn${t(v)===de()?" cb-best":""}`),h(F,re()),h(we,q())}),M("click",G,()=>u(v,de(),!0)),f(A,G)});var oe=i(W,2),E=r(oe),z=i(E,2),U=r(z),ge=r(U),R=i(oe,2);{var ne=A=>{var B=Hc();f(A,B)},be=A=>{var B=Jc();f(A,B)},Pe=A=>{var B=Qc();f(A,B)};K(R,A=>{t(v)==="cline"?A(ne):t(v)==="opencode"?A(be,1):A(Pe,-1)})}P(()=>{ea(D,t(y)),h(ge,t(I))}),M("click",ie,A=>{const B=A.currentTarget.previousElementSibling;pe(B)}),M("input",fe,$),dn(fe,()=>t(p),A=>u(p,A)),M("click",Ue,Q),M("click",Ct,A=>{var B;A.preventDefault(),(B=document.querySelector(".nav-item[data-view='memory']"))==null||B.click()}),M("click",E,A=>Z(A.currentTarget.parentElement)),f(e,Ke),Pn()}qn(["click","input","keydown"]);var Xc=m('
'),ev=m('

Für dich: Upgrades

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

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function ov(e,n){zn(n,!0);let a=L(Wt([])),s=L(Wt([])),l=L(!0),o=L("");const d=Q=>Q==="perfect"?"ok":Q==="marginal"?"warn":"bad";function c(Q){const Z=Math.max(0,Date.now()/1e3-Q);return Z<60?Z+"s":Z<3600?Math.floor(Z/60)+"m":Z<86400?Math.floor(Z/3600)+"h":Math.floor(Z/86400)+"d"}async function v(){u(l,!0),u(o,"");try{u(a,(await Ee("/api/news")).items||[],!0)}catch(Q){u(o,Q.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function p(){try{u(s,(await Ee("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function _(Q,Z){var pe;Z.disabled=!0,Z.textContent="Starte…";try{await Ee("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:Q.repo,role:Q.role,params_b:Q.params_b,quant:Q.quant,hf_token:di()})}),(pe=document.querySelector(".nav-item[data-view='activity']"))==null||pe.dispatchEvent(new MouseEvent("click"))}catch(Ce){Z.disabled=!1,Z.textContent="Installieren",alert("Fehler: "+Ce.message)}}function T(){v(),p()}yi(()=>{v(),p()});var b=lv(),y=at(b),$=i(r(y),2),I=i(y,2);{var S=Q=>{var Z=ev(),pe=r(Z),Ce=i(r(pe),2),Ke=r(Ce),je=i(pe,4);et(je,21,()=>t(s),nt,(dt,D)=>{var ie=Xc(),V=r(ie),fe=r(V),ae=r(fe),ze=r(ae),ve=i(ae,2),Ze=r(ve),Ue=i(fe,2),it=r(Ue),He=i(V,2);P(Ye=>{h(ze,t(D).name),Et(ve,1,`fit-badge ${Ye??""}`),h(Ze,t(D).fit.text),h(it,`Ersetzt dein „${t(D).old??""}". ${t(D).why??""}`)},[()=>d(t(D).fit.level)]),M("click",He,Ye=>_(t(D),Ye.currentTarget)),f(dt,ie)}),P(()=>h(Ke,t(s).length)),f(Q,Z)};K(I,Q=>{t(s).length&&Q(S)})}var O=i(I,2);{var Te=Q=>{var Z=tv();f(Q,Z)},ke=Q=>{var Z=nv(),pe=r(Z);P(()=>h(pe,t(o))),f(Q,Z)},xe=Q=>{var Z=av();f(Q,Z)},De=Q=>{var Z=sv();et(Z,21,()=>t(a),nt,(pe,Ce,Ke)=>{var je=rv();Et(je,1,`news-card${Ke===0?" featured":""}`);var dt=r(je),D=r(dt),ie=r(D),V=i(D,2);{var fe=Ue=>{var it=iv();f(Ue,it)};K(V,Ue=>{t(Ce).relevant&&Ue(fe)})}var ae=i(V,2),ze=r(ae),ve=i(dt,2),Ze=r(ve);P(Ue=>{Ea(je,"href",t(Ce).link),h(ie,t(Ce).source),h(ze,Ue),h(Ze,t(Ce).title)},[()=>t(Ce).ts?c(t(Ce).ts):""]),f(pe,je)}),f(Q,Z)};K(O,Q=>{t(l)?Q(Te):t(o)?Q(ke,1):t(a).length?Q(De,-1):Q(xe,2)})}M("click",$,T),f(e,b),Pn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",` +}'`);var J=Vc(),R=r(J),X=i(r(R),2),ye=r(X);Xe(ye,()=>Ut("check"));var he=i(ye),ue=i(R,4),ge=r(ue),xt=i(ge,2),$t=r(xt),Ot=r($t);z(()=>{h(he,` „${t(Oe)??""}" bereit`),h(Ot,t(U))}),w("click",ge,hn=>Z(hn.currentTarget.parentElement)),p(V,J)};L(Ge,V=>{t(Oe)&&V(Pe)})}z(()=>h(Me,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),p(M,K)},Kt=M=>{var K=jc(),Q=i(r(K),2),fe=i(r(Q),4);w("click",fe,()=>{var se;return(se=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:se.dispatchEvent(new MouseEvent("click"))}),p(M,K)};L(Tt,M=>{t(s).length?M(zt):M(Kt,-1)})}var It=i(Tt,2),Dt=i(r(It),2),Lt=i(r(Dt)),j=i(Dt,2);Ze(j,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],et,(M,K)=>{var Q=q(()=>Hn(K,3));let fe=()=>t(Q)[0],se=()=>t(Q)[1],Me=()=>t(Q)[2];var Se=Uc(),C=r(Se),H=r(C),ve=i(C,2),De=r(ve);z(()=>{At(Se,1,`card-btn${t(v)===fe()?" cb-best":""}`),h(H,se()),h(De,Me())}),w("click",Se,()=>u(v,fe(),!0)),p(M,Se)});var ce=i(j,2),A=r(ce),B=i(A,2),ke=r(B),re=r(ke),$=i(ce,2);{var ae=M=>{var K=Hc();p(M,K)},we=M=>{var K=Jc();p(M,K)},Ce=M=>{var K=Qc();p(M,K)};L($,M=>{t(v)==="cline"?M(ae):t(v)==="opencode"?M(we,1):M(Ce,-1)})}z(()=>{ea(D,t(y)),h(re,t(O))}),w("click",le,M=>{const K=M.currentTarget.previousElementSibling;me(K)}),w("input",tt,P),dn(tt,()=>t(f),M=>u(f,M)),w("click",je,Y),w("click",Lt,M=>{var K;M.preventDefault(),(K=document.querySelector(".nav-item[data-view='memory']"))==null||K.click()}),w("click",A,M=>Z(M.currentTarget.parentElement)),p(e,Ve),Pn()}qn(["click","input","keydown"]);var Xc=g('
'),ev=g('

Für dich: Upgrades

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

News

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

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

    Guide

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

    Begriffe kurz erklärt

    ',1);function hv(e,n){zn(n,!0);let a=L(0);function s(p){var _;u(a,p,!0),(_=document.getElementById(`guide-group-${p}`))==null||_.scrollIntoView({behavior:"smooth",block:"start"})}var l=fv(),o=i(at(l),2),d=i(r(o),2);et(d,21,()=>dv,nt,(p,_)=>{var T=N(()=>Hn(t(_),2));let b=()=>t(T)[0],y=()=>t(T)[1];var $=cv(),I=r($),S=r(I),O=i(I,2),Te=r(O);P(()=>{h(S,b()),h(Te,y())}),f(p,$)});var c=i(o,2);et(c,21,()=>es,nt,(p,_,T)=>{var b=vv(),y=r(b);P(()=>{Et(b,1,`guide-tab${t(a)===T?" active":""}`,"svelte-112sh7i"),h(y,t(_).label)}),M("click",b,()=>s(T)),f(p,b)});var v=i(c,2);et(v,17,()=>es,nt,(p,_,T)=>{var b=pv();Ea(b,"id",`guide-group-${T}`);var y=r(b),$=r(y),I=i(y,2);et(I,17,()=>t(_).tutorials,nt,(S,O,Te)=>{var ke=N(()=>Hn(t(O),2));let xe=()=>t(ke)[0],De=()=>t(ke)[1];var Q=uv();Q.open=T===0&&Te===0;var Z=r(Q),pe=r(Z),Ce=i(Z,2);Qe(Ce,De,!0),P(()=>h(pe,xe())),f(S,Q)}),P(()=>h($,t(_).label)),f(p,b)}),f(e,l),Pn()}qn(["click"]);var gv=m('
    '),mv=m('

    Import aus Claude / Gemini / ChatGPT

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

    Neuer Eintrag

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

    Gedächtnis

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

    Wie KI-Tools dieses Gedächtnis nutzen

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

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

    Guide

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

    Begriffe kurz erklärt

    ',1);function hv(e,n){$n(n,!0);let a=I(0);function s(f){var b;u(a,f,!0),(b=document.getElementById(`guide-group-${f}`))==null||b.scrollIntoView({behavior:"smooth",block:"start"})}var l=fv(),o=i(nt(l),2),d=i(r(o),2);Ze(d,21,()=>dv,et,(f,b)=>{var T=q(()=>Hn(t(b),2));let _=()=>t(T)[0],y=()=>t(T)[1];var P=cv(),O=r(P),S=r(O),F=i(O,2),Oe=r(F);z(()=>{h(S,_()),h(Oe,y())}),p(f,P)});var c=i(o,2);Ze(c,21,()=>es,et,(f,b,T)=>{var _=vv(),y=r(_);z(()=>{At(_,1,`guide-tab${t(a)===T?" active":""}`,"svelte-112sh7i"),h(y,t(b).label)}),w("click",_,()=>s(T)),p(f,_)});var v=i(c,2);Ze(v,17,()=>es,et,(f,b,T)=>{var _=pv();Aa(_,"id",`guide-group-${T}`);var y=r(_),P=r(y),O=i(y,2);Ze(O,17,()=>t(b).tutorials,et,(S,F,Oe)=>{var Ee=q(()=>Hn(t(F),2));let ze=()=>t(Ee)[0],Ke=()=>t(Ee)[1];var Y=uv();Y.open=T===0&&Oe===0;var Z=r(Y),me=r(Z),Be=i(Z,2);Xe(Be,Ke,!0),z(()=>h(me,ze())),p(S,Y)}),z(()=>h(P,t(b).label)),p(f,_)}),p(e,l),Pn()}qn(["click"]);var gv=g('
    '),mv=g('

    Import aus Claude / Gemini / ChatGPT

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

    Neuer Eintrag

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

    Gedächtnis

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

    Wie KI-Tools dieses Gedächtnis nutzen

    Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu. Beim Start einer Session lädt der Agent automatisch alle Einträge — er kennt dann deinen Stack, - deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Cv(e,n){zn(n,!0);let a=L(Wt([])),s=L(!0),l=L("all"),o=L(!1),d=L(""),c=L("stable"),v=L(null),p=L(""),_=L("stable"),T=L(!1),b=L(""),y=L("stable"),$=L("import"),I=L(!1);const S=N(()=>t(b).split(` -`).map(W=>W.trim()).filter(W=>W.length>0)),O=N(()=>t(l)==="all"?t(a):t(a).filter(W=>W.category===t(l))),Te={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function ke(W){const oe=Math.floor((Date.now()-new Date(W).getTime())/1e3);return oe<60?"gerade eben":oe<3600?`vor ${Math.floor(oe/60)} Min`:oe<86400?`vor ${Math.floor(oe/3600)} Std`:`vor ${Math.floor(oe/86400)} Tagen`}function xe(W){return t(a).filter(oe=>oe.category===W).length}async function De(){try{u(a,await Ee("/api/memory"),!0)}catch(W){se("Laden fehlgeschlagen: "+W.message,!0)}finally{u(s,!1)}}async function Q(){if(t(d).trim())try{const W=await Ee("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(c),source:"manual"})});u(a,[W,...t(a)],!0),u(d,""),u(c,"stable"),u(o,!1),se("Gespeichert")}catch(W){se("Fehler: "+W.message,!0)}}async function Z(W){try{const oe=await Ee(`/api/memory/${W.id}`,{method:"PUT",body:JSON.stringify({content:t(p),category:t(_)})});u(a,t(a).map(E=>E.id===W.id?oe:E),!0),u(v,null),se("Aktualisiert")}catch(oe){se("Fehler: "+oe.message,!0)}}async function pe(W){if(await yn({title:"Eintrag löschen?",body:`„${W.content.length>80?W.content.slice(0,80)+"…":W.content}" wird dauerhaft entfernt.`,danger:!0}))try{await Ee(`/api/memory/${W.id}`,{method:"DELETE"}),u(a,t(a).filter(E=>E.id!==W.id),!0),se("Gelöscht")}catch(E){se("Fehler: "+E.message,!0)}}function Ce(W){u(v,W.id,!0),u(p,W.content,!0),u(_,W.category,!0)}async function Ke(){if(t(S).length===0)return;u(I,!0);let W=0;for(const oe of t(S))try{const E=await Ee("/api/memory",{method:"POST",body:JSON.stringify({content:oe,category:t(y),source:t($)})});u(a,[E,...t(a)],!0),W++}catch{}u(I,!1),u(T,!1),u(b,""),se(`${W} von ${t(S).length} Einträgen importiert`)}bi(()=>{De()});var je=Av(),dt=at(je),D=i(r(dt),2),ie=r(D),V=r(ie),fe=i(ie,2),ae=r(fe),ze=i(dt,2);{var ve=W=>{var oe=mv(),E=i(r(oe),6);Ea(E,"placeholder",`Tobi arbeitet am liebsten abends. + deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Cv(e,n){$n(n,!0);let a=I(jt([])),s=I(!0),l=I("all"),o=I(!1),d=I(""),c=I("stable"),v=I(null),f=I(""),b=I("stable"),T=I(!1),_=I(""),y=I("stable"),P=I("import"),O=I(!1);const S=q(()=>t(_).split(` +`).map(j=>j.trim()).filter(j=>j.length>0)),F=q(()=>t(l)==="all"?t(a):t(a).filter(j=>j.category===t(l))),Oe={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function Ee(j){const ce=Math.floor((Date.now()-new Date(j).getTime())/1e3);return ce<60?"gerade eben":ce<3600?`vor ${Math.floor(ce/60)} Min`:ce<86400?`vor ${Math.floor(ce/3600)} Std`:`vor ${Math.floor(ce/86400)} Tagen`}function ze(j){return t(a).filter(ce=>ce.category===j).length}async function Ke(){try{u(a,await Te("/api/memory"),!0)}catch(j){pe("Laden fehlgeschlagen: "+j.message,!0)}finally{u(s,!1)}}async function Y(){if(t(d).trim())try{const j=await Te("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(c),source:"manual"})});u(a,[j,...t(a)],!0),u(d,""),u(c,"stable"),u(o,!1),pe("Gespeichert")}catch(j){pe("Fehler: "+j.message,!0)}}async function Z(j){try{const ce=await Te(`/api/memory/${j.id}`,{method:"PUT",body:JSON.stringify({content:t(f),category:t(b)})});u(a,t(a).map(A=>A.id===j.id?ce:A),!0),u(v,null),pe("Aktualisiert")}catch(ce){pe("Fehler: "+ce.message,!0)}}async function me(j){if(await xn({title:"Eintrag löschen?",body:`„${j.content.length>80?j.content.slice(0,80)+"…":j.content}" wird dauerhaft entfernt.`,danger:!0}))try{await Te(`/api/memory/${j.id}`,{method:"DELETE"}),u(a,t(a).filter(A=>A.id!==j.id),!0),pe("Gelöscht")}catch(A){pe("Fehler: "+A.message,!0)}}function Be(j){u(v,j.id,!0),u(f,j.content,!0),u(b,j.category,!0)}async function Ve(){if(t(S).length===0)return;u(O,!0);let j=0;for(const ce of t(S))try{const A=await Te("/api/memory",{method:"POST",body:JSON.stringify({content:ce,category:t(y),source:t(P)})});u(a,[A,...t(a)],!0),j++}catch{}u(O,!1),u(T,!1),u(_,""),pe(`${j} von ${t(S).length} Einträgen importiert`)}bi(()=>{Ke()});var Qe=Av(),vt=nt(Qe),D=i(r(vt),2),le=r(D),Ae=r(le),tt=i(le,2),N=r(tt),oe=i(vt,2);{var de=j=>{var ce=mv(),A=i(r(ce),6);Aa(A,"placeholder",`Tobi arbeitet am liebsten abends. Projektsprache: Deutsch. Bosgame M5 läuft mit Ubuntu 26.04. -...`);var z=i(E,2),U=r(z),ge=i(r(U),2),R=r(ge);R.value=R.__value="user";var ne=i(R);ne.value=ne.__value="instruction";var be=i(ne);be.value=be.__value="stable";var Pe=i(be);Pe.value=Pe.__value="versioned";var A=i(Pe);A.value=A.__value="ephemeral";var B=i(U,2),H=i(r(B),2),de=r(H);de.value=de.__value="import";var re=i(de);re.value=re.__value="claude";var q=i(re);q.value=q.__value="gemini";var G=i(q);G.value=G.__value="chatgpt";var x=i(G);x.value=x.__value="manual";var F=i(z,2);{var te=Xe=>{var C=gv(),J=r(C);P(()=>h(J,`${t(S).length??""} Eintrag/Einträge erkannt`)),f(Xe,C)};K(F,Xe=>{t(S).length>0&&Xe(te)})}var we=i(F,2),ye=r(we),ct=r(ye),mt=i(ye,2);P(()=>{ye.disabled=t(S).length===0||t(I),h(ct,t(I)?"Importiere…":`${t(S).length} Einträge speichern`)}),dn(E,()=>t(b),Xe=>u(b,Xe)),Jn(ge,()=>t(y),Xe=>u(y,Xe)),Jn(H,()=>t($),Xe=>u($,Xe)),M("click",ye,Ke),M("click",mt,()=>{u(T,!1),u(b,"")}),f(W,oe)};K(ze,W=>{t(T)&&W(ve)})}var Ze=i(ze,2);{var Ue=W=>{var oe=bv(),E=i(r(oe),4),z=i(E,4),U=r(z);U.value=U.__value="user";var ge=i(U);ge.value=ge.__value="instruction";var R=i(ge);R.value=R.__value="stable";var ne=i(R);ne.value=ne.__value="versioned";var be=i(ne);be.value=be.__value="ephemeral";var Pe=i(z,2),A=r(Pe),B=i(A,2);P(H=>A.disabled=H,[()=>!t(d).trim()]),M("keydown",E,H=>{H.key==="Enter"&&(H.ctrlKey||H.metaKey)&&Q()}),dn(E,()=>t(d),H=>u(d,H)),Jn(z,()=>t(c),H=>u(c,H)),M("click",A,Q),M("click",B,()=>{u(o,!1),u(d,"")}),f(W,oe)};K(Ze,W=>{t(o)&&W(Ue)})}var it=i(Ze,2),He=r(it),Ye=i(r(He),2);et(Ye,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",xe("user")],["instruction","Verhalten","#fb923c",xe("instruction")],["stable","Stabil","var(--accent)",xe("stable")],["versioned","Versioniert","#f59e0b",xe("versioned")],["ephemeral","Temporär","var(--mut)",xe("ephemeral")]],nt,(W,oe)=>{var E=N(()=>Hn(t(oe),4));let z=()=>t(E)[0],U=()=>t(E)[1],ge=()=>t(E)[2],R=()=>t(E)[3];var ne=_v(),be=r(ne),Pe=i(be),A=r(Pe);P(()=>{zt(ne,`cursor:pointer;${t(l)===z()?`background:rgba(45,212,191,.12);border-color:${ge()||"var(--accent)"};color:${ge()||"var(--accent)"}`:""}`),h(be,`${U()??""} `),h(A,R())}),M("click",ne,()=>u(l,z(),!0)),M("keydown",ne,B=>B.key==="Enter"&&u(l,z(),!0)),f(W,ne)});var gt=i(it,2);{var Pt=W=>{var oe=yv();f(W,oe)},Dt=W=>{var oe=xv(),E=r(oe),z=r(E),U=r(z),ge=i(z,2),R=r(ge),ne=i(ge,2);{var be=Pe=>{var A=kv();M("click",A,()=>u(o,!0)),f(Pe,A)};K(ne,Pe=>{t(a).length===0&&Pe(be)})}P(()=>{h(U,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(R,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),f(W,oe)},Rt=W=>{var oe=Ev();et(oe,23,()=>t(O),E=>E.id,(E,z,U)=>{var ge=Mv(),R=r(ge);{var ne=Pe=>{var A=wv(),B=at(A),H=i(B,2),de=r(H);de.value=de.__value="user";var re=i(de);re.value=re.__value="instruction";var q=i(re);q.value=q.__value="stable";var G=i(q);G.value=G.__value="versioned";var x=i(G);x.value=x.__value="ephemeral";var F=i(H,2),te=r(F),we=i(te,2);dn(B,()=>t(p),ye=>u(p,ye)),Jn(H,()=>t(_),ye=>u(_,ye)),M("click",te,()=>Z(t(z))),M("click",we,()=>u(v,null)),f(Pe,A)},be=Pe=>{var A=Sv(),B=r(A),H=r(B),de=r(H),re=i(H,2),q=r(re),G=r(q),x=i(q,2),F=r(x),te=i(x,2),we=r(te),ye=i(B,2),ct=r(ye),mt=i(ct,2);P(Xe=>{var C,J,Ie;h(de,t(z).content),zt(q,`border-color:${(((C=Te[t(z).category])==null?void 0:C.color)||"var(--mut)")??""};color:${(((J=Te[t(z).category])==null?void 0:J.color)||"var(--mut)")??""}`),h(G,((Ie=Te[t(z).category])==null?void 0:Ie.label)||t(z).category),h(F,t(z).source),h(we,Xe)},[()=>ke(t(z).updated_at)]),M("click",ct,()=>Ce(t(z))),M("click",mt,()=>pe(t(z))),f(Pe,A)};K(R,Pe=>{t(v)===t(z).id?Pe(ne):Pe(be,-1)})}P(()=>zt(ge,`padding:14px 16px;${t(U){t(s)?W(Pt):t(O).length===0?W(Dt,1):W(Rt,-1)})}var Ft=i(gt,2),At=i(r(Ft),2),Ct=i(r(At),3);P(()=>{h(V,t(T)?"Abbrechen":"⇩ Import"),h(ae,t(o)?"Abbrechen":"+ Eintrag")}),M("click",ie,()=>{u(T,!t(T)),u(o,!1),u(b,"")}),M("click",fe,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),M("click",Ct,W=>{var oe;W.preventDefault(),(oe=document.querySelector(".nav-item[data-view='connect']"))==null||oe.click()}),f(e,je),Pn()}qn(["click","keydown"]);var ts=m(' '),Tv=m(`
    Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B. - „Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades".
    `),zv=m(' '),Pv=m(`
    `),$v=m('
    '),Dv=m('
    Keine Skills geladen (oder Agent offline).
    '),Iv=m(' '),Lv=m(' '),Ov=m('
    '),Bv=m('
    '),Rv=m('

    Agent-Cockpit

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

    Hermes Setup-Wizard

    Whisper (Sprache → Text)
    faster-whisper muss auf dem Bosgame installiert sein
    Piper TTS (Text → Sprache)
    Piper-Binary + deutsche Stimme
    Windows SSH-Verbindung
    Damit Hermes Dateien auf deinem Windows-PC ändern kann
    '),Wv=m(''),jv=m(`
    Hermes-Agent offline
    Der Hermes-Gateway (:8642) bzw. das Dashboard (:9119) ist nicht erreichbar. - Status im Cockpit prüfen oder den Dienst neu starten.
    `),Uv=m('

    Hermes

    ',1);function Hv(e,n){zn(n,!0);let a=L(null),s=L(!1),l=L(!1),o=L(!1),d=L(null),c=L(Wt([])),v=L(Wt([])),p=L("");async function _(){try{u(a,await Ee("/api/hermes/status"),!0)}catch{u(a,null)}}async function T(){try{const V=await Ee("/api/hermes/pubkey");u(p,V.pubkey,!0)}catch{u(p,"")}}async function b(){u(o,!0);try{const[V,fe,ae]=await Promise.all([Ee("/api/hermes/agent"),Ee("/api/hermes/cron"),Ee("/api/hermes/skills")]);u(d,V,!0),u(c,fe.jobs||[],!0),u(v,ae.skills||[],!0)}catch{u(d,null)}u(o,!1)}let y=N(()=>[...t(v)].sort((V,fe)=>(fe.use_count||0)-(V.use_count||0)||(V.name||"").localeCompare(fe.name||""))),$=N(()=>t(v).filter(V=>(V.status||"").includes("enabled")).length);function I(){var V;(V=navigator.clipboard)==null||V.writeText(t(p)),se("SSH-Key kopiert")}bi(()=>{_()});var S=Uv(),O=at(S),Te=i(r(O),2),ke=r(Te),xe=r(ke),De=i(ke,2),Q=i(De,2),Z=i(O,2);{var pe=V=>{var fe=Rv(),ae=r(fe),ze=i(r(ae),2),ve=r(ze),Ze=i(ae,2),Ue=r(Ze),it=i(r(Ue),2),He=r(it),Ye=r(He),gt=i(He,2),Pt=r(gt),Dt=i(gt,2);{var Rt=q=>{var G=ts(),x=r(G);P(()=>h(x,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),f(q,G)};K(Dt,q=>{var G;((G=t(d))==null?void 0:G.heartbeat_age_s)!=null&&q(Rt)})}var Ft=i(Dt,2);{var At=q=>{var G=ts(),x=r(G);P(F=>{Ea(G,"title",t(d).version),h(x,F)},[()=>t(d).version.split(" · ")[0]]),f(q,G)};K(Ft,q=>{var G;(G=t(d))!=null&&G.version&&q(At)})}var Ct=i(Ze,2),W=r(Ct),oe=r(W),E=i(r(oe)),z=r(E),U=i(W,2);{var ge=q=>{var G=Tv();f(q,G)},R=q=>{var G=$v();et(G,21,()=>t(c),nt,(x,F)=>{var te=Pv();et(te,21,()=>Object.entries(t(F)),nt,(we,ye)=>{var ct=N(()=>Hn(t(ye),2));let mt=()=>t(ct)[0],Xe=()=>t(ct)[1];var C=ja(),J=at(C);{var Ie=ue=>{var Se=zv(),Oe=r(Se),Je=r(Oe),Re=i(Oe);P(()=>{h(Je,`${mt()??""}:`),h(Re,` ${Xe()??""}`)}),f(ue,Se)};K(J,ue=>{Xe()&&ue(Ie)})}f(we,C)}),f(x,te)}),f(q,G)};K(U,q=>{t(c).length===0?q(ge):q(R,-1)})}var ne=i(Ct,2),be=r(ne),Pe=r(be),A=i(r(Pe)),B=r(A),H=i(be,2);{var de=q=>{var G=Dv();f(q,G)},re=q=>{var G=Bv();et(G,21,()=>t(y),nt,(x,F)=>{var te=Ov(),we=r(te),ye=i(we,2),ct=r(ye),mt=i(ye,2);{var Xe=Se=>{var Oe=Iv(),Je=r(Oe);P(()=>h(Je,t(F).category)),f(Se,Oe)};K(mt,Se=>{t(F).category&&Se(Xe)})}var C=i(mt,4);{var J=Se=>{var Oe=Lv(),Je=r(Oe);P(()=>h(Je,`${t(F).use_count??""}× genutzt`)),f(Se,Oe)};K(C,Se=>{t(F).use_count>0&&Se(J)})}var Ie=i(C,2),ue=r(Ie);P((Se,Oe)=>{zt(te,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; - border-radius:6px;${Se??""}`),zt(we,`width:7px;height:7px;border-radius:50%;flex-shrink:0; - background:${Oe??""}`),h(ct,t(F).name),h(ue,t(F).source)},[()=>(t(F).status||"").includes("enabled")?"":"opacity:.45",()=>(t(F).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),f(x,te)}),f(q,G)};K(H,q=>{t(v).length===0?q(de):q(re,-1)})}P(()=>{var q,G,x,F;h(ve,t(o)?"…":"↻ Aktualisieren"),zt(He,`font-size:11px;${((q=t(d))==null?void 0:q.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(Ye,`● ${((G=t(d))==null?void 0:G.gateway_state)??"offline"??""}`),zt(gt,`font-size:11px;${(x=t(d))!=null&&x.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Pt,`⏱ Scheduler ${(F=t(d))!=null&&F.cron_running?"läuft":"inaktiv"}`),h(z,`(${t(c).length??""})`),h(B,`(${t($)??""} aktiv von ${t(v).length??""})`)}),M("click",ze,b),f(V,fe)};K(Z,V=>{t(l)&&V(pe)})}var Ce=i(Z,2);{var Ke=V=>{var fe=Vv(),ae=i(r(fe),2),ze=r(ae),ve=i(r(ze),2),Ze=r(ve),Ue=i(ze,2);{var it=z=>{var U=Fv();f(z,U)};K(Ue,z=>{var U;((U=t(a))==null?void 0:U.whisper)==="not_installed"&&z(it)})}var He=i(ae,2),Ye=r(He),gt=i(r(Ye),2),Pt=r(gt),Dt=i(Ye,2);{var Rt=z=>{var U=Kv(),ge=r(U),R=r(ge);P(ne=>h(R,ne),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` -`)]),f(z,U)};K(Dt,z=>{var U;((U=t(a))==null?void 0:U.piper)!=="ready"&&z(Rt)})}var Ft=i(He,2),At=r(Ft),Ct=i(r(At),2),W=r(Ct),oe=i(At,2);{var E=z=>{var U=Gv(),ge=i(r(U),4),R=i(r(ge),2),ne=r(R);ne.textContent=`Start-Service sshd -Set-Service -Name sshd -StartupType Automatic`;var be=i(ge,2),Pe=i(r(be),2),A=r(Pe);A.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var B=i(be,2);{var H=q=>{var G=Nv(),x=i(r(G),2),F=r(x),te=i(F,2),we=r(te),ye=r(we);P(()=>h(ye,'echo "'+t(p)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),M("click",F,I),f(q,G)},de=q=>{var G=qv();f(q,G)};K(B,q=>{t(p)?q(H):q(de,-1)})}var re=i(B,4);M("click",re,()=>{_(),se("Status aktualisiert")}),f(z,U)};K(oe,z=>{var U;(U=t(a))!=null&&U.ssh_ok||z(E)})}P(()=>{var z,U,ge,R,ne,be;zt(ve,`font-size:11px;${((z=t(a))==null?void 0:z.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),h(Ze,((U=t(a))==null?void 0:U.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),zt(gt,`font-size:11px;${((ge=t(a))==null?void 0:ge.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),h(Pt,((R=t(a))==null?void 0:R.piper)==="ready"?"✓ OK":"✗ fehlt"),zt(Ct,`font-size:11px;${(ne=t(a))!=null&&ne.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),h(W,(be=t(a))!=null&&be.ssh_ok?"✓ verbunden":"optional")}),f(V,fe)};K(Ce,V=>{t(s)&&V(Ke)})}var je=i(Ce,2),dt=r(je);{var D=V=>{var fe=Wv();f(V,fe)},ie=V=>{var fe=jv();f(V,fe)};K(dt,V=>{var fe;((fe=t(a))==null?void 0:fe.hermes)==="ready"?V(D):V(ie,-1)})}P(()=>{var V,fe;zt(ke,`font-size:11px;${((V=t(a))==null?void 0:V.hermes)==="ready"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(xe,`● Agent: ${((fe=t(a))==null?void 0:fe.hermes)==="ready"?"online":"offline"}`),zt(De,`padding:4px 10px;font-size:12px;${t(l)?"border-color:var(--accent);color:var(--accent)":""}`)}),M("click",De,()=>{u(l,!t(l)),t(l)&&b()}),M("click",Q,()=>{u(s,!t(s)),t(s)&&(_(),T())}),f(e,S),Pn()}qn(["click"]);let ns={};function Jv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function as(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),is("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(p=>d.includes(p.state));if(s)if(c){const p=(l=c.meta)!=null&&l.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",_=c.state==="loading"||c.state==="starting"?' lädt…':"";s.innerHTML=`${c.name}${p}${_}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?Xv():is(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const v={};for(const p of e.models||[])v[p.name]=p.state;for(const[p,_]of Object.entries(v)){const T=ns[p];if(T&&T!==_&&(_==="running"||_==="loading")){Jv();break}}ns=v}Qv(e),ki.set(e)}function Qv(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Zv(e){pa.set(e||[])}function Yv(e){$r.set(e)}function is(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function Xv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const eu=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>eu(a),l}async function il(){try{const e=await Ee("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Vi(){try{as(await Ee("/api/status"))}catch{as(null)}}async function rl(){try{Zv(await Ee("/api/jobs"))}catch{}}function sl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{Yv(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(sl,3e3)},n.onerror=()=>n.close()}var cs;((cs=document.getElementById("logo"))==null?void 0:cs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Gi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Gi[e.dataset.ic||""]||""});const tu=[["overview",pd],["models",Cd],["activity",Fd],["server",Jd],["cookbook",Pc],["connect",Yc],["news",ov],["guides",hv],["memory",Cv],["hermes",Hv]];for(const[e,n]of tu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Eo(n,{target:a})}Ho("overview");const ar=document.getElementById("token");ar&&(ar.value=al(),ar.addEventListener("change",e=>{Go(e.target.value),Vi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=di(),ir.addEventListener("change",e=>Wo(e.target.value)));const rs=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),ss=document.getElementById("sm-close");rs&&rr&&ss&&(rs.addEventListener("click",()=>rr.style.display="flex"),ss.addEventListener("click",()=>rr.style.display="none"));function nu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Vi);Vi();rl();sl();setInterval(nu,1e3);setInterval(Vi,3e3);setInterval(rl,1500);il();setInterval(il,6e4); +...`);var B=i(A,2),ke=r(B),re=i(r(ke),2),$=r(re);$.value=$.__value="user";var ae=i($);ae.value=ae.__value="instruction";var we=i(ae);we.value=we.__value="stable";var Ce=i(we);Ce.value=Ce.__value="versioned";var M=i(Ce);M.value=M.__value="ephemeral";var K=i(ke,2),Q=i(r(K),2),fe=r(Q);fe.value=fe.__value="import";var se=i(fe);se.value=se.__value="claude";var Me=i(se);Me.value=Me.__value="gemini";var Se=i(Me);Se.value=Se.__value="chatgpt";var C=i(Se);C.value=C.__value="manual";var H=i(B,2);{var ve=be=>{var E=gv(),W=r(E);z(()=>h(W,`${t(S).length??""} Eintrag/Einträge erkannt`)),p(be,E)};L(H,be=>{t(S).length>0&&be(ve)})}var De=i(H,2),G=r(De),ie=r(G),Re=i(G,2);z(()=>{G.disabled=t(S).length===0||t(O),h(ie,t(O)?"Importiere…":`${t(S).length} Einträge speichern`)}),dn(A,()=>t(_),be=>u(_,be)),Jn(re,()=>t(y),be=>u(y,be)),Jn(Q,()=>t(P),be=>u(P,be)),w("click",G,Ve),w("click",Re,()=>{u(T,!1),u(_,"")}),p(j,ce)};L(oe,j=>{t(T)&&j(de)})}var He=i(oe,2);{var je=j=>{var ce=bv(),A=i(r(ce),4),B=i(A,4),ke=r(B);ke.value=ke.__value="user";var re=i(ke);re.value=re.__value="instruction";var $=i(re);$.value=$.__value="stable";var ae=i($);ae.value=ae.__value="versioned";var we=i(ae);we.value=we.__value="ephemeral";var Ce=i(B,2),M=r(Ce),K=i(M,2);z(Q=>M.disabled=Q,[()=>!t(d).trim()]),w("keydown",A,Q=>{Q.key==="Enter"&&(Q.ctrlKey||Q.metaKey)&&Y()}),dn(A,()=>t(d),Q=>u(d,Q)),Jn(B,()=>t(c),Q=>u(c,Q)),w("click",M,Y),w("click",K,()=>{u(o,!1),u(d,"")}),p(j,ce)};L(He,j=>{t(o)&&j(je)})}var at=i(He,2),st=r(at),it=i(r(st),2);Ze(it,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",ze("user")],["instruction","Verhalten","#fb923c",ze("instruction")],["stable","Stabil","var(--accent)",ze("stable")],["versioned","Versioniert","#f59e0b",ze("versioned")],["ephemeral","Temporär","var(--mut)",ze("ephemeral")]],et,(j,ce)=>{var A=q(()=>Hn(t(ce),4));let B=()=>t(A)[0],ke=()=>t(A)[1],re=()=>t(A)[2],$=()=>t(A)[3];var ae=_v(),we=r(ae),Ce=i(we),M=r(Ce);z(()=>{Ct(ae,`cursor:pointer;${t(l)===B()?`background:rgba(45,212,191,.12);border-color:${re()||"var(--accent)"};color:${re()||"var(--accent)"}`:""}`),h(we,`${ke()??""} `),h(M,$())}),w("click",ae,()=>u(l,B(),!0)),w("keydown",ae,K=>K.key==="Enter"&&u(l,B(),!0)),p(j,ae)});var mt=i(at,2);{var Tt=j=>{var ce=yv();p(j,ce)},zt=j=>{var ce=kv(),A=r(ce),B=r(A),ke=r(B),re=i(B,2),$=r(re),ae=i(re,2);{var we=Ce=>{var M=xv();w("click",M,()=>u(o,!0)),p(Ce,M)};L(ae,Ce=>{t(a).length===0&&Ce(we)})}z(()=>{h(ke,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h($,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),p(j,ce)},Kt=j=>{var ce=Ev();Ze(ce,23,()=>t(F),A=>A.id,(A,B,ke)=>{var re=Mv(),$=r(re);{var ae=Ce=>{var M=wv(),K=nt(M),Q=i(K,2),fe=r(Q);fe.value=fe.__value="user";var se=i(fe);se.value=se.__value="instruction";var Me=i(se);Me.value=Me.__value="stable";var Se=i(Me);Se.value=Se.__value="versioned";var C=i(Se);C.value=C.__value="ephemeral";var H=i(Q,2),ve=r(H),De=i(ve,2);dn(K,()=>t(f),G=>u(f,G)),Jn(Q,()=>t(b),G=>u(b,G)),w("click",ve,()=>Z(t(B))),w("click",De,()=>u(v,null)),p(Ce,M)},we=Ce=>{var M=Sv(),K=r(M),Q=r(K),fe=r(Q),se=i(Q,2),Me=r(se),Se=r(Me),C=i(Me,2),H=r(C),ve=i(C,2),De=r(ve),G=i(K,2),ie=r(G),Re=i(ie,2);z(be=>{var E,W,_e;h(fe,t(B).content),Ct(Me,`border-color:${(((E=Oe[t(B).category])==null?void 0:E.color)||"var(--mut)")??""};color:${(((W=Oe[t(B).category])==null?void 0:W.color)||"var(--mut)")??""}`),h(Se,((_e=Oe[t(B).category])==null?void 0:_e.label)||t(B).category),h(H,t(B).source),h(De,be)},[()=>Ee(t(B).updated_at)]),w("click",ie,()=>Be(t(B))),w("click",Re,()=>me(t(B))),p(Ce,M)};L($,Ce=>{t(v)===t(B).id?Ce(ae):Ce(we,-1)})}z(()=>Ct(re,`padding:14px 16px;${t(ke){t(s)?j(Tt):t(F).length===0?j(zt,1):j(Kt,-1)})}var It=i(mt,2),Dt=i(r(It),2),Lt=i(r(Dt),3);z(()=>{h(Ae,t(T)?"Abbrechen":"⇩ Import"),h(N,t(o)?"Abbrechen":"+ Eintrag")}),w("click",le,()=>{u(T,!t(T)),u(o,!1),u(_,"")}),w("click",tt,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),w("click",Lt,j=>{var ce;j.preventDefault(),(ce=document.querySelector(".nav-item[data-view='connect']"))==null||ce.click()}),p(e,Qe),Pn()}qn(["click","keydown"]);var ts=g(' '),Tv=g(' Sessions'),zv=g(' Nachrichten'),$v=g(' Tool-Calls'),Pv=g(' Tokens'),Dv=g(' aktiv'),Iv=g('
    '),Lv=g('
    Meistgenutzte Tools
    ',1),Ov=g('
    Aktivität (letzte 30 Tage)
    '),Bv=g('
  3. '),Rv=g('
      '),Fv=g('
      '),Kv=g('
      Was Hermes über dich gelernt hat (automatisches Profil)
      '),Nv=g(`
      Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B. + „Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades".
      `),qv=g(' '),Gv=g(`
      `),Vv=g('
      '),Wv=g('
      Keine Skills geladen (oder Agent offline).
      '),jv=g(' '),Uv=g(' '),Hv=g('
      '),Jv=g('
      '),Qv=g('

      Agent-Cockpit

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

      Hermes Setup-Wizard

      Whisper (Sprache → Text)
      faster-whisper muss auf dem Bosgame installiert sein
      Piper TTS (Text → Sprache)
      Piper-Binary + deutsche Stimme
      Windows SSH-Verbindung
      Damit Hermes Dateien auf deinem Windows-PC ändern kann
      '),au=g(''),iu=g(`
      Hermes-Agent offline
      Der Hermes-Gateway (:8642) bzw. das Dashboard (:9119) ist nicht erreichbar. + Status im Cockpit prüfen oder den Dienst neu starten.
      `),ru=g('

      Hermes

      ',1);function su(e,n){$n(n,!0);let a=I(null),s=I(!1),l=I(!1),o=I(!1),d=I(null),c=I(jt([])),v=I(jt([])),f=I(null),b=I(null),T=I("");async function _(){try{u(a,await Te("/api/hermes/status"),!0)}catch{u(a,null)}}async function y(){try{const N=await Te("/api/hermes/pubkey");u(T,N.pubkey,!0)}catch{u(T,"")}}async function P(){u(o,!0);try{const[N,oe,de,He,je]=await Promise.all([Te("/api/hermes/agent"),Te("/api/hermes/cron"),Te("/api/hermes/skills"),Te("/api/hermes/learned"),Te("/api/hermes/insights")]);u(d,N,!0),u(c,oe.jobs||[],!0),u(v,de.skills||[],!0),u(f,He,!0),u(b,je,!0)}catch{u(d,null)}u(o,!1)}let O=q(()=>[...t(v)].sort((N,oe)=>(oe.use_count||0)-(N.use_count||0)||(N.name||"").localeCompare(oe.name||""))),S=q(()=>t(v).filter(N=>(N.status||"").includes("enabled")).length);function F(){var N;(N=navigator.clipboard)==null||N.writeText(t(T)),pe("SSH-Key kopiert")}bi(()=>{_()});var Oe=ru(),Ee=nt(Oe),ze=i(r(Ee),2),Ke=r(ze),Y=r(Ke),Z=i(Ke,2),me=i(Z,2),Be=i(Ee,2);{var Ve=N=>{var oe=Qv(),de=r(oe),He=i(r(de),2),je=r(He),at=i(de,2),st=r(at),it=i(r(st),2),mt=r(it),Tt=r(mt),zt=i(mt,2),Kt=r(zt),It=i(zt,2);{var Dt=G=>{var ie=ts(),Re=r(ie);z(()=>h(Re,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),p(G,ie)};L(It,G=>{var ie;((ie=t(d))==null?void 0:ie.heartbeat_age_s)!=null&&G(Dt)})}var Lt=i(It,2);{var j=G=>{var ie=ts(),Re=r(ie);z(be=>{Aa(ie,"title",t(d).version),h(Re,be)},[()=>t(d).version.split(" · ")[0]]),p(G,ie)};L(Lt,G=>{var ie;(ie=t(d))!=null&&ie.version&&G(j)})}var ce=i(at,2);{var A=G=>{var ie=Ov(),Re=i(r(ie),2),be=r(Re);{var E=R=>{var X=Tv(),ye=r(X),he=r(ye);z(()=>h(he,t(b).sessions)),p(R,X)};L(be,R=>{t(b).sessions&&R(E)})}var W=i(be,2);{var _e=R=>{var X=zv(),ye=r(X),he=r(ye);z(()=>h(he,t(b).messages)),p(R,X)};L(W,R=>{t(b).messages&&R(_e)})}var te=i(W,2);{var Ie=R=>{var X=$v(),ye=r(X),he=r(ye);z(()=>h(he,t(b).tool_calls)),p(R,X)};L(te,R=>{t(b).tool_calls&&R(Ie)})}var qe=i(te,2);{var Ge=R=>{var X=Pv(),ye=r(X),he=r(ye);z(()=>h(he,t(b).total_tokens)),p(R,X)};L(qe,R=>{t(b).total_tokens&&R(Ge)})}var Pe=i(qe,2);{var V=R=>{var X=Dv(),ye=r(X),he=r(ye);z(()=>h(he,t(b).active_time)),p(R,X)};L(Pe,R=>{t(b).active_time&&R(V)})}var U=i(Re,2);{var J=R=>{var X=Lv(),ye=i(nt(X),2);Ze(ye,21,()=>t(b).top_tools.slice(0,6),et,(he,ue)=>{var ge=Iv(),xt=r(ge),$t=r(xt),Ot=i(xt,2),hn=r(Ot),da=i(Ot,2),x=r(da);z(()=>{h($t,t(ue).name),Ct(hn,`display:block;height:100%;width:${t(ue).pct??""}%;background:var(--accent)`),h(x,`${t(ue).calls??""}× · ${t(ue).pct??""}%`)}),p(he,ge)}),p(R,X)};L(U,R=>{var X;(X=t(b).top_tools)!=null&&X.length&&R(J)})}p(G,ie)};L(ce,G=>{t(b)&&(t(b).sessions||t(b).total_tokens)&&G(A)})}var B=i(ce,2);{var ke=G=>{var ie=Kv(),Re=i(r(ie),2);{var be=_e=>{var te=Rv();Ze(te,21,()=>t(f).user_facts,et,(Ie,qe)=>{var Ge=Bv(),Pe=r(Ge);z(()=>h(Pe,t(qe))),p(Ie,Ge)}),p(_e,te)};L(Re,_e=>{var te;(te=t(f).user_facts)!=null&&te.length&&_e(be)})}var E=i(Re,2);{var W=_e=>{var te=Fv(),Ie=r(te);z(()=>h(Ie,t(f).memory)),p(_e,te)};L(E,_e=>{t(f).memory&&_e(W)})}p(G,ie)};L(B,G=>{var ie,Re,be;((Re=(ie=t(f))==null?void 0:ie.user_facts)!=null&&Re.length||(be=t(f))!=null&&be.memory)&&G(ke)})}var re=i(B,2),$=r(re),ae=r($),we=i(r(ae)),Ce=r(we),M=i($,2);{var K=G=>{var ie=Nv();p(G,ie)},Q=G=>{var ie=Vv();Ze(ie,21,()=>t(c),et,(Re,be)=>{var E=Gv();Ze(E,21,()=>Object.entries(t(be)),et,(W,_e)=>{var te=q(()=>Hn(t(_e),2));let Ie=()=>t(te)[0],qe=()=>t(te)[1];var Ge=Ua(),Pe=nt(Ge);{var V=U=>{var J=qv(),R=r(J),X=r(R),ye=i(R);z(()=>{h(X,`${Ie()??""}:`),h(ye,` ${qe()??""}`)}),p(U,J)};L(Pe,U=>{qe()&&U(V)})}p(W,Ge)}),p(Re,E)}),p(G,ie)};L(M,G=>{t(c).length===0?G(K):G(Q,-1)})}var fe=i(re,2),se=r(fe),Me=r(se),Se=i(r(Me)),C=r(Se),H=i(se,2);{var ve=G=>{var ie=Wv();p(G,ie)},De=G=>{var ie=Jv();Ze(ie,21,()=>t(O),et,(Re,be)=>{var E=Hv(),W=r(E),_e=i(W,2),te=r(_e),Ie=i(_e,2);{var qe=J=>{var R=jv(),X=r(R);z(()=>h(X,t(be).category)),p(J,R)};L(Ie,J=>{t(be).category&&J(qe)})}var Ge=i(Ie,4);{var Pe=J=>{var R=Uv(),X=r(R);z(()=>h(X,`${t(be).use_count??""}× genutzt`)),p(J,R)};L(Ge,J=>{t(be).use_count>0&&J(Pe)})}var V=i(Ge,2),U=r(V);z((J,R)=>{Ct(E,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; + border-radius:6px;${J??""}`),Ct(W,`width:7px;height:7px;border-radius:50%;flex-shrink:0; + background:${R??""}`),h(te,t(be).name),h(U,t(be).source)},[()=>(t(be).status||"").includes("enabled")?"":"opacity:.45",()=>(t(be).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),p(Re,E)}),p(G,ie)};L(H,G=>{t(v).length===0?G(ve):G(De,-1)})}z(()=>{var G,ie,Re,be;h(je,t(o)?"…":"↻ Aktualisieren"),Ct(mt,`font-size:11px;${((G=t(d))==null?void 0:G.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(Tt,`● ${((ie=t(d))==null?void 0:ie.gateway_state)??"offline"??""}`),Ct(zt,`font-size:11px;${(Re=t(d))!=null&&Re.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Kt,`⏱ Scheduler ${(be=t(d))!=null&&be.cron_running?"läuft":"inaktiv"}`),h(Ce,`(${t(c).length??""})`),h(C,`(${t(S)??""} aktiv von ${t(v).length??""})`)}),w("click",He,P),p(N,oe)};L(Be,N=>{t(l)&&N(Ve)})}var Qe=i(Be,2);{var vt=N=>{var oe=nu(),de=i(r(oe),2),He=r(de),je=i(r(He),2),at=r(je),st=i(He,2);{var it=re=>{var $=Zv();p(re,$)};L(st,re=>{var $;(($=t(a))==null?void 0:$.whisper)==="not_installed"&&re(it)})}var mt=i(de,2),Tt=r(mt),zt=i(r(Tt),2),Kt=r(zt),It=i(Tt,2);{var Dt=re=>{var $=Yv(),ae=r($),we=r(ae);z(Ce=>h(we,Ce),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` +`)]),p(re,$)};L(It,re=>{var $;(($=t(a))==null?void 0:$.piper)!=="ready"&&re(Dt)})}var Lt=i(mt,2),j=r(Lt),ce=i(r(j),2),A=r(ce),B=i(j,2);{var ke=re=>{var $=tu(),ae=i(r($),4),we=i(r(ae),2),Ce=r(we);Ce.textContent=`Start-Service sshd +Set-Service -Name sshd -StartupType Automatic`;var M=i(ae,2),K=i(r(M),2),Q=r(K);Q.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var fe=i(M,2);{var se=C=>{var H=Xv(),ve=i(r(H),2),De=r(ve),G=i(De,2),ie=r(G),Re=r(ie);z(()=>h(Re,'echo "'+t(T)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),w("click",De,F),p(C,H)},Me=C=>{var H=eu();p(C,H)};L(fe,C=>{t(T)?C(se):C(Me,-1)})}var Se=i(fe,4);w("click",Se,()=>{_(),pe("Status aktualisiert")}),p(re,$)};L(B,re=>{var $;($=t(a))!=null&&$.ssh_ok||re(ke)})}z(()=>{var re,$,ae,we,Ce,M;Ct(je,`font-size:11px;${((re=t(a))==null?void 0:re.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),h(at,(($=t(a))==null?void 0:$.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),Ct(zt,`font-size:11px;${((ae=t(a))==null?void 0:ae.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),h(Kt,((we=t(a))==null?void 0:we.piper)==="ready"?"✓ OK":"✗ fehlt"),Ct(ce,`font-size:11px;${(Ce=t(a))!=null&&Ce.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),h(A,(M=t(a))!=null&&M.ssh_ok?"✓ verbunden":"optional")}),p(N,oe)};L(Qe,N=>{t(s)&&N(vt)})}var D=i(Qe,2),le=r(D);{var Ae=N=>{var oe=au();p(N,oe)},tt=N=>{var oe=iu();p(N,oe)};L(le,N=>{var oe;((oe=t(a))==null?void 0:oe.hermes)==="ready"?N(Ae):N(tt,-1)})}z(()=>{var N,oe;Ct(Ke,`font-size:11px;${((N=t(a))==null?void 0:N.hermes)==="ready"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(Y,`● Agent: ${((oe=t(a))==null?void 0:oe.hermes)==="ready"?"online":"offline"}`),Ct(Z,`padding:4px 10px;font-size:12px;${t(l)?"border-color:var(--accent);color:var(--accent)":""}`)}),w("click",Z,()=>{u(l,!t(l)),t(l)&&P()}),w("click",me,()=>{u(s,!t(s)),t(s)&&(_(),y())}),p(e,Oe),Pn()}qn(["click"]);let ns={};function lu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function as(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),is("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(f=>d.includes(f.state));if(s)if(c){const f=(l=c.meta)!=null&&l.ctx?` · ${Math.round(c.meta.ctx/1024)}k ctx`:"",b=c.state==="loading"||c.state==="starting"?' lädt…':"";s.innerHTML=`${c.name}${f}${b}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?vu():is(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const v={};for(const f of e.models||[])v[f.name]=f.state;for(const[f,b]of Object.entries(v)){const T=ns[f];if(T&&T!==b&&(b==="running"||b==="loading")){lu();break}}ns=v}ou(e),xi.set(e)}function ou(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function du(e){fa.set(e||[])}function cu(e){Pr.set(e)}function is(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function vu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const uu=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>uu(a),l}async function il(){try{const e=await Te("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Vi(){try{as(await Te("/api/status"))}catch{as(null)}}async function rl(){try{du(await Te("/api/jobs"))}catch{}}function sl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{cu(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(sl,3e3)},n.onerror=()=>n.close()}var cs;((cs=document.getElementById("logo"))==null?void 0:cs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Gi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Gi[e.dataset.ic||""]||""});const pu=[["overview",pd],["models",Cd],["activity",Fd],["server",Jd],["cookbook",$c],["connect",Yc],["news",ov],["guides",hv],["memory",Cv],["hermes",su]];for(const[e,n]of pu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Eo(n,{target:a})}Ho("overview");const ar=document.getElementById("token");ar&&(ar.value=al(),ar.addEventListener("change",e=>{Go(e.target.value),Vi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=di(),ir.addEventListener("change",e=>Wo(e.target.value)));const rs=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),ss=document.getElementById("sm-close");rs&&rr&&ss&&(rs.addEventListener("click",()=>rr.style.display="flex"),ss.addEventListener("click",()=>rr.style.display="none"));function fu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Vi);Vi();rl();sl();setInterval(fu,1e3);setInterval(Vi,3e3);setInterval(rl,1500);il();setInterval(il,6e4);