d8fe1f8097
Kontext in Connect-Snippet: - ConnectPanel: max_tokens nutzt jetzt den echten konfigurierten Kontext des Modells (m.meta.ctx) statt hartkodiertem 32768 -> Zed sieht 128k Phase D - 'Immer aktiv halten' Toggle: - models.py: UpdateReq bekommt optionales ttl-Feld - update_model: setzt TTL wenn angegeben (ctx und ttl unabhaengig) - ModelsPanel: Checkbox 'Immer aktiv halten' im Konfig-Modal (TTL=99999 = nie entladen, TTL=300 = Standard 5min) MoE tps-Schaetzung: - hw_math.py: extract_active_params_b() erkennt A3B-Suffix - estimate_speed(): moe_active_ratio-Parameter, sqrt-Boost fuer MoE - evaluate_fit(): name-Parameter (optional) fuer automatische MoE-Erkennung - cookbook.py: alle evaluate_fit-Aufrufe mit name= versehen Cleanup: - static/js/panels/*.js + static/js/main.js geloescht (Dead Code) - wird-Datei (versehentlich committet) geloescht - CLAUDE.md: KISS-Statement auf Vite+Svelte-Stand aktualisiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
113 lines
135 KiB
JavaScript
113 lines
135 KiB
JavaScript
var tl=Object.defineProperty;var Si=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 tn=(e,t,a)=>nl(e,typeof t!="symbol"?t+"":t,a),Br=(e,t,a)=>t.has(e)||Si("Cannot "+a);var v=(e,t,a)=>(Br(e,t,"read from private field"),a?a.call(e):t.get(e)),oe=(e,t,a)=>t.has(e)?Si("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),ae=(e,t,a,r)=>(Br(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),we=(e,t,a)=>(Br(e,t,"access private method"),a);var di=Array.isArray,al=Array.prototype.indexOf,mr=Array.prototype.includes,Tr=Array.from,rl=Object.defineProperty,Ua=Object.getOwnPropertyDescriptor,il=Object.getOwnPropertyDescriptors,sl=Object.prototype,ll=Array.prototype,ts=Object.getPrototypeOf,Ei=Object.isExtensible;const ol=()=>{};function dl(e){for(var t=0;t<e.length;t++)e[t]()}function ns(){var e,t,a=new Promise((r,i)=>{e=r,t=i});return{promise:a,resolve:e,reject:t}}function Ya(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 Ot=2,Ca=4,$r=8,as=1<<24,yn=16,xn=32,Jn=64,Jr=128,fn=512,gt=1024,Pt=2048,Ln=4096,Ft=8192,pn=16384,Oa=32768,Qr=1<<25,La=65536,br=1<<17,cl=1<<18,Ra=1<<19,ul=1<<20,$n=1<<25,pa=65536,yr=1<<21,wa=1<<22,Wn=1<<23,xa=Symbol("$state"),vl=Symbol(""),vr=Symbol("attributes"),Yr=Symbol("class"),Zr=Symbol("style"),Ia=Symbol("text"),fr=Symbol("form reset"),Ar=new class extends Error{constructor(){super(...arguments);tn(this,"name","StaleReactionError");tn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Yi;const fl=!!((Yi=globalThis.document)!=null&&Yi.contentType)&&globalThis.document.contentType.includes("xml");function rs(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function pl(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hl(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function gl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function _l(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ml(e){throw new Error("https://svelte.dev/e/effect_orphan")}function bl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function yl(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function wl(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function xl(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function kl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Ml=1,Sl=2,is=4,El=8,Tl=16,$l=1,Al=2,ht=Symbol("uninitialized"),ss="http://www.w3.org/1999/xhtml",Cl="http://www.w3.org/2000/svg",Ll="http://www.w3.org/1998/Math/MathML";function zl(){console.warn("https://svelte.dev/e/derived_inert")}function Pl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Dl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function ls(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 os(e){return!Ol(e,this.v)}let Dt=null;function za(e){Dt=e}function Yn(e,t=!1,a){Dt={p:Dt,i:!1,c:null,e:null,s:e,x:null,r:pe,l:null}}function Zn(e){var t=Dt,a=t.e;if(a!==null){t.e=null;for(var r of a)Cs(r)}return t.i=!0,Dt=t.p,{}}function ds(){return!0}let ta=[];function cs(){var e=ta;ta=[],dl(e)}function ca(e){if(ta.length===0&&!Va){var t=ta;queueMicrotask(()=>{t===ta&&cs()})}ta.push(e)}function Rl(){for(;ta.length>0;)cs()}function us(e){var t=pe;if(t===null)return ue.f|=Wn,e;if((t.f&Oa)===0&&(t.f&Ca)===0)throw e;Hn(e,t)}function Hn(e,t){if(!(t!==null&&(t.f&pn)!==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 ot(e,t){e.f=e.f&Bl|t}function ci(e){(e.f&fn)!==0||e.deps===null?ot(e,gt):ot(e,Ln)}function vs(e){if(e!==null)for(const t of e)(t.f&Ot)===0||(t.f&pa)===0||(t.f^=pa,vs(t.deps))}function fs(e,t,a){(e.f&Pt)!==0?t.add(e):(e.f&Ln)!==0&&a.add(e),vs(e.deps),ot(e,gt)}function ql(e){let t=0,a=ga(0),r;return()=>{_i()&&(n(a),Cr(()=>(t===0&&(r=Ba(()=>e(()=>Wa(a)))),t+=1,()=>{ca(()=>{t-=1,t===0&&(r==null||r(),r=void 0,Wa(a))})})))}}var Il=La|Ra;function Nl(e,t,a,r){new Fl(e,t,a,r)}var dn,oi,cn,ia,jt,un,Nt,an,Pn,sa,Gn,ka,tr,nr,Dn,Mr,at,Kl,Gl,Ul,Xr,pr,hr,ei,ti;class Fl{constructor(t,a,r,i){oe(this,at);tn(this,"parent");tn(this,"is_pending",!1);tn(this,"transform_error");oe(this,dn);oe(this,oi,null);oe(this,cn);oe(this,ia);oe(this,jt);oe(this,un,null);oe(this,Nt,null);oe(this,an,null);oe(this,Pn,null);oe(this,sa,0);oe(this,Gn,0);oe(this,ka,!1);oe(this,tr,new Set);oe(this,nr,new Set);oe(this,Dn,null);oe(this,Mr,ql(()=>(ae(this,Dn,ga(v(this,sa))),()=>{ae(this,Dn,null)})));var o;ae(this,dn,t),ae(this,cn,a),ae(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),ae(this,jt,bi(()=>{we(this,at,Xr).call(this)},Il))}defer_effect(t){fs(t,v(this,tr),v(this,nr))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!v(this,cn).pending}update_pending_count(t,a){we(this,at,ei).call(this,t,a),ae(this,sa,v(this,sa)+t),!(!v(this,Dn)||v(this,ka))&&(ae(this,ka,!0),ca(()=>{ae(this,ka,!1),v(this,Dn)&&Pa(v(this,Dn),v(this,sa))}))}get_effect_pending(){return v(this,Mr).call(this),n(v(this,Dn))}error(t){if(!v(this,cn).onerror&&!v(this,cn).failed)throw t;W!=null&&W.is_fork?(v(this,un)&&W.skip_effect(v(this,un)),v(this,Nt)&&W.skip_effect(v(this,Nt)),v(this,an)&&W.skip_effect(v(this,an)),W.oncommit(()=>{we(this,at,ti).call(this,t)})):we(this,at,ti).call(this,t)}}dn=new WeakMap,oi=new WeakMap,cn=new WeakMap,ia=new WeakMap,jt=new WeakMap,un=new WeakMap,Nt=new WeakMap,an=new WeakMap,Pn=new WeakMap,sa=new WeakMap,Gn=new WeakMap,ka=new WeakMap,tr=new WeakMap,nr=new WeakMap,Dn=new WeakMap,Mr=new WeakMap,at=new WeakSet,Kl=function(){try{ae(this,un,vn(()=>v(this,ia).call(this,v(this,dn))))}catch(t){this.error(t)}},Gl=function(t){const a=v(this,cn).failed;a&&ae(this,an,vn(()=>{a(v(this,dn),()=>t,()=>()=>{})}))},Ul=function(){const t=v(this,cn).pending;t&&(this.is_pending=!0,ae(this,Nt,vn(()=>t(v(this,dn)))),ca(()=>{var a=ae(this,Pn,document.createDocumentFragment()),r=jn();a.append(r),ae(this,un,we(this,at,hr).call(this,()=>vn(()=>v(this,ia).call(this,r)))),v(this,Gn)===0&&(v(this,dn).before(a),ae(this,Pn,null),va(v(this,Nt),()=>{ae(this,Nt,null)}),we(this,at,pr).call(this,W))}))},Xr=function(){try{if(this.is_pending=this.has_pending_snippet(),ae(this,Gn,0),ae(this,sa,0),ae(this,un,vn(()=>{v(this,ia).call(this,v(this,dn))})),v(this,Gn)>0){var t=ae(this,Pn,document.createDocumentFragment());wi(v(this,un),t);const a=v(this,cn).pending;ae(this,Nt,vn(()=>a(v(this,dn))))}else we(this,at,pr).call(this,W)}catch(a){this.error(a)}},pr=function(t){this.is_pending=!1,t.transfer_effects(v(this,tr),v(this,nr))},hr=function(t){var a=pe,r=ue,i=Dt;zn(v(this,jt)),hn(v(this,jt)),za(v(this,jt).ctx);try{return ha.ensure(),t()}catch(o){return us(o),null}finally{zn(a),hn(r),za(i)}},ei=function(t,a){var r;if(!this.has_pending_snippet()){this.parent&&we(r=this.parent,at,ei).call(r,t,a);return}ae(this,Gn,v(this,Gn)+t),v(this,Gn)===0&&(we(this,at,pr).call(this,a),v(this,Nt)&&va(v(this,Nt),()=>{ae(this,Nt,null)}),v(this,Pn)&&(v(this,dn).before(v(this,Pn)),ae(this,Pn,null)))},ti=function(t){v(this,un)&&(Yt(v(this,un)),ae(this,un,null)),v(this,Nt)&&(Yt(v(this,Nt)),ae(this,Nt,null)),v(this,an)&&(Yt(v(this,an)),ae(this,an,null));var a=v(this,cn).onerror;let r=v(this,cn).failed;var i=!1,o=!1;const d=()=>{if(i){Dl();return}i=!0,o&&kl(),v(this,an)!==null&&va(v(this,an),()=>{ae(this,an,null)}),we(this,at,hr).call(this,()=>{we(this,at,Xr).call(this)})},c=u=>{try{o=!0,a==null||a(u,d),o=!1}catch(f){Hn(f,v(this,jt)&&v(this,jt).parent)}r&&ae(this,an,we(this,at,hr).call(this,()=>{try{return vn(()=>{var f=pe;f.b=this,f.f|=Jr,r(v(this,dn),()=>u,()=>d)})}catch(f){return Hn(f,v(this,jt).parent),null}}))};ca(()=>{var u;try{u=this.transform_error(t)}catch(f){Hn(f,v(this,jt)&&v(this,jt).parent);return}u!==null&&typeof u=="object"&&typeof u.then=="function"?u.then(c,f=>Hn(f,v(this,jt)&&v(this,jt).parent)):c(u)})};function Hl(e,t,a,r){const i=ui;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 _(b){if((c.f&pn)===0){u();try{r([...d,...b])}catch(A){Hn(A,c)}wr()}}var T=ps();if(a.length===0){f.then(()=>_([])).finally(T);return}function h(){Promise.all(a.map(b=>Wl(b))).then(_).catch(b=>Hn(b,c)).finally(T)}f?f.then(()=>{u(),h(),wr()}):h()}function Vl(){var e=pe,t=ue,a=Dt,r=W;return function(o=!0){zn(e),hn(t),za(a),o&&(e.f&pn)===0&&(r==null||r.activate(),r==null||r.apply())}}function wr(e=!0){zn(null),hn(null),za(null),e&&(W==null||W.deactivate())}function ps(){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 ui(e){var t=Ot|Pt;return pe!==null&&(pe.f|=Ra),{ctx:Dt,deps:null,effects:null,equals:ls,f:t,fn:e,reactions:null,rv:0,v:ht,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(ht),d=!ue,c=new Set;return uo(()=>{var b,A;var u=pe,f=ns();i=f.promise;try{Promise.resolve(e()).then(f.resolve,C=>{C!==Ar&&f.reject(C)}).finally(wr)}catch(C){f.reject(C),wr()}var _=W;if(d){if((u.f&Oa)!==0)var T=ps();if((b=r.b)!=null&&b.is_rendered())(A=_.async_deriveds.get(u))==null||A.reject(Na);else for(const C of c.values())C.reject(Na);c.add(f),_.async_deriveds.set(u,f)}const h=(C,S=void 0)=>{T==null||T(),c.delete(f),S!==Na&&(_.activate(),S?(o.f|=Wn,Pa(o,S)):((o.f&Wn)!==0&&(o.f^=Wn),Pa(o,C)),_.deactivate())};f.promise.then(h,C=>h(null,C||"unknown"))}),As(()=>{for(const u of c)u.reject(Na)}),new Promise(u=>{function f(_){function T(){_===i?u(o):f(i)}_.then(T,T)}f(i)})}function q(e){const t=ui(e);return Bs(t),t}function jl(e){const t=ui(e);return t.equals=os,t}function Jl(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;a<t.length;a+=1)Yt(t[a])}}function vi(e){var t,a=pe,r=e.parent;if(!Qn&&r!==null&&e.v!==ht&&(r.f&(pn|Ft))!==0)return zl(),e.v;zn(r);try{e.f&=~pa,Jl(e),t=Fs(e)}finally{zn(a)}return t}function hs(e){var t=vi(e);if(!e.equals(t)&&(e.wv=Is(),(!(W!=null&&W.is_fork)||e.deps===null)&&(W!==null?(W.capture(e,t,!0),Ha==null||Ha.capture(e,t,!0)):e.v=t,e.deps===null))){ot(e,gt);return}Qn||(zt!==null?(_i()||W!=null&&W.is_fork)&&zt.set(e,t):ci(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,Za(r,0),yi(r))}function gs(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&Da(t)}let qr=null,ma=null,W=null,Ha=null,zt=null,ni=null,Va=!1,Ir=!1,ya=null,gr=null;var Ti=0;let Yl=1;var Ma,Un,la,Sa,Ea,Ta,On,$a,Jt,ar,Rn,_n,En,Aa,oa,$e,ai,Fa,ri,_s,ms,ba,Zl,Ka;const Sr=class Sr{constructor(){oe(this,$e);tn(this,"id",Yl++);oe(this,Ma,!1);tn(this,"linked",!0);oe(this,Un,null);oe(this,la,null);tn(this,"async_deriveds",new Map);tn(this,"current",new Map);tn(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,Jt,[]);oe(this,ar,[]);oe(this,Rn,new Set);oe(this,_n,new Set);oe(this,En,new Map);oe(this,Aa,new Set);tn(this,"is_fork",!1);oe(this,oa,!1);ma===null?qr=ma=this:(ae(ma,la,this),ae(this,Un,ma)),ma=this}skip_effect(t){v(this,En).has(t)||v(this,En).set(t,{d:[],m:[]}),v(this,Aa).delete(t)}unskip_effect(t,a=r=>this.schedule(r)){var r=v(this,En).get(t);if(r){v(this,En).delete(t);for(var i of r.d)ot(i,Pt),a(i);for(i of r.m)ot(i,Ln),a(i)}v(this,Aa).add(t)}capture(t,a,r=!1){t.v!==ht&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Wn)===0&&(this.current.set(t,[a,r]),zt==null||zt.set(t,a)),this.is_fork||(t.v=a)}activate(){W=this}deactivate(){W=null,zt=null}flush(){try{Ir=!0,W=this,we(this,$e,Fa).call(this)}finally{Ti=0,ni=null,ya=null,gr=null,Ir=!1,W=null,zt=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);we(this,$e,Ka).call(this),(t=v(this,$a))==null||t.resolve()}register_created_effect(t){v(this,ar).push(t)}increment(t,a){if(ae(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(ae(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)||(ae(this,oa,!0),ca(()=>{ae(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,_n).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)??ae(this,$a,ns())).promise}static ensure(){if(W===null){const t=W=new Sr;!Ir&&!Va&&ca(()=>{v(t,Ma)||t.flush()})}return W}apply(){{zt=null;return}}schedule(t){var i;if(ni=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Ca|$r|as))!==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(ya!==null&&a===pe&&(ue===null||(ue.f&Ot)===0))return;if((r&(Jn|xn))!==0){if((r>)===0)return;a.f^=gt}}v(this,Jt).push(a)}};Ma=new WeakMap,Un=new WeakMap,la=new WeakMap,Sa=new WeakMap,Ea=new WeakMap,Ta=new WeakMap,On=new WeakMap,$a=new WeakMap,Jt=new WeakMap,ar=new WeakMap,Rn=new WeakMap,_n=new WeakMap,En=new WeakMap,Aa=new WeakMap,oa=new WeakMap,$e=new WeakSet,ai=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,En).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},Fa=function(){var u,f,_,T;ae(this,Ma,!0),Ti++>1e3&&(we(this,$e,Ka).call(this),eo());for(const h of v(this,Rn))v(this,_n).delete(h),ot(h,Pt),this.schedule(h);for(const h of v(this,_n))ot(h,Ln),this.schedule(h);const t=v(this,Jt);ae(this,Jt,[]),this.apply();var a=ya=[],r=[],i=gr=[];for(const h of t)try{we(this,$e,ri).call(this,h,a,r)}catch(b){throw ws(h),we(this,$e,ai).call(this)||this.discard(),b}if(W=null,i.length>0){var o=Sr.ensure();for(const h of i)o.schedule(h)}if(ya=null,gr=null,we(this,$e,ai).call(this)){we(this,$e,ba).call(this,r),we(this,$e,ba).call(this,a);for(const[h,b]of v(this,En))ys(h,b);i.length>0&&we(u=W,$e,Fa).call(u);return}const d=we(this,$e,_s).call(this);if(d){we(this,$e,ba).call(this,r),we(this,$e,ba).call(this,a),we(f=d,$e,ms).call(f,this);return}v(this,Rn).clear(),v(this,_n).clear();for(const h of v(this,Sa))h(this);v(this,Sa).clear(),Ha=this,$i(r),$i(a),Ha=null,(_=v(this,$a))==null||_.resolve();var c=W;if(v(this,Ta)===0&&(v(this,Jt).length===0||c!==null)&&we(this,$e,Ka).call(this),v(this,Jt).length>0)if(c!==null){const h=c;v(h,Jt).push(...v(this,Jt).filter(b=>!v(h,Jt).includes(b)))}else c=this;c!==null&&we(T=c,$e,Fa).call(T)},ri=function(t,a,r){t.f^=gt;for(var i=t.first;i!==null;){var o=i.f,d=(o&(xn|Jn))!==0,c=d&&(o>)!==0,u=c||(o&Ft)!==0||v(this,En).has(i);if(!u&&i.fn!==null){d?i.f^=gt:(o&Ca)!==0?a.push(i):lr(i)&&((o&yn)!==0&&v(this,_n).add(i),Da(i));var f=i.first;if(f!==null){i=f;continue}}for(;i!==null;){var _=i.next;if(_!==null){i=_;break}i=i.parent}}},_s=function(){for(var t=v(this,Un);t!==null;){if(!t.is_fork){for(const[a,[,r]]of this.current)if(t.current.has(a)&&!r)return t}t=v(t,Un)}return null},ms=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,_n));const a=i=>{var o=i.reactions;if(o!==null)for(const u of o){var d=u.f;if((d&Ot)!==0)a(u);else{var c=u;d&(wa|yn)&&!this.async_deriveds.has(c)&&(v(this,_n).delete(c),ot(c,Pt),this.schedule(c))}}};for(const i of this.current.keys())a(i);this.oncommit(()=>t.discard()),we(r=t,$e,Ka).call(r),W=this,we(this,$e,Fa).call(this)},ba=function(t){for(var a=0;a<t.length;a+=1)fs(t[a],v(this,Rn),v(this,_n))},Zl=function(){var T;for(let h=qr;h!==null;h=v(h,la)){var t=h.id<this.id,a=[];for(const[b,[A,C]]of this.current){if(h.current.has(b)){var r=h.current.get(b)[0];if(t&&A!==r)h.current.set(b,[A,C]);else continue}a.push(b)}if(t)for(const[b,A]of this.async_deriveds){const C=h.async_deriveds.get(b);C&&A.promise.then(C.resolve).catch(C.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,A=>{var C;(A.f&(yn|wa))!==0?h.schedule(A):we(C=h,$e,ba).call(C,[A])});h.activate();var d=new Set,c=new Map;for(var u of a)bs(u,o,d,c);c=new Map;var f=[...h.current].filter(([b,A])=>{const C=this.current.get(b);return C?C[0]!==A[0]||C[1]!==A[1]:!0}).map(([b])=>b);if(f.length>0)for(const b of v(this,ar))(b.f&(pn|Ft|br))===0&&fi(b,f,c)&&((b.f&(wa|yn))!==0?(ot(b,Pt),h.schedule(b)):v(h,Rn).add(b));if(v(h,Jt).length>0&&!v(h,oa)){h.apply();for(var _ of v(h,Jt))we(T=h,$e,ri).call(T,_,[],[]);ae(h,Jt,[])}h.deactivate()}}}},Ka=function(){if(this.linked){var t=v(this,Un),a=v(this,la);t===null?qr=a:ae(t,la,a),a===null?ma=t:ae(a,Un,t),this.linked=!1}};let ha=Sr;function Xl(e){var t=Va;Va=!0;try{for(var a;;){if(Rl(),W===null)return a;W.flush()}}finally{Va=t}}function eo(){try{bl()}catch(e){Hn(e,ni)}}let gn=null;function $i(e){var t=e.length;if(t!==0){for(var a=0;a<t;){var r=e[a++];if((r.f&(pn|Ft))===0&&lr(r)&&(gn=new Set,Da(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&Ds(r),(gn==null?void 0:gn.size)>0)){ua.clear();for(const i of gn){if((i.f&(pn|Ft))!==0)continue;const o=[i];let d=i.parent;for(;d!==null;)gn.has(d)&&(gn.delete(d),o.push(d)),d=d.parent;for(let c=o.length-1;c>=0;c--){const u=o[c];(u.f&(pn|Ft))===0&&Da(u)}}gn.clear()}}gn=null}}function bs(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&Ot)!==0?bs(i,t,a,r):(o&(wa|yn))!==0&&(o&Pt)===0&&fi(i,t,r)&&(ot(i,Pt),pi(i))}}function fi(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&Ot)!==0&&fi(i,t,a))return a.set(i,!0),!0}return a.set(e,!1),!1}function pi(e){W.schedule(e)}function ys(e,t){if(!((e.f&xn)!==0&&(e.f>)!==0)){(e.f&Pt)!==0?t.d.push(e):(e.f&Ln)!==0&&t.m.push(e),ot(e,gt);for(var a=e.first;a!==null;)ys(a,t),a=a.next}}function ws(e){ot(e,gt);for(var t=e.first;t!==null;)ws(t),t=t.next}let xr=new Set;const ua=new Map;let xs=!1;function ga(e,t){var a={f:0,v:e,reactions:null,equals:ls,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=os),r}function g(e,t,a=!1){ue!==null&&(!wn||(ue.f&br)!==0)&&ds()&&(ue.f&(Ot|yn|wa|br))!==0&&(An===null||!An.has(e))&&xl();let r=a?Bt(t):t;return Pa(e,r,gr)}function Pa(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&Ot)!==0){const i=e;(e.f&Pt)!==0&&vi(i),zt===null&&ci(i)}e.wv=Is(),ks(e,Pt,a),pe!==null&&(pe.f>)!==0&&(pe.f&(xn|Jn))===0&&(on===null?fo([e]):on.push(e)),!r.is_fork&&xr.size>0&&!xs&&no()}return t}function no(){xs=!1;for(const e of xr){(e.f>)!==0&&ot(e,Ln);let t;try{t=lr(e)}catch{t=!0}t&&Da(e)}xr.clear()}function Wa(e){g(e,e.v+1)}function ks(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&Pt)===0;if(u&&ot(d,t),(c&br)!==0)xr.add(d);else if((c&Ot)!==0){var f=d;zt==null||zt.delete(f),(c&pa)===0&&(c&fn&&(pe===null||(pe.f&yr)===0)&&(d.f|=pa),ks(f,Ln,a))}else if(u){var _=d;(c&yn)!==0&&gn!==null&&gn.add(_),a!==null?a.push(_):pi(_)}}}function Bt(e){if(typeof e!="object"||e===null||xa in e)return e;const t=ts(e);if(t!==sl&&t!==ll)return e;var a=new Map,r=di(e),i=R(0),o=fa,d=c=>{if(fa===o)return c();var u=ue,f=fa;hn(null),Pi(o);var _=c();return hn(u),Pi(f),_};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)&&yl();var _=a.get(u);return _===void 0?d(()=>{var T=R(f.value);return a.set(u,T),T}):g(_,f.value,!0),!0},deleteProperty(c,u){var f=a.get(u);if(f===void 0){if(u in c){const _=d(()=>R(ht));a.set(u,_),Wa(i)}}else g(f,ht),Wa(i);return!0},get(c,u,f){var b;if(u===xa)return e;var _=a.get(u),T=u in c;if(_===void 0&&(!T||(b=Ua(c,u))!=null&&b.writable)&&(_=d(()=>{var A=Bt(T?c[u]:ht),C=R(A);return C}),a.set(u,_)),_!==void 0){var h=n(_);return h===ht?void 0:h}return Reflect.get(c,u,f)},getOwnPropertyDescriptor(c,u){var f=Reflect.getOwnPropertyDescriptor(c,u);if(f&&"value"in f){var _=a.get(u);_&&(f.value=n(_))}else if(f===void 0){var T=a.get(u),h=T==null?void 0:T.v;if(T!==void 0&&h!==ht)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),_=f!==void 0&&f.v!==ht||Reflect.has(c,u);if(f!==void 0||pe!==null&&(!_||(h=Ua(c,u))!=null&&h.writable)){f===void 0&&(f=d(()=>{var b=_?Bt(c[u]):ht,A=R(b);return A}),a.set(u,f));var T=n(f);if(T===ht)return!1}return _},set(c,u,f,_){var ee;var T=a.get(u),h=u in c;if(r&&u==="length")for(var b=f;b<T.v;b+=1){var A=a.get(b+"");A!==void 0?g(A,ht):b in c&&(A=d(()=>R(ht)),a.set(b+"",A))}if(T===void 0)(!h||(ee=Ua(c,u))!=null&&ee.writable)&&(T=d(()=>R(void 0)),g(T,Bt(f)),a.set(u,T));else{h=T.v!==ht;var C=d(()=>Bt(f));g(T,C)}var S=Reflect.getOwnPropertyDescriptor(c,u);if(S!=null&&S.set&&S.set.call(_,f),!h){if(r&&typeof u=="string"){var B=a.get("length"),ye=Number(u);Number.isInteger(ye)&&ye>=B.v&&g(B,ye+1)}Wa(i)}return!0},ownKeys(c){n(i);var u=Reflect.ownKeys(c).filter(T=>{var h=a.get(T);return h===void 0||h.v!==ht});for(var[f,_]of a)_.v!==ht&&!(f in c)&&u.push(f);return u},setPrototypeOf(){wl()}})}function Ai(e){try{if(e!==null&&typeof e=="object"&&xa in e)return e[xa]}catch{}return e}function ao(e,t){return Object.is(Ai(e),Ai(t))}var Ci,Ms,Ss,Es;function ro(){if(Ci===void 0){Ci=window,Ms=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;Ss=Ua(t,"firstChild").get,Es=Ua(t,"nextSibling").get,Ei(e)&&(e[Yr]=void 0,e[vr]=null,e[Zr]=void 0,e.__e=void 0),Ei(a)&&(a[Ia]=void 0)}}function jn(e=""){return document.createTextNode(e)}function Vn(e){return Ss.call(e)}function sr(e){return Es.call(e)}function s(e,t){return Vn(e)}function ft(e,t=!1){{var a=Vn(e);return a instanceof Comment&&a.data===""?sr(a):a}}function l(e,t=1,a=!1){let r=e;for(;t--;)r=sr(r);return r}function io(e){e.textContent=""}function Ts(){return!1}function $s(e,t,a){return t==null||t===ss?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(t,e,{is:a}):document.createElementNS(t,e)}let Li=!1;function so(){Li||(Li=!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 hi(e){var t=ue,a=pe;hn(null),zn(null);try{return e()}finally{hn(t),zn(a)}}function gi(e,t,a,r=a){e.addEventListener(t,()=>hi(a));const i=e[fr];i?e[fr]=()=>{i(),r(!0)}:e[fr]=()=>r(!0),so()}function lo(e){pe===null&&(ue===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 qn(e,t){var a=pe;a!==null&&(a.f&Ft)!==0&&(e|=Ft);var r={ctx:Dt,deps:null,nodes:null,f:e|Pt|fn,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)ya!==null?ya.push(r):ha.ensure().schedule(r);else if(t!==null){try{Da(r)}catch(d){throw Yt(r),d}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&Ra)===0&&(i=i.first,(e&yn)!==0&&(e&La)!==0&&i!==null&&(i.f|=La))}if(i!==null&&(i.parent=a,a!==null&&oo(i,a),ue!==null&&(ue.f&Ot)!==0&&(e&Jn)===0)){var o=ue;(o.effects??(o.effects=[])).push(i)}return r}function _i(){return ue!==null&&!wn}function As(e){const t=qn($r,null);return ot(t,gt),t.teardown=e,t}function mi(e){lo();var t=pe.f,a=!ue&&(t&xn)!==0&&Dt!==null&&!Dt.i;if(a){var r=Dt;(r.e??(r.e=[])).push(e)}else return Cs(e)}function Cs(e){return qn(Ca|ul,e)}function co(e){ha.ensure();const t=qn(Jn|Ra,e);return(a={})=>new Promise(r=>{a.outro?va(t,()=>{Yt(t),r(void 0)}):(Yt(t),r(void 0))})}function Ls(e){return qn(Ca,e)}function uo(e){return qn(wa|Ra,e)}function Cr(e,t=0){return qn($r|t,e)}function O(e,t=[],a=[],r=[]){Hl(r,t,a,i=>{qn($r,()=>{e(...i.map(n))})})}function bi(e,t=0){var a=qn(yn|t,e);return a}function vn(e){return qn(xn|Ra,e)}function zs(e){var t=e.teardown;if(t!==null){const a=Qn,r=ue;zi(!0),hn(null);try{t.call(null)}finally{zi(a),hn(r)}}}function yi(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const i=a.ac;i!==null&&hi(()=>{i.abort(Ar)});var r=a.next;(a.f&Jn)!==0?a.parent=null:Yt(a,t),a=r}}function vo(e){for(var t=e.first;t!==null;){var a=t.next;(t.f&xn)===0&&Yt(t),t=a}}function Yt(e,t=!0){var a=!1;(t||(e.f&cl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Ps(e.nodes.start,e.nodes.end),a=!0),e.f|=Qr,yi(e,t&&!a),Za(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)o.stop();zs(e),e.f^=Qr,e.f|=pn;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 Ps(e,t){for(;e!==null;){var a=e===t?null:sr(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&&Yt(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&xn)!==0&&(e.f&yn)!==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>)===0&&(ot(e,Pt),ha.ensure().schedule(e));for(var a=e.first;a!==null;){var r=a.next,i=(a.f&La)!==0||(a.f&xn)!==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:sr(a);t.append(a),a=i}}let _r=!1,Qn=!1;function zi(e){Qn=e}let ue=null,wn=!1;function hn(e){ue=e}let pe=null;function zn(e){pe=e}let An=null;function Bs(e){ue!==null&&(An??(An=new Set)).add(e)}let Qt=null,nn=0,on=null;function fo(e){on=e}let qs=1,na=0,fa=na;function Pi(e){fa=e}function Is(){return++qs}function lr(e){var t=e.f;if((t&Pt)!==0)return!0;if(t&Ot&&(e.f&=~pa),(t&Ln)!==0){for(var a=e.deps,r=a.length,i=0;i<r;i++){var o=a[i];if(lr(o)&&hs(o),o.wv>e.wv)return!0}(t&fn)!==0&&zt===null&&ot(e,gt)}return!1}function Ns(e,t,a=!0){var r=e.reactions;if(r!==null&&!(An!==null&&An.has(e)))for(var i=0;i<r.length;i++){var o=r[i];(o.f&Ot)!==0?Ns(o,t,!1):t===o&&(a?ot(o,Pt):(o.f>)!==0&&ot(o,Ln),pi(o))}}function Fs(e){var C;var t=Qt,a=nn,r=on,i=ue,o=An,d=Dt,c=wn,u=fa,f=e.f;Qt=null,nn=0,on=null,ue=(f&(xn|Jn))===0?e:null,An=null,za(e.ctx),wn=!1,fa=++na,e.ac!==null&&(hi(()=>{e.ac.abort(Ar)}),e.ac=null);try{e.f|=yr;var _=e.fn,T=_();e.f|=Oa;var h=e.deps,b=W==null?void 0:W.is_fork;if(Qt!==null){var A;if(b||Za(e,nn),h!==null&&nn>0)for(h.length=nn+Qt.length,A=0;A<Qt.length;A++)h[nn+A]=Qt[A];else e.deps=h=Qt;if(_i()&&(e.f&fn)!==0)for(A=nn;A<h.length;A++)((C=h[A]).reactions??(C.reactions=[])).push(e)}else!b&&h!==null&&nn<h.length&&(Za(e,nn),h.length=nn);if(ds()&&on!==null&&!wn&&h!==null&&(e.f&(Ot|Ln|Pt))===0)for(A=0;A<on.length;A++)Ns(on[A],e);if(i!==null&&i!==e){if(na++,i.deps!==null)for(let S=0;S<a;S+=1)i.deps[S].rv=na;if(t!==null)for(const S of t)S.rv=na;on!==null&&(r===null?r=on:r.push(...on))}return(e.f&Wn)!==0&&(e.f^=Wn),T}catch(S){return us(S)}finally{e.f^=yr,Qt=t,nn=a,on=r,ue=i,An=o,za(d),wn=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&Ot)!==0&&(Qt===null||!mr.call(Qt,t))){var o=t;(o.f&fn)!==0&&(o.f^=fn,o.f&=~pa),o.v!==ht&&ci(o),Ql(o),Za(o,0)}}function Za(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&pn)===0){ot(e,gt);var a=pe,r=_r;pe=e,_r=!0;try{(t&(yn|as))!==0?vo(e):yi(e),zs(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&Ot)!==0;if(ue!==null&&!wn){var r=pe!==null&&(pe.f&pn)!==0;if(!r&&(An===null||!An.has(e))){var i=ue.deps;if((ue.f&yr)!==0)e.rv<na&&(e.rv=na,Qt===null&&i!==null&&i[nn]===e?nn++:Qt===null?Qt=[e]:Qt.push(e));else{ue.deps??(ue.deps=[]),mr.call(ue.deps,e)||ue.deps.push(e);var o=e.reactions;o===null?e.reactions=[ue]:mr.call(o,ue)||o.push(ue)}}}if(Qn&&ua.has(e))return ua.get(e);if(a){var d=e;if(Qn){var c=d.v;return((d.f>)===0&&d.reactions!==null||Gs(d))&&(c=vi(d)),ua.set(d,c),c}var u=(d.f&fn)===0&&!wn&&ue!==null&&(_r||(ue.f&fn)!==0),f=(d.f&Oa)===0;lr(d)&&(u&&(d.f|=fn),hs(d)),u&&!f&&(gs(d),Ks(d))}if(zt!=null&&zt.has(e))return zt.get(e);if((e.f&Wn)!==0)throw e.v;return e.v}function Ks(e){if(e.f|=fn,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),(t.f&Ot)!==0&&(t.f&fn)===0&&(gs(t),Ks(t))}function Gs(e){if(e.v===ht)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(ua.has(t)||(t.f&Ot)!==0&&Gs(t))return!0;return!1}function Ba(e){var t=wn;try{return wn=!0,e()}finally{wn=t}}const go=["touchstart","touchmove"];function _o(e){return go.includes(e)}const aa=Symbol("events"),Us=new Set,ii=new Set;function z(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 ii)a(e)}let Di=null;function Oi(e){var C,S;var t=this,a=t.ownerDocument,r=e.type,i=((C=e.composedPath)==null?void 0:C.call(e))||[],o=i[0]||e.target;Di=e;var d=0,c=Di===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 _=ue,T=pe;hn(null),zn(null);try{for(var h,b=[];o!==null&&o!==t;){try{var A=(S=o[aa])==null?void 0:S[r];A!=null&&(!o.disabled||e.target===o)&&A.call(o,e)}catch(B){h?b.push(B):h=B}if(e.cancelBubble)break;d++,o=d<i.length?i[d]:null}if(h){for(let B of b)queueMicrotask(()=>{throw B});throw h}}finally{e[aa]=t,delete e.currentTarget,hn(_),zn(T)}}}var Zi;const Nr=((Zi=globalThis==null?void 0:globalThis.window)==null?void 0:Zi.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=$s("template");return t.innerHTML=mo(e.replaceAll("<!>","<!---->")),t.content}function Xa(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=Vn(i)));var d=r||Ms?document.importNode(i,!0):i.cloneNode(!0);if(a){var c=Vn(d),u=d.lastChild;Xa(c,u)}else Xa(d,d);return d}}function Lr(){var e=document.createDocumentFragment(),t=document.createComment(""),a=jn();return e.append(t,a),Xa(t,a),e}function w(e,t){e!==null&&e.before(t)}function m(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[Ia]??(e[Ia]=e.nodeValue))&&(e[Ia]=a,e.nodeValue=`${a}`)}function yo(e,t){return wo(e,t)}const cr=new Map;function wo(e,{target:t,anchor:a,props:r={},events:i,context:o,intro:d=!0,transformError:c}){ro();var u=void 0,f=co(()=>{var _=a??t.appendChild(jn());Nl(_,{pending:()=>{}},b=>{Yn({});var A=Dt;o&&(A.c=o),i&&(r.$$events=i),u=e(b,r)||{},Zn()},c);var T=new Set,h=b=>{for(var A=0;A<b.length;A++){var C=b[A];if(!T.has(C)){T.add(C);var S=_o(C);for(const ee of[t,document]){var B=cr.get(ee);B===void 0&&(B=new Map,cr.set(ee,B));var ye=B.get(C);ye===void 0?(ee.addEventListener(C,Oi,{passive:S}),B.set(C,1)):B.set(C,ye+1)}}}};return h(Tr(Us)),ii.add(h),()=>{var S;for(var b of T)for(const B of[t,document]){var A=cr.get(B),C=A.get(b);--C==0?(B.removeEventListener(b,Oi),A.delete(b),A.size===0&&cr.delete(B)):A.set(b,C)}ii.delete(h),_!==a&&((S=_.parentNode)==null||S.removeChild(_))}});return xo.set(u,f),u}let xo=new WeakMap;var mn,Tn,rn,da,rr,ir,Er;class ko{constructor(t,a=!0){tn(this,"anchor");oe(this,mn,new Map);oe(this,Tn,new Map);oe(this,rn,new Map);oe(this,da,new Set);oe(this,rr,!0);oe(this,ir,t=>{if(v(this,mn).has(t)){var a=v(this,mn).get(t),r=v(this,Tn).get(a);if(r)kr(r),v(this,da).delete(a);else{var i=v(this,rn).get(a);i&&(kr(i.effect),v(this,Tn).set(a,i.effect),v(this,rn).delete(a),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[o,d]of v(this,mn)){if(v(this,mn).delete(o),o===t)break;const c=v(this,rn).get(d);c&&(Yt(c.effect),v(this,rn).delete(d))}for(const[o,d]of v(this,Tn)){if(o===a||v(this,da).has(o))continue;const c=()=>{if(Array.from(v(this,mn).values()).includes(o)){var f=document.createDocumentFragment();wi(d,f),f.append(jn()),v(this,rn).set(o,{effect:d,fragment:f})}else Yt(d);v(this,da).delete(o),v(this,Tn).delete(o)};v(this,rr)||!r?(v(this,da).add(o),va(d,c,!1)):c()}}});oe(this,Er,t=>{v(this,mn).delete(t);const a=Array.from(v(this,mn).values());for(const[r,i]of v(this,rn))a.includes(r)||(Yt(i.effect),v(this,rn).delete(r))});this.anchor=t,ae(this,rr,a)}ensure(t,a){var r=W,i=Ts();if(a&&!v(this,Tn).has(t)&&!v(this,rn).has(t))if(i){var o=document.createDocumentFragment(),d=jn();o.append(d),v(this,rn).set(t,{effect:vn(()=>a(d)),fragment:o})}else v(this,Tn).set(t,vn(()=>a(this.anchor)));if(v(this,mn).set(r,t),i){for(const[c,u]of v(this,Tn))c===t?r.unskip_effect(u):r.skip_effect(u);for(const[c,u]of v(this,rn))c===t?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(v(this,ir)),r.ondiscard(v(this,Er))}else v(this,ir).call(this,r)}}mn=new WeakMap,Tn=new WeakMap,rn=new WeakMap,da=new WeakMap,rr=new WeakMap,ir=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)}bi(()=>{var d=!1;t((c,u=0)=>{d=!0,o(u,c)}),d||o(-1,null)},i)}function Ke(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=t[c];va(T,()=>{if(o){if(o.pending.delete(T),o.done.add(T),o.pending.size===0){var h=e.outrogroups;si(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,_=f.parentNode;io(_),_.append(f),e.items.clear()}si(e,t,!u)}else o={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function si(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|=$n;const d=document.createDocumentFragment();wi(o,d)}else Yt(t[i],a)}}var Ri;function Ge(e,t,a,r,i,o=null){var d=e,c=new Map,u=(t&is)!==0;if(u){var f=e;d=f.appendChild(jn())}var _=null,T=jl(()=>{var ee=a();return di(ee)?ee:ee==null?[]:Tr(ee)}),h,b=new Map,A=!0;function C(ee){(ye.effect.f&pn)===0&&(ye.pending.delete(ee),ye.fallback=_,So(ye,h,d,t,r),_!==null&&(h.length===0?(_.f&$n)===0?kr(_):(_.f^=$n,Ga(_,null,d)):va(_,()=>{_=null})))}function S(ee){ye.pending.delete(ee)}var B=bi(()=>{h=n(T);for(var ee=h.length,ce=new Set,_e=W,I=Ts(),K=0;K<ee;K+=1){var ie=h[K],ve=r(ie,K),me=A?null:c.get(ve);me?(me.v&&Pa(me.v,ie),me.i&&Pa(me.i,K),I&&_e.unskip_effect(me.e)):(me=Eo(c,A?d:Ri??(Ri=jn()),ie,ve,K,i,t,a),A||(me.e.f|=$n),c.set(ve,me)),ce.add(ve)}if(ee===0&&o&&!_&&(A?_=vn(()=>o(d)):(_=vn(()=>o(Ri??(Ri=jn()))),_.f|=$n)),ee>ce.size&&hl(),!A)if(b.set(_e,ce),I){for(const[Me,Ue]of c)ce.has(Me)||_e.skip_effect(Ue.e);_e.oncommit(C),_e.ondiscard(S)}else C(_e);n(T)}),ye={effect:B,items:c,pending:b,outrogroups:null,fallback:_};A=!1}function qa(e){for(;e!==null&&(e.f&xn)===0;)e=e.next;return e}function So(e,t,a,r,i){var me,Me,Ue,E,Q,de,Ae,Y,be;var o=(r&El)!==0,d=t.length,c=e.items,u=qa(e.effect.first),f,_=null,T,h=[],b=[],A,C,S,B;if(o)for(B=0;B<d;B+=1)A=t[B],C=i(A,B),S=c.get(C).e,(S.f&$n)===0&&((Me=(me=S.nodes)==null?void 0:me.a)==null||Me.measure(),(T??(T=new Set)).add(S));for(B=0;B<d;B+=1){if(A=t[B],C=i(A,B),S=c.get(C).e,e.outrogroups!==null)for(const Z of e.outrogroups)Z.pending.delete(S),Z.done.delete(S);if((S.f&Ft)!==0&&(kr(S),o&&((E=(Ue=S.nodes)==null?void 0:Ue.a)==null||E.unfix(),(T??(T=new Set)).delete(S))),(S.f&$n)!==0)if(S.f^=$n,S===u)Ga(S,null,a);else{var ye=_?_.next:u;S===e.effect.last&&(e.effect.last=S.prev),S.prev&&(S.prev.next=S.next),S.next&&(S.next.prev=S.prev),Fn(e,_,S),Fn(e,S,ye),Ga(S,ye,a),_=S,h=[],b=[],u=qa(_.next);continue}if(S!==u){if(f!==void 0&&f.has(S)){if(h.length<b.length){var ee=b[0],ce;_=ee.prev;var _e=h[0],I=h[h.length-1];for(ce=0;ce<h.length;ce+=1)Ga(h[ce],ee,a);for(ce=0;ce<b.length;ce+=1)f.delete(b[ce]);Fn(e,_e.prev,I.next),Fn(e,_,_e),Fn(e,I,ee),u=ee,_=I,B-=1,h=[],b=[]}else f.delete(S),Ga(S,u,a),Fn(e,S.prev,S.next),Fn(e,S,_===null?e.effect.first:_.next),Fn(e,_,S),_=S;continue}for(h=[],b=[];u!==null&&u!==S;)(f??(f=new Set)).add(u),b.push(u),u=qa(u.next);if(u===null)continue}(S.f&$n)===0&&h.push(S),_=S,u=qa(S.next)}if(e.outrogroups!==null){for(const Z of e.outrogroups)Z.pending.size===0&&(si(e,Tr(Z.done)),(Q=e.outrogroups)==null||Q.delete(Z));e.outrogroups.size===0&&(e.outrogroups=null)}if(u!==null||f!==void 0){var K=[];if(f!==void 0)for(S of f)(S.f&Ft)===0&&K.push(S);for(;u!==null;)(u.f&Ft)===0&&u!==e.fallback&&K.push(u),u=qa(u.next);var ie=K.length;if(ie>0){var ve=(r&is)!==0&&d===0?a:null;if(o){for(B=0;B<ie;B+=1)(Ae=(de=K[B].nodes)==null?void 0:de.a)==null||Ae.measure();for(B=0;B<ie;B+=1)(be=(Y=K[B].nodes)==null?void 0:Y.a)==null||be.fix()}Mo(e,K,ve)}}o&&ca(()=>{var Z,ze;if(T!==void 0)for(S of T)(ze=(Z=S.nodes)==null?void 0:Z.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:vn(()=>(o(t,u??a,f??i,c),()=>{e.delete(r)}))}}function Ga(e,t,a){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,o=t&&(t.f&$n)===0?t.nodes.start:a;r!==null;){var d=sr(r);if(o.before(r),r===i)return;r=d}}function Fn(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function Ye(e,t,a=!1,r=!1,i=!1,o=!1){var d=e,c="";if(a)var u=e;O(()=>{var f=pe;if(c!==(c=t()??"")){if(a){f.nodes=null,u.innerHTML=c,c!==""&&Xa(Vn(u),u.lastChild);return}if(f.nodes!==null&&(Ps(f.nodes.start,f.nodes.end),f.nodes=null),c!==""){var _=r?Cl:i?Ll:void 0,T=$s(r?"svg":i?"math":"template",_);T.innerHTML=c;var h=r||i?T:T.content;if(Xa(Vn(h),h.lastChild),r||i)for(;Vn(h);)d.before(Vn(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 lt(e,t,a,r,i,o){var d=e[Yr];if(d!==a||d===void 0){var c=To(a);c==null?e.removeAttribute("class"):e.className=c,e[Yr]=a}return o}function Bn(e,t,a,r){var i=e[Zr];if(i!==t){var o=$o(t);o==null?e.removeAttribute("style"):e.style.cssText=o,e[Zr]=t}return r}function Hs(e,t,a=!1){if(e.multiple){if(t==null)return;if(!di(t))return Pl();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 ja(e,t,a=t){var r=new WeakSet,i=!0;gi(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"),zo=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!==zo)||(e.value=t??"")}function zr(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"&&Po(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===ss})}var Bi=new Map;function Po(e){var t=e.getAttribute("is")||e.nodeName,a=Bi.get(t);if(a)return a;Bi.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=ts(i)}return a}function Sn(e,t,a=t){var r=new WeakSet;gi(e,"input",async i=>{var o=i?e.defaultValue:e.value;if(o=Fr(e)?Kr(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))}}}),Ba(t)==null&&e.value&&(a(Fr(e)?Kr(e.value):e.value),W!==null&&r.add(W)),Cr(()=>{var i=t();if(e===document.activeElement){var o=W;if(r.has(o))return}Fr(e)&&i===Kr(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}function Do(e,t,a=t){gi(e,"change",r=>{var i=r?e.defaultChecked:e.checked;a(i)}),Ba(t)==null&&a(e.checked),Cr(()=>{var r=t();e.checked=!!r})}function Fr(e){var t=e.type;return t==="number"||t==="range"}function Kr(e){return e===""?null:+e}function Gr(e,t){return e===t||(e==null?void 0:e[xa])===t}function Oo(e={},t,a,r){var i=Dt.r,o=pe;return Ls(()=>{var d,c;return Cr(()=>{d=c,c=[],Ba(()=>{Gr(a(...c),e)||(t(e,...c),d&&Gr(a(...d),e)&&t(null,...d))})}),()=>{let u=o;for(;u!==i&&u.parent!==null&&u.parent.f&Qr;)u=u.parent;const f=()=>{c&&Gr(a(...c),e)&&t(null,...c)},_=u.teardown;u.teardown=()=>{f(),_==null||_()}}}),e}function or(e){Dt===null&&rs(),mi(()=>{const t=Ba(e);if(typeof t=="function")return t})}function Ro(e){Dt===null&&rs(),or(()=>()=>Ba(e))}let er=localStorage.getItem("mc_token")||"";function Ws(){return er}function Bo(e){er=(e||"").trim(),localStorage.setItem("mc_token",er)}function qo(){const e={"Content-Type":"application/json"};return er&&(e["X-MC-Token"]=er),e}function Qa(){return localStorage.getItem("mc_hf_token")||""}function Io(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function fe(e,t={}){const a=await fetch(e,{headers:qo(),...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),qi=(e,t=document)=>[...t.querySelectorAll(e)];function Cn(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let Ii;function X(e,t=!1){const a=No("#toast");a&&(a.textContent=e,a.className="toast show"+(t?" err":""),clearTimeout(Ii),Ii=setTimeout(()=>a.className="toast",3200))}function Fo(e,t){return e==="running"||e==="ready"?'<span class="badge b-run">geladen</span>':e==="loading"||e==="starting"?'<span class="badge b-load">lädt…</span>':e==="downloading"?`<span class="badge b-load">↓ Download${t!=null?` ${Math.round(t)}%`:""}</span>`:'<span class="badge b-run">bereit</span>'}const Te=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:Te('<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:Te('<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:Te('<rect x="6" y="6" width="12" height="12" rx="2"/><path d="M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3"/>'),pulse:Te('<path d="M3 12h4l2 6 4-14 2 8h6"/>'),server:Te('<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:Te('<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:Te('<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:Te('<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:Te('<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:Te('<rect x="3" y="4" width="18" height="12" rx="2"/><path d="M8 20h8M12 16v4"/>'),layers:Te('<path d="m12 2 9 5-9 5-9-5z"/><path d="m3 12 9 5 9-5M3 17l9 5 9-5"/>'),alert:Te('<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:Te('<path d="M12 14 16 9"/><circle cx="12" cy="13" r="9"/><path d="M12 4v2M21 13h-2M5 13H3"/>'),search:Te('<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>'),compass:Te('<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:Te('<polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/>'),eye:Te('<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:Te('<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:Te('<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:Te('<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:Te('<path d="M14 14.76V5a2 2 0 0 0-4 0v9.76a4 4 0 1 0 4 0z"/>'),shield:Te('<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:Te('<circle cx="12" cy="12" r="9"/><path d="M12 16v-4M12 8h.01"/>'),chevron:Te('<path d="m9 6 6 6-6 6"/>'),bolt:Te('<path d="M13 2 3 14h7l-1 8 10-12h-7z"/>'),x:Te('<path d="M18 6 6 18M6 6l12 12"/>'),check:Te('<path d="M20 6 9 17l-5-5"/>'),download:Te('<path d="M12 3v12M7 10l5 5 5-5"/><path d="M5 21h14"/>'),clock:Te('<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>')};function ea(e){return Pr[e]||""}function li(e){return`<span class="info-dot" tabindex="0" title="${Cn(e)}" aria-label="${Cn(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 bn({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>${Cn(e)}</h3>
|
||
<p>${t}</p>
|
||
<div class="modal-actions">
|
||
<button data-x="0">${Cn(r)}</button>
|
||
<button class="${i?"danger":"primary"}" data-x="1">${Cn(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>${Cn(e)}</h3>
|
||
${t?`<p>${t}</p>`:""}
|
||
<input type="${r?"password":"text"}" placeholder="${Cn(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">${Cn(i)}</button>
|
||
</div></div>`;const u=c.querySelector("input"),f=_=>{c.remove(),d(_)};c.addEventListener("click",_=>{if(_.target===c)return f(null);const T=_.target.closest("[data-x]");T&&f(T.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",_=>{_.key==="Enter"&&f(u.value||""),_.key==="Escape"&&f(null)}),document.body.appendChild(c),u.focus()})}function Ko(e="overview"){const t=qi(".nav-item[data-view]:not(.disabled)"),a=qi(".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 Fi=R(null);const dr={get value(){return n(Fi)},set(e){g(Fi,e,!0)}};let Ki=R(Bt([])),Kn=R(Bt([]));const ra={get value(){return n(Ki)},set(e){g(Ki,e||[],!0)},get tracked(){return n(Kn)},track(e){n(Kn).includes(e)||g(Kn,[...n(Kn),e],!0)},toggle(e){g(Kn,n(Kn).includes(e)?n(Kn).filter(t=>t!==e):[...n(Kn),e],!0)}};let Gi=R(null);const xi={get value(){return n(Gi)},set(e){g(Gi,e,!0)}},Go="5";var Xi;typeof window<"u"&&((Xi=window.__svelte??(window.__svelte={})).v??(Xi.v=new Set)).add(Go);var Uo=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),Ho=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),Vo=M('<div class="meter"><div class="meter-h"><span class="mk"> </span><span class="mv"> </span></div> <div><i></i></div></div>'),Wo=M('<div class="empty">Warte auf Messwerte…</div>'),jo=M("<span> </span>"),Jo=M('<div class="li-sub mono-sm"> </div>'),Qo=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>'),Ui=M('<div class="list"></div>'),Yo=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>'),Zo=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>'),Xo=M('<div class="empty">News gerade nicht ladbar.</div>'),ed=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 td(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>xi.value),i=q(()=>{var p;return((p=n(a))==null?void 0:p.models)||[]}),o=q(()=>{var p;return((p=n(a))==null?void 0:p.swap_ok)??!1}),d=q(()=>n(i).find(p=>["running","ready","loading","starting"].includes(p.state))),c=q(()=>n(a)?n(o)?n(r)&&n(r).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),u=q(()=>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=q(()=>()=>{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}),_=p=>p==null?"":p<55?"kühl & gesund":p<72?"normal":"läuft heiß";let T=R(Bt([]));or(async()=>{try{g(T,((await fe("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function h(){await bn({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 A(p){return p!=null&&p.includes("Bild")?"img":p!=null&&p.includes("Code")?"code":"text"}function C(p){return p!=null&&p.includes("Bild")?"Bild":p!=null&&p.includes("Code")?"Code":"Text"}var S=ed(),B=ft(S),ye=s(B),ee=s(ye),ce=s(ee),_e=l(ee,2),I=s(_e),K=l(B,2),ie=s(K),ve=l(s(ie),2),me=s(ve),Me=l(ie,2),Ue=l(s(Me),2),E=s(Ue),Q=l(Ue,2),de=s(Q),Ae=l(Me,2);{var Y=p=>{const D=q(()=>{var wt;return n(r).gpu_temp??((wt=n(r).cpu)==null?void 0:wt.temp)??null}),se=q(()=>n(r).ram.total-n(r).ram.used);var j=Uo(),xe=ft(j),ge=l(s(xe),2),it=s(ge),Je=l(ge,2),dt=s(Je),Ve=l(xe,2),yt=l(s(Ve),2),Tt=s(yt),Rt=l(yt,2),Gt=s(Rt);O((wt,Ut,Ee,Be)=>{m(it,wt),lt(Je,1,`t-s ${n(D)!=null&&n(D)<72?"ok":""}`),m(dt,Ut),m(Tt,Ee),m(Gt,`von ${Be??""} GB`)},[()=>n(D)!=null?`${Math.round(n(D))}°`:"–",()=>_(n(D)),()=>Math.round(n(se)/1073741824),()=>Math.round(n(r).ram.total/1073741824)]),w(p,j)},be=p=>{var D=Ho();w(p,D)};V(Ae,p=>{n(r)?p(Y):p(be,-1)})}var Z=l(K,2),ze=s(Z),Ce=l(s(ze),4);{var He=p=>{const D=q(()=>n(f)());var se=Lr(),j=ft(se);Ge(j,17,()=>{var xe;return[["Prozessor (CPU)",((xe=n(r).cpu)==null?void 0:xe.percent)??0],["Arbeitsspeicher (RAM)",n(r).ram.percent],["Grafikspeicher (VRAM)",n(D)]]},Ke,(xe,ge)=>{var it=q(()=>Ya(n(ge),2));let Je=()=>n(it)[0],dt=()=>n(it)[1];const Ve=q(()=>Math.max(0,Math.min(100,dt()||0)));var yt=Vo(),Tt=s(yt),Rt=s(Tt),Gt=s(Rt),wt=l(Rt),Ut=s(wt),Ee=l(Tt,2),Be=s(Ee);O(($t,sn)=>{m(Gt,Je()),m(Ut,`${$t??""} %`),lt(Ee,1,`bar ${n(Ve)>=90?"bad":n(Ve)>=75?"warn":""}`),Bn(Be,`width:${sn??""}%`)},[()=>Math.round(n(Ve)),()=>Math.max(2,n(Ve))]),w(xe,yt)}),w(p,se)},Ie=p=>{var D=Wo();w(p,D)};V(Ce,p=>{n(r)?p(He):p(Ie,-1)})}var Re=l(ze,2),_t=l(s(Re),4),mt=s(_t);Ye(mt,()=>ea("search"),!0);var Kt=l(mt,4);Ye(Kt,()=>ea("chevron"),!0);var St=l(_t,2),Et=s(St);Ye(Et,()=>ea("refresh"),!0);var P=l(Et,4);Ye(P,()=>ea("chevron"),!0);var N=l(St,2),J=s(N);Ye(J,()=>ea("file"),!0);var re=l(J,4);Ye(re,()=>ea("chevron"),!0);var x=l(Z,2),L=s(x),G=s(L),te=l(s(G),2),$=s(te),H=l(G,2);{var ne=p=>{var D=Ui();Ge(D,21,()=>n(i),Ke,(se,j)=>{const xe=q(()=>n(j).state==="downloading"),ge=q(()=>["running","ready","loading","starting"].includes(n(j).state)),it=q(()=>n(j).state==="loading"||n(j).state==="starting"||n(xe)?"load":n(ge)?"on":""),Je=q(()=>n(xe)?`↓ Download${n(j).download_progress!=null?` ${Math.round(n(j).download_progress)}%`:""}`:n(ge)?n(j).state==="loading"?"lädt…":"geladen":"bereit");var dt=Qo(),Ve=s(dt),yt=l(Ve,2),Tt=s(yt),Rt=s(Tt),Gt=s(Rt),wt=l(Rt,2);{var Ut=ln=>{var xt=jo(),kn=s(xt);O((Pe,At)=>{lt(xt,1,`tag ${Pe??""}`),m(kn,At)},[()=>A(n(j).meta.caps),()=>C(n(j).meta.caps)]),w(ln,xt)};V(wt,ln=>{var xt,kn;(kn=(xt=n(j).meta)==null?void 0:xt.caps)!=null&&kn.length&&ln(Ut)})}var Ee=l(Tt,2);{var Be=ln=>{var xt=Jo(),kn=s(xt);O(()=>m(kn,n(j).meta.filename)),w(ln,xt)};V(Ee,ln=>{var xt;(xt=n(j).meta)!=null&&xt.filename&&ln(Be)})}var $t=l(yt,2),sn=s($t);O(()=>{lt(Ve,1,`li-dot ${n(it)??""}`),m(Gt,n(j).name),m(sn,n(Je))}),w(se,dt)}),w(p,D)},he=p=>{var D=Yo();w(p,D)};V(H,p=>{n(i).length?p(ne):p(he,-1)})}var Ne=l(L,2),Se=s(Ne),je=l(s(Se),2),rt=l(Se,2);{var bt=p=>{var D=Ui();Ge(D,21,()=>n(T),Ke,(se,j)=>{var xe=Zo(),ge=s(xe),it=s(ge),Je=s(it),dt=l(it,2),Ve=s(dt);O(()=>{zr(xe,"href",n(j).link),m(Je,n(j).title),m(Ve,n(j).source)}),w(se,xe)}),w(p,D)},Ze=p=>{var D=Xo();w(p,D)};V(rt,p=>{n(T).length?p(bt):p(Ze,-1)})}O(()=>{m(ce,n(c)),m(I,n(u)),lt(ve,1,`t-v ${n(o)?"ok":"bad"}`),m(me,n(o)?"Online":"Offline"),m(E,n(d)?n(d).name:"Keins"),m(de,n(d)?"im Grafikspeicher":"nichts geladen"),m($,n(i).length?n(i).length+" konfiguriert":"")}),z("click",_t,()=>b("cookbook")),z("click",St,h),z("click",N,()=>b("server")),z("click",je,()=>b("news")),z("keydown",je,p=>p.key==="Enter"&&b("news")),w(e,S),Zn()}_a(["click","keydown"]);var nd=M("<option> </option>"),ad=M('<div class="reply" style="margin-top:12px"> </div>'),rd=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>'),id=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>'),sd=M('<span class="tag" style="background:rgba(45,212,191,.14);color:var(--accent);border-color:rgba(45,212,191,.3)"> </span>'),ld=M('<div class="li-sub mono-sm"> </div>'),od=M('<code style="cursor:pointer" title="Klicken zum Kopieren"> </code>'),dd=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>'),cd=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>'),ud=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>'),vd=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> <div class="tile" style="display:flex;justify-content:space-between;align-items:center;margin:0 0 14px"><div style="flex:1"><div style="font-size:13px;font-weight:500">Immer aktiv halten</div> <div class="hint" style="margin:3px 0 0">Modell bleibt dauerhaft im RAM — nie automatisch entladen. Ideal für den kleinen Scout (~5 GB), der immer schnell antworten soll.</div></div> <label style="display:flex;align-items:center;gap:8px;margin:0;cursor:pointer;flex:0 0 auto"><input type="checkbox" style="width:18px;height:18px;accent-color:var(--accent);cursor:pointer"/> <span class="mono-sm"> </span></label></div> <button class="primary" style="width:100%;margin-top:6px">Speichern</button></div></div>'),fd=M('<button style="border-radius:999px"> </button>'),pd=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>'),hd=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 gd(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=q(()=>{var x;return((x=dr.value)==null?void 0:x.models)||[]});function d(){document.dispatchEvent(new Event("mc:refresh"))}let c=R(""),u=R(""),f=R(""),_=R(!1);const T=q(()=>n(o).filter(x=>!x.incomplete));async function h(){var L;const x=n(c)||((L=n(T)[0])==null?void 0:L.name);if(!(!x||!n(u).trim())){g(_,!0),g(f,"(wecke Modell, kann beim Laden kurz dauern…)");try{const G=await fe("/api/chat",{method:"POST",body:JSON.stringify({model:x,message:n(u)})});g(f,G.reply,!0)}catch(G){g(f,"Fehler: "+G.message)}g(_,!1),d()}}const b=300;let A=R(!1),C=R(null),S=R(8192),B=R(!1);function ye(x){var L;g(C,n(o).find(G=>G.name===x),!0),n(C)&&(g(S,((L=n(C).meta)==null?void 0:L.ctx)||8192,!0),g(B,(n(C).ttl??b)>=99999),g(A,!0))}async function ee(){const x=n(B)?99999:b;try{await fe("/api/update_model",{method:"POST",body:JSON.stringify({alias:n(C).name,ctx:n(S),ttl:x})}),X("Gespeichert — aktiv beim nächsten Modell-Start."),g(A,!1),d()}catch(L){X(L.message,!0)}}let ce=R(!1),_e=R(""),I=R(""),K=R("");function ie(x){const L=n(o).find(G=>G.name===x);g(_e,x,!0),g(K,(L==null?void 0:L.role)||"",!0),g(I,""),g(ce,!0)}async function ve(x){try{await fe("/api/set_role",{method:"POST",body:JSON.stringify({alias:n(_e),role:x})}),X(x?`Rolle gesetzt: ${x}`:"Rolle entfernt."),g(ce,!1),d()}catch(L){X(L.message,!0)}}async function me(x){if(await bn({title:`„${x}" 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(x),{method:"POST"}),X("Entladen: "+x),setTimeout(d,600)}catch(L){X(L.message,!0)}}async function Me(x){if(await bn({title:`„${x}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. <b>Das lässt sich nicht rückgängig machen</b> — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const L=await fe("/api/delete_model",{method:"POST",body:JSON.stringify({alias:x})});X(L.note||"Gelöscht: "+x),setTimeout(d,600)}catch(L){X(L.message,!0)}}function Ue(x){return x!=null&&x.length?x.map(L=>L==="Code"?'<span class="tag code">Code</span>':L==="Bild"?'<span class="tag img">Bild</span>':'<span class="tag text">Text</span>').join(" "):"–"}function E(x){if(!x)return"–";const L=x.quant||"?",G=x.ctx?Math.round(x.ctx/1024)+"K":"?",te=x.size_bytes?(x.size_bytes/1024**3).toFixed(1)+" GB":"?";return`<span class="mono-sm">${L} · ${G} · ${te}</span>`}function Q(x){var L;(L=navigator.clipboard)==null||L.writeText(x),X("Kopiert: "+x)}var de=hd(),Ae=l(ft(de),2),Y=l(s(Ae),6);Ge(Y,21,()=>n(T),Ke,(x,L)=>{var G=nd(),te=s(G),$={};O(()=>{m(te,n(L).name),$!==($=n(L).name)&&(G.value=(G.__value=n(L).name)??"")}),w(x,G)});var be=l(Y,4),Z=l(be,2),ze=s(Z),Ce=l(Z,2);{var He=x=>{var L=ad(),G=s(L);O(()=>m(G,n(f))),w(x,L)};V(Ce,x=>{n(f)&&x(He)})}var Ie=l(Ae,2),Re=s(Ie),_t=l(s(Re)),mt=s(_t),Kt=l(Re,4);{var St=x=>{var L=rd();w(x,L)},Et=x=>{var L=cd(),G=l(s(L));Ge(G,21,()=>n(o),Ke,(te,$)=>{var H=Lr(),ne=ft(H);{var he=Se=>{var je=id(),rt=s(je),bt=s(rt),Ze=l(rt,5),p=s(Ze),D=l(p,2);O(()=>m(bt,n($).name)),z("click",p,()=>{var se;X("Lade im Cookbook ein Modell und setze den Alias auf: "+n($).name),(se=document.querySelector(".nav-item[data-view='cookbook']"))==null||se.dispatchEvent(new MouseEvent("click"))}),z("click",D,()=>Me(n($).name)),w(Se,je)},Ne=Se=>{var je=dd(),rt=s(je),bt=s(rt),Ze=s(bt),p=l(Ze);{var D=Ee=>{var Be=sd(),$t=s(Be);O(()=>m($t,n($).role)),w(Ee,Be)};V(p,Ee=>{n($).role&&Ee(D)})}var se=l(bt,2);{var j=Ee=>{var Be=ld(),$t=s(Be);O(()=>m($t,n($).meta.filename)),w(Ee,Be)};V(se,Ee=>{var Be;(Be=n($).meta)!=null&&Be.filename&&Ee(j)})}var xe=l(se,2),ge=l(s(xe),2);Ge(ge,17,()=>{var Ee;return(Ee=n($).api_ids)!=null&&Ee.length?n($).api_ids:[n($).name]},Ke,(Ee,Be)=>{var $t=od(),sn=s($t);O(()=>m(sn,n(Be))),z("click",$t,()=>Q(n(Be))),w(Ee,$t)});var it=l(rt);Ye(it,()=>{var Ee;return Ue((Ee=n($).meta)==null?void 0:Ee.caps)},!0);var Je=l(it);Ye(Je,()=>E(n($).meta),!0);var dt=l(Je);Ye(dt,()=>Fo(n($).state,n($).download_progress),!0);var Ve=l(dt),yt=s(Ve),Tt=l(Ve),Rt=s(Tt),Gt=l(Rt,2),wt=l(Gt,2),Ut=l(wt,2);O(()=>{m(Ze,`${n($).name??""} `),m(yt,n($).port??"auto")}),z("click",Rt,()=>ie(n($).name)),z("click",Gt,()=>ye(n($).name)),z("click",wt,()=>me(n($).name)),z("click",Ut,()=>Me(n($).name)),w(Se,je)};V(ne,Se=>{n($).incomplete?Se(he):Se(Ne,-1)})}w(te,H)}),w(x,L)};V(Kt,x=>{n(o).length?x(Et,-1):x(St)})}var P=l(Ie,2);{var N=x=>{var L=vd(),G=s(L),te=s(G),$=l(te,4),H=s($),ne=l($,2),he=l(s(ne));Ye(he,()=>li(a));var Ne=l(ne,2),Se=l(Ne,2);{var je=j=>{var xe=ud(),ge=s(xe),it=l(s(ge),2),Je=s(it),dt=l(Je,2),Ve=l(ge,2);O((yt,Tt)=>{m(Je,`Optimal ~${yt??""}k → ~${n(C).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),m(dt,` Aktuell ~${Tt??""}k → ~${n(C).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(n(C).meta.optimal_ctx/1024),()=>Math.round((n(C).meta.ctx||0)/1024)]),z("click",Ve,()=>g(S,n(C).meta.optimal_ctx,!0)),w(j,xe)};V(Se,j=>{var xe;(xe=n(C).meta)!=null&&xe.optimal_ctx&&j(je)})}var rt=l(Se,4),bt=l(s(rt),2),Ze=s(bt),p=l(Ze,2),D=s(p),se=l(rt,2);O(()=>{m(H,n(C).name),Bn(p,`color:${n(B)?"var(--accent)":"var(--mut)"}`),m(D,n(B)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),z("click",L,j=>{j.target.classList.contains("modal-overlay")&&g(A,!1)}),z("click",te,()=>g(A,!1)),Sn(Ne,()=>n(S),j=>g(S,j)),Do(Ze,()=>n(B),j=>g(B,j)),z("click",se,ee),w(x,L)};V(P,x=>{n(A)&&n(C)&&x(N)})}var J=l(P,2);{var re=x=>{var L=pd(),G=s(L),te=s(G),$=l(te,2),H=l(s($));Ye(H,()=>li(r));var ne=l($,2),he=s(ne),Ne=l(ne,4);Ge(Ne,21,()=>i,Ke,(Ze,p)=>{var D=fd(),se=s(D);O(()=>{lt(D,1,n(K)===n(p).id?"primary":"ghost"),zr(D,"title",n(p).desc),m(se,n(p).label)}),z("click",D,()=>ve(n(p).id)),w(Ze,D)});var Se=l(Ne,4),je=l(Se,2),rt=s(je),bt=l(rt,2);O(()=>m(he,n(_e))),z("click",L,Ze=>{Ze.target.classList.contains("modal-overlay")&&g(ce,!1)}),z("click",te,()=>g(ce,!1)),Sn(Se,()=>n(I),Ze=>g(I,Ze)),z("click",rt,()=>ve("")),z("click",bt,()=>ve(n(I).trim().toLowerCase())),w(x,L)};V(J,x=>{n(ce)&&x(re)})}O(()=>{Z.disabled=n(_),m(ze,n(_)?"…":"Senden"),m(mt,n(o).length?n(o).length+" konfiguriert":"")}),ja(Y,()=>n(c),x=>g(c,x)),Sn(be,()=>n(u),x=>g(u,x)),z("click",Z,h),w(e,de),Zn()}_a(["click"]);var _d=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),md=M('<button class="ghost" style="margin-left:auto;padding:4px 11px;font-size:12px">Verlauf leeren</button>'),bd=M('<div class="empty-c"><div class="e-t">Gerade nichts los.</div> <div class="e-s">Alles ruhig — keine laufenden Aufgaben.</div></div>'),yd=M('<span class="mono-sm" style="margin-left:auto"> </span>'),wd=M('<button class="ghost">Abbrechen</button>'),xd=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>'),kd=M('<div class="bar" style="margin-top:8px"><i></i></div>'),Md=M('<div class="log"> </div>'),Sd=M('<div class="job"><div class="job-h" role="button" tabindex="0"><span></span> <span class="mid"> </span> <!> <!> <!></div> <!> <!></div>'),Ed=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 Td(e,t){Yn(t,!0);const a=q(()=>ra.value),r=q(()=>ra.tracked),i=q(()=>xi.value);let o=Bt({cpu:[],ram:[],gpu:[]});mi(()=>{var de;if(!n(i))return;const E=n(i).gpu,Q=E&&E.vram.total+E.gtt.total>0?(E.vram.used+E.gtt.used)/(E.vram.total+E.gtt.total)*100:0;o.cpu=[...o.cpu,((de=n(i).cpu)==null?void 0:de.percent)??0].slice(-60),o.ram=[...o.ram,n(i).ram.percent].slice(-60),o.gpu=[...o.gpu,Q].slice(-60)});const d=q(()=>()=>{var Q;const E=(Q=n(i))==null?void 0:Q.gpu;return E&&E.vram.total+E.gtt.total>0?(E.vram.used+E.gtt.used)/(E.vram.total+E.gtt.total)*100:0}),c=q(()=>n(a).filter(E=>E.state!=="running"&&E.state!=="queued").length),u=q(()=>n(a).filter(E=>E.state==="failed").length);function f(E){if(E.state!=="running")return null;if(typeof E.progress=="number")return Math.min(100,E.progress);const de=((E.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return de?Math.min(100,parseFloat(de[1])):null}function _(E){return E==null||E<0?"":E>=90?`noch ~${Math.round(E/60)} min`:`noch ~${Math.max(1,Math.round(E))} s`}function T(E){return E==="done"?'<span class="badge b-run">fertig</span>':E==="failed"?'<span class="badge b-err">fehler</span>':E==="canceled"?'<span class="badge">abgebrochen</span>':'<span class="badge b-load">läuft…</span>'}function h(E){return E==="done"?"on":E==="failed"||E==="canceled"?"":"load"}async function b(E){try{await fe(`/api/jobs/${E}/cancel`,{method:"POST"}),X("Abbruch angefordert…")}catch(Q){X(Q.message,!0)}}async function A(E){try{await fe(`/api/jobs/${E}`,{method:"DELETE"})}catch(Q){X(Q.message,!0)}}async function C(){try{const E=await fe("/api/jobs/clear",{method:"POST"});X(`${E.removed} Einträge entfernt.`)}catch(E){X(E.message,!0)}}function S(E,Q){return E.map(de=>`<div style="width:4px;background:var(${Q});opacity:.55;height:${Math.max(2,de)}%;border-radius:2px"></div>`).join("")}var B=Ed(),ye=l(ft(B),2);{var ee=E=>{const Q=q(()=>n(d)());var de=_d(),Ae=ft(de),Y=s(Ae),be=l(s(Y),2),Z=s(be),ze=l(be,2),Ce=s(ze),He=l(Y,2),Ie=l(s(He),2),Re=s(Ie),_t=l(Ie,2),mt=s(_t),Kt=l(He,2),St=l(s(Kt),2),Et=s(St),P=l(St,2),N=s(P),J=l(Ae,2),re=l(s(J),4),x=s(re),L=l(s(x)),G=s(L),te=l(x,2),$=l(s(te),2),H=s($),ne=l(te,2),he=l(s(ne)),Ne=s(he),Se=l(ne,2),je=l(s(Se),2),rt=s(je),bt=l(re,2),Ze=s(bt),p=l(s(Ze));Ye(p,()=>S(o.cpu,"--accent"),!0);var D=l(Ze,2),se=l(s(D));Ye(se,()=>S(o.ram,"--purple"),!0);var j=l(D,2),xe=l(s(j));Ye(xe,()=>S(o.gpu,"--on"),!0),O((ge,it,Je,dt,Ve,yt,Tt,Rt,Gt,wt,Ut,Ee,Be)=>{m(Z,ge),m(Ce,it),m(Re,Je),m(mt,`${dt??""} / ${Ve??""}`),m(Et,yt),m(N,Tt),m(G,`${Rt??""} / ${Gt??""}`),m(H,wt),m(Ne,`${Ut??""} % belegt`),m(rt,`${Ee??""} / ${Be??""}`)},[()=>{var ge;return Math.round(((ge=n(i).cpu)==null?void 0:ge.percent)??0)},()=>{var ge;return((ge=n(i).cpu)==null?void 0:ge.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(Q)),()=>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 ge;return Math.round(((ge=n(i).disk)==null?void 0:ge.percent)??0)},()=>n(i).gpu_temp!=null?Math.round(n(i).gpu_temp)+"°":"–",()=>{var ge;return((ge=n(i).cpu)==null?void 0:ge.temp)!=null?Math.round(n(i).cpu.temp)+"°":"–"}]),w(E,de)};V(ye,E=>{n(i)&&E(ee)})}var ce=l(ye,2),_e=s(ce),I=l(s(_e),2),K=s(I),ie=l(I,2);{var ve=E=>{var Q=md();z("click",Q,C),w(E,Q)};V(ie,E=>{n(c)&&E(ve)})}var me=l(_e,4);{var Me=E=>{var Q=bd();w(E,Q)},Ue=E=>{var Q=Lr(),de=ft(Q);Ge(de,17,()=>n(a),Ke,(Ae,Y)=>{const be=q(()=>f(n(Y))),Z=q(()=>n(Y).state==="running"?_(n(Y).eta_s):""),ze=q(()=>n(Y).state==="running"&&n(Y).rate_bps?Xn(n(Y).rate_bps)+"/s":""),Ce=q(()=>[n(Z),n(ze)].filter(Boolean).join(" · ")),He=q(()=>n(r).includes(n(Y).id));var Ie=Sd(),Re=s(Ie),_t=s(Re),mt=l(_t,2),Kt=s(mt),St=l(mt,2);{var Et=$=>{var H=yd(),ne=s(H);O(he=>m(ne,`${he??""} %${n(Ce)?` · ${n(Ce)}`:""}`),[()=>Math.round(n(be))]),w($,H)};V(St,$=>{n(be)!=null&&$(Et)})}var P=l(St,2);{var N=$=>{var H=wd();O(()=>Bn(H,`${n(be)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),z("click",H,ne=>{ne.stopPropagation(),b(n(Y).id)}),w($,H)},J=$=>{var H=xd();z("click",H,ne=>{ne.stopPropagation(),A(n(Y).id)}),w($,H)};V(P,$=>{n(Y).state==="running"?$(N):$(J,-1)})}var re=l(P,2);Ye(re,()=>T(n(Y).state));var x=l(Re,2);{var L=$=>{var H=kd(),ne=s(H);O(()=>Bn(ne,`width:${n(be)??""}%`)),w($,H)};V(x,$=>{n(be)!=null&&n(Y).state==="running"&&$(L)})}var G=l(x,2);{var te=$=>{var H=Md(),ne=s(H);O(he=>m(ne,he),[()=>(n(Y).log||[]).join(`
|
||
`)]),w($,H)};V(G,$=>{n(He)&&$(te)})}O($=>{lt(_t,1,`li-dot ${$??""}`),m(Kt,n(Y).label)},[()=>h(n(Y).state)]),z("click",Re,()=>ra.toggle(n(Y).id)),z("keydown",Re,$=>$.key==="Enter"&&ra.toggle(n(Y).id)),w(Ae,Ie)}),w(E,Q)};V(me,E=>{n(a).length?E(Ue,-1):E(Me)})}O(()=>m(K,n(a).length?n(u)?n(u)+" Fehler":n(a).length+" gesamt":"")),w(e,B),Zn()}_a(["click","keydown"]);var $d=M('<span class="mono-sm"> </span>'),Ad=M('<button class="ghost" style="margin-left:auto;padding:3px 12px">Abbrechen</button>'),Cd=M('<span class="badge b-run">✓ fertig</span>'),Ld=M('<span class="badge b-err">✗ fehlgeschlagen</span>'),zd=M('<span class="badge">abgebrochen</span>'),Pd=M('<span class="badge b-load">läuft…</span>'),Dd=M('<div class="bar" style="margin-bottom:10px"><i></i></div>'),Od=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>'),Rd=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 Bd(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>ra.value);let i=null,o=R(`Verbinde…
|
||
`),d=R("llama-swap"),c,u=R(null),f=R("");const _=new Set,T=q(()=>n(u)?n(r).find(p=>p.id===n(u)):null);mi(()=>{if(!n(T))return;const p=n(T),D=p.state==="done",se=p.state==="failed",j=p.state==="canceled";(D||se||j)&&!_.has(p.id)&&(_.add(p.id),X(D?`✓ ${n(f)} abgeschlossen.`:j?`${n(f)} abgebrochen.`:`✗ ${n(f)} fehlgeschlagen.`,se),D&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function h(p,D){g(u,p,!0),g(f,D,!0),ra.track(p)}or(()=>{b()}),Ro(()=>{i==null||i.close()});function b(){i==null||i.close();const p=n(d);g(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=se=>{g(o,n(o)+se.data),c&&(c.scrollTop=c.scrollHeight)},i.onclose=()=>{g(o,n(o)+`
|
||
— Verbindung getrennt —`)},i.onerror=()=>i==null?void 0:i.close()}async function A(p,D,se){if(await bn({title:D,body:se,confirmLabel:"Neustarten"}))try{await fe(`/api/service/${p}/restart`,{method:"POST"}),X("Neustart ausgelöst: "+p),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(j){X(j.message,!0)}}async function C(){if(await bn({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"});X("Update läuft — Dashboard startet gleich neu."),h(p.job_id,"Mission Control Update")}catch(p){X(p.message,!0)}}async function S(){if(await bn({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"});X("LLM-Engine-Update läuft."),h(p.job_id,"LLM-Engine-Update")}catch(p){X(p.message,!0)}}async function B(){if(await bn({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"}),X("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(p){X(p.message,!0)}}async function ye(){if(!await bn({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})});X("OS-Update gestartet."),h(D.job_id,"OS-Update")}catch(D){X(D.message,!0)}}async function ee(){if(!await bn({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})}),X("Reboot ausgelöst — bis gleich.")}catch(D){X(D.message,!0)}}async function ce(){g(_e,"prüfe…");try{const p=await fe("/api/integration/test");g(_e,p.ok?`✓ Engine antwortet — ${p.models.length} Modell(e): ${p.models.join(", ")}`:`✗ keine Verbindung: ${p.error}`,!0),g(I,p.ok,!0)}catch(p){g(_e,"✗ "+p.message),g(I,!1)}}let _e=R(""),I=R(!1);const K=q(()=>{var p;return((p=n(a))==null?void 0:p.models)||[]}),ie=q(()=>n(K).find(p=>p.state==="running"||p.state==="loading"));function ve(p){if(!p||p.state!=="running")return null;if(typeof p.progress=="number")return Math.min(100,p.progress);const se=((p.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return se?Math.min(100,parseFloat(se[1])):null}var me=Rd(),Me=l(ft(me),2),Ue=s(Me),E=l(s(Ue),2),Q=s(E),de=l(Ue,4),Ae=s(de),Y=l(s(Ae)),be=s(Y),Z=l(Ae,2),ze=l(s(Z),2),Ce=s(ze),He=l(Z,2),Ie=l(s(He),2),Re=s(Ie),_t=l(de,2),mt=s(_t),Kt=l(mt,2);{var St=p=>{var D=$d(),se=s(D);O(()=>{Bn(D,`color:${n(I)?"#7ee29a":"#ff9b95"}`),m(se,n(_e))}),w(p,D)};V(Kt,p=>{n(_e)&&p(St)})}var Et=l(Me,2),P=l(s(Et),4),N=l(P,2),J=l(N,2),re=l(J,2),x=l(re,2),L=l(Et,2),G=l(s(L),4),te=l(G,2),$=l(L,2);{var H=p=>{const D=q(()=>n(T)),se=q(()=>n(D).state==="done"),j=q(()=>n(D).state==="failed"),xe=q(()=>n(D).state==="canceled"),ge=q(()=>n(se)||n(j)||n(xe)),it=q(()=>ve(n(D)));var Je=Od(),dt=s(Je),Ve=l(s(dt),2);{var yt=Pe=>{var At=Ad();z("click",At,async()=>{await bn({title:n(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&fe(`/api/jobs/${n(D).id}/cancel`,{method:"POST"})}),w(Pe,At)};V(Ve,Pe=>{n(ge)||Pe(yt)})}var Tt=l(Ve,2),Rt=s(Tt);{var Gt=Pe=>{var At=Cd();w(Pe,At)},wt=Pe=>{var At=Ld();w(Pe,At)},Ut=Pe=>{var At=zd();w(Pe,At)},Ee=Pe=>{var At=Pd();w(Pe,At)};V(Rt,Pe=>{n(se)?Pe(Gt):n(j)?Pe(wt,1):n(xe)?Pe(Ut,2):Pe(Ee,-1)})}var Be=l(dt,2),$t=s(Be),sn=l(Be,2);{var ln=Pe=>{var At=Dd(),Or=s(At);O(()=>Bn(Or,`width:${n(it)??""}%`)),w(Pe,At)};V(sn,Pe=>{n(it)!=null&&!n(ge)&&Pe(ln)})}var xt=l(sn,2),kn=s(xt);O(Pe=>{m($t,`${n(f)??""}${n(ge)?n(se)?" — erfolgreich.":n(xe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),m(kn,Pe)},[()=>(n(D).log||[]).join(`
|
||
`)]),w(p,Je)};V($,p=>{n(T)&&p(H)})}var ne=l($,2),he=s(ne),Ne=l(s(he),2),Se=s(Ne);Se.value=Se.__value="llama-swap";var je=l(Se);je.value=je.__value="mission-control";var rt=l(je);rt.value=rt.__value="system";var bt=l(he,4),Ze=s(bt);Oo(bt,p=>c=p,()=>c),O(p=>{var D,se,j;Bn(E,`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(Q,(se=n(a))!=null&&se.swap_ok?"● erreichbar":"● offline"),m(be,(((j=n(a))==null?void 0:j.swap_url)||"—")+"/v1"),m(Ce,n(ie)?n(ie).name+` (${n(ie).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),m(Re,p),m(Ze,n(o))},[()=>n(K).filter(p=>!p.incomplete).length||"keine"]),z("click",mt,ce),z("click",P,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),z("click",N,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),z("click",J,C),z("click",re,S),z("click",x,B),z("click",G,ye),z("click",te,ee),z("change",Ne,b),ja(Ne,()=>n(d),p=>g(d,p)),w(e,me),Zn()}_a(["click","change"]);var qd=M('<div class="empty" style="text-align:center;padding:30px">Lade Setups…</div>'),Id=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),Ur=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>'),Fd=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>'),Kd=M('<div id="cb-recipes" class="grid grid-3" style="gap:10px;margin-top:6px"></div>'),Gd=M('<div class="empty" style="text-align:center;padding:30px">Frage Quellen ab…</div>'),Ud=M('<div class="li-sub" style="color:var(--warn);margin-top:3px"> </div>'),Hd=M('<span class="fit-badge ok">✓ installiert</span>'),Vd=M('<button class="primary" style="padding:6px 12px;font-size:12.5px">Installieren</button>'),Wd=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>'),jd=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>'),Qd=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>'),Yd=M('<div class="grid grid-3" id="cb-grid"></div>'),Zd=M('<div class="li-sub"> </div>'),Xd=M('<div class="li-sub mono-sm"> </div>'),ec=M("<span> </span>"),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"> </span> <span class="tag text"> </span> <!></div> <!> <!></div> <!></div>'),nc=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>'),ac=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>'),rc=M('<div class="hint">Lade Dateien von HuggingFace…</div>'),Hi=M("<option> </option>"),ic=M('<div class="hint" style="margin:-6px 0 14px">Empfohlener Kontext für deine Hardware: <b> </b> — <a href="#">übernehmen</a></div>'),sc=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>'),lc=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),oc=M('<div class="hint">Keine GGUF-Dateien im Repo gefunden.</div>'),dc=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>'),cc=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>'),uc=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>'),vc=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 fc(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 U of d)if(U.kw.some(F=>k.includes(F)))return U.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 _(y){return y==="perfect"?"ok":y==="marginal"?"warn":"bad"}function T(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([])),A=R(null),C=R(!0),S=R(null),B=R(!1),ye=R(!1),ee=R(""),ce=R(Bt([])),_e=R(!1),I=R(""),K=R("downloads"),ie=R(Bt([])),ve=R(-1),me=R(null),Me=R(!1),Ue=R(""),E=R(""),Q=R(null),de=R(""),Ae=R(""),Y=R(8192),be=R(!1),Z=R(null),ze=R(!1),Ce=R(""),He=R(""),Ie=R(Bt([{repo:"",role:"",quant:"Q4_K_M"}])),Re=R(null);function _t(y){var k;(k=document.querySelector(`.nav-item[data-view="${y}"]`))==null||k.dispatchEvent(new MouseEvent("click"))}or(()=>{mt(),Kt()});async function mt(){g(C,!0);try{const y=await fe("/api/cookbook/recipes");g(b,y.recipes||[],!0),g(A,y.recommended_id||null,!0)}catch(y){X(y.message,!0)}g(C,!1)}async function Kt(y=!1){g(B,!0);try{const k=await fe("/api/cookbook/discover"+(y?"?force=true":""));g(S,k,!0),g(ye,k.stale,!0)}catch(k){X("Empfehlungen nicht ladbar: "+k.message,!0)}g(B,!1)}function St(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 Et(){const y=n(ee).trim(),k=St(y);let U=y;if(n(I)&&!k&&(U=U?U+" "+n(I):n(I)),!U&&!k){g(ce,[],!0);return}g(_e,!0),g(ie,[],!0),g(ve,-1);try{if(k)g(ce,[{id:k,author:k.split("/")[0],downloads:0}],!0);else{const F=`https://huggingface.co/api/models?search=${encodeURIComponent(U)}&filter=gguf&sort=${encodeURIComponent(n(K))}&direction=-1&limit=40`,le=await fetch(F);g(ce,await le.json(),!0)}n(ce).forEach((F,le)=>P(le,F.id))}catch(F){X(F.message,!0),g(ce,[],!0)}g(_e,!1)}async function P(y,k){var U;try{const F=await fe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})});if(!((U=F.files)!=null&&U.length)){n(ie)[y]=null,N();return}const le=F.files.find(Qe=>{var Xe;return(Xe=Qe.quant)==null?void 0:Xe.includes("Q4_K_M")})||F.files[0];n(ie)[y]=le.fit.level,N()}catch{n(ie)[y]=null,N()}}function N(){let y=-1,k=99;n(ie).forEach((U,F)=>{if(U==null)return;const le=i[U]??99;le<k&&(k=le,y=F)}),g(ve,y>=0&&k<=1?y:-1,!0)}function J(y){g(me,n(b).find(k=>k.id===y),!0)}async function re(y){const k=document.getElementById("cb-r-install-btn");k&&(k.disabled=!0,k.textContent="Starte…");try{const U=await fe("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:y,hf_token:Qa()})});X(`${U.count} Downloads gestartet — siehe Aktivität.`),g(me,null),_t("activity")}catch(U){X(U.message,!0),k&&(k.disabled=!1,k.textContent="Installieren")}}async function x(y,k){var U,F;g(Me,!0),g(Ue,k,!0),g(E,y,!0),g(Ae,""),g(Y,8192),g(Q,null),g(Z,null),g(de,""),g(be,!0);try{if(g(Q,await fe("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:y,ctx:8192})}),!0),(F=(U=n(Q))==null?void 0:U.files)!=null&&F.length){const le=n(Q).files.find(Qe=>{var Xe;return(Xe=Qe.quant)==null?void 0:Xe.includes("Q4_K_M")})||n(Q).files[0];g(de,le.filename,!0),le.optimal_ctx&&n(Y)===8192&&g(Y,le.optimal_ctx,!0),L()}}catch(le){X(le.message,!0)}g(be,!1)}function L(){var y,k,U;!((k=(y=n(Q))==null?void 0:y.files)!=null&&k.length)||!n(de)||(g(Z,n(Q).files.find(F=>F.filename===n(de))||null,!0),(U=n(Z))!=null&&U.optimal_ctx&&n(Y)===8192&&g(Y,n(Z).optimal_ctx,!0))}async function G(){if(!n(E)||!n(de))return X("Bitte eine GGUF-Datei wählen.",!0);g(be,!0);try{const y=await fe("/api/download",{method:"POST",body:JSON.stringify({repo:n(E),file:n(de),hf_token:Qa()})});await fe("/api/register",{method:"POST",body:JSON.stringify({role:n(Ae),model_path:y.expected_path,ctx:n(Y)})}),X("Download gestartet — siehe Aktivität."),g(Me,!1),_t("activity")}catch(y){X("Fehler: "+y.message,!0)}g(be,!1)}async function te(y,k,U,F){F.disabled=!0,F.textContent="Starte…";try{await fe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:y,role:k,params_b:U,quant:"Q4_K_M",hf_token:Qa()})}),X("Download gestartet — siehe Aktivität."),_t("activity")}catch(le){X(le.message,!0),F.disabled=!1,F.textContent="Installieren"}}function $(){g(Re,null),g(Ce,""),g(He,""),g(Ie,[{repo:"",role:"",quant:"Q4_K_M"}],!0),g(ze,!0)}function H(y){const k=n(b).find(U=>U.id===y);k&&(g(Re,y,!0),g(Ce,k.title,!0),g(He,k.desc||"",!0),g(Ie,k.models.map(U=>({repo:U.repo,role:U.role,quant:U.quant||"Q4_K_M"})),!0),g(ze,!0))}async function ne(){if(!n(Ce).trim())return X("Bitte einen Titel angeben.",!0);const y=n(Ie).filter(k=>k.repo.trim());if(!y.length)return X("Mindestens ein Modell (Repo) angeben.",!0);try{n(Re)?(await fe("/api/cookbook/user-recipe/"+encodeURIComponent(n(Re)),{method:"PUT",body:JSON.stringify({title:n(Ce),desc:n(He),models:y})}),X("Setup aktualisiert.")):(await fe("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:n(Ce),desc:n(He),models:y})}),X("Setup gespeichert.")),g(ze,!1),mt()}catch(k){X(k.message,!0)}}async function he(y){const k=n(b).find(U=>U.id===y);if(await bn({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"}),X("Setup gelöscht."),mt()}catch(U){X(U.message,!0)}}function Ne(y){if(!u(y))return"";const k=f(y);return`<span class="chip" title="${Cn(r)}">MoE${k?` · ~${k}B aktiv`:""}</span>`}function Se(y){return y?`<span class="chip">${Cn(y)}</span>`:""}var je=vc(),rt=l(ft(je),2),bt=s(rt),Ze=l(s(bt),2),p=l(bt,4);{var D=y=>{var k=qd();w(y,k)},se=y=>{var k=Kd();Ge(k,21,()=>n(b),Ke,(U,F)=>{const le=q(()=>n(F).id===n(A));var Qe=Fd(),Xe=s(Qe);{var Zt=Oe=>{var tt=Id(),Xt=ft(tt),ct=l(Xt,2);z("click",Xt,ut=>{ut.stopPropagation(),H(n(F).id)}),z("keydown",Xt,ut=>{ut.key==="Enter"&&(ut.stopPropagation(),H(n(F).id))}),z("click",ct,ut=>{ut.stopPropagation(),he(n(F).id)}),z("keydown",ct,ut=>{ut.key==="Enter"&&(ut.stopPropagation(),he(n(F).id))}),w(Oe,tt)};V(Xe,Oe=>{n(F).user&&Oe(Zt)})}var Ht=l(Xe,2);{var Vt=Oe=>{var tt=Ur();w(Oe,tt)},Wt=Oe=>{var tt=Nd();w(Oe,tt)};V(Ht,Oe=>{n(le)?Oe(Vt):n(F).user&&Oe(Wt,1)})}var Le=l(Ht,2),ke=s(Le),qe=s(ke),Fe=s(qe),De=l(ke,2),pt=s(De),kt=l(Le,2),Ct=s(kt),Lt=l(kt,2),et=s(Lt);O((Oe,tt)=>{lt(Qe,1,`card-btn${n(le)?" cb-best":""}`),m(Fe,n(F).title),lt(De,1,`fit-badge ${Oe??""}`),m(pt,tt),m(Ct,n(F).desc),m(et,`${n(F).models.length??""} Modell${n(F).models.length>1?"e":""} im Setup`)},[()=>_(n(F).fit_level),()=>T(n(F).fit_level)]),z("click",Qe,()=>J(n(F).id)),w(U,Qe)}),w(y,k)};V(p,y=>{n(C)?y(D):y(se,-1)})}var j=l(rt,2),xe=s(j),ge=l(s(xe),2),it=s(ge),Je=l(ge,2),dt=s(Je),Ve=l(xe,2),yt=s(Ve),Tt=l(Ve,2);{var Rt=y=>{var k=Gd();w(y,k)},Gt=y=>{var k=Lr(),U=ft(k);Ge(U,17,()=>n(S).categories,Ke,(F,le)=>{var Qe=jd(),Xe=s(Qe),Zt=s(Xe),Ht=s(Zt),Vt=l(Xe,2);Ge(Vt,21,()=>n(le).models,Ke,(Wt,Le)=>{const ke=q(()=>n(le).recommended&&n(Le).repo===n(le).recommended);var qe=Wd(),Fe=s(qe);{var De=Mt=>{var It=Ur();w(Mt,It)};V(Fe,Mt=>{n(ke)&&Mt(De)})}var pt=l(Fe,2),kt=s(pt),Ct=s(kt),Lt=s(Ct),et=l(Ct,2),Oe=s(et),tt=l(kt,2),Xt=s(tt),ct=l(pt,2),ut=s(ct);Ye(ut,()=>Se(o[n(Le).role]||c(n(Le).repo)));var Mn=l(ut,2);Ye(Mn,()=>Ne(n(Le).repo));var In=l(ct,2),We=s(In),nt=l(In,2);Ge(nt,17,()=>n(Le).requirements||[],Ke,(Mt,It)=>{var Nn=Ud(),Rr=s(Nn);O(()=>m(Rr,`⚠ ${n(It)??""}`)),w(Mt,Nn)});var st=l(nt,4),vt=s(st);{var en=Mt=>{var It=Hd();O(()=>zr(It,"title",`bereits eingerichtet als ${n(Le).installed??""}`)),w(Mt,It)},qt=Mt=>{var It=Vd();z("click",It,Nn=>te(n(Le).repo,n(Le).role,n(Le).params_b,Nn.currentTarget)),w(Mt,It)};V(vt,Mt=>{n(Le).installed?Mt(en):Mt(qt,-1)})}O((Mt,It,Nn)=>{lt(qe,1,`card${n(ke)?" res-best":""}`),m(Lt,n(Le).name),m(Oe,`${n(Le).author??""} · ${n(Le).params_b??""}B`),lt(tt,1,`fit-badge ${Mt??""}`),m(Xt,n(Le).fit.text),m(We,`${It??""} · ⬇ ${Nn??""}`)},[()=>_(n(Le).fit.level),()=>h(n(Le).fit),()=>(n(Le).downloads||0).toLocaleString()]),w(Wt,qe)}),O(()=>m(Ht,n(le).title)),w(F,Qe)}),w(y,k)};V(Tt,y=>{var k;n(B)&&!n(S)?y(Rt):(k=n(S))!=null&&k.categories&&y(Gt,1)})}var wt=l(j,2),Ut=l(s(wt),4),Ee=s(Ut),Be=l(Ee,2),$t=s(Be);$t.value=$t.__value="downloads";var sn=l($t);sn.value=sn.__value="trending";var ln=l(sn);ln.value=ln.__value="created_at";var xt=l(Be,2),kn=s(xt),Pe=l(Ut,2);Ge(Pe,20,()=>["","coder","vision","reasoning","chat","agent"],Ke,(y,k)=>{var U=Jd(),F=s(U);O(()=>{lt(U,1,n(I)===k?"primary":"ghost"),m(F,k||"Alle")}),z("click",U,()=>{g(I,k,!0),Et()}),w(y,U)});var At=l(Pe,2);{var Or=y=>{var k=Yd();Ge(k,21,()=>n(ce),Ke,(U,F,le)=>{var Qe=Qd(),Xe=s(Qe);{var Zt=ct=>{var ut=Ur();w(ct,ut)};V(Xe,ct=>{le===n(ve)&&ct(Zt)})}var Ht=l(Xe,2),Vt=s(Ht),Wt=s(Vt),Le=s(Wt),ke=l(Wt,2),qe=s(ke),Fe=l(Vt,2),De=s(Fe),pt=l(Ht,2),kt=s(pt);Ye(kt,()=>Se(c(n(F).id)));var Ct=l(kt,2);Ye(Ct,()=>Ne(n(F).id));var Lt=l(pt,4),et=s(Lt),Oe=s(et),tt=l(et,2),Xt=s(tt);O((ct,ut,Mn,In,We)=>{lt(Qe,1,`card${le===n(ve)?" res-best":""}`),m(Le,ct),m(qe,n(F).author||""),lt(Fe,1,`fit-badge ${ut??""}`),m(De,Mn),m(Oe,In),m(Xt,`⬇ ${We??""}`)},[()=>n(F).id.split("/").pop(),()=>n(ie)[le]?_(n(ie)[le]):"warn",()=>n(ie)[le]?T(n(ie)[le]):"prüfe…",()=>n(ie)[le]?h({req_gb:0,tps:0}):"Hardware-Fit…",()=>(n(F).downloads||0).toLocaleString()]),z("click",Qe,()=>x(n(F).id,n(F).id.split("/").pop())),w(U,Qe)}),w(y,k)};V(At,y=>{n(ce).length&&y(Or)})}var ki=l(wt,2);{var Ys=y=>{const k=q(()=>n(me));var U=ac(),F=s(U),le=s(F),Qe=l(le,2),Xe=s(Qe),Zt=l(Qe,2),Ht=s(Zt),Vt=l(Zt,2);Ge(Vt,21,()=>n(k).models,Ke,(Fe,De)=>{var pt=tc(),kt=s(pt),Ct=s(kt),Lt=s(Ct),et=s(Lt),Oe=l(Lt,2),tt=s(Oe),Xt=l(Oe,2);Ye(Xt,()=>Ne(n(De).repo));var ct=l(Ct,2);{var ut=st=>{var vt=Zd(),en=s(vt);O(()=>m(en,n(De).why)),w(st,vt)};V(ct,st=>{n(De).why&&st(ut)})}var Mn=l(ct,2);{var In=st=>{var vt=Xd(),en=s(vt);O((qt,Mt,It)=>m(en,`~${qt??""} GB · ~${Mt??""} Tok/s · optimal ~${It??""}k Kontext`),[()=>(n(De).fit.req_gb??0).toFixed(1),()=>Math.round(n(De).fit.tps??0),()=>Math.round((n(De).optimal_ctx||8192)/1024)]),w(st,vt)};V(Mn,st=>{n(De).fit&&st(In)})}var We=l(kt,2);{var nt=st=>{var vt=ec(),en=s(vt);O(qt=>{lt(vt,1,`fit-badge ${qt??""}`),m(en,n(De).fit.text)},[()=>_(n(De).fit.level)]),w(st,vt)};V(We,st=>{n(De).fit&&st(nt)})}O(()=>{m(et,n(De).name),m(tt,n(De).role)}),w(Fe,pt)});var Wt=l(Vt,2);{var Le=Fe=>{const De=q(()=>Math.max(...n(k).models.map(Lt=>{var et;return((et=Lt.fit)==null?void 0:et.req_gb)??0})));var pt=nc(),kt=l(s(pt)),Ct=s(kt);O(Lt=>m(Ct,`~${Lt??""} GB`),[()=>n(De).toFixed(1)]),w(Fe,pt)};V(Wt,Fe=>{n(k).models.length&&n(k).models[0].fit&&Fe(Le)})}var ke=l(Wt,2),qe=s(ke);O(()=>{m(Xe,n(k).title),m(Ht,n(k).desc),lt(ke,1,`primary${n(k).fit_level==="too_tight"?" warn":""}`),m(qe,n(k).fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren")}),z("click",U,Fe=>{Fe.target.classList.contains("modal-overlay")&&g(me,null)}),z("click",le,()=>g(me,null)),z("click",ke,()=>re(n(k).id)),w(y,U)};V(ki,y=>{n(me)&&y(Ys)})}var Mi=l(ki,2);{var Zs=y=>{var k=dc(),U=s(k),F=s(U),le=l(F,2),Qe=s(le),Xe=l(le,2),Zt=s(Xe),Ht=l(Xe,2);{var Vt=ke=>{var qe=rc();w(ke,qe)},Wt=ke=>{var qe=lc(),Fe=l(ft(qe),2);Ge(Fe,21,()=>n(Q).files,Ke,(We,nt)=>{const st=q(()=>n(nt).fit.level==="perfect"?"●":n(nt).fit.level==="marginal"?"◐":"○");var vt=Hi(),en=s(vt),qt={};O(()=>{m(en,`${n(st)??""} ${n(nt).filename??""}`),qt!==(qt=n(nt).filename)&&(vt.value=(vt.__value=n(nt).filename)??"")}),w(We,vt)});var De=l(Fe,2),pt=s(De),kt=l(s(pt),2),Ct=l(pt,2),Lt=s(Ct),et=l(s(Lt));Ye(et,()=>li(a));var Oe=l(Lt,2),tt=l(De,2);{var Xt=We=>{var nt=ic(),st=l(s(nt)),vt=s(st),en=l(st,2);O(qt=>m(vt,`~${qt??""}k`),[()=>Math.round(n(Z).optimal_ctx/1024)]),z("click",en,qt=>{qt.preventDefault(),g(Y,n(Z).optimal_ctx,!0)}),w(We,nt)};V(tt,We=>{var nt;(nt=n(Z))!=null&&nt.optimal_ctx&&We(Xt)})}var ct=l(tt,2);{var ut=We=>{var nt=sc(),st=s(nt),vt=l(s(st),2),en=s(vt),qt=l(st,2),Mt=s(qt);O((It,Nn,Rr)=>{m(en,`~${It??""} GB · ~${Nn??""} Tok/s · ${(n(Z).quant||"GGUF")??""}`),lt(qt,1,`fit-badge ${Rr??""}`),m(Mt,n(Z).fit.text)},[()=>(n(Z).fit.req_gb??0).toFixed(1),()=>Math.round(n(Z).fit.tps??0),()=>_(n(Z).fit.level)]),w(We,nt)};V(ct,We=>{n(Z)&&We(ut)})}var Mn=l(ct,2),In=s(Mn);O(()=>{var We,nt;lt(Mn,1,`primary${((We=n(Z))==null?void 0:We.fit.level)==="too_tight"?" warn":""}`),Mn.disabled=n(be),m(In,n(be)?"Starte…":((nt=n(Z))==null?void 0:nt.fit.level)==="too_tight"?"Trotzdem holen (zu groß)":"Herunterladen & Einpflegen")}),z("change",Fe,L),ja(Fe,()=>n(de),We=>g(de,We)),Sn(kt,()=>n(Ae),We=>g(Ae,We)),Sn(Oe,()=>n(Y),We=>g(Y,We)),z("click",Mn,G),w(ke,qe)},Le=ke=>{var qe=oc();w(ke,qe)};V(Ht,ke=>{var qe,Fe;n(be)&&!n(Q)?ke(Vt):(Fe=(qe=n(Q))==null?void 0:qe.files)!=null&&Fe.length?ke(Wt,1):n(be)||ke(Le,2)})}O(()=>{m(Qe,n(Ue)),m(Zt,n(E))}),z("click",k,ke=>{ke.target.classList.contains("modal-overlay")&&g(Me,!1)}),z("click",F,()=>g(Me,!1)),w(y,k)};V(Mi,y=>{n(Me)&&y(Zs)})}var Xs=l(Mi,2);{var el=y=>{var k=uc(),U=s(k),F=s(U),le=l(F,2),Qe=s(le),Xe=l(le,6),Zt=l(Xe,4),Ht=l(Zt,4);Ge(Ht,17,()=>n(Ie),Ke,(ke,qe,Fe)=>{var De=cc(),pt=s(De),kt=l(pt,2),Ct=l(kt,2);Ge(Ct,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],Ke,(et,Oe)=>{var tt=Hi(),Xt=s(tt),ct={};O(()=>{m(Xt,Oe),ct!==(ct=Oe)&&(tt.__value=Oe)}),w(et,tt)});var Lt=l(Ct,2);Sn(pt,()=>n(qe).repo,et=>n(qe).repo=et),Sn(kt,()=>n(qe).role,et=>n(qe).role=et),ja(Ct,()=>n(qe).quant,et=>n(qe).quant=et),z("click",Lt,()=>g(Ie,n(Ie).filter((et,Oe)=>Oe!==Fe),!0)),w(ke,De)});var Vt=l(Ht,2),Wt=l(Vt,4),Le=s(Wt);O(()=>{m(Qe,n(Re)?"Setup bearbeiten":"Eigenes Setup erstellen"),m(Le,n(Re)?"Änderungen speichern":"Setup speichern")}),z("click",k,ke=>{ke.target.classList.contains("modal-overlay")&&g(ze,!1)}),z("click",F,()=>g(ze,!1)),Sn(Xe,()=>n(Ce),ke=>g(Ce,ke)),Sn(Zt,()=>n(He),ke=>g(He,ke)),z("click",Vt,()=>g(Ie,[...n(Ie),{repo:"",role:"",quant:"Q4_K_M"}],!0)),z("click",Wt,ne),w(y,k)};V(Xs,y=>{n(ze)&&y(el)})}O(()=>{m(it,n(S)?"aktuell":""),Je.disabled=n(B),m(dt,n(B)?"Suche…":"Aktualisieren"),m(yt,`Täglich aktualisierte Top-Modelle je Kategorie — Hardware-Fit berechnet für dein System. ${n(ye)?"⚠ Cache veraltet.":""}`),xt.disabled=n(_e),m(kn,n(_e)?"Lade…":"Suchen")}),z("click",Ze,$),z("click",Je,()=>Kt(!0)),z("keydown",Ee,y=>y.key==="Enter"&&Et()),Sn(Ee,()=>n(ee),y=>g(ee,y)),ja(Be,()=>n(K),y=>g(K,y)),z("click",xt,Et),w(e,je),Zn()}_a(["click","keydown","change"]);var pc=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>`),hc=M('<span class="mono-sm"> </span>'),gc=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>'),_c=M('<span class="chip" role="button" tabindex="0"> </span>'),mc=M('<div style="margin-top:10px"><a href="#" style="color:var(--mut);font-size:12.5px">Auswahl aufheben (alle)</a></div>'),bc=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>'),yc=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),xc=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),kc=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),Mc=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),Sc=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>'),Ec=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 Tc(e,t){Yn(t,!0);const a=q(()=>dr.value),r=q(()=>{var P;return(((P=n(a))==null?void 0:P.models)||[]).filter(N=>!N.incomplete)}),i=q(f);let o=R("zed"),d=R(Bt([])),c=R(""),u=R(!1);function f(){return`http://${location.hostname}:8080/v1`}function _(P){return/^\d{1,3}(\.\d{1,3}){3}$/.test(P)}function T(){return location.protocol==="https:"||!_(location.hostname)}const h=q(()=>n(d).length?n(d):n(r).map(P=>P.name)),b=q(()=>n(h)[0]||"coder"),A=q(()=>{var P;return(P=n(r).find(N=>{var J,re;return(re=(J=N.meta)==null?void 0:J.caps)==null?void 0:re.includes("Bild")}))==null?void 0:P.name});function C(P,N){const re=(N.length?n(r).filter(x=>N.includes(x.name)):n(r).length?n(r):[{name:"coder",meta:{}}]).map(x=>{var te,$;const L=(((te=x.meta)==null?void 0:te.caps)||[]).some(H=>/Bild|Vision/i.test(H)),G=(($=x.meta)==null?void 0:$.ctx)||131072;return` { "name": "${x.name}", "display_name": "${x.name}", "max_tokens": ${G}${L?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`,
|
||
`);return`"language_models": {
|
||
"openai_compatible": {
|
||
"bosgame": {
|
||
"api_url": "${P}",
|
||
"available_models": [
|
||
${re}
|
||
]
|
||
}
|
||
}
|
||
}`}function S(P,N){const re=(N.length?N:n(r).length?n(r).map(x=>x.name):["coder"]).map(x=>` "${x}": { "name": "${x}" }`).join(`,
|
||
`);return`"provider": {
|
||
"llama-swap": {
|
||
"npm": "@ai-sdk/openai-compatible",
|
||
"name": "Bosgame (llama-swap)",
|
||
"options": {
|
||
"baseURL": "${P}",
|
||
"apiKey": "local"
|
||
},
|
||
"models": {
|
||
${re}
|
||
}
|
||
}
|
||
}`}async function B(){g(c,"Teste…");try{const P=await fe("/api/integration/test");g(u,P.ok,!0),g(c,P.ok?`✓ Verbunden — ${P.models.length} Modell(e): ${P.models.join(", ")}`:`✗ Keine Verbindung: ${P.error}`,!0)}catch(P){g(u,!1),g(c,"✗ "+P.message)}}function ye(P){var J;const N=P.querySelector("code");N&&((J=navigator.clipboard)==null||J.writeText(N.textContent||""))}function ee(P){var N;(N=navigator.clipboard)==null||N.writeText(P.value)}var ce=Ec(),_e=l(ft(ce),2),I=l(s(_e),6),K=s(I),ie=l(K,2),ve=l(I,2);{var me=P=>{var N=pc();w(P,N)},Me=q(()=>T());V(ve,P=>{n(Me)&&P(me)})}var Ue=l(ve,2),E=s(Ue),Q=l(E,2);{var de=P=>{var N=hc(),J=s(N);O(()=>{Bn(N,`color:${n(u)?"#7ee29a":"#ff9b95"}`),m(J,n(c))}),w(P,N)};V(Q,P=>{n(c)&&P(de)})}var Ae=l(_e,2),Y=l(s(Ae),2);Ge(Y,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."]],Ke,(P,N)=>{var J=q(()=>Ya(N,3));let re=()=>n(J)[0],x=()=>n(J)[1],L=()=>n(J)[2];var G=gc(),te=s(G),$=s(te),H=l(te,2),ne=s(H),he=s(ne),Ne=l(ne,2),Se=s(Ne);O(()=>{m($,re()),m(he,x()),m(Se,L())}),w(P,G)});var be=l(Ae,2);{var Z=P=>{var N=bc(),J=s(N),re=l(s(J),2),x=s(re),L=l(J,4);Ge(L,21,()=>n(r),Ke,($,H)=>{const ne=q(()=>n(d).includes(n(H).name));var he=_c(),Ne=s(he);O(()=>{Bn(he,`cursor:pointer;${n(ne)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),m(Ne,n(H).name)}),z("click",he,()=>g(d,n(ne)?n(d).filter(Se=>Se!==n(H).name):[...n(d),n(H).name],!0)),z("keydown",he,Se=>Se.key==="Enter"&&g(d,n(ne)?n(d).filter(je=>je!==n(H).name):[...n(d),n(H).name],!0)),w($,he)});var G=l(L,2);{var te=$=>{var H=mc(),ne=s(H);z("click",ne,he=>{he.preventDefault(),g(d,[],!0)}),w($,H)};V(G,$=>{n(d).length&&$(te)})}O(()=>m(x,n(d).length?`${n(d).length} von ${n(r).length} ausgewählt`:"alle werden eingeschlossen")),w(P,N)};V(be,P=>{n(r).length&&P(Z)})}var ze=l(be,2),Ce=l(s(ze),4);Ge(Ce,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"]],Ke,(P,N)=>{var J=q(()=>Ya(N,3));let re=()=>n(J)[0],x=()=>n(J)[1],L=()=>n(J)[2];var G=yc(),te=s(G),$=s(te),H=l(te,2),ne=s(H);O(()=>{lt(G,1,`card-btn${n(o)===re()?" cb-best":""}`),m($,x()),m(ne,L())}),z("click",G,()=>g(o,re(),!0)),w(P,G)});var He=l(ze,2),Ie=l(s(He),2);{var Re=P=>{const N=q(()=>C(n(i),n(h)));var J=wc(),re=l(ft(J),4),x=s(re),L=l(x,2),G=s(L),te=s(G),$=l(re,4),H=l(s($)),ne=s(H);O(()=>{m(te,n(N)),m(ne,`bosgame / ${n(b)??""}`)}),z("click",x,he=>ye(he.currentTarget.parentElement)),w(P,J)},_t=P=>{const N=q(()=>S(n(i),n(h)));var J=xc(),re=l(ft(J),6),x=s(re),L=l(x,2),G=s(L),te=s(G),$=l(re,2),H=l(s($),3),ne=s(H);O(()=>{m(te,n(N)),m(ne,`llama-swap/${n(b)??""}`)}),z("click",x,he=>ye(he.currentTarget.parentElement)),w(P,J)},mt=P=>{var N=kc(),J=l(ft(N),4),re=s(J),x=l(re,2),L=l(J,4),G=s(L),te=l(G,2);O(()=>{ur(re,n(i)),ur(G,n(b))}),z("click",x,$=>ee($.currentTarget.previousElementSibling)),z("click",te,$=>ee($.currentTarget.previousElementSibling)),w(P,N)},Kt=P=>{var N=Mc(),J=l(ft(N),4),re=s(J),x=l(re,2),L=l(J,4),G=s(L),te=l(G,2);O(()=>ur(re,n(i))),z("click",x,$=>ee($.currentTarget.previousElementSibling)),z("click",te,$=>ee($.currentTarget.previousElementSibling)),w(P,N)};V(Ie,P=>{n(o)==="zed"?P(Re):n(o)==="opencode"?P(_t,1):n(o)==="cline"?P(mt,2):n(o)==="openwebui"&&P(Kt,3)})}var St=l(He,2);{var Et=P=>{const N=q(()=>`curl ${n(i)}/chat/completions \\
|
||
-H "Content-Type: application/json" \\
|
||
-d '{
|
||
"model": "${n(A)}",
|
||
"messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,<DEIN_BILD>"}}]}]
|
||
}'`);var J=Sc(),re=s(J),x=l(s(re),2),L=s(x);Ye(L,()=>ea("check"));var G=l(L),te=l(re,4),$=s(te),H=l($,2),ne=s(H),he=s(ne);O(()=>{m(G,` „${n(A)??""}" bereit`),m(he,n(N))}),z("click",$,Ne=>ye(Ne.currentTarget.parentElement)),w(P,J)};V(St,P=>{n(A)&&P(Et)})}O(()=>ur(K,n(i))),z("click",ie,P=>{const N=P.currentTarget.previousElementSibling;ee(N)}),z("click",E,B),w(e,ce),Zn()}_a(["click","keydown"]);var $c=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>'),Ac=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>'),Cc=M('<div class="empty" style="text-align:center;padding:40px">Lade News… (erstes Laden kann kurz dauern)</div>'),Lc=M('<div class="alert err" style="margin:0"> </div>'),zc=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>'),Dc=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>'),Oc=M('<div class="news-grid"></div>'),Rc=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 Bc(e,t){Yn(t,!0);let a=R(Bt([])),r=R(Bt([])),i=R(!0),o=R("");const d=I=>I==="perfect"?"ok":I==="marginal"?"warn":"bad";function c(I){const K=Math.max(0,Date.now()/1e3-I);return K<60?K+"s":K<3600?Math.floor(K/60)+"m":K<86400?Math.floor(K/3600)+"h":Math.floor(K/86400)+"d"}async function u(){g(i,!0),g(o,"");try{g(a,(await fe("/api/news")).items||[],!0)}catch(I){g(o,I.message||"Fehler beim Laden",!0)}finally{g(i,!1)}}async function f(){try{g(r,(await fe("/api/cookbook/upgrades")).upgrades||[],!0)}catch{g(r,[],!0)}}async function _(I,K){var ie;K.disabled=!0,K.textContent="Starte…";try{await fe("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:I.repo,role:I.role,params_b:I.params_b,quant:I.quant,hf_token:Qa()})}),(ie=document.querySelector(".nav-item[data-view='activity']"))==null||ie.dispatchEvent(new MouseEvent("click"))}catch(ve){K.disabled=!1,K.textContent="Installieren",alert("Fehler: "+ve.message)}}function T(){u(),f()}or(()=>{u(),f()});var h=Rc(),b=ft(h),A=l(s(b),2),C=l(b,2);{var S=I=>{var K=Ac(),ie=s(K),ve=l(s(ie),2),me=s(ve),Me=l(ie,4);Ge(Me,21,()=>n(r),Ke,(Ue,E)=>{var Q=$c(),de=s(Q),Ae=s(de),Y=s(Ae),be=s(Y),Z=l(Y,2),ze=s(Z),Ce=l(Ae,2),He=s(Ce),Ie=l(de,2);O(Re=>{m(be,n(E).name),lt(Z,1,`fit-badge ${Re??""}`),m(ze,n(E).fit.text),m(He,`Ersetzt dein „${n(E).old??""}". ${n(E).why??""}`)},[()=>d(n(E).fit.level)]),z("click",Ie,Re=>_(n(E),Re.currentTarget)),w(Ue,Q)}),O(()=>m(me,n(r).length)),w(I,K)};V(C,I=>{n(r).length&&I(S)})}var B=l(C,2);{var ye=I=>{var K=Cc();w(I,K)},ee=I=>{var K=Lc(),ie=s(K);O(()=>m(ie,n(o))),w(I,K)},ce=I=>{var K=zc();w(I,K)},_e=I=>{var K=Oc();Ge(K,21,()=>n(a),Ke,(ie,ve,me)=>{var Me=Dc();lt(Me,1,`news-card${me===0?" featured":""}`);var Ue=s(Me),E=s(Ue),Q=s(E),de=l(E,2);{var Ae=Ce=>{var He=Pc();w(Ce,He)};V(de,Ce=>{n(ve).relevant&&Ce(Ae)})}var Y=l(de,2),be=s(Y),Z=l(Ue,2),ze=s(Z);O(Ce=>{zr(Me,"href",n(ve).link),m(Q,n(ve).source),m(be,Ce),m(ze,n(ve).title)},[()=>n(ve).ts?c(n(ve).ts):""]),w(ie,Me)}),w(I,K)};V(B,I=>{n(i)?I(ye):n(o)?I(ee,1):n(a).length?I(_e,-1):I(ce,2)})}z("click",A,T),w(e,h),Zn()}_a(["click"]);const qc=[["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>`]],Ic=[["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>'),Fc=M('<div class="concept"><h4> </h4> <p> </p></div>'),Kc=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 Gc(e){var t=Kc(),a=l(ft(t),4);Ge(a,21,()=>qc,Ke,(i,o,d)=>{var c=q(()=>Ya(n(o),2));let u=()=>n(c)[0],f=()=>n(c)[1];var _=Nc();_.open=d===0;var T=s(_),h=s(T),b=l(T,2);Ye(b,f,!0),O(()=>m(h,u())),w(i,_)});var r=l(a,4);Ge(r,21,()=>Ic,Ke,(i,o)=>{var d=q(()=>Ya(n(o),2));let c=()=>n(d)[0],u=()=>n(d)[1];var f=Fc(),_=s(f),T=s(_),h=l(_,2),b=s(h);O(()=>{m(T,c()),m(b,u())}),w(i,f)}),w(e,t)}let Vi={};function Uc(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function Wi(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"),ji("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?jc():ji(`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=Vi[c];if(f&&f!==u&&(u==="running"||u==="loading")){Uc();break}}Vi=d}Hc(e),dr.set(e)}function Hc(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 Vc(e){ra.set(e||[])}function Wc(e){xi.set(e)}function ji(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 jc(){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 Hr(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(Hr(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(Hr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(Hr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Dr(){try{Wi(await fe("/api/status"))}catch{Wi(null)}}async function Js(){try{Vc(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{Wc(JSON.parse(a.data))}catch{}},t.onclose=()=>{setTimeout(Qs,3e3)},t.onerror=()=>t.close()}var es;((es=document.getElementById("logo"))==null?void 0:es.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Pr.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Pr[e.dataset.ic||""]||""});const Qc=[["overview",td],["models",gd],["activity",Td],["server",Bd],["cookbook",fc],["connect",Tc],["news",Bc],["guides",Gc]];for(const[e,t]of Qc){const a=document.querySelector(`.view[data-view="${e}"]`);a&&yo(t,{target:a})}Ko("overview");const Vr=document.getElementById("token");Vr&&(Vr.value=Ws(),Vr.addEventListener("change",e=>{Bo(e.target.value),Dr()}));const Wr=document.getElementById("hf-token");Wr&&(Wr.value=Qa(),Wr.addEventListener("change",e=>Io(e.target.value)));const Ji=document.getElementById("nav-settings"),jr=document.getElementById("settings-modal"),Qi=document.getElementById("sm-close");Ji&&jr&&Qi&&(Ji.addEventListener("click",()=>jr.style.display="flex"),Qi.addEventListener("click",()=>jr.style.display="none"));function Yc(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Dr);Dr();Js();Qs();setInterval(Yc,1e3);setInterval(Dr,3e3);setInterval(Js,1500);js();setInterval(js,6e4);
|