c0f77ba69c
Vollständige Überarbeitung des Guide-Tabs: Struktur: Statt 8 gleichwertiger Accordions jetzt 4 klar getrennte Gruppen (EINSTIEG / TOOLS EINRICHTEN / AGENTEN MEISTERN / WENN ETWAS NICHT KLAPPT) — jede als eigene Card mit farbigem Teal-Label. Anfänger sehen sofort die logische Reihenfolge. Neue Tutorials (war 8, jetzt 12): - "Welches Tool für mich?" — Entscheidungsbaum (OpenWebUI/Cline/OpenCode/Zed) - "OpenCode verbinden & erste Schritte" — Config + Befehle - "Cline in VS Code verbinden" — Plan- vs. Act-Modus erklärt - "OpenWebUI verbinden" — für Nutzer ohne Programmierkenntnisse - "Einen Agenten richtig briefen" — Schlecht→Gut-Beispiele - "MCP" — überarbeitet mit konkretem Config-Beispiel und Empfehlungen - "Skills & Rules" — AGENTS.md / .clinerules mit echten Pfaden und Quellen - "Häufige Probleme & Lösungen" — Troubleshooting-Tabelle (7 Fälle) Zusammengeführt: Kontext-Tutorials 2+3 (waren doppelt) → ein Tutorial. Neue CSS-Komponenten: .tut-table/.tut-row für Vergleichstabellen, .tut-code für Code-Blöcke, .bad für durchgestrichene Negativbeispiele. Neues main.css von Vite extrahiert und in index.html eingebunden. Konzepte erweitert: Token, TTL, System-Prompt, Vision ergänzt (war 9, jetzt 12). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
310 lines
157 KiB
JavaScript
310 lines
157 KiB
JavaScript
var rl=Object.defineProperty;var Pi=e=>{throw TypeError(e)};var il=(e,t,a)=>t in e?rl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var rn=(e,t,a)=>il(e,typeof t!="symbol"?t+"":t,a),Hr=(e,t,a)=>t.has(e)||Pi("Cannot "+a);var f=(e,t,a)=>(Hr(e,t,"read from private field"),a?a.call(e):t.get(e)),ce=(e,t,a)=>t.has(e)?Pi("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),oe=(e,t,a,r)=>(Hr(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),Ne=(e,t,a)=>(Hr(e,t,"access private method"),a);var bi=Array.isArray,sl=Array.prototype.indexOf,Ar=Array.prototype.includes,qr=Array.from,ll=Object.defineProperty,Ya=Object.getOwnPropertyDescriptor,ol=Object.getOwnPropertyDescriptors,dl=Object.prototype,cl=Array.prototype,os=Object.getPrototypeOf,zi=Object.isExtensible;const ul=()=>{};function vl(e){for(var t=0;t<e.length;t++)e[t]()}function ds(){var e,t,a=new Promise((r,i)=>{e=r,t=i});return{promise:a,resolve:e,reject:t}}function sr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const r of e)if(a.push(r),a.length===t)break;return a}const Vt=2,Ra=4,Br=8,cs=1<<24,kn=16,Sn=32,ea=64,ri=128,hn=512,Dt=1024,Kt=2048,Dn=4096,Jt=8192,gn=16384,Ka=32768,ii=1<<25,qa=65536,Cr=1<<17,fl=1<<18,Ga=1<<19,pl=1<<20,Ln=1<<25,_a=65536,$r=1<<21,Ta=1<<22,Xn=1<<23,Aa=Symbol("$state"),hl=Symbol(""),xr=Symbol("attributes"),si=Symbol("class"),li=Symbol("style"),Wa=Symbol("text"),kr=Symbol("form reset"),Ir=new class extends Error{constructor(){super(...arguments);rn(this,"name","StaleReactionError");rn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var rs;const gl=!!((rs=globalThis.document)!=null&&rs.contentType)&&globalThis.document.contentType.includes("xml");function us(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function ml(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function bl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function _l(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 yl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function xl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function kl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Ml(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Sl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function El(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Tl=1,Al=2,vs=4,Cl=8,$l=16,Ll=1,Pl=2,zt=Symbol("uninitialized"),fs="http://www.w3.org/1999/xhtml",zl="http://www.w3.org/2000/svg",Dl="http://www.w3.org/1998/Math/MathML";function Ol(){console.warn("https://svelte.dev/e/derived_inert")}function Rl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function ql(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function ps(e){return e===this.v}function Bl(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function hs(e){return!Bl(e,this.v)}let Gt=null;function Ba(e){Gt=e}function na(e,t=!1,a){Gt={p:Gt,i:!1,c:null,e:null,s:e,x:null,r:Ee,l:null}}function aa(e){var t=Gt,a=t.e;if(a!==null){t.e=null;for(var r of a)qs(r)}return t.i=!0,Gt=t.p,{}}function gs(){return!0}let sa=[];function ms(){var e=sa;sa=[],vl(e)}function ha(e){if(sa.length===0&&!er){var t=sa;queueMicrotask(()=>{t===sa&&ms()})}sa.push(e)}function Il(){for(;sa.length>0;)ms()}function bs(e){var t=Ee;if(t===null)return we.f|=Xn,e;if((t.f&Ka)===0&&(t.f&Ra)===0)throw e;Zn(e,t)}function Zn(e,t){if(!(t!==null&&(t.f&gn)!==0)){for(;t!==null;){if((t.f&ri)!==0){if((t.f&Ka)===0)throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const Fl=-7169;function At(e,t){e.f=e.f&Fl|t}function _i(e){(e.f&hn)!==0||e.deps===null?At(e,Dt):At(e,Dn)}function _s(e){if(e!==null)for(const t of e)(t.f&Vt)===0||(t.f&_a)===0||(t.f^=_a,_s(t.deps))}function ws(e,t,a){(e.f&Kt)!==0?t.add(e):(e.f&Dn)!==0&&a.add(e),_s(e.deps),At(e,Dt)}function Nl(e){let t=0,a=ya(0),r;return()=>{Ei()&&(n(a),Fr(()=>(t===0&&(r=Va(()=>e(()=>tr(a)))),t+=1,()=>{ha(()=>{t-=1,t===0&&(r==null||r(),r=void 0,tr(a))})})))}}var Kl=qa|Ga;function Gl(e,t,a,r){new Vl(e,t,a,r)}var cn,mi,un,ca,Xt,vn,jt,ln,Bn,ua,Jn,Ca,cr,ur,In,Dr,xt,Ul,Hl,Wl,oi,Mr,Sr,di,ci;class Vl{constructor(t,a,r,i){ce(this,xt);rn(this,"parent");rn(this,"is_pending",!1);rn(this,"transform_error");ce(this,cn);ce(this,mi,null);ce(this,un);ce(this,ca);ce(this,Xt);ce(this,vn,null);ce(this,jt,null);ce(this,ln,null);ce(this,Bn,null);ce(this,ua,0);ce(this,Jn,0);ce(this,Ca,!1);ce(this,cr,new Set);ce(this,ur,new Set);ce(this,In,null);ce(this,Dr,Nl(()=>(oe(this,In,ya(f(this,ua))),()=>{oe(this,In,null)})));var o;oe(this,cn,t),oe(this,un,a),oe(this,ca,d=>{var c=Ee;c.b=this,c.f|=ri,r(d)}),this.parent=Ee.b,this.transform_error=i??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),oe(this,Xt,Ai(()=>{Ne(this,xt,oi).call(this)},Kl))}defer_effect(t){ws(t,f(this,cr),f(this,ur))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!f(this,un).pending}update_pending_count(t,a){Ne(this,xt,di).call(this,t,a),oe(this,ua,f(this,ua)+t),!(!f(this,In)||f(this,Ca))&&(oe(this,Ca,!0),ha(()=>{oe(this,Ca,!1),f(this,In)&&Ia(f(this,In),f(this,ua))}))}get_effect_pending(){return f(this,Dr).call(this),n(f(this,In))}error(t){if(!f(this,un).onerror&&!f(this,un).failed)throw t;j!=null&&j.is_fork?(f(this,vn)&&j.skip_effect(f(this,vn)),f(this,jt)&&j.skip_effect(f(this,jt)),f(this,ln)&&j.skip_effect(f(this,ln)),j.oncommit(()=>{Ne(this,xt,ci).call(this,t)})):Ne(this,xt,ci).call(this,t)}}cn=new WeakMap,mi=new WeakMap,un=new WeakMap,ca=new WeakMap,Xt=new WeakMap,vn=new WeakMap,jt=new WeakMap,ln=new WeakMap,Bn=new WeakMap,ua=new WeakMap,Jn=new WeakMap,Ca=new WeakMap,cr=new WeakMap,ur=new WeakMap,In=new WeakMap,Dr=new WeakMap,xt=new WeakSet,Ul=function(){try{oe(this,vn,fn(()=>f(this,ca).call(this,f(this,cn))))}catch(t){this.error(t)}},Hl=function(t){const a=f(this,un).failed;a&&oe(this,ln,fn(()=>{a(f(this,cn),()=>t,()=>()=>{})}))},Wl=function(){const t=f(this,un).pending;t&&(this.is_pending=!0,oe(this,jt,fn(()=>t(f(this,cn)))),ha(()=>{var a=oe(this,Bn,document.createDocumentFragment()),r=Kn();a.append(r),oe(this,vn,Ne(this,xt,Sr).call(this,()=>fn(()=>f(this,ca).call(this,r)))),f(this,Jn)===0&&(f(this,cn).before(a),oe(this,Bn,null),ma(f(this,jt),()=>{oe(this,jt,null)}),Ne(this,xt,Mr).call(this,j))}))},oi=function(){try{if(this.is_pending=this.has_pending_snippet(),oe(this,Jn,0),oe(this,ua,0),oe(this,vn,fn(()=>{f(this,ca).call(this,f(this,cn))})),f(this,Jn)>0){var t=oe(this,Bn,document.createDocumentFragment());$i(f(this,vn),t);const a=f(this,un).pending;oe(this,jt,fn(()=>a(f(this,cn))))}else Ne(this,xt,Mr).call(this,j)}catch(a){this.error(a)}},Mr=function(t){this.is_pending=!1,t.transfer_effects(f(this,cr),f(this,ur))},Sr=function(t){var a=Ee,r=we,i=Gt;On(f(this,Xt)),mn(f(this,Xt)),Ba(f(this,Xt).ctx);try{return wa.ensure(),t()}catch(o){return bs(o),null}finally{On(a),mn(r),Ba(i)}},di=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&Ne(r=this.parent,xt,di).call(r,t,a);return}oe(this,Jn,f(this,Jn)+t),f(this,Jn)===0&&(Ne(this,xt,Mr).call(this,a),f(this,jt)&&ma(f(this,jt),()=>{oe(this,jt,null)}),f(this,Bn)&&(f(this,cn).before(f(this,Bn)),oe(this,Bn,null)))},ci=function(t){f(this,vn)&&(nn(f(this,vn)),oe(this,vn,null)),f(this,jt)&&(nn(f(this,jt)),oe(this,jt,null)),f(this,ln)&&(nn(f(this,ln)),oe(this,ln,null));var a=f(this,un).onerror;let r=f(this,un).failed;var i=!1,o=!1;const d=()=>{if(i){ql();return}i=!0,o&&El(),f(this,ln)!==null&&ma(f(this,ln),()=>{oe(this,ln,null)}),Ne(this,xt,Sr).call(this,()=>{Ne(this,xt,oi).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(v){Zn(v,f(this,Xt)&&f(this,Xt).parent)}r&&oe(this,ln,Ne(this,xt,Sr).call(this,()=>{try{return fn(()=>{var v=Ee;v.b=this,v.f|=ri,r(f(this,cn),()=>u,()=>d)})}catch(v){return Zn(v,f(this,Xt).parent),null}}))};ha(()=>{var u;try{u=this.transform_error(t)}catch(v){Zn(v,f(this,Xt)&&f(this,Xt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,v=>Zn(v,f(this,Xt)&&f(this,Xt).parent)):c(u)})};function jl(e,t,a,r){const i=wi;var o=e.filter(x=>!x.settled),d=t.map(i);if(a.length===0&&o.length===0){r(d);return}var c=Ee,u=Jl(),v=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(x=>x.promise)):null;function g(x){if((c.f&gn)===0){u();try{r([...d,...x])}catch(A){Zn(A,c)}Lr()}}var E=ys();if(a.length===0){v.then(()=>g([])).finally(E);return}function p(){Promise.all(a.map(x=>Ql(x))).then(g).catch(x=>Zn(x,c)).finally(E)}v?v.then(()=>{u(),p(),Lr()}):p()}function Jl(){var e=Ee,t=we,a=Gt,r=j;return function(o=!0){On(e),mn(t),Ba(a),o&&(e.f&gn)===0&&(r==null||r.activate(),r==null||r.apply())}}function Lr(e=!0){On(null),mn(null),Ba(null),e&&(j==null||j.deactivate())}function ys(){var e=Ee,t=e.b,a=j,r=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,a),a.increment(r,e),()=>{t==null||t.update_pending_count(-1,a),a.decrement(r,e)}}function wi(e){var t=Vt|Kt;return Ee!==null&&(Ee.f|=Ga),{ctx:Gt,deps:null,effects:null,equals:ps,f:t,fn:e,reactions:null,rv:0,v:zt,wv:0,parent:Ee,ac:null}}const ja=Symbol("obsolete");function Ql(e,t,a){let r=Ee;r===null&&ml();var i=void 0,o=ya(zt),d=!we,c=new Set;return po(()=>{var x,A;var u=Ee,v=ds();i=v.promise;try{Promise.resolve(e()).then(v.resolve,L=>{L!==Ir&&v.reject(L)}).finally(Lr)}catch(L){v.reject(L),Lr()}var g=j;if(d){if((u.f&Ka)!==0)var E=ys();if((x=r.b)!=null&&x.is_rendered())(A=g.async_deriveds.get(u))==null||A.reject(ja);else for(const L of c.values())L.reject(ja);c.add(v),g.async_deriveds.set(u,v)}const p=(L,k=void 0)=>{E==null||E(),c.delete(v),k!==ja&&(g.activate(),k?(o.f|=Xn,Ia(o,k)):((o.f&Xn)!==0&&(o.f^=Xn),Ia(o,L)),g.deactivate())};v.promise.then(p,L=>p(null,L||"unknown"))}),Rs(()=>{for(const u of c)u.reject(ja)}),new Promise(u=>{function v(g){function E(){g===i?u(o):v(i)}g.then(E,E)}v(i)})}function O(e){const t=wi(e);return Vs(t),t}function Zl(e){const t=wi(e);return t.equals=hs,t}function Yl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;a<t.length;a+=1)nn(t[a])}}function yi(e){var t,a=Ee,r=e.parent;if(!ta&&r!==null&&e.v!==zt&&(r.f&(gn|Jt))!==0)return Ol(),e.v;On(r);try{e.f&=~_a,Yl(e),t=js(e)}finally{On(a)}return t}function xs(e){var t=yi(e);if(!e.equals(t)&&(e.wv=Hs(),(!(j!=null&&j.is_fork)||e.deps===null)&&(j!==null?(j.capture(e,t,!0),Xa==null||Xa.capture(e,t,!0)):e.v=t,e.deps===null))){At(e,Dt);return}ta||(Nt!==null?(Ei()||j!=null&&j.is_fork)&&Nt.set(e,t):_i(e))}function Xl(e){var t,a;if(e.effects!==null)for(const r of e.effects)(r.teardown||r.ac)&&((t=r.teardown)==null||t.call(r),(a=r.ac)==null||a.abort(Ir),r.fn!==null&&(r.teardown=ul),r.ac=null,lr(r,0),Ci(r))}function ks(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&Fa(t)}let Wr=null,Ma=null,j=null,Xa=null,Nt=null,ui=null,er=!1,jr=!1,Ea=null,Er=null;var Di=0;let eo=1;var $a,Qn,va,La,Pa,za,Fn,Da,en,vr,Nn,wn,Cn,Oa,fa,je,vi,Ja,fi,Ms,Ss,Sa,to,Qa;const Or=class Or{constructor(){ce(this,je);rn(this,"id",eo++);ce(this,$a,!1);rn(this,"linked",!0);ce(this,Qn,null);ce(this,va,null);rn(this,"async_deriveds",new Map);rn(this,"current",new Map);rn(this,"previous",new Map);ce(this,La,new Set);ce(this,Pa,new Set);ce(this,za,0);ce(this,Fn,new Map);ce(this,Da,null);ce(this,en,[]);ce(this,vr,[]);ce(this,Nn,new Set);ce(this,wn,new Set);ce(this,Cn,new Map);ce(this,Oa,new Set);rn(this,"is_fork",!1);ce(this,fa,!1);Ma===null?Wr=Ma=this:(oe(Ma,va,this),oe(this,Qn,Ma)),Ma=this}skip_effect(t){f(this,Cn).has(t)||f(this,Cn).set(t,{d:[],m:[]}),f(this,Oa).delete(t)}unskip_effect(t,a=r=>this.schedule(r)){var r=f(this,Cn).get(t);if(r){f(this,Cn).delete(t);for(var i of r.d)At(i,Kt),a(i);for(i of r.m)At(i,Dn),a(i)}f(this,Oa).add(t)}capture(t,a,r=!1){t.v!==zt&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Xn)===0&&(this.current.set(t,[a,r]),Nt==null||Nt.set(t,a)),this.is_fork||(t.v=a)}activate(){j=this}deactivate(){j=null,Nt=null}flush(){try{jr=!0,j=this,Ne(this,je,Ja).call(this)}finally{Di=0,ui=null,Ea=null,Er=null,jr=!1,j=null,Nt=null,ga.clear()}}discard(){var t;for(const a of f(this,Pa))a(this);f(this,Pa).clear();for(const a of this.async_deriveds.values())a.reject(ja);Ne(this,je,Qa).call(this),(t=f(this,Da))==null||t.resolve()}register_created_effect(t){f(this,vr).push(t)}increment(t,a){if(oe(this,za,f(this,za)+1),t){let r=f(this,Fn).get(a)??0;f(this,Fn).set(a,r+1)}}decrement(t,a){if(oe(this,za,f(this,za)-1),t){let r=f(this,Fn).get(a)??0;r===1?f(this,Fn).delete(a):f(this,Fn).set(a,r-1)}f(this,fa)||(oe(this,fa,!0),ha(()=>{oe(this,fa,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const r of t)f(this,Nn).add(r);for(const r of a)f(this,wn).add(r);t.clear(),a.clear()}oncommit(t){f(this,La).add(t)}ondiscard(t){f(this,Pa).add(t)}settled(){return(f(this,Da)??oe(this,Da,ds())).promise}static ensure(){if(j===null){const t=j=new Or;!jr&&!er&&ha(()=>{f(t,$a)||t.flush()})}return j}apply(){{Nt=null;return}}schedule(t){var i;if(ui=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ra|Br|cs))!==0&&(t.f&Ka)===0){t.b.defer_effect(t);return}for(var a=t;a.parent!==null;){a=a.parent;var r=a.f;if(Ea!==null&&a===Ee&&(we===null||(we.f&Vt)===0))return;if((r&(ea|Sn))!==0){if((r&Dt)===0)return;a.f^=Dt}}f(this,en).push(a)}};$a=new WeakMap,Qn=new WeakMap,va=new WeakMap,La=new WeakMap,Pa=new WeakMap,za=new WeakMap,Fn=new WeakMap,Da=new WeakMap,en=new WeakMap,vr=new WeakMap,Nn=new WeakMap,wn=new WeakMap,Cn=new WeakMap,Oa=new WeakMap,fa=new WeakMap,je=new WeakSet,vi=function(){if(this.is_fork)return!0;for(const r of f(this,Fn).keys()){for(var t=r,a=!1;t.parent!==null;){if(f(this,Cn).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},Ja=function(){var u,v,g,E;oe(this,$a,!0),Di++>1e3&&(Ne(this,je,Qa).call(this),ao());for(const p of f(this,Nn))f(this,wn).delete(p),At(p,Kt),this.schedule(p);for(const p of f(this,wn))At(p,Dn),this.schedule(p);const t=f(this,en);oe(this,en,[]),this.apply();var a=Ea=[],r=[],i=Er=[];for(const p of t)try{Ne(this,je,fi).call(this,p,a,r)}catch(x){throw As(p),Ne(this,je,vi).call(this)||this.discard(),x}if(j=null,i.length>0){var o=Or.ensure();for(const p of i)o.schedule(p)}if(Ea=null,Er=null,Ne(this,je,vi).call(this)){Ne(this,je,Sa).call(this,r),Ne(this,je,Sa).call(this,a);for(const[p,x]of f(this,Cn))Ts(p,x);i.length>0&&Ne(u=j,je,Ja).call(u);return}const d=Ne(this,je,Ms).call(this);if(d){Ne(this,je,Sa).call(this,r),Ne(this,je,Sa).call(this,a),Ne(v=d,je,Ss).call(v,this);return}f(this,Nn).clear(),f(this,wn).clear();for(const p of f(this,La))p(this);f(this,La).clear(),Xa=this,Oi(r),Oi(a),Xa=null,(g=f(this,Da))==null||g.resolve();var c=j;if(f(this,za)===0&&(f(this,en).length===0||c!==null)&&Ne(this,je,Qa).call(this),f(this,en).length>0)if(c!==null){const p=c;f(p,en).push(...f(this,en).filter(x=>!f(p,en).includes(x)))}else c=this;c!==null&&Ne(E=c,je,Ja).call(E)},fi=function(t,a,r){t.f^=Dt;for(var i=t.first;i!==null;){var o=i.f,d=(o&(Sn|ea))!==0,c=d&&(o&Dt)!==0,u=c||(o&Jt)!==0||f(this,Cn).has(i);if(!u&&i.fn!==null){d?i.f^=Dt:(o&Ra)!==0?a.push(i):gr(i)&&((o&kn)!==0&&f(this,wn).add(i),Fa(i));var v=i.first;if(v!==null){i=v;continue}}for(;i!==null;){var g=i.next;if(g!==null){i=g;break}i=i.parent}}},Ms=function(){for(var t=f(this,Qn);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=f(t,Qn)}return null},Ss=function(t){var r;for(const[i,o]of t.current)!this.previous.has(i)&&t.previous.has(i)&&this.previous.set(i,t.previous.get(i)),this.current.set(i,o);for(const[i,o]of t.async_deriveds){const d=this.async_deriveds.get(i);d&&o.promise.then(d.resolve).catch(d.reject)}t.async_deriveds.clear(),this.transfer_effects(f(t,Nn),f(t,wn));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&Vt)!==0)a(u);else{var c=u;d&(Ta|kn)&&!this.async_deriveds.has(c)&&(f(this,wn).delete(c),At(c,Kt),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),Ne(r=t,je,Qa).call(r),j=this,Ne(this,je,Ja).call(this)},Sa=function(t){for(var a=0;a<t.length;a+=1)ws(t[a],f(this,Nn),f(this,wn))},to=function(){var E;for(let p=Wr;p!==null;p=f(p,va)){var t=p.id<this.id,a=[];for(const[x,[A,L]]of this.current){if(p.current.has(x)){var r=p.current.get(x)[0];if(t&&A!==r)p.current.set(x,[A,L]);else continue}a.push(x)}if(t)for(const[x,A]of this.async_deriveds){const L=p.async_deriveds.get(x);L&&A.promise.then(L.resolve).catch(L.reject)}var i=[...p.current.keys()].filter(x=>!p.current.get(x)[1]);if(!(!f(p,$a)||i.length===0)){var o=i.filter(x=>!this.current.has(x));if(o.length===0)t&&p.discard();else if(a.length>0){if(t)for(const x of f(this,Oa))p.unskip_effect(x,A=>{var L;(A.f&(kn|Ta))!==0?p.schedule(A):Ne(L=p,je,Sa).call(L,[A])});p.activate();var d=new Set,c=new Map;for(var u of a)Es(u,o,d,c);c=new Map;var v=[...p.current].filter(([x,A])=>{const L=this.current.get(x);return L?L[0]!==A[0]||L[1]!==A[1]:!0}).map(([x])=>x);if(v.length>0)for(const x of f(this,vr))(x.f&(gn|Jt|Cr))===0&&xi(x,v,c)&&((x.f&(Ta|kn))!==0?(At(x,Kt),p.schedule(x)):f(p,Nn).add(x));if(f(p,en).length>0&&!f(p,fa)){p.apply();for(var g of f(p,en))Ne(E=p,je,fi).call(E,g,[],[]);oe(p,en,[])}p.deactivate()}}}},Qa=function(){if(this.linked){var t=f(this,Qn),a=f(this,va);t===null?Wr=a:oe(t,va,a),a===null?Ma=t:oe(a,Qn,t),this.linked=!1}};let wa=Or;function no(e){var t=er;er=!0;try{for(var a;;){if(Il(),j===null)return a;j.flush()}}finally{er=t}}function ao(){try{xl()}catch(e){Zn(e,ui)}}let _n=null;function Oi(e){var t=e.length;if(t!==0){for(var a=0;a<t;){var r=e[a++];if((r.f&(gn|Jt))===0&&gr(r)&&(_n=new Set,Fa(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&Ns(r),(_n==null?void 0:_n.size)>0)){ga.clear();for(const i of _n){if((i.f&(gn|Jt))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)_n.has(d)&&(_n.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(gn|Jt))===0&&Fa(u)}}_n.clear()}}_n=null}}function Es(e,t,a,r){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const i of e.reactions){const o=i.f;(o&Vt)!==0?Es(i,t,a,r):(o&(Ta|kn))!==0&&(o&Kt)===0&&xi(i,t,r)&&(At(i,Kt),ki(i))}}function xi(e,t,a){const r=a.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const i of e.deps){if(Ar.call(t,i))return!0;if((i.f&Vt)!==0&&xi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function ki(e){j.schedule(e)}function Ts(e,t){if(!((e.f&Sn)!==0&&(e.f&Dt)!==0)){(e.f&Kt)!==0?t.d.push(e):(e.f&Dn)!==0&&t.m.push(e),At(e,Dt);for(var a=e.first;a!==null;)Ts(a,t),a=a.next}}function As(e){At(e,Dt);for(var t=e.first;t!==null;)As(t),t=t.next}let Pr=new Set;const ga=new Map;let Cs=!1;function ya(e,t){var a={f:0,v:e,reactions:null,equals:ps,rv:0,wv:0};return a}function R(e,t){const a=ya(e);return Vs(a),a}function ro(e,t=!1,a=!0){const r=ya(e);return t||(r.equals=hs),r}function h(e,t,a=!1){we!==null&&(!Mn||(we.f&Cr)!==0)&&gs()&&(we.f&(Vt|kn|Ta|Cr))!==0&&(Pn===null||!Pn.has(e))&&Sl();let r=a?Ut(t):t;return Ia(e,r,Er)}function Ia(e,t,a=null){if(!e.equals(t)){ga.set(e,ta?t:e.v);var r=wa.ensure();if(r.capture(e,t),(e.f&Vt)!==0){const i=e;(e.f&Kt)!==0&&yi(i),Nt===null&&_i(i)}e.wv=Hs(),$s(e,Kt,a),Ee!==null&&(Ee.f&Dt)!==0&&(Ee.f&(Sn|ea))===0&&(dn===null?go([e]):dn.push(e)),!r.is_fork&&Pr.size>0&&!Cs&&io()}return t}function io(){Cs=!1;for(const e of Pr){(e.f&Dt)!==0&&At(e,Dn);let t;try{t=gr(e)}catch{t=!0}t&&Fa(e)}Pr.clear()}function tr(e){h(e,e.v+1)}function $s(e,t,a){var r=e.reactions;if(r!==null)for(var i=r.length,o=0;o<i;o++){var d=r[o],c=d.f,u=(c&Kt)===0;if(u&&At(d,t),(c&Cr)!==0)Pr.add(d);else if((c&Vt)!==0){var v=d;Nt==null||Nt.delete(v),(c&_a)===0&&(c&hn&&(Ee===null||(Ee.f&$r)===0)&&(d.f|=_a),$s(v,Dn,a))}else if(u){var g=d;(c&kn)!==0&&_n!==null&&_n.add(g),a!==null?a.push(g):ki(g)}}}function Ut(e){if(typeof e!="object"||e===null||Aa in e)return e;const t=os(e);if(t!==dl&&t!==cl)return e;var a=new Map,r=bi(e),i=R(0),o=ba,d=c=>{if(ba===o)return c();var u=we,v=ba;mn(null),Fi(o);var g=c();return mn(u),Fi(v),g};return r&&a.set("length",R(e.length)),new Proxy(e,{defineProperty(c,u,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&kl();var g=a.get(u);return g===void 0?d(()=>{var E=R(v.value);return a.set(u,E),E}):h(g,v.value,!0),!0},deleteProperty(c,u){var v=a.get(u);if(v===void 0){if(u in c){const g=d(()=>R(zt));a.set(u,g),tr(i)}}else h(v,zt),tr(i);return!0},get(c,u,v){var x;if(u===Aa)return e;var g=a.get(u),E=u in c;if(g===void 0&&(!E||(x=Ya(c,u))!=null&&x.writable)&&(g=d(()=>{var A=Ut(E?c[u]:zt),L=R(A);return L}),a.set(u,g)),g!==void 0){var p=n(g);return p===zt?void 0:p}return Reflect.get(c,u,v)},getOwnPropertyDescriptor(c,u){var v=Reflect.getOwnPropertyDescriptor(c,u);if(v&&"value"in v){var g=a.get(u);g&&(v.value=n(g))}else if(v===void 0){var E=a.get(u),p=E==null?void 0:E.v;if(E!==void 0&&p!==zt)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return v},has(c,u){var p;if(u===Aa)return!0;var v=a.get(u),g=v!==void 0&&v.v!==zt||Reflect.has(c,u);if(v!==void 0||Ee!==null&&(!g||(p=Ya(c,u))!=null&&p.writable)){v===void 0&&(v=d(()=>{var x=g?Ut(c[u]):zt,A=R(x);return A}),a.set(u,v));var E=n(v);if(E===zt)return!1}return g},set(c,u,v,g){var te;var E=a.get(u),p=u in c;if(r&&u==="length")for(var x=v;x<E.v;x+=1){var A=a.get(x+"");A!==void 0?h(A,zt):x in c&&(A=d(()=>R(zt)),a.set(x+"",A))}if(E===void 0)(!p||(te=Ya(c,u))!=null&&te.writable)&&(E=d(()=>R(void 0)),h(E,Ut(v)),a.set(u,E));else{p=E.v!==zt;var L=d(()=>Ut(v));h(E,L)}var k=Reflect.getOwnPropertyDescriptor(c,u);if(k!=null&&k.set&&k.set.call(g,v),!p){if(r&&typeof u=="string"){var P=a.get("length"),ye=Number(u);Number.isInteger(ye)&&ye>=P.v&&h(P,ye+1)}tr(i)}return!0},ownKeys(c){n(i);var u=Reflect.ownKeys(c).filter(E=>{var p=a.get(E);return p===void 0||p.v!==zt});for(var[v,g]of a)g.v!==zt&&!(v in c)&&u.push(v);return u},setPrototypeOf(){Ml()}})}function Ri(e){try{if(e!==null&&typeof e=="object"&&Aa in e)return e[Aa]}catch{}return e}function so(e,t){return Object.is(Ri(e),Ri(t))}var qi,Ls,Ps,zs;function lo(){if(qi===void 0){qi=window,Ls=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;Ps=Ya(t,"firstChild").get,zs=Ya(t,"nextSibling").get,zi(e)&&(e[si]=void 0,e[xr]=null,e[li]=void 0,e.__e=void 0),zi(a)&&(a[Wa]=void 0)}}function Kn(e=""){return document.createTextNode(e)}function Yn(e){return Ps.call(e)}function hr(e){return zs.call(e)}function l(e,t){return Yn(e)}function ct(e,t=!1){{var a=Yn(e);return a instanceof Comment&&a.data===""?hr(a):a}}function s(e,t=1,a=!1){let r=e;for(;t--;)r=hr(r);return r}function oo(e){e.textContent=""}function Ds(){return!1}function Os(e,t,a){return t==null||t===fs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Bi=!1;function co(){Bi||(Bi=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[kr])==null||t.call(a)})},{capture:!0}))}function Mi(e){var t=we,a=Ee;mn(null),On(null);try{return e()}finally{mn(t),On(a)}}function Si(e,t,a,r=a){e.addEventListener(t,()=>Mi(a));const i=e[kr];i?e[kr]=()=>{i(),r(!0)}:e[kr]=()=>r(!0),co()}function uo(e){Ee===null&&(we===null&&yl(),wl()),ta&&_l()}function vo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function Gn(e,t){var a=Ee;a!==null&&(a.f&Jt)!==0&&(e|=Jt);var r={ctx:Gt,deps:null,nodes:null,f:e|Kt|hn,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};j==null||j.register_created_effect(r);var i=r;if((e&Ra)!==0)Ea!==null?Ea.push(r):wa.ensure().schedule(r);else if(t!==null){try{Fa(r)}catch(d){throw nn(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ga)===0&&(i=i.first,(e&kn)!==0&&(e&qa)!==0&&i!==null&&(i.f|=qa))}if(i!==null&&(i.parent=a,a!==null&&vo(i,a),we!==null&&(we.f&Vt)!==0&&(e&ea)===0)){var o=we;(o.effects??(o.effects=[])).push(i)}return r}function Ei(){return we!==null&&!Mn}function Rs(e){const t=Gn(Br,null);return At(t,Dt),t.teardown=e,t}function Ti(e){uo();var t=Ee.f,a=!we&&(t&Sn)!==0&&Gt!==null&&!Gt.i;if(a){var r=Gt;(r.e??(r.e=[])).push(e)}else return qs(e)}function qs(e){return Gn(Ra|pl,e)}function fo(e){wa.ensure();const t=Gn(ea|Ga,e);return(a={})=>new Promise(r=>{a.outro?ma(t,()=>{nn(t),r(void 0)}):(nn(t),r(void 0))})}function Bs(e){return Gn(Ra,e)}function po(e){return Gn(Ta|Ga,e)}function Fr(e,t=0){return Gn(Br|t,e)}function z(e,t=[],a=[],r=[]){jl(r,t,a,i=>{Gn(Br,()=>{e(...i.map(n))})})}function Ai(e,t=0){var a=Gn(kn|t,e);return a}function fn(e){return Gn(Sn|Ga,e)}function Is(e){var t=e.teardown;if(t!==null){const a=ta,r=we;Ii(!0),mn(null);try{t.call(null)}finally{Ii(a),mn(r)}}}function Ci(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&Mi(()=>{i.abort(Ir)});var r=a.next;(a.f&ea)!==0?a.parent=null:nn(a,t),a=r}}function ho(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&Sn)===0&&nn(t),t=a}}function nn(e,t=!0){var a=!1;(t||(e.f&fl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Fs(e.nodes.start,e.nodes.end),a=!0),e.f|=ii,Ci(e,t&&!a),lr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();Is(e),e.f^=ii,e.f|=gn;var i=e.parent;i!==null&&i.first!==null&&Ns(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Fs(e,t){for(;e!==null;){var a=e===t?null:hr(e);e.remove(),e=a}}function Ns(e){var t=e.parent,a=e.prev,r=e.next;a!==null&&(a.next=r),r!==null&&(r.prev=a),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=a))}function ma(e,t,a=!0){var r=[];Ks(e,r,!0);var i=()=>{a&&nn(e),t&&t()},o=r.length;if(o>0){var d=()=>--o||i();for(var c of r)c.out(d)}else i()}function Ks(e,t,a){if((e.f&Jt)===0){e.f^=Jt;var r=e.nodes&&e.nodes.t;if(r!==null)for(const c of r)(c.is_global||a)&&t.push(c);for(var i=e.first;i!==null;){var o=i.next;if((i.f&ea)===0){var d=(i.f&qa)!==0||(i.f&Sn)!==0&&(e.f&kn)!==0;Ks(i,t,d?a:!1)}i=o}}}function zr(e){Gs(e,!0)}function Gs(e,t){if((e.f&Jt)!==0){e.f^=Jt,(e.f&Dt)===0&&(At(e,Kt),wa.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&qa)!==0||(a.f&Sn)!==0;Gs(a,i?t:!1),a=r}var o=e.nodes&&e.nodes.t;if(o!==null)for(const d of o)(d.is_global||t)&&d.in()}}function $i(e,t){if(e.nodes)for(var a=e.nodes.start,r=e.nodes.end;a!==null;){var i=a===r?null:hr(a);t.append(a),a=i}}let Tr=!1,ta=!1;function Ii(e){ta=e}let we=null,Mn=!1;function mn(e){we=e}let Ee=null;function On(e){Ee=e}let Pn=null;function Vs(e){we!==null&&(Pn??(Pn=new Set)).add(e)}let tn=null,sn=0,dn=null;function go(e){dn=e}let Us=1,la=0,ba=la;function Fi(e){ba=e}function Hs(){return++Us}function gr(e){var t=e.f;if((t&Kt)!==0)return!0;if(t&Vt&&(e.f&=~_a),(t&Dn)!==0){for(var a=e.deps,r=a.length,i=0;i<r;i++){var o=a[i];if(gr(o)&&xs(o),o.wv>e.wv)return!0}(t&hn)!==0&&Nt===null&&At(e,Dt)}return!1}function Ws(e,t,a=!0){var r=e.reactions;if(r!==null&&!(Pn!==null&&Pn.has(e)))for(var i=0;i<r.length;i++){var o=r[i];(o.f&Vt)!==0?Ws(o,t,!1):t===o&&(a?At(o,Kt):(o.f&Dt)!==0&&At(o,Dn),ki(o))}}function js(e){var L;var t=tn,a=sn,r=dn,i=we,o=Pn,d=Gt,c=Mn,u=ba,v=e.f;tn=null,sn=0,dn=null,we=(v&(Sn|ea))===0?e:null,Pn=null,Ba(e.ctx),Mn=!1,ba=++la,e.ac!==null&&(Mi(()=>{e.ac.abort(Ir)}),e.ac=null);try{e.f|=$r;var g=e.fn,E=g();e.f|=Ka;var p=e.deps,x=j==null?void 0:j.is_fork;if(tn!==null){var A;if(x||lr(e,sn),p!==null&&sn>0)for(p.length=sn+tn.length,A=0;A<tn.length;A++)p[sn+A]=tn[A];else e.deps=p=tn;if(Ei()&&(e.f&hn)!==0)for(A=sn;A<p.length;A++)((L=p[A]).reactions??(L.reactions=[])).push(e)}else!x&&p!==null&&sn<p.length&&(lr(e,sn),p.length=sn);if(gs()&&dn!==null&&!Mn&&p!==null&&(e.f&(Vt|Dn|Kt))===0)for(A=0;A<dn.length;A++)Ws(dn[A],e);if(i!==null&&i!==e){if(la++,i.deps!==null)for(let k=0;k<a;k+=1)i.deps[k].rv=la;if(t!==null)for(const k of t)k.rv=la;dn!==null&&(r===null?r=dn:r.push(...dn))}return(e.f&Xn)!==0&&(e.f^=Xn),E}catch(k){return bs(k)}finally{e.f^=$r,tn=t,sn=a,dn=r,we=i,Pn=o,Ba(d),Mn=c,ba=u}}function mo(e,t){let a=t.reactions;if(a!==null){var r=sl.call(a,e);if(r!==-1){var i=a.length-1;i===0?a=t.reactions=null:(a[r]=a[i],a.pop())}}if(a===null&&(t.f&Vt)!==0&&(tn===null||!Ar.call(tn,t))){var o=t;(o.f&hn)!==0&&(o.f^=hn,o.f&=~_a),o.v!==zt&&_i(o),Xl(o),lr(o,0)}}function lr(e,t){var a=e.deps;if(a!==null)for(var r=t;r<a.length;r++)mo(e,a[r])}function Fa(e){var t=e.f;if((t&gn)===0){At(e,Dt);var a=Ee,r=Tr;Ee=e,Tr=!0;try{(t&(kn|cs))!==0?ho(e):Ci(e),Is(e);var i=js(e);e.teardown=typeof i=="function"?i:null,e.wv=Us;var o}finally{Tr=r,Ee=a}}}async function bo(){await Promise.resolve(),no()}function n(e){var t=e.f,a=(t&Vt)!==0;if(we!==null&&!Mn){var r=Ee!==null&&(Ee.f&gn)!==0;if(!r&&(Pn===null||!Pn.has(e))){var i=we.deps;if((we.f&$r)!==0)e.rv<la&&(e.rv=la,tn===null&&i!==null&&i[sn]===e?sn++:tn===null?tn=[e]:tn.push(e));else{we.deps??(we.deps=[]),Ar.call(we.deps,e)||we.deps.push(e);var o=e.reactions;o===null?e.reactions=[we]:Ar.call(o,we)||o.push(we)}}}if(ta&&ga.has(e))return ga.get(e);if(a){var d=e;if(ta){var c=d.v;return((d.f&Dt)===0&&d.reactions!==null||Qs(d))&&(c=yi(d)),ga.set(d,c),c}var u=(d.f&hn)===0&&!Mn&&we!==null&&(Tr||(we.f&hn)!==0),v=(d.f&Ka)===0;gr(d)&&(u&&(d.f|=hn),xs(d)),u&&!v&&(ks(d),Js(d))}if(Nt!=null&&Nt.has(e))return Nt.get(e);if((e.f&Xn)!==0)throw e.v;return e.v}function Js(e){if(e.f|=hn,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),(t.f&Vt)!==0&&(t.f&hn)===0&&(ks(t),Js(t))}function Qs(e){if(e.v===zt)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(ga.has(t)||(t.f&Vt)!==0&&Qs(t))return!0;return!1}function Va(e){var t=Mn;try{return Mn=!0,e()}finally{Mn=t}}const _o=["touchstart","touchmove"];function wo(e){return _o.includes(e)}const oa=Symbol("events"),Zs=new Set,pi=new Set;function C(e,t,a){(t[oa]??(t[oa]={}))[e]=a}function xa(e){for(var t=0;t<e.length;t++)Zs.add(e[t]);for(var a of pi)a(e)}let Ni=null;function Ki(e){var L,k;var t=this,a=t.ownerDocument,r=e.type,i=((L=e.composedPath)==null?void 0:L.call(e))||[],o=i[0]||e.target;Ni=e;var d=0,c=Ni===e&&e[oa];if(c){var u=i.indexOf(c);if(u!==-1&&(t===document||t===window)){e[oa]=t;return}var v=i.indexOf(t);if(v===-1)return;u<=v&&(d=u)}if(o=i[d]||e.target,o!==t){ll(e,"currentTarget",{configurable:!0,get(){return o||a}});var g=we,E=Ee;mn(null),On(null);try{for(var p,x=[];o!==null&&o!==t;){try{var A=(k=o[oa])==null?void 0:k[r];A!=null&&(!o.disabled||e.target===o)&&A.call(o,e)}catch(P){p?x.push(P):p=P}if(e.cancelBubble)break;d++,o=d<i.length?i[d]:null}if(p){for(let P of x)queueMicrotask(()=>{throw P});throw p}}finally{e[oa]=t,delete e.currentTarget,mn(g),On(E)}}}var is;const Jr=((is=globalThis==null?void 0:globalThis.window)==null?void 0:is.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function yo(e){return(Jr==null?void 0:Jr.createHTML(e))??e}function xo(e){var t=Os("template");return t.innerHTML=yo(e.replaceAll("<!>","<!---->")),t.content}function Na(e,t){var a=Ee;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function y(e,t){var a=(t&Ll)!==0,r=(t&Pl)!==0,i,o=!e.startsWith("<!>");return()=>{i===void 0&&(i=xo(o?e:"<!>"+e),a||(i=Yn(i)));var d=r||Ls?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=Yn(d),u=d.lastChild;Na(c,u)}else Na(d,d);return d}}function nr(e=""){{var t=Kn(e+"");return Na(t,t),t}}function or(){var e=document.createDocumentFragment(),t=document.createComment(""),a=Kn();return e.append(t,a),Na(t,a),e}function m(e,t){e!==null&&e.before(t)}function b(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Wa]??(e[Wa]=e.nodeValue))&&(e[Wa]=a,e.nodeValue=`${a}`)}function ko(e,t){return Mo(e,t)}const wr=new Map;function Mo(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){lo();var u=void 0,v=fo(()=>{var g=a??t.appendChild(Kn());Gl(g,{pending:()=>{}},x=>{na({});var A=Gt;o&&(A.c=o),i&&(r.$$events=i),u=e(x,r)||{},aa()},c);var E=new Set,p=x=>{for(var A=0;A<x.length;A++){var L=x[A];if(!E.has(L)){E.add(L);var k=wo(L);for(const te of[t,document]){var P=wr.get(te);P===void 0&&(P=new Map,wr.set(te,P));var ye=P.get(L);ye===void 0?(te.addEventListener(L,Ki,{passive:k}),P.set(L,1)):P.set(L,ye+1)}}}};return p(qr(Zs)),pi.add(p),()=>{var k;for(var x of E)for(const P of[t,document]){var A=wr.get(P),L=A.get(x);--L==0?(P.removeEventListener(x,Ki),A.delete(x),A.size===0&&wr.delete(P)):A.set(x,L)}pi.delete(p),g!==a&&((k=g.parentNode)==null||k.removeChild(g))}});return So.set(u,v),u}let So=new WeakMap;var yn,$n,on,pa,fr,pr,Rr;class Eo{constructor(t,a=!0){rn(this,"anchor");ce(this,yn,new Map);ce(this,$n,new Map);ce(this,on,new Map);ce(this,pa,new Set);ce(this,fr,!0);ce(this,pr,t=>{if(f(this,yn).has(t)){var a=f(this,yn).get(t),r=f(this,$n).get(a);if(r)zr(r),f(this,pa).delete(a);else{var i=f(this,on).get(a);i&&(zr(i.effect),f(this,$n).set(a,i.effect),f(this,on).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of f(this,yn)){if(f(this,yn).delete(o),o===t)break;const c=f(this,on).get(d);c&&(nn(c.effect),f(this,on).delete(d))}for(const[o,d]of f(this,$n)){if(o===a||f(this,pa).has(o))continue;const c=()=>{if(Array.from(f(this,yn).values()).includes(o)){var v=document.createDocumentFragment();$i(d,v),v.append(Kn()),f(this,on).set(o,{effect:d,fragment:v})}else nn(d);f(this,pa).delete(o),f(this,$n).delete(o)};f(this,fr)||!r?(f(this,pa).add(o),ma(d,c,!1)):c()}}});ce(this,Rr,t=>{f(this,yn).delete(t);const a=Array.from(f(this,yn).values());for(const[r,i]of f(this,on))a.includes(r)||(nn(i.effect),f(this,on).delete(r))});this.anchor=t,oe(this,fr,a)}ensure(t,a){var r=j,i=Ds();if(a&&!f(this,$n).has(t)&&!f(this,on).has(t))if(i){var o=document.createDocumentFragment(),d=Kn();o.append(d),f(this,on).set(t,{effect:fn(()=>a(d)),fragment:o})}else f(this,$n).set(t,fn(()=>a(this.anchor)));if(f(this,yn).set(r,t),i){for(const[c,u]of f(this,$n))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of f(this,on))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(f(this,pr)),r.ondiscard(f(this,Rr))}else f(this,pr).call(this,r)}}yn=new WeakMap,$n=new WeakMap,on=new WeakMap,pa=new WeakMap,fr=new WeakMap,pr=new WeakMap,Rr=new WeakMap;function I(e,t,a=!1){var r=new Eo(e),i=a?qa:0;function o(d,c){r.ensure(d,c)}Ai(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function ot(e,t){return t}function To(e,t,a){for(var r=[],i=t.length,o,d=t.length,c=0;c<i;c++){let E=t[c];ma(E,()=>{if(o){if(o.pending.delete(E),o.done.add(E),o.pending.size===0){var p=e.outrogroups;hi(e,qr(o.done)),p.delete(o),p.size===0&&(e.outrogroups=null)}}else d-=1},!1)}if(d===0){var u=r.length===0&&a!==null;if(u){var v=a,g=v.parentNode;oo(g),g.append(v),e.items.clear()}hi(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function hi(e,t,a=!0){var r;if(e.pending.size>0){r=new Set;for(const d of e.pending.values())for(const c of d)r.add(e.items.get(c).e)}for(var i=0;i<t.length;i++){var o=t[i];if(r!=null&&r.has(o)){o.f|=Ln;const d=document.createDocumentFragment();$i(o,d)}else nn(t[i],a)}}var Gi;function dt(e,t,a,r,i,o=null){var d=e,c=new Map,u=(t&vs)!==0;if(u){var v=e;d=v.appendChild(Kn())}var g=null,E=Zl(()=>{var te=a();return bi(te)?te:te==null?[]:qr(te)}),p,x=new Map,A=!0;function L(te){(ye.effect.f&gn)===0&&(ye.pending.delete(te),ye.fallback=g,Ao(ye,p,d,t,r),g!==null&&(p.length===0?(g.f&Ln)===0?zr(g):(g.f^=Ln,Za(g,null,d)):ma(g,()=>{g=null})))}function k(te){ye.pending.delete(te)}var P=Ai(()=>{p=n(E);for(var te=p.length,ue=new Set,Te=j,K=Ds(),V=0;V<te;V+=1){var fe=p[V],he=r(fe,V),Pe=A?null:c.get(he);Pe?(Pe.v&&Ia(Pe.v,fe),Pe.i&&Ia(Pe.i,V),K&&Te.unskip_effect(Pe.e)):(Pe=Co(c,A?d:Gi??(Gi=Kn()),fe,he,V,i,t,a),A||(Pe.e.f|=Ln),c.set(he,Pe)),ue.add(he)}if(te===0&&o&&!g&&(A?g=fn(()=>o(d)):(g=fn(()=>o(Gi??(Gi=Kn()))),g.f|=Ln)),te>ue.size&&bl(),!A)if(x.set(Te,ue),K){for(const[Ve,mt]of c)ue.has(Ve)||Te.skip_effect(mt.e);Te.oncommit(L),Te.ondiscard(k)}else L(Te);n(E)}),ye={effect:P,items:c,pending:x,outrogroups:null,fallback:g};A=!1}function Ha(e){for(;e!==null&&(e.f&Sn)===0;)e=e.next;return e}function Ao(e,t,a,r,i){var Pe,Ve,mt,T,W,re,Ue,Q,ze;var o=(r&Cl)!==0,d=t.length,c=e.items,u=Ha(e.effect.first),v,g=null,E,p=[],x=[],A,L,k,P;if(o)for(P=0;P<d;P+=1)A=t[P],L=i(A,P),k=c.get(L).e,(k.f&Ln)===0&&((Ve=(Pe=k.nodes)==null?void 0:Pe.a)==null||Ve.measure(),(E??(E=new Set)).add(k));for(P=0;P<d;P+=1){if(A=t[P],L=i(A,P),k=c.get(L).e,e.outrogroups!==null)for(const Y of e.outrogroups)Y.pending.delete(k),Y.done.delete(k);if((k.f&Jt)!==0&&(zr(k),o&&((T=(mt=k.nodes)==null?void 0:mt.a)==null||T.unfix(),(E??(E=new Set)).delete(k))),(k.f&Ln)!==0)if(k.f^=Ln,k===u)Za(k,null,a);else{var ye=g?g.next:u;k===e.effect.last&&(e.effect.last=k.prev),k.prev&&(k.prev.next=k.next),k.next&&(k.next.prev=k.prev),Wn(e,g,k),Wn(e,k,ye),Za(k,ye,a),g=k,p=[],x=[],u=Ha(g.next);continue}if(k!==u){if(v!==void 0&&v.has(k)){if(p.length<x.length){var te=x[0],ue;g=te.prev;var Te=p[0],K=p[p.length-1];for(ue=0;ue<p.length;ue+=1)Za(p[ue],te,a);for(ue=0;ue<x.length;ue+=1)v.delete(x[ue]);Wn(e,Te.prev,K.next),Wn(e,g,Te),Wn(e,K,te),u=te,g=K,P-=1,p=[],x=[]}else v.delete(k),Za(k,u,a),Wn(e,k.prev,k.next),Wn(e,k,g===null?e.effect.first:g.next),Wn(e,g,k),g=k;continue}for(p=[],x=[];u!==null&&u!==k;)(v??(v=new Set)).add(u),x.push(u),u=Ha(u.next);if(u===null)continue}(k.f&Ln)===0&&p.push(k),g=k,u=Ha(k.next)}if(e.outrogroups!==null){for(const Y of e.outrogroups)Y.pending.size===0&&(hi(e,qr(Y.done)),(W=e.outrogroups)==null||W.delete(Y));e.outrogroups.size===0&&(e.outrogroups=null)}if(u!==null||v!==void 0){var V=[];if(v!==void 0)for(k of v)(k.f&Jt)===0&&V.push(k);for(;u!==null;)(u.f&Jt)===0&&u!==e.fallback&&V.push(u),u=Ha(u.next);var fe=V.length;if(fe>0){var he=(r&vs)!==0&&d===0?a:null;if(o){for(P=0;P<fe;P+=1)(Ue=(re=V[P].nodes)==null?void 0:re.a)==null||Ue.measure();for(P=0;P<fe;P+=1)(ze=(Q=V[P].nodes)==null?void 0:Q.a)==null||ze.fix()}To(e,V,he)}}o&&ha(()=>{var Y,rt;if(E!==void 0)for(k of E)(rt=(Y=k.nodes)==null?void 0:Y.a)==null||rt.apply()})}function Co(e,t,a,r,i,o,d,c){var u=(d&Tl)!==0?(d&$l)===0?ro(a,!1,!1):ya(a):null,v=(d&Al)!==0?ya(i):null;return{v:u,i:v,e:fn(()=>(o(t,u??a,v??i,c),()=>{e.delete(r)}))}}function Za(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&Ln)===0?t.nodes.start:a;r!==null;){var d=hr(r);if(o.before(r),r===i)return;r=d}}function Wn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function Le(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;z(()=>{var v=Ee;if(c!==(c=t()??"")){if(a){v.nodes=null,u.innerHTML=c,c!==""&&Na(Yn(u),u.lastChild);return}if(v.nodes!==null&&(Fs(v.nodes.start,v.nodes.end),v.nodes=null),c!==""){var g=r?zl:i?Dl:void 0,E=Os(r?"svg":i?"math":"template",g);E.innerHTML=c;var p=r||i?E:E.content;if(Na(Yn(p),p.lastChild),r||i)for(;Yn(p);)d.before(Yn(p));else d.before(p)}}})}function $o(e,t,a){var r=e==null?"":""+e;return r===""?null:r}function Lo(e,t){return e==null?null:String(e)}function yt(e,t,a,r,i,o){var d=e[si];if(d!==a||d===void 0){var c=$o(a);c==null?e.removeAttribute("class"):e.className=c,e[si]=a}return o}function pn(e,t,a,r){var i=e[li];if(i!==t){var o=Lo(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[li]=t}return r}function Ys(e,t,a=!1){if(e.multiple){if(t==null)return;if(!bi(t))return Rl();for(var r of e.options)r.selected=t.includes(rr(r));return}for(r of e.options){var i=rr(r);if(so(i,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function Po(e){var t=new MutationObserver(()=>{Ys(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Rs(()=>{t.disconnect()})}function ar(e,t,a=t){var r=new WeakSet,i=!0;Si(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),rr);else{var u=e.querySelector(d)??e.querySelector("option:not([disabled])");c=u&&rr(u)}a(c),e.__value=c,j!==null&&r.add(j)}),Bs(()=>{var o=t();if(e===document.activeElement){var d=j;if(r.has(d))return}if(Ys(e,o,i),i&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=rr(c),a(o))}e.__value=o,i=!1}),Po(e)}function rr(e){return"__value"in e?e.__value:e.value}const zo=Symbol("is custom element"),Do=Symbol("is html"),Oo=gl?"progress":"PROGRESS";function yr(e,t){var a=Xs(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==Oo)||(e.value=t??"")}function Nr(e,t,a,r){var i=Xs(e);i[t]!==(i[t]=a)&&(t==="loading"&&(e[hl]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Ro(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Xs(e){return e[xr]??(e[xr]={[zo]:e.nodeName.includes("-"),[Do]:e.namespaceURI===fs})}var Vi=new Map;function Ro(e){var t=e.getAttribute("is")||e.nodeName,a=Vi.get(t);if(a)return a;Vi.set(t,a=[]);for(var r,i=e,o=Element.prototype;o!==i;){r=ol(i);for(var d in r)r[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);i=os(i)}return a}function An(e,t,a=t){var r=new WeakSet;Si(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Qr(e)?Zr(o):o,a(o),j!==null&&r.add(j),await bo(),o!==(o=t())){var d=e.selectionStart,c=e.selectionEnd,u=e.value.length;if(e.value=o??"",c!==null){var v=e.value.length;d===c&&c===u&&v>u?(e.selectionStart=v,e.selectionEnd=v):(e.selectionStart=d,e.selectionEnd=Math.min(c,v))}}}),Va(t)==null&&e.value&&(a(Qr(e)?Zr(e.value):e.value),j!==null&&r.add(j)),Fr(()=>{var i=t();if(e===document.activeElement){var o=j;if(r.has(o))return}Qr(e)&&i===Zr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function qo(e,t,a=t){Si(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Va(t)==null&&a(e.checked),Fr(()=>{var r=t();e.checked=!!r})}function Qr(e){var t=e.type;return t==="number"||t==="range"}function Zr(e){return e===""?null:+e}function Yr(e,t){return e===t||(e==null?void 0:e[Aa])===t}function Bo(e={},t,a,r){var i=Gt.r,o=Ee;return Bs(()=>{var d,c;return Fr(()=>{d=c,c=[],Va(()=>{Yr(a(...c),e)||(t(e,...c),d&&Yr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.fⅈ)u=u.parent;const v=()=>{c&&Yr(a(...c),e)&&t(null,...c)},g=u.teardown;u.teardown=()=>{v(),g==null||g()}}}),e}function mr(e){Gt===null&&us(),Ti(()=>{const t=Va(e);if(typeof t=="function")return t})}function Io(e){Gt===null&&us(),mr(()=>()=>Va(e))}let dr=localStorage.getItem("mc_token")||"";function el(){return dr}function Fo(e){dr=(e||"").trim(),localStorage.setItem("mc_token",dr)}function No(){const e={"Content-Type":"application/json"};return dr&&(e["X-MC-Token"]=dr),e}function ir(){return localStorage.getItem("mc_hf_token")||""}function Ko(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function Se(e,t={}){const a=await fetch(e,{headers:No(),...t}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||"HTTP "+a.status);return r}const Go=(e,t=document)=>t.querySelector(e),Ui=(e,t=document)=>[...t.querySelectorAll(e)];function zn(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Hi;function ee(e,t=!1){const a=Go("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Hi),Hi=setTimeout(()=>a.className="toast",3200))}function Vo(e,t){return e==="running"||e==="ready"?'<span class="badge b-run">geladen</span>':e==="loading"||e==="starting"?'<span class="badge b-load">lädt…</span>':e==="downloading"?`<span class="badge b-load">↓ Download${t!=null?` ${Math.round(t)}%`:""}</span>`:'<span class="badge b-run">bereit</span>'}const We=e=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">${e}</svg>`,Kr={logo:We('<circle cx="12" cy="12" r="3.2"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3M5 5l2 2M17 17l2 2M19 5l-2 2M7 17l-2 2"/>'),grid:We('<rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><rect x="14" y="14" width="7" height="7" rx="1.5"/>'),cpu:We('<rect x="6" y="6" width="12" height="12" rx="2"/><path d="M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3"/>'),pulse:We('<path d="M3 12h4l2 6 4-14 2 8h6"/>'),server:We('<rect x="3" y="4" width="18" height="7" rx="2"/><rect x="3" y="13" width="18" height="7" rx="2"/><path d="M7 7.5h.01M7 16.5h.01"/>'),book:We('<path d="M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2z"/><path d="M19 19H6a2 2 0 0 0-2 2"/>'),help:We('<circle cx="12" cy="12" r="9"/><path d="M9.5 9.2a2.5 2.5 0 0 1 4.8 1c0 1.7-2.3 2-2.3 3.4"/><path d="M12 17h.01"/>'),settings:We('<circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-2.7 1.1V21a2 2 0 1 1-4 0v-.1A1.6 1.6 0 0 0 6.6 19l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0-1.1-2.7H2a2 2 0 1 1 0-4h.1A1.6 1.6 0 0 0 4 6.6l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1A1.6 1.6 0 0 0 9 4.6V4a2 2 0 1 1 4 0v.1A1.6 1.6 0 0 0 17.4 6l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0 1.1 2.7H21a2 2 0 1 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1z"/>'),swap:We('<path d="M7 4 3 8l4 4"/><path d="M3 8h12a4 4 0 0 1 0 8h-1"/><path d="m17 20 4-4-4-4"/>'),monitor:We('<rect x="3" y="4" width="18" height="12" rx="2"/><path d="M8 20h8M12 16v4"/>'),layers:We('<path d="m12 2 9 5-9 5-9-5z"/><path d="m3 12 9 5 9-5M3 17l9 5 9-5"/>'),alert:We('<path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/><path d="M12 9v4M12 17h.01"/>'),gauge:We('<path d="M12 14 16 9"/><circle cx="12" cy="13" r="9"/><path d="M12 4v2M21 13h-2M5 13H3"/>'),search:We('<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>'),compass:We('<circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/>'),code:We('<polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/>'),eye:We('<path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/>'),refresh:We('<path d="M3 12a9 9 0 0 1 15-6.7L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-15 6.7L3 16"/><path d="M3 21v-5h5"/>'),file:We('<path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 3v5h5"/><path d="M9 13h6M9 17h5"/>'),database:We('<ellipse cx="12" cy="5" rx="8" ry="3"/><path d="M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5"/><path d="M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"/>'),thermo:We('<path d="M14 14.76V5a2 2 0 0 0-4 0v9.76a4 4 0 1 0 4 0z"/>'),shield:We('<path d="M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7z"/><path d="m9 12 2 2 4-4"/>'),info:We('<circle cx="12" cy="12" r="9"/><path d="M12 16v-4M12 8h.01"/>'),chevron:We('<path d="m9 6 6 6-6 6"/>'),bolt:We('<path d="M13 2 3 14h7l-1 8 10-12h-7z"/>'),x:We('<path d="M18 6 6 18M6 6l12 12"/>'),check:We('<path d="M20 6 9 17l-5-5"/>'),download:We('<path d="M12 3v12M7 10l5 5 5-5"/><path d="M5 21h14"/>'),clock:We('<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>')};function Pt(e){return Kr[e]||""}function gi(e){return`<span class="info-dot" tabindex="0" title="${zn(e)}" aria-label="${zn(e)}">${Kr.info}</span>`}function ia(e){if(!e&&e!==0)return"–";const t=e/1024/1024/1024;return t>=1?t.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function xn({title:e,body:t,confirmLabel:a="Bestätigen",cancelLabel:r="Abbrechen",danger:i=!1}){return new Promise(o=>{const d=document.createElement("div");d.className="modal-overlay",d.innerHTML=`<div class="modal-card" role="dialog" aria-modal="true">
|
||
<h3>${zn(e)}</h3>
|
||
<p>${t}</p>
|
||
<div class="modal-actions">
|
||
<button data-x="0">${zn(r)}</button>
|
||
<button class="${i?"danger":"primary"}" data-x="1">${zn(a)}</button>
|
||
</div></div>`;const c=u=>{d.remove(),o(u)};d.addEventListener("click",u=>{if(u.target===d)return c(!1);const v=u.target.closest("[data-x]");v&&c(v.getAttribute("data-x")==="1")}),document.body.appendChild(d),d.querySelector('[data-x="1"]').focus()})}function Wi({title:e,body:t="",placeholder:a="",password:r=!1,confirmLabel:i="Weiter",danger:o=!1}){return new Promise(d=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=`<div class="modal-card" role="dialog" aria-modal="true">
|
||
<h3>${zn(e)}</h3>
|
||
${t?`<p>${t}</p>`:""}
|
||
<input type="${r?"password":"text"}" placeholder="${zn(a)}" autocomplete="off" style="margin-bottom:18px">
|
||
<div class="modal-actions">
|
||
<button data-x="0">Abbrechen</button>
|
||
<button class="${o?"danger":"primary"}" data-x="1">${zn(i)}</button>
|
||
</div></div>`;const u=c.querySelector("input"),v=g=>{c.remove(),d(g)};c.addEventListener("click",g=>{if(g.target===c)return v(null);const E=g.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",g=>{g.key==="Enter"&&v(u.value||""),g.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Uo(e="overview"){const t=Ui(".nav-item[data-view]:not(.disabled)"),a=Ui(".view[data-view]"),r=new Set(a.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let ji=R(null);const br={get value(){return n(ji)},set(e){h(ji,e,!0)}};let Ji=R(Ut([])),jn=R(Ut([]));const da={get value(){return n(Ji)},set(e){h(Ji,e||[],!0)},get tracked(){return n(jn)},track(e){n(jn).includes(e)||h(jn,[...n(jn),e],!0)},toggle(e){h(jn,n(jn).includes(e)?n(jn).filter(t=>t!==e):[...n(jn),e],!0)}};let Qi=R(null);const Li={get value(){return n(Qi)},set(e){h(Qi,e,!0)}},Ho="5";var ss;typeof window<"u"&&((ss=window.__svelte??(window.__svelte={})).v??(ss.v=new Set)).add(Ho);var Wo=y('<span style="font-size:13px;font-weight:400;color:var(--mut)">— bereit für Anfragen</span>'),jo=y('<div><div class="k-h"><span class="k-t">Temperatur (GPU)</span><span class="k-ic"></span></div> <div class="k-v"> </div> <div class="k-s"> </div></div> <div><div class="k-h"><span class="k-t">Freier Speicher</span><span class="k-ic"></span></div> <div class="k-v"> <small>GB</small></div> <div class="k-s"> </div></div>',1),Jo=y('<div class="kpi muted"><div class="k-h"><span class="k-t">Temperatur</span></div><div class="k-v">–</div><div class="k-s">messe…</div></div> <div class="kpi muted"><div class="k-h"><span class="k-t">Freier Speicher</span></div><div class="k-v">–</div><div class="k-s">messe…</div></div>',1),Qo=y('<div class="meter"><div class="meter-h"><span class="mk"> </span><span class="mv"> </span></div> <div><i></i></div></div>'),Zo=y('<div class="empty">Warte auf Messwerte…</div>'),Yo=y('<div class="card-sub">Noch kein Modell eingerichtet — starte hier:</div> <button class="qa"><span class="qa-ic teal"></span> <span class="qa-main"><span class="qa-t">Schritt 1 · Modell holen</span><span class="qa-s">Cookbook → passendes Setup installieren</span></span> <span class="qa-arrow"></span></button> <button class="qa" style="opacity:.55;pointer-events:none"><span class="qa-ic teal"></span> <span class="qa-main"><span class="qa-t">Schritt 2 · Tools verbinden</span><span class="qa-s">Erst nach dem Download verfügbar</span></span> <span class="qa-arrow"></span></button> <button class="qa"><span class="qa-ic blue"></span> <span class="qa-main"><span class="qa-t">Einsteiger-Guide lesen</span><span class="qa-s">Alle Begriffe erklärt, ohne Vorwissen</span></span> <span class="qa-arrow"></span></button>',1),Xo=y('<div class="card-sub">Die häufigsten Aufgaben — ein Klick.</div> <button class="qa"><span class="qa-ic teal"></span> <span class="qa-main"><span class="qa-t">Modell finden</span><span class="qa-s">Passend zu deiner Hardware</span></span> <span class="qa-arrow"></span></button> <button class="qa"><span class="qa-ic amber"></span> <span class="qa-main"><span class="qa-t">Speicher freigeben</span><span class="qa-s">Alle Modelle entladen</span></span> <span class="qa-arrow"></span></button> <button class="qa"><span class="qa-ic blue"></span> <span class="qa-main"><span class="qa-t">Logs ansehen</span><span class="qa-s">Live mitlesen, was läuft</span></span> <span class="qa-arrow"></span></button> <button class="qa"><span class="qa-ic teal"></span> <span class="qa-main"><span class="qa-t">Tools verbinden</span><span class="qa-s">Zed, OpenCode, Cline einrichten</span></span> <span class="qa-arrow"></span></button>',1),ed=y('<span class="tag img">Bild</span>'),td=y('<span class="tag code">Code</span>'),nd=y('<span class="tag text">Text</span>'),ad=y('<span class="chip" style="padding:2px 7px;font-size:11px">∞ aktiv</span>'),rd=y('<button class="ghost"> </button>'),id=y('<div class="li" style="padding:10px 4px"><span></span> <div class="li-main"><div class="flex items-center gap-2" style="flex-wrap:wrap"><span class="li-id"> </span> <!> <!></div> <div class="li-sub mono-sm"> </div></div> <div class="flex items-center gap-2"><span class="li-meta"> </span> <!></div></div>'),Zi=y('<div class="list"></div>'),sd=y('<div class="empty-c"><div class="e-t">Noch keine Modelle</div> <div class="e-s">Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.</div> <button class="primary" style="margin-top:12px">Zum Cookbook →</button></div>'),ld=y('<a class="li" target="_blank" rel="noopener" style="text-decoration:none;color:inherit"><div class="li-main"><div style="font-size:13px;line-height:1.4"> </div> <div class="li-sub"> </div></div></a>'),od=y('<div class="empty">News gerade nicht ladbar.</div>'),dd=y('<div class="pagehead" style="margin-bottom:10px"><div><h1 style="display:flex;align-items:center;gap:10px"> <!></h1> <div class="sub"> </div></div></div> <div class="tiles"><div><div class="k-h"><span class="k-t">LLM-Engine</span> <span class="k-ic"></span></div> <div class="k-v"> </div> <div class="k-s"> </div></div> <div><div class="k-h"><span class="k-t">Aktives Modell</span> <span class="k-ic"></span></div> <div class="k-v" style="font-size:16px;word-break:break-word"> </div> <div class="k-s"><!></div></div> <!></div> <div class="split"><div class="card"><div class="card-h"><h3>System-Gesundheit</h3></div> <div class="card-sub">Auslastung in Echtzeit.</div> <!></div> <div class="card"><div class="card-h"><h3>Schnellstart</h3></div> <!></div></div> <div class="grid grid-2"><div class="card"><div class="card-h"><h3>Dein Stack</h3> <span class="meta"> </span></div> <!></div> <div class="card"><div class="card-h"><h3>Top-News</h3> <span class="meta" style="cursor:pointer" role="button" tabindex="0">Alle →</span></div> <!></div></div>',1);function cd(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>Li.value),i=O(()=>{var M;return((M=n(a))==null?void 0:M.models)||[]}),o=O(()=>{var M;return((M=n(a))==null?void 0:M.swap_ok)??!1}),d=["running","ready","loading","starting"],c=O(()=>n(i).find(M=>d.includes(M.state))),u=O(()=>n(i).filter(M=>!M.incomplete)),v=O(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),g=O(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(n(r).ram.percent)} % — eventuell Speicher freigeben.`:`${n(u).length} ${n(u).length===1?"Modell":"Modelle"} konfiguriert · ${n(c)?`„${n(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=O(()=>()=>{var G;const M=(G=n(r))==null?void 0:G.gpu;return M&&M.vram.total+M.gtt.total>0?(M.vram.used+M.gtt.used)/(M.vram.total+M.gtt.total)*100:0});let p=R(Ut([])),x=R(null);mr(async()=>{try{h(p,((await Se("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function A(){await xn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await Se("/api/unload",{method:"POST"}),k())}async function L(M){h(x,M,!0);try{await Se("/api/preload?model="+encodeURIComponent(M),{method:"POST"})}catch(G){ee("Laden fehlgeschlagen: "+(G.message||"Engine nicht erreichbar?"),!0)}h(x,null),k()}function k(){document.dispatchEvent(new Event("mc:refresh"))}function P(M){var G;(G=document.querySelector(`.nav-item[data-view="${M}"]`))==null||G.dispatchEvent(new MouseEvent("click"))}function ye(M){return M>=90?"red":M>=75?"":"green"}function te(M){return M==null?"":M>=75?"red":M>=55?"":"green"}function ue(M){return M>=90?"red":M>=70?"":"green"}var Te=dd(),K=ct(Te),V=l(K),fe=l(V),he=l(fe),Pe=s(he);{var Ve=M=>{var G=Wo();m(M,G)};I(Pe,M=>{n(o)&&!n(c)&&M(Ve)})}var mt=s(fe,2),T=l(mt),W=s(K,2),re=l(W),Ue=l(re),Q=s(l(Ue),2);Le(Q,()=>Pt("server"),!0);var ze=s(Ue,2),Y=l(ze),rt=s(ze,2),D=l(rt),U=s(re,2),ie=l(U),ge=s(l(ie),2);Le(ge,()=>Pt("cpu"),!0);var Ae=s(ie,2),bt=l(Ae),pt=s(Ae,2),kt=l(pt);{var Ct=M=>{var G=nr();z(Oe=>b(G,`${Oe??""} · ${n(c).state??""}`),[()=>{var Oe;return(Oe=n(c).meta)!=null&&Oe.ctx?Math.round(n(c).meta.ctx/1024)+"k ctx":""}]),m(M,G)},Mt=M=>{var G=nr("lädt bei erster Anfrage");m(M,G)};I(kt,M=>{n(c)?M(Ct):M(Mt,-1)})}var Lt=s(U,2);{var Ot=M=>{const G=O(()=>{var Un;return n(r).gpu_temp??((Un=n(r).cpu)==null?void 0:Un.temp)??null}),Oe=O(()=>te(n(G))),ne=O(()=>n(r).ram.total-n(r).ram.used),Be=O(()=>100-n(r).ram.percent);var Ze=jo(),et=ct(Ze),Me=l(et),$e=s(l(Me));Le($e,()=>Pt("thermo"),!0);var Re=s(Me,2),Rt=l(Re),Bt=s(Re,2),Wt=l(Bt),an=s(et,2),bn=l(an),Ke=s(l(bn));Le(Ke,()=>Pt("database"),!0);var ht=s(bn,2),Rn=l(ht),Vn=s(ht,2),ra=l(Vn);z((Un,Ua,w,_)=>{yt(et,1,`kpi ${n(Oe)??""}`),b(Rt,Un),b(Wt,n(G)==null?"messe…":n(G)<55?"kühl":n(G)<75?"normal":"⚠ heiß"),yt(an,1,`kpi ${n(Be)<15?"red":n(Be)<30?"":"green"}`),b(Rn,Ua),b(ra,`von ${w??""} GB · ${_??""} % frei`)},[()=>n(G)!=null?`${Math.round(n(G))}°C`:"–",()=>Math.round(n(ne)/1073741824),()=>Math.round(n(r).ram.total/1073741824),()=>Math.round(n(Be))]),m(M,Ze)},qt=M=>{var G=Jo();m(M,G)};I(Lt,M=>{n(r)?M(Ot):M(qt,-1)})}var $=s(W,2),N=l($),Ce=s(l(N),4);{var ut=M=>{const G=O(()=>n(E)());var Oe=or(),ne=ct(Oe);dt(ne,17,()=>{var Be;return[["Prozessor (CPU)",((Be=n(r).cpu)==null?void 0:Be.percent)??0,""],["Arbeitsspeicher (RAM)",n(r).ram.percent,ye(n(r).ram.percent)],["Grafikspeicher (VRAM)",n(G),ue(n(G))]]},ot,(Be,Ze)=>{var et=O(()=>sr(n(Ze),3));let Me=()=>n(et)[0],$e=()=>n(et)[1];const Re=O(()=>Math.max(0,Math.min(100,$e()||0)));var Rt=Qo(),Bt=l(Rt),Wt=l(Bt),an=l(Wt),bn=s(Wt),Ke=l(bn),ht=s(Bt,2),Rn=l(ht);z((Vn,ra)=>{b(an,Me()),b(Ke,`${Vn??""} %`),yt(ht,1,`bar ${n(Re)>=90?"bad":n(Re)>=75?"warn":""}`),pn(Rn,`width:${ra??""}%`)},[()=>Math.round(n(Re)),()=>Math.max(2,n(Re))]),m(Be,Rt)}),m(M,Oe)},F=M=>{var G=Zo();m(M,G)};I(Ce,M=>{n(r)?M(ut):M(F,-1)})}var De=s(N,2),J=s(l(De),2);{var de=M=>{var G=Yo(),Oe=s(ct(G),2),ne=l(Oe);Le(ne,()=>Pt("search"),!0);var Be=s(ne,4);Le(Be,()=>Pt("chevron"),!0);var Ze=s(Oe,2),et=l(Ze);Le(et,()=>Pt("swap"),!0);var Me=s(et,4);Le(Me,()=>Pt("chevron"),!0);var $e=s(Ze,2),Re=l($e);Le(Re,()=>Pt("file"),!0);var Rt=s(Re,4);Le(Rt,()=>Pt("chevron"),!0),C("click",Oe,()=>P("cookbook")),C("click",Ze,()=>P("connect")),C("click",$e,()=>P("guides")),m(M,G)},se=M=>{var G=Xo(),Oe=s(ct(G),2),ne=l(Oe);Le(ne,()=>Pt("search"),!0);var Be=s(ne,4);Le(Be,()=>Pt("chevron"),!0);var Ze=s(Oe,2),et=l(Ze);Le(et,()=>Pt("refresh"),!0);var Me=s(et,4);Le(Me,()=>Pt("chevron"),!0);var $e=s(Ze,2),Re=l($e);Le(Re,()=>Pt("file"),!0);var Rt=s(Re,4);Le(Rt,()=>Pt("chevron"),!0);var Bt=s($e,2),Wt=l(Bt);Le(Wt,()=>Pt("swap"),!0);var an=s(Wt,4);Le(an,()=>Pt("chevron"),!0),C("click",Oe,()=>P("cookbook")),C("click",Ze,A),C("click",$e,()=>P("server")),C("click",Bt,()=>P("connect")),m(M,G)};I(J,M=>{n(u).length?M(se,-1):M(de)})}var Z=s($,2),be=l(Z),ve=l(be),xe=s(l(ve),2),ke=l(xe),_e=s(ve,2);{var S=M=>{var G=Zi();dt(G,21,()=>n(u),ot,(Oe,ne)=>{const Be=O(()=>d.includes(n(ne).state)),Ze=O(()=>n(ne).state==="downloading"),et=O(()=>n(ne).state==="loading"||n(ne).state==="starting"||n(Ze)?"load":n(Be)?"on":""),Me=O(()=>n(Ze)?`↓ ${n(ne).download_progress!=null?Math.round(n(ne).download_progress)+"%":"..."}`:n(ne).state==="loading"||n(ne).state==="starting"?"lädt…":n(Be)?"geladen ✓":"bereit");var $e=id(),Re=l($e),Rt=s(Re,2),Bt=l(Rt),Wt=l(Bt),an=l(Wt),bn=s(Wt,2);{var Ke=X=>{var me=ed();m(X,me)},ht=O(()=>{var X,me;return(me=(X=n(ne).meta)==null?void 0:X.caps)==null?void 0:me.includes("Bild")}),Rn=X=>{var me=td();m(X,me)},Vn=O(()=>{var X,me;return(me=(X=n(ne).meta)==null?void 0:X.caps)==null?void 0:me.includes("Code")}),ra=X=>{var me=nd();m(X,me)};I(bn,X=>{n(ht)?X(Ke):n(Vn)?X(Rn,1):X(ra,-1)})}var Un=s(bn,2);{var Ua=X=>{var me=ad();m(X,me)};I(Un,X=>{n(ne).ttl>=99999&&X(Ua)})}var w=s(Bt,2),_=l(w),B=s(Rt,2),q=l(B),ae=l(q),tt=s(q,2);{var it=X=>{var me=rd(),qe=l(me);z(()=>{pn(me,`padding:3px 9px;font-size:12px;opacity:${n(x)===n(ne).name?".5":"1"}`),me.disabled=n(x)===n(ne).name,b(qe,n(x)===n(ne).name?"…":"Laden")}),C("click",me,()=>L(n(ne).name)),m(X,me)};I(tt,X=>{!n(Be)&&!n(Ze)&&n(o)&&X(it)})}z((X,me)=>{var qe;yt(Re,1,`li-dot ${n(et)??""}`),pn(Wt,n(Be)?"color:var(--accent)":""),b(an,n(ne).name),b(_,`${X??""}
|
||
${(qe=n(ne).meta)!=null&&qe.quant?" · "+n(ne).meta.quant:""}
|
||
${me??""}`),pn(q,`white-space:nowrap;color:${n(Be)?"var(--on)":"var(--mut)"}`),b(ae,n(Me))},[()=>{var X;return(X=n(ne).meta)!=null&&X.ctx?Math.round(n(ne).meta.ctx/1024)+"k ctx":""},()=>{var X;return(X=n(ne).meta)!=null&&X.size_bytes?" · "+(n(ne).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),m(Oe,$e)}),m(M,G)},H=M=>{var G=sd(),Oe=s(l(G),4);C("click",Oe,()=>P("cookbook")),m(M,G)};I(_e,M=>{n(u).length?M(S):M(H,-1)})}var le=s(be,2),Je=l(le),Qe=s(l(Je),2),Qt=s(Je,2);{var Zt=M=>{var G=Zi();dt(G,21,()=>n(p),ot,(Oe,ne)=>{var Be=ld(),Ze=l(Be),et=l(Ze),Me=l(et),$e=s(et,2),Re=l($e);z(()=>{Nr(Be,"href",n(ne).link),b(Me,n(ne).title),b(Re,`${n(ne).source??""}${n(ne).relevant?" · für dich":""}`)}),m(Oe,Be)}),m(M,G)},Ht=M=>{var G=od();m(M,G)};I(Qt,M=>{n(p).length?M(Zt):M(Ht,-1)})}z(M=>{b(he,`${n(v)??""} `),b(T,n(g)),yt(re,1,`kpi ${n(o)?"green":"red"}`),b(Y,n(o)?"Online":"Offline"),b(D,M),yt(U,1,`kpi ${n(c)?"blue":"muted"}`),b(bt,n(c)?n(c).name:"Keins"),b(ke,n(u).length?n(u).length+" konfiguriert":"")},[()=>{var M,G;return((G=(M=n(a))==null?void 0:M.swap_url)==null?void 0:G.replace(/^https?:\/\//,""))??"—"}]),C("click",Qe,()=>P("news")),C("keydown",Qe,M=>M.key==="Enter"&&P("news")),m(e,Te),aa()}xa(["click","keydown"]);var ud=y("<option> </option>"),vd=y('<div class="reply" style="margin-top:12px"> </div>'),fd=y('<div class="empty-c"><div class="e-t">Noch keine Modelle konfiguriert</div> <div class="e-s">Hol dir unter „Cookbook" ein passendes Modell.</div></div>'),pd=y('<tr style="opacity:.9"><td class="mid" style="font-weight:500"> <div class="li-sub mono-sm" style="color:var(--warn)">kein Modell hinterlegt</div></td><td>—</td><td><span class="mono-sm text-mut">leere Rolle</span></td><td><span class="badge">leer</span></td><td class="port">—</td><td style="text-align:right;white-space:nowrap"><button class="ghost">Modell zuweisen</button> <button class="ghost del">Löschen</button></td></tr>'),hd=y('<span class="tag" style="background:rgba(45,212,191,.14);color:var(--accent);border-color:rgba(45,212,191,.3)"> </span>'),gd=y('<div class="li-sub mono-sm"> </div>'),md=y('<code style="cursor:pointer" title="Klicken zum Kopieren"> </code>'),bd=y('<tr><td class="mid"><div style="font-weight:500;display:flex;align-items:center;gap:7px;flex-wrap:wrap"> <!></div> <!> <div class="li-sub mono-sm" style="margin-top:3px;display:flex;align-items:center;gap:6px;flex-wrap:wrap"><span class="text-mut">API-Name:</span> <!></div></td><td></td><td></td><td></td><td class="port"> </td><td style="text-align:right;white-space:nowrap"><button class="ghost">Rolle</button> <button class="ghost">Konfigurieren</button> <button class="ghost">Entladen</button> <button class="ghost del">Löschen</button></td></tr>'),_d=y('<table><thead><tr><th>Modell</th><th>Kann</th><th>Details</th><th>Status</th><th>Port</th><th style="text-align:right">Aktionen</th></tr></thead><tbody></tbody></table>'),wd=y('<div class="tile" style="display:flex;justify-content:space-between;align-items:center;margin:8px 0 10px"><div style="flex:1"><div style="font-size:13px">Empfohlen für deine Hardware</div> <div class="hint" style="margin:4px 0 0"> <br/> </div></div> <button class="ghost">Optimal übernehmen</button></div>'),yd=y('<div class="modal-overlay" role="dialog"><div class="modal-card"><button class="ghost" style="position:absolute;top:14px;right:14px">Schließen</button> <h3>Modell konfigurieren</h3> <p class="mono-sm" style="margin:-4px 0 16px"> </p> <label>Kontext-Größe (Tokens) <!></label> <input type="number"/> <!> <div class="hint" style="margin-bottom:14px">Es läuft immer nur <b>ein</b> Modell gleichzeitig — ein größerer Kontext hier beeinflusst deine anderen Modelle nicht.</div> <div class="tile" style="display:flex;justify-content:space-between;align-items:center;margin:0 0 14px"><div style="flex:1"><div style="font-size:13px;font-weight:500">Immer aktiv halten</div> <div class="hint" style="margin:3px 0 0">Modell bleibt dauerhaft im RAM — nie automatisch entladen. Ideal für den kleinen Scout (~5 GB), der immer schnell antworten soll.</div></div> <label style="display:flex;align-items:center;gap:8px;margin:0;cursor:pointer;flex:0 0 auto"><input type="checkbox" style="width:18px;height:18px;accent-color:var(--accent);cursor:pointer"/> <span class="mono-sm"> </span></label></div> <button class="primary" style="width:100%;margin-top:6px">Speichern</button></div></div>'),xd=y('<button style="border-radius:999px"> </button>'),kd=y('<div class="modal-overlay" role="dialog"><div class="modal-card"><button class="ghost" style="position:absolute;top:14px;right:14px">Schließen</button> <h3>Rolle festlegen <!></h3> <p class="mono-sm" style="margin:-4px 0 16px"> </p> <div class="hint" style="margin-bottom:10px">Wähle eine Rolle als zweiten, sprechenden Namen. In deinen Tools funktionieren danach <b>beide</b>: der echte Modellname und die Rolle.</div> <div class="flex gap-2" style="flex-wrap:wrap;margin-bottom:12px"></div> <label>Eigene Rolle (optional)</label> <input placeholder="z.B. uebersetzer"/> <div class="btn-row" style="margin-top:14px;display:flex;gap:8px"><button class="ghost" style="flex:1">Rolle entfernen</button> <button class="primary" style="flex:2">Speichern</button></div></div></div>'),Md=y('<div id="m-head"><div class="pagehead"><div><h1>Modelle</h1> <div class="sub">Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.</div></div></div></div> <div class="card"><div class="card-h"><h3>Schnelltest</h3></div> <div class="card-sub">Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.</div> <label>Modell</label> <select></select> <label>Nachricht</label> <textarea placeholder="z.B. „Erklär mir kurz, was du kannst.""></textarea> <button class="primary"> </button> <!></div> <div class="card"><div class="card-h"><h3>Modelle & Ports</h3><span class="meta"> </span></div> <div class="card-sub">Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.</div> <!></div> <!> <!>',1);function Sd(e,t){na(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=O(()=>{var $;return(($=br.value)==null?void 0:$.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=R(""),u=R(""),v=R(""),g=R(!1);const E=O(()=>n(o).filter($=>!$.incomplete));async function p(){var N;const $=n(c)||((N=n(E)[0])==null?void 0:N.name);if(!(!$||!n(u).trim())){h(g,!0),h(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const Ce=await Se("/api/chat",{method:"POST",body:JSON.stringify({model:$,message:n(u)})});h(v,Ce.reply,!0)}catch(Ce){h(v,"Fehler: "+Ce.message)}h(g,!1),d()}}const x=300;let A=R(!1),L=R(null),k=R(8192),P=R(!1);function ye($){var N;h(L,n(o).find(Ce=>Ce.name===$),!0),n(L)&&(h(k,((N=n(L).meta)==null?void 0:N.ctx)||8192,!0),h(P,(n(L).ttl??x)>=99999),h(A,!0))}async function te(){const $=n(P)?99999:x;try{await Se("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(k),ttl:$})}),ee("Gespeichert — aktiv beim nächsten Modell-Start."),h(A,!1),d()}catch(N){ee(N.message,!0)}}let ue=R(!1),Te=R(""),K=R(""),V=R("");function fe($){const N=n(o).find(Ce=>Ce.name===$);h(Te,$,!0),h(V,(N==null?void 0:N.role)||"",!0),h(K,""),h(ue,!0)}async function he($){try{await Se("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(Te),role:$})}),ee($?`Rolle gesetzt: ${$}`:"Rolle entfernt."),h(ue,!1),d()}catch(N){ee(N.message,!0)}}async function Pe($){if(await xn({title:`„${$}" 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($),{method:"POST"}),ee("Entladen: "+$),setTimeout(d,600)}catch(N){ee(N.message,!0)}}async function Ve($){if(await xn({title:`„${$}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. <b>Das lässt sich nicht rückgängig machen</b> — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const N=await Se("/api/delete_model",{method:"POST",body:JSON.stringify({alias:$})});ee(N.note||"Gelöscht: "+$),setTimeout(d,600)}catch(N){ee(N.message,!0)}}function mt($){return $!=null&&$.length?$.map(N=>N==="Code"?'<span class="tag code">Code</span>':N==="Bild"?'<span class="tag img">Bild</span>':'<span class="tag text">Text</span>').join(" "):"–"}function T($){if(!$)return"–";const N=$.quant||"?",Ce=$.ctx?Math.round($.ctx/1024)+"K":"?",ut=$.size_bytes?($.size_bytes/1024**3).toFixed(1)+" GB":"?";return`<span class="mono-sm">${N} · ${Ce} · ${ut}</span>`}function W($){var N;(N=navigator.clipboard)==null||N.writeText($),ee("Kopiert: "+$)}var re=Md(),Ue=s(ct(re),2),Q=s(l(Ue),6);dt(Q,21,()=>n(E),ot,($,N)=>{var Ce=ud(),ut=l(Ce),F={};z(()=>{b(ut,n(N).name),F!==(F=n(N).name)&&(Ce.value=(Ce.__value=n(N).name)??"")}),m($,Ce)});var ze=s(Q,4),Y=s(ze,2),rt=l(Y),D=s(Y,2);{var U=$=>{var N=vd(),Ce=l(N);z(()=>b(Ce,n(v))),m($,N)};I(D,$=>{n(v)&&$(U)})}var ie=s(Ue,2),ge=l(ie),Ae=s(l(ge)),bt=l(Ae),pt=s(ge,4);{var kt=$=>{var N=fd();m($,N)},Ct=$=>{var N=_d(),Ce=s(l(N));dt(Ce,21,()=>n(o),ot,(ut,F)=>{var De=or(),J=ct(De);{var de=Z=>{var be=pd(),ve=l(be),xe=l(ve),ke=s(ve,5),_e=l(ke),S=s(_e,2);z(()=>b(xe,n(F).name)),C("click",_e,()=>{var H;ee("Lade im Cookbook ein Modell und setze den Alias auf: "+n(F).name),(H=document.querySelector(".nav-item[data-view='cookbook']"))==null||H.dispatchEvent(new MouseEvent("click"))}),C("click",S,()=>Ve(n(F).name)),m(Z,be)},se=Z=>{var be=bd(),ve=l(be),xe=l(ve),ke=l(xe),_e=s(ke);{var S=Me=>{var $e=hd(),Re=l($e);z(()=>b(Re,n(F).role)),m(Me,$e)};I(_e,Me=>{n(F).role&&Me(S)})}var H=s(xe,2);{var le=Me=>{var $e=gd(),Re=l($e);z(()=>b(Re,n(F).meta.filename)),m(Me,$e)};I(H,Me=>{var $e;($e=n(F).meta)!=null&&$e.filename&&Me(le)})}var Je=s(H,2),Qe=s(l(Je),2);dt(Qe,17,()=>{var Me;return(Me=n(F).api_ids)!=null&&Me.length?n(F).api_ids:[n(F).name]},ot,(Me,$e)=>{var Re=md(),Rt=l(Re);z(()=>b(Rt,n($e))),C("click",Re,()=>W(n($e))),m(Me,Re)});var Qt=s(ve);Le(Qt,()=>{var Me;return mt((Me=n(F).meta)==null?void 0:Me.caps)},!0);var Zt=s(Qt);Le(Zt,()=>T(n(F).meta),!0);var Ht=s(Zt);Le(Ht,()=>Vo(n(F).state,n(F).download_progress),!0);var M=s(Ht),G=l(M),Oe=s(M),ne=l(Oe),Be=s(ne,2),Ze=s(Be,2),et=s(Ze,2);z(()=>{b(ke,`${n(F).name??""} `),b(G,n(F).port??"auto")}),C("click",ne,()=>fe(n(F).name)),C("click",Be,()=>ye(n(F).name)),C("click",Ze,()=>Pe(n(F).name)),C("click",et,()=>Ve(n(F).name)),m(Z,be)};I(J,Z=>{n(F).incomplete?Z(de):Z(se,-1)})}m(ut,De)}),m($,N)};I(pt,$=>{n(o).length?$(Ct,-1):$(kt)})}var Mt=s(ie,2);{var Lt=$=>{var N=yd(),Ce=l(N),ut=l(Ce),F=s(ut,4),De=l(F),J=s(F,2),de=s(l(J));Le(de,()=>gi(a));var se=s(J,2),Z=s(se,2);{var be=le=>{var Je=wd(),Qe=l(Je),Qt=s(l(Qe),2),Zt=l(Qt),Ht=s(Zt,2),M=s(Qe,2);z((G,Oe)=>{b(Zt,`Optimal ~${G??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),b(Ht,` Aktuell ~${Oe??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),C("click",M,()=>h(k,n(L).meta.optimal_ctx,!0)),m(le,Je)};I(Z,le=>{var Je;(Je=n(L).meta)!=null&&Je.optimal_ctx&&le(be)})}var ve=s(Z,4),xe=s(l(ve),2),ke=l(xe),_e=s(ke,2),S=l(_e),H=s(ve,2);z(()=>{b(De,n(L).name),pn(_e,`color:${n(P)?"var(--accent)":"var(--mut)"}`),b(S,n(P)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),C("click",N,le=>{le.target.classList.contains("modal-overlay")&&h(A,!1)}),C("click",ut,()=>h(A,!1)),An(se,()=>n(k),le=>h(k,le)),qo(ke,()=>n(P),le=>h(P,le)),C("click",H,te),m($,N)};I(Mt,$=>{n(A)&&n(L)&&$(Lt)})}var Ot=s(Mt,2);{var qt=$=>{var N=kd(),Ce=l(N),ut=l(Ce),F=s(ut,2),De=s(l(F));Le(De,()=>gi(r));var J=s(F,2),de=l(J),se=s(J,4);dt(se,21,()=>i,ot,(ke,_e)=>{var S=xd(),H=l(S);z(()=>{yt(S,1,n(V)===n(_e).id?"primary":"ghost"),Nr(S,"title",n(_e).desc),b(H,n(_e).label)}),C("click",S,()=>he(n(_e).id)),m(ke,S)});var Z=s(se,4),be=s(Z,2),ve=l(be),xe=s(ve,2);z(()=>b(de,n(Te))),C("click",N,ke=>{ke.target.classList.contains("modal-overlay")&&h(ue,!1)}),C("click",ut,()=>h(ue,!1)),An(Z,()=>n(K),ke=>h(K,ke)),C("click",ve,()=>he("")),C("click",xe,()=>he(n(K).trim().toLowerCase())),m($,N)};I(Ot,$=>{n(ue)&&$(qt)})}z(()=>{Y.disabled=n(g),b(rt,n(g)?"…":"Senden"),b(bt,n(o).length?n(o).length+" konfiguriert":"")}),ar(Q,()=>n(c),$=>h(c,$)),An(ze,()=>n(u),$=>h(u,$)),C("click",Y,p),m(e,re),aa()}xa(["click"]);var Ed=y('<div class="tiles"><div class="tile"><div class="t-l">Prozessor (CPU)</div> <div class="t-v"> <small>%</small></div> <div class="t-s"> </div></div> <div class="tile"><div class="t-l">Arbeitsspeicher</div> <div class="t-v"> <small>%</small></div> <div class="t-s"> </div></div> <div class="tile"><div class="t-l">Grafikspeicher</div> <div class="t-v"> <small>%</small></div> <div class="t-s"> </div></div></div> <div class="card"><div class="card-h"><h3>System-Metriken (Bosgame)</h3></div> <div class="card-sub">Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.</div> <div class="kv" style="margin-bottom:6px"><div class="kv-row"><span class="kv-k">Arbeitsspeicher (RAM)</span><span class="kv-v"> </span></div> <div class="kv-row"><span class="kv-k">Grafikspeicher (VRAM + GTT)</span> <span class="kv-v"> </span></div> <div class="kv-row"><span class="kv-k">Speicherplatz (Disk)</span><span class="kv-v"> </span></div> <div class="kv-row"><span class="kv-k">Temperatur (GPU / CPU)</span> <span class="kv-v"> </span></div></div> <div class="grid grid-3" style="margin-top:14px"><div><div class="meta text-xs">CPU-Verlauf</div><div style="display:flex;align-items:flex-end;gap:2px;height:38px;margin-top:10px"></div></div> <div><div class="meta text-xs">RAM-Verlauf</div><div style="display:flex;align-items:flex-end;gap:2px;height:38px;margin-top:10px"></div></div> <div><div class="meta text-xs">VRAM-Verlauf</div><div style="display:flex;align-items:flex-end;gap:2px;height:38px;margin-top:10px"></div></div></div></div>',1),Td=y('<button class="ghost" style="margin-left:auto;padding:4px 11px;font-size:12px">Verlauf leeren</button>'),Ad=y('<div class="empty-c"><div class="e-t">Gerade nichts los.</div> <div class="e-s">Alles ruhig — keine laufenden Aufgaben.</div></div>'),Cd=y('<span class="mono-sm" style="margin-left:auto"> </span>'),$d=y('<button class="ghost">Abbrechen</button>'),Ld=y('<button class="ghost" title="Aus Verlauf entfernen" style="margin-left:auto;margin-right:2px;padding:2px 9px;font-size:14px;line-height:1">×</button>'),Pd=y('<div class="bar" style="margin-top:8px"><i></i></div>'),zd=y('<div class="log"> </div>'),Dd=y('<div class="job"><div class="job-h" role="button" tabindex="0"><span></span> <span class="mid"> </span> <!> <!> <!></div> <!> <!></div>'),Od=y('<div class="pagehead"><div><h1>Aktivität</h1> <div class="sub">Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.</div></div></div> <!> <div class="card"><div class="card-h"><h3>Hintergrund-Aufgaben</h3> <span class="meta"> </span> <!></div> <div class="card-sub">Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.</div> <!></div>',1);function Rd(e,t){na(t,!0);const a=O(()=>da.value),r=O(()=>da.tracked),i=O(()=>Li.value);let o=Ut({cpu:[],ram:[],gpu:[]});Ti(()=>{var re;if(!n(i))return;const T=n(i).gpu,W=T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0;o.cpu=[...o.cpu,((re=n(i).cpu)==null?void 0:re.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,W].slice(-60)});const d=O(()=>()=>{var W;const T=(W=n(i))==null?void 0:W.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0}),c=O(()=>n(a).filter(T=>T.state!=="running"&&T.state!=="queued").length),u=O(()=>n(a).filter(T=>T.state==="failed").length);function v(T){if(T.state!=="running")return null;if(typeof T.progress=="number")return Math.min(100,T.progress);const re=((T.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return re?Math.min(100,parseFloat(re[1])):null}function g(T){return T==null||T<0?"":T>=90?`noch ~${Math.round(T/60)} min`:`noch ~${Math.max(1,Math.round(T))} s`}function E(T){return T==="done"?'<span class="badge b-run">fertig</span>':T==="failed"?'<span class="badge b-err">fehler</span>':T==="canceled"?'<span class="badge">abgebrochen</span>':'<span class="badge b-load">läuft…</span>'}function p(T){return T==="done"?"on":T==="failed"||T==="canceled"?"":"load"}async function x(T){try{await Se(`/api/jobs/${T}/cancel`,{method:"POST"}),ee("Abbruch angefordert…")}catch(W){ee(W.message,!0)}}async function A(T){try{await Se(`/api/jobs/${T}`,{method:"DELETE"})}catch(W){ee(W.message,!0)}}async function L(){try{const T=await Se("/api/jobs/clear",{method:"POST"});ee(`${T.removed} Einträge entfernt.`)}catch(T){ee(T.message,!0)}}function k(T,W){return T.map(re=>`<div style="width:4px;background:var(${W});opacity:.55;height:${Math.max(2,re)}%;border-radius:2px"></div>`).join("")}var P=Od(),ye=s(ct(P),2);{var te=T=>{const W=O(()=>n(d)());var re=Ed(),Ue=ct(re),Q=l(Ue),ze=s(l(Q),2),Y=l(ze),rt=s(ze,2),D=l(rt),U=s(Q,2),ie=s(l(U),2),ge=l(ie),Ae=s(ie,2),bt=l(Ae),pt=s(U,2),kt=s(l(pt),2),Ct=l(kt),Mt=s(kt,2),Lt=l(Mt),Ot=s(Ue,2),qt=s(l(Ot),4),$=l(qt),N=s(l($)),Ce=l(N),ut=s($,2),F=s(l(ut),2),De=l(F),J=s(ut,2),de=s(l(J)),se=l(de),Z=s(J,2),be=s(l(Z),2),ve=l(be),xe=s(qt,2),ke=l(xe),_e=s(l(ke));Le(_e,()=>k(o.cpu,"--accent"),!0);var S=s(ke,2),H=s(l(S));Le(H,()=>k(o.ram,"--purple"),!0);var le=s(S,2),Je=s(l(le));Le(Je,()=>k(o.gpu,"--on"),!0),z((Qe,Qt,Zt,Ht,M,G,Oe,ne,Be,Ze,et,Me,$e)=>{b(Y,Qe),b(D,Qt),b(ge,Zt),b(bt,`${Ht??""} / ${M??""}`),b(Ct,G),b(Lt,Oe),b(Ce,`${ne??""} / ${Be??""}`),b(De,Ze),b(se,`${et??""} % belegt`),b(ve,`${Me??""} / ${$e??""}`)},[()=>{var Qe;return Math.round(((Qe=n(i).cpu)==null?void 0:Qe.percent)??0)},()=>{var Qe;return((Qe=n(i).cpu)==null?void 0:Qe.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>ia(n(i).ram.used),()=>ia(n(i).ram.total),()=>Math.round(n(W)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ia(n(i).ram.used),()=>ia(n(i).ram.total),()=>n(i).gpu?`${ia(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${ia(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var Qe;return Math.round(((Qe=n(i).disk)==null?void 0:Qe.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var Qe;return((Qe=n(i).cpu)==null?void 0:Qe.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),m(T,re)};I(ye,T=>{n(i)&&T(te)})}var ue=s(ye,2),Te=l(ue),K=s(l(Te),2),V=l(K),fe=s(K,2);{var he=T=>{var W=Td();C("click",W,L),m(T,W)};I(fe,T=>{n(c)&&T(he)})}var Pe=s(Te,4);{var Ve=T=>{var W=Ad();m(T,W)},mt=T=>{var W=or(),re=ct(W);dt(re,17,()=>n(a),ot,(Ue,Q)=>{const ze=O(()=>v(n(Q))),Y=O(()=>n(Q).state==="running"?g(n(Q).eta_s):""),rt=O(()=>n(Q).state==="running"&&n(Q).rate_bps?ia(n(Q).rate_bps)+"/s":""),D=O(()=>[n(Y),n(rt)].filter(Boolean).join(" · ")),U=O(()=>n(r).includes(n(Q).id));var ie=Dd(),ge=l(ie),Ae=l(ge),bt=s(Ae,2),pt=l(bt),kt=s(bt,2);{var Ct=F=>{var De=Cd(),J=l(De);z(de=>b(J,`${de??""} %${n(D)?` · ${n(D)}`:""}`),[()=>Math.round(n(ze))]),m(F,De)};I(kt,F=>{n(ze)!=null&&F(Ct)})}var Mt=s(kt,2);{var Lt=F=>{var De=$d();z(()=>pn(De,`${n(ze)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),C("click",De,J=>{J.stopPropagation(),x(n(Q).id)}),m(F,De)},Ot=F=>{var De=Ld();C("click",De,J=>{J.stopPropagation(),A(n(Q).id)}),m(F,De)};I(Mt,F=>{n(Q).state==="running"?F(Lt):F(Ot,-1)})}var qt=s(Mt,2);Le(qt,()=>E(n(Q).state));var $=s(ge,2);{var N=F=>{var De=Pd(),J=l(De);z(()=>pn(J,`width:${n(ze)??""}%`)),m(F,De)};I($,F=>{n(ze)!=null&&n(Q).state==="running"&&F(N)})}var Ce=s($,2);{var ut=F=>{var De=zd(),J=l(De);z(de=>b(J,de),[()=>(n(Q).log||[]).join(`
|
||
`)]),m(F,De)};I(Ce,F=>{n(U)&&F(ut)})}z(F=>{yt(Ae,1,`li-dot ${F??""}`),b(pt,n(Q).label)},[()=>p(n(Q).state)]),C("click",ge,()=>da.toggle(n(Q).id)),C("keydown",ge,F=>F.key==="Enter"&&da.toggle(n(Q).id)),m(Ue,ie)}),m(T,W)};I(Pe,T=>{n(a).length?T(mt,-1):T(Ve)})}z(()=>b(V,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),m(e,P),aa()}xa(["click","keydown"]);var qd=y('<span class="mono-sm"> </span>'),Bd=y('<button class="ghost" style="margin-left:auto;padding:3px 12px">Abbrechen</button>'),Id=y('<span class="badge b-run">✓ fertig</span>'),Fd=y('<span class="badge b-err">✗ fehlgeschlagen</span>'),Nd=y('<span class="badge">abgebrochen</span>'),Kd=y('<span class="badge b-load">läuft…</span>'),Gd=y('<div class="bar" style="margin-bottom:10px"><i></i></div>'),Vd=y('<div class="card"><div class="card-h"><h3>Aktueller Vorgang</h3> <!> <span style="margin-left:10px"><!></span></div> <div class="card-sub"> </div> <!> <div class="log" style="max-height:280px"> </div></div>'),Ud=y('<div class="pagehead"><div><h1>Server & Wartung</h1> <div class="sub">Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.</div></div></div> <div class="card"><div class="card-h"><h3>LLM-Engine (llama-swap)</h3> <span class="chip"> </span></div> <div class="card-sub">Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.</div> <div class="kv" style="margin-bottom:6px"><div class="kv-row"><span class="kv-k">Adresse (für deine Tools)</span><span class="kv-v mono-sm"> </span></div> <div class="kv-row"><span class="kv-k">Aktuell geladen</span> <span class="kv-v"> </span></div> <div class="kv-row"><span class="kv-k">Konfigurierte Modelle</span> <span class="kv-v"> </span></div></div> <div class="btn-row" style="display:flex;align-items:center;gap:10px"><button class="ghost">Verbindung prüfen</button> <!></div></div> <div class="card"><div class="card-h"><h3>Dienste & Applikation</h3></div> <div class="card-sub">Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.</div> <button class="qa"><span class="qa-ic teal">↻</span> <span class="qa-main"><span class="qa-t">LLM-Engine neustarten</span><span class="qa-s">Startet llama-swap neu. Geladene Modelle laden danach automatisch wieder.</span></span> <span class="qa-arrow">›</span></button> <button class="qa"><span class="qa-ic blue">↻</span> <span class="qa-main"><span class="qa-t">Dashboard neustarten</span><span class="qa-s">Startet diese Oberfläche neu (~5 Sek).</span></span> <span class="qa-arrow">›</span></button> <button class="qa"><span class="qa-ic teal">⬇</span> <span class="qa-main"><span class="qa-t">Mission Control aktualisieren</span><span class="qa-s">Holt die neueste Version aus Gitea und startet automatisch neu (~10 Sek).</span></span> <span class="qa-arrow">›</span></button> <button class="qa"><span class="qa-ic blue">⚡</span> <span class="qa-main"><span class="qa-t">LLM-Engine aktualisieren</span><span class="qa-s">Lädt die neueste llama.cpp-Version (ROCm) für deine GPU.</span></span> <span class="qa-arrow">›</span></button> <button class="qa"><span class="qa-ic amber">🗄</span> <span class="qa-main"><span class="qa-t">Grafikspeicher leeren</span><span class="qa-s">Wirft alle aktuell geladenen Modelle aus dem VRAM. Fragt vorher nach.</span></span> <span class="qa-arrow">›</span></button></div> <div class="card"><div class="card-h"><h3>Betriebssystem (Bosgame)</h3></div> <div class="card-sub">Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.</div> <button class="qa"><span class="qa-ic amber">↻</span> <span class="qa-main"><span class="qa-t">OS-Updates installieren</span><span class="qa-s">Führt apt update & upgrade aus. Kann ein paar Minuten dauern.</span></span> <span class="qa-arrow">›</span></button> <button class="qa qa-danger"><span class="qa-ic red">⚡</span> <span class="qa-main"><span class="qa-t">Server neustarten (Reboot)</span><span class="qa-s">Bootet den ganzen Bosgame neu. Alles ist für ~1 Minute offline.</span></span> <span class="qa-arrow">›</span></button></div> <!> <div class="card"><div class="card-h"><h3>Live-Konsole</h3> <select style="margin:0 0 0 auto;width:240px"><option>LLM-Engine (llama-swap)</option><option>Dashboard (mission-control)</option><option>System (ganzer Server)</option></select></div> <div class="card-sub">Live mitlesen, was der Dienst gerade tut.</div> <div class="console"> </div></div>',1);function Hd(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>da.value);let i=null,o=R(`Verbinde…
|
||
`),d=R("llama-swap"),c,u=R(null),v=R("");const g=new Set,E=O(()=>n(u)?n(r).find(S=>S.id===n(u)):null);Ti(()=>{if(!n(E))return;const S=n(E),H=S.state==="done",le=S.state==="failed",Je=S.state==="canceled";(H||le||Je)&&!g.has(S.id)&&(g.add(S.id),ee(H?`✓ ${n(v)} abgeschlossen.`:Je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,le),H&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(S,H){h(u,S,!0),h(v,H,!0),da.track(S)}mr(()=>{x()}),Io(()=>{i==null||i.close()});function x(){i==null||i.close();const S=n(d);h(o,`Verbinde mit ${S}…
|
||
`);const H=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${H}//${location.host}/api/logs/${S}?token=${encodeURIComponent(el())}`),i.onmessage=le=>{h(o,n(o)+le.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{h(o,n(o)+`
|
||
— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(S,H,le){if(await xn({title:H,body:le,confirmLabel:"Neustarten"}))try{await Se(`/api/service/${S}/restart`,{method:"POST"}),ee("Neustart ausgelöst: "+S),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(Je){ee(Je.message,!0)}}async function L(){if(await xn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const S=await Se("/api/self-update",{method:"POST"});ee("Update läuft — Dashboard startet gleich neu."),p(S.job_id,"Mission Control Update")}catch(S){ee(S.message,!0)}}async function k(){if(await xn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const S=await Se("/api/update",{method:"POST"});ee("LLM-Engine-Update läuft."),p(S.job_id,"LLM-Engine-Update")}catch(S){ee(S.message,!0)}}async function P(){if(await xn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await Se("/api/unload",{method:"POST"}),ee("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(S){ee(S.message,!0)}}async function ye(){if(!await xn({title:"OS-Updates installieren?",body:"Führt <code>apt update & upgrade</code> aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const S=await Wi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(S)try{const H=await Se("/api/os-update",{method:"POST",body:JSON.stringify({password:S})});ee("OS-Update gestartet."),p(H.job_id,"OS-Update")}catch(H){ee(H.message,!0)}}async function te(){if(!await xn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const S=await Wi({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(S)try{await Se("/api/reboot",{method:"POST",body:JSON.stringify({password:S})}),ee("Reboot ausgelöst — bis gleich.")}catch(H){ee(H.message,!0)}}async function ue(){h(Te,"prüfe…");try{const S=await Se("/api/integration/test");h(Te,S.ok?`✓ Engine antwortet — ${S.models.length} Modell(e): ${S.models.join(", ")}`:`✗ keine Verbindung: ${S.error}`,!0),h(K,S.ok,!0)}catch(S){h(Te,"✗ "+S.message),h(K,!1)}}let Te=R(""),K=R(!1);const V=O(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),fe=["running","ready","loading","starting"],he=O(()=>n(V).find(S=>fe.includes(S.state)));function Pe(S){if(!S||S.state!=="running")return null;if(typeof S.progress=="number")return Math.min(100,S.progress);const le=((S.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var Ve=Ud(),mt=s(ct(Ve),2),T=l(mt),W=s(l(T),2),re=l(W),Ue=s(T,4),Q=l(Ue),ze=s(l(Q)),Y=l(ze),rt=s(Q,2),D=s(l(rt),2),U=l(D),ie=s(rt,2),ge=s(l(ie),2),Ae=l(ge),bt=s(Ue,2),pt=l(bt),kt=s(pt,2);{var Ct=S=>{var H=qd(),le=l(H);z(()=>{pn(H,`color:${n(K)?"#7ee29a":"#ff9b95"}`),b(le,n(Te))}),m(S,H)};I(kt,S=>{n(Te)&&S(Ct)})}var Mt=s(mt,2),Lt=s(l(Mt),4),Ot=s(Lt,2),qt=s(Ot,2),$=s(qt,2),N=s($,2),Ce=s(Mt,2),ut=s(l(Ce),4),F=s(ut,2),De=s(Ce,2);{var J=S=>{const H=O(()=>n(E)),le=O(()=>n(H).state==="done"),Je=O(()=>n(H).state==="failed"),Qe=O(()=>n(H).state==="canceled"),Qt=O(()=>n(le)||n(Je)||n(Qe)),Zt=O(()=>Pe(n(H)));var Ht=Vd(),M=l(Ht),G=s(l(M),2);{var Oe=Ke=>{var ht=Bd();C("click",ht,async()=>{await xn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Se(`/api/jobs/${n(H).id}/cancel`,{method:"POST"})}),m(Ke,ht)};I(G,Ke=>{n(Qt)||Ke(Oe)})}var ne=s(G,2),Be=l(ne);{var Ze=Ke=>{var ht=Id();m(Ke,ht)},et=Ke=>{var ht=Fd();m(Ke,ht)},Me=Ke=>{var ht=Nd();m(Ke,ht)},$e=Ke=>{var ht=Kd();m(Ke,ht)};I(Be,Ke=>{n(le)?Ke(Ze):n(Je)?Ke(et,1):n(Qe)?Ke(Me,2):Ke($e,-1)})}var Re=s(M,2),Rt=l(Re),Bt=s(Re,2);{var Wt=Ke=>{var ht=Gd(),Rn=l(ht);z(()=>pn(Rn,`width:${n(Zt)??""}%`)),m(Ke,ht)};I(Bt,Ke=>{n(Zt)!=null&&!n(Qt)&&Ke(Wt)})}var an=s(Bt,2),bn=l(an);z(Ke=>{b(Rt,`${n(v)??""}${n(Qt)?n(le)?" — erfolgreich.":n(Qe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Ke)},[()=>(n(H).log||[]).join(`
|
||
`)]),m(S,Ht)};I(De,S=>{n(E)&&S(J)})}var de=s(De,2),se=l(de),Z=s(l(se),2),be=l(Z);be.value=be.__value="llama-swap";var ve=s(be);ve.value=ve.__value="mission-control";var xe=s(ve);xe.value=xe.__value="system";var ke=s(se,4),_e=l(ke);Bo(ke,S=>c=S,()=>c),z(S=>{var H,le,Je;pn(W,`margin-left:auto;${(H=n(a))!=null&&H.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),b(re,(le=n(a))!=null&&le.swap_ok?"● erreichbar":"● offline"),b(Y,(((Je=n(a))==null?void 0:Je.swap_url)||"—")+"/v1"),b(U,n(he)?n(he).name+` (${n(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Ae,S),b(_e,n(o))},[()=>n(V).filter(S=>!S.incomplete).length||"keine"]),C("click",pt,ue),C("click",Lt,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),C("click",Ot,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),C("click",qt,L),C("click",$,k),C("click",N,P),C("click",ut,ye),C("click",F,te),C("change",Z,x),ar(Z,()=>n(d),S=>h(d,S)),m(e,Ve),aa()}xa(["click","change"]);var Wd=y('<div class="empty" style="text-align:center;padding:30px">Lade Setups…</div>'),jd=y('<span title="Setup bearbeiten" style="position:absolute;top:10px;right:36px;color:var(--accent);cursor:pointer;font-size:14px;line-height:1" role="button" tabindex="0">✎</span> <span title="Setup löschen" style="position:absolute;top:9px;right:12px;color:var(--err);cursor:pointer;font-size:18px;line-height:1" role="button" tabindex="0">×</span>',1),Xr=y('<div class="cb-best-tag">★ Beste Wahl für dein System</div>'),Jd=y('<div class="cb-best-tag" style="background:var(--act);color:#fff">Dein Setup</div>'),Qd=y('<button style="text-align:left;position:relative"><!> <!> <div class="flex justify-between items-center"><span class="flex items-center gap-2"><h3 style="margin:0;font-size:15px"> </h3></span> <span> </span></div> <p> </p> <div class="text-xs text-mut"> </div></button>'),Zd=y('<div id="cb-recipes" class="grid grid-3" style="gap:10px;margin-top:6px"></div>'),Yd=y('<span style="color:var(--warn)">· ⚠ Cache veraltet</span>'),Xd=y("<!> <!>",1),ec=y('<div class="empty" style="text-align:center;padding:30px">Frage Quellen ab…</div>'),tc=y('<div class="li-sub" style="color:var(--warn);margin-top:3px"> </div>'),nc=y('<span class="fit-badge ok">✓ installiert</span>'),ac=y('<button class="primary" style="padding:6px 12px;font-size:12.5px">Installieren</button>'),rc=y('<div style="display:flex;flex-direction:column;position:relative"><!> <div class="flex justify-between" style="align-items:flex-start;gap:8px"><div style="min-width:0"><h3 style="margin:0;font-size:14px;font-weight:500;word-break:break-word"> </h3> <div class="text-xs text-mut" style="margin-top:3px"> </div></div> <span> </span></div> <div class="flex gap-2" style="flex-wrap:wrap;margin-top:7px"><!> <!></div> <div class="mono-sm text-mut" style="margin-top:8px;font-size:11.5px"> </div> <!> <div style="flex:1;min-height:8px"></div> <div class="flex justify-end" style="margin-top:10px"><!></div></div>'),ic=y('<div style="margin-bottom:8px"><div class="flex items-center gap-2" style="margin:6px 0 8px"><h4 style="margin:0;font-size:13.5px;font-weight:600"> </h4></div> <div class="grid grid-3"></div></div>'),sc=y('<button style="padding:4px 10px;border-radius:999px;font-size:12px"> </button>'),lc=y('<div style="display:flex;flex-direction:column;cursor:pointer"><!> <div class="flex justify-between" style="align-items:flex-start;gap:8px"><div style="min-width:0"><h3 style="margin:0;font-size:14.5px;font-weight:500;word-break:break-word"> </h3> <div class="text-xs text-mut" style="margin-top:3px"> </div></div> <span> </span></div> <div class="flex gap-2" style="flex-wrap:wrap;margin-top:7px"><!> <!></div> <div style="flex:1;margin-top:12px"></div> <div class="flex justify-between items-center text-xs text-mut" style="border-top:1px solid var(--line);padding-top:11px"><span class="mono-sm"> </span> <span class="mono-sm"> </span></div></div>'),oc=y('<div class="grid grid-3" id="cb-grid"></div>'),dc=y('<div class="li-sub"> </div>'),cc=y('<div class="li-sub mono-sm"> </div>'),uc=y("<span> </span>"),vc=y('<div class="li" style="align-items:flex-start"><div class="li-main"><div class="flex items-center gap-2" style="flex-wrap:wrap"><span class="li-id"> </span> <span class="tag text"> </span> <!></div> <!> <!></div> <!></div>'),fc=y('<div class="hint" style="margin:12px 0">Größter Spitzenbedarf: <b> </b>. Es läuft immer nur <b>ein</b> Modell gleichzeitig — das größte bestimmt, ob das Setup passt.</div>'),pc=y('Alternative: <a href="#" style="color:var(--accent)"> </a> — passt auf dein System.',1),hc=y('<div class="hint" style="color:var(--warn);margin-bottom:10px;border-left:2px solid var(--warn);padding-left:10px">⚠ Dieses Setup übersteigt deinen verfügbaren Speicher. <!></div>'),gc=y('<div class="modal-overlay" role="dialog"><div class="modal-card" style="max-width:560px"><button class="ghost" style="position:absolute;top:14px;right:14px">Schließen</button> <h3> </h3> <p class="text-mut text-sm" style="margin:-4px 0 16px"> </p> <div class="list"></div> <!> <!> <button id="cb-r-install-btn" style="width:100%"> </button></div></div>'),mc=y('<div class="hint">Lade Dateien von HuggingFace…</div>'),Yi=y("<option> </option>"),bc=y('<div class="hint" style="margin:-6px 0 14px">Empfohlener Kontext für deine Hardware: <b> </b> — <a href="#">übernehmen</a></div>'),_c=y('<div class="tile" style="display:flex;justify-content:space-between;align-items:center;margin:8px 0 18px"><div><div style="font-size:13px">Ressourcen-Check</div> <div class="hint" style="margin:4px 0 0"> </div></div> <span> </span></div>'),wc=y('<div class="hint" style="color:var(--warn);margin:-8px 0 14px;border-left:2px solid var(--warn);padding-left:10px">⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: <a href="#" style="color:var(--accent)"> </a> — einfach auswählen.</div>'),yc=y('<div class="hint" style="color:var(--warn);margin:-8px 0 14px;border-left:2px solid var(--warn);padding-left:10px">⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.</div>'),xc=y('<label>Quantisierung (GGUF-Datei) wählen</label> <select></select> <div class="row" style="margin-top:4px"><div><label>Rolle (optional)</label> <input placeholder="z.B. coder, vision, scout"/></div> <div><label>Kontext-Größe <!></label> <input type="number"/></div></div> <!> <!> <!> <button style="width:100%"> </button>',1),kc=y('<div class="hint">Keine GGUF-Dateien im Repo gefunden.</div>'),Mc=y('<div class="modal-overlay" role="dialog"><div class="modal-card" style="max-width:560px"><button class="ghost" style="position:absolute;top:14px;right:14px">Schließen</button> <h3> </h3> <p class="mono-sm" style="margin:-4px 0 16px"> </p> <!></div></div>'),Sc=y('<div class="flex gap-2" style="margin-bottom:8px;align-items:center"><input placeholder="Repo, z.B. unsloth/Qwen3-8B-GGUF" style="flex:2;margin:0"/> <input placeholder="Rolle (z.B. coder)" style="flex:1;margin:0"/> <select style="width:auto;margin:0"></select> <button class="ghost del" style="margin:0;padding:6px 10px">×</button></div>'),Ec=y('<div class="modal-overlay" role="dialog"><div class="modal-card" style="max-width:640px"><button class="ghost" style="position:absolute;top:14px;right:14px">Schließen</button> <h3> </h3> <p class="text-mut text-sm" style="margin:-4px 0 16px">Stell dir aus beliebigen Modellen ein eigenes Setup zusammen.</p> <label>Titel</label> <input placeholder="z.B. Mein Schreib-Stack"/> <label>Kurzbeschreibung (optional)</label> <input placeholder="Wofür ist dieses Setup gut?"/> <label style="margin-top:10px">Modelle</label> <!> <button class="ghost" style="margin-top:8px">+ Modell hinzufügen</button> <div class="hint" style="margin-top:10px">Die <b>Repo-ID</b> findest du über die <b>Profi-Suche</b> weiter unten (z.B. <code>unsloth/Qwen3-8B-GGUF</code>).</div> <button class="primary" style="width:100%;margin-top:14px"> </button></div></div>'),Tc=y('<div class="pagehead"><div><h1>Cookbook</h1><div class="sub">Modelle finden, installieren und eigene Setups zusammenstellen.</div></div></div> <div class="card"><div class="card-h"><h3>1 · Anwendungsfall wählen & installieren</h3> <button class="ghost" style="margin-left:auto">+ Eigenes Setup</button></div> <div class="card-sub">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.</div> <!></div> <div class="card"><div class="card-h"><h3>Aktuell die besten Modelle für dein System</h3> <span class="meta" style="margin-left:auto"><!></span> <button class="ghost" style="margin-left:8px"> </button></div> <div class="card-sub">Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.</div> <!></div> <div class="card"><div class="card-h"><h3>Profi-Suche (HuggingFace)</h3></div> <div class="card-sub">Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.</div> <div class="flex gap-2" style="align-items:stretch;margin-bottom:10px"><input placeholder="Suchbegriff oder HuggingFace-URL…" style="flex:1;margin:0"/> <select style="width:auto;margin:0"><option>Downloads</option><option>Trending</option><option>Neu</option></select> <button class="primary"> </button></div> <div class="flex gap-2" style="flex-wrap:wrap;margin-bottom:12px"></div> <!></div> <!> <!> <!>',1);function Ac(e,t){na(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(w){const _=(w||"").toLowerCase();for(const B of d)if(B.kw.some(q=>_.includes(q)))return B.label;return"Allrounder"}function u(w=""){const _=w.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(_)||new RegExp("(?<![a-z])a\\d+(\\.\\d+)?b\\b").test(_)||_.includes("mixtral")||/\bmoe\b/.test(_)}function v(w=""){const _=w.toLowerCase().match(new RegExp("(?<![a-z])a(\\d+(?:\\.\\d+)?)b\\b"));return _?_[1]:null}function g(w){return w==="perfect"?"ok":w==="marginal"?"warn":"bad"}function E(w){return w==="perfect"?"Passt":w==="marginal"?"Knapp":"Zu groß"}function p(w){return`~${(w.req_gb??0).toFixed(1)} GB · ~${Math.round(w.tps??0)} Tok/s`}let x=R(Ut([])),A=R(null),L=R(!0),k=R(null),P=R(!1),ye=R(!1),te=R(""),ue=R(Ut([])),Te=R(!1),K=R(""),V=R("downloads"),fe=R(Ut([])),he=R(-1),Pe=R(null),Ve=R(!1),mt=R(""),T=R(""),W=R(null),re=R(""),Ue=R(""),Q=R(8192),ze=R(!1),Y=R(null),rt=R(!1),D=R(""),U=R(""),ie=R(Ut([{repo:"",role:"",quant:"Q4_K_M"}])),ge=R(null);function Ae(w){var _;(_=document.querySelector(`.nav-item[data-view="${w}"]`))==null||_.dispatchEvent(new MouseEvent("click"))}mr(()=>{bt(),pt()});async function bt(){h(L,!0);try{const w=await Se("/api/cookbook/recipes");h(x,w.recipes||[],!0),h(A,w.recommended_id||null,!0)}catch(w){ee(w.message,!0)}h(L,!1)}async function pt(w=!1){h(P,!0);try{const _=await Se("/api/cookbook/discover"+(w?"?force=true":""));h(k,_,!0),h(ye,_.stale,!0)}catch(_){ee("Empfehlungen nicht ladbar: "+_.message,!0)}h(P,!1)}function kt(w){w=w.trim();const _=w.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return _?_[1]:/^[\w.-]+\/[\w.-]+$/.test(w)?w:null}async function Ct(){const w=n(te).trim(),_=kt(w);let B=w;if(n(K)&&!_&&(B=B?B+" "+n(K):n(K)),!B&&!_){h(ue,[],!0);return}h(Te,!0),h(fe,[],!0),h(he,-1);try{if(_)h(ue,[{id:_,author:_.split("/")[0],downloads:0}],!0);else{const q=`https://huggingface.co/api/models?search=${encodeURIComponent(B)}&filter=gguf&sort=${encodeURIComponent(n(V))}&direction=-1&limit=40`,ae=await fetch(q);h(ue,await ae.json(),!0)}n(ue).forEach((q,ae)=>Mt(ae,q.id))}catch(q){ee(q.message,!0),h(ue,[],!0)}h(Te,!1)}async function Mt(w,_){var B;try{const q=await Se("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})});if(!((B=q.files)!=null&&B.length)){n(fe)[w]=null,Lt();return}const ae=q.files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||q.files[0];n(fe)[w]=ae.fit.level,Lt()}catch{n(fe)[w]=null,Lt()}}function Lt(){let w=-1,_=99;n(fe).forEach((B,q)=>{if(B==null)return;const ae=i[B]??99;ae<_&&(_=ae,w=q)}),h(he,w>=0&&_<=1?w:-1,!0)}function Ot(w){h(Pe,n(x).find(_=>_.id===w),!0)}async function qt(w){const _=document.getElementById("cb-r-install-btn");_&&(_.disabled=!0,_.textContent="Starte…");try{const B=await Se("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:w,hf_token:ir()})});ee(`${B.count} Download${B.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),h(Pe,null),Ae("activity")}catch(B){ee(B.message,!0),_&&(_.disabled=!1,_.textContent="Installieren")}}async function $(w,_){var B,q;h(Ve,!0),h(mt,_,!0),h(T,w,!0),h(Ue,""),h(Q,8192),h(W,null),h(Y,null),h(re,""),h(ze,!0);try{if(h(W,await Se("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})}),!0),(q=(B=n(W))==null?void 0:B.files)!=null&&q.length){const ae=n(W).files.find(tt=>{var it;return(it=tt.quant)==null?void 0:it.includes("Q4_K_M")})||n(W).files[0];h(re,ae.filename,!0),ae.optimal_ctx&&n(Q)===8192&&h(Q,ae.optimal_ctx,!0),N()}}catch(ae){ee(ae.message,!0)}h(ze,!1)}function N(){var w,_,B;!((_=(w=n(W))==null?void 0:w.files)!=null&&_.length)||!n(re)||(h(Y,n(W).files.find(q=>q.filename===n(re))||null,!0),(B=n(Y))!=null&&B.optimal_ctx&&n(Q)===8192&&h(Q,n(Y).optimal_ctx,!0))}async function Ce(){var w,_;if(!n(T)||!n(re))return ee("Bitte eine GGUF-Datei wählen.",!0);h(ze,!0);try{const B=((w=n(W))==null?void 0:w.params_b)??7,q=((_=n(Y))==null?void 0:_.quant)??"Q4_K_M";await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:n(T),role:n(Ue),params_b:B,quant:q,file:n(re),ctx:n(Q),hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),h(Ve,!1),Ae("activity")}catch(B){ee("Fehler: "+B.message,!0)}h(ze,!1)}async function ut(w,_,B,q){q.disabled=!0,q.textContent="Starte…";try{await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:w,role:_,params_b:B,quant:"Q4_K_M",hf_token:ir()})}),ee("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Ae("activity")}catch(ae){ee(ae.message,!0),q.disabled=!1,q.textContent="Installieren"}}function F(){h(ge,null),h(D,""),h(U,""),h(ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),h(rt,!0)}function De(w){const _=n(x).find(B=>B.id===w);_&&(h(ge,w,!0),h(D,_.title,!0),h(U,_.desc||"",!0),h(ie,_.models.map(B=>({repo:B.repo,role:B.role,quant:B.quant||"Q4_K_M"})),!0),h(rt,!0))}async function J(){if(!n(D).trim())return ee("Bitte einen Titel angeben.",!0);const w=n(ie).filter(_=>_.repo.trim());if(!w.length)return ee("Mindestens ein Modell (Repo) angeben.",!0);try{n(ge)?(await Se("/api/cookbook/user-recipe/"+encodeURIComponent(n(ge)),{method:"PUT",body:JSON.stringify({title:n(D),desc:n(U),models:w})}),ee("Setup aktualisiert.")):(await Se("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(D),desc:n(U),models:w})}),ee("Setup gespeichert.")),h(rt,!1),bt()}catch(_){ee(_.message,!0)}}async function de(w){const _=n(x).find(B=>B.id===w);if(await xn({title:`„${(_==null?void 0:_.title)||w}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await Se("/api/cookbook/user-recipe/"+encodeURIComponent(w),{method:"DELETE"}),ee("Setup gelöscht."),bt()}catch(B){ee(B.message,!0)}}function se(w){if(!u(w))return"";const _=v(w);return`<span class="chip" title="${zn(r)}">MoE${_?` · ~${_}B aktiv`:""}</span>`}function Z(w){return w?`<span class="chip">${zn(w)}</span>`:""}var be=Tc(),ve=s(ct(be),2),xe=l(ve),ke=s(l(xe),2),_e=s(xe,4);{var S=w=>{var _=Wd();m(w,_)},H=w=>{var _=Zd();dt(_,21,()=>n(x),ot,(B,q)=>{const ae=O(()=>n(q).id===n(A));var tt=Qd(),it=l(tt);{var X=pe=>{var Ye=jd(),Ft=ct(Ye),Tt=s(Ft,2);C("click",Ft,_t=>{_t.stopPropagation(),De(n(q).id)}),C("keydown",Ft,_t=>{_t.key==="Enter"&&(_t.stopPropagation(),De(n(q).id))}),C("click",Tt,_t=>{_t.stopPropagation(),de(n(q).id)}),C("keydown",Tt,_t=>{_t.key==="Enter"&&(_t.stopPropagation(),de(n(q).id))}),m(pe,Ye)};I(it,pe=>{n(q).user&&pe(X)})}var me=s(it,2);{var qe=pe=>{var Ye=Xr();m(pe,Ye)},vt=pe=>{var Ye=Jd();m(pe,Ye)};I(me,pe=>{n(ae)?pe(qe):n(q).user&&pe(vt,1)})}var Ie=s(me,2),Ge=l(Ie),st=l(Ge),St=l(st),Yt=s(Ge,2),ft=l(Yt),Fe=s(Ie,2),Et=l(Fe),It=s(Fe,2),gt=l(It);z((pe,Ye)=>{yt(tt,1,`card-btn${n(ae)?" cb-best":""}`),b(St,n(q).title),yt(Yt,1,`fit-badge ${pe??""}`),b(ft,Ye),b(Et,n(q).desc),b(gt,`${n(q).models.length??""} Modell${n(q).models.length>1?"e":""} im Setup`)},[()=>g(n(q).fit_level),()=>E(n(q).fit_level)]),C("click",tt,()=>Ot(n(q).id)),m(B,tt)}),m(w,_)};I(_e,w=>{n(L)?w(S):w(H,-1)})}var le=s(ve,2),Je=l(le),Qe=s(l(Je),2),Qt=l(Qe);{var Zt=w=>{const _=O(()=>Math.round((Date.now()/1e3-n(k).updated)/60));var B=Xd(),q=ct(B);{var ae=qe=>{var vt=nr();z(()=>b(vt,`Quellen befragt vor ${n(_)??""} min`)),m(qe,vt)},tt=qe=>{var vt=nr();z(Ie=>b(vt,`Quellen befragt vor ${Ie??""} h`),[()=>Math.round(n(_)/60)]),m(qe,vt)},it=qe=>{var vt=nr();z(Ie=>b(vt,`Quellen befragt vor ${Ie??""} Tg.`),[()=>Math.round(n(_)/1440)]),m(qe,vt)};I(q,qe=>{n(_)<60?qe(ae):n(_)<1440?qe(tt,1):qe(it,-1)})}var X=s(q,2);{var me=qe=>{var vt=Yd();m(qe,vt)};I(X,qe=>{n(ye)&&qe(me)})}m(w,B)};I(Qt,w=>{var _;(_=n(k))!=null&&_.updated&&w(Zt)})}var Ht=s(Qe,2),M=l(Ht),G=s(Je,4);{var Oe=w=>{var _=ec();m(w,_)},ne=w=>{var _=or(),B=ct(_);dt(B,17,()=>n(k).categories,ot,(q,ae)=>{var tt=ic(),it=l(tt),X=l(it),me=l(X),qe=s(it,2);dt(qe,21,()=>n(ae).models,ot,(vt,Ie)=>{const Ge=O(()=>n(ae).recommended&&n(Ie).repo===n(ae).recommended);var st=rc(),St=l(st);{var Yt=Xe=>{var at=Xr();m(Xe,at)};I(St,Xe=>{n(Ge)&&Xe(Yt)})}var ft=s(St,2),Fe=l(ft),Et=l(Fe),It=l(Et),gt=s(Et,2),pe=l(gt),Ye=s(Fe,2),Ft=l(Ye),Tt=s(ft,2),_t=l(Tt);Le(_t,()=>Z(o[n(Ie).role]||c(n(Ie).repo)));var qn=s(_t,2);Le(qn,()=>se(n(Ie).repo));var Hn=s(Tt,2),En=l(Hn),ka=s(Hn,2);dt(ka,17,()=>n(Ie).requirements||[],ot,(Xe,at)=>{var $t=tc(),Tn=l($t);z(()=>b(Tn,`⚠ ${n(at)??""}`)),m(Xe,$t)});var lt=s(ka,4),He=l(lt);{var nt=Xe=>{var at=nc();z(()=>Nr(at,"title",`bereits eingerichtet als ${n(Ie).installed??""}`)),m(Xe,at)},wt=Xe=>{var at=ac();C("click",at,$t=>ut(n(Ie).repo,n(Ie).role,n(Ie).params_b,$t.currentTarget)),m(Xe,at)};I(He,Xe=>{n(Ie).installed?Xe(nt):Xe(wt,-1)})}z((Xe,at,$t)=>{yt(st,1,`card${n(Ge)?" res-best":""}`),b(It,n(Ie).name),b(pe,`${n(Ie).author??""} · ${n(Ie).params_b??""}B`),yt(Ye,1,`fit-badge ${Xe??""}`),b(Ft,n(Ie).fit.text),b(En,`${at??""} · ⬇ ${$t??""}`)},[()=>g(n(Ie).fit.level),()=>p(n(Ie).fit),()=>(n(Ie).downloads||0).toLocaleString()]),m(vt,st)}),z(()=>b(me,n(ae).title)),m(q,tt)}),m(w,_)};I(G,w=>{var _;n(P)&&!n(k)?w(Oe):(_=n(k))!=null&&_.categories&&w(ne,1)})}var Be=s(le,2),Ze=s(l(Be),4),et=l(Ze),Me=s(et,2),$e=l(Me);$e.value=$e.__value="downloads";var Re=s($e);Re.value=Re.__value="trending";var Rt=s(Re);Rt.value=Rt.__value="created_at";var Bt=s(Me,2),Wt=l(Bt),an=s(Ze,2);dt(an,20,()=>["","coder","vision","reasoning","chat","agent"],ot,(w,_)=>{var B=sc(),q=l(B);z(()=>{yt(B,1,n(K)===_?"primary":"ghost"),b(q,_||"Alle")}),C("click",B,()=>{h(K,_,!0),Ct()}),m(w,B)});var bn=s(an,2);{var Ke=w=>{var _=oc();dt(_,21,()=>n(ue),ot,(B,q,ae)=>{var tt=lc(),it=l(tt);{var X=Tt=>{var _t=Xr();m(Tt,_t)};I(it,Tt=>{ae===n(he)&&Tt(X)})}var me=s(it,2),qe=l(me),vt=l(qe),Ie=l(vt),Ge=s(vt,2),st=l(Ge),St=s(qe,2),Yt=l(St),ft=s(me,2),Fe=l(ft);Le(Fe,()=>Z(c(n(q).id)));var Et=s(Fe,2);Le(Et,()=>se(n(q).id));var It=s(ft,4),gt=l(It),pe=l(gt),Ye=s(gt,2),Ft=l(Ye);z((Tt,_t,qn,Hn,En)=>{yt(tt,1,`card${ae===n(he)?" res-best":""}`),b(Ie,Tt),b(st,n(q).author||""),yt(St,1,`fit-badge ${_t??""}`),b(Yt,qn),b(pe,Hn),b(Ft,`⬇ ${En??""}`)},[()=>n(q).id.split("/").pop(),()=>n(fe)[ae]?g(n(fe)[ae]):"warn",()=>n(fe)[ae]?E(n(fe)[ae]):"prüfe…",()=>n(fe)[ae]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(q).downloads||0).toLocaleString()]),C("click",tt,()=>$(n(q).id,n(q).id.split("/").pop())),m(B,tt)}),m(w,_)};I(bn,w=>{n(ue).length&&w(Ke)})}var ht=s(Be,2);{var Rn=w=>{const _=O(()=>n(Pe));var B=gc(),q=l(B),ae=l(q),tt=s(ae,2),it=l(tt),X=s(tt,2),me=l(X),qe=s(X,2);dt(qe,21,()=>n(_).models,ot,(ft,Fe)=>{var Et=vc(),It=l(Et),gt=l(It),pe=l(gt),Ye=l(pe),Ft=s(pe,2),Tt=l(Ft),_t=s(Ft,2);Le(_t,()=>se(n(Fe).repo));var qn=s(gt,2);{var Hn=nt=>{var wt=dc(),Xe=l(wt);z(()=>b(Xe,n(Fe).why)),m(nt,wt)};I(qn,nt=>{n(Fe).why&&nt(Hn)})}var En=s(qn,2);{var ka=nt=>{var wt=cc(),Xe=l(wt);z((at,$t,Tn)=>b(Xe,`~${at??""} GB · ~${$t??""} Tok/s · optimal ~${Tn??""}k Kontext`),[()=>(n(Fe).fit.req_gb??0).toFixed(1),()=>Math.round(n(Fe).fit.tps??0),()=>Math.round((n(Fe).optimal_ctx||8192)/1024)]),m(nt,wt)};I(En,nt=>{n(Fe).fit&&nt(ka)})}var lt=s(It,2);{var He=nt=>{var wt=uc(),Xe=l(wt);z(at=>{yt(wt,1,`fit-badge ${at??""}`),b(Xe,n(Fe).fit.text)},[()=>g(n(Fe).fit.level)]),m(nt,wt)};I(lt,nt=>{n(Fe).fit&&nt(He)})}z(()=>{b(Ye,n(Fe).name),b(Tt,n(Fe).role)}),m(ft,Et)});var vt=s(qe,2);{var Ie=ft=>{const Fe=O(()=>Math.max(...n(_).models.map(pe=>{var Ye;return((Ye=pe.fit)==null?void 0:Ye.req_gb)??0})));var Et=fc(),It=s(l(Et)),gt=l(It);z(pe=>b(gt,`~${pe??""} GB`),[()=>n(Fe).toFixed(1)]),m(ft,Et)};I(vt,ft=>{n(_).models.length&&n(_).models[0].fit&&ft(Ie)})}var Ge=s(vt,2);{var st=ft=>{const Fe=O(()=>n(x).find(pe=>!pe.user&&pe.fit_level!=="too_tight"&&pe.id!==n(_).id));var Et=hc(),It=s(l(Et));{var gt=pe=>{var Ye=pc(),Ft=s(ct(Ye)),Tt=l(Ft);z(()=>b(Tt,`„${n(Fe).title??""}" ansehen`)),C("click",Ft,_t=>{_t.preventDefault(),h(Pe,null),setTimeout(()=>Ot(n(Fe).id),50)}),m(pe,Ye)};I(It,pe=>{n(Fe)&&pe(gt)})}m(ft,Et)};I(Ge,ft=>{n(_).fit_level==="too_tight"&&ft(st)})}var St=s(Ge,2),Yt=l(St);z(()=>{b(it,n(_).title),b(me,n(_).desc),yt(St,1,`primary${n(_).fit_level==="too_tight"?" warn":""}`),b(Yt,n(_).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),C("click",B,ft=>{ft.target.classList.contains("modal-overlay")&&h(Pe,null)}),C("click",ae,()=>h(Pe,null)),C("click",St,()=>qt(n(_).id)),m(w,B)};I(ht,w=>{n(Pe)&&w(Rn)})}var Vn=s(ht,2);{var ra=w=>{var _=Mc(),B=l(_),q=l(B),ae=s(q,2),tt=l(ae),it=s(ae,2),X=l(it),me=s(it,2);{var qe=Ge=>{var st=mc();m(Ge,st)},vt=Ge=>{var st=xc(),St=s(ct(st),2);dt(St,21,()=>n(W).files,ot,(lt,He)=>{const nt=O(()=>n(He).fit.level==="perfect"?"●":n(He).fit.level==="marginal"?"◐":"○");var wt=Yi(),Xe=l(wt),at={};z(()=>{b(Xe,`${n(nt)??""} ${n(He).filename??""}`),at!==(at=n(He).filename)&&(wt.value=(wt.__value=n(He).filename)??"")}),m(lt,wt)});var Yt=s(St,2),ft=l(Yt),Fe=s(l(ft),2),Et=s(ft,2),It=l(Et),gt=s(l(It));Le(gt,()=>gi(a));var pe=s(It,2),Ye=s(Yt,2);{var Ft=lt=>{var He=bc(),nt=s(l(He)),wt=l(nt),Xe=s(nt,2);z(at=>b(wt,`~${at??""}k`),[()=>Math.round(n(Y).optimal_ctx/1024)]),C("click",Xe,at=>{at.preventDefault(),h(Q,n(Y).optimal_ctx,!0)}),m(lt,He)};I(Ye,lt=>{var He;(He=n(Y))!=null&&He.optimal_ctx&<(Ft)})}var Tt=s(Ye,2);{var _t=lt=>{var He=_c(),nt=l(He),wt=s(l(nt),2),Xe=l(wt),at=s(nt,2),$t=l(at);z((Tn,_r,Vr)=>{b(Xe,`~${Tn??""} GB · ~${_r??""} Tok/s · ${(n(Y).quant||"GGUF")??""}`),yt(at,1,`fit-badge ${Vr??""}`),b($t,n(Y).fit.text)},[()=>(n(Y).fit.req_gb??0).toFixed(1),()=>Math.round(n(Y).fit.tps??0),()=>g(n(Y).fit.level)]),m(lt,He)};I(Tt,lt=>{n(Y)&<(_t)})}var qn=s(Tt,2);{var Hn=lt=>{const He=O(()=>n(W).files.find($t=>$t.fit.level!=="too_tight"&&$t.filename!==n(re)));var nt=or(),wt=ct(nt);{var Xe=$t=>{var Tn=wc(),_r=s(l(Tn)),Vr=l(_r);z(Ur=>b(Vr,`${n(He).filename??""} (${Ur??""})`),[()=>E(n(He).fit.level)]),C("click",_r,Ur=>{Ur.preventDefault(),h(re,n(He).filename,!0),N()}),m($t,Tn)},at=$t=>{var Tn=yc();m($t,Tn)};I(wt,$t=>{n(He)?$t(Xe):$t(at,-1)})}m(lt,nt)};I(qn,lt=>{var He,nt;((He=n(Y))==null?void 0:He.fit.level)==="too_tight"&&((nt=n(W))!=null&&nt.files)&<(Hn)})}var En=s(qn,2),ka=l(En);z(()=>{var lt,He;yt(En,1,`primary${((lt=n(Y))==null?void 0:lt.fit.level)==="too_tight"?" warn":""}`),En.disabled=n(ze),b(ka,n(ze)?"Starte…":((He=n(Y))==null?void 0:He.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),C("change",St,N),ar(St,()=>n(re),lt=>h(re,lt)),An(Fe,()=>n(Ue),lt=>h(Ue,lt)),An(pe,()=>n(Q),lt=>h(Q,lt)),C("click",En,Ce),m(Ge,st)},Ie=Ge=>{var st=kc();m(Ge,st)};I(me,Ge=>{var st,St;n(ze)&&!n(W)?Ge(qe):(St=(st=n(W))==null?void 0:st.files)!=null&&St.length?Ge(vt,1):n(ze)||Ge(Ie,2)})}z(()=>{b(tt,n(mt)),b(X,n(T))}),C("click",_,Ge=>{Ge.target.classList.contains("modal-overlay")&&h(Ve,!1)}),C("click",q,()=>h(Ve,!1)),m(w,_)};I(Vn,w=>{n(Ve)&&w(ra)})}var Un=s(Vn,2);{var Ua=w=>{var _=Ec(),B=l(_),q=l(B),ae=s(q,2),tt=l(ae),it=s(ae,6),X=s(it,4),me=s(X,4);dt(me,17,()=>n(ie),ot,(Ge,st,St)=>{var Yt=Sc(),ft=l(Yt),Fe=s(ft,2),Et=s(Fe,2);dt(Et,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],ot,(gt,pe)=>{var Ye=Yi(),Ft=l(Ye),Tt={};z(()=>{b(Ft,pe),Tt!==(Tt=pe)&&(Ye.__value=pe)}),m(gt,Ye)});var It=s(Et,2);An(ft,()=>n(st).repo,gt=>n(st).repo=gt),An(Fe,()=>n(st).role,gt=>n(st).role=gt),ar(Et,()=>n(st).quant,gt=>n(st).quant=gt),C("click",It,()=>h(ie,n(ie).filter((gt,pe)=>pe!==St),!0)),m(Ge,Yt)});var qe=s(me,2),vt=s(qe,4),Ie=l(vt);z(()=>{b(tt,n(ge)?"Setup bearbeiten":"Eigenes Setup erstellen"),b(Ie,n(ge)?"Änderungen speichern":"Setup speichern")}),C("click",_,Ge=>{Ge.target.classList.contains("modal-overlay")&&h(rt,!1)}),C("click",q,()=>h(rt,!1)),An(it,()=>n(D),Ge=>h(D,Ge)),An(X,()=>n(U),Ge=>h(U,Ge)),C("click",qe,()=>h(ie,[...n(ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),C("click",vt,J),m(w,_)};I(Un,w=>{n(rt)&&w(Ua)})}z(()=>{Ht.disabled=n(P),b(M,n(P)?"Suche…":"Aktualisieren"),Bt.disabled=n(Te),b(Wt,n(Te)?"Lade…":"Suchen")}),C("click",ke,F),C("click",Ht,()=>pt(!0)),C("keydown",et,w=>w.key==="Enter"&&Ct()),An(et,()=>n(te),w=>h(te,w)),ar(Me,()=>n(V),w=>h(V,w)),C("click",Bt,Ct),m(e,be),aa()}xa(["click","keydown","change"]);var Cc=y(`<div class="alert warn" style="margin:0 0 12px"><span class="a-dot"></span> <span>Du öffnest Mission Control über einen <b>Proxy/Namen</b>. Die Engine läuft auf <b>Port 8080 ohne HTTPS</b> direkt am Bosgame.
|
||
Trag in deinen Tools die <b>LAN-IP</b> ein: <code>http://192.168.178.151:8080/v1</code> — nicht den Proxy-Namen.</span></div>`),$c=y('<span class="mono-sm"> </span>'),Lc=y('<div class="tile" style="display:flex;gap:12px;align-items:flex-start"><span style="font-size:20px;line-height:1;flex:0 0 auto"> </span> <div><div style="font-weight:500;font-size:13.5px"> </div> <div class="card-sub" style="margin:4px 0 0"> </div></div></div>'),Pc=y('<span class="chip" role="button" tabindex="0"> </span>'),zc=y('<div style="margin-top:10px"><a href="#" style="color:var(--mut);font-size:12.5px">Auswahl aufheben (alle)</a></div>'),Dc=y('<button style="text-align:left;padding:12px 16px"><div style="font-weight:500;font-size:13.5px"> </div> <div class="card-sub" style="margin:3px 0 0"> </div></button>'),Oc=y('<p>Öffne die Zed-Settings mit <code>Cmd/Strg + ,</code> und <b>füge diesen Block</b> in deine bestehende <code>settings.json</code> ein. Falls bereits ein <code>"bosgame"</code>-Eintrag existiert: vorher löschen.</p> <div class="alert warn" style="margin-bottom:12px;padding:10px 14px"><span class="a-dot"></span><span>Nur diesen Block einfügen, <b>nicht die ganze Datei ersetzen</b> — sonst gehen andere Einstellungen verloren.</span></div> <div style="position:relative"><button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1">Kopieren</button> <div class="log" style="max-height:none"><code> </code></div></div> <p style="margin-top:12px"><b>API-Key:</b> Öffne den Agent-Panel → Anbieter <b>bosgame</b> → trag irgendeinen Wert ein (z.B. <code>local</code>).</p> <div class="hint">Danach im Agent-Panel das Modell <b> </b> auswählen.</div>',1),Rc=y('<p>Datei anlegen oder öffnen:</p> <p class="mono-sm" style="line-height:1.6">Windows: <code>%USERPROFILE%\\.config\\opencode\\opencode.json</code></p> <div class="alert warn" style="margin:8px 0 12px;padding:10px 14px"><span class="a-dot"></span><span>Nur den <code>"provider"</code>-Block einfügen. Falls bereits ein <code>"llama-swap"</code>-Eintrag vorhanden: <b>vorher löschen</b>, sonst erscheinen Modelle doppelt.</span></div> <div style="position:relative"><button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1">Kopieren</button> <div class="log" style="max-height:none"><code> </code></div></div> <p style="margin-top:12px">Danach in OpenCode <code>/models</code> → <b> </b> wählen.</p>',1),qc=y('<p>In Cline/Cursor den Provider <b>„OpenAI Compatible"</b> wählen:</p> <label>Basis-URL</label> <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px"><input class="mono-sm" readonly="" style="flex:1;margin:0"/> <button class="ghost">Kopieren</button></div> <label>Modell-ID</label> <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px"><input class="mono-sm" readonly="" style="flex:1;margin:0"/> <button class="ghost">Kopieren</button></div> <div class="hint">API-Key: ein beliebiger Wert (z.B. <code>local</code>).</div>',1),Bc=y('<p>Settings → Admin Panel → Connections → neue OpenAI-Verbindung:</p> <label>Basis-URL</label> <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px"><input class="mono-sm" readonly="" style="flex:1;margin:0"/> <button class="ghost">Kopieren</button></div> <label>API-Key</label> <div class="flex gap-2" style="align-items:stretch"><input class="mono-sm" readonly="" value="dummy-key" style="flex:1;margin:0"/> <button class="ghost">Kopieren</button></div>',1),Ic=y('<div class="card"><div class="card-h"><h3>Bilder einbinden (Vision)</h3> <span class="chip" style="background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a"><!> </span></div> <div class="card-sub">Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.</div> <div style="position:relative;margin-top:8px"><button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1">Kopieren</button> <div class="log" style="max-height:none"><code> </code></div></div></div>'),Fc=y('<div class="card"><div class="card-h"><h3>2 · Modelle auswählen</h3> <span class="meta"> </span></div> <div class="card-sub">Wähle, welche Modelle im Config-Snippet erscheinen sollen.</div> <div class="flex gap-2" style="flex-wrap:wrap"></div> <!></div> <div class="card"><div class="card-h"><h3>3 · Tool wählen</h3></div> <div class="card-sub">Für welches Werkzeug brauchst du die Konfiguration?</div> <div class="grid grid-4" style="gap:8px"></div></div> <div class="card"><div class="card-h"><h3>4 · Config-Snippet</h3></div> <!></div> <!>',1),Nc=y('<div class="card"><div class="card-h"><h3>2 · Erst ein Modell installieren</h3></div> <div class="empty-c" style="padding:8px 0 4px"><div class="e-t">Noch kein Modell eingerichtet</div> <div class="e-s">Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.</div> <button class="primary" style="margin-top:14px">→ Zum Cookbook (Modell holen)</button></div></div>'),Kc=y('<div class="pagehead"><div><h1>Verbinden</h1> <div class="sub">Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.</div></div></div> <div class="card"><div class="card-h"><h3>1 · Verbindung prüfen</h3></div> <div class="card-sub">Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.</div> <label>Engine-Adresse (für alle Tools)</label> <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px"><input class="mono-sm" readonly="" style="flex:1;margin:0"/> <button class="ghost">Kopieren</button></div> <!> <div class="btn-row" style="display:flex;align-items:center;gap:10px"><button class="primary">Verbindung testen</button> <!></div></div> <div class="card"><div class="card-h"><h3>Wie funktioniert das Auto-Swap?</h3></div> <div style="display:flex;flex-direction:column;gap:10px"></div></div> <!>',1);function Gc(e,t){na(t,!0);const a=O(()=>br.value),r=O(()=>{var D;return(((D=n(a))==null?void 0:D.models)||[]).filter(U=>!U.incomplete)}),i=O(v);let o=R("zed"),d=R(Ut([])),c=R(""),u=R(!1);function v(){return`http://${location.hostname}:8080/v1`}function g(D){return/^\d{1,3}(\.\d{1,3}){3}$/.test(D)}function E(){return location.protocol==="https:"||!g(location.hostname)}const p=O(()=>n(d).length?n(d):n(r).map(D=>D.name)),x=O(()=>n(p)[0]||"coder"),A=O(()=>{var D;return(D=n(r).find(U=>{var ie,ge;return(ge=(ie=U.meta)==null?void 0:ie.caps)==null?void 0:ge.includes("Bild")}))==null?void 0:D.name});function L(D,U){const ge=(U.length?n(r).filter(Ae=>U.includes(Ae.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(Ae=>{var kt,Ct;const bt=(((kt=Ae.meta)==null?void 0:kt.caps)||[]).some(Mt=>/Bild|Vision/i.test(Mt)),pt=((Ct=Ae.meta)==null?void 0:Ct.ctx)||131072;return` { "name": "${Ae.name}", "display_name": "${Ae.name}", "max_tokens": ${pt}${bt?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
|
||
`);return`"language_models": {
|
||
"openai_compatible": {
|
||
"bosgame": {
|
||
"api_url": "${D}",
|
||
"available_models": [
|
||
${ge}
|
||
]
|
||
}
|
||
}
|
||
}`}function k(D,U){const ge=(U.length?n(r).filter(Ae=>U.includes(Ae.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(Ae=>{var pt;const bt=((pt=Ae.meta)==null?void 0:pt.ctx)||131072;return` "${Ae.name}": { "name": "${Ae.name}", "contextWindowSize": ${bt} }`}).join(`,
|
||
`);return`"provider": {
|
||
"llama-swap": {
|
||
"npm": "@ai-sdk/openai-compatible",
|
||
"name": "Bosgame (llama-swap)",
|
||
"options": {
|
||
"baseURL": "${D}",
|
||
"apiKey": "local"
|
||
},
|
||
"models": {
|
||
${ge}
|
||
}
|
||
}
|
||
}`}async function P(){h(c,"Teste…");try{const D=await Se("/api/integration/test");h(u,D.ok,!0),h(c,D.ok?`✓ Verbunden — ${D.models.length} Modell(e): ${D.models.join(", ")}`:`✗ Keine Verbindung: ${D.error}`,!0)}catch(D){h(u,!1),h(c,"✗ "+D.message)}}function ye(D){var ie;const U=D.querySelector("code");U&&((ie=navigator.clipboard)==null||ie.writeText(U.textContent||""))}function te(D){var U;(U=navigator.clipboard)==null||U.writeText(D.value)}var ue=Kc(),Te=s(ct(ue),2),K=s(l(Te),6),V=l(K),fe=s(V,2),he=s(K,2);{var Pe=D=>{var U=Cc();m(D,U)},Ve=O(()=>E());I(he,D=>{n(Ve)&&D(Pe)})}var mt=s(he,2),T=l(mt),W=s(T,2);{var re=D=>{var U=$c(),ie=l(U);z(()=>{pn(U,`color:${n(u)?"#7ee29a":"#ff9b95"}`),b(ie,n(c))}),m(D,U)};I(W,D=>{n(c)&&D(re)})}var Ue=s(Te,2),Q=s(l(Ue),2);dt(Q,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],ot,(D,U)=>{var ie=O(()=>sr(U,3));let ge=()=>n(ie)[0],Ae=()=>n(ie)[1],bt=()=>n(ie)[2];var pt=Lc(),kt=l(pt),Ct=l(kt),Mt=s(kt,2),Lt=l(Mt),Ot=l(Lt),qt=s(Lt,2),$=l(qt);z(()=>{b(Ct,ge()),b(Ot,Ae()),b($,bt())}),m(D,pt)});var ze=s(Ue,2);{var Y=D=>{var U=Fc(),ie=ct(U),ge=l(ie),Ae=s(l(ge),2),bt=l(Ae),pt=s(ge,4);dt(pt,21,()=>n(r),ot,(J,de)=>{const se=O(()=>n(d).includes(n(de).name));var Z=Pc(),be=l(Z);z(()=>{pn(Z,`cursor:pointer;${n(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),b(be,n(de).name)}),C("click",Z,()=>h(d,n(se)?n(d).filter(ve=>ve!==n(de).name):[...n(d),n(de).name],!0)),C("keydown",Z,ve=>ve.key==="Enter"&&h(d,n(se)?n(d).filter(xe=>xe!==n(de).name):[...n(d),n(de).name],!0)),m(J,Z)});var kt=s(pt,2);{var Ct=J=>{var de=zc(),se=l(de);C("click",se,Z=>{Z.preventDefault(),h(d,[],!0)}),m(J,de)};I(kt,J=>{n(d).length&&J(Ct)})}var Mt=s(ie,2),Lt=s(l(Mt),4);dt(Lt,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],ot,(J,de)=>{var se=O(()=>sr(de,3));let Z=()=>n(se)[0],be=()=>n(se)[1],ve=()=>n(se)[2];var xe=Dc(),ke=l(xe),_e=l(ke),S=s(ke,2),H=l(S);z(()=>{yt(xe,1,`card-btn${n(o)===Z()?" cb-best":""}`),b(_e,be()),b(H,ve())}),C("click",xe,()=>h(o,Z(),!0)),m(J,xe)});var Ot=s(Mt,2),qt=s(l(Ot),2);{var $=J=>{const de=O(()=>L(n(i),n(p)));var se=Oc(),Z=s(ct(se),4),be=l(Z),ve=s(be,2),xe=l(ve),ke=l(xe),_e=s(Z,4),S=s(l(_e)),H=l(S);z(()=>{b(ke,n(de)),b(H,`bosgame / ${n(x)??""}`)}),C("click",be,le=>ye(le.currentTarget.parentElement)),m(J,se)},N=J=>{const de=O(()=>k(n(i),n(p)));var se=Rc(),Z=s(ct(se),6),be=l(Z),ve=s(be,2),xe=l(ve),ke=l(xe),_e=s(Z,2),S=s(l(_e),3),H=l(S);z(()=>{b(ke,n(de)),b(H,`llama-swap/${n(x)??""}`)}),C("click",be,le=>ye(le.currentTarget.parentElement)),m(J,se)},Ce=J=>{var de=qc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),xe=l(ve),ke=s(xe,2);z(()=>{yr(Z,n(i)),yr(xe,n(x))}),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",ke,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)},ut=J=>{var de=Bc(),se=s(ct(de),4),Z=l(se),be=s(Z,2),ve=s(se,4),xe=l(ve),ke=s(xe,2);z(()=>yr(Z,n(i))),C("click",be,_e=>te(_e.currentTarget.previousElementSibling)),C("click",ke,_e=>te(_e.currentTarget.previousElementSibling)),m(J,de)};I(qt,J=>{n(o)==="zed"?J($):n(o)==="opencode"?J(N,1):n(o)==="cline"?J(Ce,2):n(o)==="openwebui"&&J(ut,3)})}var F=s(Ot,2);{var De=J=>{const de=O(()=>`curl ${n(i)}/chat/completions \\
|
||
-H "Content-Type: application/json" \\
|
||
-d '{
|
||
"model": "${n(A)}",
|
||
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,<DEIN_BILD>"}}]}]
|
||
}'`);var se=Ic(),Z=l(se),be=s(l(Z),2),ve=l(be);Le(ve,()=>Pt("check"));var xe=s(ve),ke=s(Z,4),_e=l(ke),S=s(_e,2),H=l(S),le=l(H);z(()=>{b(xe,` „${n(A)??""}" bereit`),b(le,n(de))}),C("click",_e,Je=>ye(Je.currentTarget.parentElement)),m(J,se)};I(F,J=>{n(A)&&J(De)})}z(()=>b(bt,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),m(D,U)},rt=D=>{var U=Nc(),ie=s(l(U),2),ge=s(l(ie),4);C("click",ge,()=>{var Ae;return(Ae=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:Ae.dispatchEvent(new MouseEvent("click"))}),m(D,U)};I(ze,D=>{n(r).length?D(Y):D(rt,-1)})}z(()=>yr(V,n(i))),C("click",fe,D=>{const U=D.currentTarget.previousElementSibling;te(U)}),C("click",T,P),m(e,ue),aa()}xa(["click","keydown"]);var Vc=y('<div class="li" style="align-items:flex-start"><div class="li-main"><div class="flex items-center gap-2" style="flex-wrap:wrap"><span class="li-id" style="font-family:var(--sans);font-weight:500"> </span> <span> </span></div> <div class="li-sub"> </div></div> <button class="primary">Installieren</button></div>'),Uc=y('<div class="card" style="margin-bottom:18px;border-color:rgba(45,212,191,.25)"><div class="card-h"><h3>Für dich: Upgrades</h3> <span class="meta"> </span></div> <div class="card-sub">Neuere Modelle, die ein installiertes ersetzen können.</div> <div class="list"></div></div>'),Hc=y('<div class="empty" style="text-align:center;padding:40px">Lade News… (erstes Laden kann kurz dauern)</div>'),Wc=y('<div class="alert err" style="margin:0"> </div>'),jc=y('<div class="empty-c"><div class="e-t">Keine News geladen</div> <div class="e-s">Die Quellen sind gerade nicht erreichbar — später nochmal probieren.</div></div>'),Jc=y('<span class="news-rel">für dich</span>'),Qc=y('<a target="_blank" rel="noopener"><div class="news-meta"><span class="news-src"> </span> <!> <span class="news-date"> </span></div> <div class="news-title"> </div></a>'),Zc=y('<div class="news-grid"></div>'),Yc=y('<div class="pagehead"><div><h1>News</h1> <div class="sub">Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.</div></div> <button class="ghost">Aktualisieren</button></div> <!> <!>',1);function Xc(e,t){na(t,!0);let a=R(Ut([])),r=R(Ut([])),i=R(!0),o=R("");const d=K=>K==="perfect"?"ok":K==="marginal"?"warn":"bad";function c(K){const V=Math.max(0,Date.now()/1e3-K);return V<60?V+"s":V<3600?Math.floor(V/60)+"m":V<86400?Math.floor(V/3600)+"h":Math.floor(V/86400)+"d"}async function u(){h(i,!0),h(o,"");try{h(a,(await Se("/api/news")).items||[],!0)}catch(K){h(o,K.message||"Fehler beim Laden",!0)}finally{h(i,!1)}}async function v(){try{h(r,(await Se("/api/cookbook/upgrades")).upgrades||[],!0)}catch{h(r,[],!0)}}async function g(K,V){var fe;V.disabled=!0,V.textContent="Starte…";try{await Se("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:K.repo,role:K.role,params_b:K.params_b,quant:K.quant,hf_token:ir()})}),(fe=document.querySelector(".nav-item[data-view='activity']"))==null||fe.dispatchEvent(new MouseEvent("click"))}catch(he){V.disabled=!1,V.textContent="Installieren",alert("Fehler: "+he.message)}}function E(){u(),v()}mr(()=>{u(),v()});var p=Yc(),x=ct(p),A=s(l(x),2),L=s(x,2);{var k=K=>{var V=Uc(),fe=l(V),he=s(l(fe),2),Pe=l(he),Ve=s(fe,4);dt(Ve,21,()=>n(r),ot,(mt,T)=>{var W=Vc(),re=l(W),Ue=l(re),Q=l(Ue),ze=l(Q),Y=s(Q,2),rt=l(Y),D=s(Ue,2),U=l(D),ie=s(re,2);z(ge=>{b(ze,n(T).name),yt(Y,1,`fit-badge ${ge??""}`),b(rt,n(T).fit.text),b(U,`Ersetzt dein „${n(T).old??""}". ${n(T).why??""}`)},[()=>d(n(T).fit.level)]),C("click",ie,ge=>g(n(T),ge.currentTarget)),m(mt,W)}),z(()=>b(Pe,n(r).length)),m(K,V)};I(L,K=>{n(r).length&&K(k)})}var P=s(L,2);{var ye=K=>{var V=Hc();m(K,V)},te=K=>{var V=Wc(),fe=l(V);z(()=>b(fe,n(o))),m(K,V)},ue=K=>{var V=jc();m(K,V)},Te=K=>{var V=Zc();dt(V,21,()=>n(a),ot,(fe,he,Pe)=>{var Ve=Qc();yt(Ve,1,`news-card${Pe===0?" featured":""}`);var mt=l(Ve),T=l(mt),W=l(T),re=s(T,2);{var Ue=D=>{var U=Jc();m(D,U)};I(re,D=>{n(he).relevant&&D(Ue)})}var Q=s(re,2),ze=l(Q),Y=s(mt,2),rt=l(Y);z(D=>{Nr(Ve,"href",n(he).link),b(W,n(he).source),b(ze,D),b(rt,n(he).title)},[()=>n(he).ts?c(n(he).ts):""]),m(fe,Ve)}),m(K,V)};I(P,K=>{n(i)?K(ye):n(o)?K(te,1):n(a).length?K(Te,-1):K(ue,2)})}C("click",A,E),m(e,p),aa()}xa(["click"]);const eu=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
|
||
<ol class="tut-steps">
|
||
<li><b>Modell holen:</b> Tab <b>Cookbook</b> → Anwendungsfall wählen (z.B. „Coden & Programmieren") →
|
||
<b>Komplettes Setup installieren</b>. Der Download läuft im Tab <b>Aktivität</b> — einfach warten bis der Job grün wird.</li>
|
||
<li><b>Verbinden:</b> Tab <b>Verbinden</b> → Tool wählen → Config-Snippet kopieren und einfügen.
|
||
<b>Verbindung testen</b> bestätigt, dass alles klappt.</li>
|
||
<li><b>Arbeiten:</b> Im Tool das gewünschte Modell auswählen und loslegen.
|
||
Das Modell wird <b>automatisch geladen</b> — du musst nichts manuell starten.</li>
|
||
</ol>
|
||
<p style="margin-top:10px"><b>Nicht sicher welches Tool du nehmen sollst?</b>
|
||
Lies den Abschnitt „Welches Tool ist das richtige für mich?" weiter unten.</p>`],["Kontext — das Kurzzeitgedächtnis des Modells",`
|
||
<p>Der Kontext ist wie ein Blatt Papier: alles was du mit dem Modell besprochen hast,
|
||
steht darauf. Wird es voll, fallen die ältesten Nachrichten raus.</p>
|
||
<p><b>Was du meist nicht tun musst:</b> Tools wie OpenCode, Cline und OpenWebUI
|
||
verwalten das Kontextfenster automatisch. Ein neuer Chat = leeres Blatt.</p>
|
||
<p><b>Wenn der Kontext volläuft</b> (Fehler „context length exceeded" oder das Modell vergisst den Anfang):</p>
|
||
<ol class="tut-steps">
|
||
<li><b>Neuen Chat starten</b> — der einfachste Reset.</li>
|
||
<li>Vorher: <em>„Fasse kurz zusammen was wir bisher erreicht haben"</em> — dann diesen Stand in den neuen Chat einfügen.</li>
|
||
<li><b>Kontext vergrößern:</b> Tab <b>Modelle</b> → <b>Konfigurieren</b> → Empfehlung für deine Hardware übernehmen.</li>
|
||
</ol>
|
||
<p><b>Wichtig:</b> „Grafikspeicher leeren" (Tab <b>Server</b>) ist etwas anderes —
|
||
das wirft das <em>Modell</em> aus dem Speicher, nicht den Gesprächsverlauf.</p>`],["Auto-Swap — Modelle laden sich von selbst",`
|
||
<p>llama-swap lädt automatisch das Modell, das gerade angefragt wird —
|
||
und entlädt es nach einer Leerlaufzeit wieder. <b>Es läuft immer nur eines gleichzeitig.</b></p>
|
||
<p>Du richtest beliebig viele Modelle ein und wählst im Tool das passende.
|
||
Das Laden und Entladen passiert unsichtbar im Hintergrund.</p>
|
||
<p><b>Warum dauert die erste Antwort manchmal 5–15 Sekunden?</b><br>
|
||
Das Modell wird gerade geladen — danach geht es normal weiter.
|
||
Die Topbar zeigt <em>„[Modellname] lädt…"</em> während das passiert.</p>
|
||
<p><b>Scout immer sofort verfügbar halten:</b> Tab <b>Modelle</b> → Konfigurieren →
|
||
<em>Immer aktiv halten</em> aktivieren (TTL = ∞). Das Modell bleibt dann dauerhaft im RAM
|
||
und antwortet ohne Wartezeit — ideal für den kleinen, schnellen Allrounder.</p>`]]},{label:"Tools einrichten",tutorials:[["Welches Tool ist das richtige für mich?",`
|
||
<p>Die Antwort hängt davon ab, was du hauptsächlich tun willst:</p>
|
||
<div class="tut-table">
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Ich will einfach chatten, Texte schreiben, Fragen stellen</div>
|
||
<div class="tut-cell-bd">→ <b>OpenWebUI</b> — klassische Chat-Oberfläche im Browser.
|
||
Kein Programmieren, kein Setup. Ideal als Einstieg.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Ich programmiere und will KI in VS Code</div>
|
||
<div class="tut-cell-bd">→ <b>Cline</b> — KI-Assistent direkt im Editor.
|
||
Zeigt dir jeden Schritt und fragt vor Änderungen.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Ich will, dass die KI eigenständig ganze Features baut</div>
|
||
<div class="tut-cell-bd">→ <b>OpenCode</b> — autonomer Coding-Agent im Terminal oder als Desktop-App.
|
||
Liest Dateien, schreibt Code, führt Befehle aus.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Ich will einen schnellen Editor mit eingebautem KI-Panel</div>
|
||
<div class="tut-cell-bd">→ <b>Zed</b> — nativer Editor mit direktem Modell-Zugriff.
|
||
Schnell, minimalistisch, für Leute die Gewicht auf Performance legen.</div>
|
||
</div>
|
||
</div>
|
||
<p style="margin-top:10px"><b>Faustregel:</b> Fang mit <b>OpenWebUI</b> an. Wenn du merkst dass
|
||
du dieselben Aufgaben immer wieder beschreibst und dann manuell umsetzt — wechsle zu
|
||
<b>OpenCode</b> oder <b>Cline</b>.</p>`],["OpenCode verbinden und die ersten Schritte",`
|
||
<p>OpenCode ist installiert? Dann in vier Schritten verbinden:</p>
|
||
<ol class="tut-steps">
|
||
<li><b>Config-Snippet holen:</b> Tab <b>Verbinden</b> → <em>OpenCode</em> auswählen →
|
||
Snippet kopieren und in <code>~/.config/opencode/opencode.json</code> einfügen.</li>
|
||
<li><b>OpenCode starten:</b> Terminal öffnen, <code>opencode</code> eintippen —
|
||
immer im Projektordner starten, damit der Agent deine Dateien sieht.</li>
|
||
<li><b>Modell wählen:</b> <code>/models</code> eintippen → <em>llama-swap/coder</em> auswählen.</li>
|
||
<li><b>Erste Aufgabe geben</b> — z.B.:
|
||
<em>„Lies die Datei README.md und erkläre mir kurz was dieses Projekt macht."</em></li>
|
||
</ol>
|
||
<p><b>Nützliche Befehle während der Arbeit:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><code>/model</code> — Modell mitten im Gespräch wechseln (z.B. auf <em>scout</em> für kurze Fragen)</li>
|
||
<li><code>/compact</code> — Kontext komprimieren wenn er voll wird</li>
|
||
<li><code>/clear</code> — frischer Start, leerer Kontext</li>
|
||
</ul>
|
||
<p>Bevor OpenCode eine Datei ändert, fragt es nach — mit <b>y</b> bestätigen oder <b>n</b> ablehnen.</p>`],["Cline in VS Code verbinden und nutzen",`
|
||
<p>Cline ist installiert (VS Code Extension)? So richtest du es ein:</p>
|
||
<ol class="tut-steps">
|
||
<li>Das Cline-Panel in VS Code öffnen (Roboter-Icon in der linken Leiste).</li>
|
||
<li>Provider <b>„OpenAI Compatible"</b> wählen.</li>
|
||
<li>Tab <b>Verbinden</b> → <em>Cline / Cursor</em> → Basis-URL und Modell-ID kopieren und eintragen.</li>
|
||
<li>API-Key: irgendeinen beliebigen Text eingeben (z.B. <code>local</code>) — wird nicht geprüft.</li>
|
||
</ol>
|
||
<p><b>Plan-Modus vs. Act-Modus:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><b>Plan:</b> Cline erklärt erst seinen Plan — du kannst ihn korrigieren bevor er handelt. Ideal für Anfänger.</li>
|
||
<li><b>Act:</b> Cline handelt sofort, fragt aber vor jeder Dateiänderung um Erlaubnis. Schneller.</li>
|
||
</ul>
|
||
<p><b>Unterschied zu OpenCode:</b> Cline arbeitet direkt in VS Code — du siehst Änderungen sofort im Editor.
|
||
OpenCode ist besser für große, autonome Aufgaben; Cline für Aufgaben die du Schritt für Schritt begleiten willst.</p>`],["OpenWebUI — chatten ohne Vorkenntnisse",`
|
||
<p>OpenWebUI ist installiert? Verbinden in 3 Schritten:</p>
|
||
<ol class="tut-steps">
|
||
<li>OpenWebUI im Browser öffnen → <b>Admin Panel</b> → <b>Connections</b>.</li>
|
||
<li><b>+ OpenAI-Verbindung</b> hinzufügen → Basis-URL aus Tab <b>Verbinden</b> (Abschnitt OpenWebUI) kopieren.</li>
|
||
<li>API-Key: <code>dummy-key</code> (egal was hier steht). Speichern.</li>
|
||
</ol>
|
||
<p>Danach oben das Modell wählen (<em>coder</em>, <em>scout</em> oder <em>vision</em>) und loslegen
|
||
— genau wie bei ChatGPT, nur lokal und privat.</p>
|
||
<p><b>Bilder analysieren:</b> Mit einem Vision-Modell (z.B. <em>qwen3-vl</em>) einfach ein Bild
|
||
per Drag & Drop ins Chat-Fenster ziehen — das Modell beschreibt und analysiert es.</p>
|
||
<p><b>Gut für:</b> Texte schreiben, übersetzen, zusammenfassen, erklären lassen, Brainstorming —
|
||
alles ohne Programmierkenntnisse.</p>`]]},{label:"Agenten meistern",tutorials:[["Was ein Agent tut — und was er nicht kann",`
|
||
<p>Ein nacktes Modell antwortet auf Text — das war's.
|
||
Ein <b>Agent</b> ist das Programm drumherum, das das Modell in eine <b>Handlungsschleife</b> bringt:</p>
|
||
<p style="text-align:center;padding:8px 0;font-family:monospace;font-size:12.5px;color:var(--accent)">
|
||
Planen → Werkzeug nutzen → Ergebnis prüfen → nächsten Schritt planen → …
|
||
</p>
|
||
<p>Konkret: Datei lesen → Code verstehen → Änderung schreiben → Test ausführen → Fehler beheben —
|
||
ohne dass du jeden Schritt anstoßen musst.</p>
|
||
<p><b>Was Agenten gut können:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li>Features über mehrere Dateien implementieren</li>
|
||
<li>Bugs finden und in ihrem Kontext beheben</li>
|
||
<li>Code refactoren, Dokumentation schreiben, Tests ergänzen</li>
|
||
<li>Recherchieren und das Ergebnis direkt umsetzen (mit MCP)</li>
|
||
</ul>
|
||
<p><b>Was Agenten schlecht können:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li>Kreative Richtungsentscheidungen ohne klare Vorgabe treffen</li>
|
||
<li>Sehr komplexe, undokumentierte Systeme ohne Kontext verstehen</li>
|
||
<li>Fehler in externer Hardware oder fremden APIs beheben</li>
|
||
</ul>
|
||
<p><b>Faustregel:</b> Je klarer die Aufgabe, desto besser das Ergebnis. Unklarer Auftrag → unklares Ergebnis.</p>`],["Einen Agenten richtig briefen",`
|
||
<p>Der Unterschied zwischen „es passiert nichts Sinnvolles" und „es funktioniert auf Anhieb"
|
||
ist meistens die Qualität des Auftrags.</p>
|
||
<p><b>Schlecht → Gut:</b></p>
|
||
<div class="tut-table">
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd bad">„Mach meine App besser."</div>
|
||
<div class="tut-cell-bd">→ <em>„Die Login-Seite in <code>src/pages/Login.tsx</code> zeigt
|
||
bei falschem Passwort gar keinen Fehler an. Füge unter dem Passwortfeld eine rote Fehlermeldung
|
||
ein wenn die API 401 zurückgibt."</em></div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd bad">„Erkläre mir Python."</div>
|
||
<div class="tut-cell-bd">→ <em>„Ich bin Anfänger. Erkläre mir in 5 Schritten wie ich eine CSV-Datei
|
||
in Python einlese und die Summe einer Spalte berechne — mit echtem Code-Beispiel."</em></div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd bad">„Mach das schneller."</div>
|
||
<div class="tut-cell-bd">→ <em>„Die Funktion <code>loadUsers()</code> in <code>src/api/users.ts</code>
|
||
braucht 3 Sekunden. Die Daten kommen vom Backend. Prüfe ob Caching helfen würde und schlage eine
|
||
konkrete Lösung vor."</em></div>
|
||
</div>
|
||
</div>
|
||
<p style="margin-top:12px"><b>Die 3 Zutaten für einen guten Auftrag:</b></p>
|
||
<ol class="tut-steps">
|
||
<li><b>WO:</b> Welche Datei / welcher Ordner / welches Feature</li>
|
||
<li><b>WAS:</b> Was ist das genaue Problem oder Ziel</li>
|
||
<li><b>WIE:</b> Welches Ergebnis erwartest du</li>
|
||
</ol>
|
||
<p><b>Trick:</b> Wenn du nicht sicher bist ob der Auftrag klar genug ist, frag den Agenten:
|
||
<em>„Hast du alles was du brauchst, oder fehlt dir etwas?"</em></p>`],["MCP — deinem Agenten echte Werkzeuge geben",`
|
||
<p><b>MCP</b> (Model Context Protocol) ist ein einheitlicher „Stecker", über den ein Agent
|
||
zusätzliche <b>Werkzeuge</b> bekommt. Ohne MCP kann er nur Text lesen und schreiben.
|
||
Mit MCP kann er z.B.:</p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li>Im Web suchen (Brave Search, Tavily)</li>
|
||
<li>GitHub Issues lesen und kommentieren</li>
|
||
<li>Deine Datenbank abfragen</li>
|
||
<li>Screenshots machen, E-Mails lesen, Kalender verwalten</li>
|
||
</ul>
|
||
<p><b>Wie MCPs eingebunden werden</b> (Beispiel für OpenCode):</p>
|
||
<p>In der Konfigurationsdatei (<code>~/.config/opencode/opencode.json</code>) einen
|
||
<code>"mcp"</code>-Block hinzufügen:</p>
|
||
<pre class="tut-code">{
|
||
"mcp": {
|
||
"brave-search": {
|
||
"command": "npx",
|
||
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
|
||
"env": { "BRAVE_API_KEY": "dein-key" }
|
||
}
|
||
}
|
||
}</pre>
|
||
<p>Danach OpenCode neu starten — der Agent nutzt das Werkzeug automatisch wenn er es braucht.</p>
|
||
<p><b>Empfohlene MCPs für den Einstieg:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><b>brave-search / tavily</b> — im Web suchen und recherchieren</li>
|
||
<li><b>github</b> — Repos, Issues und Pull Requests lesen</li>
|
||
<li><b>filesystem</b> — sichere Dateizugriffe außerhalb des Projektordners</li>
|
||
</ul>
|
||
<p><b>Wo MCPs finden?</b> → <a href="https://mcp.run" target="_blank" rel="noopener">mcp.run</a>,
|
||
<a href="https://smithery.ai" target="_blank" rel="noopener">smithery.ai</a>,
|
||
oder direkt: <em>„Welche MCPs gibt es für [dein Werkzeug]?"</em> im Chat fragen.</p>
|
||
<p><b>Merksatz:</b> Fehlt dem Agenten eine <em>Fähigkeit</em> → MCP.
|
||
Soll er etwas nur <em>besser machen</em> → Skill (nächster Abschnitt).</p>`],["Skills & Rules — Agenten Gewohnheiten beibringen",`
|
||
<p><b>Skills</b> (auch <em>Rules</em>, <em>AGENTS.md</em> oder <em>Instructions</em> genannt)
|
||
sind kurze Texte, die dem Agenten beibringen wie er in deinem Projekt arbeiten soll —
|
||
immer, ohne dass du es jedes Mal neu sagen musst.</p>
|
||
<p><b>Beispiel</b> — eine einfache AGENTS.md:</p>
|
||
<pre class="tut-code">Schreib alle Variablen in camelCase.
|
||
Kommentare immer auf Deutsch.
|
||
Tests immer mit describe/it-Blöcken (Jest).
|
||
Importiere nichts was nicht schon in package.json steht.
|
||
Bevor du Dateien änderst: erkläre kurz was du vorhast.</pre>
|
||
<p>Der Agent liest das vor jeder Aufgabe und hält sich daran.</p>
|
||
<p><b>Wo die Datei ablegen:</b></p>
|
||
<div class="tut-table">
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">OpenCode</div>
|
||
<div class="tut-cell-bd"><code>AGENTS.md</code> im Projektordner (pro Projekt)<br>
|
||
<code>~/.config/opencode/AGENTS.md</code> (global, gilt überall)</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Cline</div>
|
||
<div class="tut-cell-bd"><code>.clinerules</code> im Projektordner<br>
|
||
<code>~/.clinerules</code> (global)</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">Zed</div>
|
||
<div class="tut-cell-bd">Zed Settings → Assistant → System Prompt</div>
|
||
</div>
|
||
</div>
|
||
<p style="margin-top:10px"><b>Fertige Skills finden:</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><a href="https://cursor.directory" target="_blank" rel="noopener">cursor.directory</a>
|
||
— vorgefertigte Rules für React, Vue, Python, etc.</li>
|
||
<li>Einfach fragen: <em>„Schreib mir eine AGENTS.md für ein React + TypeScript Projekt mit Tailwind."</em></li>
|
||
</ul>`]]},{label:"Wenn etwas nicht klappt",tutorials:[["Häufige Probleme & Lösungen",`
|
||
<div class="tut-table">
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">🔴 Engine offline, rotes Licht in der Topbar</div>
|
||
<div class="tut-cell-bd">Tab <b>Server</b> → LLM-Engine-Karte → <b>Neustart</b>.
|
||
Warte 10–15 Sekunden — danach sollte die Verbindung wieder grün sein.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">⏳ Modell lädt länger als 5 Minuten</div>
|
||
<div class="tut-cell-bd">Tab <b>Aktivität</b> prüfen: läuft ein Download-Job?
|
||
Der muss erst abgeschlossen sein bevor das Modell ladbar ist.
|
||
Bei Fehler → Job-Zeile aufklappen, Log lesen.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">💬 „context length exceeded" Fehler im Tool</div>
|
||
<div class="tut-cell-bd">Neuen Chat starten. Vorher: <em>„Fasse kurz zusammen was wir
|
||
erreicht haben"</em> eingeben und diesen Text in den neuen Chat mitnehmen.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">🌐 Modell antwortet immer auf Englisch</div>
|
||
<div class="tut-cell-bd">Am Anfang der Unterhaltung schreiben: <em>„Antworte immer auf Deutsch."</em>
|
||
Für dauerhaft: eine <code>AGENTS.md</code> / <code>.clinerules</code> mit dieser Anweisung anlegen
|
||
(siehe Abschnitt Skills & Rules).</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">🔌 Tool findet keine Modelle / Verbindung schlägt fehl</div>
|
||
<div class="tut-cell-bd">Tab <b>Verbinden</b> → <b>Verbindung testen</b>. Wenn Fehler:
|
||
läuft llama-swap? (Tab Server). URL korrekt? Muss <code>http://</code> (nicht https) sein,
|
||
Port <b>8080</b>. Über Proxy? → LAN-IP direkt nutzen: <code>http://192.168.178.151:8080/v1</code></div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">⬇ Download schlägt fehl / bricht ab</div>
|
||
<div class="tut-cell-bd">Tab <b>Aktivität</b> → Job-Zeile aufklappen → Log lesen.
|
||
Häufigste Ursache: HuggingFace braucht einen Token für dieses Modell (gated model).
|
||
→ Einstellungen (Zahnrad-Icon oben) → <b>HuggingFace-Token</b> eintragen.</div>
|
||
</div>
|
||
<div class="tut-row">
|
||
<div class="tut-cell-hd">🔄 Seite lädt / Dashboard hängt komplett</div>
|
||
<div class="tut-cell-bd">Strg+Shift+R (Hard Reload). Wenn das nicht hilft:
|
||
Tab <b>Server</b> → Mission Control → <b>Neu starten</b>.</div>
|
||
</div>
|
||
</div>`]]}],tu=[["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 aus Qualität und Geschwindigkeit."],["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."],["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 nu=y('<details class="guide-acc"><summary> </summary> <div class="acc-body"></div></details>'),au=y('<div class="card guide-card svelte-112sh7i"><div class="guide-group-hd svelte-112sh7i"> </div> <!></div>'),ru=y('<div class="concept"><h4> </h4> <p> </p></div>'),iu=y('<div class="pagehead"><div><h1>Guide</h1> <div class="sub">Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.</div></div></div> <!> <div class="card-h" style="margin-top:8px"><h3>Begriffe kurz erklärt</h3></div> <div class="concept-grid"></div>',1);function su(e){var t=iu(),a=s(ct(t),2);dt(a,17,()=>eu,ot,(i,o,d)=>{var c=au(),u=l(c),v=l(u),g=s(u,2);dt(g,17,()=>n(o).tutorials,ot,(E,p,x)=>{var A=O(()=>sr(n(p),2));let L=()=>n(A)[0],k=()=>n(A)[1];var P=nu();P.open=d===0&&x===0;var ye=l(P),te=l(ye),ue=s(ye,2);Le(ue,k,!0),z(()=>b(te,L())),m(E,P)}),z(()=>b(v,n(o).label)),m(i,c)});var r=s(a,4);dt(r,21,()=>tu,ot,(i,o)=>{var d=O(()=>sr(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=ru(),g=l(v),E=l(g),p=s(g,2),x=l(p);z(()=>{b(E,c()),b(x,u())}),m(i,v)}),m(e,t)}let Xi={};function lu(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function es(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),ts("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` <span style="color:var(--mut);font-size:11.5px">· ${Math.round(c.meta.ctx/1024)}k ctx</span>`:"",g=c.state==="loading"||c.state==="starting"?' <span style="color:var(--warn);font-size:11.5px">lädt…</span>':"";r.innerHTML=`<b style="color:var(--accent)">${c.name}</b>${v}${g}`}else r.innerHTML='<span style="color:var(--mut)">Kein Modell im VRAM</span>';e.swap_ok?uu():ts(`LLM-Engine nicht erreichbar unter <b>${o}</b> – läuft der llama-swap Dienst?`,!0);const u={};for(const v of e.models||[])u[v.name]=v.state;for(const[v,g]of Object.entries(u)){const E=Xi[v];if(E&&E!==g&&(g==="running"||g==="loading")){lu();break}}Xi=u}ou(e),br.set(e)}function ou(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function du(e){da.set(e||[])}function cu(e){Li.set(e)}function ts(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`<span class="a-dot"></span><span>${e}</span>`,a.style.display="flex"}function uu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const vu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function ei(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>vu(a),i}async function tl(){try{const e=await Se("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(ei(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(ei(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(ei(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Gr(){try{es(await Se("/api/status"))}catch{es(null)}}async function nl(){try{du(await Se("/api/jobs"))}catch{}}function al(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{cu(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(al,3e3)},t.onerror=()=>t.close()}var ls;((ls=document.getElementById("logo"))==null?void 0:ls.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Kr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Kr[e.dataset.ic||""]||""});const fu=[["overview",cd],["models",Sd],["activity",Rd],["server",Hd],["cookbook",Ac],["connect",Gc],["news",Xc],["guides",su]];for(const[e,t]of fu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&ko(t,{target:a})}Uo("overview");const ti=document.getElementById("token");ti&&(ti.value=el(),ti.addEventListener("change",e=>{Fo(e.target.value),Gr()}));const ni=document.getElementById("hf-token");ni&&(ni.value=ir(),ni.addEventListener("change",e=>Ko(e.target.value)));const ns=document.getElementById("nav-settings"),ai=document.getElementById("settings-modal"),as=document.getElementById("sm-close");ns&&ai&&as&&(ns.addEventListener("click",()=>ai.style.display="flex"),as.addEventListener("click",()=>ai.style.display="none"));function pu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Gr);Gr();nl();al();setInterval(pu,1e3);setInterval(Gr,3e3);setInterval(nl,1500);tl();setInterval(tl,6e4);
|