a93751fb01
Bugs behoben:
- Topbar + Server-Panel: 'Kein Modell im VRAM' obwohl geladen → alle
States (running/ready/loading/starting) werden jetzt erkannt
- Topbar zeigt bei geladenem Modell: Name + ctx-Größe + State mit Farbe
Dashboard-Redesign (OverviewPanel):
- KPI-Kacheln mit Farbe: .kpi.green/.red/.blue/.muted statt .tile
(farbige Randlinien + farbige Werte wie im Referenz-Design)
- Icons pro Kachel (server, cpu, thermo, database)
- Stack-Liste: zeigt ctx/quant/GB, 'Laden'-Button wenn Modell bereit
aber nicht geladen, ∞-Chip für immer-aktive Modelle
- 4. Schnellstart-Button: 'Tools verbinden'
Feature: Modell Vorwärmen (Pre-load):
- POST /api/preload?model=<name> — sendet Mini-Request an llama-swap
damit es das Modell vorab lädt (max_tokens=1, kein Output)
- 'Laden'-Button je Modell in der Stack-Liste
Topbar CSS:
- Aktives Modell: teal-hinterlegter Pill wenn Modell geladen
- Kontext-Größe direkt neben Modellname angezeigt
Cookbook:
- Discover: genaue Zeitanzeige wann Quellen zuletzt befragt wurden
('vor X min / h / Tg.') statt nur 'aktuell'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
115 lines
139 KiB
JavaScript
115 lines
139 KiB
JavaScript
var tl=Object.defineProperty;var Ai=e=>{throw TypeError(e)};var nl=(e,t,a)=>t in e?tl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var en=(e,t,a)=>nl(e,typeof t!="symbol"?t+"":t,a),Gr=(e,t,a)=>t.has(e)||Ai("Cannot "+a);var f=(e,t,a)=>(Gr(e,t,"read from private field"),a?a.call(e):t.get(e)),de=(e,t,a)=>t.has(e)?Ai("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),se=(e,t,a,r)=>(Gr(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),$e=(e,t,a)=>(Gr(e,t,"access private method"),a);var hi=Array.isArray,al=Array.prototype.indexOf,Sr=Array.prototype.includes,Dr=Array.from,rl=Object.defineProperty,Ya=Object.getOwnPropertyDescriptor,il=Object.getOwnPropertyDescriptors,sl=Object.prototype,ll=Array.prototype,is=Object.getPrototypeOf,Ci=Object.isExtensible;const ol=()=>{};function dl(e){for(var t=0;t<e.length;t++)e[t]()}function ss(){var e,t,a=new Promise((r,i)=>{e=r,t=i});return{promise:a,resolve:e,reject:t}}function ir(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 zt=2,Ra=4,Or=8,ls=1<<24,Sn=16,Tn=32,na=64,ti=128,gn=512,St=1024,Ct=2048,qn=4096,Ut=8192,_n=16384,Ka=32768,ni=1<<25,qa=65536,Er=1<<17,cl=1<<18,Ga=1<<19,ul=1<<20,Dn=1<<25,ya=65536,Tr=1<<21,Ta=1<<22,ta=1<<23,$a=Symbol("$state"),vl=Symbol(""),br=Symbol("attributes"),ai=Symbol("class"),ri=Symbol("style"),Va=Symbol("text"),yr=Symbol("form reset"),Rr=new class extends Error{constructor(){super(...arguments);en(this,"name","StaleReactionError");en(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ts;const fl=!!((ts=globalThis.document)!=null&&ts.contentType)&&globalThis.document.contentType.includes("xml");function os(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function pl(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function gl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function _l(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ml(e){throw new Error("https://svelte.dev/e/effect_orphan")}function bl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function yl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function wl(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function xl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function kl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Ml=1,Sl=2,ds=4,El=8,Tl=16,$l=1,Al=2,Mt=Symbol("uninitialized"),cs="http://www.w3.org/1999/xhtml",Cl="http://www.w3.org/2000/svg",Ll="http://www.w3.org/1998/Math/MathML";function zl(){console.warn("https://svelte.dev/e/derived_inert")}function Pl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Dl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function us(e){return e===this.v}function Ol(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function vs(e){return!Ol(e,this.v)}let Lt=null;function Ba(e){Lt=e}function ra(e,t=!1,a){Lt={p:Lt,i:!1,c:null,e:null,s:e,x:null,r:me,l:null}}function ia(e){var t=Lt,a=t.e;if(a!==null){t.e=null;for(var r of a)Ds(r)}return t.i=!0,Lt=t.p,{}}function fs(){return!0}let la=[];function ps(){var e=la;la=[],dl(e)}function ga(e){if(la.length===0&&!Xa){var t=la;queueMicrotask(()=>{t===la&&ps()})}la.push(e)}function Rl(){for(;la.length>0;)ps()}function hs(e){var t=me;if(t===null)return he.f|=ta,e;if((t.f&Ka)===0&&(t.f&Ra)===0)throw e;Xn(e,t)}function Xn(e,t){if(!(t!==null&&(t.f&_n)!==0)){for(;t!==null;){if((t.f&ti)!==0){if((t.f&Ka)===0)throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const ql=-7169;function gt(e,t){e.f=e.f&ql|t}function gi(e){(e.f&gn)!==0||e.deps===null?gt(e,St):gt(e,qn)}function gs(e){if(e!==null)for(const t of e)(t.f&zt)===0||(t.f&ya)===0||(t.f^=ya,gs(t.deps))}function _s(e,t,a){(e.f&Ct)!==0?t.add(e):(e.f&qn)!==0&&a.add(e),gs(e.deps),gt(e,St)}function Bl(e){let t=0,a=xa(0),r;return()=>{ki()&&(n(a),qr(()=>(t===0&&(r=Ua(()=>e(()=>er(a)))),t+=1,()=>{ga(()=>{t-=1,t===0&&(r==null||r(),r=void 0,er(a))})})))}}var Il=qa|Ga;function Nl(e,t,a,r){new Fl(e,t,a,r)}var un,pi,vn,ua,Wt,fn,Gt,an,Fn,va,Yn,Aa,or,dr,Kn,Lr,ft,Kl,Gl,Ul,ii,wr,xr,si,li;class Fl{constructor(t,a,r,i){de(this,ft);en(this,"parent");en(this,"is_pending",!1);en(this,"transform_error");de(this,un);de(this,pi,null);de(this,vn);de(this,ua);de(this,Wt);de(this,fn,null);de(this,Gt,null);de(this,an,null);de(this,Fn,null);de(this,va,0);de(this,Yn,0);de(this,Aa,!1);de(this,or,new Set);de(this,dr,new Set);de(this,Kn,null);de(this,Lr,Bl(()=>(se(this,Kn,xa(f(this,va))),()=>{se(this,Kn,null)})));var o;se(this,un,t),se(this,vn,a),se(this,ua,d=>{var c=me;c.b=this,c.f|=ti,r(d)}),this.parent=me.b,this.transform_error=i??((o=this.parent)==null?void 0:o.transform_error)??(d=>d),se(this,Wt,Si(()=>{$e(this,ft,ii).call(this)},Il))}defer_effect(t){_s(t,f(this,or),f(this,dr))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!f(this,vn).pending}update_pending_count(t,a){$e(this,ft,si).call(this,t,a),se(this,va,f(this,va)+t),!(!f(this,Kn)||f(this,Aa))&&(se(this,Aa,!0),ga(()=>{se(this,Aa,!1),f(this,Kn)&&Ia(f(this,Kn),f(this,va))}))}get_effect_pending(){return f(this,Lr).call(this),n(f(this,Kn))}error(t){if(!f(this,vn).onerror&&!f(this,vn).failed)throw t;W!=null&&W.is_fork?(f(this,fn)&&W.skip_effect(f(this,fn)),f(this,Gt)&&W.skip_effect(f(this,Gt)),f(this,an)&&W.skip_effect(f(this,an)),W.oncommit(()=>{$e(this,ft,li).call(this,t)})):$e(this,ft,li).call(this,t)}}un=new WeakMap,pi=new WeakMap,vn=new WeakMap,ua=new WeakMap,Wt=new WeakMap,fn=new WeakMap,Gt=new WeakMap,an=new WeakMap,Fn=new WeakMap,va=new WeakMap,Yn=new WeakMap,Aa=new WeakMap,or=new WeakMap,dr=new WeakMap,Kn=new WeakMap,Lr=new WeakMap,ft=new WeakSet,Kl=function(){try{se(this,fn,pn(()=>f(this,ua).call(this,f(this,un))))}catch(t){this.error(t)}},Gl=function(t){const a=f(this,vn).failed;a&&se(this,an,pn(()=>{a(f(this,un),()=>t,()=>()=>{})}))},Ul=function(){const t=f(this,vn).pending;t&&(this.is_pending=!0,se(this,Gt,pn(()=>t(f(this,un)))),ga(()=>{var a=se(this,Fn,document.createDocumentFragment()),r=Hn();a.append(r),se(this,fn,$e(this,ft,xr).call(this,()=>pn(()=>f(this,ua).call(this,r)))),f(this,Yn)===0&&(f(this,un).before(a),se(this,Fn,null),ma(f(this,Gt),()=>{se(this,Gt,null)}),$e(this,ft,wr).call(this,W))}))},ii=function(){try{if(this.is_pending=this.has_pending_snippet(),se(this,Yn,0),se(this,va,0),se(this,fn,pn(()=>{f(this,ua).call(this,f(this,un))})),f(this,Yn)>0){var t=se(this,Fn,document.createDocumentFragment());Ti(f(this,fn),t);const a=f(this,vn).pending;se(this,Gt,pn(()=>a(f(this,un))))}else $e(this,ft,wr).call(this,W)}catch(a){this.error(a)}},wr=function(t){this.is_pending=!1,t.transfer_effects(f(this,or),f(this,dr))},xr=function(t){var a=me,r=he,i=Lt;Bn(f(this,Wt)),mn(f(this,Wt)),Ba(f(this,Wt).ctx);try{return wa.ensure(),t()}catch(o){return hs(o),null}finally{Bn(a),mn(r),Ba(i)}},si=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&$e(r=this.parent,ft,si).call(r,t,a);return}se(this,Yn,f(this,Yn)+t),f(this,Yn)===0&&($e(this,ft,wr).call(this,a),f(this,Gt)&&ma(f(this,Gt),()=>{se(this,Gt,null)}),f(this,Fn)&&(f(this,un).before(f(this,Fn)),se(this,Fn,null)))},li=function(t){f(this,fn)&&(Qt(f(this,fn)),se(this,fn,null)),f(this,Gt)&&(Qt(f(this,Gt)),se(this,Gt,null)),f(this,an)&&(Qt(f(this,an)),se(this,an,null));var a=f(this,vn).onerror;let r=f(this,vn).failed;var i=!1,o=!1;const d=()=>{if(i){Dl();return}i=!0,o&&kl(),f(this,an)!==null&&ma(f(this,an),()=>{se(this,an,null)}),$e(this,ft,xr).call(this,()=>{$e(this,ft,ii).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(v){Xn(v,f(this,Wt)&&f(this,Wt).parent)}r&&se(this,an,$e(this,ft,xr).call(this,()=>{try{return pn(()=>{var v=me;v.b=this,v.f|=ti,r(f(this,un),()=>u,()=>d)})}catch(v){return Xn(v,f(this,Wt).parent),null}}))};ga(()=>{var u;try{u=this.transform_error(t)}catch(v){Xn(v,f(this,Wt)&&f(this,Wt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,v=>Xn(v,f(this,Wt)&&f(this,Wt).parent)):c(u)})};function Hl(e,t,a,r){const i=_i;var o=e.filter(w=>!w.settled),d=t.map(i);if(a.length===0&&o.length===0){r(d);return}var c=me,u=Vl(),v=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(w=>w.promise)):null;function h(w){if((c.f&_n)===0){u();try{r([...d,...w])}catch(A){Xn(A,c)}$r()}}var E=ms();if(a.length===0){v.then(()=>h([])).finally(E);return}function p(){Promise.all(a.map(w=>Wl(w))).then(h).catch(w=>Xn(w,c)).finally(E)}v?v.then(()=>{u(),p(),$r()}):p()}function Vl(){var e=me,t=he,a=Lt,r=W;return function(o=!0){Bn(e),mn(t),Ba(a),o&&(e.f&_n)===0&&(r==null||r.activate(),r==null||r.apply())}}function $r(e=!0){Bn(null),mn(null),Ba(null),e&&(W==null||W.deactivate())}function ms(){var e=me,t=e.b,a=W,r=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,a),a.increment(r,e),()=>{t==null||t.update_pending_count(-1,a),a.decrement(r,e)}}function _i(e){var t=zt|Ct;return me!==null&&(me.f|=Ga),{ctx:Lt,deps:null,effects:null,equals:us,f:t,fn:e,reactions:null,rv:0,v:Mt,wv:0,parent:me,ac:null}}const Wa=Symbol("obsolete");function Wl(e,t,a){let r=me;r===null&&pl();var i=void 0,o=xa(Mt),d=!he,c=new Set;return uo(()=>{var w,A;var u=me,v=ss();i=v.promise;try{Promise.resolve(e()).then(v.resolve,L=>{L!==Rr&&v.reject(L)}).finally($r)}catch(L){v.reject(L),$r()}var h=W;if(d){if((u.f&Ka)!==0)var E=ms();if((w=r.b)!=null&&w.is_rendered())(A=h.async_deriveds.get(u))==null||A.reject(Wa);else for(const L of c.values())L.reject(Wa);c.add(v),h.async_deriveds.set(u,v)}const p=(L,M=void 0)=>{E==null||E(),c.delete(v),M!==Wa&&(h.activate(),M?(o.f|=ta,Ia(o,M)):((o.f&ta)!==0&&(o.f^=ta),Ia(o,L)),h.deactivate())};v.promise.then(p,L=>p(null,L||"unknown"))}),Ps(()=>{for(const u of c)u.reject(Wa)}),new Promise(u=>{function v(h){function E(){h===i?u(o):v(i)}h.then(E,E)}v(i)})}function I(e){const t=_i(e);return Fs(t),t}function jl(e){const t=_i(e);return t.equals=vs,t}function Jl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;a<t.length;a+=1)Qt(t[a])}}function mi(e){var t,a=me,r=e.parent;if(!aa&&r!==null&&e.v!==Mt&&(r.f&(_n|Ut))!==0)return zl(),e.v;Bn(r);try{e.f&=~ya,Jl(e),t=Hs(e)}finally{Bn(a)}return t}function bs(e){var t=mi(e);if(!e.equals(t)&&(e.wv=Gs(),(!(W!=null&&W.is_fork)||e.deps===null)&&(W!==null?(W.capture(e,t,!0),Za==null||Za.capture(e,t,!0)):e.v=t,e.deps===null))){gt(e,St);return}aa||(At!==null?(ki()||W!=null&&W.is_fork)&&At.set(e,t):gi(e))}function Ql(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(Rr),r.fn!==null&&(r.teardown=ol),r.ac=null,sr(r,0),Ei(r))}function ys(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&Na(t)}let Ur=null,Ma=null,W=null,Za=null,At=null,oi=null,Xa=!1,Hr=!1,Ea=null,kr=null;var Li=0;let Yl=1;var Ca,Zn,fa,La,za,Pa,Gn,Da,jt,cr,Un,xn,zn,Oa,pa,Be,di,ja,ci,ws,xs,Sa,Zl,Ja;const zr=class zr{constructor(){de(this,Be);en(this,"id",Yl++);de(this,Ca,!1);en(this,"linked",!0);de(this,Zn,null);de(this,fa,null);en(this,"async_deriveds",new Map);en(this,"current",new Map);en(this,"previous",new Map);de(this,La,new Set);de(this,za,new Set);de(this,Pa,0);de(this,Gn,new Map);de(this,Da,null);de(this,jt,[]);de(this,cr,[]);de(this,Un,new Set);de(this,xn,new Set);de(this,zn,new Map);de(this,Oa,new Set);en(this,"is_fork",!1);de(this,pa,!1);Ma===null?Ur=Ma=this:(se(Ma,fa,this),se(this,Zn,Ma)),Ma=this}skip_effect(t){f(this,zn).has(t)||f(this,zn).set(t,{d:[],m:[]}),f(this,Oa).delete(t)}unskip_effect(t,a=r=>this.schedule(r)){var r=f(this,zn).get(t);if(r){f(this,zn).delete(t);for(var i of r.d)gt(i,Ct),a(i);for(i of r.m)gt(i,qn),a(i)}f(this,Oa).add(t)}capture(t,a,r=!1){t.v!==Mt&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&ta)===0&&(this.current.set(t,[a,r]),At==null||At.set(t,a)),this.is_fork||(t.v=a)}activate(){W=this}deactivate(){W=null,At=null}flush(){try{Hr=!0,W=this,$e(this,Be,ja).call(this)}finally{Li=0,oi=null,Ea=null,kr=null,Hr=!1,W=null,At=null,_a.clear()}}discard(){var t;for(const a of f(this,za))a(this);f(this,za).clear();for(const a of this.async_deriveds.values())a.reject(Wa);$e(this,Be,Ja).call(this),(t=f(this,Da))==null||t.resolve()}register_created_effect(t){f(this,cr).push(t)}increment(t,a){if(se(this,Pa,f(this,Pa)+1),t){let r=f(this,Gn).get(a)??0;f(this,Gn).set(a,r+1)}}decrement(t,a){if(se(this,Pa,f(this,Pa)-1),t){let r=f(this,Gn).get(a)??0;r===1?f(this,Gn).delete(a):f(this,Gn).set(a,r-1)}f(this,pa)||(se(this,pa,!0),ga(()=>{se(this,pa,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const r of t)f(this,Un).add(r);for(const r of a)f(this,xn).add(r);t.clear(),a.clear()}oncommit(t){f(this,La).add(t)}ondiscard(t){f(this,za).add(t)}settled(){return(f(this,Da)??se(this,Da,ss())).promise}static ensure(){if(W===null){const t=W=new zr;!Hr&&!Xa&&ga(()=>{f(t,Ca)||t.flush()})}return W}apply(){{At=null;return}}schedule(t){var i;if(oi=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ra|Or|ls))!==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===me&&(he===null||(he.f&zt)===0))return;if((r&(na|Tn))!==0){if((r&St)===0)return;a.f^=St}}f(this,jt).push(a)}};Ca=new WeakMap,Zn=new WeakMap,fa=new WeakMap,La=new WeakMap,za=new WeakMap,Pa=new WeakMap,Gn=new WeakMap,Da=new WeakMap,jt=new WeakMap,cr=new WeakMap,Un=new WeakMap,xn=new WeakMap,zn=new WeakMap,Oa=new WeakMap,pa=new WeakMap,Be=new WeakSet,di=function(){if(this.is_fork)return!0;for(const r of f(this,Gn).keys()){for(var t=r,a=!1;t.parent!==null;){if(f(this,zn).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},ja=function(){var u,v,h,E;se(this,Ca,!0),Li++>1e3&&($e(this,Be,Ja).call(this),eo());for(const p of f(this,Un))f(this,xn).delete(p),gt(p,Ct),this.schedule(p);for(const p of f(this,xn))gt(p,qn),this.schedule(p);const t=f(this,jt);se(this,jt,[]),this.apply();var a=Ea=[],r=[],i=kr=[];for(const p of t)try{$e(this,Be,ci).call(this,p,a,r)}catch(w){throw Ss(p),$e(this,Be,di).call(this)||this.discard(),w}if(W=null,i.length>0){var o=zr.ensure();for(const p of i)o.schedule(p)}if(Ea=null,kr=null,$e(this,Be,di).call(this)){$e(this,Be,Sa).call(this,r),$e(this,Be,Sa).call(this,a);for(const[p,w]of f(this,zn))Ms(p,w);i.length>0&&$e(u=W,Be,ja).call(u);return}const d=$e(this,Be,ws).call(this);if(d){$e(this,Be,Sa).call(this,r),$e(this,Be,Sa).call(this,a),$e(v=d,Be,xs).call(v,this);return}f(this,Un).clear(),f(this,xn).clear();for(const p of f(this,La))p(this);f(this,La).clear(),Za=this,zi(r),zi(a),Za=null,(h=f(this,Da))==null||h.resolve();var c=W;if(f(this,Pa)===0&&(f(this,jt).length===0||c!==null)&&$e(this,Be,Ja).call(this),f(this,jt).length>0)if(c!==null){const p=c;f(p,jt).push(...f(this,jt).filter(w=>!f(p,jt).includes(w)))}else c=this;c!==null&&$e(E=c,Be,ja).call(E)},ci=function(t,a,r){t.f^=St;for(var i=t.first;i!==null;){var o=i.f,d=(o&(Tn|na))!==0,c=d&&(o&St)!==0,u=c||(o&Ut)!==0||f(this,zn).has(i);if(!u&&i.fn!==null){d?i.f^=St:(o&Ra)!==0?a.push(i):pr(i)&&((o&Sn)!==0&&f(this,xn).add(i),Na(i));var v=i.first;if(v!==null){i=v;continue}}for(;i!==null;){var h=i.next;if(h!==null){i=h;break}i=i.parent}}},ws=function(){for(var t=f(this,Zn);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=f(t,Zn)}return null},xs=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,Un),f(t,xn));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&zt)!==0)a(u);else{var c=u;d&(Ta|Sn)&&!this.async_deriveds.has(c)&&(f(this,xn).delete(c),gt(c,Ct),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),$e(r=t,Be,Ja).call(r),W=this,$e(this,Be,ja).call(this)},Sa=function(t){for(var a=0;a<t.length;a+=1)_s(t[a],f(this,Un),f(this,xn))},Zl=function(){var E;for(let p=Ur;p!==null;p=f(p,fa)){var t=p.id<this.id,a=[];for(const[w,[A,L]]of this.current){if(p.current.has(w)){var r=p.current.get(w)[0];if(t&&A!==r)p.current.set(w,[A,L]);else continue}a.push(w)}if(t)for(const[w,A]of this.async_deriveds){const L=p.async_deriveds.get(w);L&&A.promise.then(L.resolve).catch(L.reject)}var i=[...p.current.keys()].filter(w=>!p.current.get(w)[1]);if(!(!f(p,Ca)||i.length===0)){var o=i.filter(w=>!this.current.has(w));if(o.length===0)t&&p.discard();else if(a.length>0){if(t)for(const w of f(this,Oa))p.unskip_effect(w,A=>{var L;(A.f&(Sn|Ta))!==0?p.schedule(A):$e(L=p,Be,Sa).call(L,[A])});p.activate();var d=new Set,c=new Map;for(var u of a)ks(u,o,d,c);c=new Map;var v=[...p.current].filter(([w,A])=>{const L=this.current.get(w);return L?L[0]!==A[0]||L[1]!==A[1]:!0}).map(([w])=>w);if(v.length>0)for(const w of f(this,cr))(w.f&(_n|Ut|Er))===0&&bi(w,v,c)&&((w.f&(Ta|Sn))!==0?(gt(w,Ct),p.schedule(w)):f(p,Un).add(w));if(f(p,jt).length>0&&!f(p,pa)){p.apply();for(var h of f(p,jt))$e(E=p,Be,ci).call(E,h,[],[]);se(p,jt,[])}p.deactivate()}}}},Ja=function(){if(this.linked){var t=f(this,Zn),a=f(this,fa);t===null?Ur=a:se(t,fa,a),a===null?Ma=t:se(a,Zn,t),this.linked=!1}};let wa=zr;function Xl(e){var t=Xa;Xa=!0;try{for(var a;;){if(Rl(),W===null)return a;W.flush()}}finally{Xa=t}}function eo(){try{bl()}catch(e){Xn(e,oi)}}let wn=null;function zi(e){var t=e.length;if(t!==0){for(var a=0;a<t;){var r=e[a++];if((r.f&(_n|Ut))===0&&pr(r)&&(wn=new Set,Na(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&Bs(r),(wn==null?void 0:wn.size)>0)){_a.clear();for(const i of wn){if((i.f&(_n|Ut))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)wn.has(d)&&(wn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(_n|Ut))===0&&Na(u)}}wn.clear()}}wn=null}}function ks(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&zt)!==0?ks(i,t,a,r):(o&(Ta|Sn))!==0&&(o&Ct)===0&&bi(i,t,r)&&(gt(i,Ct),yi(i))}}function bi(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(Sr.call(t,i))return!0;if((i.f&zt)!==0&&bi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function yi(e){W.schedule(e)}function Ms(e,t){if(!((e.f&Tn)!==0&&(e.f&St)!==0)){(e.f&Ct)!==0?t.d.push(e):(e.f&qn)!==0&&t.m.push(e),gt(e,St);for(var a=e.first;a!==null;)Ms(a,t),a=a.next}}function Ss(e){gt(e,St);for(var t=e.first;t!==null;)Ss(t),t=t.next}let Ar=new Set;const _a=new Map;let Es=!1;function xa(e,t){var a={f:0,v:e,reactions:null,equals:us,rv:0,wv:0};return a}function B(e,t){const a=xa(e);return Fs(a),a}function to(e,t=!1,a=!0){const r=xa(e);return t||(r.equals=vs),r}function g(e,t,a=!1){he!==null&&(!En||(he.f&Er)!==0)&&fs()&&(he.f&(zt|Sn|Ta|Er))!==0&&(On===null||!On.has(e))&&xl();let r=a?Dt(t):t;return Ia(e,r,kr)}function Ia(e,t,a=null){if(!e.equals(t)){_a.set(e,aa?t:e.v);var r=wa.ensure();if(r.capture(e,t),(e.f&zt)!==0){const i=e;(e.f&Ct)!==0&&mi(i),At===null&&gi(i)}e.wv=Gs(),Ts(e,Ct,a),me!==null&&(me.f&St)!==0&&(me.f&(Tn|na))===0&&(cn===null?fo([e]):cn.push(e)),!r.is_fork&&Ar.size>0&&!Es&&no()}return t}function no(){Es=!1;for(const e of Ar){(e.f&St)!==0&>(e,qn);let t;try{t=pr(e)}catch{t=!0}t&&Na(e)}Ar.clear()}function er(e){g(e,e.v+1)}function Ts(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&Ct)===0;if(u&>(d,t),(c&Er)!==0)Ar.add(d);else if((c&zt)!==0){var v=d;At==null||At.delete(v),(c&ya)===0&&(c&gn&&(me===null||(me.f&Tr)===0)&&(d.f|=ya),Ts(v,qn,a))}else if(u){var h=d;(c&Sn)!==0&&wn!==null&&wn.add(h),a!==null?a.push(h):yi(h)}}}function Dt(e){if(typeof e!="object"||e===null||$a in e)return e;const t=is(e);if(t!==sl&&t!==ll)return e;var a=new Map,r=hi(e),i=B(0),o=ba,d=c=>{if(ba===o)return c();var u=he,v=ba;mn(null),qi(o);var h=c();return mn(u),qi(v),h};return r&&a.set("length",B(e.length)),new Proxy(e,{defineProperty(c,u,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&yl();var h=a.get(u);return h===void 0?d(()=>{var E=B(v.value);return a.set(u,E),E}):g(h,v.value,!0),!0},deleteProperty(c,u){var v=a.get(u);if(v===void 0){if(u in c){const h=d(()=>B(Mt));a.set(u,h),er(i)}}else g(v,Mt),er(i);return!0},get(c,u,v){var w;if(u===$a)return e;var h=a.get(u),E=u in c;if(h===void 0&&(!E||(w=Ya(c,u))!=null&&w.writable)&&(h=d(()=>{var A=Dt(E?c[u]:Mt),L=B(A);return L}),a.set(u,h)),h!==void 0){var p=n(h);return p===Mt?void 0:p}return Reflect.get(c,u,v)},getOwnPropertyDescriptor(c,u){var v=Reflect.getOwnPropertyDescriptor(c,u);if(v&&"value"in v){var h=a.get(u);h&&(v.value=n(h))}else if(v===void 0){var E=a.get(u),p=E==null?void 0:E.v;if(E!==void 0&&p!==Mt)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return v},has(c,u){var p;if(u===$a)return!0;var v=a.get(u),h=v!==void 0&&v.v!==Mt||Reflect.has(c,u);if(v!==void 0||me!==null&&(!h||(p=Ya(c,u))!=null&&p.writable)){v===void 0&&(v=d(()=>{var w=h?Dt(c[u]):Mt,A=B(w);return A}),a.set(u,v));var E=n(v);if(E===Mt)return!1}return h},set(c,u,v,h){var re;var E=a.get(u),p=u in c;if(r&&u==="length")for(var w=v;w<E.v;w+=1){var A=a.get(w+"");A!==void 0?g(A,Mt):w in c&&(A=d(()=>B(Mt)),a.set(w+"",A))}if(E===void 0)(!p||(re=Ya(c,u))!=null&&re.writable)&&(E=d(()=>B(void 0)),g(E,Dt(v)),a.set(u,E));else{p=E.v!==Mt;var L=d(()=>Dt(v));g(E,L)}var M=Reflect.getOwnPropertyDescriptor(c,u);if(M!=null&&M.set&&M.set.call(h,v),!p){if(r&&typeof u=="string"){var R=a.get("length"),Se=Number(u);Number.isInteger(Se)&&Se>=R.v&&g(R,Se+1)}er(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!==Mt});for(var[v,h]of a)h.v!==Mt&&!(v in c)&&u.push(v);return u},setPrototypeOf(){wl()}})}function Pi(e){try{if(e!==null&&typeof e=="object"&&$a in e)return e[$a]}catch{}return e}function ao(e,t){return Object.is(Pi(e),Pi(t))}var Di,$s,As,Cs;function ro(){if(Di===void 0){Di=window,$s=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;As=Ya(t,"firstChild").get,Cs=Ya(t,"nextSibling").get,Ci(e)&&(e[ai]=void 0,e[br]=null,e[ri]=void 0,e.__e=void 0),Ci(a)&&(a[Va]=void 0)}}function Hn(e=""){return document.createTextNode(e)}function ea(e){return As.call(e)}function fr(e){return Cs.call(e)}function l(e,t){return ea(e)}function _t(e,t=!1){{var a=ea(e);return a instanceof Comment&&a.data===""?fr(a):a}}function s(e,t=1,a=!1){let r=e;for(;t--;)r=fr(r);return r}function io(e){e.textContent=""}function Ls(){return!1}function zs(e,t,a){return t==null||t===cs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Oi=!1;function so(){Oi||(Oi=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[yr])==null||t.call(a)})},{capture:!0}))}function wi(e){var t=he,a=me;mn(null),Bn(null);try{return e()}finally{mn(t),Bn(a)}}function xi(e,t,a,r=a){e.addEventListener(t,()=>wi(a));const i=e[yr];i?e[yr]=()=>{i(),r(!0)}:e[yr]=()=>r(!0),so()}function lo(e){me===null&&(he===null&&ml(),_l()),aa&&gl()}function oo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function Vn(e,t){var a=me;a!==null&&(a.f&Ut)!==0&&(e|=Ut);var r={ctx:Lt,deps:null,nodes:null,f:e|Ct|gn,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};W==null||W.register_created_effect(r);var i=r;if((e&Ra)!==0)Ea!==null?Ea.push(r):wa.ensure().schedule(r);else if(t!==null){try{Na(r)}catch(d){throw Qt(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ga)===0&&(i=i.first,(e&Sn)!==0&&(e&qa)!==0&&i!==null&&(i.f|=qa))}if(i!==null&&(i.parent=a,a!==null&&oo(i,a),he!==null&&(he.f&zt)!==0&&(e&na)===0)){var o=he;(o.effects??(o.effects=[])).push(i)}return r}function ki(){return he!==null&&!En}function Ps(e){const t=Vn(Or,null);return gt(t,St),t.teardown=e,t}function Mi(e){lo();var t=me.f,a=!he&&(t&Tn)!==0&&Lt!==null&&!Lt.i;if(a){var r=Lt;(r.e??(r.e=[])).push(e)}else return Ds(e)}function Ds(e){return Vn(Ra|ul,e)}function co(e){wa.ensure();const t=Vn(na|Ga,e);return(a={})=>new Promise(r=>{a.outro?ma(t,()=>{Qt(t),r(void 0)}):(Qt(t),r(void 0))})}function Os(e){return Vn(Ra,e)}function uo(e){return Vn(Ta|Ga,e)}function qr(e,t=0){return Vn(Or|t,e)}function O(e,t=[],a=[],r=[]){Hl(r,t,a,i=>{Vn(Or,()=>{e(...i.map(n))})})}function Si(e,t=0){var a=Vn(Sn|t,e);return a}function pn(e){return Vn(Tn|Ga,e)}function Rs(e){var t=e.teardown;if(t!==null){const a=aa,r=he;Ri(!0),mn(null);try{t.call(null)}finally{Ri(a),mn(r)}}}function Ei(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&wi(()=>{i.abort(Rr)});var r=a.next;(a.f&na)!==0?a.parent=null:Qt(a,t),a=r}}function vo(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&Tn)===0&&Qt(t),t=a}}function Qt(e,t=!0){var a=!1;(t||(e.f&cl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(qs(e.nodes.start,e.nodes.end),a=!0),e.f|=ni,Ei(e,t&&!a),sr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();Rs(e),e.f^=ni,e.f|=_n;var i=e.parent;i!==null&&i.first!==null&&Bs(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function qs(e,t){for(;e!==null;){var a=e===t?null:fr(e);e.remove(),e=a}}function Bs(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=[];Is(e,r,!0);var i=()=>{a&&Qt(e),t&&t()},o=r.length;if(o>0){var d=()=>--o||i();for(var c of r)c.out(d)}else i()}function Is(e,t,a){if((e.f&Ut)===0){e.f^=Ut;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&na)===0){var d=(i.f&qa)!==0||(i.f&Tn)!==0&&(e.f&Sn)!==0;Is(i,t,d?a:!1)}i=o}}}function Cr(e){Ns(e,!0)}function Ns(e,t){if((e.f&Ut)!==0){e.f^=Ut,(e.f&St)===0&&(gt(e,Ct),wa.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&qa)!==0||(a.f&Tn)!==0;Ns(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 Ti(e,t){if(e.nodes)for(var a=e.nodes.start,r=e.nodes.end;a!==null;){var i=a===r?null:fr(a);t.append(a),a=i}}let Mr=!1,aa=!1;function Ri(e){aa=e}let he=null,En=!1;function mn(e){he=e}let me=null;function Bn(e){me=e}let On=null;function Fs(e){he!==null&&(On??(On=new Set)).add(e)}let Jt=null,nn=0,cn=null;function fo(e){cn=e}let Ks=1,oa=0,ba=oa;function qi(e){ba=e}function Gs(){return++Ks}function pr(e){var t=e.f;if((t&Ct)!==0)return!0;if(t&zt&&(e.f&=~ya),(t&qn)!==0){for(var a=e.deps,r=a.length,i=0;i<r;i++){var o=a[i];if(pr(o)&&bs(o),o.wv>e.wv)return!0}(t&gn)!==0&&At===null&>(e,St)}return!1}function Us(e,t,a=!0){var r=e.reactions;if(r!==null&&!(On!==null&&On.has(e)))for(var i=0;i<r.length;i++){var o=r[i];(o.f&zt)!==0?Us(o,t,!1):t===o&&(a?gt(o,Ct):(o.f&St)!==0&>(o,qn),yi(o))}}function Hs(e){var L;var t=Jt,a=nn,r=cn,i=he,o=On,d=Lt,c=En,u=ba,v=e.f;Jt=null,nn=0,cn=null,he=(v&(Tn|na))===0?e:null,On=null,Ba(e.ctx),En=!1,ba=++oa,e.ac!==null&&(wi(()=>{e.ac.abort(Rr)}),e.ac=null);try{e.f|=Tr;var h=e.fn,E=h();e.f|=Ka;var p=e.deps,w=W==null?void 0:W.is_fork;if(Jt!==null){var A;if(w||sr(e,nn),p!==null&&nn>0)for(p.length=nn+Jt.length,A=0;A<Jt.length;A++)p[nn+A]=Jt[A];else e.deps=p=Jt;if(ki()&&(e.f&gn)!==0)for(A=nn;A<p.length;A++)((L=p[A]).reactions??(L.reactions=[])).push(e)}else!w&&p!==null&&nn<p.length&&(sr(e,nn),p.length=nn);if(fs()&&cn!==null&&!En&&p!==null&&(e.f&(zt|qn|Ct))===0)for(A=0;A<cn.length;A++)Us(cn[A],e);if(i!==null&&i!==e){if(oa++,i.deps!==null)for(let M=0;M<a;M+=1)i.deps[M].rv=oa;if(t!==null)for(const M of t)M.rv=oa;cn!==null&&(r===null?r=cn:r.push(...cn))}return(e.f&ta)!==0&&(e.f^=ta),E}catch(M){return hs(M)}finally{e.f^=Tr,Jt=t,nn=a,cn=r,he=i,On=o,Ba(d),En=c,ba=u}}function po(e,t){let a=t.reactions;if(a!==null){var r=al.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&zt)!==0&&(Jt===null||!Sr.call(Jt,t))){var o=t;(o.f&gn)!==0&&(o.f^=gn,o.f&=~ya),o.v!==Mt&&gi(o),Ql(o),sr(o,0)}}function sr(e,t){var a=e.deps;if(a!==null)for(var r=t;r<a.length;r++)po(e,a[r])}function Na(e){var t=e.f;if((t&_n)===0){gt(e,St);var a=me,r=Mr;me=e,Mr=!0;try{(t&(Sn|ls))!==0?vo(e):Ei(e),Rs(e);var i=Hs(e);e.teardown=typeof i=="function"?i:null,e.wv=Ks;var o}finally{Mr=r,me=a}}}async function ho(){await Promise.resolve(),Xl()}function n(e){var t=e.f,a=(t&zt)!==0;if(he!==null&&!En){var r=me!==null&&(me.f&_n)!==0;if(!r&&(On===null||!On.has(e))){var i=he.deps;if((he.f&Tr)!==0)e.rv<oa&&(e.rv=oa,Jt===null&&i!==null&&i[nn]===e?nn++:Jt===null?Jt=[e]:Jt.push(e));else{he.deps??(he.deps=[]),Sr.call(he.deps,e)||he.deps.push(e);var o=e.reactions;o===null?e.reactions=[he]:Sr.call(o,he)||o.push(he)}}}if(aa&&_a.has(e))return _a.get(e);if(a){var d=e;if(aa){var c=d.v;return((d.f&St)===0&&d.reactions!==null||Ws(d))&&(c=mi(d)),_a.set(d,c),c}var u=(d.f&gn)===0&&!En&&he!==null&&(Mr||(he.f&gn)!==0),v=(d.f&Ka)===0;pr(d)&&(u&&(d.f|=gn),bs(d)),u&&!v&&(ys(d),Vs(d))}if(At!=null&&At.has(e))return At.get(e);if((e.f&ta)!==0)throw e.v;return e.v}function Vs(e){if(e.f|=gn,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),(t.f&zt)!==0&&(t.f&gn)===0&&(ys(t),Vs(t))}function Ws(e){if(e.v===Mt)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(_a.has(t)||(t.f&zt)!==0&&Ws(t))return!0;return!1}function Ua(e){var t=En;try{return En=!0,e()}finally{En=t}}const go=["touchstart","touchmove"];function _o(e){return go.includes(e)}const da=Symbol("events"),js=new Set,ui=new Set;function P(e,t,a){(t[da]??(t[da]={}))[e]=a}function ka(e){for(var t=0;t<e.length;t++)js.add(e[t]);for(var a of ui)a(e)}let Bi=null;function Ii(e){var L,M;var t=this,a=t.ownerDocument,r=e.type,i=((L=e.composedPath)==null?void 0:L.call(e))||[],o=i[0]||e.target;Bi=e;var d=0,c=Bi===e&&e[da];if(c){var u=i.indexOf(c);if(u!==-1&&(t===document||t===window)){e[da]=t;return}var v=i.indexOf(t);if(v===-1)return;u<=v&&(d=u)}if(o=i[d]||e.target,o!==t){rl(e,"currentTarget",{configurable:!0,get(){return o||a}});var h=he,E=me;mn(null),Bn(null);try{for(var p,w=[];o!==null&&o!==t;){try{var A=(M=o[da])==null?void 0:M[r];A!=null&&(!o.disabled||e.target===o)&&A.call(o,e)}catch(R){p?w.push(R):p=R}if(e.cancelBubble)break;d++,o=d<i.length?i[d]:null}if(p){for(let R of w)queueMicrotask(()=>{throw R});throw p}}finally{e[da]=t,delete e.currentTarget,mn(h),Bn(E)}}}var ns;const Vr=((ns=globalThis==null?void 0:globalThis.window)==null?void 0:ns.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function mo(e){return(Vr==null?void 0:Vr.createHTML(e))??e}function bo(e){var t=zs("template");return t.innerHTML=mo(e.replaceAll("<!>","<!---->")),t.content}function Fa(e,t){var a=me;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var a=(t&$l)!==0,r=(t&Al)!==0,i,o=!e.startsWith("<!>");return()=>{i===void 0&&(i=bo(o?e:"<!>"+e),a||(i=ea(i)));var d=r||$s?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=ea(d),u=d.lastChild;Fa(c,u)}else Fa(d,d);return d}}function tr(e=""){{var t=Hn(e+"");return Fa(t,t),t}}function Br(){var e=document.createDocumentFragment(),t=document.createComment(""),a=Hn();return e.append(t,a),Fa(t,a),e}function b(e,t){e!==null&&e.before(t)}function m(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Va]??(e[Va]=e.nodeValue))&&(e[Va]=a,e.nodeValue=`${a}`)}function yo(e,t){return wo(e,t)}const _r=new Map;function wo(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){ro();var u=void 0,v=co(()=>{var h=a??t.appendChild(Hn());Nl(h,{pending:()=>{}},w=>{ra({});var A=Lt;o&&(A.c=o),i&&(r.$$events=i),u=e(w,r)||{},ia()},c);var E=new Set,p=w=>{for(var A=0;A<w.length;A++){var L=w[A];if(!E.has(L)){E.add(L);var M=_o(L);for(const re of[t,document]){var R=_r.get(re);R===void 0&&(R=new Map,_r.set(re,R));var Se=R.get(L);Se===void 0?(re.addEventListener(L,Ii,{passive:M}),R.set(L,1)):R.set(L,Se+1)}}}};return p(Dr(js)),ui.add(p),()=>{var M;for(var w of E)for(const R of[t,document]){var A=_r.get(R),L=A.get(w);--L==0?(R.removeEventListener(w,Ii),A.delete(w),A.size===0&&_r.delete(R)):A.set(w,L)}ui.delete(p),h!==a&&((M=h.parentNode)==null||M.removeChild(h))}});return xo.set(u,v),u}let xo=new WeakMap;var kn,Pn,rn,ha,ur,vr,Pr;class ko{constructor(t,a=!0){en(this,"anchor");de(this,kn,new Map);de(this,Pn,new Map);de(this,rn,new Map);de(this,ha,new Set);de(this,ur,!0);de(this,vr,t=>{if(f(this,kn).has(t)){var a=f(this,kn).get(t),r=f(this,Pn).get(a);if(r)Cr(r),f(this,ha).delete(a);else{var i=f(this,rn).get(a);i&&(Cr(i.effect),f(this,Pn).set(a,i.effect),f(this,rn).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of f(this,kn)){if(f(this,kn).delete(o),o===t)break;const c=f(this,rn).get(d);c&&(Qt(c.effect),f(this,rn).delete(d))}for(const[o,d]of f(this,Pn)){if(o===a||f(this,ha).has(o))continue;const c=()=>{if(Array.from(f(this,kn).values()).includes(o)){var v=document.createDocumentFragment();Ti(d,v),v.append(Hn()),f(this,rn).set(o,{effect:d,fragment:v})}else Qt(d);f(this,ha).delete(o),f(this,Pn).delete(o)};f(this,ur)||!r?(f(this,ha).add(o),ma(d,c,!1)):c()}}});de(this,Pr,t=>{f(this,kn).delete(t);const a=Array.from(f(this,kn).values());for(const[r,i]of f(this,rn))a.includes(r)||(Qt(i.effect),f(this,rn).delete(r))});this.anchor=t,se(this,ur,a)}ensure(t,a){var r=W,i=Ls();if(a&&!f(this,Pn).has(t)&&!f(this,rn).has(t))if(i){var o=document.createDocumentFragment(),d=Hn();o.append(d),f(this,rn).set(t,{effect:pn(()=>a(d)),fragment:o})}else f(this,Pn).set(t,pn(()=>a(this.anchor)));if(f(this,kn).set(r,t),i){for(const[c,u]of f(this,Pn))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of f(this,rn))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(f(this,vr)),r.ondiscard(f(this,Pr))}else f(this,vr).call(this,r)}}kn=new WeakMap,Pn=new WeakMap,rn=new WeakMap,ha=new WeakMap,ur=new WeakMap,vr=new WeakMap,Pr=new WeakMap;function G(e,t,a=!1){var r=new ko(e),i=a?qa:0;function o(d,c){r.ensure(d,c)}Si(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function Ye(e,t){return t}function Mo(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;vi(e,Dr(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,h=v.parentNode;io(h),h.append(v),e.items.clear()}vi(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function vi(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|=Dn;const d=document.createDocumentFragment();Ti(o,d)}else Qt(t[i],a)}}var Ni;function Ze(e,t,a,r,i,o=null){var d=e,c=new Map,u=(t&ds)!==0;if(u){var v=e;d=v.appendChild(Hn())}var h=null,E=jl(()=>{var re=a();return hi(re)?re:re==null?[]:Dr(re)}),p,w=new Map,A=!0;function L(re){(Se.effect.f&_n)===0&&(Se.pending.delete(re),Se.fallback=h,So(Se,p,d,t,r),h!==null&&(p.length===0?(h.f&Dn)===0?Cr(h):(h.f^=Dn,Qa(h,null,d)):ma(h,()=>{h=null})))}function M(re){Se.pending.delete(re)}var R=Si(()=>{p=n(E);for(var re=p.length,ve=new Set,be=W,F=Ls(),H=0;H<re;H+=1){var ue=p[H],fe=r(ue,H),Ee=A?null:c.get(fe);Ee?(Ee.v&&Ia(Ee.v,ue),Ee.i&&Ia(Ee.i,H),F&&be.unskip_effect(Ee.e)):(Ee=Eo(c,A?d:Ni??(Ni=Hn()),ue,fe,H,i,t,a),A||(Ee.e.f|=Dn),c.set(fe,Ee)),ve.add(fe)}if(re===0&&o&&!h&&(A?h=pn(()=>o(d)):(h=pn(()=>o(Ni??(Ni=Hn()))),h.f|=Dn)),re>ve.size&&hl(),!A)if(w.set(be,ve),F){for(const[ze,nt]of c)ve.has(ze)||be.skip_effect(nt.e);be.oncommit(L),be.ondiscard(M)}else L(be);n(E)}),Se={effect:R,items:c,pending:w,outrogroups:null,fallback:h};A=!1}function Ha(e){for(;e!==null&&(e.f&Tn)===0;)e=e.next;return e}function So(e,t,a,r,i){var Ee,ze,nt,T,J,oe,Pe,Q,ye;var o=(r&El)!==0,d=t.length,c=e.items,u=Ha(e.effect.first),v,h=null,E,p=[],w=[],A,L,M,R;if(o)for(R=0;R<d;R+=1)A=t[R],L=i(A,R),M=c.get(L).e,(M.f&Dn)===0&&((ze=(Ee=M.nodes)==null?void 0:Ee.a)==null||ze.measure(),(E??(E=new Set)).add(M));for(R=0;R<d;R+=1){if(A=t[R],L=i(A,R),M=c.get(L).e,e.outrogroups!==null)for(const ne of e.outrogroups)ne.pending.delete(M),ne.done.delete(M);if((M.f&Ut)!==0&&(Cr(M),o&&((T=(nt=M.nodes)==null?void 0:nt.a)==null||T.unfix(),(E??(E=new Set)).delete(M))),(M.f&Dn)!==0)if(M.f^=Dn,M===u)Qa(M,null,a);else{var Se=h?h.next:u;M===e.effect.last&&(e.effect.last=M.prev),M.prev&&(M.prev.next=M.next),M.next&&(M.next.prev=M.prev),Jn(e,h,M),Jn(e,M,Se),Qa(M,Se,a),h=M,p=[],w=[],u=Ha(h.next);continue}if(M!==u){if(v!==void 0&&v.has(M)){if(p.length<w.length){var re=w[0],ve;h=re.prev;var be=p[0],F=p[p.length-1];for(ve=0;ve<p.length;ve+=1)Qa(p[ve],re,a);for(ve=0;ve<w.length;ve+=1)v.delete(w[ve]);Jn(e,be.prev,F.next),Jn(e,h,be),Jn(e,F,re),u=re,h=F,R-=1,p=[],w=[]}else v.delete(M),Qa(M,u,a),Jn(e,M.prev,M.next),Jn(e,M,h===null?e.effect.first:h.next),Jn(e,h,M),h=M;continue}for(p=[],w=[];u!==null&&u!==M;)(v??(v=new Set)).add(u),w.push(u),u=Ha(u.next);if(u===null)continue}(M.f&Dn)===0&&p.push(M),h=M,u=Ha(M.next)}if(e.outrogroups!==null){for(const ne of e.outrogroups)ne.pending.size===0&&(vi(e,Dr(ne.done)),(J=e.outrogroups)==null||J.delete(ne));e.outrogroups.size===0&&(e.outrogroups=null)}if(u!==null||v!==void 0){var H=[];if(v!==void 0)for(M of v)(M.f&Ut)===0&&H.push(M);for(;u!==null;)(u.f&Ut)===0&&u!==e.fallback&&H.push(u),u=Ha(u.next);var ue=H.length;if(ue>0){var fe=(r&ds)!==0&&d===0?a:null;if(o){for(R=0;R<ue;R+=1)(Pe=(oe=H[R].nodes)==null?void 0:oe.a)==null||Pe.measure();for(R=0;R<ue;R+=1)(ye=(Q=H[R].nodes)==null?void 0:Q.a)==null||ye.fix()}Mo(e,H,fe)}}o&&ga(()=>{var ne,Ke;if(E!==void 0)for(M of E)(Ke=(ne=M.nodes)==null?void 0:ne.a)==null||Ke.apply()})}function Eo(e,t,a,r,i,o,d,c){var u=(d&Ml)!==0?(d&Tl)===0?to(a,!1,!1):xa(a):null,v=(d&Sl)!==0?xa(i):null;return{v:u,i:v,e:pn(()=>(o(t,u??a,v??i,c),()=>{e.delete(r)}))}}function Qa(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&Dn)===0?t.nodes.start:a;r!==null;){var d=fr(r);if(o.before(r),r===i)return;r=d}}function Jn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function qe(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;O(()=>{var v=me;if(c!==(c=t()??"")){if(a){v.nodes=null,u.innerHTML=c,c!==""&&Fa(ea(u),u.lastChild);return}if(v.nodes!==null&&(qs(v.nodes.start,v.nodes.end),v.nodes=null),c!==""){var h=r?Cl:i?Ll:void 0,E=zs(r?"svg":i?"math":"template",h);E.innerHTML=c;var p=r||i?E:E.content;if(Fa(ea(p),p.lastChild),r||i)for(;ea(p);)d.before(ea(p));else d.before(p)}}})}function To(e,t,a){var r=e==null?"":""+e;return r===""?null:r}function $o(e,t){return e==null?null:String(e)}function vt(e,t,a,r,i,o){var d=e[ai];if(d!==a||d===void 0){var c=To(a);c==null?e.removeAttribute("class"):e.className=c,e[ai]=a}return o}function hn(e,t,a,r){var i=e[ri];if(i!==t){var o=$o(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[ri]=t}return r}function Js(e,t,a=!1){if(e.multiple){if(t==null)return;if(!hi(t))return Pl();for(var r of e.options)r.selected=t.includes(ar(r));return}for(r of e.options){var i=ar(r);if(ao(i,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function Ao(e){var t=new MutationObserver(()=>{Js(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Ps(()=>{t.disconnect()})}function nr(e,t,a=t){var r=new WeakSet,i=!0;xi(e,"change",o=>{var d=o?"[selected]":":checked",c;if(e.multiple)c=[].map.call(e.querySelectorAll(d),ar);else{var u=e.querySelector(d)??e.querySelector("option:not([disabled])");c=u&&ar(u)}a(c),e.__value=c,W!==null&&r.add(W)}),Os(()=>{var o=t();if(e===document.activeElement){var d=W;if(r.has(d))return}if(Js(e,o,i),i&&o===void 0){var c=e.querySelector(":checked");c!==null&&(o=ar(c),a(o))}e.__value=o,i=!1}),Ao(e)}function ar(e){return"__value"in e?e.__value:e.value}const Co=Symbol("is custom element"),Lo=Symbol("is html"),zo=fl?"progress":"PROGRESS";function mr(e,t){var a=Qs(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==zo)||(e.value=t??"")}function Ir(e,t,a,r){var i=Qs(e);i[t]!==(i[t]=a)&&(t==="loading"&&(e[vl]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Po(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Qs(e){return e[br]??(e[br]={[Co]:e.nodeName.includes("-"),[Lo]:e.namespaceURI===cs})}var Fi=new Map;function Po(e){var t=e.getAttribute("is")||e.nodeName,a=Fi.get(t);if(a)return a;Fi.set(t,a=[]);for(var r,i=e,o=Element.prototype;o!==i;){r=il(i);for(var d in r)r[d].set&&d!=="innerHTML"&&d!=="textContent"&&d!=="innerText"&&a.push(d);i=is(i)}return a}function Ln(e,t,a=t){var r=new WeakSet;xi(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Wr(e)?jr(o):o,a(o),W!==null&&r.add(W),await ho(),o!==(o=t())){var d=e.selectionStart,c=e.selectionEnd,u=e.value.length;if(e.value=o??"",c!==null){var 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))}}}),Ua(t)==null&&e.value&&(a(Wr(e)?jr(e.value):e.value),W!==null&&r.add(W)),qr(()=>{var i=t();if(e===document.activeElement){var o=W;if(r.has(o))return}Wr(e)&&i===jr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function Do(e,t,a=t){xi(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Ua(t)==null&&a(e.checked),qr(()=>{var r=t();e.checked=!!r})}function Wr(e){var t=e.type;return t==="number"||t==="range"}function jr(e){return e===""?null:+e}function Jr(e,t){return e===t||(e==null?void 0:e[$a])===t}function Oo(e={},t,a,r){var i=Lt.r,o=me;return Os(()=>{var d,c;return qr(()=>{d=c,c=[],Ua(()=>{Jr(a(...c),e)||(t(e,...c),d&&Jr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.f∋)u=u.parent;const v=()=>{c&&Jr(a(...c),e)&&t(null,...c)},h=u.teardown;u.teardown=()=>{v(),h==null||h()}}}),e}function hr(e){Lt===null&&os(),Mi(()=>{const t=Ua(e);if(typeof t=="function")return t})}function Ro(e){Lt===null&&os(),hr(()=>()=>Ua(e))}let lr=localStorage.getItem("mc_token")||"";function Ys(){return lr}function qo(e){lr=(e||"").trim(),localStorage.setItem("mc_token",lr)}function Bo(){const e={"Content-Type":"application/json"};return lr&&(e["X-MC-Token"]=lr),e}function rr(){return localStorage.getItem("mc_hf_token")||""}function Io(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function ge(e,t={}){const a=await fetch(e,{headers:Bo(),...t}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||"HTTP "+a.status);return r}const No=(e,t=document)=>t.querySelector(e),Ki=(e,t=document)=>[...t.querySelectorAll(e)];function Rn(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Gi;function te(e,t=!1){const a=No("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Gi),Gi=setTimeout(()=>a.className="toast",3200))}function Fo(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 Re=e=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">${e}</svg>`,Nr={logo:Re('<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:Re('<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:Re('<rect x="6" y="6" width="12" height="12" rx="2"/><path d="M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3"/>'),pulse:Re('<path d="M3 12h4l2 6 4-14 2 8h6"/>'),server:Re('<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:Re('<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:Re('<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:Re('<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:Re('<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:Re('<rect x="3" y="4" width="18" height="12" rx="2"/><path d="M8 20h8M12 16v4"/>'),layers:Re('<path d="m12 2 9 5-9 5-9-5z"/><path d="m3 12 9 5 9-5M3 17l9 5 9-5"/>'),alert:Re('<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:Re('<path d="M12 14 16 9"/><circle cx="12" cy="13" r="9"/><path d="M12 4v2M21 13h-2M5 13H3"/>'),search:Re('<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>'),compass:Re('<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:Re('<polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/>'),eye:Re('<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:Re('<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:Re('<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:Re('<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:Re('<path d="M14 14.76V5a2 2 0 0 0-4 0v9.76a4 4 0 1 0 4 0z"/>'),shield:Re('<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:Re('<circle cx="12" cy="12" r="9"/><path d="M12 16v-4M12 8h.01"/>'),chevron:Re('<path d="m9 6 6 6-6 6"/>'),bolt:Re('<path d="M13 2 3 14h7l-1 8 10-12h-7z"/>'),x:Re('<path d="M18 6 6 18M6 6l12 12"/>'),check:Re('<path d="M20 6 9 17l-5-5"/>'),download:Re('<path d="M12 3v12M7 10l5 5 5-5"/><path d="M5 21h14"/>'),clock:Re('<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>')};function tn(e){return Nr[e]||""}function fi(e){return`<span class="info-dot" tabindex="0" title="${Rn(e)}" aria-label="${Rn(e)}">${Nr.info}</span>`}function sa(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 Mn({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>${Rn(e)}</h3>
|
||
<p>${t}</p>
|
||
<div class="modal-actions">
|
||
<button data-x="0">${Rn(r)}</button>
|
||
<button class="${i?"danger":"primary"}" data-x="1">${Rn(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 Ui({title:e,body:t="",placeholder:a="",password:r=!1,confirmLabel:i="Weiter",danger:o=!1}){return new Promise(d=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=`<div class="modal-card" role="dialog" aria-modal="true">
|
||
<h3>${Rn(e)}</h3>
|
||
${t?`<p>${t}</p>`:""}
|
||
<input type="${r?"password":"text"}" placeholder="${Rn(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">${Rn(i)}</button>
|
||
</div></div>`;const u=c.querySelector("input"),v=h=>{c.remove(),d(h)};c.addEventListener("click",h=>{if(h.target===c)return v(null);const E=h.target.closest("[data-x]");E&&v(E.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",h=>{h.key==="Enter"&&v(u.value||""),h.key==="Escape"&&v(null)}),document.body.appendChild(c),u.focus()})}function Ko(e="overview"){const t=Ki(".nav-item[data-view]:not(.disabled)"),a=Ki(".view[data-view]"),r=new Set(a.map(o=>o.dataset.view));function i(o){r.has(o)||(o=e),a.forEach(d=>d.hidden=d.dataset.view!==o),t.forEach(d=>d.classList.toggle("active",d.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return t.forEach(o=>o.addEventListener("click",d=>{d.preventDefault(),i(o.dataset.view)})),window.addEventListener("hashchange",()=>i(location.hash.replace("#/",""))),i(location.hash.replace("#/","")||e),{show:i}}let Hi=B(null);const gr={get value(){return n(Hi)},set(e){g(Hi,e,!0)}};let Vi=B(Dt([])),Qn=B(Dt([]));const ca={get value(){return n(Vi)},set(e){g(Vi,e||[],!0)},get tracked(){return n(Qn)},track(e){n(Qn).includes(e)||g(Qn,[...n(Qn),e],!0)},toggle(e){g(Qn,n(Qn).includes(e)?n(Qn).filter(t=>t!==e):[...n(Qn),e],!0)}};let Wi=B(null);const $i={get value(){return n(Wi)},set(e){g(Wi,e,!0)}},Go="5";var as;typeof window<"u"&&((as=window.__svelte??(window.__svelte={})).v??(as.v=new Set)).add(Go);var Uo=k('<span style="font-size:13px;font-weight:400;color:var(--mut)">— bereit für Anfragen</span>'),Ho=k('<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),Vo=k('<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),Wo=k('<div class="meter"><div class="meter-h"><span class="mk"> </span><span class="mv"> </span></div> <div><i></i></div></div>'),jo=k('<div class="empty">Warte auf Messwerte…</div>'),Jo=k('<span class="tag img">Bild</span>'),Qo=k('<span class="tag code">Code</span>'),Yo=k('<span class="tag text">Text</span>'),Zo=k('<span class="chip" style="padding:2px 7px;font-size:11px">∞ aktiv</span>'),Xo=k('<button class="ghost"> </button>'),ed=k('<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>'),ji=k('<div class="list"></div>'),td=k('<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>'),nd=k('<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>'),ad=k('<div class="empty">News gerade nicht ladbar.</div>'),rd=k('<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 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></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 id(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>$i.value),i=I(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),o=I(()=>{var S;return((S=n(a))==null?void 0:S.swap_ok)??!1}),d=["running","ready","loading","starting"],c=I(()=>n(i).find(S=>d.includes(S.state))),u=I(()=>n(i).filter(S=>!S.incomplete)),v=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),h=I(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(n(r).ram.percent)} % — eventuell Speicher freigeben.`:`${n(u).length} ${n(u).length===1?"Modell":"Modelle"} konfiguriert · ${n(c)?`„${n(c).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),E=I(()=>()=>{var ee;const S=(ee=n(r))==null?void 0:ee.gpu;return S&&S.vram.total+S.gtt.total>0?(S.vram.used+S.gtt.used)/(S.vram.total+S.gtt.total)*100:0});let p=B(Dt([])),w=B(null);hr(async()=>{try{g(p,((await ge("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function A(){await Mn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await ge("/api/unload",{method:"POST"}),M())}async function L(S){g(w,S,!0);try{await ge("/api/preload?model="+encodeURIComponent(S),{method:"POST"})}catch{}g(w,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function R(S){var ee;(ee=document.querySelector(`.nav-item[data-view="${S}"]`))==null||ee.dispatchEvent(new MouseEvent("click"))}function Se(S){return S>=90?"red":S>=75?"":"green"}function re(S){return S==null?"":S>=75?"red":S>=55?"":"green"}function ve(S){return S>=90?"red":S>=70?"":"green"}var be=rd(),F=_t(be),H=l(F),ue=l(H),fe=l(ue),Ee=s(fe);{var ze=S=>{var ee=Uo();b(S,ee)};G(Ee,S=>{n(o)&&!n(c)&&S(ze)})}var nt=s(ue,2),T=l(nt),J=s(F,2),oe=l(J),Pe=l(oe),Q=s(l(Pe),2);qe(Q,()=>tn("server"),!0);var ye=s(Pe,2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(oe,2),Ve=l(He),We=s(l(Ve),2);qe(We,()=>tn("cpu"),!0);var Tt=s(Ve,2),Pt=l(Tt),Ot=s(Tt,2),Rt=l(Ot);{var qt=S=>{var ee=tr();O(st=>m(ee,`${st??""} · ${n(c).state??""}`),[()=>{var st;return(st=n(c).meta)!=null&&st.ctx?Math.round(n(c).meta.ctx/1024)+"k ctx":""}]),b(S,ee)},D=S=>{var ee=tr("lädt bei erster Anfrage");b(S,ee)};G(Rt,S=>{n(c)?S(qt):S(D,-1)})}var U=s(He,2);{var Z=S=>{const ee=I(()=>{var lt;return n(r).gpu_temp??((lt=n(r).cpu)==null?void 0:lt.temp)??null}),st=I(()=>re(n(ee))),xe=I(()=>n(r).ram.total-n(r).ram.used),rt=I(()=>100-n(r).ram.percent);var Vt=Ho(),_e=_t(Vt),Qe=l(_e),dn=s(l(Qe));qe(dn,()=>tn("thermo"),!0);var Nt=s(Qe,2),In=l(Nt),Nn=s(Nt,2),An=l(Nn),_=s(_e,2),y=l(_),N=s(l(y));qe(N,()=>tn("database"),!0);var q=s(y,2),Y=l(q),Ce=s(q,2),Le=l(Ce);O((lt,yt,Te,De)=>{vt(_e,1,`kpi ${n(st)??""}`),m(In,lt),m(An,n(ee)==null?"messe…":n(ee)<55?"kühl":n(ee)<75?"normal":"⚠ heiß"),vt(_,1,`kpi ${n(rt)<15?"red":n(rt)<30?"":"green"}`),m(Y,yt),m(Le,`von ${Te??""} GB · ${De??""} % frei`)},[()=>n(ee)!=null?`${Math.round(n(ee))}°C`:"–",()=>Math.round(n(xe)/1073741824),()=>Math.round(n(r).ram.total/1073741824),()=>Math.round(n(rt))]),b(S,Vt)},le=S=>{var ee=Vo();b(S,ee)};G(U,S=>{n(r)?S(Z):S(le,-1)})}var x=s(J,2),z=l(x),K=s(l(z),4);{var ie=S=>{const ee=I(()=>n(E)());var st=Br(),xe=_t(st);Ze(xe,17,()=>{var rt;return[["Prozessor (CPU)",((rt=n(r).cpu)==null?void 0:rt.percent)??0,""],["Arbeitsspeicher (RAM)",n(r).ram.percent,Se(n(r).ram.percent)],["Grafikspeicher (VRAM)",n(ee),ve(n(ee))]]},Ye,(rt,Vt)=>{var _e=I(()=>ir(n(Vt),3));let Qe=()=>n(_e)[0],dn=()=>n(_e)[1];const Nt=I(()=>Math.max(0,Math.min(100,dn()||0)));var In=Wo(),Nn=l(In),An=l(Nn),_=l(An),y=s(An),N=l(y),q=s(Nn,2),Y=l(q);O((Ce,Le)=>{m(_,Qe()),m(N,`${Ce??""} %`),vt(q,1,`bar ${n(Nt)>=90?"bad":n(Nt)>=75?"warn":""}`),hn(Y,`width:${Le??""}%`)},[()=>Math.round(n(Nt)),()=>Math.max(2,n(Nt))]),b(rt,In)}),b(S,st)},$=S=>{var ee=jo();b(S,ee)};G(K,S=>{n(r)?S(ie):S($,-1)})}var V=s(z,2),ae=s(l(V),4),we=l(ae);qe(we,()=>tn("search"),!0);var Xe=s(we,4);qe(Xe,()=>tn("chevron"),!0);var Ae=s(ae,2),at=l(Ae);qe(at,()=>tn("refresh"),!0);var it=s(at,4);qe(it,()=>tn("chevron"),!0);var mt=s(Ae,2),et=l(mt);qe(et,()=>tn("file"),!0);var bt=s(et,4);qe(bt,()=>tn("chevron"),!0);var C=s(mt,2),X=l(C);qe(X,()=>tn("swap"),!0);var pe=s(X,4);qe(pe,()=>tn("chevron"),!0);var je=s(x,2),Ne=l(je),Bt=l(Ne),Ht=s(l(Bt),2),It=l(Ht),Yt=s(Bt,2);{var sn=S=>{var ee=ji();Ze(ee,21,()=>n(u),Ye,(st,xe)=>{const rt=I(()=>d.includes(n(xe).state)),Vt=I(()=>n(xe).state==="downloading"),_e=I(()=>n(xe).state==="loading"||n(xe).state==="starting"||n(Vt)?"load":n(rt)?"on":""),Qe=I(()=>n(Vt)?`↓ ${n(xe).download_progress!=null?Math.round(n(xe).download_progress)+"%":"..."}`:n(xe).state==="loading"||n(xe).state==="starting"?"lädt…":n(rt)?"geladen ✓":"bereit");var dn=ed(),Nt=l(dn),In=s(Nt,2),Nn=l(In),An=l(Nn),_=l(An),y=s(An,2);{var N=j=>{var ce=Jo();b(j,ce)},q=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Bild")}),Y=j=>{var ce=Qo();b(j,ce)},Ce=I(()=>{var j,ce;return(ce=(j=n(xe).meta)==null?void 0:j.caps)==null?void 0:ce.includes("Code")}),Le=j=>{var ce=Yo();b(j,ce)};G(y,j=>{n(q)?j(N):n(Ce)?j(Y,1):j(Le,-1)})}var lt=s(y,2);{var yt=j=>{var ce=Zo();b(j,ce)};G(lt,j=>{n(xe).ttl>=99999&&j(yt)})}var Te=s(Nn,2),De=l(Te),Me=s(In,2),ke=l(Me),Fe=l(ke),Ge=s(ke,2);{var Oe=j=>{var ce=Xo(),ot=l(ce);O(()=>{hn(ce,`padding:3px 9px;font-size:12px;opacity:${n(w)===n(xe).name?".5":"1"}`),ce.disabled=n(w)===n(xe).name,m(ot,n(w)===n(xe).name?"…":"Laden")}),P("click",ce,()=>L(n(xe).name)),b(j,ce)};G(Ge,j=>{!n(rt)&&!n(Vt)&&n(o)&&j(Oe)})}O((j,ce)=>{var ot;vt(Nt,1,`li-dot ${n(_e)??""}`),hn(An,n(rt)?"color:var(--accent)":""),m(_,n(xe).name),m(De,`${j??""}
|
||
${(ot=n(xe).meta)!=null&&ot.quant?" · "+n(xe).meta.quant:""}
|
||
${ce??""}`),hn(ke,`white-space:nowrap;color:${n(rt)?"var(--on)":"var(--mut)"}`),m(Fe,n(Qe))},[()=>{var j;return(j=n(xe).meta)!=null&&j.ctx?Math.round(n(xe).meta.ctx/1024)+"k ctx":""},()=>{var j;return(j=n(xe).meta)!=null&&j.size_bytes?" · "+(n(xe).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),b(st,dn)}),b(S,ee)},bn=S=>{var ee=td(),st=s(l(ee),4);P("click",st,()=>R("cookbook")),b(S,ee)};G(Yt,S=>{n(u).length?S(sn):S(bn,-1)})}var $n=s(Ne,2),ln=l($n),on=s(l(ln),2),yn=s(ln,2);{var Je=S=>{var ee=ji();Ze(ee,21,()=>n(p),Ye,(st,xe)=>{var rt=nd(),Vt=l(rt),_e=l(Vt),Qe=l(_e),dn=s(_e,2),Nt=l(dn);O(()=>{Ir(rt,"href",n(xe).link),m(Qe,n(xe).title),m(Nt,`${n(xe).source??""}${n(xe).relevant?" · für dich":""}`)}),b(st,rt)}),b(S,ee)},pt=S=>{var ee=ad();b(S,ee)};G(yn,S=>{n(p).length?S(Je):S(pt,-1)})}O(S=>{m(fe,`${n(v)??""} `),m(T,n(h)),vt(oe,1,`kpi ${n(o)?"green":"red"}`),m(ne,n(o)?"Online":"Offline"),m(Ie,S),vt(He,1,`kpi ${n(c)?"blue":"muted"}`),m(Pt,n(c)?n(c).name:"Keins"),m(It,n(u).length?n(u).length+" konfiguriert":"")},[()=>{var S,ee;return((ee=(S=n(a))==null?void 0:S.swap_url)==null?void 0:ee.replace(/^https?:\/\//,""))??"—"}]),P("click",ae,()=>R("cookbook")),P("click",Ae,A),P("click",mt,()=>R("server")),P("click",C,()=>R("connect")),P("click",on,()=>R("news")),P("keydown",on,S=>S.key==="Enter"&&R("news")),b(e,be),ia()}ka(["click","keydown"]);var sd=k("<option> </option>"),ld=k('<div class="reply" style="margin-top:12px"> </div>'),od=k('<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>'),dd=k('<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>'),cd=k('<span class="tag" style="background:rgba(45,212,191,.14);color:var(--accent);border-color:rgba(45,212,191,.3)"> </span>'),ud=k('<div class="li-sub mono-sm"> </div>'),vd=k('<code style="cursor:pointer" title="Klicken zum Kopieren"> </code>'),fd=k('<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>'),pd=k('<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>'),hd=k('<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>'),gd=k('<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>'),_d=k('<button style="border-radius:999px"> </button>'),md=k('<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>'),bd=k('<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 yd(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",r="Die Rolle ist ein zusätzlicher, sprechender Name (z.B. coder). Du kannst in deinen Tools entweder den echten Modellnamen ODER die Rolle angeben — beides führt zum selben Modell.",i=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=I(()=>{var x;return((x=gr.value)==null?void 0:x.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=B(""),u=B(""),v=B(""),h=B(!1);const E=I(()=>n(o).filter(x=>!x.incomplete));async function p(){var z;const x=n(c)||((z=n(E)[0])==null?void 0:z.name);if(!(!x||!n(u).trim())){g(h,!0),g(v,"(wecke Modell, kann beim Laden kurz dauern…)");try{const K=await ge("/api/chat",{method:"POST",body:JSON.stringify({model:x,message:n(u)})});g(v,K.reply,!0)}catch(K){g(v,"Fehler: "+K.message)}g(h,!1),d()}}const w=300;let A=B(!1),L=B(null),M=B(8192),R=B(!1);function Se(x){var z;g(L,n(o).find(K=>K.name===x),!0),n(L)&&(g(M,((z=n(L).meta)==null?void 0:z.ctx)||8192,!0),g(R,(n(L).ttl??w)>=99999),g(A,!0))}async function re(){const x=n(R)?99999:w;try{await ge("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(L).name,ctx:n(M),ttl:x})}),te("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(z){te(z.message,!0)}}let ve=B(!1),be=B(""),F=B(""),H=B("");function ue(x){const z=n(o).find(K=>K.name===x);g(be,x,!0),g(H,(z==null?void 0:z.role)||"",!0),g(F,""),g(ve,!0)}async function fe(x){try{await ge("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(be),role:x})}),te(x?`Rolle gesetzt: ${x}`:"Rolle entfernt."),g(ve,!1),d()}catch(z){te(z.message,!0)}}async function Ee(x){if(await Mn({title:`„${x}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await ge("/api/unload?model="+encodeURIComponent(x),{method:"POST"}),te("Entladen: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}async function ze(x){if(await Mn({title:`„${x}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. <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 z=await ge("/api/delete_model",{method:"POST",body:JSON.stringify({alias:x})});te(z.note||"Gelöscht: "+x),setTimeout(d,600)}catch(z){te(z.message,!0)}}function nt(x){return x!=null&&x.length?x.map(z=>z==="Code"?'<span class="tag code">Code</span>':z==="Bild"?'<span class="tag img">Bild</span>':'<span class="tag text">Text</span>').join(" "):"–"}function T(x){if(!x)return"–";const z=x.quant||"?",K=x.ctx?Math.round(x.ctx/1024)+"K":"?",ie=x.size_bytes?(x.size_bytes/1024**3).toFixed(1)+" GB":"?";return`<span class="mono-sm">${z} · ${K} · ${ie}</span>`}function J(x){var z;(z=navigator.clipboard)==null||z.writeText(x),te("Kopiert: "+x)}var oe=bd(),Pe=s(_t(oe),2),Q=s(l(Pe),6);Ze(Q,21,()=>n(E),Ye,(x,z)=>{var K=sd(),ie=l(K),$={};O(()=>{m(ie,n(z).name),$!==($=n(z).name)&&(K.value=(K.__value=n(z).name)??"")}),b(x,K)});var ye=s(Q,4),ne=s(ye,2),Ke=l(ne),Ie=s(ne,2);{var He=x=>{var z=ld(),K=l(z);O(()=>m(K,n(v))),b(x,z)};G(Ie,x=>{n(v)&&x(He)})}var Ve=s(Pe,2),We=l(Ve),Tt=s(l(We)),Pt=l(Tt),Ot=s(We,4);{var Rt=x=>{var z=od();b(x,z)},qt=x=>{var z=pd(),K=s(l(z));Ze(K,21,()=>n(o),Ye,(ie,$)=>{var V=Br(),ae=_t(V);{var we=Ae=>{var at=dd(),it=l(at),mt=l(it),et=s(it,5),bt=l(et),C=s(bt,2);O(()=>m(mt,n($).name)),P("click",bt,()=>{var X;te("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(X=document.querySelector(".nav-item[data-view='cookbook']"))==null||X.dispatchEvent(new MouseEvent("click"))}),P("click",C,()=>ze(n($).name)),b(Ae,at)},Xe=Ae=>{var at=fd(),it=l(at),mt=l(it),et=l(mt),bt=s(et);{var C=Je=>{var pt=cd(),S=l(pt);O(()=>m(S,n($).role)),b(Je,pt)};G(bt,Je=>{n($).role&&Je(C)})}var X=s(mt,2);{var pe=Je=>{var pt=ud(),S=l(pt);O(()=>m(S,n($).meta.filename)),b(Je,pt)};G(X,Je=>{var pt;(pt=n($).meta)!=null&&pt.filename&&Je(pe)})}var je=s(X,2),Ne=s(l(je),2);Ze(Ne,17,()=>{var Je;return(Je=n($).api_ids)!=null&&Je.length?n($).api_ids:[n($).name]},Ye,(Je,pt)=>{var S=vd(),ee=l(S);O(()=>m(ee,n(pt))),P("click",S,()=>J(n(pt))),b(Je,S)});var Bt=s(it);qe(Bt,()=>{var Je;return nt((Je=n($).meta)==null?void 0:Je.caps)},!0);var Ht=s(Bt);qe(Ht,()=>T(n($).meta),!0);var It=s(Ht);qe(It,()=>Fo(n($).state,n($).download_progress),!0);var Yt=s(It),sn=l(Yt),bn=s(Yt),$n=l(bn),ln=s($n,2),on=s(ln,2),yn=s(on,2);O(()=>{m(et,`${n($).name??""} `),m(sn,n($).port??"auto")}),P("click",$n,()=>ue(n($).name)),P("click",ln,()=>Se(n($).name)),P("click",on,()=>Ee(n($).name)),P("click",yn,()=>ze(n($).name)),b(Ae,at)};G(ae,Ae=>{n($).incomplete?Ae(we):Ae(Xe,-1)})}b(ie,V)}),b(x,z)};G(Ot,x=>{n(o).length?x(qt,-1):x(Rt)})}var D=s(Ve,2);{var U=x=>{var z=gd(),K=l(z),ie=l(K),$=s(ie,4),V=l($),ae=s($,2),we=s(l(ae));qe(we,()=>fi(a));var Xe=s(ae,2),Ae=s(Xe,2);{var at=pe=>{var je=hd(),Ne=l(je),Bt=s(l(Ne),2),Ht=l(Bt),It=s(Ht,2),Yt=s(Ne,2);O((sn,bn)=>{m(Ht,`Optimal ~${sn??""}k → ~${n(L).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(It,` Aktuell ~${bn??""}k → ~${n(L).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(L).meta.optimal_ctx/1024),()=>Math.round((n(L).meta.ctx||0)/1024)]),P("click",Yt,()=>g(M,n(L).meta.optimal_ctx,!0)),b(pe,je)};G(Ae,pe=>{var je;(je=n(L).meta)!=null&&je.optimal_ctx&&pe(at)})}var it=s(Ae,4),mt=s(l(it),2),et=l(mt),bt=s(et,2),C=l(bt),X=s(it,2);O(()=>{m(V,n(L).name),hn(bt,`color:${n(R)?"var(--accent)":"var(--mut)"}`),m(C,n(R)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),P("click",z,pe=>{pe.target.classList.contains("modal-overlay")&&g(A,!1)}),P("click",ie,()=>g(A,!1)),Ln(Xe,()=>n(M),pe=>g(M,pe)),Do(et,()=>n(R),pe=>g(R,pe)),P("click",X,re),b(x,z)};G(D,x=>{n(A)&&n(L)&&x(U)})}var Z=s(D,2);{var le=x=>{var z=md(),K=l(z),ie=l(K),$=s(ie,2),V=s(l($));qe(V,()=>fi(r));var ae=s($,2),we=l(ae),Xe=s(ae,4);Ze(Xe,21,()=>i,Ye,(et,bt)=>{var C=_d(),X=l(C);O(()=>{vt(C,1,n(H)===n(bt).id?"primary":"ghost"),Ir(C,"title",n(bt).desc),m(X,n(bt).label)}),P("click",C,()=>fe(n(bt).id)),b(et,C)});var Ae=s(Xe,4),at=s(Ae,2),it=l(at),mt=s(it,2);O(()=>m(we,n(be))),P("click",z,et=>{et.target.classList.contains("modal-overlay")&&g(ve,!1)}),P("click",ie,()=>g(ve,!1)),Ln(Ae,()=>n(F),et=>g(F,et)),P("click",it,()=>fe("")),P("click",mt,()=>fe(n(F).trim().toLowerCase())),b(x,z)};G(Z,x=>{n(ve)&&x(le)})}O(()=>{ne.disabled=n(h),m(Ke,n(h)?"…":"Senden"),m(Pt,n(o).length?n(o).length+" konfiguriert":"")}),nr(Q,()=>n(c),x=>g(c,x)),Ln(ye,()=>n(u),x=>g(u,x)),P("click",ne,p),b(e,oe),ia()}ka(["click"]);var wd=k('<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),xd=k('<button class="ghost" style="margin-left:auto;padding:4px 11px;font-size:12px">Verlauf leeren</button>'),kd=k('<div class="empty-c"><div class="e-t">Gerade nichts los.</div> <div class="e-s">Alles ruhig — keine laufenden Aufgaben.</div></div>'),Md=k('<span class="mono-sm" style="margin-left:auto"> </span>'),Sd=k('<button class="ghost">Abbrechen</button>'),Ed=k('<button class="ghost" title="Aus Verlauf entfernen" style="margin-left:auto;margin-right:2px;padding:2px 9px;font-size:14px;line-height:1">×</button>'),Td=k('<div class="bar" style="margin-top:8px"><i></i></div>'),$d=k('<div class="log"> </div>'),Ad=k('<div class="job"><div class="job-h" role="button" tabindex="0"><span></span> <span class="mid"> </span> <!> <!> <!></div> <!> <!></div>'),Cd=k('<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 Ld(e,t){ra(t,!0);const a=I(()=>ca.value),r=I(()=>ca.tracked),i=I(()=>$i.value);let o=Dt({cpu:[],ram:[],gpu:[]});Mi(()=>{var oe;if(!n(i))return;const T=n(i).gpu,J=T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0;o.cpu=[...o.cpu,((oe=n(i).cpu)==null?void 0:oe.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,J].slice(-60)});const d=I(()=>()=>{var J;const T=(J=n(i))==null?void 0:J.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0}),c=I(()=>n(a).filter(T=>T.state!=="running"&&T.state!=="queued").length),u=I(()=>n(a).filter(T=>T.state==="failed").length);function v(T){if(T.state!=="running")return null;if(typeof T.progress=="number")return Math.min(100,T.progress);const oe=((T.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return oe?Math.min(100,parseFloat(oe[1])):null}function h(T){return T==null||T<0?"":T>=90?`noch ~${Math.round(T/60)} min`:`noch ~${Math.max(1,Math.round(T))} s`}function E(T){return T==="done"?'<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 w(T){try{await ge(`/api/jobs/${T}/cancel`,{method:"POST"}),te("Abbruch angefordert…")}catch(J){te(J.message,!0)}}async function A(T){try{await ge(`/api/jobs/${T}`,{method:"DELETE"})}catch(J){te(J.message,!0)}}async function L(){try{const T=await ge("/api/jobs/clear",{method:"POST"});te(`${T.removed} Einträge entfernt.`)}catch(T){te(T.message,!0)}}function M(T,J){return T.map(oe=>`<div style="width:4px;background:var(${J});opacity:.55;height:${Math.max(2,oe)}%;border-radius:2px"></div>`).join("")}var R=Cd(),Se=s(_t(R),2);{var re=T=>{const J=I(()=>n(d)());var oe=wd(),Pe=_t(oe),Q=l(Pe),ye=s(l(Q),2),ne=l(ye),Ke=s(ye,2),Ie=l(Ke),He=s(Q,2),Ve=s(l(He),2),We=l(Ve),Tt=s(Ve,2),Pt=l(Tt),Ot=s(He,2),Rt=s(l(Ot),2),qt=l(Rt),D=s(Rt,2),U=l(D),Z=s(Pe,2),le=s(l(Z),4),x=l(le),z=s(l(x)),K=l(z),ie=s(x,2),$=s(l(ie),2),V=l($),ae=s(ie,2),we=s(l(ae)),Xe=l(we),Ae=s(ae,2),at=s(l(Ae),2),it=l(at),mt=s(le,2),et=l(mt),bt=s(l(et));qe(bt,()=>M(o.cpu,"--accent"),!0);var C=s(et,2),X=s(l(C));qe(X,()=>M(o.ram,"--purple"),!0);var pe=s(C,2),je=s(l(pe));qe(je,()=>M(o.gpu,"--on"),!0),O((Ne,Bt,Ht,It,Yt,sn,bn,$n,ln,on,yn,Je,pt)=>{m(ne,Ne),m(Ie,Bt),m(We,Ht),m(Pt,`${It??""} / ${Yt??""}`),m(qt,sn),m(U,bn),m(K,`${$n??""} / ${ln??""}`),m(V,on),m(Xe,`${yn??""} % belegt`),m(it,`${Je??""} / ${pt??""}`)},[()=>{var Ne;return Math.round(((Ne=n(i).cpu)==null?void 0:Ne.percent)??0)},()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?`${Math.round(n(i).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(n(i).ram.percent),()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>Math.round(n(J)),()=>n(i).gpu_temp!=null?`${Math.round(n(i).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>sa(n(i).ram.used),()=>sa(n(i).ram.total),()=>n(i).gpu?`${sa(n(i).gpu.vram.used+n(i).gpu.gtt.used)} / ${sa(n(i).gpu.vram.total+n(i).gpu.gtt.total)}`:"–",()=>{var Ne;return Math.round(((Ne=n(i).disk)==null?void 0:Ne.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var Ne;return((Ne=n(i).cpu)==null?void 0:Ne.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),b(T,oe)};G(Se,T=>{n(i)&&T(re)})}var ve=s(Se,2),be=l(ve),F=s(l(be),2),H=l(F),ue=s(F,2);{var fe=T=>{var J=xd();P("click",J,L),b(T,J)};G(ue,T=>{n(c)&&T(fe)})}var Ee=s(be,4);{var ze=T=>{var J=kd();b(T,J)},nt=T=>{var J=Br(),oe=_t(J);Ze(oe,17,()=>n(a),Ye,(Pe,Q)=>{const ye=I(()=>v(n(Q))),ne=I(()=>n(Q).state==="running"?h(n(Q).eta_s):""),Ke=I(()=>n(Q).state==="running"&&n(Q).rate_bps?sa(n(Q).rate_bps)+"/s":""),Ie=I(()=>[n(ne),n(Ke)].filter(Boolean).join(" · ")),He=I(()=>n(r).includes(n(Q).id));var Ve=Ad(),We=l(Ve),Tt=l(We),Pt=s(Tt,2),Ot=l(Pt),Rt=s(Pt,2);{var qt=$=>{var V=Md(),ae=l(V);O(we=>m(ae,`${we??""} %${n(Ie)?` · ${n(Ie)}`:""}`),[()=>Math.round(n(ye))]),b($,V)};G(Rt,$=>{n(ye)!=null&&$(qt)})}var D=s(Rt,2);{var U=$=>{var V=Sd();O(()=>hn(V,`${n(ye)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),P("click",V,ae=>{ae.stopPropagation(),w(n(Q).id)}),b($,V)},Z=$=>{var V=Ed();P("click",V,ae=>{ae.stopPropagation(),A(n(Q).id)}),b($,V)};G(D,$=>{n(Q).state==="running"?$(U):$(Z,-1)})}var le=s(D,2);qe(le,()=>E(n(Q).state));var x=s(We,2);{var z=$=>{var V=Td(),ae=l(V);O(()=>hn(ae,`width:${n(ye)??""}%`)),b($,V)};G(x,$=>{n(ye)!=null&&n(Q).state==="running"&&$(z)})}var K=s(x,2);{var ie=$=>{var V=$d(),ae=l(V);O(we=>m(ae,we),[()=>(n(Q).log||[]).join(`
|
||
`)]),b($,V)};G(K,$=>{n(He)&&$(ie)})}O($=>{vt(Tt,1,`li-dot ${$??""}`),m(Ot,n(Q).label)},[()=>p(n(Q).state)]),P("click",We,()=>ca.toggle(n(Q).id)),P("keydown",We,$=>$.key==="Enter"&&ca.toggle(n(Q).id)),b(Pe,Ve)}),b(T,J)};G(Ee,T=>{n(a).length?T(nt,-1):T(ze)})}O(()=>m(H,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),b(e,R),ia()}ka(["click","keydown"]);var zd=k('<span class="mono-sm"> </span>'),Pd=k('<button class="ghost" style="margin-left:auto;padding:3px 12px">Abbrechen</button>'),Dd=k('<span class="badge b-run">✓ fertig</span>'),Od=k('<span class="badge b-err">✗ fehlgeschlagen</span>'),Rd=k('<span class="badge">abgebrochen</span>'),qd=k('<span class="badge b-load">läuft…</span>'),Bd=k('<div class="bar" style="margin-bottom:10px"><i></i></div>'),Id=k('<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>'),Nd=k('<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 Fd(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>ca.value);let i=null,o=B(`Verbinde…
|
||
`),d=B("llama-swap"),c,u=B(null),v=B("");const h=new Set,E=I(()=>n(u)?n(r).find(C=>C.id===n(u)):null);Mi(()=>{if(!n(E))return;const C=n(E),X=C.state==="done",pe=C.state==="failed",je=C.state==="canceled";(X||pe||je)&&!h.has(C.id)&&(h.add(C.id),te(X?`✓ ${n(v)} abgeschlossen.`:je?`${n(v)} abgebrochen.`:`✗ ${n(v)} fehlgeschlagen.`,pe),X&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function p(C,X){g(u,C,!0),g(v,X,!0),ca.track(C)}hr(()=>{w()}),Ro(()=>{i==null||i.close()});function w(){i==null||i.close();const C=n(d);g(o,`Verbinde mit ${C}…
|
||
`);const X=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${X}//${location.host}/api/logs/${C}?token=${encodeURIComponent(Ys())}`),i.onmessage=pe=>{g(o,n(o)+pe.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+`
|
||
— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(C,X,pe){if(await Mn({title:X,body:pe,confirmLabel:"Neustarten"}))try{await ge(`/api/service/${C}/restart`,{method:"POST"}),te("Neustart ausgelöst: "+C),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(je){te(je.message,!0)}}async function L(){if(await Mn({title:"Mission Control aktualisieren?",body:"Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu. Die Seite trennt kurz und verbindet von selbst wieder (~10 Sek)."}))try{const C=await ge("/api/self-update",{method:"POST"});te("Update läuft — Dashboard startet gleich neu."),p(C.job_id,"Mission Control Update")}catch(C){te(C.message,!0)}}async function M(){if(await Mn({title:"LLM-Engine aktualisieren?",body:"Lädt die neueste llama.cpp-ROCm-Version und installiert sie. Die Engine ist während des Updates kurz nicht erreichbar."}))try{const C=await ge("/api/update",{method:"POST"});te("LLM-Engine-Update läuft."),p(C.job_id,"LLM-Engine-Update")}catch(C){te(C.message,!0)}}async function R(){if(await Mn({title:"Grafikspeicher leeren?",body:"Alle geladenen Modelle werden entladen. Sie laden beim nächsten Aufruf automatisch neu — es geht nichts verloren.",confirmLabel:"Leeren"}))try{await ge("/api/unload",{method:"POST"}),te("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(C){te(C.message,!0)}}async function Se(){if(!await Mn({title:"OS-Updates installieren?",body:"Führt <code>apt update & upgrade</code> aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const C=await Ui({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(C)try{const X=await ge("/api/os-update",{method:"POST",body:JSON.stringify({password:C})});te("OS-Update gestartet."),p(X.job_id,"OS-Update")}catch(X){te(X.message,!0)}}async function re(){if(!await Mn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const C=await Ui({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(C)try{await ge("/api/reboot",{method:"POST",body:JSON.stringify({password:C})}),te("Reboot ausgelöst — bis gleich.")}catch(X){te(X.message,!0)}}async function ve(){g(be,"prüfe…");try{const C=await ge("/api/integration/test");g(be,C.ok?`✓ Engine antwortet — ${C.models.length} Modell(e): ${C.models.join(", ")}`:`✗ keine Verbindung: ${C.error}`,!0),g(F,C.ok,!0)}catch(C){g(be,"✗ "+C.message),g(F,!1)}}let be=B(""),F=B(!1);const H=I(()=>{var C;return((C=n(a))==null?void 0:C.models)||[]}),ue=["running","ready","loading","starting"],fe=I(()=>n(H).find(C=>ue.includes(C.state)));function Ee(C){if(!C||C.state!=="running")return null;if(typeof C.progress=="number")return Math.min(100,C.progress);const pe=((C.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return pe?Math.min(100,parseFloat(pe[1])):null}var ze=Nd(),nt=s(_t(ze),2),T=l(nt),J=s(l(T),2),oe=l(J),Pe=s(T,4),Q=l(Pe),ye=s(l(Q)),ne=l(ye),Ke=s(Q,2),Ie=s(l(Ke),2),He=l(Ie),Ve=s(Ke,2),We=s(l(Ve),2),Tt=l(We),Pt=s(Pe,2),Ot=l(Pt),Rt=s(Ot,2);{var qt=C=>{var X=zd(),pe=l(X);O(()=>{hn(X,`color:${n(F)?"#7ee29a":"#ff9b95"}`),m(pe,n(be))}),b(C,X)};G(Rt,C=>{n(be)&&C(qt)})}var D=s(nt,2),U=s(l(D),4),Z=s(U,2),le=s(Z,2),x=s(le,2),z=s(x,2),K=s(D,2),ie=s(l(K),4),$=s(ie,2),V=s(K,2);{var ae=C=>{const X=I(()=>n(E)),pe=I(()=>n(X).state==="done"),je=I(()=>n(X).state==="failed"),Ne=I(()=>n(X).state==="canceled"),Bt=I(()=>n(pe)||n(je)||n(Ne)),Ht=I(()=>Ee(n(X)));var It=Id(),Yt=l(It),sn=s(l(Yt),2);{var bn=_e=>{var Qe=Pd();P("click",Qe,async()=>{await Mn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&ge(`/api/jobs/${n(X).id}/cancel`,{method:"POST"})}),b(_e,Qe)};G(sn,_e=>{n(Bt)||_e(bn)})}var $n=s(sn,2),ln=l($n);{var on=_e=>{var Qe=Dd();b(_e,Qe)},yn=_e=>{var Qe=Od();b(_e,Qe)},Je=_e=>{var Qe=Rd();b(_e,Qe)},pt=_e=>{var Qe=qd();b(_e,Qe)};G(ln,_e=>{n(pe)?_e(on):n(je)?_e(yn,1):n(Ne)?_e(Je,2):_e(pt,-1)})}var S=s(Yt,2),ee=l(S),st=s(S,2);{var xe=_e=>{var Qe=Bd(),dn=l(Qe);O(()=>hn(dn,`width:${n(Ht)??""}%`)),b(_e,Qe)};G(st,_e=>{n(Ht)!=null&&!n(Bt)&&_e(xe)})}var rt=s(st,2),Vt=l(rt);O(_e=>{m(ee,`${n(v)??""}${n(Bt)?n(pe)?" — erfolgreich.":n(Ne)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(Vt,_e)},[()=>(n(X).log||[]).join(`
|
||
`)]),b(C,It)};G(V,C=>{n(E)&&C(ae)})}var we=s(V,2),Xe=l(we),Ae=s(l(Xe),2),at=l(Ae);at.value=at.__value="llama-swap";var it=s(at);it.value=it.__value="mission-control";var mt=s(it);mt.value=mt.__value="system";var et=s(Xe,4),bt=l(et);Oo(et,C=>c=C,()=>c),O(C=>{var X,pe,je;hn(J,`margin-left:auto;${(X=n(a))!=null&&X.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),m(oe,(pe=n(a))!=null&&pe.swap_ok?"● erreichbar":"● offline"),m(ne,(((je=n(a))==null?void 0:je.swap_url)||"—")+"/v1"),m(He,n(fe)?n(fe).name+` (${n(fe).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Tt,C),m(bt,n(o))},[()=>n(H).filter(C=>!C.incomplete).length||"keine"]),P("click",Ot,ve),P("click",U,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),P("click",Z,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),P("click",le,L),P("click",x,M),P("click",z,R),P("click",ie,Se),P("click",$,re),P("change",Ae,w),nr(Ae,()=>n(d),C=>g(d,C)),b(e,ze),ia()}ka(["click","change"]);var Kd=k('<div class="empty" style="text-align:center;padding:30px">Lade Setups…</div>'),Gd=k('<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),Qr=k('<div class="cb-best-tag">★ Beste Wahl für dein System</div>'),Ud=k('<div class="cb-best-tag" style="background:var(--act);color:#fff">Dein Setup</div>'),Hd=k('<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>'),Vd=k('<div id="cb-recipes" class="grid grid-3" style="gap:10px;margin-top:6px"></div>'),Wd=k('<span style="color:var(--warn)">· ⚠ Cache veraltet</span>'),jd=k("<!> <!>",1),Jd=k('<div class="empty" style="text-align:center;padding:30px">Frage Quellen ab…</div>'),Qd=k('<div class="li-sub" style="color:var(--warn);margin-top:3px"> </div>'),Yd=k('<span class="fit-badge ok">✓ installiert</span>'),Zd=k('<button class="primary" style="padding:6px 12px;font-size:12.5px">Installieren</button>'),Xd=k('<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>'),ec=k('<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>'),tc=k('<button style="padding:4px 10px;border-radius:999px;font-size:12px"> </button>'),nc=k('<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>'),ac=k('<div class="grid grid-3" id="cb-grid"></div>'),rc=k('<div class="li-sub"> </div>'),ic=k('<div class="li-sub mono-sm"> </div>'),sc=k("<span> </span>"),lc=k('<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>'),oc=k('<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>'),dc=k('<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>'),cc=k('<div class="hint">Lade Dateien von HuggingFace…</div>'),Ji=k("<option> </option>"),uc=k('<div class="hint" style="margin:-6px 0 14px">Empfohlener Kontext für deine Hardware: <b> </b> — <a href="#">übernehmen</a></div>'),vc=k('<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>'),fc=k('<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),pc=k('<div class="hint">Keine GGUF-Dateien im Repo gefunden.</div>'),hc=k('<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>'),gc=k('<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>'),_c=k('<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>'),mc=k('<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>Use-Case-Setups</h3> <button class="ghost" style="margin-left:auto">+ Eigenes Setup</button></div> <div class="card-sub">Fertige Modell-Bundles für deinen Anwendungsfall. Hardware-Ampel zeigt, ob es 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 bc(e,t){ra(t,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",r="MoE (Mixture of Experts): viele Parameter fürs Wissen, aber pro Wort ist nur ein kleiner Teil aktiv → fast große-Modell-Qualität bei hohem Tempo. Ideal für deine APU.",i={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},d=[{label:"Bilder",kw:["-vl-","-vl","vision","llava","multimodal","-mm-","pixtral"]},{label:"Coden",kw:["coder","-code-","code-","codestral","starcoder"]},{label:"Logik",kw:["-r1","deepseek-r1","reasoning","qwq","magistral","-think","thinking","-o1"]},{label:"Agenten & Tools",kw:["hermes","-tool","command-r","watt","-fc-","function"]}];function c(_){const y=(_||"").toLowerCase();for(const N of d)if(N.kw.some(q=>y.includes(q)))return N.label;return"Allrounder"}function u(_=""){const y=_.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(y)||new RegExp("(?<![a-z])a\\d+(\\.\\d+)?b\\b").test(y)||y.includes("mixtral")||/\bmoe\b/.test(y)}function v(_=""){const y=_.toLowerCase().match(new RegExp("(?<![a-z])a(\\d+(?:\\.\\d+)?)b\\b"));return y?y[1]:null}function h(_){return _==="perfect"?"ok":_==="marginal"?"warn":"bad"}function E(_){return _==="perfect"?"Passt":_==="marginal"?"Knapp":"Zu groß"}function p(_){return`~${(_.req_gb??0).toFixed(1)} GB · ~${Math.round(_.tps??0)} Tok/s`}let w=B(Dt([])),A=B(null),L=B(!0),M=B(null),R=B(!1),Se=B(!1),re=B(""),ve=B(Dt([])),be=B(!1),F=B(""),H=B("downloads"),ue=B(Dt([])),fe=B(-1),Ee=B(null),ze=B(!1),nt=B(""),T=B(""),J=B(null),oe=B(""),Pe=B(""),Q=B(8192),ye=B(!1),ne=B(null),Ke=B(!1),Ie=B(""),He=B(""),Ve=B(Dt([{repo:"",role:"",quant:"Q4_K_M"}])),We=B(null);function Tt(_){var y;(y=document.querySelector(`.nav-item[data-view="${_}"]`))==null||y.dispatchEvent(new MouseEvent("click"))}hr(()=>{Pt(),Ot()});async function Pt(){g(L,!0);try{const _=await ge("/api/cookbook/recipes");g(w,_.recipes||[],!0),g(A,_.recommended_id||null,!0)}catch(_){te(_.message,!0)}g(L,!1)}async function Ot(_=!1){g(R,!0);try{const y=await ge("/api/cookbook/discover"+(_?"?force=true":""));g(M,y,!0),g(Se,y.stale,!0)}catch(y){te("Empfehlungen nicht ladbar: "+y.message,!0)}g(R,!1)}function Rt(_){_=_.trim();const y=_.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return y?y[1]:/^[\w.-]+\/[\w.-]+$/.test(_)?_:null}async function qt(){const _=n(re).trim(),y=Rt(_);let N=_;if(n(F)&&!y&&(N=N?N+" "+n(F):n(F)),!N&&!y){g(ve,[],!0);return}g(be,!0),g(ue,[],!0),g(fe,-1);try{if(y)g(ve,[{id:y,author:y.split("/")[0],downloads:0}],!0);else{const q=`https://huggingface.co/api/models?search=${encodeURIComponent(N)}&filter=gguf&sort=${encodeURIComponent(n(H))}&direction=-1&limit=40`,Y=await fetch(q);g(ve,await Y.json(),!0)}n(ve).forEach((q,Y)=>D(Y,q.id))}catch(q){te(q.message,!0),g(ve,[],!0)}g(be,!1)}async function D(_,y){var N;try{const q=await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})});if(!((N=q.files)!=null&&N.length)){n(ue)[_]=null,U();return}const Y=q.files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||q.files[0];n(ue)[_]=Y.fit.level,U()}catch{n(ue)[_]=null,U()}}function U(){let _=-1,y=99;n(ue).forEach((N,q)=>{if(N==null)return;const Y=i[N]??99;Y<y&&(y=Y,_=q)}),g(fe,_>=0&&y<=1?_:-1,!0)}function Z(_){g(Ee,n(w).find(y=>y.id===_),!0)}async function le(_){const y=document.getElementById("cb-r-install-btn");y&&(y.disabled=!0,y.textContent="Starte…");try{const N=await ge("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:_,hf_token:rr()})});te(`${N.count} Downloads gestartet — siehe Aktivität.`),g(Ee,null),Tt("activity")}catch(N){te(N.message,!0),y&&(y.disabled=!1,y.textContent="Installieren")}}async function x(_,y){var N,q;g(ze,!0),g(nt,y,!0),g(T,_,!0),g(Pe,""),g(Q,8192),g(J,null),g(ne,null),g(oe,""),g(ye,!0);try{if(g(J,await ge("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:_,ctx:8192})}),!0),(q=(N=n(J))==null?void 0:N.files)!=null&&q.length){const Y=n(J).files.find(Ce=>{var Le;return(Le=Ce.quant)==null?void 0:Le.includes("Q4_K_M")})||n(J).files[0];g(oe,Y.filename,!0),Y.optimal_ctx&&n(Q)===8192&&g(Q,Y.optimal_ctx,!0),z()}}catch(Y){te(Y.message,!0)}g(ye,!1)}function z(){var _,y,N;!((y=(_=n(J))==null?void 0:_.files)!=null&&y.length)||!n(oe)||(g(ne,n(J).files.find(q=>q.filename===n(oe))||null,!0),(N=n(ne))!=null&&N.optimal_ctx&&n(Q)===8192&&g(Q,n(ne).optimal_ctx,!0))}async function K(){if(!n(T)||!n(oe))return te("Bitte eine GGUF-Datei wählen.",!0);g(ye,!0);try{const _=await ge("/api/download",{method:"POST",body:JSON.stringify({repo:n(T),file:n(oe),hf_token:rr()})});await ge("/api/register",{method:"POST",body:JSON.stringify({role:n(Pe),model_path:_.expected_path,ctx:n(Q)})}),te("Download gestartet — siehe Aktivität."),g(ze,!1),Tt("activity")}catch(_){te("Fehler: "+_.message,!0)}g(ye,!1)}async function ie(_,y,N,q){q.disabled=!0,q.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:_,role:y,params_b:N,quant:"Q4_K_M",hf_token:rr()})}),te("Download gestartet — siehe Aktivität."),Tt("activity")}catch(Y){te(Y.message,!0),q.disabled=!1,q.textContent="Installieren"}}function $(){g(We,null),g(Ie,""),g(He,""),g(Ve,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(Ke,!0)}function V(_){const y=n(w).find(N=>N.id===_);y&&(g(We,_,!0),g(Ie,y.title,!0),g(He,y.desc||"",!0),g(Ve,y.models.map(N=>({repo:N.repo,role:N.role,quant:N.quant||"Q4_K_M"})),!0),g(Ke,!0))}async function ae(){if(!n(Ie).trim())return te("Bitte einen Titel angeben.",!0);const _=n(Ve).filter(y=>y.repo.trim());if(!_.length)return te("Mindestens ein Modell (Repo) angeben.",!0);try{n(We)?(await ge("/api/cookbook/user-recipe/"+encodeURIComponent(n(We)),{method:"PUT",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup aktualisiert.")):(await ge("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ie),desc:n(He),models:_})}),te("Setup gespeichert.")),g(Ke,!1),Pt()}catch(y){te(y.message,!0)}}async function we(_){const y=n(w).find(N=>N.id===_);if(await Mn({title:`„${(y==null?void 0:y.title)||_}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await ge("/api/cookbook/user-recipe/"+encodeURIComponent(_),{method:"DELETE"}),te("Setup gelöscht."),Pt()}catch(N){te(N.message,!0)}}function Xe(_){if(!u(_))return"";const y=v(_);return`<span class="chip" title="${Rn(r)}">MoE${y?` · ~${y}B aktiv`:""}</span>`}function Ae(_){return _?`<span class="chip">${Rn(_)}</span>`:""}var at=mc(),it=s(_t(at),2),mt=l(it),et=s(l(mt),2),bt=s(mt,4);{var C=_=>{var y=Kd();b(_,y)},X=_=>{var y=Vd();Ze(y,21,()=>n(w),Ye,(N,q)=>{const Y=I(()=>n(q).id===n(A));var Ce=Hd(),Le=l(Ce);{var lt=Ue=>{var ct=Gd(),Zt=_t(ct),wt=s(Zt,2);P("click",Zt,xt=>{xt.stopPropagation(),V(n(q).id)}),P("keydown",Zt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),V(n(q).id))}),P("click",wt,xt=>{xt.stopPropagation(),we(n(q).id)}),P("keydown",wt,xt=>{xt.key==="Enter"&&(xt.stopPropagation(),we(n(q).id))}),b(Ue,ct)};G(Le,Ue=>{n(q).user&&Ue(lt)})}var yt=s(Le,2);{var Te=Ue=>{var ct=Qr();b(Ue,ct)},De=Ue=>{var ct=Ud();b(Ue,ct)};G(yt,Ue=>{n(Y)?Ue(Te):n(q).user&&Ue(De,1)})}var Me=s(yt,2),ke=l(Me),Fe=l(ke),Ge=l(Fe),Oe=s(ke,2),j=l(Oe),ce=s(Me,2),ot=l(ce),$t=s(ce,2),dt=l($t);O((Ue,ct)=>{vt(Ce,1,`card-btn${n(Y)?" cb-best":""}`),m(Ge,n(q).title),vt(Oe,1,`fit-badge ${Ue??""}`),m(j,ct),m(ot,n(q).desc),m(dt,`${n(q).models.length??""} Modell${n(q).models.length>1?"e":""} im Setup`)},[()=>h(n(q).fit_level),()=>E(n(q).fit_level)]),P("click",Ce,()=>Z(n(q).id)),b(N,Ce)}),b(_,y)};G(bt,_=>{n(L)?_(C):_(X,-1)})}var pe=s(it,2),je=l(pe),Ne=s(l(je),2),Bt=l(Ne);{var Ht=_=>{const y=I(()=>Math.round((Date.now()/1e3-n(M).updated)/60));var N=jd(),q=_t(N);{var Y=Te=>{var De=tr();O(()=>m(De,`Quellen befragt vor ${n(y)??""} min`)),b(Te,De)},Ce=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} h`),[()=>Math.round(n(y)/60)]),b(Te,De)},Le=Te=>{var De=tr();O(Me=>m(De,`Quellen befragt vor ${Me??""} Tg.`),[()=>Math.round(n(y)/1440)]),b(Te,De)};G(q,Te=>{n(y)<60?Te(Y):n(y)<1440?Te(Ce,1):Te(Le,-1)})}var lt=s(q,2);{var yt=Te=>{var De=Wd();b(Te,De)};G(lt,Te=>{n(Se)&&Te(yt)})}b(_,N)};G(Bt,_=>{var y;(y=n(M))!=null&&y.updated&&_(Ht)})}var It=s(Ne,2),Yt=l(It),sn=s(je,4);{var bn=_=>{var y=Jd();b(_,y)},$n=_=>{var y=Br(),N=_t(y);Ze(N,17,()=>n(M).categories,Ye,(q,Y)=>{var Ce=ec(),Le=l(Ce),lt=l(Le),yt=l(lt),Te=s(Le,2);Ze(Te,21,()=>n(Y).models,Ye,(De,Me)=>{const ke=I(()=>n(Y).recommended&&n(Me).repo===n(Y).recommended);var Fe=Xd(),Ge=l(Fe);{var Oe=Et=>{var Kt=Qr();b(Et,Kt)};G(Ge,Et=>{n(ke)&&Et(Oe)})}var j=s(Ge,2),ce=l(j),ot=l(ce),$t=l(ot),dt=s(ot,2),Ue=l(dt),ct=s(ce,2),Zt=l(ct),wt=s(j,2),xt=l(wt);qe(xt,()=>Ae(o[n(Me).role]||c(n(Me).repo)));var Cn=s(xt,2);qe(Cn,()=>Xe(n(Me).repo));var Wn=s(wt,2),tt=l(Wn),ut=s(Wn,2);Ze(ut,17,()=>n(Me).requirements||[],Ye,(Et,Kt)=>{var jn=Qd(),Kr=l(jn);O(()=>m(Kr,`⚠ ${n(Kt)??""}`)),b(Et,jn)});var ht=s(ut,4),kt=l(ht);{var Xt=Et=>{var Kt=Yd();O(()=>Ir(Kt,"title",`bereits eingerichtet als ${n(Me).installed??""}`)),b(Et,Kt)},Ft=Et=>{var Kt=Zd();P("click",Kt,jn=>ie(n(Me).repo,n(Me).role,n(Me).params_b,jn.currentTarget)),b(Et,Kt)};G(kt,Et=>{n(Me).installed?Et(Xt):Et(Ft,-1)})}O((Et,Kt,jn)=>{vt(Fe,1,`card${n(ke)?" res-best":""}`),m($t,n(Me).name),m(Ue,`${n(Me).author??""} · ${n(Me).params_b??""}B`),vt(ct,1,`fit-badge ${Et??""}`),m(Zt,n(Me).fit.text),m(tt,`${Kt??""} · ⬇ ${jn??""}`)},[()=>h(n(Me).fit.level),()=>p(n(Me).fit),()=>(n(Me).downloads||0).toLocaleString()]),b(De,Fe)}),O(()=>m(yt,n(Y).title)),b(q,Ce)}),b(_,y)};G(sn,_=>{var y;n(R)&&!n(M)?_(bn):(y=n(M))!=null&&y.categories&&_($n,1)})}var ln=s(pe,2),on=s(l(ln),4),yn=l(on),Je=s(yn,2),pt=l(Je);pt.value=pt.__value="downloads";var S=s(pt);S.value=S.__value="trending";var ee=s(S);ee.value=ee.__value="created_at";var st=s(Je,2),xe=l(st),rt=s(on,2);Ze(rt,20,()=>["","coder","vision","reasoning","chat","agent"],Ye,(_,y)=>{var N=tc(),q=l(N);O(()=>{vt(N,1,n(F)===y?"primary":"ghost"),m(q,y||"Alle")}),P("click",N,()=>{g(F,y,!0),qt()}),b(_,N)});var Vt=s(rt,2);{var _e=_=>{var y=ac();Ze(y,21,()=>n(ve),Ye,(N,q,Y)=>{var Ce=nc(),Le=l(Ce);{var lt=wt=>{var xt=Qr();b(wt,xt)};G(Le,wt=>{Y===n(fe)&&wt(lt)})}var yt=s(Le,2),Te=l(yt),De=l(Te),Me=l(De),ke=s(De,2),Fe=l(ke),Ge=s(Te,2),Oe=l(Ge),j=s(yt,2),ce=l(j);qe(ce,()=>Ae(c(n(q).id)));var ot=s(ce,2);qe(ot,()=>Xe(n(q).id));var $t=s(j,4),dt=l($t),Ue=l(dt),ct=s(dt,2),Zt=l(ct);O((wt,xt,Cn,Wn,tt)=>{vt(Ce,1,`card${Y===n(fe)?" res-best":""}`),m(Me,wt),m(Fe,n(q).author||""),vt(Ge,1,`fit-badge ${xt??""}`),m(Oe,Cn),m(Ue,Wn),m(Zt,`⬇ ${tt??""}`)},[()=>n(q).id.split("/").pop(),()=>n(ue)[Y]?h(n(ue)[Y]):"warn",()=>n(ue)[Y]?E(n(ue)[Y]):"prüfe…",()=>n(ue)[Y]?p({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(q).downloads||0).toLocaleString()]),P("click",Ce,()=>x(n(q).id,n(q).id.split("/").pop())),b(N,Ce)}),b(_,y)};G(Vt,_=>{n(ve).length&&_(_e)})}var Qe=s(ln,2);{var dn=_=>{const y=I(()=>n(Ee));var N=dc(),q=l(N),Y=l(q),Ce=s(Y,2),Le=l(Ce),lt=s(Ce,2),yt=l(lt),Te=s(lt,2);Ze(Te,21,()=>n(y).models,Ye,(Ge,Oe)=>{var j=lc(),ce=l(j),ot=l(ce),$t=l(ot),dt=l($t),Ue=s($t,2),ct=l(Ue),Zt=s(Ue,2);qe(Zt,()=>Xe(n(Oe).repo));var wt=s(ot,2);{var xt=ht=>{var kt=rc(),Xt=l(kt);O(()=>m(Xt,n(Oe).why)),b(ht,kt)};G(wt,ht=>{n(Oe).why&&ht(xt)})}var Cn=s(wt,2);{var Wn=ht=>{var kt=ic(),Xt=l(kt);O((Ft,Et,Kt)=>m(Xt,`~${Ft??""} GB · ~${Et??""} Tok/s · optimal ~${Kt??""}k Kontext`),[()=>(n(Oe).fit.req_gb??0).toFixed(1),()=>Math.round(n(Oe).fit.tps??0),()=>Math.round((n(Oe).optimal_ctx||8192)/1024)]),b(ht,kt)};G(Cn,ht=>{n(Oe).fit&&ht(Wn)})}var tt=s(ce,2);{var ut=ht=>{var kt=sc(),Xt=l(kt);O(Ft=>{vt(kt,1,`fit-badge ${Ft??""}`),m(Xt,n(Oe).fit.text)},[()=>h(n(Oe).fit.level)]),b(ht,kt)};G(tt,ht=>{n(Oe).fit&&ht(ut)})}O(()=>{m(dt,n(Oe).name),m(ct,n(Oe).role)}),b(Ge,j)});var De=s(Te,2);{var Me=Ge=>{const Oe=I(()=>Math.max(...n(y).models.map($t=>{var dt;return((dt=$t.fit)==null?void 0:dt.req_gb)??0})));var j=oc(),ce=s(l(j)),ot=l(ce);O($t=>m(ot,`~${$t??""} GB`),[()=>n(Oe).toFixed(1)]),b(Ge,j)};G(De,Ge=>{n(y).models.length&&n(y).models[0].fit&&Ge(Me)})}var ke=s(De,2),Fe=l(ke);O(()=>{m(Le,n(y).title),m(yt,n(y).desc),vt(ke,1,`primary${n(y).fit_level==="too_tight"?" warn":""}`),m(Fe,n(y).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),P("click",N,Ge=>{Ge.target.classList.contains("modal-overlay")&&g(Ee,null)}),P("click",Y,()=>g(Ee,null)),P("click",ke,()=>le(n(y).id)),b(_,N)};G(Qe,_=>{n(Ee)&&_(dn)})}var Nt=s(Qe,2);{var In=_=>{var y=hc(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,2),lt=l(Le),yt=s(Le,2);{var Te=ke=>{var Fe=cc();b(ke,Fe)},De=ke=>{var Fe=fc(),Ge=s(_t(Fe),2);Ze(Ge,21,()=>n(J).files,Ye,(tt,ut)=>{const ht=I(()=>n(ut).fit.level==="perfect"?"●":n(ut).fit.level==="marginal"?"◐":"○");var kt=Ji(),Xt=l(kt),Ft={};O(()=>{m(Xt,`${n(ht)??""} ${n(ut).filename??""}`),Ft!==(Ft=n(ut).filename)&&(kt.value=(kt.__value=n(ut).filename)??"")}),b(tt,kt)});var Oe=s(Ge,2),j=l(Oe),ce=s(l(j),2),ot=s(j,2),$t=l(ot),dt=s(l($t));qe(dt,()=>fi(a));var Ue=s($t,2),ct=s(Oe,2);{var Zt=tt=>{var ut=uc(),ht=s(l(ut)),kt=l(ht),Xt=s(ht,2);O(Ft=>m(kt,`~${Ft??""}k`),[()=>Math.round(n(ne).optimal_ctx/1024)]),P("click",Xt,Ft=>{Ft.preventDefault(),g(Q,n(ne).optimal_ctx,!0)}),b(tt,ut)};G(ct,tt=>{var ut;(ut=n(ne))!=null&&ut.optimal_ctx&&tt(Zt)})}var wt=s(ct,2);{var xt=tt=>{var ut=vc(),ht=l(ut),kt=s(l(ht),2),Xt=l(kt),Ft=s(ht,2),Et=l(Ft);O((Kt,jn,Kr)=>{m(Xt,`~${Kt??""} GB · ~${jn??""} Tok/s · ${(n(ne).quant||"GGUF")??""}`),vt(Ft,1,`fit-badge ${Kr??""}`),m(Et,n(ne).fit.text)},[()=>(n(ne).fit.req_gb??0).toFixed(1),()=>Math.round(n(ne).fit.tps??0),()=>h(n(ne).fit.level)]),b(tt,ut)};G(wt,tt=>{n(ne)&&tt(xt)})}var Cn=s(wt,2),Wn=l(Cn);O(()=>{var tt,ut;vt(Cn,1,`primary${((tt=n(ne))==null?void 0:tt.fit.level)==="too_tight"?" warn":""}`),Cn.disabled=n(ye),m(Wn,n(ye)?"Starte…":((ut=n(ne))==null?void 0:ut.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),P("change",Ge,z),nr(Ge,()=>n(oe),tt=>g(oe,tt)),Ln(ce,()=>n(Pe),tt=>g(Pe,tt)),Ln(Ue,()=>n(Q),tt=>g(Q,tt)),P("click",Cn,K),b(ke,Fe)},Me=ke=>{var Fe=pc();b(ke,Fe)};G(yt,ke=>{var Fe,Ge;n(ye)&&!n(J)?ke(Te):(Ge=(Fe=n(J))==null?void 0:Fe.files)!=null&&Ge.length?ke(De,1):n(ye)||ke(Me,2)})}O(()=>{m(Ce,n(nt)),m(lt,n(T))}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),P("click",q,()=>g(ze,!1)),b(_,y)};G(Nt,_=>{n(ze)&&_(In)})}var Nn=s(Nt,2);{var An=_=>{var y=_c(),N=l(y),q=l(N),Y=s(q,2),Ce=l(Y),Le=s(Y,6),lt=s(Le,4),yt=s(lt,4);Ze(yt,17,()=>n(Ve),Ye,(ke,Fe,Ge)=>{var Oe=gc(),j=l(Oe),ce=s(j,2),ot=s(ce,2);Ze(ot,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ye,(dt,Ue)=>{var ct=Ji(),Zt=l(ct),wt={};O(()=>{m(Zt,Ue),wt!==(wt=Ue)&&(ct.__value=Ue)}),b(dt,ct)});var $t=s(ot,2);Ln(j,()=>n(Fe).repo,dt=>n(Fe).repo=dt),Ln(ce,()=>n(Fe).role,dt=>n(Fe).role=dt),nr(ot,()=>n(Fe).quant,dt=>n(Fe).quant=dt),P("click",$t,()=>g(Ve,n(Ve).filter((dt,Ue)=>Ue!==Ge),!0)),b(ke,Oe)});var Te=s(yt,2),De=s(Te,4),Me=l(De);O(()=>{m(Ce,n(We)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Me,n(We)?"Änderungen speichern":"Setup speichern")}),P("click",y,ke=>{ke.target.classList.contains("modal-overlay")&&g(Ke,!1)}),P("click",q,()=>g(Ke,!1)),Ln(Le,()=>n(Ie),ke=>g(Ie,ke)),Ln(lt,()=>n(He),ke=>g(He,ke)),P("click",Te,()=>g(Ve,[...n(Ve),{repo:"",role:"",quant:"Q4_K_M"}],!0)),P("click",De,ae),b(_,y)};G(Nn,_=>{n(Ke)&&_(An)})}O(()=>{It.disabled=n(R),m(Yt,n(R)?"Suche…":"Aktualisieren"),st.disabled=n(be),m(xe,n(be)?"Lade…":"Suchen")}),P("click",et,$),P("click",It,()=>Ot(!0)),P("keydown",yn,_=>_.key==="Enter"&&qt()),Ln(yn,()=>n(re),_=>g(re,_)),nr(Je,()=>n(H),_=>g(H,_)),P("click",st,qt),b(e,at),ia()}ka(["click","keydown","change"]);var yc=k(`<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>`),wc=k('<span class="mono-sm"> </span>'),xc=k('<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>'),kc=k('<span class="chip" role="button" tabindex="0"> </span>'),Mc=k('<div style="margin-top:10px"><a href="#" style="color:var(--mut);font-size:12.5px">Auswahl aufheben (alle)</a></div>'),Sc=k('<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>'),Ec=k('<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>'),Tc=k('<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),$c=k('<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),Ac=k('<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),Cc=k('<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),Lc=k('<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>'),zc=k('<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> <!> <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);function Pc(e,t){ra(t,!0);const a=I(()=>gr.value),r=I(()=>{var D;return(((D=n(a))==null?void 0:D.models)||[]).filter(U=>!U.incomplete)}),i=I(v);let o=B("zed"),d=B(Dt([])),c=B(""),u=B(!1);function v(){return`http://${location.hostname}:8080/v1`}function h(D){return/^\d{1,3}(\.\d{1,3}){3}$/.test(D)}function E(){return location.protocol==="https:"||!h(location.hostname)}const p=I(()=>n(d).length?n(d):n(r).map(D=>D.name)),w=I(()=>n(p)[0]||"coder"),A=I(()=>{var D;return(D=n(r).find(U=>{var Z,le;return(le=(Z=U.meta)==null?void 0:Z.caps)==null?void 0:le.includes("Bild")}))==null?void 0:D.name});function L(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var ie,$;const z=(((ie=x.meta)==null?void 0:ie.caps)||[]).some(V=>/Bild|Vision/i.test(V)),K=(($=x.meta)==null?void 0:$.ctx)||131072;return` { "name": "${x.name}", "display_name": "${x.name}", "max_tokens": ${K}${z?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
|
||
`);return`"language_models": {
|
||
"openai_compatible": {
|
||
"bosgame": {
|
||
"api_url": "${D}",
|
||
"available_models": [
|
||
${le}
|
||
]
|
||
}
|
||
}
|
||
}`}function M(D,U){const le=(U.length?n(r).filter(x=>U.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var K;const z=((K=x.meta)==null?void 0:K.ctx)||131072;return` "${x.name}": { "name": "${x.name}", "contextWindowSize": ${z} }`}).join(`,
|
||
`);return`"provider": {
|
||
"llama-swap": {
|
||
"npm": "@ai-sdk/openai-compatible",
|
||
"name": "Bosgame (llama-swap)",
|
||
"options": {
|
||
"baseURL": "${D}",
|
||
"apiKey": "local"
|
||
},
|
||
"models": {
|
||
${le}
|
||
}
|
||
}
|
||
}`}async function R(){g(c,"Teste…");try{const D=await ge("/api/integration/test");g(u,D.ok,!0),g(c,D.ok?`✓ Verbunden — ${D.models.length} Modell(e): ${D.models.join(", ")}`:`✗ Keine Verbindung: ${D.error}`,!0)}catch(D){g(u,!1),g(c,"✗ "+D.message)}}function Se(D){var Z;const U=D.querySelector("code");U&&((Z=navigator.clipboard)==null||Z.writeText(U.textContent||""))}function re(D){var U;(U=navigator.clipboard)==null||U.writeText(D.value)}var ve=zc(),be=s(_t(ve),2),F=s(l(be),6),H=l(F),ue=s(H,2),fe=s(F,2);{var Ee=D=>{var U=yc();b(D,U)},ze=I(()=>E());G(fe,D=>{n(ze)&&D(Ee)})}var nt=s(fe,2),T=l(nt),J=s(T,2);{var oe=D=>{var U=wc(),Z=l(U);O(()=>{hn(U,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(Z,n(c))}),b(D,U)};G(J,D=>{n(c)&&D(oe)})}var Pe=s(be,2),Q=s(l(Pe),2);Ze(Q,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=xc(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V),we=l(ae),Xe=s(ae,2),Ae=l(Xe);O(()=>{m($,le()),m(we,x()),m(Ae,z())}),b(D,K)});var ye=s(Pe,2);{var ne=D=>{var U=Sc(),Z=l(U),le=s(l(Z),2),x=l(le),z=s(Z,4);Ze(z,21,()=>n(r),Ye,($,V)=>{const ae=I(()=>n(d).includes(n(V).name));var we=kc(),Xe=l(we);O(()=>{hn(we,`cursor:pointer;${n(ae)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Xe,n(V).name)}),P("click",we,()=>g(d,n(ae)?n(d).filter(Ae=>Ae!==n(V).name):[...n(d),n(V).name],!0)),P("keydown",we,Ae=>Ae.key==="Enter"&&g(d,n(ae)?n(d).filter(at=>at!==n(V).name):[...n(d),n(V).name],!0)),b($,we)});var K=s(z,2);{var ie=$=>{var V=Mc(),ae=l(V);P("click",ae,we=>{we.preventDefault(),g(d,[],!0)}),b($,V)};G(K,$=>{n(d).length&&$(ie)})}O(()=>m(x,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),b(D,U)};G(ye,D=>{n(r).length&&D(ne)})}var Ke=s(ye,2),Ie=s(l(Ke),4);Ze(Ie,20,()=>[["zed","Zed","Schneller nativer Editor — Empfohlen"],["opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)"],["cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key"],["openwebui","OpenWebUI","Browser-Chat-Interface"]],Ye,(D,U)=>{var Z=I(()=>ir(U,3));let le=()=>n(Z)[0],x=()=>n(Z)[1],z=()=>n(Z)[2];var K=Ec(),ie=l(K),$=l(ie),V=s(ie,2),ae=l(V);O(()=>{vt(K,1,`card-btn${n(o)===le()?" cb-best":""}`),m($,x()),m(ae,z())}),P("click",K,()=>g(o,le(),!0)),b(D,K)});var He=s(Ke,2),Ve=s(l(He),2);{var We=D=>{const U=I(()=>L(n(i),n(p)));var Z=Tc(),le=s(_t(Z),4),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,4),V=s(l($)),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`bosgame / ${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Tt=D=>{const U=I(()=>M(n(i),n(p)));var Z=$c(),le=s(_t(Z),6),x=l(le),z=s(x,2),K=l(z),ie=l(K),$=s(le,2),V=s(l($),3),ae=l(V);O(()=>{m(ie,n(U)),m(ae,`llama-swap/${n(w)??""}`)}),P("click",x,we=>Se(we.currentTarget.parentElement)),b(D,Z)},Pt=D=>{var U=Ac(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>{mr(le,n(i)),mr(K,n(w))}),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)},Ot=D=>{var U=Cc(),Z=s(_t(U),4),le=l(Z),x=s(le,2),z=s(Z,4),K=l(z),ie=s(K,2);O(()=>mr(le,n(i))),P("click",x,$=>re($.currentTarget.previousElementSibling)),P("click",ie,$=>re($.currentTarget.previousElementSibling)),b(D,U)};G(Ve,D=>{n(o)==="zed"?D(We):n(o)==="opencode"?D(Tt,1):n(o)==="cline"?D(Pt,2):n(o)==="openwebui"&&D(Ot,3)})}var Rt=s(He,2);{var qt=D=>{const U=I(()=>`curl ${n(i)}/chat/completions \\
|
||
-H "Content-Type: application/json" \\
|
||
-d '{
|
||
"model": "${n(A)}",
|
||
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,<DEIN_BILD>"}}]}]
|
||
}'`);var Z=Lc(),le=l(Z),x=s(l(le),2),z=l(x);qe(z,()=>tn("check"));var K=s(z),ie=s(le,4),$=l(ie),V=s($,2),ae=l(V),we=l(ae);O(()=>{m(K,` „${n(A)??""}" bereit`),m(we,n(U))}),P("click",$,Xe=>Se(Xe.currentTarget.parentElement)),b(D,Z)};G(Rt,D=>{n(A)&&D(qt)})}O(()=>mr(H,n(i))),P("click",ue,D=>{const U=D.currentTarget.previousElementSibling;re(U)}),P("click",T,R),b(e,ve),ia()}ka(["click","keydown"]);var Dc=k('<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>'),Oc=k('<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>'),Rc=k('<div class="empty" style="text-align:center;padding:40px">Lade News… (erstes Laden kann kurz dauern)</div>'),qc=k('<div class="alert err" style="margin:0"> </div>'),Bc=k('<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>'),Ic=k('<span class="news-rel">für dich</span>'),Nc=k('<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>'),Fc=k('<div class="news-grid"></div>'),Kc=k('<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 Gc(e,t){ra(t,!0);let a=B(Dt([])),r=B(Dt([])),i=B(!0),o=B("");const d=F=>F==="perfect"?"ok":F==="marginal"?"warn":"bad";function c(F){const H=Math.max(0,Date.now()/1e3-F);return H<60?H+"s":H<3600?Math.floor(H/60)+"m":H<86400?Math.floor(H/3600)+"h":Math.floor(H/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await ge("/api/news")).items||[],!0)}catch(F){g(o,F.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function v(){try{g(r,(await ge("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function h(F,H){var ue;H.disabled=!0,H.textContent="Starte…";try{await ge("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:F.repo,role:F.role,params_b:F.params_b,quant:F.quant,hf_token:rr()})}),(ue=document.querySelector(".nav-item[data-view='activity']"))==null||ue.dispatchEvent(new MouseEvent("click"))}catch(fe){H.disabled=!1,H.textContent="Installieren",alert("Fehler: "+fe.message)}}function E(){u(),v()}hr(()=>{u(),v()});var p=Kc(),w=_t(p),A=s(l(w),2),L=s(w,2);{var M=F=>{var H=Oc(),ue=l(H),fe=s(l(ue),2),Ee=l(fe),ze=s(ue,4);Ze(ze,21,()=>n(r),Ye,(nt,T)=>{var J=Dc(),oe=l(J),Pe=l(oe),Q=l(Pe),ye=l(Q),ne=s(Q,2),Ke=l(ne),Ie=s(Pe,2),He=l(Ie),Ve=s(oe,2);O(We=>{m(ye,n(T).name),vt(ne,1,`fit-badge ${We??""}`),m(Ke,n(T).fit.text),m(He,`Ersetzt dein „${n(T).old??""}". ${n(T).why??""}`)},[()=>d(n(T).fit.level)]),P("click",Ve,We=>h(n(T),We.currentTarget)),b(nt,J)}),O(()=>m(Ee,n(r).length)),b(F,H)};G(L,F=>{n(r).length&&F(M)})}var R=s(L,2);{var Se=F=>{var H=Rc();b(F,H)},re=F=>{var H=qc(),ue=l(H);O(()=>m(ue,n(o))),b(F,H)},ve=F=>{var H=Bc();b(F,H)},be=F=>{var H=Fc();Ze(H,21,()=>n(a),Ye,(ue,fe,Ee)=>{var ze=Nc();vt(ze,1,`news-card${Ee===0?" featured":""}`);var nt=l(ze),T=l(nt),J=l(T),oe=s(T,2);{var Pe=Ie=>{var He=Ic();b(Ie,He)};G(oe,Ie=>{n(fe).relevant&&Ie(Pe)})}var Q=s(oe,2),ye=l(Q),ne=s(nt,2),Ke=l(ne);O(Ie=>{Ir(ze,"href",n(fe).link),m(J,n(fe).source),m(ye,Ie),m(Ke,n(fe).title)},[()=>n(fe).ts?c(n(fe).ts):""]),b(ue,ze)}),b(F,H)};G(R,F=>{n(i)?F(Se):n(o)?F(re,1):n(a).length?F(be,-1):F(ve,2)})}P("click",A,E),b(e,p),ia()}ka(["click"]);const Uc=[["Dein erster Workflow — in 3 Schritten",`
|
||
<ol class="tut-steps">
|
||
<li><b>Modell holen:</b> Tab <b>Cookbook</b> → wähle deinen Anwendungsfall (z.B. „Coden") →
|
||
<b>Komplettes Setup installieren</b>. Der Download läuft im Tab <b>Aktivität</b>.</li>
|
||
<li><b>Verbinden:</b> Tab <b>Verbinden</b> → Basis-URL kopieren → in deinem Tool (z.B. OpenCode)
|
||
als „OpenAI-kompatibel" einfügen. <b>Verbindung testen</b> bestätigt, dass es läuft.</li>
|
||
<li><b>Arbeiten:</b> Im Tool das Modell (z.B. <code>coder</code>) wählen und loslegen. Das passende
|
||
Modell wird <b>automatisch geladen</b> — du musst nichts starten.</li>
|
||
</ol>`],["Wie leere ich den Kontext? Machen die Tools das selbst?",`
|
||
<p><b>Kurz: meistens ja, automatisch.</b> Der Kontext (das „Gedächtnis") gilt pro Unterhaltung.
|
||
Startest du im Tool einen <b>neuen Chat / eine neue Session</b>, ist der Kontext wieder leer —
|
||
das Tool verwaltet das Fenster für dich.</p>
|
||
<p>Du musst nur selten eingreifen: wird ein Gespräch sehr lang, fang einen neuen an. <b>Wichtig:</b>
|
||
„Grafikspeicher leeren" (Tab Server) ist etwas anderes — das wirft das <i>Modell</i> aus dem Speicher,
|
||
nicht den Gesprächsverlauf.</p>`],["Was passiert, wenn der Kontext volläuft?",`
|
||
<p>Ist das Kontextfenster voll, passiert je nach Tool eins von dreien: das Modell <b>vergisst den
|
||
Anfang</b> (älteste Nachrichten fallen raus), das Tool <b>kürzt automatisch</b>, oder du bekommst
|
||
einen Fehler wie „context length exceeded".</p>
|
||
<p><b>So gehst du vor:</b></p>
|
||
<ol class="tut-steps">
|
||
<li><b>Neuen Chat starten</b> — der einfachste Reset, Kontext ist wieder leer.</li>
|
||
<li><b>Zusammenfassen lassen:</b> „Fasse unseren Stand kurz zusammen", dann im neuen Chat einfügen.</li>
|
||
<li><b>Kontext vergrößern:</b> Tab <b>Modelle</b> → <b>Konfigurieren</b> → wir zeigen das Optimum
|
||
für deine Hardware (mehr Kontext = mehr Speicherbedarf).</li>
|
||
</ol>`],["Was ist ein Agent — und wann brauche ich einen?",`
|
||
<p>Ein nacktes Modell <b>schreibt nur Text zurück</b>. Ein <b>Agent</b> ist ein Programm drumherum,
|
||
das das Modell <b>handeln</b> lässt: Dateien lesen und ändern, Befehle ausführen, im Web suchen —
|
||
Schritt für Schritt in einer Schleife, bis die Aufgabe erledigt ist.</p>
|
||
<p><b>Wann lohnt sich was?</b></p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><b>Fragen, Texte, Erklärungen, Brainstorming</b> → kein Agent nötig, eine Chat-Oberfläche
|
||
wie <b>OpenWebUI</b> reicht völlig.</li>
|
||
<li><b>Coden über mehrere Dateien, Befehle ausführen, recherchieren + umsetzen</b>
|
||
→ <b>Agent</b> (OpenCode, Cline, Continue).</li>
|
||
</ul>
|
||
<p><b>Gut zu wissen:</b> Diese Agenten <b>laufen lokal auf deinem PC</b> — du brauchst
|
||
<b>keinen</b> Cloud-Dienst.</p>`],["Was sind Skills — und wie installiere ich sie?",`
|
||
<p>Ein <b>Skill</b> ist <b>verpacktes Können</b>: eine kurze Anleitung, die dem Agenten beibringt,
|
||
eine wiederkehrende Aufgabe jedes Mal so zu erledigen, wie <i>du</i> es willst.</p>
|
||
<p><b>Skill vs. MCP:</b> <b>MCP</b> gibt dem Agenten neue <b>Werkzeuge</b>. <b>Skills</b> geben
|
||
ihm <b>Know-how</b>. Kurz: <b>Werkzeuge = MCP, Anleitungen = Skills.</b></p>
|
||
<p><b>Installieren:</b> meist nur eine Datei ablegen — kein Build, kein Neustart:</p>
|
||
<ol class="tut-steps">
|
||
<li><b>Pro Projekt:</b> in den Projektordner (z.B. <code>AGENTS.md</code>, <code>.clinerules/</code>).</li>
|
||
<li><b>Global:</b> in den Konfig-Ordner des Tools — gilt überall.</li>
|
||
</ol>`],["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: das Web durchsuchen, Dateien lesen, eine Datenbank abfragen.</p>
|
||
<p>Du fügst in deinem Agenten einen „MCP-Server" hinzu (eine Zeile in der Konfiguration je Werkzeug).
|
||
Danach entscheidet der Agent selbst, wann er das Werkzeug einsetzt.</p>
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><b>Faustregel:</b> Fehlt dem Agenten eine <b>Fähigkeit</b> → MCP. Soll er etwas nur
|
||
<b>besser machen</b> → Skill.</li>
|
||
</ul>`],["Auto-Swap — wie das Laden funktioniert",`
|
||
<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/Entladen passiert im Hintergrund, ohne dass du etwas tun musst.</p>`],["Die empfohlenen Tools optimal nutzen",`
|
||
<ul class="tut-steps" style="list-style:disc">
|
||
<li><b>OpenCode:</b> Autonomes Coden im Terminal/Editor — ideal für „bau mir Feature X".</li>
|
||
<li><b>Cline:</b> Dasselbe als VS-Code-Erweiterung, mit Bestätigung vor jeder Aktion.</li>
|
||
<li><b>OpenWebUI:</b> Klassische Chat-Oberfläche für Fragen/Texte.</li>
|
||
</ul>
|
||
<p><b>Tipp:</b> starkes Modell (<code>coder</code>) für schwere Aufgaben, schnelles
|
||
(<code>scout</code>) für einfache — du wählst es einfach im Tool aus.</p>`]],Hc=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei davon, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF kann sie nicht nutzen."],["Quantisierung (Q4_K_M)","Verkleinert ein Modell (16-Bit → 4-Bit), damit es in den Speicher passt — bei kaum Qualitätsverlust. Q4_K_M ist der beliebte Sweetspot."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merkt. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell handeln lässt — Dateien lesen/ändern, Befehle ausführen, planen, im Loop bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Anschluss, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Dateien, Datenbank). MCP = Werkzeuge."],["Skills","Verpackte Anleitung für wiederkehrende Aufgaben — der Agent liest sie und macht es jedes Mal wie du willst. Skills = Anleitungen."],["Rules / Commands","Die konkrete Form von Skills je Tool: AGENTS.md (OpenCode), .clinerules (Cline), Rules/Prompts (Continue)."]];var Vc=k('<details class="guide-acc"><summary> </summary> <div class="acc-body"></div></details>'),Wc=k('<div class="concept"><h4> </h4> <p> </p></div>'),jc=k('<div class="pagehead"><div><h1>Guide für Einsteiger</h1> <div class="sub">Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.</div></div></div> <div class="card-h"><h3>Tutorials & Workflows</h3></div> <div class="card" style="padding:0;overflow:hidden"></div> <div class="card-h" style="margin-top:8px"><h3>Konzepte kurz erklärt</h3></div> <div class="concept-grid"></div>',1);function Jc(e){var t=jc(),a=s(_t(t),4);Ze(a,21,()=>Uc,Ye,(i,o,d)=>{var c=I(()=>ir(n(o),2));let u=()=>n(c)[0],v=()=>n(c)[1];var h=Vc();h.open=d===0;var E=l(h),p=l(E),w=s(E,2);qe(w,v,!0),O(()=>m(p,u())),b(i,h)});var r=s(a,4);Ze(r,21,()=>Hc,Ye,(i,o)=>{var d=I(()=>ir(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var v=Wc(),h=l(v),E=l(h),p=s(h,2),w=l(p);O(()=>{m(E,c()),m(w,u())}),b(i,v)}),b(e,t)}let Qi={};function Qc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Yi(e){var i;const t=document.getElementById("swdot"),a=document.getElementById("swlabel"),r=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),r&&(r.textContent="Backend offline"),Zi("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const d=["running","ready","loading","starting"],c=(e.models||[]).find(v=>d.includes(v.state));if(r)if(c){const v=(i=c.meta)!=null&&i.ctx?` <span style="color:var(--mut);font-size:11.5px">· ${Math.round(c.meta.ctx/1024)}k ctx</span>`:"",h=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}${h}`}else r.innerHTML='<span style="color:var(--mut)">Kein Modell im VRAM</span>';e.swap_ok?eu():Zi(`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,h]of Object.entries(u)){const E=Qi[v];if(E&&E!==h&&(h==="running"||h==="loading")){Qc();break}}Qi=u}Yc(e),gr.set(e)}function Yc(e){const t=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!t||!a||(t.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Zc(e){ca.set(e||[])}function Xc(e){$i.set(e)}function Zi(e,t){const a=document.getElementById("alert");a.className="alert"+(t?" warn":""),a.innerHTML=`<span class="a-dot"></span><span>${e}</span>`,a.style.display="flex"}function eu(){const e=document.getElementById("alert");e&&(e.style.display="none")}const tu=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function Yr(e,t,a,r){const i=document.createElement("span");return i.className="upd-badge"+(t?" "+t:""),i.textContent=e,r&&(i.title=r),i.onclick=()=>tu(a),i}async function Zs(){try{const e=await ge("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const a=e.apt_cache_age_h,r=a!=null&&a>24,i=a!=null?` · apt-Cache: vor ${a}h`:"";t.innerHTML="",t.appendChild(Yr(e.os>0?`OS: ${e.os} Updates`:r?"OS: ?":"OS: aktuell",e.os>0||r?"warn":"ok","server",e.os>0?`${e.os} Pakete${i}`:r?`apt-Cache veraltet (${a}h)`:`Keine Updates${i}`)),t.appendChild(Yr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Yr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Fr(){try{Yi(await ge("/api/status"))}catch{Yi(null)}}async function Xs(){try{Zc(await ge("/api/jobs"))}catch{}}function el(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=a=>{try{Xc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(el,3e3)},t.onerror=()=>t.close()}var rs;((rs=document.getElementById("logo"))==null?void 0:rs.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Nr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Nr[e.dataset.ic||""]||""});const nu=[["overview",id],["models",yd],["activity",Ld],["server",Fd],["cookbook",bc],["connect",Pc],["news",Gc],["guides",Jc]];for(const[e,t]of nu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Zr=document.getElementById("token");Zr&&(Zr.value=Ys(),Zr.addEventListener("change",e=>{qo(e.target.value),Fr()}));const Xr=document.getElementById("hf-token");Xr&&(Xr.value=rr(),Xr.addEventListener("change",e=>Io(e.target.value)));const Xi=document.getElementById("nav-settings"),ei=document.getElementById("settings-modal"),es=document.getElementById("sm-close");Xi&&ei&&es&&(Xi.addEventListener("click",()=>ei.style.display="flex"),es.addEventListener("click",()=>ei.style.display="none"));function au(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Fr);Fr();Xs();el();setInterval(au,1e3);setInterval(Fr,3e3);setInterval(Xs,1500);Zs();setInterval(Zs,6e4);
|