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