diff --git a/frontend/src/panels/CookbookPanel.svelte b/frontend/src/panels/CookbookPanel.svelte index 5b3c6d9..77a8834 100644 --- a/frontend/src/panels/CookbookPanel.svelte +++ b/frontend/src/panels/CookbookPanel.svelte @@ -22,6 +22,52 @@ for (const c of CAP_KW) if (c.kw.some((k: string) => l.includes(k))) return c.label return 'Allrounder' } + + // ---- Capability-Tags (Phase 10, Schritt 2): aus Name + HF-Tags ---- + const TOOL_FAM = ['qwen2.5', 'qwen3', 'qwen2', 'hermes', 'mistral', 'mixtral', 'devstral', + 'command-r', 'command_r', 'llama-3.1', 'llama3.1', 'llama-3.3', 'llama-4', 'llama4', + 'functionary', 'watt', 'firefunction', 'granite', 'glm-4', 'ministral', 'gemma-3', 'gemma3'] + const REASON_KW = ['-r1', 'deepseek-r1', 'qwq', 'magistral', '-think', 'thinking', '-o1', + 'gpt-oss', 'reasoning', 'exaone-deep', 'phi-4-reasoning'] + + function caps(name: string, tags: any[] = []) { + const l = (name || '').toLowerCase() + const t = (tags || []).map((x: any) => String(x).toLowerCase()) + const toolTag = t.some((x: string) => x.includes('function-calling') || x.includes('tool-use') || x.includes('tools')) + const toolFam = TOOL_FAM.some((f: string) => l.includes(f)) + return { + moe: isMoe(l), + active_b: moeActive(l), + vision: ['-vl', 'vision', 'llava', 'pixtral', 'multimodal', '-mm-'].some(k => l.includes(k)) || t.includes('image-text-to-text'), + coder: ['coder', '-code', 'code-', 'codestral', 'starcoder'].some(k => l.includes(k)), + reasoning: REASON_KW.some(k => l.includes(k)) || t.includes('reasoning'), + tools: toolTag ? 'yes' : (toolFam ? 'likely' : 'no'), + } + } + + // Facetten-Filter (Mehrfachauswahl) für die Profi-Suche + let facets = $state>({ tools: false, moe: false, reasoning: false, vision: false, coder: false }) + const FACET_DEFS: [string, string][] = [['tools', '🛠 Tools'], ['moe', '🧩 MoE'], ['reasoning', '🧠 Logik'], ['vision', '👁 Bild'], ['coder', '💻 Code']] + + function matchesFacets(name: string, tags: any[] = []) { + const active = Object.keys(facets).filter(k => facets[k]) + if (!active.length) return true + const c: any = caps(name, tags) + return active.every(f => f === 'tools' ? c.tools !== 'no' : c[f]) + } + + function capsChipsHtml(name: string, tags: any[] = []) { + const c: any = caps(name, tags) + const out: string[] = [] + if (c.coder) out.push('💻 Code') + if (c.vision) out.push('👁 Bild') + if (c.reasoning) out.push('🧠 Logik') + if (c.moe) out.push(`🧩 MoE${c.active_b ? ` · ~${c.active_b}B` : ''}`) + if (c.tools === 'yes') out.push('🛠 Tools') + else if (c.tools === 'likely') out.push('🛠 Tools?') + if (!c.coder && !c.vision) out.unshift('💬 Chat') + return out.join(' ') + } function isMoe(s = '') { const l = s.toLowerCase() return /\d+x\d+(\.\d+)?b/.test(l) || /(?{m.fit.text}
- {@html capChipHtml(ROLE_LABEL[m.role] || capLabel(m.repo))} - {@html moeChipHtml(m.repo)} + {@html capsChipsHtml(m.repo, m.tags)}
{metricLine(m.fit)} · ⬇ {(m.downloads || 0).toLocaleString()}
{#each (m.requirements || []) as req} @@ -387,19 +431,27 @@ - -
- {#each ['', 'coder', 'vision', 'reasoning', 'chat', 'agent'] as f} - {/each} + {#if Object.values(facets).some(v => v)} + + {/if}
{#if searchResults.length}
{#each searchResults as m, i} + {#if matchesFacets(m.id, m.tags)}
openModel(m.id, m.id.split('/').pop())}> {#if i === bestResultIdx}
★ Beste Wahl für dein System
{/if}
@@ -410,8 +462,7 @@ {cardFits[i] ? fitWord(cardFits[i]!) : 'prüfe…'}
- {@html capChipHtml(capLabel(m.id))} - {@html moeChipHtml(m.id)} + {@html capsChipsHtml(m.id, m.tags)}
@@ -419,6 +470,7 @@ ⬇ {(m.downloads || 0).toLocaleString()}
+ {/if} {/each}
{/if} diff --git a/routers/cookbook.py b/routers/cookbook.py index 0dc9bf7..9baee7f 100644 --- a/routers/cookbook.py +++ b/routers/cookbook.py @@ -421,6 +421,7 @@ def refresh_discover(ram_gb: float) -> dict: by_cat[role].append({ "name": rid.split("/")[-1], "author": rid.split("/")[0], "repo": rid, "role": role, "params_b": params_b, "quant": quant, + "tags": [str(t) for t in (m.get("tags") or [])], # HF-Tags für Capability-Erkennung (Phase 10) "downloads": int(m.get("downloads") or 0), "likes": int(m.get("likes") or 0), "lastModified": m.get("lastModified"), "fit": fit, "optimal_ctx": max_ctx_for(params_b, quant, ram_gb), diff --git a/static/dist/main.js b/static/dist/main.js index ff2f4c8..5b686ad 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,36 +1,36 @@ -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 m=(e,n,a)=>(Ui(e,n,"read from private field"),a?a.call(e):n.get(e)),qe=(e,n,a)=>n.has(e)?Dr("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(e):n.set(e,a),Ke=(e,n,a,s)=>(Ui(e,n,"write to private field"),s?s.call(e,a):n.set(e,a),a),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,Na=4,Ki=8,ps=1<<24,Cn=16,zn=32,la=64,sr=128,kn=512,Jt=1024,Xt=2048,Kn=4096,an=8192,wn=16384,Ha=32768,lr=1<<25,qa=65536,$i=1<<17,gl=1<<18,Ja=1<<19,ml=1<<20,Bn=1<<25,Sa=65536,Pi=1<<21,Pa=1<<22,sa=1<<23,Da=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 xl(e,n,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function kl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function wl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Sl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Ml(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function El(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Al(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Cl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Tl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const zl=1,$l=2,hs=4,Pl=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 Ga(e){en=e}function $n(e,n=!1,a){en={p:en,i:!1,c:null,e:null,s:e,x:null,r:Qe,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 va=[];function ys(){var e=va;va=[],hl(e)}function ya(e){if(va.length===0&&!ri){var n=va;queueMicrotask(()=>{n===va&&ys()})}va.push(e)}function ql(){for(;va.length>0;)ys()}function xs(e){var n=Qe;if(n===null)return Ue.f|=sa,e;if((n.f&Ha)===0&&(n.f&Na)===0)throw e;ia(e,n)}function ia(e,n){if(!(n!==null&&(n.f&wn)!==0)){for(;n!==null;){if((n.f&sr)!==0){if((n.f&Ha)===0)throw e;try{n.b.error(e);return}catch(a){e=a}}n=n.parent}throw e}}const Gl=-7169;function Vt(e,n){e.f=e.f&Gl|n}function xr(e){(e.f&kn)!==0||e.deps===null?Vt(e,Jt):Vt(e,Kn)}function ks(e){if(e!==null)for(const n of e)(n.f&tn)===0||(n.f&Sa)===0||(n.f^=Sa,ks(n.deps))}function ws(e,n,a){(e.f&Xt)!==0?n.add(e):(e.f&Kn)!==0&&a.add(e),ks(e.deps),Vt(e,Jt)}function Vl(e){let n=0,a=Ea(0),s;return()=>{Cr()&&(t(a),qi(()=>(n===0&&(s=Qa(()=>e(()=>si(a)))),n+=1,()=>{ya(()=>{n-=1,n===0&&(s==null||s(),s=void 0,si(a))})})))}}var Wl=qa|Ja;function jl(e,n,a,s){new Ul(e,n,a,s)}var bn,_r,_n,ha,sn,yn,nn,pn,Vn,ga,na,Ia,ui,pi,Wn,Oi,Ft,Hl,Jl,Ql,cr,Ei,Ai,vr,ur;class Ul{constructor(n,a,s,l){qe(this,Ft);vn(this,"parent");vn(this,"is_pending",!1);vn(this,"transform_error");qe(this,bn);qe(this,_r,null);qe(this,_n);qe(this,ha);qe(this,sn);qe(this,yn,null);qe(this,nn,null);qe(this,pn,null);qe(this,Vn,null);qe(this,ga,0);qe(this,na,0);qe(this,Ia,!1);qe(this,ui,new Set);qe(this,pi,new Set);qe(this,Wn,null);qe(this,Oi,Vl(()=>(Ke(this,Wn,Ea(m(this,ga))),()=>{Ke(this,Wn,null)})));var o;Ke(this,bn,n),Ke(this,_n,a),Ke(this,ha,d=>{var c=Qe;c.b=this,c.f|=sr,s(d)}),this.parent=Qe.b,this.transform_error=l??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),Ke(this,sn,Tr(()=>{lt(this,Ft,cr).call(this)},Wl))}defer_effect(n){ws(n,m(this,ui),m(this,pi))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!m(this,_n).pending}update_pending_count(n,a){lt(this,Ft,vr).call(this,n,a),Ke(this,ga,m(this,ga)+n),!(!m(this,Wn)||m(this,Ia))&&(Ke(this,Ia,!0),ya(()=>{Ke(this,Ia,!1),m(this,Wn)&&Va(m(this,Wn),m(this,ga))}))}get_effect_pending(){return m(this,Oi).call(this),t(m(this,Wn))}error(n){if(!m(this,_n).onerror&&!m(this,_n).failed)throw n;ye!=null&&ye.is_fork?(m(this,yn)&&ye.skip_effect(m(this,yn)),m(this,nn)&&ye.skip_effect(m(this,nn)),m(this,pn)&&ye.skip_effect(m(this,pn)),ye.oncommit(()=>{lt(this,Ft,ur).call(this,n)})):lt(this,Ft,ur).call(this,n)}}bn=new WeakMap,_r=new WeakMap,_n=new WeakMap,ha=new WeakMap,sn=new WeakMap,yn=new WeakMap,nn=new WeakMap,pn=new WeakMap,Vn=new WeakMap,ga=new WeakMap,na=new WeakMap,Ia=new WeakMap,ui=new WeakMap,pi=new WeakMap,Wn=new WeakMap,Oi=new WeakMap,Ft=new WeakSet,Hl=function(){try{Ke(this,yn,xn(()=>m(this,ha).call(this,m(this,bn))))}catch(n){this.error(n)}},Jl=function(n){const a=m(this,_n).failed;a&&Ke(this,pn,xn(()=>{a(m(this,bn),()=>n,()=>()=>{})}))},Ql=function(){const n=m(this,_n).pending;n&&(this.is_pending=!0,Ke(this,nn,xn(()=>n(m(this,bn)))),ya(()=>{var a=Ke(this,Vn,document.createDocumentFragment()),s=Qn();a.append(s),Ke(this,yn,lt(this,Ft,Ai).call(this,()=>xn(()=>m(this,ha).call(this,s)))),m(this,na)===0&&(m(this,bn).before(a),Ke(this,Vn,null),ka(m(this,nn),()=>{Ke(this,nn,null)}),lt(this,Ft,Ei).call(this,ye))}))},cr=function(){try{if(this.is_pending=this.has_pending_snippet(),Ke(this,na,0),Ke(this,ga,0),Ke(this,yn,xn(()=>{m(this,ha).call(this,m(this,bn))})),m(this,na)>0){var n=Ke(this,Vn,document.createDocumentFragment());$r(m(this,yn),n);const a=m(this,_n).pending;Ke(this,nn,xn(()=>a(m(this,bn))))}else lt(this,Ft,Ei).call(this,ye)}catch(a){this.error(a)}},Ei=function(n){this.is_pending=!1,n.transfer_effects(m(this,ui),m(this,pi))},Ai=function(n){var a=Qe,s=Ue,l=en;Nn(m(this,sn)),Sn(m(this,sn)),Ga(m(this,sn).ctx);try{return Ma.ensure(),n()}catch(o){return xs(o),null}finally{Nn(a),Sn(s),Ga(l)}},vr=function(n,a){var s;if(!this.has_pending_snippet()){this.parent&<(s=this.parent,Ft,vr).call(s,n,a);return}Ke(this,na,m(this,na)+n),m(this,na)===0&&(lt(this,Ft,Ei).call(this,a),m(this,nn)&&ka(m(this,nn),()=>{Ke(this,nn,null)}),m(this,Vn)&&(m(this,bn).before(m(this,Vn)),Ke(this,Vn,null)))},ur=function(n){m(this,yn)&&(cn(m(this,yn)),Ke(this,yn,null)),m(this,nn)&&(cn(m(this,nn)),Ke(this,nn,null)),m(this,pn)&&(cn(m(this,pn)),Ke(this,pn,null));var a=m(this,_n).onerror;let s=m(this,_n).failed;var l=!1,o=!1;const d=()=>{if(l){Kl();return}l=!0,o&&Tl(),m(this,pn)!==null&&ka(m(this,pn),()=>{Ke(this,pn,null)}),lt(this,Ft,Ai).call(this,()=>{lt(this,Ft,cr).call(this)})},c=v=>{try{o=!0,a==null||a(v,d),o=!1}catch(f){ia(f,m(this,sn)&&m(this,sn).parent)}s&&Ke(this,pn,lt(this,Ft,Ai).call(this,()=>{try{return xn(()=>{var f=Qe;f.b=this,f.f|=sr,s(m(this,bn),()=>v,()=>d)})}catch(f){return ia(f,m(this,sn).parent),null}}))};ya(()=>{var v;try{v=this.transform_error(n)}catch(f){ia(f,m(this,sn)&&m(this,sn).parent);return}v!==null&&typeof v=="object"&&typeof v.then=="function"?v.then(c,f=>ia(f,m(this,sn)&&m(this,sn).parent)):c(v)})};function Zl(e,n,a,s){const l=kr;var o=e.filter(y=>!y.settled),d=n.map(l);if(a.length===0&&o.length===0){s(d);return}var c=Qe,v=Yl(),f=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(y=>y.promise)):null;function b(y){if((c.f&wn)===0){v();try{s([...d,...y])}catch(D){ia(D,c)}Di()}}var T=Ss();if(a.length===0){f.then(()=>b([])).finally(T);return}function _(){Promise.all(a.map(y=>Xl(y))).then(b).catch(y=>ia(y,c)).finally(T)}f?f.then(()=>{v(),_(),Di()}):_()}function Yl(){var e=Qe,n=Ue,a=en,s=ye;return function(o=!0){Nn(e),Sn(n),Ga(a),o&&(e.f&wn)===0&&(s==null||s.activate(),s==null||s.apply())}}function Di(e=!0){Nn(null),Sn(null),Ga(null),e&&(ye==null||ye.deactivate())}function Ss(){var e=Qe,n=e.b,a=ye,s=!!(n!=null&&n.is_rendered());return n==null||n.update_pending_count(1,a),a.increment(s,e),()=>{n==null||n.update_pending_count(-1,a),a.decrement(s,e)}}function kr(e){var n=tn|Xt;return Qe!==null&&(Qe.f|=Ja),{ctx:en,deps:null,effects:null,equals:ms,f:n,fn:e,reactions:null,rv:0,v:Ht,wv:0,parent:Qe,ac:null}}const Xa=Symbol("obsolete");function Xl(e,n,a){let s=Qe;s===null&&yl();var l=void 0,o=Ea(Ht),d=!Ue,c=new Set;return mo(()=>{var y,D;var v=Qe,f=us();l=f.promise;try{Promise.resolve(e()).then(f.resolve,B=>{B!==Ni&&f.reject(B)}).finally(Di)}catch(B){f.reject(B),Di()}var b=ye;if(d){if((v.f&Ha)!==0)var T=Ss();if((y=s.b)!=null&&y.is_rendered())(D=b.async_deriveds.get(v))==null||D.reject(Xa);else for(const B of c.values())B.reject(Xa);c.add(f),b.async_deriveds.set(v,f)}const _=(B,M=void 0)=>{T==null||T(),c.delete(f),M!==Xa&&(b.activate(),M?(o.f|=sa,Va(o,M)):((o.f&sa)!==0&&(o.f^=sa),Va(o,B)),b.deactivate())};f.promise.then(_,B=>_(null,B||"unknown"))}),Fs(()=>{for(const v of c)v.reject(Xa)}),new Promise(v=>{function f(b){function T(){b===l?v(o):f(l)}b.then(T,T)}f(l)})}function q(e){const n=kr(e);return Us(n),n}function eo(e){const n=kr(e);return n.equals=bs,n}function to(e){var n=e.effects;if(n!==null){e.effects=null;for(var a=0;athis.schedule(s)){var s=m(this,Ln).get(n);if(s){m(this,Ln).delete(n);for(var l of s.d)Vt(l,Xt),a(l);for(l of s.m)Vt(l,Kn),a(l)}m(this,Ka).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(){ye=this}deactivate(){ye=null,Yt=null}flush(){try{Ji=!0,ye=this,lt(this,vt,ei).call(this)}finally{Lr=0,pr=null,$a=null,Ci=null,Ji=!1,ye=null,Yt=null,xa.clear()}}discard(){var n;for(const a of m(this,Ba))a(this);m(this,Ba).clear();for(const a of this.async_deriveds.values())a.reject(Xa);lt(this,vt,ti).call(this),(n=m(this,Fa))==null||n.resolve()}register_created_effect(n){m(this,fi).push(n)}increment(n,a){if(Ke(this,Ra,m(this,Ra)+1),n){let s=m(this,jn).get(a)??0;m(this,jn).set(a,s+1)}}decrement(n,a){if(Ke(this,Ra,m(this,Ra)-1),n){let s=m(this,jn).get(a)??0;s===1?m(this,jn).delete(a):m(this,jn).set(a,s-1)}m(this,ba)||(Ke(this,ba,!0),ya(()=>{Ke(this,ba,!1),this.linked&&this.flush()}))}transfer_effects(n,a){for(const s of n)m(this,Un).add(s);for(const s of a)m(this,En).add(s);n.clear(),a.clear()}oncommit(n){m(this,Oa).add(n)}ondiscard(n){m(this,Ba).add(n)}settled(){return(m(this,Fa)??Ke(this,Fa,us())).promise}static ensure(){if(ye===null){const n=ye=new Bi;!Ji&&!ri&&ya(()=>{m(n,La)||n.flush()})}return ye}apply(){{Yt=null;return}}schedule(n){var l;if(pr=n,(l=n.b)!=null&&l.is_pending&&(n.f&(Na|Ki|ps))!==0&&(n.f&Ha)===0){n.b.defer_effect(n);return}for(var a=n;a.parent!==null;){a=a.parent;var s=a.f;if($a!==null&&a===Qe&&(Ue===null||(Ue.f&tn)===0))return;if((s&(la|zn))!==0){if((s&Jt)===0)return;a.f^=Jt}}m(this,ln).push(a)}};La=new WeakMap,aa=new WeakMap,ma=new WeakMap,Oa=new WeakMap,Ba=new WeakMap,Ra=new WeakMap,jn=new WeakMap,Fa=new WeakMap,ln=new WeakMap,fi=new WeakMap,Un=new WeakMap,En=new WeakMap,Ln=new WeakMap,Ka=new WeakMap,ba=new WeakMap,vt=new WeakSet,fr=function(){if(this.is_fork)return!0;for(const s of m(this,jn).keys()){for(var n=s,a=!1;n.parent!==null;){if(m(this,Ln).has(n)){a=!0;break}n=n.parent}if(!a)return!0}return!1},ei=function(){var v,f,b,T;Ke(this,La,!0),Lr++>1e3&&(lt(this,vt,ti).call(this),so());for(const _ of m(this,Un))m(this,En).delete(_),Vt(_,Xt),this.schedule(_);for(const _ of m(this,En))Vt(_,Kn),this.schedule(_);const n=m(this,ln);Ke(this,ln,[]),this.apply();var a=$a=[],s=[],l=Ci=[];for(const _ of n)try{lt(this,vt,hr).call(this,_,a,s)}catch(y){throw $s(_),lt(this,vt,fr).call(this)||this.discard(),y}if(ye=null,l.length>0){var o=Bi.ensure();for(const _ of l)o.schedule(_)}if($a=null,Ci=null,lt(this,vt,fr).call(this)){lt(this,vt,za).call(this,s),lt(this,vt,za).call(this,a);for(const[_,y]of m(this,Ln))zs(_,y);l.length>0&<(v=ye,vt,ei).call(v);return}const d=lt(this,vt,As).call(this);if(d){lt(this,vt,za).call(this,s),lt(this,vt,za).call(this,a),lt(f=d,vt,Cs).call(f,this);return}m(this,Un).clear(),m(this,En).clear();for(const _ of m(this,Oa))_(this);m(this,Oa).clear(),ii=this,Or(s),Or(a),ii=null,(b=m(this,Fa))==null||b.resolve();var c=ye;if(m(this,Ra)===0&&(m(this,ln).length===0||c!==null)&<(this,vt,ti).call(this),m(this,ln).length>0)if(c!==null){const _=c;m(_,ln).push(...m(this,ln).filter(y=>!m(_,ln).includes(y)))}else c=this;c!==null&<(T=c,vt,ei).call(T)},hr=function(n,a,s){n.f^=Jt;for(var l=n.first;l!==null;){var o=l.f,d=(o&(zn|la))!==0,c=d&&(o&Jt)!==0,v=c||(o&an)!==0||m(this,Ln).has(l);if(!v&&l.fn!==null){d?l.f^=Jt:(o&Na)!==0?a.push(l):_i(l)&&((o&Cn)!==0&&m(this,En).add(l),Wa(l));var f=l.first;if(f!==null){l=f;continue}}for(;l!==null;){var b=l.next;if(b!==null){l=b;break}l=l.parent}}},As=function(){for(var n=m(this,aa);n!==null;){if(!n.is_fork){for(const[a,[,s]]of this.current)if(n.current.has(a)&&!s)return n}n=m(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(m(n,Un),m(n,En));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|Cn)&&!this.async_deriveds.has(c)&&(m(this,En).delete(c),Vt(c,Xt),this.schedule(c))}}};for(const l of this.current.keys())a(l);this.oncommit(()=>n.discard()),lt(s=n,vt,ti).call(s),ye=this,lt(this,vt,ei).call(this)},za=function(n){for(var a=0;a!_.current.get(y)[1]);if(!(!m(_,La)||l.length===0)){var o=l.filter(y=>!this.current.has(y));if(o.length===0)n&&_.discard();else if(a.length>0){if(n)for(const y of m(this,Ka))_.unskip_effect(y,D=>{var B;(D.f&(Cn|Pa))!==0?_.schedule(D):lt(B=_,vt,za).call(B,[D])});_.activate();var d=new Set,c=new Map;for(var v of a)Ts(v,o,d,c);c=new Map;var f=[..._.current].filter(([y,D])=>{const B=this.current.get(y);return B?B[0]!==D[0]||B[1]!==D[1]:!0}).map(([y])=>y);if(f.length>0)for(const y of m(this,fi))(y.f&(wn|an|$i))===0&&Sr(y,f,c)&&((y.f&(Pa|Cn))!==0?(Vt(y,Xt),_.schedule(y)):m(_,Un).add(y));if(m(_,ln).length>0&&!m(_,ba)){_.apply();for(var b of m(_,ln))lt(T=_,vt,hr).call(T,b,[],[]);Ke(_,ln,[])}_.deactivate()}}}},ti=function(){if(this.linked){var n=m(this,aa),a=m(this,ma);n===null?Hi=a:Ke(n,ma,a),a===null?Ta=n:Ke(a,aa,n),this.linked=!1}};let Ma=Bi;function ro(e){var n=ri;ri=!0;try{for(var a;;){if(ql(),ye===null)return a;ye.flush()}}finally{ri=n}}function so(){try{Ml()}catch(e){ia(e,pr)}}let Mn=null;function Or(e){var n=e.length;if(n!==0){for(var a=0;a0)){xa.clear();for(const l of Mn){if((l.f&(wn|an))!==0)continue;const o=[l];let d=l.parent;for(;d!==null;)Mn.has(d)&&(Mn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const v=o[c];(v.f&(wn|an))===0&&Wa(v)}}Mn.clear()}}Mn=null}}function Ts(e,n,a,s){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const l of e.reactions){const o=l.f;(o&tn)!==0?Ts(l,n,a,s):(o&(Pa|Cn))!==0&&(o&Xt)===0&&Sr(l,n,s)&&(Vt(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){ye.schedule(e)}function zs(e,n){if(!((e.f&zn)!==0&&(e.f&Jt)!==0)){(e.f&Xt)!==0?n.d.push(e):(e.f&Kn)!==0&&n.m.push(e),Vt(e,Jt);for(var a=e.first;a!==null;)zs(a,n),a=a.next}}function $s(e){Vt(e,Jt);for(var n=e.first;n!==null;)$s(n),n=n.next}let Ii=new Set;const xa=new Map;let Ps=!1;function Ea(e,n){var a={f:0,v:e,reactions:null,equals:ms,rv:0,wv:0};return a}function L(e,n){const a=Ea(e);return Us(a),a}function lo(e,n=!1,a=!0){const s=Ea(e);return n||(s.equals=bs),s}function u(e,n,a=!1){Ue!==null&&(!Tn||(Ue.f&$i)!==0)&&_s()&&(Ue.f&(tn|Cn|Pa|$i))!==0&&(Rn===null||!Rn.has(e))&&Cl();let s=a?jt(n):n;return Va(e,s,Ci)}function Va(e,n,a=null){if(!e.equals(n)){xa.set(e,oa?n:e.v);var s=Ma.ensure();if(s.capture(e,n),(e.f&tn)!==0){const l=e;(e.f&Xt)!==0&&wr(l),Yt===null&&xr(l)}e.wv=Js(),Ds(e,Xt,a),Qe!==null&&(Qe.f&Jt)!==0&&(Qe.f&(zn|la))===0&&(mn===null?_o([e]):mn.push(e)),!s.is_fork&&Ii.size>0&&!Ps&&oo()}return n}function oo(){Ps=!1;for(const e of Ii){(e.f&Jt)!==0&&Vt(e,Kn);let n;try{n=_i(e)}catch{n=!0}n&&Wa(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(wa===o)return c();var v=Ue,f=wa;Sn(null),Nr(o);var b=c();return Sn(v),Nr(f),b};return s&&a.set("length",L(e.length)),new Proxy(e,{defineProperty(c,v,f){(!("value"in f)||f.configurable===!1||f.enumerable===!1||f.writable===!1)&&El();var b=a.get(v);return b===void 0?d(()=>{var T=L(f.value);return a.set(v,T),T}):u(b,f.value,!0),!0},deleteProperty(c,v){var f=a.get(v);if(f===void 0){if(v in c){const b=d(()=>L(Ht));a.set(v,b),si(l)}}else u(f,Ht),si(l);return!0},get(c,v,f){var y;if(v===Da)return e;var b=a.get(v),T=v in c;if(b===void 0&&(!T||(y=ai(c,v))!=null&&y.writable)&&(b=d(()=>{var D=jt(T?c[v]:Ht),B=L(D);return B}),a.set(v,b)),b!==void 0){var _=t(b);return _===Ht?void 0:_}return Reflect.get(c,v,f)},getOwnPropertyDescriptor(c,v){var f=Reflect.getOwnPropertyDescriptor(c,v);if(f&&"value"in f){var b=a.get(v);b&&(f.value=t(b))}else if(f===void 0){var T=a.get(v),_=T==null?void 0:T.v;if(T!==void 0&&_!==Ht)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return f},has(c,v){var _;if(v===Da)return!0;var f=a.get(v),b=f!==void 0&&f.v!==Ht||Reflect.has(c,v);if(f!==void 0||Qe!==null&&(!b||(_=ai(c,v))!=null&&_.writable)){f===void 0&&(f=d(()=>{var y=b?jt(c[v]):Ht,D=L(y);return D}),a.set(v,f));var T=t(f);if(T===Ht)return!1}return b},set(c,v,f,b){var Ee;var T=a.get(v),_=v in c;if(s&&v==="length")for(var y=f;yL(Ht)),a.set(y+"",D))}if(T===void 0)(!_||(Ee=ai(c,v))!=null&&Ee.writable)&&(T=d(()=>L(void 0)),u(T,jt(f)),a.set(v,T));else{_=T.v!==Ht;var B=d(()=>jt(f));u(T,B)}var M=Reflect.getOwnPropertyDescriptor(c,v);if(M!=null&&M.set&&M.set.call(b,f),!_){if(s&&typeof v=="string"){var K=a.get("length"),Oe=Number(v);Number.isInteger(Oe)&&Oe>=K.v&&u(K,Oe+1)}si(l)}return!0},ownKeys(c){t(l);var v=Reflect.ownKeys(c).filter(T=>{var _=a.get(T);return _===void 0||_.v!==Ht});for(var[f,b]of a)b.v!==Ht&&!(f in c)&&v.push(f);return v},setPrototypeOf(){Al()}})}function Br(e){try{if(e!==null&&typeof e=="object"&&Da in e)return e[Da]}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 tt(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=Ue,a=Qe;Sn(null),Nn(null);try{return e()}finally{Sn(n),Nn(a)}}function Ar(e,n,a,s=a){e.addEventListener(n,()=>Er(a));const l=e[Mi];l?e[Mi]=()=>{l(),s(!0)}:e[Mi]=()=>s(!0),po()}function fo(e){Qe===null&&(Ue===null&&Sl(),wl()),oa&&kl()}function ho(e,n){var a=n.last;a===null?n.last=n.first=e:(a.next=e,e.prev=a,n.last=e)}function Zn(e,n){var a=Qe;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};ye==null||ye.register_created_effect(s);var l=s;if((e&Na)!==0)$a!==null?$a.push(s):Ma.ensure().schedule(s);else if(n!==null){try{Wa(s)}catch(d){throw cn(s),d}l.deps===null&&l.teardown===null&&l.nodes===null&&l.first===l.last&&(l.f&Ja)===0&&(l=l.first,(e&Cn)!==0&&(e&qa)!==0&&l!==null&&(l.f|=qa))}if(l!==null&&(l.parent=a,a!==null&&ho(l,a),Ue!==null&&(Ue.f&tn)!==0&&(e&la)===0)){var o=Ue;(o.effects??(o.effects=[])).push(l)}return s}function Cr(){return Ue!==null&&!Tn}function Fs(e){const n=Zn(Ki,null);return Vt(n,Jt),n.teardown=e,n}function bi(e){fo();var n=Qe.f,a=!Ue&&(n&zn)!==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(Na|ml,e)}function go(e){Ma.ensure();const n=Zn(la|Ja,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(Na,e)}function mo(e){return Zn(Pa|Ja,e)}function qi(e,n=0){return Zn(Ki|n,e)}function z(e,n=[],a=[],s=[]){Zl(s,n,a,l=>{Zn(Ki,()=>{e(...l.map(t))})})}function Tr(e,n=0){var a=Zn(Cn|n,e);return a}function xn(e){return Zn(zn|Ja,e)}function qs(e){var n=e.teardown;if(n!==null){const a=oa,s=Ue;Kr(!0),Sn(null);try{n.call(null)}finally{Kr(a),Sn(s)}}}function zr(e,n=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const l=a.ac;l!==null&&Er(()=>{l.abort(Ni)});var s=a.next;(a.f&la)!==0?a.parent=null:cn(a,n),a=s}}function bo(e){for(var n=e.first;n!==null;){var a=n.next;(n.f&zn)===0&&cn(n),n=a}}function cn(e,n=!0){var a=!1;(n||(e.f&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|=wn;var l=e.parent;l!==null&&l.first!==null&&Vs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function 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&qa)!==0||(l.f&zn)!==0&&(e.f&Cn)!==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&&(Vt(e,Xt),Ma.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,l=(a.f&qa)!==0||(a.f&zn)!==0;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 $r(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 Ue=null,Tn=!1;function Sn(e){Ue=e}let Qe=null;function Nn(e){Qe=e}let Rn=null;function Us(e){Ue!==null&&(Rn??(Rn=new Set)).add(e)}let on=null,un=0,mn=null;function _o(e){mn=e}let Hs=1,ua=0,wa=ua;function Nr(e){wa=e}function Js(){return++Hs}function _i(e){var n=e.f;if((n&Xt)!==0)return!0;if(n&tn&&(e.f&=~Sa),(n&Kn)!==0){for(var a=e.deps,s=a.length,l=0;le.wv)return!0}(n&kn)!==0&&Yt===null&&Vt(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|=Pi;var b=e.fn,T=b();e.f|=Ha;var _=e.deps,y=ye==null?void 0:ye.is_fork;if(on!==null){var D;if(y||ci(e,un),_!==null&&un>0)for(_.length=un+on.length,D=0;D{throw K});throw _}}finally{e[pa]=n,delete e.currentTarget,Sn(b),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 ja(e,n){var a=Qe;a.nodes===null&&(a.nodes={start:e,end:n,a:null,t:null})}function g(e,n){var a=(n&Il)!==0,s=(n&Ll)!==0,l,o=!e.startsWith("");return()=>{l===void 0&&(l=Mo(o?e:""+e),a||(l=ra(l)));var d=s||Is?document.importNode(l,!0):l.cloneNode(!0);if(a){var c=ra(d),v=d.lastChild;ja(c,v)}else ja(d,d);return d}}function li(e=""){{var n=Qn(e+"");return ja(n,n),n}}function Ua(){var e=document.createDocumentFragment(),n=document.createComment(""),a=Qn();return e.append(n,a),ja(n,a),e}function p(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,f=go(()=>{var b=a??n.appendChild(Qn());jl(b,{pending:()=>{}},y=>{$n({});var D=en;o&&(D.c=o),l&&(s.$$events=l),v=e(y,s)||{},Pn()},c);var T=new Set,_=y=>{for(var D=0;D{var M;for(var y of T)for(const K of[n,document]){var D=wi.get(K),B=D.get(y);--B==0?(K.removeEventListener(y,Gr),D.delete(y),D.size===0&&wi.delete(K)):D.set(y,B)}gr.delete(_),b!==a&&((M=b.parentNode)==null||M.removeChild(b))}});return Co.set(v,f),v}let Co=new WeakMap;var An,On,fn,_a,hi,gi,Ri;class To{constructor(n,a=!0){vn(this,"anchor");qe(this,An,new Map);qe(this,On,new Map);qe(this,fn,new Map);qe(this,_a,new Set);qe(this,hi,!0);qe(this,gi,n=>{if(m(this,An).has(n)){var a=m(this,An).get(n),s=m(this,On).get(a);if(s)Li(s),m(this,_a).delete(a);else{var l=m(this,fn).get(a);l&&(Li(l.effect),m(this,On).set(a,l.effect),m(this,fn).delete(a),l.fragment.lastChild.remove(),this.anchor.before(l.fragment),s=l.effect)}for(const[o,d]of m(this,An)){if(m(this,An).delete(o),o===n)break;const c=m(this,fn).get(d);c&&(cn(c.effect),m(this,fn).delete(d))}for(const[o,d]of m(this,On)){if(o===a||m(this,_a).has(o))continue;const c=()=>{if(Array.from(m(this,An).values()).includes(o)){var f=document.createDocumentFragment();$r(d,f),f.append(Qn()),m(this,fn).set(o,{effect:d,fragment:f})}else cn(d);m(this,_a).delete(o),m(this,On).delete(o)};m(this,hi)||!s?(m(this,_a).add(o),ka(d,c,!1)):c()}}});qe(this,Ri,n=>{m(this,An).delete(n);const a=Array.from(m(this,An).values());for(const[s,l]of m(this,fn))a.includes(s)||(cn(l.effect),m(this,fn).delete(s))});this.anchor=n,Ke(this,hi,a)}ensure(n,a){var s=ye,l=Bs();if(a&&!m(this,On).has(n)&&!m(this,fn).has(n))if(l){var o=document.createDocumentFragment(),d=Qn();o.append(d),m(this,fn).set(n,{effect:xn(()=>a(d)),fragment:o})}else m(this,On).set(n,xn(()=>a(this.anchor)));if(m(this,An).set(s,n),l){for(const[c,v]of m(this,On))c===n?s.unskip_effect(v):s.skip_effect(v);for(const[c,v]of m(this,fn))c===n?s.unskip_effect(v.effect):s.skip_effect(v.effect);s.oncommit(m(this,gi)),s.ondiscard(m(this,Ri))}else m(this,gi).call(this,s)}}An=new WeakMap,On=new WeakMap,fn=new WeakMap,_a=new WeakMap,hi=new WeakMap,gi=new WeakMap,Ri=new WeakMap;function O(e,n,a=!1){var s=new To(e),l=a?qa: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 Xe(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 _=e.outrogroups;mr(e,Fi(o.done)),_.delete(o),_.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var v=s.length===0&&a!==null;if(v){var f=a,b=f.parentNode;uo(b),b.append(f),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 Ee=a();return yr(Ee)?Ee:Ee==null?[]:Fi(Ee)}),_,y=new Map,D=!0;function B(Ee){(Oe.effect.f&wn)===0&&(Oe.pending.delete(Ee),Oe.fallback=b,$o(Oe,_,d,n,s),b!==null&&(_.length===0?(b.f&Bn)===0?Li(b):(b.f^=Bn,ni(b,null,d)):ka(b,()=>{b=null})))}function M(Ee){Oe.pending.delete(Ee)}var K=Tr(()=>{_=t(T);for(var Ee=_.length,Ce=new Set,Re=ye,te=Bs(),X=0;Xo(d)):(b=xn(()=>o(Vr??(Vr=Qn()))),b.f|=Bn)),Ee>Ce.size&&xl(),!D)if(y.set(Re,Ce),te){for(const[Ze,ut]of c)Ce.has(Ze)||Re.skip_effect(ut.e);Re.oncommit(B),Re.ondiscard(M)}else B(Re);t(T)}),Oe={effect:K,items:c,pending:y,outrogroups:null,fallback:b};D=!1}function Za(e){for(;e!==null&&(e.f&zn)===0;)e=e.next;return e}function $o(e,n,a,s,l){var Ne,Ze,ut,I,ue,Ae,He,N,ve;var o=(s&Pl)!==0,d=n.length,c=e.items,v=Za(e.effect.first),f,b=null,T,_=[],y=[],D,B,M,K;if(o)for(K=0;K0){var Be=(s&hs)!==0&&d===0?a:null;if(o){for(K=0;K{var pe,je;if(T!==void 0)for(M of T)(je=(pe=M.nodes)==null?void 0:pe.a)==null||je.apply()})}function Po(e,n,a,s,l,o,d,c){var v=(d&zl)!==0?(d&Dl)===0?lo(a,!1,!1):Ea(a):null,f=(d&$l)!==0?Ea(l):null;return{v,i:f,e:xn(()=>(o(n,v??a,f??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 Ye(e,n,a=!1,s=!1,l=!1,o=!1){var d=e,c="";if(a)var v=e;z(()=>{var f=Qe;if(c!==(c=n()??"")){if(a){f.nodes=null,v.innerHTML=c,c!==""&&ja(ra(v),v.lastChild);return}if(f.nodes!==null&&(Gs(f.nodes.start,f.nodes.end),f.nodes=null),c!==""){var b=s?Ol:l?Bl:void 0,T=Rs(s?"svg":l?"math":"template",b);T.innerHTML=c;var _=s||l?T:T.content;if(ja(ra(_),_.lastChild),s||l)for(;ra(_);)d.before(ra(_));else d.before(_)}}})}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 At(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,ye!==null&&s.add(ye)}),Ns(()=>{var o=n();if(e===document.activeElement){var d=ye;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 Aa(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),ye!==null&&s.add(ye),await xo(),o!==(o=n())){var d=e.selectionStart,c=e.selectionEnd,v=e.value.length;if(e.value=o??"",c!==null){var f=e.value.length;d===c&&c===v&&f>v?(e.selectionStart=f,e.selectionEnd=f):(e.selectionStart=d,e.selectionEnd=Math.min(c,f))}}}),Qa(n)==null&&e.value&&(a(Zi(e)?Yi(e.value):e.value),ye!==null&&s.add(ye)),qi(()=>{var l=n();if(e===document.activeElement){var o=ye;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)}),Qa(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[Da])===n}function No(e={},n,a,s){var l=en.r,o=Qe;return Ns(()=>{var d,c;return qi(()=>{d=c,c=[],Qa(()=>{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 f=()=>{c&&Xi(a(...c),e)&&n(null,...c)},b=v.teardown;v.teardown=()=>{f(),b==null||b()}}}),e}function yi(e){en===null&&fs(),bi(()=>{const n=Qa(e);if(typeof n=="function")return n})}function qo(e){en===null&&fs(),yi(()=>()=>Qa(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 we(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 ce(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 ct=e=>`${e}`,Gi={logo:ct(''),grid:ct(''),cpu:ct(''),pulse:ct(''),server:ct(''),book:ct(''),help:ct(''),settings:ct(''),swap:ct(''),monitor:ct(''),layers:ct(''),alert:ct(''),gauge:ct(''),search:ct(''),compass:ct(''),code:ct(''),eye:ct(''),refresh:ct(''),file:ct(''),database:ct(''),thermo:ct(''),shield:ct(''),info:ct(''),chevron:ct(''),bolt:ct(''),x:ct(''),check:ct(''),download:ct(''),clock:ct('')};function Ut(e){return Gi[e]||""}function br(e){return`${Gi.info}`}function ca(e){if(!e&&e!==0)return"–";const n=e/1024/1024/1024;return n>=1?n.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function hn({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 v=c=>{d.remove(),o(c)};d.addEventListener("click",c=>{if(c.target===d)return v(!1);const f=c.target.closest("[data-x]");f&&v(f.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function sr({title:e,body:n="",placeholder:a="",password:s=!1,confirmLabel:l="Weiter",danger:o=!1}){return new Promise(d=>{const v=document.createElement("div");v.className="modal-overlay",v.innerHTML=``;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=L(null);const xi={get value(){return t(Hr)},set(e){u(Hr,e,!0)}};let Jr=L(jt([])),ta=L(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=L(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 x;return((x=t(a))==null?void 0:x.models)||[]}),o=q(()=>{var x;return((x=t(a))==null?void 0:x.swap_ok)??!1}),d=["running","ready","loading","starting"],c=q(()=>t(l).find(x=>d.includes(x.state))),v=q(()=>t(l).filter(x=>!x.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 J;const x=(J=t(s))==null?void 0:J.gpu;return x&&x.vram.total+x.gtt.total>0?(x.vram.used+x.gtt.used)/(x.vram.total+x.gtt.total)*100:0});let _=L(jt([])),y=L(null);yi(async()=>{try{u(_,((await we("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function D(){await hn({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 we("/api/unload",{method:"POST"}),M())}async function B(x){u(y,x,!0);try{await we("/api/preload?model="+encodeURIComponent(x),{method:"POST"})}catch(J){ce("Laden fehlgeschlagen: "+(J.message||"Engine nicht erreichbar?"),!0)}u(y,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function K(x){var J;(J=document.querySelector(`.nav-item[data-view="${x}"]`))==null||J.dispatchEvent(new MouseEvent("click"))}function Oe(x){return x>=90?"red":x>=75?"":"green"}function Ee(x){return x==null?"":x>=75?"red":x>=55?"":"green"}function Ce(x){return x>=90?"red":x>=70?"":"green"}var Re=ud(),te=tt(Re),X=r(te),be=r(X),Be=r(be),Ne=i(Be);{var Ze=x=>{var J=Qo();p(x,J)};O(Ne,x=>{t(o)&&!t(c)&&x(Ze)})}var ut=i(be,2),I=r(ut),ue=i(te,2),Ae=r(ue),He=r(Ae),N=i(r(He),2);Ye(N,()=>Ut("server"),!0);var ve=i(He,2),pe=r(ve),je=i(ve,2),Ve=r(je),nt=i(Ae,2),it=r(nt),et=i(r(it),2);Ye(et,()=>Ut("cpu"),!0);var bt=i(it,2),wt=r(bt),Ct=i(bt,2),Kt=r(Ct);{var Pt=x=>{var J=li();z(he=>h(J,`${he??""} · ${t(c).state??""}`),[()=>{var he;return(he=t(c).meta)!=null&&he.ctx?Math.round(t(c).meta.ctx/1024)+"k ctx":""}]),p(x,J)},Dt=x=>{var J=li("lädt bei erster Anfrage");p(x,J)};O(Kt,x=>{t(c)?x(Pt):x(Dt,-1)})}var Lt=i(nt,2);{var It=x=>{const J=q(()=>{var gn;return t(s).gpu_temp??((gn=t(s).cpu)==null?void 0:gn.temp)??null}),he=q(()=>Ee(t(J))),W=q(()=>t(s).ram.total-t(s).ram.used),xe=q(()=>100-t(s).ram.percent);var Ie=Zo(),Fe=tt(Ie),De=r(Fe),j=i(r(De));Ye(j,()=>Ut("thermo"),!0);var Q=i(De,2),Z=r(Q),F=i(Q,2),ne=r(F),_e=i(Fe,2),ge=r(_e),fe=i(r(ge));Ye(fe,()=>Ut("database"),!0);var me=i(ge,2),_t=r(me),zt=i(me,2),Ot=r(zt);z((gn,da,k,w)=>{Et(Fe,1,`kpi ${t(he)??""}`),h(Z,gn),h(ne,t(J)==null?"messe…":t(J)<55?"kühl":t(J)<75?"normal":"⚠ heiß"),Et(_e,1,`kpi ${t(xe)<15?"red":t(xe)<30?"":"green"}`),h(_t,da),h(Ot,`von ${k??""} GB · ${w??""} % frei`)},[()=>t(J)!=null?`${Math.round(t(J))}°C`:"–",()=>Math.round(t(W)/1073741824),()=>Math.round(t(s).ram.total/1073741824),()=>Math.round(t(xe))]),p(x,Ie)},Tt=x=>{var J=Yo();p(x,J)};O(Lt,x=>{t(s)?x(It):x(Tt,-1)})}var P=i(ue,2),V=r(P),$=i(r(V),4);{var G=x=>{const J=q(()=>t(T)());var he=Ua(),W=tt(he);Je(W,17,()=>{var xe;return[["Prozessor (CPU)",((xe=t(s).cpu)==null?void 0:xe.percent)??0,""],["Arbeitsspeicher (RAM)",t(s).ram.percent,Oe(t(s).ram.percent)],["Grafikspeicher (VRAM)",t(J),Ce(t(J))]]},Xe,(xe,Ie)=>{var Fe=q(()=>Hn(t(Ie),3));let De=()=>t(Fe)[0],j=()=>t(Fe)[1];const Q=q(()=>Math.max(0,Math.min(100,j()||0)));var Z=Xo(),F=r(Z),ne=r(F),_e=r(ne),ge=i(ne),fe=r(ge),me=i(F,2),_t=r(me);z((zt,Ot)=>{h(_e,De()),h(fe,`${zt??""} %`),Et(me,1,`bar ${t(Q)>=90?"bad":t(Q)>=75?"warn":""}`),At(_t,`width:${Ot??""}%`)},[()=>Math.round(t(Q)),()=>Math.max(2,t(Q))]),p(xe,Z)}),p(x,he)},E=x=>{var J=ed();p(x,J)};O($,x=>{t(s)?x(G):x(E,-1)})}var Y=i(V,2),ke=i(r(Y),2);{var Pe=x=>{var J=td(),he=i(tt(J),2),W=r(he);Ye(W,()=>Ut("search"),!0);var xe=i(W,4);Ye(xe,()=>Ut("chevron"),!0);var Ie=i(he,2),Fe=r(Ie);Ye(Fe,()=>Ut("swap"),!0);var De=i(Fe,4);Ye(De,()=>Ut("chevron"),!0);var j=i(Ie,2),Q=r(j);Ye(Q,()=>Ut("file"),!0);var Z=i(Q,4);Ye(Z,()=>Ut("chevron"),!0),S("click",he,()=>K("cookbook")),S("click",Ie,()=>K("connect")),S("click",j,()=>K("guides")),p(x,J)},C=x=>{var J=nd(),he=i(tt(J),2),W=r(he);Ye(W,()=>Ut("search"),!0);var xe=i(W,4);Ye(xe,()=>Ut("chevron"),!0);var Ie=i(he,2),Fe=r(Ie);Ye(Fe,()=>Ut("refresh"),!0);var De=i(Fe,4);Ye(De,()=>Ut("chevron"),!0);var j=i(Ie,2),Q=r(j);Ye(Q,()=>Ut("file"),!0);var Z=i(Q,4);Ye(Z,()=>Ut("chevron"),!0);var F=i(j,2),ne=r(F);Ye(ne,()=>Ut("swap"),!0);var _e=i(ne,4);Ye(_e,()=>Ut("chevron"),!0),S("click",he,()=>K("cookbook")),S("click",Ie,D),S("click",j,()=>K("server")),S("click",F,()=>K("connect")),p(x,J)};O(ke,x=>{t(v).length?x(C,-1):x(Pe)})}var R=i(P,2),se=r(R),ie=r(se),ee=i(r(ie),2),Se=r(ee),de=i(ie,2);{var A=x=>{var J=Zr();Je(J,21,()=>t(v),Xe,(he,W)=>{const xe=q(()=>d.includes(t(W).state)),Ie=q(()=>t(W).state==="downloading"),Fe=q(()=>t(W).state==="loading"||t(W).state==="starting"||t(Ie)?"load":t(xe)?"on":""),De=q(()=>t(Ie)?`↓ ${t(W).download_progress!=null?Math.round(t(W).download_progress)+"%":"..."}`:t(W).state==="loading"||t(W).state==="starting"?"lädt…":t(xe)?"geladen ✓":"bereit");var j=od(),Q=r(j),Z=i(Q,2),F=r(Z),ne=r(F),_e=r(ne),ge=i(ne,2);{var fe=$e=>{var We=ad();p($e,We)},me=q(()=>{var $e,We;return(We=($e=t(W).meta)==null?void 0:$e.caps)==null?void 0:We.includes("Bild")}),_t=$e=>{var We=id();p($e,We)},zt=q(()=>{var $e,We;return(We=($e=t(W).meta)==null?void 0:$e.caps)==null?void 0:We.includes("Code")}),Ot=$e=>{var We=rd();p($e,We)};O(ge,$e=>{t(me)?$e(fe):t(zt)?$e(_t,1):$e(Ot,-1)})}var gn=i(ge,2);{var da=$e=>{var We=sd();p($e,We)};O(gn,$e=>{t(W).ttl>=99999&&$e(da)})}var k=i(F,2),w=r(k),re=i(Z,2),ae=r(re),Le=r(ae),ht=i(ae,2);{var yt=$e=>{var We=ld(),at=r(We);z(()=>{At(We,`padding:3px 9px;font-size:12px;opacity:${t(y)===t(W).name?".5":"1"}`),We.disabled=t(y)===t(W).name,h(at,t(y)===t(W).name?"…":"Laden")}),S("click",We,()=>B(t(W).name)),p($e,We)};O(ht,$e=>{!t(xe)&&!t(Ie)&&t(o)&&$e(yt)})}z(($e,We)=>{var at;Et(Q,1,`li-dot ${t(Fe)??""}`),At(ne,t(xe)?"color:var(--accent)":""),h(_e,t(W).name),h(w,`${$e??""} - ${(at=t(W).meta)!=null&&at.quant?" · "+t(W).meta.quant:""} - ${We??""}`),At(ae,`white-space:nowrap;color:${t(xe)?"var(--on)":"var(--mut)"}`),h(Le,t(De))},[()=>{var $e;return($e=t(W).meta)!=null&&$e.ctx?Math.round(t(W).meta.ctx/1024)+"k ctx":""},()=>{var $e;return($e=t(W).meta)!=null&&$e.size_bytes?" · "+(t(W).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),p(he,j)}),p(x,J)},U=x=>{var J=dd(),he=i(r(J),4);S("click",he,()=>K("cookbook")),p(x,J)};O(de,x=>{t(v).length?x(A):x(U,-1)})}var oe=i(se,2),Me=r(oe),H=i(r(Me),2),le=i(Me,2);{var Te=x=>{var J=Zr();Je(J,21,()=>t(_),Xe,(he,W)=>{var xe=cd(),Ie=r(xe),Fe=r(Ie),De=r(Fe),j=i(Fe,2),Q=r(j);z(()=>{Aa(xe,"href",t(W).link),h(De,t(W).title),h(Q,`${t(W).source??""}${t(W).relevant?" · für dich":""}`)}),p(he,xe)}),p(x,J)},ze=x=>{var J=vd();p(x,J)};O(le,x=>{t(_).length?x(Te):x(ze,-1)})}z(x=>{h(Be,`${t(f)??""} `),h(I,t(b)),Et(Ae,1,`kpi ${t(o)?"green":"red"}`),h(pe,t(o)?"Online":"Offline"),h(Ve,x),Et(nt,1,`kpi ${t(c)?"blue":"muted"}`),h(wt,t(c)?t(c).name:"Keins"),h(Se,t(v).length?t(v).length+" konfiguriert":"")},[()=>{var x,J;return((J=(x=t(a))==null?void 0:x.swap_url)==null?void 0:J.replace(/^https?:\/\//,""))??"—"}]),S("click",H,()=>K("news")),S("keydown",H,x=>x.key==="Enter"&&K("news")),p(e,Re),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 P;return((P=xi.value)==null?void 0:P.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=L(""),v=L(""),f=L(""),b=L(!1);const T=q(()=>t(o).filter(P=>!P.incomplete));async function _(){var V;const P=t(c)||((V=t(T)[0])==null?void 0:V.name);if(!(!P||!t(v).trim())){u(b,!0),u(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const $=await we("/api/chat",{method:"POST",body:JSON.stringify({model:P,message:t(v)})});u(f,$.reply,!0)}catch($){u(f,"Fehler: "+$.message)}u(b,!1),d()}}const y=300;let D=L(!1),B=L(null),M=L(8192),K=L(!1);function Oe(P){var V;u(B,t(o).find($=>$.name===P),!0),t(B)&&(u(M,((V=t(B).meta)==null?void 0:V.ctx)||8192,!0),u(K,(t(B).ttl??y)>=99999),u(D,!0))}async function Ee(){const P=t(K)?99999:y;try{await we("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(B).name,ctx:t(M),ttl:P})}),ce("Gespeichert — aktiv beim nächsten Modell-Start."),u(D,!1),d()}catch(V){ce(V.message,!0)}}let Ce=L(!1),Re=L(""),te=L(""),X=L("");function be(P){const V=t(o).find($=>$.name===P);u(Re,P,!0),u(X,(V==null?void 0:V.role)||"",!0),u(te,""),u(Ce,!0)}async function Be(P){try{await we("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Re),role:P})}),ce(P?`Rolle gesetzt: ${P}`:"Rolle entfernt."),u(Ce,!1),d()}catch(V){ce(V.message,!0)}}async function Ne(P){if(await hn({title:`„${P}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await we("/api/unload?model="+encodeURIComponent(P),{method:"POST"}),ce("Entladen: "+P),setTimeout(d,600)}catch(V){ce(V.message,!0)}}async function Ze(P){if(await hn({title:`„${P}" 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 V=await we("/api/delete_model",{method:"POST",body:JSON.stringify({alias:P})});ce(V.note||"Gelöscht: "+P),setTimeout(d,600)}catch(V){ce(V.message,!0)}}function ut(P){if(!P)return"–";const V=[];return P.coder&&V.push('Code'),P.vision&&V.push('Bild'),P.reasoning&&V.push('🧠 Reason'),P.moe&&V.push(`🧩 MoE${P.active_b?" ·"+P.active_b+"B":""}`),P.tools==="yes"?V.push('🛠 Tools'):P.tools==="likely"&&V.push('🛠 Tools?'),P.embedding&&V.push('🔢 Embed'),!P.coder&&!P.vision&&!P.embedding&&V.unshift('Text'),V.length?V.join(" "):"–"}function I(P){if(!P)return"–";const V=P.quant||"?",$=P.ctx?Math.round(P.ctx/1024)+"K":"?",G=P.size_bytes?(P.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${V} · ${$} · ${G}`}function ue(P){var V;(V=navigator.clipboard)==null||V.writeText(P),ce("Kopiert: "+P)}var Ae=Ad(),He=i(tt(Ae),2),N=i(r(He),6);Je(N,21,()=>t(T),Xe,(P,V)=>{var $=fd(),G=r($),E={};z(()=>{h(G,t(V).name),E!==(E=t(V).name)&&($.value=($.__value=t(V).name)??"")}),p(P,$)});var ve=i(N,4),pe=i(ve,2),je=r(pe),Ve=i(pe,2);{var nt=P=>{var V=hd(),$=r(V);z(()=>h($,t(f))),p(P,V)};O(Ve,P=>{t(f)&&P(nt)})}var it=i(He,2),et=r(it),bt=i(r(et)),wt=r(bt),Ct=i(et,4);{var Kt=P=>{var V=gd();p(P,V)},Pt=P=>{var V=kd(),$=i(r(V));Je($,21,()=>t(o),Xe,(G,E)=>{var Y=Ua(),ke=tt(Y);{var Pe=R=>{var se=md(),ie=r(se),ee=r(ie),Se=i(ie,5),de=r(Se),A=i(de,2);z(()=>h(ee,t(E).name)),S("click",de,()=>{var U;ce("Lade im Cookbook ein Modell und setze den Alias auf: "+t(E).name),(U=document.querySelector(".nav-item[data-view='cookbook']"))==null||U.dispatchEvent(new MouseEvent("click"))}),S("click",A,()=>Ze(t(E).name)),p(R,se)},C=R=>{var se=xd(),ie=r(se),ee=r(ie),Se=r(ee),de=i(Se);{var A=De=>{var j=bd(),Q=r(j);z(()=>h(Q,t(E).role)),p(De,j)};O(de,De=>{t(E).role&&De(A)})}var U=i(ee,2);{var oe=De=>{var j=_d(),Q=r(j);z(()=>h(Q,t(E).meta.filename)),p(De,j)};O(U,De=>{var j;(j=t(E).meta)!=null&&j.filename&&De(oe)})}var Me=i(U,2),H=i(r(Me),2);Je(H,17,()=>{var De;return(De=t(E).api_ids)!=null&&De.length?t(E).api_ids:[t(E).name]},Xe,(De,j)=>{var Q=yd(),Z=r(Q);z(()=>h(Z,t(j))),S("click",Q,()=>ue(t(j))),p(De,Q)});var le=i(ie);Ye(le,()=>{var De;return ut((De=t(E).meta)==null?void 0:De.capabilities)},!0);var Te=i(le);Ye(Te,()=>I(t(E).meta),!0);var ze=i(Te);Ye(ze,()=>Uo(t(E).state,t(E).download_progress),!0);var x=i(ze),J=r(x),he=i(x),W=r(he),xe=i(W,2),Ie=i(xe,2),Fe=i(Ie,2);z(()=>{h(Se,`${t(E).name??""} `),h(J,t(E).port??"auto")}),S("click",W,()=>be(t(E).name)),S("click",xe,()=>Oe(t(E).name)),S("click",Ie,()=>Ne(t(E).name)),S("click",Fe,()=>Ze(t(E).name)),p(R,se)};O(ke,R=>{t(E).incomplete?R(Pe):R(C,-1)})}p(G,Y)}),p(P,V)};O(Ct,P=>{t(o).length?P(Pt,-1):P(Kt)})}var Dt=i(it,2);{var Lt=P=>{var V=Sd(),$=r(V),G=r($),E=i(G,4),Y=r(E),ke=i(E,2),Pe=i(r(ke));Ye(Pe,()=>br(a));var C=i(ke,2),R=i(C,2);{var se=oe=>{var Me=wd(),H=r(Me),le=i(r(H),2),Te=r(le),ze=i(Te,2),x=i(H,2);z((J,he)=>{h(Te,`Optimal ~${J??""}k → ~${t(B).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(ze,` Aktuell ~${he??""}k → ~${t(B).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(B).meta.optimal_ctx/1024),()=>Math.round((t(B).meta.ctx||0)/1024)]),S("click",x,()=>u(M,t(B).meta.optimal_ctx,!0)),p(oe,Me)};O(R,oe=>{var Me;(Me=t(B).meta)!=null&&Me.optimal_ctx&&oe(se)})}var ie=i(R,4),ee=i(r(ie),2),Se=r(ee),de=i(Se,2),A=r(de),U=i(ie,2);z(()=>{h(Y,t(B).name),At(de,`color:${t(K)?"var(--accent)":"var(--mut)"}`),h(A,t(K)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),S("click",V,oe=>{oe.target.classList.contains("modal-overlay")&&u(D,!1)}),S("click",G,()=>u(D,!1)),dn(C,()=>t(M),oe=>u(M,oe)),Ko(Se,()=>t(K),oe=>u(K,oe)),S("click",U,Ee),p(P,V)};O(Dt,P=>{t(D)&&t(B)&&P(Lt)})}var It=i(Dt,2);{var Tt=P=>{var V=Ed(),$=r(V),G=r($),E=i(G,2),Y=i(r(E));Ye(Y,()=>br(s));var ke=i(E,2),Pe=r(ke),C=i(ke,4);Je(C,21,()=>l,Xe,(Se,de)=>{var A=Md(),U=r(A);z(()=>{Et(A,1,t(X)===t(de).id?"primary":"ghost"),Aa(A,"title",t(de).desc),h(U,t(de).label)}),S("click",A,()=>Be(t(de).id)),p(Se,A)});var R=i(C,4),se=i(R,2),ie=r(se),ee=i(ie,2);z(()=>h(Pe,t(Re))),S("click",V,Se=>{Se.target.classList.contains("modal-overlay")&&u(Ce,!1)}),S("click",G,()=>u(Ce,!1)),dn(R,()=>t(te),Se=>u(te,Se)),S("click",ie,()=>Be("")),S("click",ee,()=>Be(t(te).trim().toLowerCase())),p(P,V)};O(It,P=>{t(Ce)&&P(Tt)})}z(()=>{pe.disabled=t(b),h(je,t(b)?"…":"Senden"),h(wt,t(o).length?t(o).length+" konfiguriert":"")}),Jn(N,()=>t(c),P=>u(c,P)),dn(ve,()=>t(v),P=>u(v,P)),S("click",pe,_),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 I=t(l).gpu,ue=I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0;o.cpu=[...o.cpu,((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,ue].slice(-60)});const d=q(()=>()=>{var ue;const I=(ue=t(l))==null?void 0:ue.gpu;return I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0}),c=q(()=>t(a).filter(I=>I.state!=="running"&&I.state!=="queued").length),v=q(()=>t(a).filter(I=>I.state==="failed").length);function f(I){if(I.state!=="running")return null;if(typeof I.progress=="number")return Math.min(100,I.progress);const Ae=((I.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return Ae?Math.min(100,parseFloat(Ae[1])):null}function b(I){return I==null||I<0?"":I>=90?`noch ~${Math.round(I/60)} min`:`noch ~${Math.max(1,Math.round(I))} s`}function T(I){return I==="done"?'fertig':I==="failed"?'fehler':I==="canceled"?'abgebrochen':'läuft…'}function _(I){return I==="done"?"on":I==="failed"||I==="canceled"?"":"load"}async function y(I){try{await we(`/api/jobs/${I}/cancel`,{method:"POST"}),ce("Abbruch angefordert…")}catch(ue){ce(ue.message,!0)}}async function D(I){try{await we(`/api/jobs/${I}`,{method:"DELETE"})}catch(ue){ce(ue.message,!0)}}async function B(){try{const I=await we("/api/jobs/clear",{method:"POST"});ce(`${I.removed} Einträge entfernt.`)}catch(I){ce(I.message,!0)}}function M(I,ue){return I.map(Ae=>`
`).join("")}var K=Rd(),Oe=i(tt(K),2);{var Ee=I=>{const ue=q(()=>t(d)());var Ae=Td(),He=tt(Ae),N=r(He),ve=i(r(N),2),pe=r(ve),je=i(ve,2),Ve=r(je),nt=i(N,2),it=i(r(nt),2),et=r(it),bt=i(it,2),wt=r(bt),Ct=i(nt,2),Kt=i(r(Ct),2),Pt=r(Kt),Dt=i(Kt,2),Lt=r(Dt),It=i(He,2),Tt=i(r(It),4),P=r(Tt),V=i(r(P)),$=r(V),G=i(P,2),E=i(r(G),2),Y=r(E),ke=i(G,2),Pe=i(r(ke)),C=r(Pe),R=i(ke,2),se=i(r(R),2),ie=r(se),ee=i(Tt,2),Se=r(ee),de=i(r(Se));Ye(de,()=>M(o.cpu,"--accent"),!0);var A=i(Se,2),U=i(r(A));Ye(U,()=>M(o.ram,"--purple"),!0);var oe=i(A,2),Me=i(r(oe));Ye(Me,()=>M(o.gpu,"--on"),!0),z((H,le,Te,ze,x,J,he,W,xe,Ie,Fe,De,j)=>{h(pe,H),h(Ve,le),h(et,Te),h(wt,`${ze??""} / ${x??""}`),h(Pt,J),h(Lt,he),h($,`${W??""} / ${xe??""}`),h(Y,Ie),h(C,`${Fe??""} % belegt`),h(ie,`${De??""} / ${j??""}`)},[()=>{var H;return Math.round(((H=t(l).cpu)==null?void 0:H.percent)??0)},()=>{var H;return((H=t(l).cpu)==null?void 0:H.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(ue)),()=>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 H;return Math.round(((H=t(l).disk)==null?void 0:H.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var H;return((H=t(l).cpu)==null?void 0:H.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),p(I,Ae)};O(Oe,I=>{t(l)&&I(Ee)})}var Ce=i(Oe,2),Re=r(Ce),te=i(r(Re),2),X=r(te),be=i(te,2);{var Be=I=>{var ue=zd();S("click",ue,B),p(I,ue)};O(be,I=>{t(c)&&I(Be)})}var Ne=i(Re,4);{var Ze=I=>{var ue=$d();p(I,ue)},ut=I=>{var ue=Ua(),Ae=tt(ue);Je(Ae,17,()=>t(a),Xe,(He,N)=>{const ve=q(()=>f(t(N))),pe=q(()=>t(N).state==="running"?b(t(N).eta_s):""),je=q(()=>t(N).state==="running"&&t(N).rate_bps?ca(t(N).rate_bps)+"/s":""),Ve=q(()=>[t(pe),t(je)].filter(Boolean).join(" · ")),nt=q(()=>t(s).includes(t(N).id));var it=Bd(),et=r(it),bt=r(et),wt=i(bt,2),Ct=r(wt),Kt=i(wt,2);{var Pt=E=>{var Y=Pd(),ke=r(Y);z(Pe=>h(ke,`${Pe??""} %${t(Ve)?` · ${t(Ve)}`:""}`),[()=>Math.round(t(ve))]),p(E,Y)};O(Kt,E=>{t(ve)!=null&&E(Pt)})}var Dt=i(Kt,2);{var Lt=E=>{var Y=Dd();z(()=>At(Y,`${t(ve)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),S("click",Y,ke=>{ke.stopPropagation(),y(t(N).id)}),p(E,Y)},It=E=>{var Y=Id();S("click",Y,ke=>{ke.stopPropagation(),D(t(N).id)}),p(E,Y)};O(Dt,E=>{t(N).state==="running"?E(Lt):E(It,-1)})}var Tt=i(Dt,2);Ye(Tt,()=>T(t(N).state));var P=i(et,2);{var V=E=>{var Y=Ld(),ke=r(Y);z(()=>At(ke,`width:${t(ve)??""}%`)),p(E,Y)};O(P,E=>{t(ve)!=null&&t(N).state==="running"&&E(V)})}var $=i(P,2);{var G=E=>{var Y=Od(),ke=r(Y);z(Pe=>h(ke,Pe),[()=>(t(N).log||[]).join(` -`)]),p(E,Y)};O($,E=>{t(nt)&&E(G)})}z(E=>{Et(bt,1,`li-dot ${E??""}`),h(Ct,t(N).label)},[()=>_(t(N).state)]),S("click",et,()=>fa.toggle(t(N).id)),S("keydown",et,E=>E.key==="Enter"&&fa.toggle(t(N).id)),p(He,it)}),p(I,ue)};O(Ne,I=>{t(a).length?I(ut,-1):I(Ze)})}z(()=>h(X,t(a).length?t(v)?t(v)+" Fehler":t(a).length+" gesamt":"")),p(e,K),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=L(`Verbinde… -`),d=L("llama-swap"),c,v=L(null),f=L("");const b=new Set,T=q(()=>t(v)?t(s).find(A=>A.id===t(v)):null);bi(()=>{if(!t(T))return;const A=t(T),U=A.state==="done",oe=A.state==="failed",Me=A.state==="canceled";(U||oe||Me)&&!b.has(A.id)&&(b.add(A.id),ce(U?`✓ ${t(f)} abgeschlossen.`:Me?`${t(f)} abgebrochen.`:`✗ ${t(f)} fehlgeschlagen.`,oe),U&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function _(A,U){u(v,A,!0),u(f,U,!0),fa.track(A)}yi(()=>{y()}),qo(()=>{l==null||l.close()});function y(){l==null||l.close();const A=t(d);u(o,`Verbinde mit ${A}… -`);const U=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${U}//${location.host}/api/logs/${A}?token=${encodeURIComponent(al())}`),l.onmessage=oe=>{u(o,t(o)+oe.data),c&&(c.scrollTop=c.scrollHeight)},l.onclose=()=>{u(o,t(o)+` -— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function D(A,U,oe){if(await hn({title:U,body:oe,confirmLabel:"Neustarten"}))try{await we(`/api/service/${A}/restart`,{method:"POST"}),ce("Neustart ausgelöst: "+A),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Me){ce(Me.message,!0)}}async function B(){if(await hn({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 A=await we("/api/self-update",{method:"POST"});ce("Update läuft — Dashboard startet gleich neu."),_(A.job_id,"Mission Control Update")}catch(A){ce(A.message,!0)}}async function M(){if(!await hn({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 A=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(A!==null)try{const U=await we("/api/update",{method:"POST",body:JSON.stringify({password:A})});ce("LLM-Engine-Update läuft."),_(U.job_id,"LLM-Engine-Update")}catch(U){ce(U.message,!0)}}async function K(){if(await hn({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 we("/api/unload",{method:"POST"}),ce("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(A){ce(A.message,!0)}}async function Oe(){if(!await hn({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 A=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(A)try{const U=await we("/api/os-update",{method:"POST",body:JSON.stringify({password:A})});ce("OS-Update gestartet."),_(U.job_id,"OS-Update")}catch(U){ce(U.message,!0)}}async function Ee(){if(!await hn({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 A=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(A)try{await we("/api/reboot",{method:"POST",body:JSON.stringify({password:A})}),ce("Reboot ausgelöst — bis gleich.")}catch(U){ce(U.message,!0)}}async function Ce(){u(Re,"prüfe…");try{const A=await we("/api/integration/test");u(Re,A.ok?`✓ Engine antwortet — ${A.models.length} Modell(e): ${A.models.join(", ")}`:`✗ keine Verbindung: ${A.error}`,!0),u(te,A.ok,!0)}catch(A){u(Re,"✗ "+A.message),u(te,!1)}}let Re=L(""),te=L(!1);const X=q(()=>{var A;return((A=t(a))==null?void 0:A.models)||[]}),be=["running","ready","loading","starting"],Be=q(()=>t(X).find(A=>be.includes(A.state)));function Ne(A){if(!A||A.state!=="running")return null;if(typeof A.progress=="number")return Math.min(100,A.progress);const oe=((A.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return oe?Math.min(100,parseFloat(oe[1])):null}var Ze=Hd(),ut=i(tt(Ze),2),I=r(ut),ue=i(r(I),2),Ae=r(ue),He=i(I,4),N=r(He),ve=i(r(N)),pe=r(ve),je=i(N,2),Ve=i(r(je),2),nt=r(Ve),it=i(je,2),et=i(r(it),2),bt=r(et),wt=i(He,2),Ct=r(wt),Kt=i(Ct,2);{var Pt=A=>{var U=Kd(),oe=r(U);z(()=>{At(U,`color:${t(te)?"#7ee29a":"#ff9b95"}`),h(oe,t(Re))}),p(A,U)};O(Kt,A=>{t(Re)&&A(Pt)})}var Dt=i(ut,2),Lt=i(r(Dt),4),It=i(Lt,2),Tt=i(It,2),P=i(Tt,2),V=i(P,2),$=i(Dt,2),G=i(r($),4),E=i(G,2),Y=i($,2);{var ke=A=>{const U=q(()=>t(T)),oe=q(()=>t(U).state==="done"),Me=q(()=>t(U).state==="failed"),H=q(()=>t(U).state==="canceled"),le=q(()=>t(oe)||t(Me)||t(H)),Te=q(()=>Ne(t(U)));var ze=Ud(),x=r(ze),J=i(r(x),2);{var he=fe=>{var me=Nd();S("click",me,async()=>{await hn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&we(`/api/jobs/${t(U).id}/cancel`,{method:"POST"})}),p(fe,me)};O(J,fe=>{t(le)||fe(he)})}var W=i(J,2),xe=r(W);{var Ie=fe=>{var me=qd();p(fe,me)},Fe=fe=>{var me=Gd();p(fe,me)},De=fe=>{var me=Vd();p(fe,me)},j=fe=>{var me=Wd();p(fe,me)};O(xe,fe=>{t(oe)?fe(Ie):t(Me)?fe(Fe,1):t(H)?fe(De,2):fe(j,-1)})}var Q=i(x,2),Z=r(Q),F=i(Q,2);{var ne=fe=>{var me=jd(),_t=r(me);z(()=>At(_t,`width:${t(Te)??""}%`)),p(fe,me)};O(F,fe=>{t(Te)!=null&&!t(le)&&fe(ne)})}var _e=i(F,2),ge=r(_e);z(fe=>{h(Z,`${t(f)??""}${t(le)?t(oe)?" — erfolgreich.":t(H)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(ge,fe)},[()=>(t(U).log||[]).join(` -`)]),p(A,ze)};O(Y,A=>{t(T)&&A(ke)})}var Pe=i(Y,2),C=r(Pe),R=i(r(C),2),se=r(R);se.value=se.__value="llama-swap";var ie=i(se);ie.value=ie.__value="mission-control";var ee=i(ie);ee.value=ee.__value="system";var Se=i(C,4),de=r(Se);No(Se,A=>c=A,()=>c),z(A=>{var U,oe,Me;At(ue,`margin-left:auto;${(U=t(a))!=null&&U.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,(oe=t(a))!=null&&oe.swap_ok?"● erreichbar":"● offline"),h(pe,(((Me=t(a))==null?void 0:Me.swap_url)||"—")+"/v1"),h(nt,t(Be)?t(Be).name+` (${t(Be).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(bt,A),h(de,t(o))},[()=>t(X).filter(A=>!A.incomplete).length||"keine"]),S("click",Ct,Ce),S("click",Lt,()=>D("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",It,()=>D("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",Tt,B),S("click",P,M),S("click",V,K),S("click",G,Oe),S("click",E,Ee),S("change",R,y),Jn(R,()=>t(d),A=>u(d,A)),p(e,Ze),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(k){const w=(k||"").toLowerCase();for(const re of d)if(re.kw.some(ae=>w.includes(ae)))return re.label;return"Allrounder"}function v(k=""){const w=k.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(w)||new RegExp("(?{wt(),Ct()});async function wt(){u(B,!0);try{const k=await we("/api/cookbook/recipes");u(y,k.recipes||[],!0),u(D,k.recommended_id||null,!0)}catch(k){ce(k.message,!0)}u(B,!1)}async function Ct(k=!1){u(K,!0);try{const w=await we("/api/cookbook/discover"+(k?"?force=true":""));u(M,w,!0),u(Oe,w.stale,!0)}catch(w){ce("Empfehlungen nicht ladbar: "+w.message,!0)}u(K,!1)}function Kt(k){k=k.trim();const w=k.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return w?w[1]:/^[\w.-]+\/[\w.-]+$/.test(k)?k:null}async function Pt(){const k=t(Ee).trim(),w=Kt(k);let re=k;if(t(te)&&!w&&(re=re?re+" "+t(te):t(te)),!re&&!w){u(Ce,[],!0);return}u(Re,!0),u(be,[],!0),u(Be,-1);try{if(w)u(Ce,[{id:w,author:w.split("/")[0],downloads:0}],!0);else{const ae=`https://huggingface.co/api/models?search=${encodeURIComponent(re)}&filter=gguf&sort=${encodeURIComponent(t(X))}&direction=-1&limit=40`,Le=await fetch(ae);u(Ce,await Le.json(),!0)}t(Ce).forEach((ae,Le)=>Dt(Le,ae.id))}catch(ae){ce(ae.message,!0),u(Ce,[],!0)}u(Re,!1)}async function Dt(k,w){var re;try{const ae=await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})});if(!((re=ae.files)!=null&&re.length)){t(be)[k]=null,Lt();return}const Le=ae.files.find(ht=>{var yt;return(yt=ht.quant)==null?void 0:yt.includes("Q4_K_M")})||ae.files[0];t(be)[k]=Le.fit.level,Lt()}catch{t(be)[k]=null,Lt()}}function Lt(){let k=-1,w=99;t(be).forEach((re,ae)=>{if(re==null)return;const Le=l[re]??99;Le=0&&w<=1?k:-1,!0)}function It(k){u(Ne,t(y).find(w=>w.id===k),!0)}async function Tt(k){const w=document.getElementById("cb-r-install-btn");w&&(w.disabled=!0,w.textContent="Starte…");try{const re=await we("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:k,hf_token:di()})});ce(`${re.count} Download${re.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),u(Ne,null),bt("activity")}catch(re){ce(re.message,!0),w&&(w.disabled=!1,w.textContent="Installieren")}}async function P(k,w){var re,ae;u(Ze,!0),u(ut,w,!0),u(I,k,!0),u(He,""),u(N,8192),u(ue,null),u(pe,null),u(Ae,""),u(ve,!0);try{if(u(ue,await we("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})}),!0),(ae=(re=t(ue))==null?void 0:re.files)!=null&&ae.length){const Le=t(ue).files.find(ht=>{var yt;return(yt=ht.quant)==null?void 0:yt.includes("Q4_K_M")})||t(ue).files[0];u(Ae,Le.filename,!0),Le.optimal_ctx&&t(N)===8192&&u(N,Le.optimal_ctx,!0),V()}}catch(Le){ce(Le.message,!0)}u(ve,!1)}function V(){var k,w,re;!((w=(k=t(ue))==null?void 0:k.files)!=null&&w.length)||!t(Ae)||(u(pe,t(ue).files.find(ae=>ae.filename===t(Ae))||null,!0),(re=t(pe))!=null&&re.optimal_ctx&&t(N)===8192&&u(N,t(pe).optimal_ctx,!0))}async function $(){var k,w;if(!t(I)||!t(Ae))return ce("Bitte eine GGUF-Datei wählen.",!0);u(ve,!0);try{const re=((k=t(ue))==null?void 0:k.params_b)??7,ae=((w=t(pe))==null?void 0:w.quant)??"Q4_K_M";await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(I),role:t(He),params_b:re,quant:ae,file:t(Ae),ctx:t(N),hf_token:di()})}),ce("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),u(Ze,!1),bt("activity")}catch(re){ce("Fehler: "+re.message,!0)}u(ve,!1)}async function G(k,w,re,ae){ae.disabled=!0,ae.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k,role:w,params_b:re,quant:"Q4_K_M",hf_token:di()})}),ce("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),bt("activity")}catch(Le){ce(Le.message,!0),ae.disabled=!1,ae.textContent="Installieren"}}function E(){u(et,null),u(Ve,""),u(nt,""),u(it,[{repo:"",role:"",quant:"Q4_K_M"}],!0),u(je,!0)}function Y(k){const w=t(y).find(re=>re.id===k);w&&(u(et,k,!0),u(Ve,w.title,!0),u(nt,w.desc||"",!0),u(it,w.models.map(re=>({repo:re.repo,role:re.role,quant:re.quant||"Q4_K_M"})),!0),u(je,!0))}async function ke(){if(!t(Ve).trim())return ce("Bitte einen Titel angeben.",!0);const k=t(it).filter(w=>w.repo.trim());if(!k.length)return ce("Mindestens ein Modell (Repo) angeben.",!0);try{t(et)?(await we("/api/cookbook/user-recipe/"+encodeURIComponent(t(et)),{method:"PUT",body:JSON.stringify({title:t(Ve),desc:t(nt),models:k})}),ce("Setup aktualisiert.")):(await we("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(Ve),desc:t(nt),models:k})}),ce("Setup gespeichert.")),u(je,!1),wt()}catch(w){ce(w.message,!0)}}async function Pe(k){const w=t(y).find(re=>re.id===k);if(await hn({title:`„${(w==null?void 0:w.title)||k}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await we("/api/cookbook/user-recipe/"+encodeURIComponent(k),{method:"DELETE"}),ce("Setup gelöscht."),wt()}catch(re){ce(re.message,!0)}}function C(k){if(!v(k))return"";const w=f(k);return`MoE${w?` · ~${w}B aktiv`:""}`}function R(k){return k?`${Fn(k)}`:""}var se=zc(),ie=i(tt(se),2),ee=r(ie),Se=i(r(ee),2),de=i(ee,4);{var A=k=>{var w=Qd();p(k,w)},U=k=>{var w=ec();Je(w,21,()=>t(y),Xe,(re,ae)=>{const Le=q(()=>t(ae).id===t(D));var ht=Xd(),yt=r(ht);{var $e=Ge=>{var pt=Zd(),Zt=tt(pt),Gt=i(Zt,2);S("click",Zt,Bt=>{Bt.stopPropagation(),Y(t(ae).id)}),S("keydown",Zt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),Y(t(ae).id))}),S("click",Gt,Bt=>{Bt.stopPropagation(),Pe(t(ae).id)}),S("keydown",Gt,Bt=>{Bt.key==="Enter"&&(Bt.stopPropagation(),Pe(t(ae).id))}),p(Ge,pt)};O(yt,Ge=>{t(ae).user&&Ge($e)})}var We=i(yt,2);{var at=Ge=>{var pt=tr();p(Ge,pt)},St=Ge=>{var pt=Yd();p(Ge,pt)};O(We,Ge=>{t(Le)?Ge(at):t(ae).user&&Ge(St,1)})}var rt=i(We,2),ot=r(rt),xt=r(ot),Nt=r(xt),rn=i(ot,2),Mt=r(rn),st=i(rt,2),qt=r(st),Qt=i(st,2),$t=r(Qt);z((Ge,pt)=>{Et(ht,1,`card-btn${t(Le)?" cb-best":""}`),h(Nt,t(ae).title),Et(rn,1,`fit-badge ${Ge??""}`),h(Mt,pt),h(qt,t(ae).desc),h($t,`${t(ae).models.length??""} Modell${t(ae).models.length>1?"e":""} im Setup`)},[()=>b(t(ae).fit_level),()=>T(t(ae).fit_level)]),S("click",ht,()=>It(t(ae).id)),p(re,ht)}),p(k,w)};O(de,k=>{t(B)?k(A):k(U,-1)})}var oe=i(ie,2),Me=r(oe),H=i(r(Me),2),le=r(H);{var Te=k=>{const w=q(()=>Math.round((Date.now()/1e3-t(M).updated)/60));var re=nc(),ae=tt(re);{var Le=at=>{var St=li();z(()=>h(St,`Quellen befragt vor ${t(w)??""} min`)),p(at,St)},ht=at=>{var St=li();z(rt=>h(St,`Quellen befragt vor ${rt??""} h`),[()=>Math.round(t(w)/60)]),p(at,St)},yt=at=>{var St=li();z(rt=>h(St,`Quellen befragt vor ${rt??""} Tg.`),[()=>Math.round(t(w)/1440)]),p(at,St)};O(ae,at=>{t(w)<60?at(Le):t(w)<1440?at(ht,1):at(yt,-1)})}var $e=i(ae,2);{var We=at=>{var St=tc();p(at,St)};O($e,at=>{t(Oe)&&at(We)})}p(k,re)};O(le,k=>{var w;(w=t(M))!=null&&w.updated&&k(Te)})}var ze=i(H,2),x=r(ze),J=i(Me,4);{var he=k=>{var w=ac();p(k,w)},W=k=>{var w=Ua(),re=tt(w);Je(re,17,()=>t(M).categories,Xe,(ae,Le)=>{var ht=oc(),yt=r(ht),$e=r(yt),We=r($e),at=i(yt,2);Je(at,21,()=>t(Le).models,Xe,(St,rt)=>{const ot=q(()=>t(Le).recommended&&t(rt).repo===t(Le).recommended);var xt=lc(),Nt=r(xt);{var rn=ft=>{var mt=tr();p(ft,mt)};O(Nt,ft=>{t(ot)&&ft(rn)})}var Mt=i(Nt,2),st=r(Mt),qt=r(st),Qt=r(qt),$t=i(qt,2),Ge=r($t),pt=i(st,2),Zt=r(pt),Gt=i(Mt,2),Bt=r(Gt);Ye(Bt,()=>R(o[t(rt).role]||c(t(rt).repo)));var Gn=i(Bt,2);Ye(Gn,()=>C(t(rt).repo));var Yn=i(Gt,2),Dn=r(Yn),Ca=i(Yn,2);Je(Ca,17,()=>t(rt).requirements||[],Xe,(ft,mt)=>{var Wt=ic(),In=r(Wt);z(()=>h(In,`⚠ ${t(mt)??""}`)),p(ft,Wt)});var kt=i(Ca,4),dt=r(kt);{var gt=ft=>{var mt=rc();z(()=>Aa(mt,"title",`bereits eingerichtet als ${t(rt).installed??""}`)),p(ft,mt)},Rt=ft=>{var mt=sc();S("click",mt,Wt=>G(t(rt).repo,t(rt).role,t(rt).params_b,Wt.currentTarget)),p(ft,mt)};O(dt,ft=>{t(rt).installed?ft(gt):ft(Rt,-1)})}z((ft,mt,Wt)=>{Et(xt,1,`card${t(ot)?" res-best":""}`),h(Qt,t(rt).name),h(Ge,`${t(rt).author??""} · ${t(rt).params_b??""}B`),Et(pt,1,`fit-badge ${ft??""}`),h(Zt,t(rt).fit.text),h(Dn,`${mt??""} · ⬇ ${Wt??""}`)},[()=>b(t(rt).fit.level),()=>_(t(rt).fit),()=>(t(rt).downloads||0).toLocaleString()]),p(St,xt)}),z(()=>h(We,t(Le).title)),p(ae,ht)}),p(k,w)};O(J,k=>{var w;t(K)&&!t(M)?k(he):(w=t(M))!=null&&w.categories&&k(W,1)})}var xe=i(oe,2),Ie=i(r(xe),4),Fe=r(Ie),De=i(Fe,2),j=r(De);j.value=j.__value="downloads";var Q=i(j);Q.value=Q.__value="trending";var Z=i(Q);Z.value=Z.__value="created_at";var F=i(De,2),ne=r(F),_e=i(Ie,2);Je(_e,20,()=>["","coder","vision","reasoning","chat","agent"],Xe,(k,w)=>{var re=dc(),ae=r(re);z(()=>{Et(re,1,t(te)===w?"primary":"ghost"),h(ae,w||"Alle")}),S("click",re,()=>{u(te,w,!0),Pt()}),p(k,re)});var ge=i(_e,2);{var fe=k=>{var w=vc();Je(w,21,()=>t(Ce),Xe,(re,ae,Le)=>{var ht=cc(),yt=r(ht);{var $e=Gt=>{var Bt=tr();p(Gt,Bt)};O(yt,Gt=>{Le===t(Be)&&Gt($e)})}var We=i(yt,2),at=r(We),St=r(at),rt=r(St),ot=i(St,2),xt=r(ot),Nt=i(at,2),rn=r(Nt),Mt=i(We,2),st=r(Mt);Ye(st,()=>R(c(t(ae).id)));var qt=i(st,2);Ye(qt,()=>C(t(ae).id));var Qt=i(Mt,4),$t=r(Qt),Ge=r($t),pt=i($t,2),Zt=r(pt);z((Gt,Bt,Gn,Yn,Dn)=>{Et(ht,1,`card${Le===t(Be)?" res-best":""}`),h(rt,Gt),h(xt,t(ae).author||""),Et(Nt,1,`fit-badge ${Bt??""}`),h(rn,Gn),h(Ge,Yn),h(Zt,`⬇ ${Dn??""}`)},[()=>t(ae).id.split("/").pop(),()=>t(be)[Le]?b(t(be)[Le]):"warn",()=>t(be)[Le]?T(t(be)[Le]):"prüfe…",()=>t(be)[Le]?_({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(ae).downloads||0).toLocaleString()]),S("click",ht,()=>P(t(ae).id,t(ae).id.split("/").pop())),p(re,ht)}),p(k,w)};O(ge,k=>{t(Ce).length&&k(fe)})}var me=i(xe,2);{var _t=k=>{const w=q(()=>t(Ne));var re=_c(),ae=r(re),Le=r(ae),ht=i(Le,2),yt=r(ht),$e=i(ht,2),We=r($e),at=i($e,2);Je(at,21,()=>t(w).models,Xe,(Mt,st)=>{var qt=hc(),Qt=r(qt),$t=r(Qt),Ge=r($t),pt=r(Ge),Zt=i(Ge,2),Gt=r(Zt),Bt=i(Zt,2);Ye(Bt,()=>C(t(st).repo));var Gn=i($t,2);{var Yn=gt=>{var Rt=uc(),ft=r(Rt);z(()=>h(ft,t(st).why)),p(gt,Rt)};O(Gn,gt=>{t(st).why&>(Yn)})}var Dn=i(Gn,2);{var Ca=gt=>{var Rt=pc(),ft=r(Rt);z((mt,Wt,In)=>h(ft,`~${mt??""} GB · ~${Wt??""} 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)]),p(gt,Rt)};O(Dn,gt=>{t(st).fit&>(Ca)})}var kt=i(Qt,2);{var dt=gt=>{var Rt=fc(),ft=r(Rt);z(mt=>{Et(Rt,1,`fit-badge ${mt??""}`),h(ft,t(st).fit.text)},[()=>b(t(st).fit.level)]),p(gt,Rt)};O(kt,gt=>{t(st).fit&>(dt)})}z(()=>{h(pt,t(st).name),h(Gt,t(st).role)}),p(Mt,qt)});var St=i(at,2);{var rt=Mt=>{const st=q(()=>Math.max(...t(w).models.map(Ge=>{var pt;return((pt=Ge.fit)==null?void 0:pt.req_gb)??0})));var qt=gc(),Qt=i(r(qt)),$t=r(Qt);z(Ge=>h($t,`~${Ge??""} GB`),[()=>t(st).toFixed(1)]),p(Mt,qt)};O(St,Mt=>{t(w).models.length&&t(w).models[0].fit&&Mt(rt)})}var ot=i(St,2);{var xt=Mt=>{const st=q(()=>t(y).find(Ge=>!Ge.user&&Ge.fit_level!=="too_tight"&&Ge.id!==t(w).id));var qt=bc(),Qt=i(r(qt));{var $t=Ge=>{var pt=mc(),Zt=i(tt(pt)),Gt=r(Zt);z(()=>h(Gt,`„${t(st).title??""}" ansehen`)),S("click",Zt,Bt=>{Bt.preventDefault(),u(Ne,null),setTimeout(()=>It(t(st).id),50)}),p(Ge,pt)};O(Qt,Ge=>{t(st)&&Ge($t)})}p(Mt,qt)};O(ot,Mt=>{t(w).fit_level==="too_tight"&&Mt(xt)})}var Nt=i(ot,2),rn=r(Nt);z(()=>{h(yt,t(w).title),h(We,t(w).desc),Et(Nt,1,`primary${t(w).fit_level==="too_tight"?" warn":""}`),h(rn,t(w).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),S("click",re,Mt=>{Mt.target.classList.contains("modal-overlay")&&u(Ne,null)}),S("click",Le,()=>u(Ne,null)),S("click",Nt,()=>Tt(t(w).id)),p(k,re)};O(me,k=>{t(Ne)&&k(_t)})}var zt=i(me,2);{var Ot=k=>{var w=Ac(),re=r(w),ae=r(re),Le=i(ae,2),ht=r(Le),yt=i(Le,2),$e=r(yt),We=i(yt,2);{var at=ot=>{var xt=yc();p(ot,xt)},St=ot=>{var xt=Mc(),Nt=i(tt(xt),2);Je(Nt,21,()=>t(ue).files,Xe,(kt,dt)=>{const gt=q(()=>t(dt).fit.level==="perfect"?"●":t(dt).fit.level==="marginal"?"◐":"○");var Rt=Yr(),ft=r(Rt),mt={};z(()=>{h(ft,`${t(gt)??""} ${t(dt).filename??""}`),mt!==(mt=t(dt).filename)&&(Rt.value=(Rt.__value=t(dt).filename)??"")}),p(kt,Rt)});var rn=i(Nt,2),Mt=r(rn),st=i(r(Mt),2),qt=i(Mt,2),Qt=r(qt),$t=i(r(Qt));Ye($t,()=>br(a));var Ge=i(Qt,2),pt=i(rn,2);{var Zt=kt=>{var dt=xc(),gt=i(r(dt)),Rt=r(gt),ft=i(gt,2);z(mt=>h(Rt,`~${mt??""}k`),[()=>Math.round(t(pe).optimal_ctx/1024)]),S("click",ft,mt=>{mt.preventDefault(),u(N,t(pe).optimal_ctx,!0)}),p(kt,dt)};O(pt,kt=>{var dt;(dt=t(pe))!=null&&dt.optimal_ctx&&kt(Zt)})}var Gt=i(pt,2);{var Bt=kt=>{var dt=kc(),gt=r(dt),Rt=i(r(gt),2),ft=r(Rt),mt=i(gt,2),Wt=r(mt);z((In,ki,Wi)=>{h(ft,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(pe).quant||"GGUF")??""}`),Et(mt,1,`fit-badge ${Wi??""}`),h(Wt,t(pe).fit.text)},[()=>(t(pe).fit.req_gb??0).toFixed(1),()=>Math.round(t(pe).fit.tps??0),()=>b(t(pe).fit.level)]),p(kt,dt)};O(Gt,kt=>{t(pe)&&kt(Bt)})}var Gn=i(Gt,2);{var Yn=kt=>{const dt=q(()=>t(ue).files.find(Wt=>Wt.fit.level!=="too_tight"&&Wt.filename!==t(Ae)));var gt=Ua(),Rt=tt(gt);{var ft=Wt=>{var In=wc(),ki=i(r(In)),Wi=r(ki);z(ji=>h(Wi,`${t(dt).filename??""} (${ji??""})`),[()=>T(t(dt).fit.level)]),S("click",ki,ji=>{ji.preventDefault(),u(Ae,t(dt).filename,!0),V()}),p(Wt,In)},mt=Wt=>{var In=Sc();p(Wt,In)};O(Rt,Wt=>{t(dt)?Wt(ft):Wt(mt,-1)})}p(kt,gt)};O(Gn,kt=>{var dt,gt;((dt=t(pe))==null?void 0:dt.fit.level)==="too_tight"&&((gt=t(ue))!=null&>.files)&&kt(Yn)})}var Dn=i(Gn,2),Ca=r(Dn);z(()=>{var kt,dt;Et(Dn,1,`primary${((kt=t(pe))==null?void 0:kt.fit.level)==="too_tight"?" warn":""}`),Dn.disabled=t(ve),h(Ca,t(ve)?"Starte…":((dt=t(pe))==null?void 0:dt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),S("change",Nt,V),Jn(Nt,()=>t(Ae),kt=>u(Ae,kt)),dn(st,()=>t(He),kt=>u(He,kt)),dn(Ge,()=>t(N),kt=>u(N,kt)),S("click",Dn,$),p(ot,xt)},rt=ot=>{var xt=Ec();p(ot,xt)};O(We,ot=>{var xt,Nt;t(ve)&&!t(ue)?ot(at):(Nt=(xt=t(ue))==null?void 0:xt.files)!=null&&Nt.length?ot(St,1):t(ve)||ot(rt,2)})}z(()=>{h(ht,t(ut)),h($e,t(I))}),S("click",w,ot=>{ot.target.classList.contains("modal-overlay")&&u(Ze,!1)}),S("click",ae,()=>u(Ze,!1)),p(k,w)};O(zt,k=>{t(Ze)&&k(Ot)})}var gn=i(zt,2);{var da=k=>{var w=Tc(),re=r(w),ae=r(re),Le=i(ae,2),ht=r(Le),yt=i(Le,6),$e=i(yt,4),We=i($e,4);Je(We,17,()=>t(it),Xe,(ot,xt,Nt)=>{var rn=Cc(),Mt=r(rn),st=i(Mt,2),qt=i(st,2);Je(qt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Xe,($t,Ge)=>{var pt=Yr(),Zt=r(pt),Gt={};z(()=>{h(Zt,Ge),Gt!==(Gt=Ge)&&(pt.__value=Ge)}),p($t,pt)});var Qt=i(qt,2);dn(Mt,()=>t(xt).repo,$t=>t(xt).repo=$t),dn(st,()=>t(xt).role,$t=>t(xt).role=$t),Jn(qt,()=>t(xt).quant,$t=>t(xt).quant=$t),S("click",Qt,()=>u(it,t(it).filter(($t,Ge)=>Ge!==Nt),!0)),p(ot,rn)});var at=i(We,2),St=i(at,4),rt=r(St);z(()=>{h(ht,t(et)?"Setup bearbeiten":"Eigenes Setup erstellen"),h(rt,t(et)?"Änderungen speichern":"Setup speichern")}),S("click",w,ot=>{ot.target.classList.contains("modal-overlay")&&u(je,!1)}),S("click",ae,()=>u(je,!1)),dn(yt,()=>t(Ve),ot=>u(Ve,ot)),dn($e,()=>t(nt),ot=>u(nt,ot)),S("click",at,()=>u(it,[...t(it),{repo:"",role:"",quant:"Q4_K_M"}],!0)),S("click",St,ke),p(k,w)};O(gn,k=>{t(je)&&k(da)})}z(()=>{ze.disabled=t(K),h(x,t(K)?"Suche…":"Aktualisieren"),F.disabled=t(Re),h(ne,t(Re)?"Lade…":"Suchen")}),S("click",Se,E),S("click",ze,()=>Ct(!0)),S("keydown",Fe,k=>k.key==="Enter"&&Pt()),dn(Fe,()=>t(Ee),k=>u(Ee,k)),Jn(De,()=>t(X),k=>u(X,k)),S("click",F,Pt),p(e,se),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 C;return(((C=t(a))==null?void 0:C.models)||[]).filter(R=>!R.incomplete)});let l=L("zed"),o=L(jt([])),d=L(""),c=L(!1),v=L("cline"),f=L(jt(localStorage.getItem("mc_ip_override")||""));function b(C){return/^\d{1,3}(\.\d{1,3}){3}$/.test(C)}function T(){return location.protocol==="https:"||!b(location.hostname)}function _(){return`http://${t(f).trim()||location.hostname}:8080/v1`}const y=q(_);function D(){const C=t(f).trim();C?localStorage.setItem("mc_ip_override",C):localStorage.removeItem("mc_ip_override")}const B=q(()=>Be(t(v))),M=q(()=>t(o).length?t(o):t(s).map(C=>C.name)),K=q(()=>t(M)[0]||"coder"),Oe=q(()=>{var C;return(C=t(s).find(R=>{var se,ie;return(ie=(se=R.meta)==null?void 0:se.caps)==null?void 0:ie.includes("Bild")}))==null?void 0:C.name});function Ee(C,R){const ie=(R.length?t(s).filter(ee=>R.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>{var A,U;const Se=(((A=ee.meta)==null?void 0:A.caps)||[]).some(oe=>/Bild|Vision/i.test(oe)),de=((U=ee.meta)==null?void 0:U.ctx)||131072;return` { "name": "${ee.name}", "display_name": "${ee.name}", "max_tokens": ${de}${Se?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, + + `;const c=v.querySelector("input"),f=b=>{v.remove(),d(b)};v.addEventListener("click",b=>{if(b.target===v)return f(null);const T=b.target.closest("[data-x]");T&&f(T.getAttribute("data-x")==="1"?c.value||"":null)}),c.addEventListener("keydown",b=>{b.key==="Enter"&&f(c.value||""),b.key==="Escape"&&f(null)}),document.body.appendChild(v),c.focus()})}function ed(e="overview"){const n=Yr(".nav-item[data-view]:not(.disabled)"),a=Yr(".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 es=B(null);const Si={get value(){return t(es)},set(e){u(es,e,!0)}};let ts=B(Rt([])),na=B(Rt([]));const ga={get value(){return t(ts)},set(e){u(ts,e||[],!0)},get tracked(){return t(na)},track(e){t(na).includes(e)||u(na,[...t(na),e],!0)},toggle(e){u(na,t(na).includes(e)?t(na).filter(n=>n!==e):[...t(na),e],!0)}};let ns=B(null);const Rr={get value(){return t(ns)},set(e){u(ns,e,!0)}},td="5";var hs;typeof window<"u"&&((hs=window.__svelte??(window.__svelte={})).v??(hs.v=new Set)).add(td);var nd=g('— bereit für Anfragen'),ad=g('
Temperatur (GPU)
Freier Speicher
GB
',1),id=g('
Temperatur
messe…
Freier Speicher
messe…
',1),rd=g('
'),sd=g('
Warte auf Messwerte…
'),ld=g('
Noch kein Modell eingerichtet — starte hier:
',1),od=g('
Die häufigsten Aufgaben — ein Klick.
',1),dd=g('Bild'),cd=g('Code'),vd=g('Text'),ud=g('∞ aktiv'),pd=g(''),fd=g('
'),as=g('
'),hd=g('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),gd=g('
'),md=g('
News gerade nicht ladbar.
'),bd=g('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

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

'),zd=g(''),$d=g(''),Pd=g(''),Dd=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 Id(e,n){Dn(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=V(()=>{var D;return((D=Si.value)==null?void 0:D.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let v=B(""),c=B(""),f=B(""),b=B(!1);const T=V(()=>t(o).filter(D=>!D.incomplete));async function _(){var J;const D=t(v)||((J=t(T)[0])==null?void 0:J.name);if(!(!D||!t(c).trim())){u(b,!0),u(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const I=await Se("/api/chat",{method:"POST",body:JSON.stringify({model:D,message:t(c)})});u(f,I.reply,!0)}catch(I){u(f,"Fehler: "+I.message)}u(b,!1),d()}}const x=300;let $=B(!1),R=B(null),A=B(8192),N=B(!1);function Pe(D){var J;u(R,t(o).find(I=>I.name===D),!0),t(R)&&(u(A,((J=t(R).meta)==null?void 0:J.ctx)||8192,!0),u(N,(t(R).ttl??x)>=99999),u($,!0))}async function Me(){const D=t(N)?99999:x;try{await Se("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(R).name,ctx:t(A),ttl:D})}),ve("Gespeichert — aktiv beim nächsten Modell-Start."),u($,!1),d()}catch(J){ve(J.message,!0)}}let Ce=B(!1),De=B(""),ie=B(""),te=B("");function _e(D){const J=t(o).find(I=>I.name===D);u(De,D,!0),u(te,(J==null?void 0:J.role)||"",!0),u(ie,""),u(Ce,!0)}async function Ie(D){try{await Se("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(De),role:D})}),ve(D?`Rolle gesetzt: ${D}`:"Rolle entfernt."),u(Ce,!1),d()}catch(J){ve(J.message,!0)}}async function He(D){if(await hn({title:`„${D}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await Se("/api/unload?model="+encodeURIComponent(D),{method:"POST"}),ve("Entladen: "+D),setTimeout(d,600)}catch(J){ve(J.message,!0)}}async function Ne(D){if(await hn({title:`„${D}" 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 J=await Se("/api/delete_model",{method:"POST",body:JSON.stringify({alias:D})});ve(J.note||"Gelöscht: "+D),setTimeout(d,600)}catch(J){ve(J.message,!0)}}function ot(D){if(!D)return"–";const J=[];return D.coder&&J.push('Code'),D.vision&&J.push('Bild'),D.reasoning&&J.push('🧠 Reason'),D.moe&&J.push(`🧩 MoE${D.active_b?" ·"+D.active_b+"B":""}`),D.tools==="yes"?J.push('🛠 Tools'):D.tools==="likely"&&J.push('🛠 Tools?'),D.embedding&&J.push('🔢 Embed'),!D.coder&&!D.vision&&!D.embedding&&J.unshift('Text'),J.length?J.join(" "):"–"}function P(D){if(!D)return"–";const J=D.quant||"?",I=D.ctx?Math.round(D.ctx/1024)+"K":"?",W=D.size_bytes?(D.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${J} · ${I} · ${W}`}function ye(D){var J;(J=navigator.clipboard)==null||J.writeText(D),ve("Kopiert: "+D)}var qe=Dd(),Qe=i(tt(qe),2),q=i(r(Qe),6);Ze(q,21,()=>t(T),et,(D,J)=>{var I=yd(),W=r(I),M={};z(()=>{h(W,t(J).name),M!==(M=t(J).name)&&(I.value=(I.__value=t(J).name)??"")}),p(D,I)});var oe=i(q,4),Le=i(oe,2),Ge=r(Le),je=i(Le,2);{var Oe=D=>{var J=xd(),I=r(J);z(()=>h(I,t(f))),p(D,J)};O(je,D=>{t(f)&&D(Oe)})}var dt=i(Qe,2),Xe=r(dt),pt=i(r(Xe)),ct=r(pt),mt=i(Xe,4);{var Ct=D=>{var J=kd();p(D,J)},Tt=D=>{var J=Cd(),I=i(r(J));Ze(I,21,()=>t(o),et,(W,M)=>{var ee=Ea(),xe=tt(ee);{var Te=F=>{var re=wd(),se=r(re),ne=r(se),ke=i(se,5),de=r(ke),E=i(de,2);z(()=>h(ne,t(M).name)),S("click",de,()=>{var Q;ve("Lade im Cookbook ein Modell und setze den Alias auf: "+t(M).name),(Q=document.querySelector(".nav-item[data-view='cookbook']"))==null||Q.dispatchEvent(new MouseEvent("click"))}),S("click",E,()=>Ne(t(M).name)),p(F,re)},C=F=>{var re=Ad(),se=r(re),ne=r(se),ke=r(ne),de=i(ke);{var E=$e=>{var H=Sd(),Y=r(H);z(()=>h(Y,t(M).role)),p($e,H)};O(de,$e=>{t(M).role&&$e(E)})}var Q=i(ne,2);{var ce=$e=>{var H=Md(),Y=r(H);z(()=>h(Y,t(M).meta.filename)),p($e,H)};O(Q,$e=>{var H;(H=t(M).meta)!=null&&H.filename&&$e(ce)})}var Ee=i(Q,2),Z=i(r(Ee),2);Ze(Z,17,()=>{var $e;return($e=t(M).api_ids)!=null&&$e.length?t(M).api_ids:[t(M).name]},et,($e,H)=>{var Y=Ed(),X=r(Y);z(()=>h(X,t(H))),S("click",Y,()=>ye(t(H))),p($e,Y)});var le=i(se);nt(le,()=>{var $e;return ot(($e=t(M).meta)==null?void 0:$e.capabilities)},!0);var Ae=i(le);nt(Ae,()=>P(t(M).meta),!0);var ze=i(Ae);nt(ze,()=>Xo(t(M).state,t(M).download_progress),!0);var w=i(ze),j=r(w),pe=i(w),U=r(pe),we=i(U,2),Be=i(we,2),Fe=i(Be,2);z(()=>{h(ke,`${t(M).name??""} `),h(j,t(M).port??"auto")}),S("click",U,()=>_e(t(M).name)),S("click",we,()=>Pe(t(M).name)),S("click",Be,()=>He(t(M).name)),S("click",Fe,()=>Ne(t(M).name)),p(F,re)};O(xe,F=>{t(M).incomplete?F(Te):F(C,-1)})}p(W,ee)}),p(D,J)};O(mt,D=>{t(o).length?D(Tt,-1):D(Ct)})}var Mt=i(dt,2);{var Ft=D=>{var J=zd(),I=r(J),W=r(I),M=i(W,4),ee=r(M),xe=i(M,2),Te=i(r(xe));nt(Te,()=>Sr(a));var C=i(xe,2),F=i(C,2);{var re=ce=>{var Ee=Td(),Z=r(Ee),le=i(r(Z),2),Ae=r(le),ze=i(Ae,2),w=i(Z,2);z((j,pe)=>{h(Ae,`Optimal ~${j??""}k → ~${t(R).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),h(ze,` Aktuell ~${pe??""}k → ~${t(R).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(R).meta.optimal_ctx/1024),()=>Math.round((t(R).meta.ctx||0)/1024)]),S("click",w,()=>u(A,t(R).meta.optimal_ctx,!0)),p(ce,Ee)};O(F,ce=>{var Ee;(Ee=t(R).meta)!=null&&Ee.optimal_ctx&&ce(re)})}var se=i(F,4),ne=i(r(se),2),ke=r(ne),de=i(ke,2),E=r(de),Q=i(se,2);z(()=>{h(ee,t(R).name),St(de,`color:${t(N)?"var(--accent)":"var(--mut)"}`),h(E,t(N)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),S("click",J,ce=>{ce.target.classList.contains("modal-overlay")&&u($,!1)}),S("click",W,()=>u($,!1)),on(C,()=>t(A),ce=>u(A,ce)),jo(ke,()=>t(N),ce=>u(N,ce)),S("click",Q,Me),p(D,J)};O(Mt,D=>{t($)&&t(R)&&D(Ft)})}var zt=i(Mt,2);{var Et=D=>{var J=Pd(),I=r(J),W=r(I),M=i(W,2),ee=i(r(M));nt(ee,()=>Sr(s));var xe=i(M,2),Te=r(xe),C=i(xe,4);Ze(C,21,()=>l,et,(ke,de)=>{var E=$d(),Q=r(E);z(()=>{wt(E,1,t(te)===t(de).id?"primary":"ghost"),za(E,"title",t(de).desc),h(Q,t(de).label)}),S("click",E,()=>Ie(t(de).id)),p(ke,E)});var F=i(C,4),re=i(F,2),se=r(re),ne=i(se,2);z(()=>h(Te,t(De))),S("click",J,ke=>{ke.target.classList.contains("modal-overlay")&&u(Ce,!1)}),S("click",W,()=>u(Ce,!1)),on(F,()=>t(ie),ke=>u(ie,ke)),S("click",se,()=>Ie("")),S("click",ne,()=>Ie(t(ie).trim().toLowerCase())),p(D,J)};O(zt,D=>{t(Ce)&&D(Et)})}z(()=>{Le.disabled=t(b),h(Ge,t(b)?"…":"Senden"),h(ct,t(o).length?t(o).length+" konfiguriert":"")}),Jn(q,()=>t(v),D=>u(v,D)),on(oe,()=>t(c),D=>u(c,D)),S("click",Le,_),p(e,qe),In()}Gn(["click"]);var Ld=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),Od=g(''),Bd=g('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Rd=g(' '),Fd=g(''),Kd=g(''),Nd=g('
'),qd=g('
'),Gd=g('
'),Vd=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 Wd(e,n){Dn(n,!0);const a=V(()=>ga.value),s=V(()=>ga.tracked),l=V(()=>Rr.value);let o=Rt({cpu:[],ram:[],gpu:[]});xi(()=>{var qe;if(!t(l))return;const P=t(l).gpu,ye=P&&P.vram.total+P.gtt.total>0?(P.vram.used+P.gtt.used)/(P.vram.total+P.gtt.total)*100:0;o.cpu=[...o.cpu,((qe=t(l).cpu)==null?void 0:qe.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,ye].slice(-60)});const d=V(()=>()=>{var ye;const P=(ye=t(l))==null?void 0:ye.gpu;return P&&P.vram.total+P.gtt.total>0?(P.vram.used+P.gtt.used)/(P.vram.total+P.gtt.total)*100:0}),v=V(()=>t(a).filter(P=>P.state!=="running"&&P.state!=="queued").length),c=V(()=>t(a).filter(P=>P.state==="failed").length);function f(P){if(P.state!=="running")return null;if(typeof P.progress=="number")return Math.min(100,P.progress);const qe=((P.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return qe?Math.min(100,parseFloat(qe[1])):null}function b(P){return P==null||P<0?"":P>=90?`noch ~${Math.round(P/60)} min`:`noch ~${Math.max(1,Math.round(P))} s`}function T(P){return P==="done"?'fertig':P==="failed"?'fehler':P==="canceled"?'abgebrochen':'läuft…'}function _(P){return P==="done"?"on":P==="failed"||P==="canceled"?"":"load"}async function x(P){try{await Se(`/api/jobs/${P}/cancel`,{method:"POST"}),ve("Abbruch angefordert…")}catch(ye){ve(ye.message,!0)}}async function $(P){try{await Se(`/api/jobs/${P}`,{method:"DELETE"})}catch(ye){ve(ye.message,!0)}}async function R(){try{const P=await Se("/api/jobs/clear",{method:"POST"});ve(`${P.removed} Einträge entfernt.`)}catch(P){ve(P.message,!0)}}function A(P,ye){return P.map(qe=>`
`).join("")}var N=Vd(),Pe=i(tt(N),2);{var Me=P=>{const ye=V(()=>t(d)());var qe=Ld(),Qe=tt(qe),q=r(Qe),oe=i(r(q),2),Le=r(oe),Ge=i(oe,2),je=r(Ge),Oe=i(q,2),dt=i(r(Oe),2),Xe=r(dt),pt=i(dt,2),ct=r(pt),mt=i(Oe,2),Ct=i(r(mt),2),Tt=r(Ct),Mt=i(Ct,2),Ft=r(Mt),zt=i(Qe,2),Et=i(r(zt),4),D=r(Et),J=i(r(D)),I=r(J),W=i(D,2),M=i(r(W),2),ee=r(M),xe=i(W,2),Te=i(r(xe)),C=r(Te),F=i(xe,2),re=i(r(F),2),se=r(re),ne=i(Et,2),ke=r(ne),de=i(r(ke));nt(de,()=>A(o.cpu,"--accent"),!0);var E=i(ke,2),Q=i(r(E));nt(Q,()=>A(o.ram,"--purple"),!0);var ce=i(E,2),Ee=i(r(ce));nt(Ee,()=>A(o.gpu,"--on"),!0),z((Z,le,Ae,ze,w,j,pe,U,we,Be,Fe,$e,H)=>{h(Le,Z),h(je,le),h(Xe,Ae),h(ct,`${ze??""} / ${w??""}`),h(Tt,j),h(Ft,pe),h(I,`${U??""} / ${we??""}`),h(ee,Be),h(C,`${Fe??""} % belegt`),h(se,`${$e??""} / ${H??""}`)},[()=>{var Z;return Math.round(((Z=t(l).cpu)==null?void 0:Z.percent)??0)},()=>{var Z;return((Z=t(l).cpu)==null?void 0:Z.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>ua(t(l).ram.used),()=>ua(t(l).ram.total),()=>Math.round(t(ye)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ua(t(l).ram.used),()=>ua(t(l).ram.total),()=>t(l).gpu?`${ua(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${ua(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var Z;return Math.round(((Z=t(l).disk)==null?void 0:Z.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var Z;return((Z=t(l).cpu)==null?void 0:Z.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),p(P,qe)};O(Pe,P=>{t(l)&&P(Me)})}var Ce=i(Pe,2),De=r(Ce),ie=i(r(De),2),te=r(ie),_e=i(ie,2);{var Ie=P=>{var ye=Od();S("click",ye,R),p(P,ye)};O(_e,P=>{t(v)&&P(Ie)})}var He=i(De,4);{var Ne=P=>{var ye=Bd();p(P,ye)},ot=P=>{var ye=Ea(),qe=tt(ye);Ze(qe,17,()=>t(a),et,(Qe,q)=>{const oe=V(()=>f(t(q))),Le=V(()=>t(q).state==="running"?b(t(q).eta_s):""),Ge=V(()=>t(q).state==="running"&&t(q).rate_bps?ua(t(q).rate_bps)+"/s":""),je=V(()=>[t(Le),t(Ge)].filter(Boolean).join(" · ")),Oe=V(()=>t(s).includes(t(q).id));var dt=Gd(),Xe=r(dt),pt=r(Xe),ct=i(pt,2),mt=r(ct),Ct=i(ct,2);{var Tt=M=>{var ee=Rd(),xe=r(ee);z(Te=>h(xe,`${Te??""} %${t(je)?` · ${t(je)}`:""}`),[()=>Math.round(t(oe))]),p(M,ee)};O(Ct,M=>{t(oe)!=null&&M(Tt)})}var Mt=i(Ct,2);{var Ft=M=>{var ee=Fd();z(()=>St(ee,`${t(oe)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),S("click",ee,xe=>{xe.stopPropagation(),x(t(q).id)}),p(M,ee)},zt=M=>{var ee=Kd();S("click",ee,xe=>{xe.stopPropagation(),$(t(q).id)}),p(M,ee)};O(Mt,M=>{t(q).state==="running"?M(Ft):M(zt,-1)})}var Et=i(Mt,2);nt(Et,()=>T(t(q).state));var D=i(Xe,2);{var J=M=>{var ee=Nd(),xe=r(ee);z(()=>St(xe,`width:${t(oe)??""}%`)),p(M,ee)};O(D,M=>{t(oe)!=null&&t(q).state==="running"&&M(J)})}var I=i(D,2);{var W=M=>{var ee=qd(),xe=r(ee);z(Te=>h(xe,Te),[()=>(t(q).log||[]).join(` +`)]),p(M,ee)};O(I,M=>{t(Oe)&&M(W)})}z(M=>{wt(pt,1,`li-dot ${M??""}`),h(mt,t(q).label)},[()=>_(t(q).state)]),S("click",Xe,()=>ga.toggle(t(q).id)),S("keydown",Xe,M=>M.key==="Enter"&&ga.toggle(t(q).id)),p(Qe,dt)}),p(P,ye)};O(He,P=>{t(a).length?P(ot,-1):P(Ne)})}z(()=>h(te,t(a).length?t(c)?t(c)+" Fehler":t(a).length+" gesamt":"")),p(e,N),In()}Gn(["click","keydown"]);var jd=g(' '),Ud=g(''),Hd=g('✓ fertig'),Jd=g('✗ fehlgeschlagen'),Qd=g('abgebrochen'),Zd=g('läuft…'),Yd=g('
'),Xd=g('

Aktueller Vorgang

'),ec=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 tc(e,n){Dn(n,!0);const a=V(()=>Si.value),s=V(()=>ga.value);let l=null,o=B(`Verbinde… +`),d=B("llama-swap"),v,c=B(null),f=B("");const b=new Set,T=V(()=>t(c)?t(s).find(E=>E.id===t(c)):null);xi(()=>{if(!t(T))return;const E=t(T),Q=E.state==="done",ce=E.state==="failed",Ee=E.state==="canceled";(Q||ce||Ee)&&!b.has(E.id)&&(b.add(E.id),ve(Q?`✓ ${t(f)} abgeschlossen.`:Ee?`${t(f)} abgebrochen.`:`✗ ${t(f)} fehlgeschlagen.`,ce),Q&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function _(E,Q){u(c,E,!0),u(f,Q,!0),ga.track(E)}wi(()=>{x()}),Ho(()=>{l==null||l.close()});function x(){l==null||l.close();const E=t(d);u(o,`Verbinde mit ${E}… +`);const Q=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${Q}//${location.host}/api/logs/${E}?token=${encodeURIComponent(dl())}`),l.onmessage=ce=>{u(o,t(o)+ce.data),v&&(v.scrollTop=v.scrollHeight)},l.onclose=()=>{u(o,t(o)+` +— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function $(E,Q,ce){if(await hn({title:Q,body:ce,confirmLabel:"Neustarten"}))try{await Se(`/api/service/${E}/restart`,{method:"POST"}),ve("Neustart ausgelöst: "+E),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Ee){ve(Ee.message,!0)}}async function R(){if(await hn({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 E=await Se("/api/self-update",{method:"POST"});ve("Update läuft — Dashboard startet gleich neu."),_(E.job_id,"Mission Control Update")}catch(E){ve(E.message,!0)}}async function A(){if(!await hn({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 E=await sr({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(E!==null)try{const Q=await Se("/api/update",{method:"POST",body:JSON.stringify({password:E})});ve("LLM-Engine-Update läuft."),_(Q.job_id,"LLM-Engine-Update")}catch(Q){ve(Q.message,!0)}}async function N(){if(await hn({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 Se("/api/unload",{method:"POST"}),ve("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(E){ve(E.message,!0)}}async function Pe(){if(!await hn({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 E=await sr({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(E)try{const Q=await Se("/api/os-update",{method:"POST",body:JSON.stringify({password:E})});ve("OS-Update gestartet."),_(Q.job_id,"OS-Update")}catch(Q){ve(Q.message,!0)}}async function Me(){if(!await hn({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 E=await sr({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(E)try{await Se("/api/reboot",{method:"POST",body:JSON.stringify({password:E})}),ve("Reboot ausgelöst — bis gleich.")}catch(Q){ve(Q.message,!0)}}async function Ce(){u(De,"prüfe…");try{const E=await Se("/api/integration/test");u(De,E.ok?`✓ Engine antwortet — ${E.models.length} Modell(e): ${E.models.join(", ")}`:`✗ keine Verbindung: ${E.error}`,!0),u(ie,E.ok,!0)}catch(E){u(De,"✗ "+E.message),u(ie,!1)}}let De=B(""),ie=B(!1);const te=V(()=>{var E;return((E=t(a))==null?void 0:E.models)||[]}),_e=["running","ready","loading","starting"],Ie=V(()=>t(te).find(E=>_e.includes(E.state)));function He(E){if(!E||E.state!=="running")return null;if(typeof E.progress=="number")return Math.min(100,E.progress);const ce=((E.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ce?Math.min(100,parseFloat(ce[1])):null}var Ne=ec(),ot=i(tt(Ne),2),P=r(ot),ye=i(r(P),2),qe=r(ye),Qe=i(P,4),q=r(Qe),oe=i(r(q)),Le=r(oe),Ge=i(q,2),je=i(r(Ge),2),Oe=r(je),dt=i(Ge,2),Xe=i(r(dt),2),pt=r(Xe),ct=i(Qe,2),mt=r(ct),Ct=i(mt,2);{var Tt=E=>{var Q=jd(),ce=r(Q);z(()=>{St(Q,`color:${t(ie)?"#7ee29a":"#ff9b95"}`),h(ce,t(De))}),p(E,Q)};O(Ct,E=>{t(De)&&E(Tt)})}var Mt=i(ot,2),Ft=i(r(Mt),4),zt=i(Ft,2),Et=i(zt,2),D=i(Et,2),J=i(D,2),I=i(Mt,2),W=i(r(I),4),M=i(W,2),ee=i(I,2);{var xe=E=>{const Q=V(()=>t(T)),ce=V(()=>t(Q).state==="done"),Ee=V(()=>t(Q).state==="failed"),Z=V(()=>t(Q).state==="canceled"),le=V(()=>t(ce)||t(Ee)||t(Z)),Ae=V(()=>He(t(Q)));var ze=Xd(),w=r(ze),j=i(r(w),2);{var pe=ue=>{var ge=Ud();S("click",ge,async()=>{await hn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Se(`/api/jobs/${t(Q).id}/cancel`,{method:"POST"})}),p(ue,ge)};O(j,ue=>{t(le)||ue(pe)})}var U=i(j,2),we=r(U);{var Be=ue=>{var ge=Hd();p(ue,ge)},Fe=ue=>{var ge=Jd();p(ue,ge)},$e=ue=>{var ge=Qd();p(ue,ge)},H=ue=>{var ge=Zd();p(ue,ge)};O(we,ue=>{t(ce)?ue(Be):t(Ee)?ue(Fe,1):t(Z)?ue($e,2):ue(H,-1)})}var Y=i(w,2),X=r(Y),K=i(Y,2);{var ae=ue=>{var ge=Yd(),kt=r(ge);z(()=>St(kt,`width:${t(Ae)??""}%`)),p(ue,ge)};O(K,ue=>{t(Ae)!=null&&!t(le)&&ue(ae)})}var fe=i(K,2),he=r(fe);z(ue=>{h(X,`${t(f)??""}${t(le)?t(ce)?" — erfolgreich.":t(Z)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(he,ue)},[()=>(t(Q).log||[]).join(` +`)]),p(E,ze)};O(ee,E=>{t(T)&&E(xe)})}var Te=i(ee,2),C=r(Te),F=i(r(C),2),re=r(F);re.value=re.__value="llama-swap";var se=i(re);se.value=se.__value="mission-control";var ne=i(se);ne.value=ne.__value="system";var ke=i(C,4),de=r(ke);Uo(ke,E=>v=E,()=>v),z(E=>{var Q,ce,Ee;St(ye,`margin-left:auto;${(Q=t(a))!=null&&Q.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(qe,(ce=t(a))!=null&&ce.swap_ok?"● erreichbar":"● offline"),h(Le,(((Ee=t(a))==null?void 0:Ee.swap_url)||"—")+"/v1"),h(Oe,t(Ie)?t(Ie).name+` (${t(Ie).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(pt,E),h(de,t(o))},[()=>t(te).filter(E=>!E.incomplete).length||"keine"]),S("click",mt,Ce),S("click",Ft,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",zt,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",Et,R),S("click",D,A),S("click",J,N),S("click",W,Pe),S("click",M,Me),S("change",F,x),Jn(F,()=>t(d),E=>u(d,E)),p(e,Ne),In()}Gn(["click","change"]);var nc=g('
Lade Setups…
'),ac=g(' ×',1),lr=g('
★ Beste Wahl für dein System
'),ic=g('
Dein Setup
'),rc=g(''),sc=g('
'),lc=g('· ⚠ Cache veraltet'),oc=g(" ",1),dc=g('
Frage Quellen ab…
'),cc=g('
'),vc=g('✓ installiert'),uc=g(''),pc=g('

'),fc=g('

'),hc=g(''),gc=g(''),mc=g('

'),bc=g('
'),_c=g('
'),yc=g('
'),xc=g(" "),kc=g('
'),wc=g('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),Sc=g('Alternative: — passt auf dein System.',1),Mc=g('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),Ec=g(''),Ac=g('
Lade Dateien von HuggingFace…
'),is=g(""),Cc=g('
Empfohlener Kontext für deine Hardware: übernehmen
'),Tc=g('
Ressourcen-Check
'),zc=g('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),$c=g('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Pc=g('
',1),Dc=g('
Keine GGUF-Dateien im Repo gefunden.
'),Ic=g(''),Lc=g('
'),Oc=g(''),Bc=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.
Filter:
',1);function Rc(e,n){Dn(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=["qwen2.5","qwen3","qwen2","hermes","mistral","mixtral","devstral","command-r","command_r","llama-3.1","llama3.1","llama-3.3","llama-4","llama4","functionary","watt","firefunction","granite","glm-4","ministral","gemma-3","gemma3"],d=["-r1","deepseek-r1","qwq","magistral","-think","thinking","-o1","gpt-oss","reasoning","exaone-deep","phi-4-reasoning"];function v(k,y=[]){const L=(k||"").toLowerCase(),G=(y||[]).map(Ue=>String(Ue).toLowerCase()),be=G.some(Ue=>Ue.includes("function-calling")||Ue.includes("tool-use")||Ue.includes("tools")),vt=o.some(Ue=>L.includes(Ue));return{moe:_(L),active_b:x(L),vision:["-vl","vision","llava","pixtral","multimodal","-mm-"].some(Ue=>L.includes(Ue))||G.includes("image-text-to-text"),coder:["coder","-code","code-","codestral","starcoder"].some(Ue=>L.includes(Ue)),reasoning:d.some(Ue=>L.includes(Ue))||G.includes("reasoning"),tools:be?"yes":vt?"likely":"no"}}let c=B(Rt({tools:!1,moe:!1,reasoning:!1,vision:!1,coder:!1}));const f=[["tools","🛠 Tools"],["moe","🧩 MoE"],["reasoning","🧠 Logik"],["vision","👁 Bild"],["coder","💻 Code"]];function b(k,y=[]){const L=Object.keys(t(c)).filter(be=>t(c)[be]);if(!L.length)return!0;const G=v(k,y);return L.every(be=>be==="tools"?G.tools!=="no":G[be])}function T(k,y=[]){const L=v(k,y),G=[];return L.coder&&G.push('💻 Code'),L.vision&&G.push('👁 Bild'),L.reasoning&&G.push('🧠 Logik'),L.moe&&G.push(`🧩 MoE${L.active_b?` · ~${L.active_b}B`:""}`),L.tools==="yes"?G.push('🛠 Tools'):L.tools==="likely"&&G.push('🛠 Tools?'),!L.coder&&!L.vision&&G.unshift('💬 Chat'),G.join(" ")}function _(k=""){const y=k.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(y)||new RegExp("(?{Tt(),Mt()});async function Tt(){u(Me,!0);try{const k=await Se("/api/cookbook/recipes");u(N,k.recipes||[],!0),u(Pe,k.recommended_id||null,!0)}catch(k){ve(k.message,!0)}u(Me,!1)}async function Mt(k=!1){u(De,!0);try{const y=await Se("/api/cookbook/discover"+(k?"?force=true":""));u(Ce,y,!0),u(ie,y.stale,!0)}catch(y){ve("Empfehlungen nicht ladbar: "+y.message,!0)}u(De,!1)}function Ft(k){k=k.trim();const y=k.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return y?y[1]:/^[\w.-]+\/[\w.-]+$/.test(k)?k:null}async function zt(){const k=t(te).trim(),y=Ft(k),L=k;if(!L&&!y){u(_e,[],!0);return}u(Ie,!0),u(Ne,[],!0),u(ot,-1);try{if(y)u(_e,[{id:y,author:y.split("/")[0],downloads:0}],!0);else{const G=`https://huggingface.co/api/models?search=${encodeURIComponent(L)}&filter=gguf&full=true&sort=${encodeURIComponent(t(He))}&direction=-1&limit=40`,be=await fetch(G);u(_e,await be.json(),!0)}t(_e).forEach((G,be)=>Et(be,G.id))}catch(G){ve(G.message,!0),u(_e,[],!0)}u(Ie,!1)}async function Et(k,y){var L;try{const G=await Se("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})});if(!((L=G.files)!=null&&L.length)){t(Ne)[k]=null,D();return}const be=G.files.find(vt=>{var Ue;return(Ue=vt.quant)==null?void 0:Ue.includes("Q4_K_M")})||G.files[0];t(Ne)[k]=be.fit.level,D()}catch{t(Ne)[k]=null,D()}}function D(){let k=-1,y=99;t(Ne).forEach((L,G)=>{if(L==null)return;const be=l[L]??99;be=0&&y<=1?k:-1,!0)}function J(k){u(P,t(N).find(y=>y.id===k),!0)}async function I(k){const y=document.getElementById("cb-r-install-btn");y&&(y.disabled=!0,y.textContent="Starte…");try{const L=await Se("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:k,hf_token:ui()})});ve(`${L.count} Download${L.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),u(P,null),Ct("activity")}catch(L){ve(L.message,!0),y&&(y.disabled=!1,y.textContent="Installieren")}}async function W(k,y){var L,G;u(ye,!0),u(qe,y,!0),u(Qe,k,!0),u(Le,""),u(Ge,8192),u(q,null),u(Oe,null),u(oe,""),u(je,!0);try{if(u(q,await Se("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})}),!0),(G=(L=t(q))==null?void 0:L.files)!=null&&G.length){const be=t(q).files.find(vt=>{var Ue;return(Ue=vt.quant)==null?void 0:Ue.includes("Q4_K_M")})||t(q).files[0];u(oe,be.filename,!0),be.optimal_ctx&&t(Ge)===8192&&u(Ge,be.optimal_ctx,!0),M()}}catch(be){ve(be.message,!0)}u(je,!1)}function M(){var k,y,L;!((y=(k=t(q))==null?void 0:k.files)!=null&&y.length)||!t(oe)||(u(Oe,t(q).files.find(G=>G.filename===t(oe))||null,!0),(L=t(Oe))!=null&&L.optimal_ctx&&t(Ge)===8192&&u(Ge,t(Oe).optimal_ctx,!0))}async function ee(){var k,y;if(!t(Qe)||!t(oe))return ve("Bitte eine GGUF-Datei wählen.",!0);u(je,!0);try{const L=((k=t(q))==null?void 0:k.params_b)??7,G=((y=t(Oe))==null?void 0:y.quant)??"Q4_K_M";await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(Qe),role:t(Le),params_b:L,quant:G,file:t(oe),ctx:t(Ge),hf_token:ui()})}),ve("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),u(ye,!1),Ct("activity")}catch(L){ve("Fehler: "+L.message,!0)}u(je,!1)}async function xe(k,y,L,G){G.disabled=!0,G.textContent="Starte…";try{await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k,role:y,params_b:L,quant:"Q4_K_M",hf_token:ui()})}),ve("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Ct("activity")}catch(be){ve(be.message,!0),G.disabled=!1,G.textContent="Installieren"}}function Te(){u(mt,null),u(Xe,""),u(pt,""),u(ct,[{repo:"",role:"",quant:"Q4_K_M"}],!0),u(dt,!0)}function C(k){const y=t(N).find(L=>L.id===k);y&&(u(mt,k,!0),u(Xe,y.title,!0),u(pt,y.desc||"",!0),u(ct,y.models.map(L=>({repo:L.repo,role:L.role,quant:L.quant||"Q4_K_M"})),!0),u(dt,!0))}async function F(){if(!t(Xe).trim())return ve("Bitte einen Titel angeben.",!0);const k=t(ct).filter(y=>y.repo.trim());if(!k.length)return ve("Mindestens ein Modell (Repo) angeben.",!0);try{t(mt)?(await Se("/api/cookbook/user-recipe/"+encodeURIComponent(t(mt)),{method:"PUT",body:JSON.stringify({title:t(Xe),desc:t(pt),models:k})}),ve("Setup aktualisiert.")):(await Se("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(Xe),desc:t(pt),models:k})}),ve("Setup gespeichert.")),u(dt,!1),Tt()}catch(y){ve(y.message,!0)}}async function re(k){const y=t(N).find(L=>L.id===k);if(await hn({title:`„${(y==null?void 0:y.title)||k}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Se("/api/cookbook/user-recipe/"+encodeURIComponent(k),{method:"DELETE"}),ve("Setup gelöscht."),Tt()}catch(L){ve(L.message,!0)}}function se(k){if(!_(k))return"";const y=x(k);return`MoE${y?` · ~${y}B aktiv`:""}`}var ne=Bc(),ke=i(tt(ne),2),de=r(ke),E=i(r(de),2),Q=i(de,4);{var ce=k=>{var y=nc();p(k,y)},Ee=k=>{var y=sc();Ze(y,21,()=>t(N),et,(L,G)=>{const be=V(()=>t(G).id===t(Pe));var vt=rc(),Ue=r(vt);{var Xt=Ve=>{var bt=ac(),jt=tt(bt),Ut=i(jt,2);S("click",jt,Kt=>{Kt.stopPropagation(),C(t(G).id)}),S("keydown",jt,Kt=>{Kt.key==="Enter"&&(Kt.stopPropagation(),C(t(G).id))}),S("click",Ut,Kt=>{Kt.stopPropagation(),re(t(G).id)}),S("keydown",Ut,Kt=>{Kt.key==="Enter"&&(Kt.stopPropagation(),re(t(G).id))}),p(Ve,bt)};O(Ue,Ve=>{t(G).user&&Ve(Xt)})}var en=i(Ue,2);{var ft=Ve=>{var bt=lr();p(Ve,bt)},yt=Ve=>{var bt=ic();p(Ve,bt)};O(en,Ve=>{t(be)?Ve(ft):t(G).user&&Ve(yt,1)})}var at=i(en,2),ut=r(at),xt=r(ut),Lt=r(xt),tn=i(ut,2),At=r(tn),st=i(at,2),Ot=r(st),Wt=i(st,2),Pt=r(Wt);z((Ve,bt)=>{wt(vt,1,`card-btn${t(be)?" cb-best":""}`),h(Lt,t(G).title),wt(tn,1,`fit-badge ${Ve??""}`),h(At,bt),h(Ot,t(G).desc),h(Pt,`${t(G).models.length??""} Modell${t(G).models.length>1?"e":""} im Setup`)},[()=>$(t(G).fit_level),()=>R(t(G).fit_level)]),S("click",vt,()=>J(t(G).id)),p(L,vt)}),p(k,y)};O(Q,k=>{t(Me)?k(ce):k(Ee,-1)})}var Z=i(ke,2),le=r(Z),Ae=i(r(le),2),ze=r(Ae);{var w=k=>{const y=V(()=>Math.round((Date.now()/1e3-t(Ce).updated)/60));var L=oc(),G=tt(L);{var be=ft=>{var yt=ci();z(()=>h(yt,`Quellen befragt vor ${t(y)??""} min`)),p(ft,yt)},vt=ft=>{var yt=ci();z(at=>h(yt,`Quellen befragt vor ${at??""} h`),[()=>Math.round(t(y)/60)]),p(ft,yt)},Ue=ft=>{var yt=ci();z(at=>h(yt,`Quellen befragt vor ${at??""} Tg.`),[()=>Math.round(t(y)/1440)]),p(ft,yt)};O(G,ft=>{t(y)<60?ft(be):t(y)<1440?ft(vt,1):ft(Ue,-1)})}var Xt=i(G,2);{var en=ft=>{var yt=lc();p(ft,yt)};O(Xt,ft=>{t(ie)&&ft(en)})}p(k,L)};O(ze,k=>{var y;(y=t(Ce))!=null&&y.updated&&k(w)})}var j=i(Ae,2),pe=r(j),U=i(le,4);{var we=k=>{var y=dc();p(k,y)},Be=k=>{var y=Ea(),L=tt(y);Ze(L,17,()=>t(Ce).categories,et,(G,be)=>{var vt=fc(),Ue=r(vt),Xt=r(Ue),en=r(Xt),ft=i(Ue,2);Ze(ft,21,()=>t(be).models,et,(yt,at)=>{const ut=V(()=>t(be).recommended&&t(at).repo===t(be).recommended);var xt=pc(),Lt=r(xt);{var tn=We=>{var it=lr();p(We,it)};O(Lt,We=>{t(ut)&&We(tn)})}var At=i(Lt,2),st=r(At),Ot=r(st),Wt=r(Ot),Pt=i(Ot,2),Ve=r(Pt),bt=i(st,2),jt=r(bt),Ut=i(At,2);nt(Ut,()=>T(t(at).repo,t(at).tags),!0);var Kt=i(Ut,2),Vn=r(Kt),mn=i(Kt,2);Ze(mn,17,()=>t(at).requirements||[],et,(We,it)=>{var Nt=cc(),Ht=r(Nt);z(()=>h(Ht,`⚠ ${t(it)??""}`)),p(We,Nt)});var bn=i(mn,4),va=r(bn);{var _t=We=>{var it=vc();z(()=>za(it,"title",`bereits eingerichtet als ${t(at).installed??""}`)),p(We,it)},lt=We=>{var it=uc();S("click",it,Nt=>xe(t(at).repo,t(at).role,t(at).params_b,Nt.currentTarget)),p(We,it)};O(va,We=>{t(at).installed?We(_t):We(lt,-1)})}z((We,it,Nt)=>{wt(xt,1,`card${t(ut)?" res-best":""}`),h(Wt,t(at).name),h(Ve,`${t(at).author??""} · ${t(at).params_b??""}B`),wt(bt,1,`fit-badge ${We??""}`),h(jt,t(at).fit.text),h(Vn,`${it??""} · ⬇ ${Nt??""}`)},[()=>$(t(at).fit.level),()=>A(t(at).fit),()=>(t(at).downloads||0).toLocaleString()]),p(yt,xt)}),z(()=>h(en,t(be).title)),p(G,vt)}),p(k,y)};O(U,k=>{var y;t(De)&&!t(Ce)?k(we):(y=t(Ce))!=null&&y.categories&&k(Be,1)})}var Fe=i(Z,2),$e=i(r(Fe),4),H=r($e),Y=i(H,2),X=r(Y);X.value=X.__value="downloads";var K=i(X);K.value=K.__value="trending";var ae=i(K);ae.value=ae.__value="created_at";var fe=i(Y,2),he=r(fe),ue=i($e,2),ge=i(r(ue),2);Ze(ge,17,()=>f,et,(k,y)=>{var L=V(()=>Bn(t(y),2));let G=()=>t(L)[0],be=()=>t(L)[1];var vt=hc(),Ue=r(vt);z(()=>{wt(vt,1,t(c)[G()]?"primary":"ghost"),h(Ue,be())}),S("click",vt,()=>t(c)[G()]=!t(c)[G()]),p(k,vt)});var kt=i(ge,2);{var $t=k=>{var y=gc();S("click",y,()=>u(c,{tools:!1,moe:!1,reasoning:!1,vision:!1,coder:!1},!0)),p(k,y)},Dt=V(()=>Object.values(t(c)).some(k=>k));O(kt,k=>{t(Dt)&&k($t)})}var gn=i(ue,2);{var ca=k=>{var y=bc();Ze(y,21,()=>t(_e),et,(L,G,be)=>{var vt=Ea(),Ue=tt(vt);{var Xt=ft=>{var yt=mc(),at=r(yt);{var ut=mn=>{var bn=lr();p(mn,bn)};O(at,mn=>{be===t(ot)&&mn(ut)})}var xt=i(at,2),Lt=r(xt),tn=r(Lt),At=r(tn),st=i(tn,2),Ot=r(st),Wt=i(Lt,2),Pt=r(Wt),Ve=i(xt,2);nt(Ve,()=>T(t(G).id,t(G).tags),!0);var bt=i(Ve,4),jt=r(bt),Ut=r(jt),Kt=i(jt,2),Vn=r(Kt);z((mn,bn,va,_t,lt)=>{wt(yt,1,`card${be===t(ot)?" res-best":""}`),h(At,mn),h(Ot,t(G).author||""),wt(Wt,1,`fit-badge ${bn??""}`),h(Pt,va),h(Ut,_t),h(Vn,`⬇ ${lt??""}`)},[()=>t(G).id.split("/").pop(),()=>t(Ne)[be]?$(t(Ne)[be]):"warn",()=>t(Ne)[be]?R(t(Ne)[be]):"prüfe…",()=>t(Ne)[be]?A({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(G).downloads||0).toLocaleString()]),S("click",yt,()=>W(t(G).id,t(G).id.split("/").pop())),p(ft,yt)},en=V(()=>b(t(G).id,t(G).tags));O(Ue,ft=>{t(en)&&ft(Xt)})}p(L,vt)}),p(k,y)};O(gn,k=>{t(_e).length&&k(ca)})}var Yn=i(Fe,2);{var Ya=k=>{const y=V(()=>t(P));var L=Ec(),G=r(L),be=r(G),vt=i(be,2),Ue=r(vt),Xt=i(vt,2),en=r(Xt),ft=i(Xt,2);Ze(ft,21,()=>t(y).models,et,(At,st)=>{var Ot=kc(),Wt=r(Ot),Pt=r(Wt),Ve=r(Pt),bt=r(Ve),jt=i(Ve,2),Ut=r(jt),Kt=i(jt,2);nt(Kt,()=>se(t(st).repo));var Vn=i(Pt,2);{var mn=We=>{var it=_c(),Nt=r(it);z(()=>h(Nt,t(st).why)),p(We,it)};O(Vn,We=>{t(st).why&&We(mn)})}var bn=i(Vn,2);{var va=We=>{var it=yc(),Nt=r(it);z((Ht,cn,Xn)=>h(Nt,`~${Ht??""} GB · ~${cn??""} Tok/s · optimal ~${Xn??""}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)]),p(We,it)};O(bn,We=>{t(st).fit&&We(va)})}var _t=i(Wt,2);{var lt=We=>{var it=xc(),Nt=r(it);z(Ht=>{wt(it,1,`fit-badge ${Ht??""}`),h(Nt,t(st).fit.text)},[()=>$(t(st).fit.level)]),p(We,it)};O(_t,We=>{t(st).fit&&We(lt)})}z(()=>{h(bt,t(st).name),h(Ut,t(st).role)}),p(At,Ot)});var yt=i(ft,2);{var at=At=>{const st=V(()=>Math.max(...t(y).models.map(Ve=>{var bt;return((bt=Ve.fit)==null?void 0:bt.req_gb)??0})));var Ot=wc(),Wt=i(r(Ot)),Pt=r(Wt);z(Ve=>h(Pt,`~${Ve??""} GB`),[()=>t(st).toFixed(1)]),p(At,Ot)};O(yt,At=>{t(y).models.length&&t(y).models[0].fit&&At(at)})}var ut=i(yt,2);{var xt=At=>{const st=V(()=>t(N).find(Ve=>!Ve.user&&Ve.fit_level!=="too_tight"&&Ve.id!==t(y).id));var Ot=Mc(),Wt=i(r(Ot));{var Pt=Ve=>{var bt=Sc(),jt=i(tt(bt)),Ut=r(jt);z(()=>h(Ut,`„${t(st).title??""}" ansehen`)),S("click",jt,Kt=>{Kt.preventDefault(),u(P,null),setTimeout(()=>J(t(st).id),50)}),p(Ve,bt)};O(Wt,Ve=>{t(st)&&Ve(Pt)})}p(At,Ot)};O(ut,At=>{t(y).fit_level==="too_tight"&&At(xt)})}var Lt=i(ut,2),tn=r(Lt);z(()=>{h(Ue,t(y).title),h(en,t(y).desc),wt(Lt,1,`primary${t(y).fit_level==="too_tight"?" warn":""}`),h(tn,t(y).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),S("click",L,At=>{At.target.classList.contains("modal-overlay")&&u(P,null)}),S("click",be,()=>u(P,null)),S("click",Lt,()=>I(t(y).id)),p(k,L)};O(Yn,k=>{t(P)&&k(Ya)})}var Mi=i(Yn,2);{var Xa=k=>{var y=Ic(),L=r(y),G=r(L),be=i(G,2),vt=r(be),Ue=i(be,2),Xt=r(Ue),en=i(Ue,2);{var ft=ut=>{var xt=Ac();p(ut,xt)},yt=ut=>{var xt=Pc(),Lt=i(tt(xt),2);Ze(Lt,21,()=>t(q).files,et,(_t,lt)=>{const We=V(()=>t(lt).fit.level==="perfect"?"●":t(lt).fit.level==="marginal"?"◐":"○");var it=is(),Nt=r(it),Ht={};z(()=>{h(Nt,`${t(We)??""} ${t(lt).filename??""}`),Ht!==(Ht=t(lt).filename)&&(it.value=(it.__value=t(lt).filename)??"")}),p(_t,it)});var tn=i(Lt,2),At=r(tn),st=i(r(At),2),Ot=i(At,2),Wt=r(Ot),Pt=i(r(Wt));nt(Pt,()=>Sr(a));var Ve=i(Wt,2),bt=i(tn,2);{var jt=_t=>{var lt=Cc(),We=i(r(lt)),it=r(We),Nt=i(We,2);z(Ht=>h(it,`~${Ht??""}k`),[()=>Math.round(t(Oe).optimal_ctx/1024)]),S("click",Nt,Ht=>{Ht.preventDefault(),u(Ge,t(Oe).optimal_ctx,!0)}),p(_t,lt)};O(bt,_t=>{var lt;(lt=t(Oe))!=null&<.optimal_ctx&&_t(jt)})}var Ut=i(bt,2);{var Kt=_t=>{var lt=Tc(),We=r(lt),it=i(r(We),2),Nt=r(it),Ht=i(We,2),cn=r(Ht);z((Xn,Ei,Zi)=>{h(Nt,`~${Xn??""} GB · ~${Ei??""} Tok/s · ${(t(Oe).quant||"GGUF")??""}`),wt(Ht,1,`fit-badge ${Zi??""}`),h(cn,t(Oe).fit.text)},[()=>(t(Oe).fit.req_gb??0).toFixed(1),()=>Math.round(t(Oe).fit.tps??0),()=>$(t(Oe).fit.level)]),p(_t,lt)};O(Ut,_t=>{t(Oe)&&_t(Kt)})}var Vn=i(Ut,2);{var mn=_t=>{const lt=V(()=>t(q).files.find(cn=>cn.fit.level!=="too_tight"&&cn.filename!==t(oe)));var We=Ea(),it=tt(We);{var Nt=cn=>{var Xn=zc(),Ei=i(r(Xn)),Zi=r(Ei);z(Yi=>h(Zi,`${t(lt).filename??""} (${Yi??""})`),[()=>R(t(lt).fit.level)]),S("click",Ei,Yi=>{Yi.preventDefault(),u(oe,t(lt).filename,!0),M()}),p(cn,Xn)},Ht=cn=>{var Xn=$c();p(cn,Xn)};O(it,cn=>{t(lt)?cn(Nt):cn(Ht,-1)})}p(_t,We)};O(Vn,_t=>{var lt,We;((lt=t(Oe))==null?void 0:lt.fit.level)==="too_tight"&&((We=t(q))!=null&&We.files)&&_t(mn)})}var bn=i(Vn,2),va=r(bn);z(()=>{var _t,lt;wt(bn,1,`primary${((_t=t(Oe))==null?void 0:_t.fit.level)==="too_tight"?" warn":""}`),bn.disabled=t(je),h(va,t(je)?"Starte…":((lt=t(Oe))==null?void 0:lt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),S("change",Lt,M),Jn(Lt,()=>t(oe),_t=>u(oe,_t)),on(st,()=>t(Le),_t=>u(Le,_t)),on(Ve,()=>t(Ge),_t=>u(Ge,_t)),S("click",bn,ee),p(ut,xt)},at=ut=>{var xt=Dc();p(ut,xt)};O(en,ut=>{var xt,Lt;t(je)&&!t(q)?ut(ft):(Lt=(xt=t(q))==null?void 0:xt.files)!=null&&Lt.length?ut(yt,1):t(je)||ut(at,2)})}z(()=>{h(vt,t(qe)),h(Xt,t(Qe))}),S("click",y,ut=>{ut.target.classList.contains("modal-overlay")&&u(ye,!1)}),S("click",G,()=>u(ye,!1)),p(k,y)};O(Mi,k=>{t(ye)&&k(Xa)})}var Ji=i(Mi,2);{var Qi=k=>{var y=Oc(),L=r(y),G=r(L),be=i(G,2),vt=r(be),Ue=i(be,6),Xt=i(Ue,4),en=i(Xt,4);Ze(en,17,()=>t(ct),et,(ut,xt,Lt)=>{var tn=Lc(),At=r(tn),st=i(At,2),Ot=i(st,2);Ze(Ot,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],et,(Pt,Ve)=>{var bt=is(),jt=r(bt),Ut={};z(()=>{h(jt,Ve),Ut!==(Ut=Ve)&&(bt.__value=Ve)}),p(Pt,bt)});var Wt=i(Ot,2);on(At,()=>t(xt).repo,Pt=>t(xt).repo=Pt),on(st,()=>t(xt).role,Pt=>t(xt).role=Pt),Jn(Ot,()=>t(xt).quant,Pt=>t(xt).quant=Pt),S("click",Wt,()=>u(ct,t(ct).filter((Pt,Ve)=>Ve!==Lt),!0)),p(ut,tn)});var ft=i(en,2),yt=i(ft,4),at=r(yt);z(()=>{h(vt,t(mt)?"Setup bearbeiten":"Eigenes Setup erstellen"),h(at,t(mt)?"Änderungen speichern":"Setup speichern")}),S("click",y,ut=>{ut.target.classList.contains("modal-overlay")&&u(dt,!1)}),S("click",G,()=>u(dt,!1)),on(Ue,()=>t(Xe),ut=>u(Xe,ut)),on(Xt,()=>t(pt),ut=>u(pt,ut)),S("click",ft,()=>u(ct,[...t(ct),{repo:"",role:"",quant:"Q4_K_M"}],!0)),S("click",yt,F),p(k,y)};O(Ji,k=>{t(dt)&&k(Qi)})}z(()=>{j.disabled=t(De),h(pe,t(De)?"Suche…":"Aktualisieren"),fe.disabled=t(Ie),h(he,t(Ie)?"Lade…":"Suchen")}),S("click",E,Te),S("click",j,()=>Mt(!0)),S("keydown",H,k=>k.key==="Enter"&&zt()),on(H,()=>t(te),k=>u(te,k)),Jn(Y,()=>t(He),k=>u(He,k)),S("click",fe,zt),p(e,ne),In()}Gn(["click","keydown","change"]);var Fc=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.
`),Kc=g(' '),Nc=g('
'),qc=g(' '),Gc=g(''),rs=g(''),Vc=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),Wc=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),jc=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),Uc=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),Hc=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),Jc=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),Qc=g('

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

',1),Zc=g('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Yc=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),Xc=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.
'),ev=g(''),tv=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),nv=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),av=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.

'),iv=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 rv(e,n){Dn(n,!0);const a=V(()=>Si.value),s=V(()=>{var C;return(((C=t(a))==null?void 0:C.models)||[]).filter(F=>!F.incomplete)});let l=B("zed"),o=B(Rt([])),d=B(""),v=B(!1),c=B("cline"),f=B(Rt(localStorage.getItem("mc_ip_override")||""));function b(C){return/^\d{1,3}(\.\d{1,3}){3}$/.test(C)}function T(){return location.protocol==="https:"||!b(location.hostname)}function _(){return`http://${t(f).trim()||location.hostname}:8080/v1`}const x=V(_);function $(){const C=t(f).trim();C?localStorage.setItem("mc_ip_override",C):localStorage.removeItem("mc_ip_override")}const R=V(()=>Ie(t(c))),A=V(()=>t(o).length?t(o):t(s).map(C=>C.name)),N=V(()=>t(A)[0]||"coder"),Pe=V(()=>{var C;return(C=t(s).find(F=>{var re,se;return(se=(re=F.meta)==null?void 0:re.caps)==null?void 0:se.includes("Bild")}))==null?void 0:C.name});function Me(C,F){const se=(F.length?t(s).filter(ne=>F.includes(ne.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ne=>{var E,Q;const ke=(((E=ne.meta)==null?void 0:E.caps)||[]).some(ce=>/Bild|Vision/i.test(ce)),de=((Q=ne.meta)==null?void 0:Q.ctx)||131072;return` { "name": "${ne.name}", "display_name": "${ne.name}", "max_tokens": ${de}${ke?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { "api_url": "${C}", "available_models": [ -${ie} +${se} ] } } -}`}function Ce(C,R){const ie=(R.length?t(s).filter(ee=>R.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>{var de;const Se=((de=ee.meta)==null?void 0:de.ctx)||131072;return` "${ee.name}": { "name": "${ee.name}", "contextWindowSize": ${Se} }`}).join(`, +}`}function Ce(C,F){const se=(F.length?t(s).filter(ne=>F.includes(ne.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ne=>{var de;const ke=((de=ne.meta)==null?void 0:de.ctx)||131072;return` "${ne.name}": { "name": "${ne.name}", "contextWindowSize": ${ke} }`}).join(`, `);return`"providers": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", @@ -40,21 +40,21 @@ ${ie} "apiKey": "local" }, "models": { -${ie} +${se} } } -}`}function Re(C,R){return`{ +}`}function De(C,F){return`{ "models": [ -${(R.length?t(s).filter(ee=>R.includes(ee.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ee=>` { - "title": "llama-swap / ${ee.name}", +${(F.length?t(s).filter(ne=>F.includes(ne.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(ne=>` { + "title": "llama-swap / ${ne.name}", "provider": "openai", - "model": "${ee.name}", + "model": "${ne.name}", "apiBase": "${C}", "apiKey": "local" }`).join(`, `)} ] -}`}async function te(){u(d,"Teste…");try{const C=await we("/api/integration/test");u(c,C.ok,!0),u(d,C.ok?`✓ Verbunden — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ Keine Verbindung: ${C.error}`,!0)}catch(C){u(c,!1),u(d,"✗ "+C.message)}}function X(C){var se;const R=C.querySelector("code");R&&((se=navigator.clipboard)==null||se.writeText(R.textContent||""))}function be(C){var R;(R=navigator.clipboard)==null||R.writeText(C.value)}function Be(C){return`{ +}`}async function ie(){u(d,"Teste…");try{const C=await Se("/api/integration/test");u(v,C.ok,!0),u(d,C.ok?`✓ Verbunden — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ Keine Verbindung: ${C.error}`,!0)}catch(C){u(v,!1),u(d,"✗ "+C.message)}}function te(C){var re;const F=C.querySelector("code");F&&((re=navigator.clipboard)==null||re.writeText(F.textContent||""))}function _e(C){var F;(F=navigator.clipboard)==null||F.writeText(C.value)}function Ie(C){return`{ "mcpServers": { "mission-control-memory": { "command": "${C==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", @@ -64,12 +64,12 @@ ${(R.length?t(s).filter(ee=>R.includes(ee.name)):t(s).length?t(s):[{name:"coder" } } } -}`}var Ne=Zc(),Ze=i(tt(Ne),2),ut=i(r(Ze),6),I=r(ut),ue=i(I,2),Ae=i(ut,2),He=r(Ae),N=i(Ae,2);{var ve=C=>{var R=Pc();p(C,R)},pe=q(()=>T());O(N,C=>{t(pe)&&C(ve)})}var je=i(N,2),Ve=r(je),nt=i(Ve,2);{var it=C=>{var R=Dc(),se=r(R);z(()=>{At(R,`color:${t(c)?"#7ee29a":"#ff9b95"}`),h(se,t(d))}),p(C,R)};O(nt,C=>{t(d)&&C(it)})}var et=i(Ze,2),bt=i(r(et),2);Je(bt,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."]],Xe,(C,R)=>{var se=q(()=>Hn(R,3));let ie=()=>t(se)[0],ee=()=>t(se)[1],Se=()=>t(se)[2];var de=Ic(),A=r(de),U=r(A),oe=i(A,2),Me=r(oe),H=r(Me),le=i(Me,2),Te=r(le);z(()=>{h(U,ie()),h(H,ee()),h(Te,Se())}),p(C,de)});var wt=i(et,2);{var Ct=C=>{var R=Wc(),se=tt(R),ie=r(se),ee=i(r(ie),2),Se=r(ee),de=i(ie,4);Je(de,21,()=>t(s),Xe,(j,Q)=>{const Z=q(()=>t(o).includes(t(Q).name));var F=Lc(),ne=r(F);z(()=>{At(F,`cursor:pointer;${t(Z)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(ne,t(Q).name)}),S("click",F,()=>u(o,t(Z)?t(o).filter(_e=>_e!==t(Q).name):[...t(o),t(Q).name],!0)),S("keydown",F,_e=>_e.key==="Enter"&&u(o,t(Z)?t(o).filter(ge=>ge!==t(Q).name):[...t(o),t(Q).name],!0)),p(j,F)});var A=i(de,2);{var U=j=>{var Q=Oc(),Z=r(Q);S("click",Z,F=>{F.preventDefault(),u(o,[],!0)}),p(j,Q)};O(A,j=>{t(o).length&&j(U)})}var oe=i(se,2),Me=i(r(oe),6);Je(Me,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],Xe,(j,Q)=>{var Z=q(()=>Hn(Q,3));let F=()=>t(Z)[0],ne=()=>t(Z)[1],_e=()=>t(Z)[2];var ge=Xr(),fe=r(ge),me=r(fe),_t=i(fe,2),zt=r(_t);z(()=>{Et(ge,1,`card-btn${t(l)===F()?" cb-best":""}`),h(me,ne()),h(zt,_e())}),S("click",ge,()=>u(l,F(),!0)),p(j,ge)});var H=i(Me,4);Je(H,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"]],Xe,(j,Q)=>{var Z=q(()=>Hn(Q,3));let F=()=>t(Z)[0],ne=()=>t(Z)[1],_e=()=>t(Z)[2];var ge=Xr(),fe=r(ge),me=r(fe),_t=i(fe,2),zt=r(_t);z(()=>{Et(ge,1,`card-btn${t(l)===F()?" cb-best":""}`),h(me,ne()),h(zt,_e())}),S("click",ge,()=>u(l,F(),!0)),p(j,ge)});var le=i(oe,2),Te=i(r(le),2);{var ze=j=>{var Q=Bc(),Z=i(tt(Q),6),F=r(Z),ne=i(F,2),_e=i(Z,4),ge=r(_e),fe=i(ge,2);z(()=>{ea(F,t(y)),ea(ge,t(K))}),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(j,Q)},x=j=>{const Q=q(()=>Re(t(y),t(M)));var Z=Rc(),F=i(tt(Z),4),ne=r(F),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(F,2),_t=i(r(me)),zt=r(_t);z(()=>{h(fe,t(Q)),h(zt,`llama-swap / ${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(j,Z)},J=j=>{var Q=Fc(),Z=i(tt(Q),6),F=r(Z),ne=i(F,2),_e=i(Z,4),ge=r(_e),fe=i(ge,2),me=i(_e,2),_t=i(r(me),3),zt=r(_t);z(()=>{ea(F,t(y)),ea(ge,t(K)),h(zt,t(K))}),S("click",ne,Ot=>be(Ot.currentTarget.previousElementSibling)),S("click",fe,Ot=>be(Ot.currentTarget.previousElementSibling)),p(j,Q)},he=j=>{const Q=q(()=>Ee(t(y),t(M)));var Z=Kc(),F=i(tt(Z),4),ne=r(F),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(F,4),_t=i(r(me)),zt=r(_t);z(()=>{h(fe,t(Q)),h(zt,`bosgame / ${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(j,Z)},W=j=>{const Q=q(()=>Ce(t(y),t(M)));var Z=Nc(),F=i(tt(Z),6),ne=r(F),_e=i(ne,2),ge=r(_e),fe=r(ge),me=i(F,2),_t=i(r(me),3),zt=r(_t);z(()=>{h(fe,t(Q)),h(zt,`llama-swap/${t(K)??""}`)}),S("click",ne,Ot=>X(Ot.currentTarget.parentElement)),p(j,Z)},xe=j=>{var Q=qc(),Z=i(tt(Q),4),F=r(Z),ne=i(F,2),_e=i(Z,4),ge=r(_e),fe=i(ge,2);z(()=>{ea(F,t(y)),ea(ge,t(K))}),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(j,Q)},Ie=j=>{var Q=Gc(),Z=i(tt(Q),4),F=r(Z),ne=i(F,2),_e=i(Z,4),ge=r(_e),fe=i(ge,2);z(()=>ea(F,t(y))),S("click",ne,me=>be(me.currentTarget.previousElementSibling)),S("click",fe,me=>be(me.currentTarget.previousElementSibling)),p(j,Q)};O(Te,j=>{t(l)==="janai"?j(ze):t(l)==="continue"?j(x,1):t(l)==="antigravity"?j(J,2):t(l)==="zed"?j(he,3):t(l)==="opencode"?j(W,4):t(l)==="cline"?j(xe,5):t(l)==="openwebui"&&j(Ie,6)})}var Fe=i(le,2);{var De=j=>{const Q=q(()=>`curl ${t(y)}/chat/completions \\ +}`}var He=iv(),Ne=i(tt(He),2),ot=i(r(Ne),6),P=r(ot),ye=i(P,2),qe=i(ot,2),Qe=r(qe),q=i(qe,2);{var oe=C=>{var F=Fc();p(C,F)},Le=V(()=>T());O(q,C=>{t(Le)&&C(oe)})}var Ge=i(q,2),je=r(Ge),Oe=i(je,2);{var dt=C=>{var F=Kc(),re=r(F);z(()=>{St(F,`color:${t(v)?"#7ee29a":"#ff9b95"}`),h(re,t(d))}),p(C,F)};O(Oe,C=>{t(d)&&C(dt)})}var Xe=i(Ne,2),pt=i(r(Xe),2);Ze(pt,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,(C,F)=>{var re=V(()=>Bn(F,3));let se=()=>t(re)[0],ne=()=>t(re)[1],ke=()=>t(re)[2];var de=Nc(),E=r(de),Q=r(E),ce=i(E,2),Ee=r(ce),Z=r(Ee),le=i(Ee,2),Ae=r(le);z(()=>{h(Q,se()),h(Z,ne()),h(Ae,ke())}),p(C,de)});var ct=i(Xe,2);{var mt=C=>{var F=Yc(),re=tt(F),se=r(re),ne=i(r(se),2),ke=r(ne),de=i(se,4);Ze(de,21,()=>t(s),et,(H,Y)=>{const X=V(()=>t(o).includes(t(Y).name));var K=qc(),ae=r(K);z(()=>{St(K,`cursor:pointer;${t(X)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),h(ae,t(Y).name)}),S("click",K,()=>u(o,t(X)?t(o).filter(fe=>fe!==t(Y).name):[...t(o),t(Y).name],!0)),S("keydown",K,fe=>fe.key==="Enter"&&u(o,t(X)?t(o).filter(he=>he!==t(Y).name):[...t(o),t(Y).name],!0)),p(H,K)});var E=i(de,2);{var Q=H=>{var Y=Gc(),X=r(Y);S("click",X,K=>{K.preventDefault(),u(o,[],!0)}),p(H,Y)};O(E,H=>{t(o).length&&H(Q)})}var ce=i(re,2),Ee=i(r(ce),6);Ze(Ee,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],et,(H,Y)=>{var X=V(()=>Bn(Y,3));let K=()=>t(X)[0],ae=()=>t(X)[1],fe=()=>t(X)[2];var he=rs(),ue=r(he),ge=r(ue),kt=i(ue,2),$t=r(kt);z(()=>{wt(he,1,`card-btn${t(l)===K()?" cb-best":""}`),h(ge,ae()),h($t,fe())}),S("click",he,()=>u(l,K(),!0)),p(H,he)});var Z=i(Ee,4);Ze(Z,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,(H,Y)=>{var X=V(()=>Bn(Y,3));let K=()=>t(X)[0],ae=()=>t(X)[1],fe=()=>t(X)[2];var he=rs(),ue=r(he),ge=r(ue),kt=i(ue,2),$t=r(kt);z(()=>{wt(he,1,`card-btn${t(l)===K()?" cb-best":""}`),h(ge,ae()),h($t,fe())}),S("click",he,()=>u(l,K(),!0)),p(H,he)});var le=i(ce,2),Ae=i(r(le),2);{var ze=H=>{var Y=Vc(),X=i(tt(Y),6),K=r(X),ae=i(K,2),fe=i(X,4),he=r(fe),ue=i(he,2);z(()=>{ta(K,t(x)),ta(he,t(N))}),S("click",ae,ge=>_e(ge.currentTarget.previousElementSibling)),S("click",ue,ge=>_e(ge.currentTarget.previousElementSibling)),p(H,Y)},w=H=>{const Y=V(()=>De(t(x),t(A)));var X=Wc(),K=i(tt(X),4),ae=r(K),fe=i(ae,2),he=r(fe),ue=r(he),ge=i(K,2),kt=i(r(ge)),$t=r(kt);z(()=>{h(ue,t(Y)),h($t,`llama-swap / ${t(N)??""}`)}),S("click",ae,Dt=>te(Dt.currentTarget.parentElement)),p(H,X)},j=H=>{var Y=jc(),X=i(tt(Y),6),K=r(X),ae=i(K,2),fe=i(X,4),he=r(fe),ue=i(he,2),ge=i(fe,2),kt=i(r(ge),3),$t=r(kt);z(()=>{ta(K,t(x)),ta(he,t(N)),h($t,t(N))}),S("click",ae,Dt=>_e(Dt.currentTarget.previousElementSibling)),S("click",ue,Dt=>_e(Dt.currentTarget.previousElementSibling)),p(H,Y)},pe=H=>{const Y=V(()=>Me(t(x),t(A)));var X=Uc(),K=i(tt(X),4),ae=r(K),fe=i(ae,2),he=r(fe),ue=r(he),ge=i(K,4),kt=i(r(ge)),$t=r(kt);z(()=>{h(ue,t(Y)),h($t,`bosgame / ${t(N)??""}`)}),S("click",ae,Dt=>te(Dt.currentTarget.parentElement)),p(H,X)},U=H=>{const Y=V(()=>Ce(t(x),t(A)));var X=Hc(),K=i(tt(X),6),ae=r(K),fe=i(ae,2),he=r(fe),ue=r(he),ge=i(K,2),kt=i(r(ge),3),$t=r(kt);z(()=>{h(ue,t(Y)),h($t,`llama-swap/${t(N)??""}`)}),S("click",ae,Dt=>te(Dt.currentTarget.parentElement)),p(H,X)},we=H=>{var Y=Jc(),X=i(tt(Y),4),K=r(X),ae=i(K,2),fe=i(X,4),he=r(fe),ue=i(he,2);z(()=>{ta(K,t(x)),ta(he,t(N))}),S("click",ae,ge=>_e(ge.currentTarget.previousElementSibling)),S("click",ue,ge=>_e(ge.currentTarget.previousElementSibling)),p(H,Y)},Be=H=>{var Y=Qc(),X=i(tt(Y),4),K=r(X),ae=i(K,2),fe=i(X,4),he=r(fe),ue=i(he,2);z(()=>ta(K,t(x))),S("click",ae,ge=>_e(ge.currentTarget.previousElementSibling)),S("click",ue,ge=>_e(ge.currentTarget.previousElementSibling)),p(H,Y)};O(Ae,H=>{t(l)==="janai"?H(ze):t(l)==="continue"?H(w,1):t(l)==="antigravity"?H(j,2):t(l)==="zed"?H(pe,3):t(l)==="opencode"?H(U,4):t(l)==="cline"?H(we,5):t(l)==="openwebui"&&H(Be,6)})}var Fe=i(le,2);{var $e=H=>{const Y=V(()=>`curl ${t(x)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${t(Oe)}", + "model": "${t(Pe)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var Z=Vc(),F=r(Z),ne=i(r(F),2),_e=r(ne);Ye(_e,()=>Ut("check"));var ge=i(_e),fe=i(F,4),me=r(fe),_t=i(me,2),zt=r(_t),Ot=r(zt);z(()=>{h(ge,` „${t(Oe)??""}" bereit`),h(Ot,t(Q))}),S("click",me,gn=>X(gn.currentTarget.parentElement)),p(j,Z)};O(Fe,j=>{t(Oe)&&j(De)})}z(()=>h(Se,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),p(C,R)},Kt=C=>{var R=jc(),se=i(r(R),2),ie=i(r(se),4);S("click",ie,()=>{var ee;return(ee=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:ee.dispatchEvent(new MouseEvent("click"))}),p(C,R)};O(wt,C=>{t(s).length?C(Ct):C(Kt,-1)})}var Pt=i(wt,2),Dt=i(r(Pt),2),Lt=i(r(Dt)),It=i(Dt,2);Je(It,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"]],Xe,(C,R)=>{var se=q(()=>Hn(R,3));let ie=()=>t(se)[0],ee=()=>t(se)[1],Se=()=>t(se)[2];var de=Uc(),A=r(de),U=r(A),oe=i(A,2),Me=r(oe);z(()=>{Et(de,1,`card-btn${t(v)===ie()?" cb-best":""}`),h(U,ee()),h(Me,Se())}),S("click",de,()=>u(v,ie(),!0)),p(C,de)});var Tt=i(It,2),P=r(Tt),V=i(P,2),$=r(V),G=r($),E=i(Tt,2);{var Y=C=>{var R=Hc();p(C,R)},ke=C=>{var R=Jc();p(C,R)},Pe=C=>{var R=Qc();p(C,R)};O(E,C=>{t(v)==="cline"?C(Y):t(v)==="opencode"?C(ke,1):C(Pe,-1)})}z(()=>{ea(I,t(y)),h(G,t(B))}),S("click",ue,C=>{const R=C.currentTarget.previousElementSibling;be(R)}),S("input",He,D),dn(He,()=>t(f),C=>u(f,C)),S("click",Ve,te),S("click",Lt,C=>{var R;C.preventDefault(),(R=document.querySelector(".nav-item[data-view='memory']"))==null||R.click()}),S("click",P,C=>X(C.currentTarget.parentElement)),p(e,Ne),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=L(jt([])),s=L(jt([])),l=L(!0),o=L("");const d=te=>te==="perfect"?"ok":te==="marginal"?"warn":"bad";function c(te){const X=Math.max(0,Date.now()/1e3-te);return X<60?X+"s":X<3600?Math.floor(X/60)+"m":X<86400?Math.floor(X/3600)+"h":Math.floor(X/86400)+"d"}async function v(){u(l,!0),u(o,"");try{u(a,(await we("/api/news")).items||[],!0)}catch(te){u(o,te.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function f(){try{u(s,(await we("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function b(te,X){var be;X.disabled=!0,X.textContent="Starte…";try{await we("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:te.repo,role:te.role,params_b:te.params_b,quant:te.quant,hf_token:di()})}),(be=document.querySelector(".nav-item[data-view='activity']"))==null||be.dispatchEvent(new MouseEvent("click"))}catch(Be){X.disabled=!1,X.textContent="Installieren",alert("Fehler: "+Be.message)}}function T(){v(),f()}yi(()=>{v(),f()});var _=lv(),y=tt(_),D=i(r(y),2),B=i(y,2);{var M=te=>{var X=ev(),be=r(X),Be=i(r(be),2),Ne=r(Be),Ze=i(be,4);Je(Ze,21,()=>t(s),Xe,(ut,I)=>{var ue=Xc(),Ae=r(ue),He=r(Ae),N=r(He),ve=r(N),pe=i(N,2),je=r(pe),Ve=i(He,2),nt=r(Ve),it=i(Ae,2);z(et=>{h(ve,t(I).name),Et(pe,1,`fit-badge ${et??""}`),h(je,t(I).fit.text),h(nt,`Ersetzt dein „${t(I).old??""}". ${t(I).why??""}`)},[()=>d(t(I).fit.level)]),S("click",it,et=>b(t(I),et.currentTarget)),p(ut,ue)}),z(()=>h(Ne,t(s).length)),p(te,X)};O(B,te=>{t(s).length&&te(M)})}var K=i(B,2);{var Oe=te=>{var X=tv();p(te,X)},Ee=te=>{var X=nv(),be=r(X);z(()=>h(be,t(o))),p(te,X)},Ce=te=>{var X=av();p(te,X)},Re=te=>{var X=sv();Je(X,21,()=>t(a),Xe,(be,Be,Ne)=>{var Ze=rv();Et(Ze,1,`news-card${Ne===0?" featured":""}`);var ut=r(Ze),I=r(ut),ue=r(I),Ae=i(I,2);{var He=Ve=>{var nt=iv();p(Ve,nt)};O(Ae,Ve=>{t(Be).relevant&&Ve(He)})}var N=i(Ae,2),ve=r(N),pe=i(ut,2),je=r(pe);z(Ve=>{Aa(Ze,"href",t(Be).link),h(ue,t(Be).source),h(ve,Ve),h(je,t(Be).title)},[()=>t(Be).ts?c(t(Be).ts):""]),p(be,Ze)}),p(te,X)};O(K,te=>{t(l)?te(Oe):t(o)?te(Ee,1):t(a).length?te(Re,-1):te(Ce,2)})}S("click",D,T),p(e,_),Pn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",` +}'`);var X=Zc(),K=r(X),ae=i(r(K),2),fe=r(ae);nt(fe,()=>qt("check"));var he=i(fe),ue=i(K,4),ge=r(ue),kt=i(ge,2),$t=r(kt),Dt=r($t);z(()=>{h(he,` „${t(Pe)??""}" bereit`),h(Dt,t(Y))}),S("click",ge,gn=>te(gn.currentTarget.parentElement)),p(H,X)};O(Fe,H=>{t(Pe)&&H($e)})}z(()=>h(ke,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),p(C,F)},Ct=C=>{var F=Xc(),re=i(r(F),2),se=i(r(re),4);S("click",se,()=>{var ne;return(ne=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:ne.dispatchEvent(new MouseEvent("click"))}),p(C,F)};O(ct,C=>{t(s).length?C(mt):C(Ct,-1)})}var Tt=i(ct,2),Mt=i(r(Tt),2),Ft=i(r(Mt)),zt=i(Mt,2);Ze(zt,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,(C,F)=>{var re=V(()=>Bn(F,3));let se=()=>t(re)[0],ne=()=>t(re)[1],ke=()=>t(re)[2];var de=ev(),E=r(de),Q=r(E),ce=i(E,2),Ee=r(ce);z(()=>{wt(de,1,`card-btn${t(c)===se()?" cb-best":""}`),h(Q,ne()),h(Ee,ke())}),S("click",de,()=>u(c,se(),!0)),p(C,de)});var Et=i(zt,2),D=r(Et),J=i(D,2),I=r(J),W=r(I),M=i(Et,2);{var ee=C=>{var F=tv();p(C,F)},xe=C=>{var F=nv();p(C,F)},Te=C=>{var F=av();p(C,F)};O(M,C=>{t(c)==="cline"?C(ee):t(c)==="opencode"?C(xe,1):C(Te,-1)})}z(()=>{ta(P,t(x)),h(W,t(R))}),S("click",ye,C=>{const F=C.currentTarget.previousElementSibling;_e(F)}),S("input",Qe,$),on(Qe,()=>t(f),C=>u(f,C)),S("click",je,ie),S("click",Ft,C=>{var F;C.preventDefault(),(F=document.querySelector(".nav-item[data-view='memory']"))==null||F.click()}),S("click",D,C=>te(C.currentTarget.parentElement)),p(e,He),In()}Gn(["click","input","keydown"]);var sv=g('
'),lv=g('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),ov=g('
Lade News… (erstes Laden kann kurz dauern)
'),dv=g('
'),cv=g('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),vv=g('für dich'),uv=g('
'),pv=g('
'),fv=g('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function hv(e,n){Dn(n,!0);let a=B(Rt([])),s=B(Rt([])),l=B(!0),o=B("");const d=ie=>ie==="perfect"?"ok":ie==="marginal"?"warn":"bad";function v(ie){const te=Math.max(0,Date.now()/1e3-ie);return te<60?te+"s":te<3600?Math.floor(te/60)+"m":te<86400?Math.floor(te/3600)+"h":Math.floor(te/86400)+"d"}async function c(){u(l,!0),u(o,"");try{u(a,(await Se("/api/news")).items||[],!0)}catch(ie){u(o,ie.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function f(){try{u(s,(await Se("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function b(ie,te){var _e;te.disabled=!0,te.textContent="Starte…";try{await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:ie.repo,role:ie.role,params_b:ie.params_b,quant:ie.quant,hf_token:ui()})}),(_e=document.querySelector(".nav-item[data-view='activity']"))==null||_e.dispatchEvent(new MouseEvent("click"))}catch(Ie){te.disabled=!1,te.textContent="Installieren",alert("Fehler: "+Ie.message)}}function T(){c(),f()}wi(()=>{c(),f()});var _=fv(),x=tt(_),$=i(r(x),2),R=i(x,2);{var A=ie=>{var te=lv(),_e=r(te),Ie=i(r(_e),2),He=r(Ie),Ne=i(_e,4);Ze(Ne,21,()=>t(s),et,(ot,P)=>{var ye=sv(),qe=r(ye),Qe=r(qe),q=r(Qe),oe=r(q),Le=i(q,2),Ge=r(Le),je=i(Qe,2),Oe=r(je),dt=i(qe,2);z(Xe=>{h(oe,t(P).name),wt(Le,1,`fit-badge ${Xe??""}`),h(Ge,t(P).fit.text),h(Oe,`Ersetzt dein „${t(P).old??""}". ${t(P).why??""}`)},[()=>d(t(P).fit.level)]),S("click",dt,Xe=>b(t(P),Xe.currentTarget)),p(ot,ye)}),z(()=>h(He,t(s).length)),p(ie,te)};O(R,ie=>{t(s).length&&ie(A)})}var N=i(R,2);{var Pe=ie=>{var te=ov();p(ie,te)},Me=ie=>{var te=dv(),_e=r(te);z(()=>h(_e,t(o))),p(ie,te)},Ce=ie=>{var te=cv();p(ie,te)},De=ie=>{var te=pv();Ze(te,21,()=>t(a),et,(_e,Ie,He)=>{var Ne=uv();wt(Ne,1,`news-card${He===0?" featured":""}`);var ot=r(Ne),P=r(ot),ye=r(P),qe=i(P,2);{var Qe=je=>{var Oe=vv();p(je,Oe)};O(qe,je=>{t(Ie).relevant&&je(Qe)})}var q=i(qe,2),oe=r(q),Le=i(ot,2),Ge=r(Le);z(je=>{za(Ne,"href",t(Ie).link),h(ye,t(Ie).source),h(oe,je),h(Ge,t(Ie).title)},[()=>t(Ie).ts?v(t(Ie).ts):""]),p(_e,Ne)}),p(ie,te)};O(N,ie=>{t(l)?ie(Pe):t(o)?ie(Me,1):t(a).length?ie(De,-1):ie(Ce,2)})}S("click",$,T),p(e,_),In()}Gn(["click"]);const ss=[{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=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=L(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(tt(l),2),d=i(r(o),2);Je(d,21,()=>dv,Xe,(f,b)=>{var T=q(()=>Hn(t(b),2));let _=()=>t(T)[0],y=()=>t(T)[1];var D=cv(),B=r(D),M=r(B),K=i(B,2),Oe=r(K);z(()=>{h(M,_()),h(Oe,y())}),p(f,D)});var c=i(o,2);Je(c,21,()=>es,Xe,(f,b,T)=>{var _=vv(),y=r(_);z(()=>{Et(_,1,`guide-tab${t(a)===T?" active":""}`,"svelte-112sh7i"),h(y,t(b).label)}),S("click",_,()=>s(T)),p(f,_)});var v=i(c,2);Je(v,17,()=>es,Xe,(f,b,T)=>{var _=pv();Aa(_,"id",`guide-group-${T}`);var y=r(_),D=r(y),B=i(y,2);Je(B,17,()=>t(b).tutorials,Xe,(M,K,Oe)=>{var Ee=q(()=>Hn(t(K),2));let Ce=()=>t(Ee)[0],Re=()=>t(Ee)[1];var te=uv();te.open=T===0&&Oe===0;var X=r(te),be=r(X),Be=i(X,2);Ye(Be,Re,!0),z(()=>h(be,Ce())),p(M,te)}),z(()=>h(D,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. +
    `]]}],gv=[["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 mv=g('

    '),bv=g(""),_v=g('
    '),yv=g('
    '),xv=g('

    Guide

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

    Begriffe kurz erklärt

    ',1);function kv(e,n){Dn(n,!0);let a=B(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=xv(),o=i(tt(l),2),d=i(r(o),2);Ze(d,21,()=>gv,et,(f,b)=>{var T=V(()=>Bn(t(b),2));let _=()=>t(T)[0],x=()=>t(T)[1];var $=mv(),R=r($),A=r(R),N=i(R,2),Pe=r(N);z(()=>{h(A,_()),h(Pe,x())}),p(f,$)});var v=i(o,2);Ze(v,21,()=>ss,et,(f,b,T)=>{var _=bv(),x=r(_);z(()=>{wt(_,1,`guide-tab${t(a)===T?" active":""}`,"svelte-112sh7i"),h(x,t(b).label)}),S("click",_,()=>s(T)),p(f,_)});var c=i(v,2);Ze(c,17,()=>ss,et,(f,b,T)=>{var _=yv();za(_,"id",`guide-group-${T}`);var x=r(_),$=r(x),R=i(x,2);Ze(R,17,()=>t(b).tutorials,et,(A,N,Pe)=>{var Me=V(()=>Bn(t(N),2));let Ce=()=>t(Me)[0],De=()=>t(Me)[1];var ie=_v();ie.open=T===0&&Pe===0;var te=r(ie),_e=r(te),Ie=i(te,2);nt(Ie,De,!0),z(()=>h(_e,Ce())),p(A,ie)}),z(()=>h($,t(b).label)),p(f,_)}),p(e,l),In()}Gn(["click"]);var wv=g('
    '),Sv=g('

    Import aus Claude / Gemini / ChatGPT

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

    Neuer Eintrag

    Strg+Enter zum Speichern
    '),Ev=g(' '),Av=g('
    Lade…
    '),Cv=g(''),Tv=g('
    '),zv=g('
    ',1),$v=g('
    '),Pv=g("
    "),Dv=g('
    '),Iv=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){$n(n,!0);let a=L(jt([])),s=L(!0),l=L("all"),o=L(!1),d=L(""),c=L("stable"),v=L(null),f=L(""),b=L("stable"),T=L(!1),_=L(""),y=L("stable"),D=L("import"),B=L(!1);const M=q(()=>t(_).split(` -`).map($=>$.trim()).filter($=>$.length>0)),K=q(()=>t(l)==="all"?t(a):t(a).filter($=>$.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($){const G=Math.floor((Date.now()-new Date($).getTime())/1e3);return G<60?"gerade eben":G<3600?`vor ${Math.floor(G/60)} Min`:G<86400?`vor ${Math.floor(G/3600)} Std`:`vor ${Math.floor(G/86400)} Tagen`}function Ce($){return t(a).filter(G=>G.category===$).length}async function Re(){try{u(a,await we("/api/memory"),!0)}catch($){ce("Laden fehlgeschlagen: "+$.message,!0)}finally{u(s,!1)}}async function te(){if(t(d).trim())try{const $=await we("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(c),source:"manual"})});u(a,[$,...t(a)],!0),u(d,""),u(c,"stable"),u(o,!1),ce("Gespeichert")}catch($){ce("Fehler: "+$.message,!0)}}async function X($){try{const G=await we(`/api/memory/${$.id}`,{method:"PUT",body:JSON.stringify({content:t(f),category:t(b)})});u(a,t(a).map(E=>E.id===$.id?G:E),!0),u(v,null),ce("Aktualisiert")}catch(G){ce("Fehler: "+G.message,!0)}}async function be($){if(await hn({title:"Eintrag löschen?",body:`„${$.content.length>80?$.content.slice(0,80)+"…":$.content}" wird dauerhaft entfernt.`,danger:!0}))try{await we(`/api/memory/${$.id}`,{method:"DELETE"}),u(a,t(a).filter(E=>E.id!==$.id),!0),ce("Gelöscht")}catch(E){ce("Fehler: "+E.message,!0)}}function Be($){u(v,$.id,!0),u(f,$.content,!0),u(b,$.category,!0)}let Ne=L(!1);async function Ze(){u(Ne,!0);try{const $=await we("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if($.duplicate_count===0){ce("Keine Dubletten gefunden 🎉");return}if(!await hn({title:`${$.duplicate_count} Dubletten entfernen?`,body:`${$.duplicate_count} doppelte Einträge werden gelöscht; die ${$.groups.length} vollständigeren bleiben erhalten. Nur exakte/enthaltene/sehr ähnliche Einträge derselben Kategorie.`,danger:!0}))return;const E=await we("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})});ce(`${E.removed} Dubletten entfernt`),await Re()}catch($){ce("Fehler: "+$.message,!0)}finally{u(Ne,!1)}}async function ut(){if(t(M).length===0)return;u(B,!0);let $=0;for(const G of t(M))try{const E=await we("/api/memory",{method:"POST",body:JSON.stringify({content:G,category:t(y),source:t(D)})});u(a,[E,...t(a)],!0),$++}catch{}u(B,!1),u(T,!1),u(_,""),ce(`${$} von ${t(M).length} Einträgen importiert`)}bi(()=>{Re()});var I=Av(),ue=tt(I),Ae=i(r(ue),2),He=r(Ae),N=r(He),ve=i(He,2),pe=r(ve),je=i(ve,2),Ve=r(je),nt=i(ue,2);{var it=$=>{var G=mv(),E=i(r(G),6);Aa(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 Lv(e,n){Dn(n,!0);let a=B(Rt([])),s=B(!0),l=B("all"),o=B(!1),d=B(""),v=B("stable"),c=B(null),f=B(""),b=B("stable"),T=B(!1),_=B(""),x=B("stable"),$=B("import"),R=B(!1);const A=V(()=>t(_).split(` +`).map(I=>I.trim()).filter(I=>I.length>0)),N=V(()=>t(l)==="all"?t(a):t(a).filter(I=>I.category===t(l))),Pe={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function Me(I){const W=Math.floor((Date.now()-new Date(I).getTime())/1e3);return W<60?"gerade eben":W<3600?`vor ${Math.floor(W/60)} Min`:W<86400?`vor ${Math.floor(W/3600)} Std`:`vor ${Math.floor(W/86400)} Tagen`}function Ce(I){return t(a).filter(W=>W.category===I).length}async function De(){try{u(a,await Se("/api/memory"),!0)}catch(I){ve("Laden fehlgeschlagen: "+I.message,!0)}finally{u(s,!1)}}async function ie(){if(t(d).trim())try{const I=await Se("/api/memory",{method:"POST",body:JSON.stringify({content:t(d).trim(),category:t(v),source:"manual"})});u(a,[I,...t(a)],!0),u(d,""),u(v,"stable"),u(o,!1),ve("Gespeichert")}catch(I){ve("Fehler: "+I.message,!0)}}async function te(I){try{const W=await Se(`/api/memory/${I.id}`,{method:"PUT",body:JSON.stringify({content:t(f),category:t(b)})});u(a,t(a).map(M=>M.id===I.id?W:M),!0),u(c,null),ve("Aktualisiert")}catch(W){ve("Fehler: "+W.message,!0)}}async function _e(I){if(await hn({title:"Eintrag löschen?",body:`„${I.content.length>80?I.content.slice(0,80)+"…":I.content}" wird dauerhaft entfernt.`,danger:!0}))try{await Se(`/api/memory/${I.id}`,{method:"DELETE"}),u(a,t(a).filter(M=>M.id!==I.id),!0),ve("Gelöscht")}catch(M){ve("Fehler: "+M.message,!0)}}function Ie(I){u(c,I.id,!0),u(f,I.content,!0),u(b,I.category,!0)}let He=B(!1);async function Ne(){u(He,!0);try{const I=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){ve("Keine Dubletten gefunden 🎉");return}if(!await hn({title:`${I.duplicate_count} Dubletten entfernen?`,body:`${I.duplicate_count} doppelte Einträge werden gelöscht; die ${I.groups.length} vollständigeren bleiben erhalten. Nur exakte/enthaltene/sehr ähnliche Einträge derselben Kategorie.`,danger:!0}))return;const M=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})});ve(`${M.removed} Dubletten entfernt`),await De()}catch(I){ve("Fehler: "+I.message,!0)}finally{u(He,!1)}}async function ot(){if(t(A).length===0)return;u(R,!0);let I=0;for(const W of t(A))try{const M=await Se("/api/memory",{method:"POST",body:JSON.stringify({content:W,category:t(x),source:t($)})});u(a,[M,...t(a)],!0),I++}catch{}u(R,!1),u(T,!1),u(_,""),ve(`${I} von ${t(A).length} Einträgen importiert`)}xi(()=>{De()});var P=Iv(),ye=tt(P),qe=i(r(ye),2),Qe=r(qe),q=r(Qe),oe=i(Qe,2),Le=r(oe),Ge=i(oe,2),je=r(Ge),Oe=i(ye,2);{var dt=I=>{var W=Sv(),M=i(r(W),6);za(M,"placeholder",`Tobi arbeitet am liebsten abends. Projektsprache: Deutsch. Bosgame M5 läuft mit Ubuntu 26.04. -...`);var Y=i(E,2),ke=r(Y),Pe=i(r(ke),2),C=r(Pe);C.value=C.__value="user";var R=i(C);R.value=R.__value="instruction";var se=i(R);se.value=se.__value="stable";var ie=i(se);ie.value=ie.__value="versioned";var ee=i(ie);ee.value=ee.__value="ephemeral";var Se=i(ke,2),de=i(r(Se),2),A=r(de);A.value=A.__value="import";var U=i(A);U.value=U.__value="claude";var oe=i(U);oe.value=oe.__value="gemini";var Me=i(oe);Me.value=Me.__value="chatgpt";var H=i(Me);H.value=H.__value="manual";var le=i(Y,2);{var Te=W=>{var xe=gv(),Ie=r(xe);z(()=>h(Ie,`${t(M).length??""} Eintrag/Einträge erkannt`)),p(W,xe)};O(le,W=>{t(M).length>0&&W(Te)})}var ze=i(le,2),x=r(ze),J=r(x),he=i(x,2);z(()=>{x.disabled=t(M).length===0||t(B),h(J,t(B)?"Importiere…":`${t(M).length} Einträge speichern`)}),dn(E,()=>t(_),W=>u(_,W)),Jn(Pe,()=>t(y),W=>u(y,W)),Jn(de,()=>t(D),W=>u(D,W)),S("click",x,ut),S("click",he,()=>{u(T,!1),u(_,"")}),p($,G)};O(nt,$=>{t(T)&&$(it)})}var et=i(nt,2);{var bt=$=>{var G=bv(),E=i(r(G),4),Y=i(E,4),ke=r(Y);ke.value=ke.__value="user";var Pe=i(ke);Pe.value=Pe.__value="instruction";var C=i(Pe);C.value=C.__value="stable";var R=i(C);R.value=R.__value="versioned";var se=i(R);se.value=se.__value="ephemeral";var ie=i(Y,2),ee=r(ie),Se=i(ee,2);z(de=>ee.disabled=de,[()=>!t(d).trim()]),S("keydown",E,de=>{de.key==="Enter"&&(de.ctrlKey||de.metaKey)&&te()}),dn(E,()=>t(d),de=>u(d,de)),Jn(Y,()=>t(c),de=>u(c,de)),S("click",ee,te),S("click",Se,()=>{u(o,!1),u(d,"")}),p($,G)};O(et,$=>{t(o)&&$(bt)})}var wt=i(et,2),Ct=r(wt),Kt=i(r(Ct),2);Je(Kt,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",Ce("user")],["instruction","Verhalten","#fb923c",Ce("instruction")],["stable","Stabil","var(--accent)",Ce("stable")],["versioned","Versioniert","#f59e0b",Ce("versioned")],["ephemeral","Temporär","var(--mut)",Ce("ephemeral")]],Xe,($,G)=>{var E=q(()=>Hn(t(G),4));let Y=()=>t(E)[0],ke=()=>t(E)[1],Pe=()=>t(E)[2],C=()=>t(E)[3];var R=_v(),se=r(R),ie=i(se),ee=r(ie);z(()=>{At(R,`cursor:pointer;${t(l)===Y()?`background:rgba(45,212,191,.12);border-color:${Pe()||"var(--accent)"};color:${Pe()||"var(--accent)"}`:""}`),h(se,`${ke()??""} `),h(ee,C())}),S("click",R,()=>u(l,Y(),!0)),S("keydown",R,Se=>Se.key==="Enter"&&u(l,Y(),!0)),p($,R)});var Pt=i(wt,2);{var Dt=$=>{var G=yv();p($,G)},Lt=$=>{var G=kv(),E=r(G),Y=r(E),ke=r(Y),Pe=i(Y,2),C=r(Pe),R=i(Pe,2);{var se=ie=>{var ee=xv();S("click",ee,()=>u(o,!0)),p(ie,ee)};O(R,ie=>{t(a).length===0&&ie(se)})}z(()=>{h(ke,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(C,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($,G)},It=$=>{var G=Ev();Je(G,23,()=>t(K),E=>E.id,(E,Y,ke)=>{var Pe=Mv(),C=r(Pe);{var R=ie=>{var ee=wv(),Se=tt(ee),de=i(Se,2),A=r(de);A.value=A.__value="user";var U=i(A);U.value=U.__value="instruction";var oe=i(U);oe.value=oe.__value="stable";var Me=i(oe);Me.value=Me.__value="versioned";var H=i(Me);H.value=H.__value="ephemeral";var le=i(de,2),Te=r(le),ze=i(Te,2);dn(Se,()=>t(f),x=>u(f,x)),Jn(de,()=>t(b),x=>u(b,x)),S("click",Te,()=>X(t(Y))),S("click",ze,()=>u(v,null)),p(ie,ee)},se=ie=>{var ee=Sv(),Se=r(ee),de=r(Se),A=r(de),U=i(de,2),oe=r(U),Me=r(oe),H=i(oe,2),le=r(H),Te=i(H,2),ze=r(Te),x=i(Se,2),J=r(x),he=i(J,2);z(W=>{var xe,Ie,Fe;h(A,t(Y).content),At(oe,`border-color:${(((xe=Oe[t(Y).category])==null?void 0:xe.color)||"var(--mut)")??""};color:${(((Ie=Oe[t(Y).category])==null?void 0:Ie.color)||"var(--mut)")??""}`),h(Me,((Fe=Oe[t(Y).category])==null?void 0:Fe.label)||t(Y).category),h(le,t(Y).source),h(ze,W)},[()=>Ee(t(Y).updated_at)]),S("click",J,()=>Be(t(Y))),S("click",he,()=>be(t(Y))),p(ie,ee)};O(C,ie=>{t(v)===t(Y).id?ie(R):ie(se,-1)})}z(()=>At(Pe,`padding:14px 16px;${t(ke){t(s)?$(Dt):t(K).length===0?$(Lt,1):$(It,-1)})}var Tt=i(Pt,2),P=i(r(Tt),2),V=i(r(P),3);z(()=>{He.disabled=t(Ne),h(N,t(Ne)?"…":"🧹 Aufräumen"),h(pe,t(T)?"Abbrechen":"⇩ Import"),h(Ve,t(o)?"Abbrechen":"+ Eintrag")}),S("click",He,Ze),S("click",ve,()=>{u(T,!t(T)),u(o,!1),u(_,"")}),S("click",je,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),S("click",V,$=>{var G;$.preventDefault(),(G=document.querySelector(".nav-item[data-view='connect']"))==null||G.click()}),p(e,I),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=L(null),s=L(!1),l=L(!1),o=L(!1),d=L(null),c=L(jt([])),v=L(jt([])),f=L(null),b=L(null),T=L("");async function _(){try{u(a,await we("/api/hermes/status"),!0)}catch{u(a,null)}}async function y(){try{const N=await we("/api/hermes/pubkey");u(T,N.pubkey,!0)}catch{u(T,"")}}async function D(){u(o,!0);try{const[N,ve,pe,je,Ve]=await Promise.all([we("/api/hermes/agent"),we("/api/hermes/cron"),we("/api/hermes/skills"),we("/api/hermes/learned"),we("/api/hermes/insights")]);u(d,N,!0),u(c,ve.jobs||[],!0),u(v,pe.skills||[],!0),u(f,je,!0),u(b,Ve,!0)}catch{u(d,null)}u(o,!1)}let B=q(()=>[...t(v)].sort((N,ve)=>(ve.use_count||0)-(N.use_count||0)||(N.name||"").localeCompare(ve.name||""))),M=q(()=>t(v).filter(N=>(N.status||"").includes("enabled")).length);function K(){var N;(N=navigator.clipboard)==null||N.writeText(t(T)),ce("SSH-Key kopiert")}bi(()=>{_()});var Oe=ru(),Ee=tt(Oe),Ce=i(r(Ee),2),Re=r(Ce),te=r(Re),X=i(Re,2),be=i(X,2),Be=i(Ee,2);{var Ne=N=>{var ve=Qv(),pe=r(ve),je=i(r(pe),2),Ve=r(je),nt=i(pe,2),it=r(nt),et=i(r(it),2),bt=r(et),wt=r(bt),Ct=i(bt,2),Kt=r(Ct),Pt=i(Ct,2);{var Dt=H=>{var le=ts(),Te=r(le);z(()=>h(Te,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),p(H,le)};O(Pt,H=>{var le;((le=t(d))==null?void 0:le.heartbeat_age_s)!=null&&H(Dt)})}var Lt=i(Pt,2);{var It=H=>{var le=ts(),Te=r(le);z(ze=>{Aa(le,"title",t(d).version),h(Te,ze)},[()=>t(d).version.split(" · ")[0]]),p(H,le)};O(Lt,H=>{var le;(le=t(d))!=null&&le.version&&H(It)})}var Tt=i(nt,2);{var P=H=>{var le=Ov(),Te=i(r(le),2),ze=r(Te);{var x=F=>{var ne=Tv(),_e=r(ne),ge=r(_e);z(()=>h(ge,t(b).sessions)),p(F,ne)};O(ze,F=>{t(b).sessions&&F(x)})}var J=i(ze,2);{var he=F=>{var ne=zv(),_e=r(ne),ge=r(_e);z(()=>h(ge,t(b).messages)),p(F,ne)};O(J,F=>{t(b).messages&&F(he)})}var W=i(J,2);{var xe=F=>{var ne=$v(),_e=r(ne),ge=r(_e);z(()=>h(ge,t(b).tool_calls)),p(F,ne)};O(W,F=>{t(b).tool_calls&&F(xe)})}var Ie=i(W,2);{var Fe=F=>{var ne=Pv(),_e=r(ne),ge=r(_e);z(()=>h(ge,t(b).total_tokens)),p(F,ne)};O(Ie,F=>{t(b).total_tokens&&F(Fe)})}var De=i(Ie,2);{var j=F=>{var ne=Dv(),_e=r(ne),ge=r(_e);z(()=>h(ge,t(b).active_time)),p(F,ne)};O(De,F=>{t(b).active_time&&F(j)})}var Q=i(Te,2);{var Z=F=>{var ne=Lv(),_e=i(tt(ne),2);Je(_e,21,()=>t(b).top_tools.slice(0,6),Xe,(ge,fe)=>{var me=Iv(),_t=r(me),zt=r(_t),Ot=i(_t,2),gn=r(Ot),da=i(Ot,2),k=r(da);z(()=>{h(zt,t(fe).name),At(gn,`display:block;height:100%;width:${t(fe).pct??""}%;background:var(--accent)`),h(k,`${t(fe).calls??""}× · ${t(fe).pct??""}%`)}),p(ge,me)}),p(F,ne)};O(Q,F=>{var ne;(ne=t(b).top_tools)!=null&&ne.length&&F(Z)})}p(H,le)};O(Tt,H=>{t(b)&&(t(b).sessions||t(b).total_tokens)&&H(P)})}var V=i(Tt,2);{var $=H=>{var le=Kv(),Te=i(r(le),2);{var ze=he=>{var W=Rv();Je(W,21,()=>t(f).user_facts,Xe,(xe,Ie)=>{var Fe=Bv(),De=r(Fe);z(()=>h(De,t(Ie))),p(xe,Fe)}),p(he,W)};O(Te,he=>{var W;(W=t(f).user_facts)!=null&&W.length&&he(ze)})}var x=i(Te,2);{var J=he=>{var W=Fv(),xe=r(W);z(()=>h(xe,t(f).memory)),p(he,W)};O(x,he=>{t(f).memory&&he(J)})}p(H,le)};O(V,H=>{var le,Te,ze;((Te=(le=t(f))==null?void 0:le.user_facts)!=null&&Te.length||(ze=t(f))!=null&&ze.memory)&&H($)})}var G=i(V,2),E=r(G),Y=r(E),ke=i(r(Y)),Pe=r(ke),C=i(E,2);{var R=H=>{var le=Nv();p(H,le)},se=H=>{var le=Vv();Je(le,21,()=>t(c),Xe,(Te,ze)=>{var x=Gv();Je(x,21,()=>Object.entries(t(ze)),Xe,(J,he)=>{var W=q(()=>Hn(t(he),2));let xe=()=>t(W)[0],Ie=()=>t(W)[1];var Fe=Ua(),De=tt(Fe);{var j=Q=>{var Z=qv(),F=r(Z),ne=r(F),_e=i(F);z(()=>{h(ne,`${xe()??""}:`),h(_e,` ${Ie()??""}`)}),p(Q,Z)};O(De,Q=>{Ie()&&Q(j)})}p(J,Fe)}),p(Te,x)}),p(H,le)};O(C,H=>{t(c).length===0?H(R):H(se,-1)})}var ie=i(G,2),ee=r(ie),Se=r(ee),de=i(r(Se)),A=r(de),U=i(ee,2);{var oe=H=>{var le=Wv();p(H,le)},Me=H=>{var le=Jv();Je(le,21,()=>t(B),Xe,(Te,ze)=>{var x=Hv(),J=r(x),he=i(J,2),W=r(he),xe=i(he,2);{var Ie=Z=>{var F=jv(),ne=r(F);z(()=>h(ne,t(ze).category)),p(Z,F)};O(xe,Z=>{t(ze).category&&Z(Ie)})}var Fe=i(xe,4);{var De=Z=>{var F=Uv(),ne=r(F);z(()=>h(ne,`${t(ze).use_count??""}× genutzt`)),p(Z,F)};O(Fe,Z=>{t(ze).use_count>0&&Z(De)})}var j=i(Fe,2),Q=r(j);z((Z,F)=>{At(x,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; - border-radius:6px;${Z??""}`),At(J,`width:7px;height:7px;border-radius:50%;flex-shrink:0; - background:${F??""}`),h(W,t(ze).name),h(Q,t(ze).source)},[()=>(t(ze).status||"").includes("enabled")?"":"opacity:.45",()=>(t(ze).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),p(Te,x)}),p(H,le)};O(U,H=>{t(v).length===0?H(oe):H(Me,-1)})}z(()=>{var H,le,Te,ze;h(Ve,t(o)?"…":"↻ Aktualisieren"),At(bt,`font-size:11px;${((H=t(d))==null?void 0:H.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(wt,`● ${((le=t(d))==null?void 0:le.gateway_state)??"offline"??""}`),At(Ct,`font-size:11px;${(Te=t(d))!=null&&Te.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Kt,`⏱ Scheduler ${(ze=t(d))!=null&&ze.cron_running?"läuft":"inaktiv"}`),h(Pe,`(${t(c).length??""})`),h(A,`(${t(M)??""} aktiv von ${t(v).length??""})`)}),S("click",je,D),p(N,ve)};O(Be,N=>{t(l)&&N(Ne)})}var Ze=i(Be,2);{var ut=N=>{var ve=nu(),pe=i(r(ve),2),je=r(pe),Ve=i(r(je),2),nt=r(Ve),it=i(je,2);{var et=G=>{var E=Zv();p(G,E)};O(it,G=>{var E;((E=t(a))==null?void 0:E.whisper)==="not_installed"&&G(et)})}var bt=i(pe,2),wt=r(bt),Ct=i(r(wt),2),Kt=r(Ct),Pt=i(wt,2);{var Dt=G=>{var E=Yv(),Y=r(E),ke=r(Y);z(Pe=>h(ke,Pe),[()=>["# 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(G,E)};O(Pt,G=>{var E;((E=t(a))==null?void 0:E.piper)!=="ready"&&G(Dt)})}var Lt=i(bt,2),It=r(Lt),Tt=i(r(It),2),P=r(Tt),V=i(It,2);{var $=G=>{var E=tu(),Y=i(r(E),4),ke=i(r(Y),2),Pe=r(ke);Pe.textContent=`Start-Service sshd -Set-Service -Name sshd -StartupType Automatic`;var C=i(Y,2),R=i(r(C),2),se=r(R);se.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var ie=i(C,2);{var ee=A=>{var U=Xv(),oe=i(r(U),2),Me=r(oe),H=i(Me,2),le=r(H),Te=r(le);z(()=>h(Te,'echo "'+t(T)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),S("click",Me,K),p(A,U)},Se=A=>{var U=eu();p(A,U)};O(ie,A=>{t(T)?A(ee):A(Se,-1)})}var de=i(ie,4);S("click",de,()=>{_(),ce("Status aktualisiert")}),p(G,E)};O(V,G=>{var E;(E=t(a))!=null&&E.ssh_ok||G($)})}z(()=>{var G,E,Y,ke,Pe,C;At(Ve,`font-size:11px;${((G=t(a))==null?void 0:G.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),h(nt,((E=t(a))==null?void 0:E.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),At(Ct,`font-size:11px;${((Y=t(a))==null?void 0:Y.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),h(Kt,((ke=t(a))==null?void 0:ke.piper)==="ready"?"✓ OK":"✗ fehlt"),At(Tt,`font-size:11px;${(Pe=t(a))!=null&&Pe.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),h(P,(C=t(a))!=null&&C.ssh_ok?"✓ verbunden":"optional")}),p(N,ve)};O(Ze,N=>{t(s)&&N(ut)})}var I=i(Ze,2),ue=r(I);{var Ae=N=>{var ve=au();p(N,ve)},He=N=>{var ve=iu();p(N,ve)};O(ue,N=>{var ve;((ve=t(a))==null?void 0:ve.hermes)==="ready"?N(Ae):N(He,-1)})}z(()=>{var N,ve;At(Re,`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(te,`● Agent: ${((ve=t(a))==null?void 0:ve.hermes)==="ready"?"online":"offline"}`),At(X,`padding:4px 10px;font-size:12px;${t(l)?"border-color:var(--accent);color:var(--accent)":""}`)}),S("click",X,()=>{u(l,!t(l)),t(l)&&D()}),S("click",be,()=>{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 we("/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 we("/api/status"))}catch{as(null)}}async function rl(){try{du(await we("/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); +...`);var ee=i(M,2),xe=r(ee),Te=i(r(xe),2),C=r(Te);C.value=C.__value="user";var F=i(C);F.value=F.__value="instruction";var re=i(F);re.value=re.__value="stable";var se=i(re);se.value=se.__value="versioned";var ne=i(se);ne.value=ne.__value="ephemeral";var ke=i(xe,2),de=i(r(ke),2),E=r(de);E.value=E.__value="import";var Q=i(E);Q.value=Q.__value="claude";var ce=i(Q);ce.value=ce.__value="gemini";var Ee=i(ce);Ee.value=Ee.__value="chatgpt";var Z=i(Ee);Z.value=Z.__value="manual";var le=i(ee,2);{var Ae=U=>{var we=wv(),Be=r(we);z(()=>h(Be,`${t(A).length??""} Eintrag/Einträge erkannt`)),p(U,we)};O(le,U=>{t(A).length>0&&U(Ae)})}var ze=i(le,2),w=r(ze),j=r(w),pe=i(w,2);z(()=>{w.disabled=t(A).length===0||t(R),h(j,t(R)?"Importiere…":`${t(A).length} Einträge speichern`)}),on(M,()=>t(_),U=>u(_,U)),Jn(Te,()=>t(x),U=>u(x,U)),Jn(de,()=>t($),U=>u($,U)),S("click",w,ot),S("click",pe,()=>{u(T,!1),u(_,"")}),p(I,W)};O(Oe,I=>{t(T)&&I(dt)})}var Xe=i(Oe,2);{var pt=I=>{var W=Mv(),M=i(r(W),4),ee=i(M,4),xe=r(ee);xe.value=xe.__value="user";var Te=i(xe);Te.value=Te.__value="instruction";var C=i(Te);C.value=C.__value="stable";var F=i(C);F.value=F.__value="versioned";var re=i(F);re.value=re.__value="ephemeral";var se=i(ee,2),ne=r(se),ke=i(ne,2);z(de=>ne.disabled=de,[()=>!t(d).trim()]),S("keydown",M,de=>{de.key==="Enter"&&(de.ctrlKey||de.metaKey)&&ie()}),on(M,()=>t(d),de=>u(d,de)),Jn(ee,()=>t(v),de=>u(v,de)),S("click",ne,ie),S("click",ke,()=>{u(o,!1),u(d,"")}),p(I,W)};O(Xe,I=>{t(o)&&I(pt)})}var ct=i(Xe,2),mt=r(ct),Ct=i(r(mt),2);Ze(Ct,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",Ce("user")],["instruction","Verhalten","#fb923c",Ce("instruction")],["stable","Stabil","var(--accent)",Ce("stable")],["versioned","Versioniert","#f59e0b",Ce("versioned")],["ephemeral","Temporär","var(--mut)",Ce("ephemeral")]],et,(I,W)=>{var M=V(()=>Bn(t(W),4));let ee=()=>t(M)[0],xe=()=>t(M)[1],Te=()=>t(M)[2],C=()=>t(M)[3];var F=Ev(),re=r(F),se=i(re),ne=r(se);z(()=>{St(F,`cursor:pointer;${t(l)===ee()?`background:rgba(45,212,191,.12);border-color:${Te()||"var(--accent)"};color:${Te()||"var(--accent)"}`:""}`),h(re,`${xe()??""} `),h(ne,C())}),S("click",F,()=>u(l,ee(),!0)),S("keydown",F,ke=>ke.key==="Enter"&&u(l,ee(),!0)),p(I,F)});var Tt=i(ct,2);{var Mt=I=>{var W=Av();p(I,W)},Ft=I=>{var W=Tv(),M=r(W),ee=r(M),xe=r(ee),Te=i(ee,2),C=r(Te),F=i(Te,2);{var re=se=>{var ne=Cv();S("click",ne,()=>u(o,!0)),p(se,ne)};O(F,se=>{t(a).length===0&&se(re)})}z(()=>{h(xe,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(C,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(I,W)},zt=I=>{var W=Dv();Ze(W,23,()=>t(N),M=>M.id,(M,ee,xe)=>{var Te=Pv(),C=r(Te);{var F=se=>{var ne=zv(),ke=tt(ne),de=i(ke,2),E=r(de);E.value=E.__value="user";var Q=i(E);Q.value=Q.__value="instruction";var ce=i(Q);ce.value=ce.__value="stable";var Ee=i(ce);Ee.value=Ee.__value="versioned";var Z=i(Ee);Z.value=Z.__value="ephemeral";var le=i(de,2),Ae=r(le),ze=i(Ae,2);on(ke,()=>t(f),w=>u(f,w)),Jn(de,()=>t(b),w=>u(b,w)),S("click",Ae,()=>te(t(ee))),S("click",ze,()=>u(c,null)),p(se,ne)},re=se=>{var ne=$v(),ke=r(ne),de=r(ke),E=r(de),Q=i(de,2),ce=r(Q),Ee=r(ce),Z=i(ce,2),le=r(Z),Ae=i(Z,2),ze=r(Ae),w=i(ke,2),j=r(w),pe=i(j,2);z(U=>{var we,Be,Fe;h(E,t(ee).content),St(ce,`border-color:${(((we=Pe[t(ee).category])==null?void 0:we.color)||"var(--mut)")??""};color:${(((Be=Pe[t(ee).category])==null?void 0:Be.color)||"var(--mut)")??""}`),h(Ee,((Fe=Pe[t(ee).category])==null?void 0:Fe.label)||t(ee).category),h(le,t(ee).source),h(ze,U)},[()=>Me(t(ee).updated_at)]),S("click",j,()=>Ie(t(ee))),S("click",pe,()=>_e(t(ee))),p(se,ne)};O(C,se=>{t(c)===t(ee).id?se(F):se(re,-1)})}z(()=>St(Te,`padding:14px 16px;${t(xe){t(s)?I(Mt):t(N).length===0?I(Ft,1):I(zt,-1)})}var Et=i(Tt,2),D=i(r(Et),2),J=i(r(D),3);z(()=>{Qe.disabled=t(He),h(q,t(He)?"…":"🧹 Aufräumen"),h(Le,t(T)?"Abbrechen":"⇩ Import"),h(je,t(o)?"Abbrechen":"+ Eintrag")}),S("click",Qe,Ne),S("click",oe,()=>{u(T,!t(T)),u(o,!1),u(_,"")}),S("click",Ge,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),S("click",J,I=>{var W;I.preventDefault(),(W=document.querySelector(".nav-item[data-view='connect']"))==null||W.click()}),p(e,P),In()}Gn(["click","keydown"]);var ls=g(' '),Ov=g(' Sessions'),Bv=g(' Nachrichten'),Rv=g(' Tool-Calls'),Fv=g(' Tokens'),Kv=g(' aktiv'),Nv=g('
      '),qv=g('
      Meistgenutzte Tools
      ',1),Gv=g('
      Aktivität (letzte 30 Tage)
      '),Vv=g('
    • '),Wv=g('
        '),jv=g('
        '),Uv=g('
        Was Hermes über dich gelernt hat (automatisches Profil)
        '),Hv=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".
        `),Jv=g(' '),Qv=g(`
        `),Zv=g('
        '),Yv=g('
        Keine Skills geladen (oder Agent offline).
        '),Xv=g(' '),eu=g(' '),tu=g('
        '),nu=g('
        '),au=g('

        Agent-Cockpit

        Status
        Hermes-Gateway-Dienst (:8642) auf dem Bosgame
        Geplante Aufgaben
        Skills
        '),iu=g('
        pip install faster-whisper
        '),ru=g('
        '),su=g('
        4. Bosgame-Key eintragen (in Windows PowerShell):
        '),lu=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 ""
        '),ou=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
        '),du=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
        '),cu=g(''),vu=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.
        `),uu=g('

        Hermes

        ',1);function pu(e,n){Dn(n,!0);let a=B(null),s=B(!1),l=B(!1),o=B(!1),d=B(null),v=B(Rt([])),c=B(Rt([])),f=B(null),b=B(null),T=B("");async function _(){try{u(a,await Se("/api/hermes/status"),!0)}catch{u(a,null)}}async function x(){try{const q=await Se("/api/hermes/pubkey");u(T,q.pubkey,!0)}catch{u(T,"")}}async function $(){u(o,!0);try{const[q,oe,Le,Ge,je]=await Promise.all([Se("/api/hermes/agent"),Se("/api/hermes/cron"),Se("/api/hermes/skills"),Se("/api/hermes/learned"),Se("/api/hermes/insights")]);u(d,q,!0),u(v,oe.jobs||[],!0),u(c,Le.skills||[],!0),u(f,Ge,!0),u(b,je,!0)}catch{u(d,null)}u(o,!1)}let R=V(()=>[...t(c)].sort((q,oe)=>(oe.use_count||0)-(q.use_count||0)||(q.name||"").localeCompare(oe.name||""))),A=V(()=>t(c).filter(q=>(q.status||"").includes("enabled")).length);function N(){var q;(q=navigator.clipboard)==null||q.writeText(t(T)),ve("SSH-Key kopiert")}xi(()=>{_()});var Pe=uu(),Me=tt(Pe),Ce=i(r(Me),2),De=r(Ce),ie=r(De),te=i(De,2),_e=i(te,2),Ie=i(Me,2);{var He=q=>{var oe=au(),Le=r(oe),Ge=i(r(Le),2),je=r(Ge),Oe=i(Le,2),dt=r(Oe),Xe=i(r(dt),2),pt=r(Xe),ct=r(pt),mt=i(pt,2),Ct=r(mt),Tt=i(mt,2);{var Mt=Z=>{var le=ls(),Ae=r(le);z(()=>h(Ae,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),p(Z,le)};O(Tt,Z=>{var le;((le=t(d))==null?void 0:le.heartbeat_age_s)!=null&&Z(Mt)})}var Ft=i(Tt,2);{var zt=Z=>{var le=ls(),Ae=r(le);z(ze=>{za(le,"title",t(d).version),h(Ae,ze)},[()=>t(d).version.split(" · ")[0]]),p(Z,le)};O(Ft,Z=>{var le;(le=t(d))!=null&&le.version&&Z(zt)})}var Et=i(Oe,2);{var D=Z=>{var le=Gv(),Ae=i(r(le),2),ze=r(Ae);{var w=K=>{var ae=Ov(),fe=r(ae),he=r(fe);z(()=>h(he,t(b).sessions)),p(K,ae)};O(ze,K=>{t(b).sessions&&K(w)})}var j=i(ze,2);{var pe=K=>{var ae=Bv(),fe=r(ae),he=r(fe);z(()=>h(he,t(b).messages)),p(K,ae)};O(j,K=>{t(b).messages&&K(pe)})}var U=i(j,2);{var we=K=>{var ae=Rv(),fe=r(ae),he=r(fe);z(()=>h(he,t(b).tool_calls)),p(K,ae)};O(U,K=>{t(b).tool_calls&&K(we)})}var Be=i(U,2);{var Fe=K=>{var ae=Fv(),fe=r(ae),he=r(fe);z(()=>h(he,t(b).total_tokens)),p(K,ae)};O(Be,K=>{t(b).total_tokens&&K(Fe)})}var $e=i(Be,2);{var H=K=>{var ae=Kv(),fe=r(ae),he=r(fe);z(()=>h(he,t(b).active_time)),p(K,ae)};O($e,K=>{t(b).active_time&&K(H)})}var Y=i(Ae,2);{var X=K=>{var ae=qv(),fe=i(tt(ae),2);Ze(fe,21,()=>t(b).top_tools.slice(0,6),et,(he,ue)=>{var ge=Nv(),kt=r(ge),$t=r(kt),Dt=i(kt,2),gn=r(Dt),ca=i(Dt,2),Yn=r(ca);z(()=>{h($t,t(ue).name),St(gn,`display:block;height:100%;width:${t(ue).pct??""}%;background:var(--accent)`),h(Yn,`${t(ue).calls??""}× · ${t(ue).pct??""}%`)}),p(he,ge)}),p(K,ae)};O(Y,K=>{var ae;(ae=t(b).top_tools)!=null&&ae.length&&K(X)})}p(Z,le)};O(Et,Z=>{t(b)&&(t(b).sessions||t(b).total_tokens)&&Z(D)})}var J=i(Et,2);{var I=Z=>{var le=Uv(),Ae=i(r(le),2);{var ze=pe=>{var U=Wv();Ze(U,21,()=>t(f).user_facts,et,(we,Be)=>{var Fe=Vv(),$e=r(Fe);z(()=>h($e,t(Be))),p(we,Fe)}),p(pe,U)};O(Ae,pe=>{var U;(U=t(f).user_facts)!=null&&U.length&&pe(ze)})}var w=i(Ae,2);{var j=pe=>{var U=jv(),we=r(U);z(()=>h(we,t(f).memory)),p(pe,U)};O(w,pe=>{t(f).memory&&pe(j)})}p(Z,le)};O(J,Z=>{var le,Ae,ze;((Ae=(le=t(f))==null?void 0:le.user_facts)!=null&&Ae.length||(ze=t(f))!=null&&ze.memory)&&Z(I)})}var W=i(J,2),M=r(W),ee=r(M),xe=i(r(ee)),Te=r(xe),C=i(M,2);{var F=Z=>{var le=Hv();p(Z,le)},re=Z=>{var le=Zv();Ze(le,21,()=>t(v),et,(Ae,ze)=>{var w=Qv();Ze(w,21,()=>Object.entries(t(ze)),et,(j,pe)=>{var U=V(()=>Bn(t(pe),2));let we=()=>t(U)[0],Be=()=>t(U)[1];var Fe=Ea(),$e=tt(Fe);{var H=Y=>{var X=Jv(),K=r(X),ae=r(K),fe=i(K);z(()=>{h(ae,`${we()??""}:`),h(fe,` ${Be()??""}`)}),p(Y,X)};O($e,Y=>{Be()&&Y(H)})}p(j,Fe)}),p(Ae,w)}),p(Z,le)};O(C,Z=>{t(v).length===0?Z(F):Z(re,-1)})}var se=i(W,2),ne=r(se),ke=r(ne),de=i(r(ke)),E=r(de),Q=i(ne,2);{var ce=Z=>{var le=Yv();p(Z,le)},Ee=Z=>{var le=nu();Ze(le,21,()=>t(R),et,(Ae,ze)=>{var w=tu(),j=r(w),pe=i(j,2),U=r(pe),we=i(pe,2);{var Be=X=>{var K=Xv(),ae=r(K);z(()=>h(ae,t(ze).category)),p(X,K)};O(we,X=>{t(ze).category&&X(Be)})}var Fe=i(we,4);{var $e=X=>{var K=eu(),ae=r(K);z(()=>h(ae,`${t(ze).use_count??""}× genutzt`)),p(X,K)};O(Fe,X=>{t(ze).use_count>0&&X($e)})}var H=i(Fe,2),Y=r(H);z((X,K)=>{St(w,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; + border-radius:6px;${X??""}`),St(j,`width:7px;height:7px;border-radius:50%;flex-shrink:0; + background:${K??""}`),h(U,t(ze).name),h(Y,t(ze).source)},[()=>(t(ze).status||"").includes("enabled")?"":"opacity:.45",()=>(t(ze).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),p(Ae,w)}),p(Z,le)};O(Q,Z=>{t(c).length===0?Z(ce):Z(Ee,-1)})}z(()=>{var Z,le,Ae,ze;h(je,t(o)?"…":"↻ Aktualisieren"),St(pt,`font-size:11px;${((Z=t(d))==null?void 0:Z.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(ct,`● ${((le=t(d))==null?void 0:le.gateway_state)??"offline"??""}`),St(mt,`font-size:11px;${(Ae=t(d))!=null&&Ae.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Ct,`⏱ Scheduler ${(ze=t(d))!=null&&ze.cron_running?"läuft":"inaktiv"}`),h(Te,`(${t(v).length??""})`),h(E,`(${t(A)??""} aktiv von ${t(c).length??""})`)}),S("click",Ge,$),p(q,oe)};O(Ie,q=>{t(l)&&q(He)})}var Ne=i(Ie,2);{var ot=q=>{var oe=du(),Le=i(r(oe),2),Ge=r(Le),je=i(r(Ge),2),Oe=r(je),dt=i(Ge,2);{var Xe=W=>{var M=iu();p(W,M)};O(dt,W=>{var M;((M=t(a))==null?void 0:M.whisper)==="not_installed"&&W(Xe)})}var pt=i(Le,2),ct=r(pt),mt=i(r(ct),2),Ct=r(mt),Tt=i(ct,2);{var Mt=W=>{var M=ru(),ee=r(M),xe=r(ee);z(Te=>h(xe,Te),[()=>["# 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(W,M)};O(Tt,W=>{var M;((M=t(a))==null?void 0:M.piper)!=="ready"&&W(Mt)})}var Ft=i(pt,2),zt=r(Ft),Et=i(r(zt),2),D=r(Et),J=i(zt,2);{var I=W=>{var M=ou(),ee=i(r(M),4),xe=i(r(ee),2),Te=r(xe);Te.textContent=`Start-Service sshd +Set-Service -Name sshd -StartupType Automatic`;var C=i(ee,2),F=i(r(C),2),re=r(F);re.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var se=i(C,2);{var ne=E=>{var Q=su(),ce=i(r(Q),2),Ee=r(ce),Z=i(Ee,2),le=r(Z),Ae=r(le);z(()=>h(Ae,'echo "'+t(T)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),S("click",Ee,N),p(E,Q)},ke=E=>{var Q=lu();p(E,Q)};O(se,E=>{t(T)?E(ne):E(ke,-1)})}var de=i(se,4);S("click",de,()=>{_(),ve("Status aktualisiert")}),p(W,M)};O(J,W=>{var M;(M=t(a))!=null&&M.ssh_ok||W(I)})}z(()=>{var W,M,ee,xe,Te,C;St(je,`font-size:11px;${((W=t(a))==null?void 0:W.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),h(Oe,((M=t(a))==null?void 0:M.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),St(mt,`font-size:11px;${((ee=t(a))==null?void 0:ee.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),h(Ct,((xe=t(a))==null?void 0:xe.piper)==="ready"?"✓ OK":"✗ fehlt"),St(Et,`font-size:11px;${(Te=t(a))!=null&&Te.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),h(D,(C=t(a))!=null&&C.ssh_ok?"✓ verbunden":"optional")}),p(q,oe)};O(Ne,q=>{t(s)&&q(ot)})}var P=i(Ne,2),ye=r(P);{var qe=q=>{var oe=cu();p(q,oe)},Qe=q=>{var oe=vu();p(q,oe)};O(ye,q=>{var oe;((oe=t(a))==null?void 0:oe.hermes)==="ready"?q(qe):q(Qe,-1)})}z(()=>{var q,oe;St(De,`font-size:11px;${((q=t(a))==null?void 0:q.hermes)==="ready"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(ie,`● Agent: ${((oe=t(a))==null?void 0:oe.hermes)==="ready"?"online":"offline"}`),St(te,`padding:4px 10px;font-size:12px;${t(l)?"border-color:var(--accent);color:var(--accent)":""}`)}),S("click",te,()=>{u(l,!t(l)),t(l)&&$()}),S("click",_e,()=>{u(s,!t(s)),t(s)&&(_(),x())}),p(e,Pe),In()}Gn(["click"]);let os={};function fu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ds(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"),cs("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"],v=(e.models||[]).find(f=>d.includes(f.state));if(s)if(v){const f=(l=v.meta)!=null&&l.ctx?` · ${Math.round(v.meta.ctx/1024)}k ctx`:"",b=v.state==="loading"||v.state==="starting"?' lädt…':"";s.innerHTML=`${v.name}${f}${b}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?bu():cs(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const c={};for(const f of e.models||[])c[f.name]=f.state;for(const[f,b]of Object.entries(c)){const T=os[f];if(T&&T!==b&&(b==="running"||b==="loading")){fu();break}}os=c}hu(e),Si.set(e)}function hu(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 gu(e){ga.set(e||[])}function mu(e){Rr.set(e)}function cs(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function bu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const _u=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function or(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=()=>_u(a),l}async function cl(){try{const e=await Se("/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(or(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(or(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(or(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Hi(){try{ds(await Se("/api/status"))}catch{ds(null)}}async function vl(){try{gu(await Se("/api/jobs"))}catch{}}function ul(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{mu(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(ul,3e3)},n.onerror=()=>n.close()}var gs;((gs=document.getElementById("logo"))==null?void 0:gs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Ui.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Ui[e.dataset.ic||""]||""});const yu=[["overview",_d],["models",Id],["activity",Wd],["server",tc],["cookbook",Rc],["connect",rv],["news",hv],["guides",kv],["memory",Lv],["hermes",pu]];for(const[e,n]of yu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Po(n,{target:a})}ed("overview");const dr=document.getElementById("token");dr&&(dr.value=dl(),dr.addEventListener("change",e=>{Jo(e.target.value),Hi()}));const cr=document.getElementById("hf-token");cr&&(cr.value=ui(),cr.addEventListener("change",e=>Zo(e.target.value)));const vs=document.getElementById("nav-settings"),vr=document.getElementById("settings-modal"),us=document.getElementById("sm-close");vs&&vr&&us&&(vs.addEventListener("click",()=>vr.style.display="flex"),us.addEventListener("click",()=>vr.style.display="none"));function xu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Hi);Hi();vl();ul();setInterval(xu,1e3);setInterval(Hi,3e3);setInterval(vl,1500);cl();setInterval(cl,6e4);