This repository has been archived on 2026-07-22. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
mission-control/static/dist/main.js
T
Hitonabi 86831a3627 feat(phase-c): Vollstaendige Svelte-5-Migration aller 8 Panels
Alle Panels vollstaendig migriert (kein Legacy-JS mehr):
- OverviewPanel: Hero, Metriken, System-Gesundheit, Stack, Top-News
- JobsPanel: KPI-Kacheln, Sparklines, Job-Liste mit Log/Abbrechen
- ServerPanel: Engine-Status, Service-Aktionen, Live-Konsole (WebSocket)
- ModelsPanel: Schnelltest-Chat, Tabelle, Konfig- + Rollen-Modal
- CookbookPanel: Rezepte, Discover, Profi-Suche, 3 Modals (Rezept/Modell/Neu)
- ConnectPanel: Wizard, Tool-Picker, merge-sichere Snippets
- GuidesPanel + NewsPanel: bereits in Phase C1 migriert

main.ts: importiert nur noch Svelte-Panels (keine Legacy-JS-Imports)
index.html: Placeholder-Divs entfernt, nur noch leere Sections
stores/jobs.svelte.ts: track/toggle-Funktionen fuer ServerPanel
svelte.config.js: a11y-Warnungen als non-fatal konfiguriert
Build: 119 Module -> 137 kB (gzip: 48 kB)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 22:08:08 +02:00

113 lines
134 KiB
JavaScript
Raw Blame History

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