var ir=Object.defineProperty;var ns=e=>{throw TypeError(e)};var sr=(e,t,n)=>t in e?ir(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var se=(e,t,n)=>sr(e,typeof t!="symbol"?t+"":t,n),oi=(e,t,n)=>t.has(e)||ns("Cannot "+n);var d=(e,t,n)=>(oi(e,t,"read from private field"),n?n.call(e):t.get(e)),_=(e,t,n)=>t.has(e)?ns("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),y=(e,t,n,i)=>(oi(e,t,"write to private field"),i?i.call(e,n):t.set(e,n),n),T=(e,t,n)=>(oi(e,t,"access private method"),n);var Is=Array.isArray,ar=Array.prototype.indexOf,Nn=Array.prototype.includes,Xn=Array.from,rr=Object.defineProperty,rn=Object.getOwnPropertyDescriptor,lr=Object.getOwnPropertyDescriptors,or=Object.prototype,dr=Array.prototype,Gs=Object.getPrototypeOf,is=Object.isExtensible;const cr=()=>{};function ur(e){for(var t=0;t{e=i,t=s});return{promise:n,resolve:e,reject:t}}function ss(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const n=[];for(const i of e)if(n.push(i),n.length===t)break;return n}const U=2,fn=4,ei=8,qs=1<<24,ke=16,$e=32,et=64,ki=128,ve=512,I=1024,q=2048,De=4096,Q=8192,me=16384,Ut=32768,as=1<<25,It=65536,In=1<<17,fr=1<<18,jt=1<<19,pr=1<<20,Ie=1<<25,yt=65536,Gn=1<<21,At=1<<22,Ze=1<<23,di=Symbol("$state"),Dn=Symbol("attributes"),Mi=Symbol("class"),hr=Symbol("style"),Yt=Symbol("text"),ti=new class extends Error{constructor(){super(...arguments);se(this,"name","StaleReactionError");se(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function vr(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function mr(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function gr(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function br(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function wr(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function yr(e){throw new Error("https://svelte.dev/e/effect_orphan")}function xr(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function _r(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function kr(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Mr(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Sr(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const $r=1,Er=2,Tr=16,Cr=1,Lr=2,N=Symbol("uninitialized"),Us="http://www.w3.org/1999/xhtml",Ar="http://www.w3.org/2000/svg",zr="http://www.w3.org/1998/Math/MathML";function Dr(){console.warn("https://svelte.dev/e/derived_inert")}function Pr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function js(e){return e===this.v}function Or(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Vs(e){return!Or(e,this.v)}let Y=null;function Gt(e){Y=e}function Ws(e,t=!1,n){Y={p:Y,i:!1,c:null,e:null,s:e,x:null,r:E,l:null}}function Js(e){var t=Y,n=t.e;if(n!==null){t.e=null;for(var i of n)ga(i)}return t.i=!0,Y=t.p,{}}function Qs(){return!0}let Et=[];function Br(){var e=Et;Et=[],ur(e)}function zt(e){if(Et.length===0){var t=Et;queueMicrotask(()=>{t===Et&&Br()})}Et.push(e)}function Ys(e){var t=E;if(t===null)return S.f|=Ze,e;if((t.f&Ut)===0&&(t.f&fn)===0)throw e;Je(e,t)}function Je(e,t){if(!(t!==null&&(t.f&me)!==0)){for(;t!==null;){if((t.f&ki)!==0){if((t.f&Ut)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}}const Hr=-7169;function F(e,t){e.f=e.f&Hr|t}function Hi(e){(e.f&ve)!==0||e.deps===null?F(e,I):F(e,De)}function Zs(e){if(e!==null)for(const t of e)(t.f&U)===0||(t.f&yt)===0||(t.f^=yt,Zs(t.deps))}function Xs(e,t,n){(e.f&q)!==0?t.add(e):(e.f&De)!==0&&n.add(e),Zs(e.deps),F(e,I)}function Rr(e){let t=0,n=_t(0),i;return()=>{Gi()&&(M(n),cl(()=>(t===0&&(i=La(()=>e(()=>on(n)))),t+=1,()=>{zt(()=>{t-=1,t===0&&(i==null||i(),i=void 0,on(n))})})))}}var Fr=It|jt;function Nr(e,t,n,i){new Ir(e,t,n,i)}var ue,Bi,fe,ut,Z,pe,W,re,He,ft,Ve,Pt,vn,mn,Re,Qn,H,Gr,Kr,qr,Si,Pn,On,$i,Ei;class Ir{constructor(t,n,i,s){_(this,H);se(this,"parent");se(this,"is_pending",!1);se(this,"transform_error");_(this,ue);_(this,Bi,null);_(this,fe);_(this,ut);_(this,Z);_(this,pe,null);_(this,W,null);_(this,re,null);_(this,He,null);_(this,ft,0);_(this,Ve,0);_(this,Pt,!1);_(this,vn,new Set);_(this,mn,new Set);_(this,Re,null);_(this,Qn,Rr(()=>(y(this,Re,_t(d(this,ft))),()=>{y(this,Re,null)})));var a;y(this,ue,t),y(this,fe,n),y(this,ut,r=>{var o=E;o.b=this,o.f|=ki,i(r)}),this.parent=E.b,this.transform_error=s??((a=this.parent)==null?void 0:a.transform_error)??(r=>r),y(this,Z,Ki(()=>{T(this,H,Si).call(this)},Fr))}defer_effect(t){Xs(t,d(this,vn),d(this,mn))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!d(this,fe).pending}update_pending_count(t,n){T(this,H,$i).call(this,t,n),y(this,ft,d(this,ft)+t),!(!d(this,Re)||d(this,Pt))&&(y(this,Pt,!0),zt(()=>{y(this,Pt,!1),d(this,Re)&&Kt(d(this,Re),d(this,ft))}))}get_effect_pending(){return d(this,Qn).call(this),M(d(this,Re))}error(t){if(!d(this,fe).onerror&&!d(this,fe).failed)throw t;x!=null&&x.is_fork?(d(this,pe)&&x.skip_effect(d(this,pe)),d(this,W)&&x.skip_effect(d(this,W)),d(this,re)&&x.skip_effect(d(this,re)),x.oncommit(()=>{T(this,H,Ei).call(this,t)})):T(this,H,Ei).call(this,t)}}ue=new WeakMap,Bi=new WeakMap,fe=new WeakMap,ut=new WeakMap,Z=new WeakMap,pe=new WeakMap,W=new WeakMap,re=new WeakMap,He=new WeakMap,ft=new WeakMap,Ve=new WeakMap,Pt=new WeakMap,vn=new WeakMap,mn=new WeakMap,Re=new WeakMap,Qn=new WeakMap,H=new WeakSet,Gr=function(){try{y(this,pe,he(()=>d(this,ut).call(this,d(this,ue))))}catch(t){this.error(t)}},Kr=function(t){const n=d(this,fe).failed;n&&y(this,re,he(()=>{n(d(this,ue),()=>t,()=>()=>{})}))},qr=function(){const t=d(this,fe).pending;t&&(this.is_pending=!0,y(this,W,he(()=>t(d(this,ue)))),zt(()=>{var n=y(this,He,document.createDocumentFragment()),i=gt();n.append(i),y(this,pe,T(this,H,On).call(this,()=>he(()=>d(this,ut).call(this,i)))),d(this,Ve)===0&&(d(this,ue).before(n),y(this,He,null),bt(d(this,W),()=>{y(this,W,null)}),T(this,H,Pn).call(this,x))}))},Si=function(){try{if(this.is_pending=this.has_pending_snippet(),y(this,Ve,0),y(this,ft,0),y(this,pe,he(()=>{d(this,ut).call(this,d(this,ue))})),d(this,Ve)>0){var t=y(this,He,document.createDocumentFragment());Ui(d(this,pe),t);const n=d(this,fe).pending;y(this,W,he(()=>n(d(this,ue))))}else T(this,H,Pn).call(this,x)}catch(n){this.error(n)}},Pn=function(t){this.is_pending=!1,t.transfer_effects(d(this,vn),d(this,mn))},On=function(t){var n=E,i=S,s=Y;Pe(d(this,Z)),ge(d(this,Z)),Gt(d(this,Z).ctx);try{return xt.ensure(),t()}catch(a){return Ys(a),null}finally{Pe(n),ge(i),Gt(s)}},$i=function(t,n){var i;if(!this.has_pending_snippet()){this.parent&&T(i=this.parent,H,$i).call(i,t,n);return}y(this,Ve,d(this,Ve)+t),d(this,Ve)===0&&(T(this,H,Pn).call(this,n),d(this,W)&&bt(d(this,W),()=>{y(this,W,null)}),d(this,He)&&(d(this,ue).before(d(this,He)),y(this,He,null)))},Ei=function(t){d(this,pe)&&(ie(d(this,pe)),y(this,pe,null)),d(this,W)&&(ie(d(this,W)),y(this,W,null)),d(this,re)&&(ie(d(this,re)),y(this,re,null));var n=d(this,fe).onerror;let i=d(this,fe).failed;var s=!1,a=!1;const r=()=>{if(s){Pr();return}s=!0,a&&Sr(),d(this,re)!==null&&bt(d(this,re),()=>{y(this,re,null)}),T(this,H,On).call(this,()=>{T(this,H,Si).call(this)})},o=c=>{try{a=!0,n==null||n(c,r),a=!1}catch(u){Je(u,d(this,Z)&&d(this,Z).parent)}i&&y(this,re,T(this,H,On).call(this,()=>{try{return he(()=>{var u=E;u.b=this,u.f|=ki,i(d(this,ue),()=>c,()=>r)})}catch(u){return Je(u,d(this,Z).parent),null}}))};zt(()=>{var c;try{c=this.transform_error(t)}catch(u){Je(u,d(this,Z)&&d(this,Z).parent);return}c!==null&&typeof c=="object"&&typeof c.then=="function"?c.then(o,u=>Je(u,d(this,Z)&&d(this,Z).parent)):o(c)})};function Ur(e,t,n,i){const s=Ri;var a=e.filter(m=>!m.settled),r=t.map(s);if(n.length===0&&a.length===0){i(r);return}var o=E,c=jr(),u=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(m=>m.promise)):null;function p(m){if((o.f&me)===0){c();try{i([...r,...m])}catch(h){Je(h,o)}Kn()}}var v=ea();if(n.length===0){u.then(()=>p([])).finally(v);return}function f(){Promise.all(n.map(m=>Vr(m))).then(p).catch(m=>Je(m,o)).finally(v)}u?u.then(()=>{c(),f(),Kn()}):f()}function jr(){var e=E,t=S,n=Y,i=x;return function(a=!0){Pe(e),ge(t),Gt(n),a&&(e.f&me)===0&&(i==null||i.activate(),i==null||i.apply())}}function Kn(e=!0){Pe(null),ge(null),Gt(null),e&&(x==null||x.deactivate())}function ea(){var e=E,t=e.b,n=x,i=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,n),n.increment(i,e),()=>{t==null||t.update_pending_count(-1,n),n.decrement(i,e)}}function Ri(e){var t=U|q;return E!==null&&(E.f|=jt),{ctx:Y,deps:null,effects:null,equals:js,f:t,fn:e,reactions:null,rv:0,v:N,wv:0,parent:E,ac:null}}const Zt=Symbol("obsolete");function Vr(e,t,n){let i=E;i===null&&mr();var s=void 0,a=_t(N),r=!S,o=new Set;return dl(()=>{var m,h;var c=E,u=Ks();s=u.promise;try{Promise.resolve(e()).then(u.resolve,b=>{b!==ti&&u.reject(b)}).finally(Kn)}catch(b){u.reject(b),Kn()}var p=x;if(r){if((c.f&Ut)!==0)var v=ea();if((m=i.b)!=null&&m.is_rendered())(h=p.async_deriveds.get(c))==null||h.reject(Zt);else for(const b of o.values())b.reject(Zt);o.add(u),p.async_deriveds.set(c,u)}const f=(b,C=void 0)=>{v==null||v(),o.delete(u),C!==Zt&&(p.activate(),C?(a.f|=Ze,Kt(a,C)):((a.f&Ze)!==0&&(a.f^=Ze),Kt(a,b)),p.deactivate())};u.promise.then(f,b=>f(null,b||"unknown"))}),rl(()=>{for(const c of o)c.reject(Zt)}),new Promise(c=>{function u(p){function v(){p===s?c(a):u(s)}p.then(v,v)}u(s)})}function rs(e){const t=Ri(e);return ka(t),t}function Wr(e){const t=Ri(e);return t.equals=Vs,t}function Jr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;nthis.schedule(i)){var i=d(this,Te).get(t);if(i){d(this,Te).delete(t);for(var s of i.d)F(s,q),n(s);for(s of i.m)F(s,De),n(s)}d(this,Nt).add(t)}capture(t,n,i=!1){t.v!==N&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&Ze)===0&&(this.current.set(t,[n,i]),K==null||K.set(t,n)),this.is_fork||(t.v=n)}activate(){x=this}deactivate(){x=null,K=null}flush(){try{ui=!0,x=this,T(this,P,Xt).call(this)}finally{ls=0,Ti=null,Tt=null,Bn=null,ui=!1,x=null,K=null,mt.clear()}}discard(){var t;for(const n of d(this,Ht))n(this);d(this,Ht).clear();for(const n of this.async_deriveds.values())n.reject(Zt);T(this,P,en).call(this),(t=d(this,Ft))==null||t.resolve()}register_created_effect(t){d(this,gn).push(t)}increment(t,n){if(y(this,Rt,d(this,Rt)+1),t){let i=d(this,Fe).get(n)??0;d(this,Fe).set(n,i+1)}}decrement(t,n){if(y(this,Rt,d(this,Rt)-1),t){let i=d(this,Fe).get(n)??0;i===1?d(this,Fe).delete(n):d(this,Fe).set(n,i-1)}d(this,ht)||(y(this,ht,!0),zt(()=>{y(this,ht,!1),this.linked&&this.flush()}))}transfer_effects(t,n){for(const i of t)d(this,Ne).add(i);for(const i of n)d(this,xe).add(i);t.clear(),n.clear()}oncommit(t){d(this,Bt).add(t)}ondiscard(t){d(this,Ht).add(t)}settled(){return(d(this,Ft)??y(this,Ft,Ks())).promise}static ensure(){if(x===null){const t=x=new Yn;ui||zt(()=>{d(t,Ot)||t.flush()})}return x}apply(){{K=null;return}}schedule(t){var s;if(Ti=t,(s=t.b)!=null&&s.is_pending&&(t.f&(fn|ei|qs))!==0&&(t.f&Ut)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var i=n.f;if(Tt!==null&&n===E&&(S===null||(S.f&U)===0))return;if((i&(et|$e))!==0){if((i&I)===0)return;n.f^=I}}d(this,X).push(n)}};Ot=new WeakMap,We=new WeakMap,pt=new WeakMap,Bt=new WeakMap,Ht=new WeakMap,Rt=new WeakMap,Fe=new WeakMap,Ft=new WeakMap,X=new WeakMap,gn=new WeakMap,Ne=new WeakMap,xe=new WeakMap,Te=new WeakMap,Nt=new WeakMap,ht=new WeakMap,P=new WeakSet,Ci=function(){if(this.is_fork)return!0;for(const i of d(this,Fe).keys()){for(var t=i,n=!1;t.parent!==null;){if(d(this,Te).has(t)){n=!0;break}t=t.parent}if(!n)return!0}return!1},Xt=function(){var c,u,p,v;y(this,Ot,!0),ls++>1e3&&(T(this,P,en).call(this),Xr());for(const f of d(this,Ne))d(this,xe).delete(f),F(f,q),this.schedule(f);for(const f of d(this,xe))F(f,De),this.schedule(f);const t=d(this,X);y(this,X,[]),this.apply();var n=Tt=[],i=[],s=Bn=[];for(const f of t)try{T(this,P,Li).call(this,f,n,i)}catch(m){throw la(f),T(this,P,Ci).call(this)||this.discard(),m}if(x=null,s.length>0){var a=Yn.ensure();for(const f of s)a.schedule(f)}if(Tt=null,Bn=null,T(this,P,Ci).call(this)){T(this,P,$t).call(this,i),T(this,P,$t).call(this,n);for(const[f,m]of d(this,Te))ra(f,m);s.length>0&&T(c=x,P,Xt).call(c);return}const r=T(this,P,ia).call(this);if(r){T(this,P,$t).call(this,i),T(this,P,$t).call(this,n),T(u=r,P,sa).call(u,this);return}d(this,Ne).clear(),d(this,xe).clear();for(const f of d(this,Bt))f(this);d(this,Bt).clear(),ln=this,os(i),os(n),ln=null,(p=d(this,Ft))==null||p.resolve();var o=x;if(d(this,Rt)===0&&(d(this,X).length===0||o!==null)&&T(this,P,en).call(this),d(this,X).length>0)if(o!==null){const f=o;d(f,X).push(...d(this,X).filter(m=>!d(f,X).includes(m)))}else o=this;o!==null&&T(v=o,P,Xt).call(v)},Li=function(t,n,i){t.f^=I;for(var s=t.first;s!==null;){var a=s.f,r=(a&($e|et))!==0,o=r&&(a&I)!==0,c=o||(a&Q)!==0||d(this,Te).has(s);if(!c&&s.fn!==null){r?s.f^=I:(a&fn)!==0?n.push(s):xn(s)&&((a&ke)!==0&&d(this,xe).add(s),qt(s));var u=s.first;if(u!==null){s=u;continue}}for(;s!==null;){var p=s.next;if(p!==null){s=p;break}s=s.parent}}},ia=function(){for(var t=d(this,We);t!==null;){if(!t.is_fork){for(const[n,[,i]]of this.current)if(t.current.has(n)&&!i)return t}t=d(t,We)}return null},sa=function(t){var i;for(const[s,a]of t.current)!this.previous.has(s)&&t.previous.has(s)&&this.previous.set(s,t.previous.get(s)),this.current.set(s,a);for(const[s,a]of t.async_deriveds){const r=this.async_deriveds.get(s);r&&a.promise.then(r.resolve).catch(r.reject)}t.async_deriveds.clear(),this.transfer_effects(d(t,Ne),d(t,xe));const n=s=>{var a=s.reactions;if(a!==null)for(const c of a){var r=c.f;if((r&U)!==0)n(c);else{var o=c;r&(At|ke)&&!this.async_deriveds.has(o)&&(d(this,xe).delete(o),F(o,q),this.schedule(o))}}};for(const s of this.current.keys())n(s);this.oncommit(()=>t.discard()),T(i=t,P,en).call(i),x=this,T(this,P,Xt).call(this)},$t=function(t){for(var n=0;n!f.current.get(m)[1]);if(!(!d(f,Ot)||s.length===0)){var a=s.filter(m=>!this.current.has(m));if(a.length===0)t&&f.discard();else if(n.length>0){if(t)for(const m of d(this,Nt))f.unskip_effect(m,h=>{var b;(h.f&(ke|At))!==0?f.schedule(h):T(b=f,P,$t).call(b,[h])});f.activate();var r=new Set,o=new Map;for(var c of n)aa(c,a,r,o);o=new Map;var u=[...f.current].filter(([m,h])=>{const b=this.current.get(m);return b?b[0]!==h[0]||b[1]!==h[1]:!0}).map(([m])=>m);if(u.length>0)for(const m of d(this,gn))(m.f&(me|Q|In))===0&&Ni(m,u,o)&&((m.f&(At|ke))!==0?(F(m,q),f.schedule(m)):d(f,Ne).add(m));if(d(f,X).length>0&&!d(f,ht)){f.apply();for(var p of d(f,X))T(v=f,P,Li).call(v,p,[],[]);y(f,X,[])}f.deactivate()}}}},en=function(){if(this.linked){var t=d(this,We),n=d(this,pt);t===null?ci=n:y(t,pt,n),n===null?kt=t:y(n,We,t),this.linked=!1}};let xt=Yn;function Xr(){try{xr()}catch(e){Je(e,Ti)}}let we=null;function os(e){var t=e.length;if(t!==0){for(var n=0;n0)){mt.clear();for(const s of we){if((s.f&(me|Q))!==0)continue;const a=[s];let r=s.parent;for(;r!==null;)we.has(r)&&(we.delete(r),a.push(r)),r=r.parent;for(let o=a.length-1;o>=0;o--){const c=a[o];(c.f&(me|Q))===0&&qt(c)}}we.clear()}}we=null}}function aa(e,t,n,i){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const a=s.f;(a&U)!==0?aa(s,t,n,i):(a&(At|ke))!==0&&(a&q)===0&&Ni(s,t,i)&&(F(s,q),Ii(s))}}function Ni(e,t,n){const i=n.get(e);if(i!==void 0)return i;if(e.deps!==null)for(const s of e.deps){if(Nn.call(t,s))return!0;if((s.f&U)!==0&&Ni(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function Ii(e){x.schedule(e)}function ra(e,t){if(!((e.f&$e)!==0&&(e.f&I)!==0)){(e.f&q)!==0?t.d.push(e):(e.f&De)!==0&&t.m.push(e),F(e,I);for(var n=e.first;n!==null;)ra(n,t),n=n.next}}function la(e){F(e,I);for(var t=e.first;t!==null;)la(t),t=t.next}let qn=new Set;const mt=new Map;let oa=!1;function _t(e,t){var n={f:0,v:e,reactions:null,equals:js,rv:0,wv:0};return n}function ee(e,t){const n=_t(e);return ka(n),n}function el(e,t=!1,n=!0){const i=_t(e);return t||(i.equals=Vs),i}function V(e,t,n=!1){S!==null&&(!Me||(S.f&In)!==0)&&Qs()&&(S.f&(U|ke|At|In))!==0&&(ze===null||!ze.has(e))&&Mr();let i=n?Qe(t):t;return Kt(e,i,Bn)}function Kt(e,t,n=null){if(!e.equals(t)){mt.set(e,tt?t:e.v);var i=xt.ensure();if(i.capture(e,t),(e.f&U)!==0){const s=e;(e.f&q)!==0&&Fi(s),K===null&&Hi(s)}e.wv=Sa(),da(e,q,n),E!==null&&(E.f&I)!==0&&(E.f&($e|et))===0&&(de===null?fl([e]):de.push(e)),!i.is_fork&&qn.size>0&&!oa&&tl()}return t}function tl(){oa=!1;for(const e of qn){(e.f&I)!==0&&F(e,De);let t;try{t=xn(e)}catch{t=!0}t&&qt(e)}qn.clear()}function on(e){V(e,e.v+1)}function da(e,t,n){var i=e.reactions;if(i!==null)for(var s=i.length,a=0;a{if(wt===a)return o();var c=S,u=wt;ge(null),us(a);var p=o();return ge(c),us(u),p};return i&&n.set("length",ee(e.length)),new Proxy(e,{defineProperty(o,c,u){(!("value"in u)||u.configurable===!1||u.enumerable===!1||u.writable===!1)&&_r();var p=n.get(c);return p===void 0?r(()=>{var v=ee(u.value);return n.set(c,v),v}):V(p,u.value,!0),!0},deleteProperty(o,c){var u=n.get(c);if(u===void 0){if(c in o){const p=r(()=>ee(N));n.set(c,p),on(s)}}else V(u,N),on(s);return!0},get(o,c,u){var m;if(c===di)return e;var p=n.get(c),v=c in o;if(p===void 0&&(!v||(m=rn(o,c))!=null&&m.writable)&&(p=r(()=>{var h=Qe(v?o[c]:N),b=ee(h);return b}),n.set(c,p)),p!==void 0){var f=M(p);return f===N?void 0:f}return Reflect.get(o,c,u)},getOwnPropertyDescriptor(o,c){var u=Reflect.getOwnPropertyDescriptor(o,c);if(u&&"value"in u){var p=n.get(c);p&&(u.value=M(p))}else if(u===void 0){var v=n.get(c),f=v==null?void 0:v.v;if(v!==void 0&&f!==N)return{enumerable:!0,configurable:!0,value:f,writable:!0}}return u},has(o,c){var f;if(c===di)return!0;var u=n.get(c),p=u!==void 0&&u.v!==N||Reflect.has(o,c);if(u!==void 0||E!==null&&(!p||(f=rn(o,c))!=null&&f.writable)){u===void 0&&(u=r(()=>{var m=p?Qe(o[c]):N,h=ee(m);return h}),n.set(c,u));var v=M(u);if(v===N)return!1}return p},set(o,c,u,p){var j;var v=n.get(c),f=c in o;if(i&&c==="length")for(var m=u;mee(N)),n.set(m+"",h))}if(v===void 0)(!f||(j=rn(o,c))!=null&&j.writable)&&(v=r(()=>ee(void 0)),V(v,Qe(u)),n.set(c,v));else{f=v.v!==N;var b=r(()=>Qe(u));V(v,b)}var C=Reflect.getOwnPropertyDescriptor(o,c);if(C!=null&&C.set&&C.set.call(p,u),!f){if(i&&typeof c=="string"){var L=n.get("length"),z=Number(c);Number.isInteger(z)&&z>=L.v&&V(L,z+1)}on(s)}return!0},ownKeys(o){M(s);var c=Reflect.ownKeys(o).filter(v=>{var f=n.get(v);return f===void 0||f.v!==N});for(var[u,p]of n)p.v!==N&&!(u in o)&&c.push(u);return c},setPrototypeOf(){kr()}})}var ds,ca,ua,fa;function nl(){if(ds===void 0){ds=window,ca=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;ua=rn(t,"firstChild").get,fa=rn(t,"nextSibling").get,is(e)&&(e[Mi]=void 0,e[Dn]=null,e[hr]=void 0,e.__e=void 0),is(n)&&(n[Yt]=void 0)}}function gt(e=""){return document.createTextNode(e)}function Ye(e){return ua.call(e)}function yn(e){return fa.call(e)}function R(e,t){return Ye(e)}function pa(e,t=!1){{var n=Ye(e);return n instanceof Comment&&n.data===""?yn(n):n}}function J(e,t=1,n=!1){let i=e;for(;t--;)i=yn(i);return i}function il(e){e.textContent=""}function ha(){return!1}function va(e,t,n){return t==null||t===Us?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function ma(e){var t=S,n=E;ge(null),Pe(null);try{return e()}finally{ge(t),Pe(n)}}function sl(e){E===null&&(S===null&&yr(),wr()),tt&&br()}function al(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function it(e,t){var n=E;n!==null&&(n.f&Q)!==0&&(e|=Q);var i={ctx:Y,deps:null,nodes:null,f:e|q|ve,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};x==null||x.register_created_effect(i);var s=i;if((e&fn)!==0)Tt!==null?Tt.push(i):xt.ensure().schedule(i);else if(t!==null){try{qt(i)}catch(r){throw ie(i),r}s.deps===null&&s.teardown===null&&s.nodes===null&&s.first===s.last&&(s.f&jt)===0&&(s=s.first,(e&ke)!==0&&(e&It)!==0&&s!==null&&(s.f|=It))}if(s!==null&&(s.parent=n,n!==null&&al(s,n),S!==null&&(S.f&U)!==0&&(e&et)===0)){var a=S;(a.effects??(a.effects=[])).push(s)}return i}function Gi(){return S!==null&&!Me}function rl(e){const t=it(ei,null);return F(t,I),t.teardown=e,t}function ll(e){sl();var t=E.f,n=!S&&(t&$e)!==0&&Y!==null&&!Y.i;if(n){var i=Y;(i.e??(i.e=[])).push(e)}else return ga(e)}function ga(e){return it(fn|pr,e)}function ol(e){xt.ensure();const t=it(et|jt,e);return(n={})=>new Promise(i=>{n.outro?bt(t,()=>{ie(t),i(void 0)}):(ie(t),i(void 0))})}function dl(e){return it(At|jt,e)}function cl(e,t=0){return it(ei|t,e)}function ot(e,t=[],n=[],i=[]){Ur(i,t,n,s=>{it(ei,()=>{e(...s.map(M))})})}function Ki(e,t=0){var n=it(ke|t,e);return n}function he(e){return it($e|jt,e)}function ba(e){var t=e.teardown;if(t!==null){const n=tt,i=S;cs(!0),ge(null);try{t.call(null)}finally{cs(n),ge(i)}}}function qi(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&ma(()=>{s.abort(ti)});var i=n.next;(n.f&et)!==0?n.parent=null:ie(n,t),n=i}}function ul(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&$e)===0&&ie(t),t=n}}function ie(e,t=!0){var n=!1;(t||(e.f&fr)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(wa(e.nodes.start,e.nodes.end),n=!0),e.f|=as,qi(e,t&&!n),pn(e,0);var i=e.nodes&&e.nodes.t;if(i!==null)for(const a of i)a.stop();ba(e),e.f^=as,e.f|=me;var s=e.parent;s!==null&&s.first!==null&&ya(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function wa(e,t){for(;e!==null;){var n=e===t?null:yn(e);e.remove(),e=n}}function ya(e){var t=e.parent,n=e.prev,i=e.next;n!==null&&(n.next=i),i!==null&&(i.prev=n),t!==null&&(t.first===e&&(t.first=i),t.last===e&&(t.last=n))}function bt(e,t,n=!0){var i=[];xa(e,i,!0);var s=()=>{n&&ie(e),t&&t()},a=i.length;if(a>0){var r=()=>--a||s();for(var o of i)o.out(r)}else s()}function xa(e,t,n){if((e.f&Q)===0){e.f^=Q;var i=e.nodes&&e.nodes.t;if(i!==null)for(const o of i)(o.is_global||n)&&t.push(o);for(var s=e.first;s!==null;){var a=s.next;if((s.f&et)===0){var r=(s.f&It)!==0||(s.f&$e)!==0&&(e.f&ke)!==0;xa(s,t,r?n:!1)}s=a}}}function Un(e){_a(e,!0)}function _a(e,t){if((e.f&Q)!==0){e.f^=Q,(e.f&I)===0&&(F(e,q),xt.ensure().schedule(e));for(var n=e.first;n!==null;){var i=n.next,s=(n.f&It)!==0||(n.f&$e)!==0;_a(n,s?t:!1),n=i}var a=e.nodes&&e.nodes.t;if(a!==null)for(const r of a)(r.is_global||t)&&r.in()}}function Ui(e,t){if(e.nodes)for(var n=e.nodes.start,i=e.nodes.end;n!==null;){var s=n===i?null:yn(n);t.append(n),n=s}}let Hn=!1,tt=!1;function cs(e){tt=e}let S=null,Me=!1;function ge(e){S=e}let E=null;function Pe(e){E=e}let ze=null;function ka(e){S!==null&&(ze??(ze=new Set)).add(e)}let te=null,ae=0,de=null;function fl(e){de=e}let Ma=1,dt=0,wt=dt;function us(e){wt=e}function Sa(){return++Ma}function xn(e){var t=e.f;if((t&q)!==0)return!0;if(t&U&&(e.f&=~yt),(t&De)!==0){for(var n=e.deps,i=n.length,s=0;se.wv)return!0}(t&ve)!==0&&K===null&&F(e,I)}return!1}function $a(e,t,n=!0){var i=e.reactions;if(i!==null&&!(ze!==null&&ze.has(e)))for(var s=0;s{e.ac.abort(ti)}),e.ac=null);try{e.f|=Gn;var p=e.fn,v=p();e.f|=Ut;var f=e.deps,m=x==null?void 0:x.is_fork;if(te!==null){var h;if(m||pn(e,ae),f!==null&&ae>0)for(f.length=ae+te.length,h=0;h{throw L});throw f}}finally{e[ct]=t,delete e.currentTarget,ge(p),Pe(v)}}}var Rs;const fi=((Rs=globalThis==null?void 0:globalThis.window)==null?void 0:Rs.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function gl(e){return(fi==null?void 0:fi.createHTML(e))??e}function bl(e){var t=va("template");return t.innerHTML=gl(e.replaceAll("","")),t.content}function jn(e,t){var n=E;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function be(e,t){var n=(t&Cr)!==0,i=(t&Lr)!==0,s,a=!e.startsWith("");return()=>{s===void 0&&(s=bl(a?e:""+e),n||(s=Ye(s)));var r=i||ca?document.importNode(s,!0):s.cloneNode(!0);if(n){var o=Ye(r),c=r.lastChild;jn(o,c)}else jn(r,r);return r}}function ce(e,t){e!==null&&e.before(t)}function ye(e,t){var n=t==null?"":typeof t=="object"?`${t}`:t;n!==(e[Yt]??(e[Yt]=e.nodeValue))&&(e[Yt]=n,e.nodeValue=`${n}`)}function za(e,t){return wl(e,t)}const An=new Map;function wl(e,{target:t,anchor:n,props:i={},events:s,context:a,intro:r=!0,transformError:o}){nl();var c=void 0,u=ol(()=>{var p=n??t.appendChild(gt());Nr(p,{pending:()=>{}},m=>{Ws({});var h=Y;a&&(h.c=a),s&&(i.$$events=s),c=e(m,i)||{},Js()},o);var v=new Set,f=m=>{for(var h=0;h{var C;for(var m of v)for(const L of[t,document]){var h=An.get(L),b=h.get(m);--b==0?(L.removeEventListener(m,hs),h.delete(m),h.size===0&&An.delete(L)):h.set(m,b)}Ai.delete(f),p!==n&&((C=p.parentNode)==null||C.removeChild(p))}});return yl.set(c,u),c}let yl=new WeakMap;var _e,Ce,le,vt,bn,wn,Zn;class xl{constructor(t,n=!0){se(this,"anchor");_(this,_e,new Map);_(this,Ce,new Map);_(this,le,new Map);_(this,vt,new Set);_(this,bn,!0);_(this,wn,t=>{if(d(this,_e).has(t)){var n=d(this,_e).get(t),i=d(this,Ce).get(n);if(i)Un(i),d(this,vt).delete(n);else{var s=d(this,le).get(n);s&&(Un(s.effect),d(this,Ce).set(n,s.effect),d(this,le).delete(n),s.fragment.lastChild.remove(),this.anchor.before(s.fragment),i=s.effect)}for(const[a,r]of d(this,_e)){if(d(this,_e).delete(a),a===t)break;const o=d(this,le).get(r);o&&(ie(o.effect),d(this,le).delete(r))}for(const[a,r]of d(this,Ce)){if(a===n||d(this,vt).has(a))continue;const o=()=>{if(Array.from(d(this,_e).values()).includes(a)){var u=document.createDocumentFragment();Ui(r,u),u.append(gt()),d(this,le).set(a,{effect:r,fragment:u})}else ie(r);d(this,vt).delete(a),d(this,Ce).delete(a)};d(this,bn)||!i?(d(this,vt).add(a),bt(r,o,!1)):o()}}});_(this,Zn,t=>{d(this,_e).delete(t);const n=Array.from(d(this,_e).values());for(const[i,s]of d(this,le))n.includes(i)||(ie(s.effect),d(this,le).delete(i))});this.anchor=t,y(this,bn,n)}ensure(t,n){var i=x,s=ha();if(n&&!d(this,Ce).has(t)&&!d(this,le).has(t))if(s){var a=document.createDocumentFragment(),r=gt();a.append(r),d(this,le).set(t,{effect:he(()=>n(r)),fragment:a})}else d(this,Ce).set(t,he(()=>n(this.anchor)));if(d(this,_e).set(i,t),s){for(const[o,c]of d(this,Ce))o===t?i.unskip_effect(c):i.skip_effect(c);for(const[o,c]of d(this,le))o===t?i.unskip_effect(c.effect):i.skip_effect(c.effect);i.oncommit(d(this,wn)),i.ondiscard(d(this,Zn))}else d(this,wn).call(this,i)}}_e=new WeakMap,Ce=new WeakMap,le=new WeakMap,vt=new WeakMap,bn=new WeakMap,wn=new WeakMap,Zn=new WeakMap;function pi(e,t,n=!1){var i=new xl(e),s=n?It:0;function a(r,o){i.ensure(r,o)}Ki(()=>{var r=!1;t((o,c=0)=>{r=!0,a(c,o)}),r||a(-1,null)},s)}function Vn(e,t){return t}function _l(e,t,n){for(var i=[],s=t.length,a,r=t.length,o=0;o{if(a){if(a.pending.delete(v),a.done.add(v),a.pending.size===0){var f=e.outrogroups;zi(e,Xn(a.done)),f.delete(a),f.size===0&&(e.outrogroups=null)}}else r-=1},!1)}if(r===0){var c=i.length===0&&n!==null;if(c){var u=n,p=u.parentNode;il(p),p.append(u),e.items.clear()}zi(e,t,!c)}else a={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(a)}function zi(e,t,n=!0){var i;if(e.pending.size>0){i=new Set;for(const r of e.pending.values())for(const o of r)i.add(e.items.get(o).e)}for(var s=0;s{var z=n();return Is(z)?z:z==null?[]:Xn(z)}),v,f=new Map,m=!0;function h(z){(L.effect.f&me)===0&&(L.pending.delete(z),L.fallback=u,kl(L,v,r,t,i),u!==null&&(v.length===0?(u.f&Ie)===0?Un(u):(u.f^=Ie,tn(u,null,r)):bt(u,()=>{u=null})))}function b(z){L.pending.delete(z)}var C=Ki(()=>{v=M(p);for(var z=v.length,j=new Set,oe=x,Oe=ha(),k=0;ka(r)):(u=he(()=>a(vs??(vs=gt()))),u.f|=Ie)),z>j.size&&gr(),!m)if(f.set(oe,j),Oe){for(const[Wt,Ke]of o)j.has(Wt)||oe.skip_effect(Ke.e);oe.oncommit(h),oe.ondiscard(b)}else h(oe);M(p)}),L={effect:C,items:o,pending:f,outrogroups:null,fallback:u};m=!1}function Qt(e){for(;e!==null&&(e.f&$e)===0;)e=e.next;return e}function kl(e,t,n,i,s){var G;var a=t.length,r=e.items,o=Qt(e.effect.first),c,u=null,p=[],v=[],f,m,h,b;for(b=0;b0){var A=a===0?n:null;_l(e,Oe,A)}}}function Ml(e,t,n,i,s,a,r,o){var c=(r&$r)!==0?(r&Tr)===0?el(n,!1,!1):_t(n):null,u=(r&Er)!==0?_t(s):null;return{v:c,i:u,e:he(()=>(a(t,c??n,u??s,o),()=>{e.delete(i)}))}}function tn(e,t,n){if(e.nodes)for(var i=e.nodes.start,s=e.nodes.end,a=t&&(t.f&Ie)===0?t.nodes.start:n;i!==null;){var r=yn(i);if(a.before(i),i===s)return;i=r}}function qe(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Sl(e,t,n=!1,i=!1,s=!1,a=!1){var r=e,o="";if(n)var c=e;ot(()=>{var u=E;if(o!==(o=t()??"")){if(n){u.nodes=null,c.innerHTML=o,o!==""&&jn(Ye(c),c.lastChild);return}if(u.nodes!==null&&(wa(u.nodes.start,u.nodes.end),u.nodes=null),o!==""){var p=i?Ar:s?zr:void 0,v=va(i?"svg":s?"math":"template",p);v.innerHTML=o;var f=i||s?v:v.content;if(jn(Ye(f),f.lastChild),i||s)for(;Ye(f);)r.before(Ye(f));else r.before(f)}}})}function $l(e,t,n){var i=e==null?"":""+e;return i===""?null:i}function ms(e,t,n,i,s,a){var r=e[Mi];if(r!==n||r===void 0){var o=$l(n);o==null?e.removeAttribute("class"):e.className=o,e[Mi]=n}return a}const El=Symbol("is custom element"),Tl=Symbol("is html");function Cl(e,t,n,i){var s=Ll(e);s[t]!==(s[t]=n)&&(n==null?e.removeAttribute(t):typeof n!="string"&&Al(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function Ll(e){return e[Dn]??(e[Dn]={[El]:e.nodeName.includes("-"),[Tl]:e.namespaceURI===Us})}var gs=new Map;function Al(e){var t=e.getAttribute("is")||e.nodeName,n=gs.get(t);if(n)return n;gs.set(t,n=[]);for(var i,s=e,a=Element.prototype;a!==s;){i=lr(s);for(var r in i)i[r].set&&r!=="innerHTML"&&r!=="textContent"&&r!=="innerText"&&n.push(r);s=Gs(s)}return n}function zl(e){Y===null&&vr(),ll(()=>{const t=La(e);if(typeof t=="function")return t})}let hn=localStorage.getItem("mc_token")||"";function Da(){return hn}function Dl(e){hn=(e||"").trim(),localStorage.setItem("mc_token",hn)}function Pl(){const e={"Content-Type":"application/json"};return hn&&(e["X-MC-Token"]=hn),e}function _n(){return localStorage.getItem("mc_hf_token")||""}function Ol(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function $(e,t={}){const n=await fetch(e,{headers:Pl(),...t}),i=await n.json().catch(()=>({}));if(!n.ok)throw new Error(i.error||"HTTP "+n.status);return i}const l=(e,t=document)=>t.querySelector(e),bs=(e,t=document)=>[...t.querySelectorAll(e)];function g(e){return String(e??"").replace(/[&<>]/g,t=>({"&":"&","<":"<",">":">"})[t])}let ws;function w(e,t=!1){const n=l("#toast");n&&(n.textContent=e,n.className="toast show"+(t?" err":""),clearTimeout(ws),ws=setTimeout(()=>n.className="toast",3200))}function Bl(e,t){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${t!=null?` ${Math.round(t)}%`:""}`:'bereit'}const D=e=>`${e}`,Pa={logo:D(''),grid:D(''),cpu:D(''),pulse:D(''),server:D(''),book:D(''),help:D(''),settings:D(''),swap:D(''),monitor:D(''),layers:D(''),alert:D(''),gauge:D(''),search:D(''),compass:D(''),code:D(''),eye:D(''),refresh:D(''),file:D(''),database:D(''),thermo:D(''),shield:D(''),info:D(''),chevron:D(''),bolt:D(''),x:D(''),check:D(''),download:D(''),clock:D('')};function nt(e){return Pa[e]||""}function Jn(e){return`${Pa.info}`}function rt(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 Ee({title:e,body:t,confirmLabel:n="Bestätigen",cancelLabel:i="Abbrechen",danger:s=!1}){return new Promise(a=>{const r=document.createElement("div");r.className="modal-overlay",r.innerHTML=``;const o=c=>{r.remove(),a(c)};r.addEventListener("click",c=>{if(c.target===r)return o(!1);const u=c.target.closest("[data-x]");u&&o(u.getAttribute("data-x")==="1")}),document.body.appendChild(r),r.querySelector('[data-x="1"]').focus()})}function Oa({title:e,body:t="",placeholder:n="",password:i=!1,confirmLabel:s="Weiter",danger:a=!1}){return new Promise(r=>{const o=document.createElement("div");o.className="modal-overlay",o.innerHTML=``;const c=o.querySelector("input"),u=p=>{o.remove(),r(p)};o.addEventListener("click",p=>{if(p.target===o)return u(null);const v=p.target.closest("[data-x]");v&&u(v.getAttribute("data-x")==="1"?c.value||"":null)}),c.addEventListener("keydown",p=>{p.key==="Enter"&&u(c.value||""),p.key==="Escape"&&u(null)}),document.body.appendChild(o),c.focus()})}function Hl(e="overview"){const t=bs(".nav-item[data-view]:not(.disabled)"),n=bs(".view[data-view]"),i=new Set(n.map(a=>a.dataset.view));function s(a){i.has(a)||(a=e),n.forEach(r=>r.hidden=r.dataset.view!==a),t.forEach(r=>r.classList.toggle("active",r.dataset.view===a)),location.hash!=="#/"+a&&(location.hash="#/"+a)}return t.forEach(a=>a.addEventListener("click",r=>{r.preventDefault(),s(a.dataset.view)})),window.addEventListener("hashchange",()=>s(location.hash.replace("#/",""))),s(location.hash.replace("#/","")||e),{show:s}}let ys=ee(null);const Rl={get value(){return M(ys)},set(e){V(ys,e,!0)}};let xs=ee(Qe([]));const Fl={get value(){return M(xs)},set(e){V(xs,e||[],!0)}},Nl="5";var Fs;typeof window<"u"&&((Fs=window.__svelte??(window.__svelte={})).v??(Fs.v=new Set)).add(Nl);const Il=[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → wähle deinen Anwendungsfall (z.B. „Coden") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität.
  2. Verbinden: Tab Verbinden → Basis-URL kopieren → in deinem Tool (z.B. OpenCode) als „OpenAI-kompatibel" einfügen. Verbindung testen bestätigt, dass es läuft.
  3. Arbeiten: Im Tool das Modell (z.B. coder) wählen und loslegen. Das passende Modell wird automatisch geladen — du musst nichts starten.
`],["Wie leere ich den Kontext? Machen die Tools das selbst?",`

Kurz: meistens ja, automatisch. Der Kontext (das „Gedächtnis") gilt pro Unterhaltung. Startest du im Tool einen neuen Chat / eine neue Session, ist der Kontext wieder leer — das Tool verwaltet das Fenster für dich.

Du musst nur selten eingreifen: wird ein Gespräch sehr lang, fang einen neuen an. Wichtig: „Grafikspeicher leeren" (Tab Server) ist etwas anderes — das wirft das Modell aus dem Speicher, nicht den Gesprächsverlauf.

`],["Was passiert, wenn der Kontext volläuft?",`

Ist das Kontextfenster voll, passiert je nach Tool eins von dreien: das Modell vergisst den Anfang (älteste Nachrichten fallen raus), das Tool kürzt automatisch, oder du bekommst einen Fehler wie „context length exceeded".

So gehst du vor:

  1. Neuen Chat starten — der einfachste Reset, Kontext ist wieder leer.
  2. Zusammenfassen lassen: „Fasse unseren Stand kurz zusammen", dann im neuen Chat einfügen.
  3. Kontext vergrößern: Tab ModelleKonfigurieren → wir zeigen das Optimum für deine Hardware (mehr Kontext = mehr Speicherbedarf).
`],["Was ist ein Agent — und wann brauche ich einen?",`

Ein nacktes Modell schreibt nur Text zurück. Ein Agent ist ein Programm drumherum, das das Modell handeln lässt: Dateien lesen und ändern, Befehle ausführen, im Web suchen — Schritt für Schritt in einer Schleife, bis die Aufgabe erledigt ist.

Wann lohnt sich was?

  • Fragen, Texte, Erklärungen, Brainstorming → kein Agent nötig, eine Chat-Oberfläche wie OpenWebUI reicht völlig.
  • Coden über mehrere Dateien, Befehle ausführen, recherchieren + umsetzenAgent (OpenCode, Cline, Continue).

Gut zu wissen: Diese Agenten laufen lokal auf deinem PC — du brauchst keinen Cloud-Dienst.

`],["Was sind Skills — und wie installiere ich sie?",`

Ein Skill ist verpacktes Können: eine kurze Anleitung, die dem Agenten beibringt, eine wiederkehrende Aufgabe jedes Mal so zu erledigen, wie du es willst.

Skill vs. MCP: MCP gibt dem Agenten neue Werkzeuge. Skills geben ihm Know-how. Kurz: Werkzeuge = MCP, Anleitungen = Skills.

Installieren: meist nur eine Datei ablegen — kein Build, kein Neustart:

  1. Pro Projekt: in den Projektordner (z.B. AGENTS.md, .clinerules/).
  2. Global: in den Konfig-Ordner des Tools — gilt überall.
`],["MCP — deinem Agenten echte Werkzeuge geben",`

MCP (Model Context Protocol) ist ein einheitlicher „Stecker", über den ein Agent zusätzliche Werkzeuge bekommt: das Web durchsuchen, Dateien lesen, eine Datenbank abfragen.

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.

  • Faustregel: Fehlt dem Agenten eine Fähigkeit → MCP. Soll er etwas nur besser machen → Skill.
`],["Auto-Swap — wie das Laden funktioniert",`

llama-swap lädt automatisch das Modell, das gerade angefragt wird, und entlädt es nach einer Leerlaufzeit wieder. Es läuft immer nur eines gleichzeitig.

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.

`],["Die empfohlenen Tools optimal nutzen",`
  • OpenCode: Autonomes Coden im Terminal/Editor — ideal für „bau mir Feature X".
  • Cline: Dasselbe als VS-Code-Erweiterung, mit Bestätigung vor jeder Aktion.
  • OpenWebUI: Klassische Chat-Oberfläche für Fragen/Texte.

Tipp: starkes Modell (coder) für schwere Aufgaben, schnelles (scout) für einfache — du wählst es einfach im Tool aus.

`]],Gl=[["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 Kl=be('
'),ql=be('

'),Ul=be('

Guide für Einsteiger

Praktische Workflows + die Local-LLM-Welt in Klartext — ohne Vorwissen.

Tutorials & Workflows

Konzepte kurz erklärt

',1);function jl(e){var t=Ul(),n=J(pa(t),4);Wn(n,21,()=>Il,Vn,(s,a,r)=>{var o=rs(()=>ss(M(a),2));let c=()=>M(o)[0],u=()=>M(o)[1];var p=Kl();p.open=r===0;var v=R(p),f=R(v),m=J(v,2);Sl(m,u,!0),ot(()=>ye(f,c())),ce(s,p)});var i=J(n,4);Wn(i,21,()=>Gl,Vn,(s,a)=>{var r=rs(()=>ss(M(a),2));let o=()=>M(r)[0],c=()=>M(r)[1];var u=ql(),p=R(u),v=R(p),f=J(p,2),m=R(f);ot(()=>{ye(v,o()),ye(m,c())}),ce(s,u)}),ce(e,t)}var Vl=be('
'),Wl=be('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),Jl=be('
Lade News… (erstes Laden kann kurz dauern)
'),Ql=be('
'),Yl=be('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),Zl=be('für dich'),Xl=be('
'),eo=be('
'),to=be('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function no(e,t){Ws(t,!0);let n=ee(Qe([])),i=ee(Qe([])),s=ee(!0),a=ee("");const r=k=>k==="perfect"?"ok":k==="marginal"?"warn":"bad";function o(k){const A=Math.max(0,Date.now()/1e3-k);return A<60?A+"s":A<3600?Math.floor(A/60)+"m":A<86400?Math.floor(A/3600)+"h":Math.floor(A/86400)+"d"}async function c(){V(s,!0),V(a,"");try{V(n,(await $("/api/news")).items||[],!0)}catch(k){V(a,k.message||"Fehler beim Laden",!0)}finally{V(s,!1)}}async function u(){try{V(i,(await $("/api/cookbook/upgrades")).upgrades||[],!0)}catch{V(i,[],!0)}}async function p(k,A){var G;A.disabled=!0,A.textContent="Starte…";try{await $("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:k.repo,role:k.role,params_b:k.params_b,quant:k.quant,hf_token:_n()})}),(G=document.querySelector(".nav-item[data-view='activity']"))==null||G.dispatchEvent(new MouseEvent("click"))}catch(O){A.disabled=!1,A.textContent="Installieren",alert("Fehler: "+O.message)}}function v(){c(),u()}zl(()=>{c(),u()});var f=to(),m=pa(f),h=J(R(m),2),b=J(m,2);{var C=k=>{var A=Wl(),G=R(A),O=J(R(G),2),Wt=R(O),Ke=J(G,4);Wn(Ke,21,()=>M(i),Vn,($n,Be)=>{var En=Vl(),Jt=R(En),Tn=R(Jt),Cn=R(Tn),si=R(Cn),Ln=J(Cn,2),ai=R(Ln),st=J(Tn,2),ri=R(st),nr=J(Jt,2);ot(li=>{ye(si,M(Be).name),ms(Ln,1,`fit-badge ${li??""}`),ye(ai,M(Be).fit.text),ye(ri,`Ersetzt dein „${M(Be).old??""}". ${M(Be).why??""}`)},[()=>r(M(Be).fit.level)]),fs("click",nr,li=>p(M(Be),li.currentTarget)),ce($n,En)}),ot(()=>ye(Wt,M(i).length)),ce(k,A)};pi(b,k=>{M(i).length&&k(C)})}var L=J(b,2);{var z=k=>{var A=Jl();ce(k,A)},j=k=>{var A=Ql(),G=R(A);ot(()=>ye(G,M(a))),ce(k,A)},oe=k=>{var A=Yl();ce(k,A)},Oe=k=>{var A=eo();Wn(A,21,()=>M(n),Vn,(G,O,Wt)=>{var Ke=Xl();ms(Ke,1,`news-card${Wt===0?" featured":""}`);var $n=R(Ke),Be=R($n),En=R(Be),Jt=J(Be,2);{var Tn=st=>{var ri=Zl();ce(st,ri)};pi(Jt,st=>{M(O).relevant&&st(Tn)})}var Cn=J(Jt,2),si=R(Cn),Ln=J($n,2),ai=R(Ln);ot(st=>{Cl(Ke,"href",M(O).link),ye(En,M(O).source),ye(si,st),ye(ai,M(O).title)},[()=>M(O).ts?o(M(O).ts):""]),ce(G,Ke)}),ce(k,A)};pi(L,k=>{M(s)?k(z):M(a)?k(j,1):M(n).length?k(Oe,-1):k(oe,2)})}fs("click",h,v),ce(e,f),Js()}ml(["click"]);let Ge=null,ne=null;const Ba=new Set(["running","ready","loading","starting"]);function ji(){return(Ge==null?void 0:Ge.models)||[]}function Ha(){return ji().find(e=>Ba.has(e.state))}function io(e){var t;(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null||t.click()}async function so(){if(await Ee({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Beim nächsten Aufruf lädt das jeweilige Modell einfach neu — es geht nichts verloren.",confirmLabel:"Speicher freigeben"}))try{await $("/api/unload",{method:"POST"}),w("Speicher freigegeben."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(t){w(t.message,!0)}}window.mcOv={go:io,freeMemory:so};function Vi(){let e="Verbinde…",t="";if(Ge){const n=ji().length,i=Ha();Ge.swap_ok?ne&&ne.ram.percent>=90?(e="Achtung: Speicher wird knapp.",t=`Arbeitsspeicher bei ${Math.round(ne.ram.percent)} % — eventuell Speicher freigeben.`):(e="Alles läuft rund.",t=`${n} ${n===1?"Modell":"Modelle"} bereit · ${i?`„${i.name}" geladen`:"keins geladen"} · keine Warnungen.`):(e="LLM-Engine offline",t="Der llama-swap-Dienst antwortet gerade nicht.")}l("#ov-hero").innerHTML=`

${g(e)}

${g(t)}
`}function Mt(e,t,n,i="",s=""){return`
${e}
${t}
${n}
`}function ao(e){return e==null?"":e<55?"kühl & gesund":e<72?"normal":"läuft heiß"}function Wi(){const e=Ha(),t=Ge==null?void 0:Ge.swap_ok;let n=Mt("LLM-Engine",t?"Online":"Offline","llama-swap",t?"ok":"bad"),i=Mt("Aktives Modell",e?g(e.name):"Keins",e?"im Grafikspeicher":"nichts geladen"),s,a;if(ne){const r=ne.gpu_temp??ne.cpu.temp;s=Mt("GPU-Temperatur",r!=null?`${Math.round(r)}°`:"–",ao(r),"",r!=null&&r<72?"ok":"");const o=ne.ram.total-ne.ram.used;a=Mt("Freier Speicher",`${(o/1024**3).toFixed(0)} GB`,`von ${(ne.ram.total/1024**3).toFixed(0)} GB`)}else s=Mt("GPU-Temperatur","–","messe…"),a=Mt("Freier Speicher","–","messe…");l("#ov-tiles").innerHTML=n+i+s+a}function hi(e,t){const n=Math.max(0,Math.min(100,t||0)),i=n>=90?"bad":n>=75?"warn":"";return`
${e} ${Math.round(n)} %
`}function Ra(){const e=`

System-Gesundheit

So ausgelastet ist dein Mini-PC gerade.
`;if(!ne){l("#ov-health").innerHTML=e+'
Warte auf Messwerte…
';return}let t=0;const n=ne.gpu;n&&n.vram.total+n.gtt.total>0&&(t=(n.vram.used+n.gtt.used)/(n.vram.total+n.gtt.total)*100),l("#ov-health").innerHTML=e+hi("Prozessor (CPU)",ne.cpu.percent)+hi("Arbeitsspeicher (RAM)",ne.ram.percent)+hi("Grafikspeicher (VRAM)",t)}function vi(e,t,n,i,s){return``}function Fa(){l("#ov-quickstart").innerHTML=`

Schnellstart

Die häufigsten Aufgaben — ein Klick.
`+vi("search","teal","Modell finden","Passend zu deiner Hardware","window.mcOv.go('cookbook')")+vi("refresh","amber","Speicher freigeben","Modelle entladen · fragt vorher nach","window.mcOv.freeMemory()")+vi("file","blue","Logs ansehen","Live mitlesen, was läuft","window.mcOv.go('server')")}function ro(e){return e?e.includes("Bild")?'Bild':e.includes("Code")?'Code':'Text':""}function lo(e){var r,o;const t=e.state==="downloading",n=Ba.has(e.state),i=e.state==="loading"||e.state==="starting"||t?"load":n?"on":"";let s;t?s=`↓ Download${e.download_progress!=null?` ${Math.round(e.download_progress)}%`:""}`:s=n?e.state==="loading"?"lädt…":"geladen":"bereit";const a=(r=e.meta)!=null&&r.filename?`
${g(e.meta.filename)}
`:"";return`
${g(e.name)}${ro((o=e.meta)==null?void 0:o.caps)}
${a}
${g(s)}
`}async function oo(){const e=l("#ov-news");if(!e)return;const t=`

Top-News

Alle →
`;e.innerHTML=t+'
Lade…
';try{const n=((await $("/api/news")).items||[]).slice(0,4);e.innerHTML=t+(n.length?`
${n.map(i=>`
${g(i.title)}
${g(i.source)}
`).join("")}
`:'
Keine News.
')}catch{e.innerHTML=t+'
News gerade nicht ladbar.
'}}function Na(){const e=ji();l("#ov-stack").innerHTML=`

Dein Stack

${e.length?e.length+" konfiguriert":""}
`+(e.length?`
${e.map(lo).join("")}
`:`
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
`)}function co(){Vi(),Wi(),Ra(),Fa(),Na()}function uo(){Fa(),co(),oo()}function fo(e){Ge=e,Vi(),Wi(),Na()}function po(e){ne=e,Vi(),Wi(),Ra()}const ho={id:"overview",mount:uo,onStatus:fo,onSystem:po};let _s=[];const vo="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr (längere Dateien/Chats), braucht aber mehr Speicher und wird etwas langsamer.",mo="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.",go=[{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"}];let je=[];function kn(){document.dispatchEvent(new Event("mc:refresh"))}function bo(e){return Bl(e.state,e.download_progress)}function wo(e){return e?`${g(e)}`:""}function yo(e){return`
API-Name: ${(e.api_ids&&e.api_ids.length?e.api_ids:[e.name]).map(n=>`${g(n)}`).join('·')}
`}function xo(e){return e!=null&&e.length?e.map(t=>t==="Code"?'Code':t==="Bild"?'Bild':'Text').join(" "):"–"}function _o(e){if(!e)return"–";const t=e.quant||"?",n=e.ctx?Math.round(e.ctx/1024)+"K":"?",i=e.size_bytes?(e.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${g(t)} · ${n} · ${i}`}function ko(){l("#m-head").innerHTML=`

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.
`,l("#m-chat").innerHTML=`

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.
`,l("#m-table").innerHTML=`

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
ModellKannDetailsStatusPortAktionen
`,l("#chat-btn").addEventListener("click",Ao),l("#cfg-close").addEventListener("click",()=>l("#cfg-modal").style.display="none"),l("#cfg-modal").addEventListener("click",e=>{e.target.id==="cfg-modal"&&(l("#cfg-modal").style.display="none")}),l("#cfg-save").addEventListener("click",Co),l("#role-close").addEventListener("click",()=>l("#role-modal").style.display="none"),l("#role-modal").addEventListener("click",e=>{e.target.id==="role-modal"&&(l("#role-modal").style.display="none")}),l("#role-save").addEventListener("click",()=>Pi(l("#role-custom").value.trim().toLowerCase())),l("#role-clear").addEventListener("click",()=>Pi("")),l("#m-table").addEventListener("click",e=>{var s,a;const t=e.target.closest("[data-action]");if(!t)return;const n=t.getAttribute("data-name"),i=t.getAttribute("data-action");n&&(i==="cfg"?To(n):i==="role"?Mo(n):i==="unload"?Lo(n):i==="del"?Eo(n):i==="copy"?((s=navigator.clipboard)==null||s.writeText(n),w("Kopiert: "+n)):i==="assign"&&(w("Lade im Cookbook ein Modell und setze den Alias auf: "+n),(a=document.querySelector(".nav-item[data-view='cookbook']"))==null||a.click()))})}let Di=null;function Mo(e){Di=e;const t=je.find(n=>n.name===e);l("#role-model-name").textContent=e,l("#role-custom").value="",l("#role-chips").innerHTML=go.map(n=>``).join(""),l("#role-chips").querySelectorAll("[data-rolepick]").forEach(n=>n.addEventListener("click",()=>Pi(n.getAttribute("data-rolepick")))),l("#role-modal").style.display="flex"}async function Pi(e){if(Di)try{await $("/api/set_role",{method:"POST",body:JSON.stringify({alias:Di,role:e})}),w(e?`Rolle gesetzt: ${e}`:"Rolle entfernt."),l("#role-modal").style.display="none",kn()}catch(t){w(t.message,!0)}}function Ia(){const e=l("#models");if(!e)return;l("#models-empty").style.display=je.length?"none":"flex",l("#m-count").textContent=je.length?je.length+" konfiguriert":"";const t=l("#chat-model"),n=t.value;t.innerHTML="",e.innerHTML=je.map(i=>{var a,r;if(i.incomplete)return` ${g(i.name)}
kein Modell hinterlegt
leere Rolle leer `;const s=(a=i.meta)!=null&&a.filename?`
${g(i.meta.filename)}
`:"";return`
${g(i.name)}${wo(i.role)}
${s}${yo(i)} ${xo((r=i.meta)==null?void 0:r.caps)} ${_o(i.meta)} ${bo(i)} ${i.port??"auto"} `}).join("");for(const i of je)i.incomplete||t.insertAdjacentHTML("beforeend",``);n&&(t.value=n)}function So(e){je=(e==null?void 0:e.models)||[],Ia()}function $o(e){_s=e||[],_s.some(n=>(n.state==="running"||n.state==="queued")&&/^download\b/i.test(n.label))&&Ia()}async function Eo(e){if(await Ee({title:`„${e}" wirklich löschen?`,body:"Das Modell wird aus der Konfiguration ausgetragen und seine Dateien werden von der Festplatte gelöscht, um Speicher freizugeben. Das lässt sich nicht rückgängig machen — später brauchst du dafür einen neuen Download.",confirmLabel:"Endgültig löschen",danger:!0}))try{const n=await $("/api/delete_model",{method:"POST",body:JSON.stringify({alias:e})});w(n.note||"Gelöscht: "+e),setTimeout(kn,600)}catch(n){w(n.message,!0)}}function To(e){var s,a,r,o,c;const t=je.find(u=>u.name===e);if(!t)return;l("#cfg-model-name").textContent=t.name,l("#cfg-ctx").value=((s=t.meta)==null?void 0:s.ctx)||8192;const n=(a=t.meta)==null?void 0:a.optimal_ctx,i=l("#cfg-rec");if(n){const u=((r=t.meta)==null?void 0:r.ctx)||0,p=(o=t.meta)==null?void 0:o.peak_ram_gb,v=(c=t.meta)==null?void 0:c.peak_ram_optimal_gb;l("#cfg-rec-note").innerHTML=`Optimal ~${Math.round(n/1024)}k → ~${v} GB Spitzenbedarf.
Aktuell ~${Math.round(u/1024)}k → ~${p} GB.`,l("#cfg-rec-apply").onclick=()=>{l("#cfg-ctx").value=n},i.style.display="flex"}else i.style.display="none";l("#cfg-modal").style.display="flex"}async function Co(){const e=l("#cfg-model-name").textContent,t=parseInt(l("#cfg-ctx").value)||8192;l("#cfg-save").disabled=!0;try{await $("/api/update_model",{method:"POST",body:JSON.stringify({alias:e,ctx:t})}),w("Gespeichert — aktiv beim nächsten Modell-Start."),l("#cfg-modal").style.display="none",kn()}catch(n){w(n.message,!0)}l("#cfg-save").disabled=!1}async function Lo(e){if(await Ee({title:`„${e}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await $("/api/unload?model="+encodeURIComponent(e),{method:"POST"}),w("Entladen: "+e),setTimeout(kn,600)}catch(t){w(t.message,!0)}}async function Ao(){const e=l("#chat-model").value,t=l("#chat-msg").value.trim();if(!e)return w("Kein Modell vorhanden.",!0);if(!t)return;const n=l("#chat-btn");n.disabled=!0,n.textContent="…";const i=l("#chat-reply");i.style.display="block",i.textContent="(wecke Modell, kann beim Laden kurz dauern…)";try{const s=await $("/api/chat",{method:"POST",body:JSON.stringify({model:e,message:t})});i.textContent=s.reply}catch(s){i.textContent="Fehler: "+s.message}n.disabled=!1,n.textContent="Senden",kn()}const zo={id:"models",mount:ko,onStatus:So,onJobs:$o},dn=new Set;let lt=[],B=null;function Ji(e){dn.add(e),Vt()}const Ue={cpu:[],ram:[],gpu:[]},Do=60;function Po(e){return e==="done"?'fertig':e==="failed"?'fehler':e==="canceled"?'abgebrochen':'läuft…'}function Oo(e){return e==="done"?"on":e==="failed"||e==="canceled"?"":"load"}function Bo(e){if(e.state!=="running")return null;if(typeof e.progress=="number")return Math.min(100,e.progress);const n=((e.log||[])[e.log.length-1]||"").match(/(\d+(?:\.\d+)?)\s*%/);return n?Math.min(100,parseFloat(n[1])):null}function Ho(e){return e==null||e<0?"":e>=90?`noch ~${Math.round(e/60)} min`:`noch ~${Math.max(1,Math.round(e))} s`}async function Ro(e){try{await $(`/api/jobs/${e}/cancel`,{method:"POST"}),w("Abbruch angefordert…"),Vt()}catch(t){w(t.message,!0)}}async function Fo(e){try{await $(`/api/jobs/${e}`,{method:"DELETE"}),Vt()}catch(t){w(t.message,!0)}}async function No(){try{const e=await $("/api/jobs/clear",{method:"POST"});w(`${e.removed} Einträge entfernt.`),Vt()}catch(e){w(e.message,!0)}}function mi(e,t,n){return`
${e}
${t}
${n}
`}function gi(e,t){return'
'+e.map(n=>`
`).join("")+"
"}function ks(){const e=B==null?void 0:B.gpu;return e&&e.vram.total+e.gtt.total>0?(e.vram.used+e.gtt.used)/(e.vram.total+e.gtt.total)*100:0}function Ga(){if(!B)return;Ue.cpu.push(B.cpu.percent),Ue.ram.push(B.ram.percent),Ue.gpu.push(ks());for(const s of["cpu","ram","gpu"])Ue[s].length>Do&&Ue[s].shift();const e=l("#act-kpis");e&&(e.innerHTML=mi("Prozessor (CPU)",`${Math.round(B.cpu.percent)} %`,B.cpu.temp!=null?`${Math.round(B.cpu.temp)}° CPU-Temp`:"Auslastung")+mi("Arbeitsspeicher",`${Math.round(B.ram.percent)} %`,`${rt(B.ram.used)} / ${rt(B.ram.total)}`)+mi("Grafikspeicher",`${Math.round(ks())} %`,B.gpu_temp!=null?`${Math.round(B.gpu_temp)}° GPU-Temp`:"VRAM + GTT"));const t=B.gpu,n=t&&t.vram.total+t.gtt.total>0?`${rt(t.vram.used+t.gtt.used)} / ${rt(t.vram.total+t.gtt.total)}`:"–",i=l("#act-sys");i&&(i.innerHTML=`

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)${rt(B.ram.used)} / ${rt(B.ram.total)}
Grafikspeicher (VRAM + GTT)${n}
Speicherplatz (Disk)${Math.round(B.disk.percent)} % belegt
Temperatur (GPU / CPU)${B.gpu_temp!=null?Math.round(B.gpu_temp)+"°":"–"} / ${B.cpu.temp!=null?Math.round(B.cpu.temp)+"°":"–"}
CPU-Verlauf
${gi(Ue.cpu,"--accent")}
RAM-Verlauf
${gi(Ue.ram,"--purple")}
VRAM-Verlauf
${gi(Ue.gpu,"--on")}
`)}function Io(){l("#act-head").innerHTML=`

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.
`,l("#v-activity").innerHTML=`

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
`,l("#v-activity").addEventListener("click",e=>{if(e.target.closest("#jobs-clear")){No();return}const t=e.target.closest("[data-cancel]");if(t){e.stopPropagation(),Ro(t.getAttribute("data-cancel"));return}const n=e.target.closest("[data-del]");if(n){e.stopPropagation(),Fo(n.getAttribute("data-del"));return}const i=e.target.closest(".job-h");if(!i)return;const s=i.getAttribute("data-id");dn.has(s)?dn.delete(s):dn.add(s),Vt()}),B&&Ga()}function Vt(){const e=l("#jobs");if(!e)return;l("#jobs-empty").style.display=lt.length?"none":"flex";const t=lt.filter(s=>s.state==="failed").length,n=lt.filter(s=>s.state!=="running"&&s.state!=="queued").length;l("#job-count").textContent=lt.length?t?t+" Fehler":lt.length+" gesamt":"";const i=l("#jobs-clear");i&&(i.style.display=n?"":"none"),e.innerHTML=lt.map(s=>{const a=dn.has(s.id)?`
${g((s.log||[]).join(` `))}
`:"",r=Bo(s),o=r!=null?`
`:"",c=s.state==="running"?Ho(s.eta_s):"",u=s.state==="running"&&s.rate_bps?rt(s.rate_bps)+"/s":"",p=[c,u].filter(Boolean).join(" · "),v=r!=null?`${Math.round(r)} %${p?` · ${p}`:""}`:"",f=s.state==="running"?``:``;return`
${g(s.label)}${v}${f}${Po(s.state)}
${o}${a}
`}).join("")}function Go(e){lt=e||[],Vt()}function Ko(e){B=e,l("#act-sys")&&Ga()}const qo={id:"jobs",mount:Io,onJobs:Go,onSystem:Ko};function Qi(){document.dispatchEvent(new Event("mc:refresh"))}function at(e,t,n,i,s){return``}function Uo(){l("#wartung").outerHTML=`

Server & Wartung

Dienste steuern, Updates einspielen und live mitlesen — ganz ohne SSH oder Terminal.

LLM-Engine (llama-swap)

prüfe…
Das Herzstück: llama-swap lädt bei jeder Anfrage automatisch das passende Modell und entlädt die anderen — es läuft immer nur eines gleichzeitig.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle
Wie ansteuern? In deinem Tool (Zed/OpenCode) die obige Adresse als OpenAI-Basis-URL eintragen und einen Modellnamen oder eine Rolle angeben (siehe „Verbinden"). Eine einzige Anfrage genügt — das Modell wird automatisch geweckt.

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.
${at("w-restart-swap","refresh","teal","LLM-Engine neustarten","Startet llama-swap neu. Geladene Modelle werden kurz entladen (~5 Sek), laden danach automatisch wieder.")} ${at("w-restart-mc","refresh","blue","Dashboard neustarten","Startet diese Oberfläche neu. Sie trennt kurz und verbindet automatisch wieder.")} ${at("w-self-update","download","teal","Mission Control aktualisieren","Holt die neueste Dashboard-Version aus Gitea und startet automatisch neu (~10 Sek).")} ${at("w-update","bolt","blue","LLM-Engine aktualisieren","Lädt die neueste llama.cpp-Version (ROCm) für deine GPU und installiert sie.")} ${at("w-unload","database","amber","Grafikspeicher leeren","Wirft alle aktuell geladenen Modelle aus dem VRAM. Fragt vorher nach.")}

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.
${at("w-os-update","refresh","amber","OS-Updates installieren","Führt apt update & upgrade aus. Kann ein paar Minuten dauern — Fortschritt in der Aktivität.")} ${at("w-reboot","bolt","red","Server neustarten (Reboot)","Bootet den ganzen Bosgame neu. Alles ist für ~1 Minute offline, auch dieses Dashboard.")}

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
Verbinde…
`,l("#w-restart-swap").addEventListener("click",()=>Ss("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),l("#w-restart-mc").addEventListener("click",()=>Ss("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder. Laufende Downloads laufen weiter.")),l("#w-self-update").addEventListener("click",Qo),l("#w-update").addEventListener("click",Zo),l("#w-unload").addEventListener("click",Jo),l("#w-os-update").addEventListener("click",Xo),l("#w-reboot").addEventListener("click",ed),l("#w-console-sel").addEventListener("change",Ms),l("#w-update-cancel").addEventListener("click",Wo),l("#w-swap-check").addEventListener("click",jo),Oi&&Ka(Oi),Ms()}let Oi=null;function Ka(e){const t=l("#w-swap-state");if(!t)return;const n=!!(e!=null&&e.swap_ok);t.textContent=n?"● erreichbar":"● offline",t.style.cssText="margin-left:auto;"+(n?"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"),l("#w-swap-url").textContent=((e==null?void 0:e.swap_url)||"—")+"/v1";const i=(e==null?void 0:e.models)||[],s=i.find(r=>r.state==="running"||r.state==="loading");l("#w-swap-loaded").innerHTML=s?`${g(s.name)} (${g(s.state)})`:'nichts geladen — lädt bei der nächsten Anfrage';const a=i.filter(r=>!r.incomplete).length;l("#w-swap-count").textContent=a?`${a} bereit`:"keine"}async function jo(){const e=l("#w-swap-check-res");e.textContent="prüfe…",e.style.color="var(--mut)";try{const t=await $("/api/integration/test");t.ok?(e.style.color="#7ee29a",e.textContent=`✓ Engine antwortet — ${t.models.length} Modell(e): ${t.models.join(", ")}`):(e.style.color="#ff9b95",e.textContent="✗ keine Verbindung: "+t.error)}catch(t){e.style.color="#ff9b95",e.textContent="✗ "+t.message}}function Vo(e){Oi=e,Ka(e)}async function Wo(){if(Le&&await Ee({title:Le.label+" abbrechen?",body:"Der laufende Vorgang wird gestoppt. Bei einem Download bleibt eine unvollständige Datei zurück (kannst du später neu starten).",confirmLabel:"Abbrechen",danger:!0}))try{await $(`/api/jobs/${Le.id}/cancel`,{method:"POST"}),w("Abbruch angefordert…")}catch(e){w(e.message,!0)}}let St=null;function Ms(){St&&(St.close(),St=null);const e=l("#w-console-sel").value,t=l("#w-console");t.textContent="Verbinde mit "+e+`… `;const n=location.protocol==="https:"?"wss:":"ws:";St=new WebSocket(`${n}//${location.host}/api/logs/${e}?token=${encodeURIComponent(Da())}`),St.onmessage=i=>{t.textContent+=i.data,t.scrollTop=t.scrollHeight},St.onclose=()=>{t.textContent+=` — Verbindung getrennt —`}}async function Ss(e,t,n){if(await Ee({title:t,body:n,confirmLabel:"Neustarten"}))try{await $(`/api/service/${e}/restart`,{method:"POST"}),w("Neustart ausgelöst: "+e),setTimeout(Qi,2e3)}catch(i){w(i.message,!0)}}async function Jo(){if(await Ee({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 $("/api/unload",{method:"POST"}),w("Grafikspeicher geleert."),setTimeout(Qi,600)}catch(e){w(e.message,!0)}}async function Qo(){if(await Ee({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 e=await $("/api/self-update",{method:"POST"});w("Update läuft — Dashboard startet gleich neu."),Ji(e.job_id)}catch(e){w(e.message,!0)}}let Le=null;const $s=new Set;function qa(e,t){Le={id:e,label:t};const n=l("#w-update-card");n&&(n.style.display="",l("#w-update-label").textContent=t+" läuft…",l("#w-update-badge").innerHTML='läuft…',l("#w-update-log").textContent="Starte…",n.scrollIntoView({behavior:"smooth",block:"nearest"}))}function Yo(e){if(!Le)return;const t=(e||[]).find(v=>v.id===Le.id),n=l("#w-update-card");if(!t||!n)return;n.style.display="";const i=l("#w-update-log");i&&(i.textContent=(t.log||[]).join(` `),i.scrollTop=i.scrollHeight);const s=t.state==="done",a=t.state==="failed",r=t.state==="canceled",o=s||a||r,c=l("#w-update-badge");c&&(c.innerHTML=s?'✓ fertig':a?'✗ fehlgeschlagen':r?'abgebrochen':'läuft…');let u=null;if(!o)if(typeof t.progress=="number")u=t.progress;else{const f=((t.log||[])[t.log.length-1]||"").match(/(\d+(?:\.\d+)?)\s*%/);f&&(u=parseFloat(f[1]))}const p=l("#w-update-bar");p&&(u!=null?(p.style.display="",p.querySelector("i").style.width=Math.min(100,u)+"%"):p.style.display="none"),l("#w-update-cancel").style.display=o?"none":"",o&&(l("#w-update-label").textContent=Le.label+(s?" — erfolgreich abgeschlossen.":r?" — abgebrochen.":" — fehlgeschlagen (siehe Protokoll)."),$s.has(t.id)||($s.add(t.id),w(s?"✓ "+Le.label+" abgeschlossen.":r?Le.label+" abgebrochen.":"✗ "+Le.label+" fehlgeschlagen.",a),s&&setTimeout(Qi,800)))}async function Zo(){if(await Ee({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 e=await $("/api/update",{method:"POST"});w("LLM-Engine-Update läuft."),Ji(e.job_id),qa(e.job_id,"LLM-Engine-Update")}catch(e){w(e.message,!0)}}async function Xo(){if(!await Ee({title:"OS-Updates installieren?",body:"Führt apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const e=await Oa({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(e)try{const t=await $("/api/os-update",{method:"POST",body:JSON.stringify({password:e})});w("OS-Update gestartet."),Ji(t.job_id),qa(t.job_id,"OS-Update")}catch(t){w(t.message,!0)}}async function ed(){if(!await Ee({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 e=await Oa({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(e)try{await $("/api/reboot",{method:"POST",body:JSON.stringify({password:e})}),w("Reboot ausgelöst — bis gleich.")}catch(t){w(t.message,!0)}}const td={id:"server",mount:Uo,onJobs:Yo,onStatus:Vo},nd="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",Ua="GGUF ist das lokal lauffähige Dateiformat. Unsere Engine lädt nur GGUF — Repos ohne GGUF-Datei kann sie nicht nutzen.",id="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.",sd={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},ad=[{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 ja(e){const t=(e||"").toLowerCase();for(const n of ad)if(n.kw.some(i=>t.includes(i)))return n.label;return"Allrounder"}function rd(e=""){const t=e.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(t)||new RegExp("(?MoE${t?` · ~${t}B aktiv`:""}`}function Va(e){return e?`${g(e)}`:""}const od=[{id:"",label:"Alle"},{id:"coder",label:"Coder"},{id:"scout",label:"Scout"},{id:"vision",label:"Vision"},{id:"manager",label:"Manager"},{id:"reviewer",label:"Reviewer"}];let nn=null,sn=[],Ae=null,Dt="",Mn=[],Wa=null,cn=[];const dd={perfect:0,marginal:1,too_tight:2},Sn=e=>e==="perfect"?"ok":e==="marginal"?"warn":"bad",cd=e=>e==="perfect"?"Passt locker":e==="marginal"?"Wird knapp":"Zu groß";function ud(){const e=l(".view[data-view='cookbook']");e.innerHTML=`

Modell-Cookbook

Wofür willst du es nutzen? Wir empfehlen das passende Setup für deine Hardware.

Wofür möchtest du es nutzen?

deine Hardware
Lade Setups…

Aktuell beste Modelle für dein System

Automatisch aus vertrauenswürdigen Quellen (HuggingFace) — laufend aktuell, gefiltert auf das, was auf deine Hardware passt.
Lade aktuelle Empfehlungen…
Profi-Modus: HuggingFace direkt durchsuchen
passt locker läuft, aber knapp zu groß für deinen Speicher
Es werden nur Modelle im GGUF-Format ${Jn(Ua)} gezeigt — nur die laufen lokal.
`,Ja(),l("#cb-btn-search").addEventListener("click",Rn),l("#cb-search").addEventListener("keydown",t=>{t.key==="Enter"&&Rn()}),l("#cb-sort").addEventListener("change",()=>{(l("#cb-search").value.trim()||Dt)&&Rn()}),l("#cb-modal-close").addEventListener("click",()=>l("#cb-modal").style.display="none"),l("#cb-modal").addEventListener("click",t=>{t.target.id==="cb-modal"&&(l("#cb-modal").style.display="none")}),l("#cb-m-download").addEventListener("click",Td),l("#cb-m-files").addEventListener("change",Sd),l("#cb-m-ctx").addEventListener("change",Cs),window.cbSetCtx=t=>{l("#cb-m-ctx").value=t,Cs()},l("#cb-r-close").addEventListener("click",()=>l("#cb-recipe-modal").style.display="none"),l("#cb-recipe-modal").addEventListener("click",t=>{t.target.id==="cb-recipe-modal"&&(l("#cb-recipe-modal").style.display="none")}),l("#cb-new-open").addEventListener("click",gd),l("#cb-new-close").addEventListener("click",()=>l("#cb-new-modal").style.display="none"),l("#cb-new-modal").addEventListener("click",t=>{t.target.id==="cb-new-modal"&&(l("#cb-new-modal").style.display="none")}),l("#cb-new-add").addEventListener("click",()=>l("#cb-new-models").insertAdjacentHTML("beforeend",Xi())),l("#cb-new-models").addEventListener("click",t=>{const n=t.target.closest(".cb-nm-del");n&&n.closest(".cb-nm-row").remove()}),l("#cb-new-save").addEventListener("click",wd),l("#cb-disc-refresh").addEventListener("click",()=>Es(!0)),l("#cb-discover").addEventListener("click",t=>{const n=t.target.closest("[data-inst]");n&&vd(n.getAttribute("data-inst"),n.getAttribute("data-role"),n.getAttribute("data-pb"),n)}),Qa(),Zi(),Es()}function fd(e){const t=Date.now()/1e3-e;return t<90?"gerade eben":t<3600?`vor ${Math.round(t/60)} min`:t<86400?`vor ${Math.round(t/3600)} h`:`vor ${Math.round(t/86400)} Tg.`}async function Es(e=!1){const t=l("#cb-discover"),n=l("#cb-disc-when"),i=l("#cb-disc-refresh");e&&(i.disabled=!0,i.textContent="Suche…",t.innerHTML='
Frage Quellen ab…
');try{const s=await $("/api/cookbook/discover"+(e?"?force=true":""));n&&(n.textContent=s.updated?`aktualisiert ${fd(s.updated)}`:""),pd(s)}catch(s){t.innerHTML=`
Empfehlungen nicht ladbar: ${g(s.message)}
`}i.disabled=!1,i.textContent="Aktualisieren"}function pd(e){const t=l("#cb-discover"),n=e.categories||[];if(!n.length){t.innerHTML='
Keine passenden Modelle gefunden.
';return}t.innerHTML=n.map(i=>`
${nt(i.icon)}

${g(i.title)}

${i.models.map(s=>hd(s,i.recommended)).join("")}
`).join("")}function hd(e,t){const n=(e.requirements||[]).map(o=>`
⚠ ${g(o)}
`).join(""),i=t&&e.repo===t,s=i?'
★ Beste Wahl für dein System
':"",a=`
${Va(sd[e.role]||ja(e.repo))}${Yi(e.repo)}
`,r=e.installed?`✓ installiert`:``;return`
${s}

${g(e.name)}

${g(e.author)} · ${e.params_b}B
${g(e.fit.text)}
${a}
${Ya(e.fit)} · ⬇ ${(e.downloads||0).toLocaleString()}
${n}
${r}
`}async function vd(e,t,n,i){var s;i.disabled=!0,i.textContent="Starte…";try{await $("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:e,role:t,params_b:parseFloat(n)||7,quant:"Q4_K_M",hf_token:_n()})}),w("Download gestartet — siehe Aktivität."),(s=document.querySelector(".nav-item[data-view='activity']"))==null||s.click()}catch(a){w("Fehler: "+a.message,!0),i.disabled=!1,i.textContent="Installieren"}}async function Zi(){try{const e=await $("/api/cookbook/recipes");Mn=e.recipes||[],Wa=e.recommended_id||null,md()}catch(e){l("#cb-recipes").innerHTML=`
Setups nicht ladbar: ${g(e.message)}
`}}function md(){l("#cb-recipes").innerHTML=Mn.map(e=>{const t=e.id===Wa,n=t?'
★ Beste Wahl für dein System
':e.user?'
Dein Setup
':"",i=e.user?` ×`:"";return``}).join(""),l("#cb-recipes").querySelectorAll("[data-recipe]").forEach(e=>e.addEventListener("click",()=>xd(e.getAttribute("data-recipe")))),l("#cb-recipes").querySelectorAll("[data-delr]").forEach(e=>e.addEventListener("click",t=>{t.stopPropagation(),yd(e.getAttribute("data-delr"))})),l("#cb-recipes").querySelectorAll("[data-editr]").forEach(e=>e.addEventListener("click",t=>{t.stopPropagation(),bd(e.getAttribute("data-editr"))}))}function Xi(){return`
`}let Ct=null;function gd(){Ct=null,l("#cb-new-title").value="",l("#cb-new-desc").value="",l("#cb-new-models").innerHTML=Xi(),l("#cb-new-modal-title").textContent="Eigenes Setup erstellen",l("#cb-new-save").textContent="Setup speichern",l("#cb-new-modal").style.display="flex"}function bd(e){const t=Mn.find(n=>n.id===e);t&&(Ct=e,l("#cb-new-title").value=t.title,l("#cb-new-desc").value=t.desc||"",l("#cb-new-models").innerHTML=t.models.map(n=>{const i=document.createElement("div");i.innerHTML=Xi();const s=i.firstElementChild;s.querySelector(".cb-nm-repo").value=n.repo,s.querySelector(".cb-nm-role").value=n.role;const a=s.querySelector(".cb-nm-quant");return a&&[...a.options].forEach(r=>{r.value===n.quant&&(r.selected=!0)}),s.outerHTML}).join(""),l("#cb-new-modal-title").textContent="Setup bearbeiten",l("#cb-new-save").textContent="Änderungen speichern",l("#cb-new-modal").style.display="flex")}async function wd(){const e=l("#cb-new-title").value.trim();if(!e)return w("Bitte einen Titel angeben.",!0);const t=[...l("#cb-new-models").querySelectorAll(".cb-nm-row")].map(i=>({repo:i.querySelector(".cb-nm-repo").value.trim(),role:i.querySelector(".cb-nm-role").value.trim()||"modell",quant:i.querySelector(".cb-nm-quant").value})).filter(i=>i.repo);if(!t.length)return w("Mindestens ein Modell (Repo) angeben.",!0);const n=l("#cb-new-save");n.disabled=!0,n.textContent="Speichere…";try{const i=JSON.stringify({title:e,desc:l("#cb-new-desc").value.trim(),models:t});Ct?(await $("/api/cookbook/user-recipe/"+encodeURIComponent(Ct),{method:"PUT",body:i}),w("Setup aktualisiert.")):(await $("/api/cookbook/user-recipe",{method:"POST",body:i}),w("Setup gespeichert.")),Ct=null,l("#cb-new-modal").style.display="none",Zi()}catch(i){w("Fehler: "+i.message,!0)}n.disabled=!1,n.textContent=Ct?"Änderungen speichern":"Setup speichern"}async function yd(e){const t=Mn.find(n=>n.id===e);if(await Ee({title:`„${t?t.title:e}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await $("/api/cookbook/user-recipe/"+encodeURIComponent(e),{method:"DELETE"}),w("Setup gelöscht."),Zi()}catch(n){w(n.message,!0)}}function xd(e){const t=Mn.find(s=>s.id===e);if(!t)return;l("#cb-r-title").textContent=t.title,l("#cb-r-desc").textContent=t.desc,l("#cb-r-models").innerHTML=`
${t.models.map(s=>`
${g(s.name)}${g(s.role)}${Yi(s.repo)}
${g(s.why)}
~${s.fit.req_gb.toFixed(1)} GB · ~${Math.round(s.fit.tps)} Tok/s · optimal ~${Math.round(s.optimal_ctx/1024)}k Kontext
${g(s.fit.text)}
`).join("")}
`;const n=Math.max(...t.models.map(s=>s.fit.req_gb));l("#cb-r-note").innerHTML=`Größter Spitzenbedarf: ~${n.toFixed(1)} GB. Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt (kein Summieren).`;const i=l("#cb-r-install");i.className=t.fit_level==="too_tight"?"primary warn":"primary",i.textContent=t.fit_level==="too_tight"?"Trotzdem installieren (zu groß)":"Komplettes Setup installieren",i.onclick=()=>_d(t.id),l("#cb-recipe-modal").style.display="flex"}async function _d(e){var n;const t=l("#cb-r-install");t.disabled=!0,t.textContent="Starte…";try{const i=await $("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:e,hf_token:_n()})});w(`Setup wird installiert (${i.count} Modelle) — siehe Aktivität.`),l("#cb-recipe-modal").style.display="none",(n=document.querySelector(".nav-item[data-view='activity']"))==null||n.click()}catch(i){w("Fehler: "+i.message,!0)}t.disabled=!1,t.textContent="Komplettes Setup installieren"}function Ja(){l("#cb-filters").innerHTML=od.map(e=>``).join(""),l("#cb-filters").querySelectorAll("[data-f]").forEach(e=>e.addEventListener("click",()=>{Dt=e.getAttribute("data-f"),Ja(),Rn()}))}function Qa(){var t;const e=l("#cb-hw");e&&(t=nn==null?void 0:nn.ram)!=null&&t.total&&(e.innerHTML=`${nt("cpu")}${Math.round(nn.ram.total/1024**3)} GB Speicher`)}function Ya(e){return`~${e.req_gb.toFixed(1)} GB · ~${Math.round(e.tps)} Tok/s`}function kd(e){e=e.trim();const t=e.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return t?t[1]:/^[\w.-]+\/[\w.-]+$/.test(e)?e:null}async function Rn(){var s;const e=l("#cb-search").value.trim(),t=kd(e);let n=e;if(Dt&&!t&&(n=n?n+" "+Dt:Dt),!n&&!t){l("#cb-grid").innerHTML="";return}const i=l("#cb-btn-search");i.disabled=!0,i.textContent="Lade…",l("#cb-grid").innerHTML='
Suche auf HuggingFace…
';try{if(t)sn=[{id:t,author:t.split("/")[0],downloads:0}],Ts(sn);else{const a=((s=l("#cb-sort"))==null?void 0:s.value)||"downloads",r=`https://huggingface.co/api/models?search=${encodeURIComponent(n)}&filter=gguf&sort=${encodeURIComponent(a)}&direction=-1&limit=40`;sn=await(await fetch(r)).json(),Ts(sn)}}catch(a){l("#cb-grid").innerHTML=`
${g(a.message)}
`}i.disabled=!1,i.textContent="Suchen"}function Ts(e){const t=l("#cb-grid");if(cn=[],!(e!=null&&e.length)){t.innerHTML='
Keine GGUF-Modelle gefunden.
';return}t.innerHTML=e.map((n,i)=>`

${g(n.id.split("/").pop())}

${g(n.author||"")}
prüfe…
${Va(ja(n.id))}${Yi(n.id)}
Hardware-Fit… ⬇ ${(n.downloads||0).toLocaleString()}
`).join(""),t.querySelectorAll("[data-res]").forEach(n=>n.addEventListener("click",()=>Ed(+n.getAttribute("data-res")))),e.forEach((n,i)=>Md(i,n.id))}async function Md(e,t){var n;try{const i=await $("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:t,ctx:8192})}),s=l("#cb-b-"+e),a=l("#cb-m-"+e);if(!s||!a)return;if(!((n=i.files)!=null&&n.length)){s.className="fit-badge",s.style.cssText="background:rgba(139,151,165,.14);color:var(--mut)",s.title=Ua,s.textContent="kein GGUF",a.textContent="—",cn[e]=null,bi();return}let r=i.files.find(o=>{var c;return(c=o.quant)==null?void 0:c.includes("Q4_K_M")})||i.files[0];s.className="fit-badge "+Sn(r.fit.level),s.textContent=r.fit.text,a.textContent=Ya(r.fit)+" · "+(r.quant||"GGUF"),cn[e]=r.fit.level,bi()}catch{const i=l("#cb-b-"+e);i&&(i.className="fit-badge bad",i.textContent="Fehler"),cn[e]=null,bi()}}function bi(){const e=l("#cb-grid");if(!e)return;let t=-1,n=99;if(cn.forEach((s,a)=>{if(s==null)return;const r=dd[s]??99;r{var a;s.classList.remove("res-best"),(a=s.querySelector(".cb-best-tag"))==null||a.remove()}),t<0||n>1)return;const i=e.querySelector(`[data-res="${t}"]`);i&&(i.classList.add("res-best"),i.insertAdjacentHTML("afterbegin",'
★ Beste Wahl für dein System
'))}function es(){const e=l("#cb-m-files").value,t=Ae==null?void 0:Ae.files.find(a=>a.filename===e);if(!t){l("#cb-m-fit").style.display="none";return}l("#cb-m-fit").style.display="flex",l("#cb-m-fit-text").innerHTML=`Bedarf: ~${t.fit.req_gb.toFixed(1)} GB · ${Ae.params_b}B · ${g(t.quant)} · ~${Math.round(t.fit.tps)} Tok/s`,l("#cb-m-fit-badge").innerHTML=`${g(t.fit.text)}`;const n=t.optimal_ctx,i=l("#cb-m-ctx-rec");if(n){const a=l("#cb-m-ctx");a&&(a.value==="8192"||a.value==="")&&(a.value=n)}i&&(i.innerHTML=n?`Empfohlener Kontext für deine Hardware: ~${Math.round(n/1024)}kübernehmen`:"");const s=l("#cb-m-download");t.fit.level==="too_tight"?(s.className="primary warn",s.textContent="Trotzdem holen (zu groß)"):(s.className="primary",s.textContent="Herunterladen & Einpflegen")}function Sd(){es()}async function Cs(){if(!Ae)return;const e=parseInt(l("#cb-m-ctx").value)||8192,t=l("#cb-m-files").value;try{Ae=await $("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:Ae.repo,ctx:e})}),l("#cb-m-files").value=t,es()}catch{}}function $d(e,t){l("#cb-modal").style.display="flex",l("#cb-m-title").textContent=e,l("#cb-m-repo").textContent=t}async function Ed(e){var n;const t=sn[e];if(t){$d(t.id.split("/").pop(),t.id),l("#cb-m-alias").value="",l("#cb-m-files").style.display="none",l("#cb-m-loading").style.display="block",l("#cb-m-download").disabled=!0;try{const i=parseInt(l("#cb-m-ctx").value)||8192;if(Ae=await $("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:t.id,ctx:i})}),l("#cb-m-loading").style.display="none",l("#cb-m-files").style.display="block",!((n=Ae.files)!=null&&n.length)){l("#cb-m-files").innerHTML="",l("#cb-m-fit").style.display="none";return}l("#cb-m-files").innerHTML=Ae.files.map(s=>{const a=s.fit.level==="perfect"?"●":s.fit.level==="marginal"?"◐":"○";return``}).join(""),l("#cb-m-download").disabled=!1,es()}catch(i){l("#cb-m-loading").textContent="Fehler: "+i.message}}}async function Td(){var a;const e=l("#cb-m-repo").textContent,t=l("#cb-m-files").value,n=l("#cb-m-alias").value.trim().toLowerCase(),i=parseInt(l("#cb-m-ctx").value)||8192;if(!e||!t)return w("Bitte eine GGUF-Datei wählen.",!0);const s=l("#cb-m-download");s.disabled=!0,s.textContent="Starte…";try{const r=await $("/api/download",{method:"POST",body:JSON.stringify({repo:e,file:t,hf_token:_n()})});await $("/api/register",{method:"POST",body:JSON.stringify({role:n,model_path:r.expected_path,ctx:i})}),w("Download gestartet — siehe Aktivität."),l("#cb-modal").style.display="none",(a=document.querySelector(".nav-item[data-view='activity']"))==null||a.click()}catch(r){w("Fehler: "+r.message,!0)}s.disabled=!1,s.textContent="Herunterladen & Einpflegen"}function Cd(e){nn=e,Qa()}const Ld={id:"cookbook",mount:ud,onSystem:Cd};let Fn=null,Ls="",Lt="zed",Se=[];window.mcCopyCode=e=>{var i;const t=e.parentElement.querySelector("code,pre");(i=navigator.clipboard)==null||i.writeText((t==null?void 0:t.textContent)||"");const n=e.textContent;e.textContent="Kopiert!",setTimeout(()=>e.textContent=n,1400)};window.mcCopyVal=e=>{var i;const t=e.previousElementSibling;(i=navigator.clipboard)==null||i.writeText(t.value);const n=e.textContent;e.textContent="Kopiert!",setTimeout(()=>e.textContent=n,1400)};window.cnGo=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};window.cnSelectTool=e=>{Lt=e,ts()};window.cnToggleModel=e=>{Se.includes(e)?Se=Se.filter(t=>t!==e):Se.push(e),ts()};function Ad(){return`http://${location.hostname}:8080/v1`}function zd(e){return/^\d{1,3}(\.\d{1,3}){3}$/.test(e)}function Dd(){return location.protocol==="https:"||!zd(location.hostname)}function Xe(){return((Fn==null?void 0:Fn.models)||[]).filter(e=>!e.incomplete)}function Pd(){return Se.length?Se:Xe().map(e=>e.name)}function an(e,t){return`
`}const Za=e=>`${nt("check")}${g(e)}`;function Od(e,t){const i=(t.length?Xe().filter(s=>t.includes(s.name)):Xe().length?Xe():[{name:"coder",meta:{}}]).map(s=>{var o;const r=(((o=s.meta)==null?void 0:o.caps)||[]).some(c=>/Bild|Vision/i.test(c))?', "capabilities": { "tools": true, "images": true }':"";return` { "name": "${s.name}", "display_name": "${s.name}", "max_tokens": 32768${r} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { "api_url": "${e}", "available_models": [ ${i} ] } } }`}function Bd(e,t){const i=(t.length?t:Xe().length?Xe().map(s=>s.name):["coder"]).map(s=>` "${s}": { "name": "${s}" }`).join(`, `);return`"provider": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { "baseURL": "${e}", "apiKey": "local" }, "models": { ${i} } } }`}function Hd(e){return`

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.
${an("Engine-Adresse (für alle Tools)",e)} ${Dd()?`
Du öffnest Mission Control über einen Proxy/Namen (HTTPS o.ä.). Die Engine läuft auf Port 8080 ohne HTTPS direkt am Bosgame. Trag in deinen Tools die LAN-IP ein: http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.
`:""}
`}function Rd(){return`

Wie funktioniert das Auto-Swap?

Kein manuelles Starten nötig
Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden. Du siehst es hier im Dashboard unter „Aktives Modell".
🔄
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 — llama-swap verwaltet das komplett selbst.
🧠
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 (= nie automatisch entladen). Das kleine Modell beantwortet schnelle Fragen sofort, ohne jede Wartezeit.
`}function Fd(){const e=Xe();if(!e.length)return"";const t=e.map(i=>`${g(i.name)}`).join(" ");return`

2 · Modelle auswählen

${Se.length?`${Se.length} von ${e.length} ausgewählt`:"alle werden eingeschlossen"}
Wähle, welche Modelle im Config-Snippet erscheinen sollen. Standardmäßig alle.
${t}
${Se.length?'':""}
`}window.cnClearModels=()=>{Se=[],ts()};function zn(e,t,n){return``}function Nd(){return`

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?
${zn("zed","Zed","Schneller nativer Editor — Empfohlen")} ${zn("opencode","OpenCode","Open-Source Coding-Agent (Terminal/Desktop)")} ${zn("cline","Cline / Cursor","VS Code Extension, Bring-Your-Own-Key")} ${zn("openwebui","OpenWebUI","Browser-Chat-Interface")}
`}function Id(e){const t=Pd(),n=t[0]||"coder";let i="";if(Lt==="zed"){const s=Od(e,t);i=`

Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.

Nur diesen Block einfügen, nicht die ganze Datei ersetzen — sonst gehen andere Einstellungen verloren.
${g(s)}

API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local). Alternativ BOSGAME_API_KEY=local als Umgebungsvariable.

Danach im Agent-Panel das Modell bosgame / ${g(n)} auswählen. Das Auto-Swap lädt es beim ersten Request.
`}else if(Lt==="opencode"){const s=Bd(e,t);i=`

Datei anlegen oder öffnen:

Windows: %USERPROFILE%\\.config\\opencode\\opencode.json
Linux/Mac: ~/.config/opencode/opencode.json
Oder im Projektordner: opencode.json

Nur den "provider"-Block einfügen oder mergen. Falls bereits ein "llama-swap"-Eintrag vorhanden ist: vorher löschen, sonst erscheinen Modelle doppelt.
${g(s)}

Danach in OpenCode /modelsllama-swap/${g(n)} wählen.

Statt alles zu ersetzen: nur den provider-Block in deine bestehende Config einfügen — so bleiben andere Anbieter erhalten.
`}else Lt==="cline"?i=`

In Cline/Cursor den Provider „OpenAI Compatible" wählen und folgende Felder eintragen:

${an("Basis-URL (OpenAI Compatible)",e)} ${an("Modell-ID",n)}
API-Key: ein beliebiger Wert (z.B. local) — llama-swap prüft ihn nicht.
`:Lt==="openwebui"&&(i=`

Settings → Admin Panel → Connections → neue OpenAI-Verbindung:

${an("Basis-URL",e)} ${an("API-Key","dummy-key")}
Nach dem Speichern erscheinen die Modelle automatisch in der Modell-Auswahl.
`);return`

4 · Config-Snippet

${i}
`}function Gd(e){var i;const t=(i=Xe().find(s=>{var a,r;return(r=(a=s.meta)==null?void 0:a.caps)==null?void 0:r.includes("Bild")}))==null?void 0:i.name;if(!t)return"";const n=`curl ${e}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ "model": "${t}", "messages": [{"role":"user","content":[ {"type":"text","text":"Was ist auf dem Bild falsch?"}, {"type":"image_url","image_url":{"url":"data:image/png;base64,"}} ]}] }'`;return`

Bilder einbinden (Vision)

${Za(`„${t}" bereit`)}
Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
${g(n)}
`}function un(){var n;const e=l(".view[data-view='connect']");if(!e)return;const t=Ad();e.innerHTML=`

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.
${Hd(t)} ${Rd()} ${Fd()} ${Nd()} ${Id(t)} ${Gd(t)}`,(n=l("#cn-test"))==null||n.addEventListener("click",Kd)}function ts(){if(!l(".view[data-view='connect'] .card:nth-of-type(3)")){un();return}const t=l(".view[data-view='connect']"),n=t==null?void 0:t.querySelectorAll(".card");if(!n||n.length<3){un();return}un()}async function Kd(){const e=l("#cn-test-result");e.innerHTML='Teste…';try{const t=await $("/api/integration/test");e.innerHTML=t.ok?Za(`Verbunden — ${t.models.length} Modell(e): ${t.models.join(", ")}`):`✗ Keine Verbindung: ${g(t.error)}`}catch(t){e.innerHTML=`✗ ${g(t.message)}`}}function qd(){un()}function Ud(e){Fn=e;const t=((e==null?void 0:e.models)||[]).map(n=>n.name).join(",")+"|"+!!e;t!==Ls&&(Ls=t,un())}const jd={id:"connect",mount:qd,onStatus:Ud},ni=[ho,zo,td,qo,Ld,jd];let As={};function Vd(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function zs(e){var s;const t=document.getElementById("swdot"),n=document.getElementById("swlabel"),i=document.getElementById("top-active-text");if(!e)t&&(t.className="dot off"),n&&(n.textContent="Backend nicht erreichbar"),i&&(i.textContent="Backend offline"),Ds("Backend nicht erreichbar – läuft uvicorn?",!1);else{const a=(e.swap_url||"").replace(/^https?:\/\//,"");t&&(t.className="dot "+(e.swap_ok?"on":"off")),n&&(n.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+a);const r=(e.models||[]).find(c=>c.state==="running");i&&(i.innerHTML=r?`Geladen: ${r.name}`:"Kein Modell im VRAM"),e.swap_ok?Yd():Ds(`LLM-Engine nicht erreichbar unter ${a} – läuft der llama-swap Dienst?`,!0);const o={};for(const c of e.models||[])o[c.name]=c.state;for(const[c,u]of Object.entries(o)){const p=As[c];if(p&&p!==u&&(u==="running"||u==="loading")){Vd();break}}As=o}Wd(e),Rl.set(e);for(const a of ni)(s=a.onStatus)==null||s.call(a,e)}function Wd(e){const t=document.getElementById("sec-chip"),n=document.getElementById("sec-chip-tx");!t||!n||(t.classList.toggle("ok",!!(e!=null&&e.secured)),n.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Jd(e){var t;Fl.set(e||[]);for(const n of ni)(t=n.onJobs)==null||t.call(n,e)}function Qd(e){var t;for(const n of ni)(t=n.onSystem)==null||t.call(n,e)}function Ds(e,t){const n=document.getElementById("alert");n.className="alert"+(t?" warn":""),n.innerHTML=`${e}`,n.style.display="flex"}function Yd(){const e=document.getElementById("alert");e&&(e.style.display="none")}const Zd=e=>{var t;return(t=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:t.click()};function wi(e,t,n,i){const s=document.createElement("span");return s.className="upd-badge"+(t?" "+t:""),s.textContent=e,i&&(s.title=i),s.onclick=()=>Zd(n),s}async function Xa(){try{const e=await $("/api/updates"),t=document.getElementById("update-badges");if(!t)return;const n=e.apt_cache_age_h,i=n!=null&&n>24,s=n!=null?` · apt-Cache: vor ${n}h`:"";t.innerHTML="",t.appendChild(wi(e.os>0?`OS: ${e.os} Updates`:i?"OS: ?":"OS: aktuell",e.os>0||i?"warn":"ok","server",e.os>0?`${e.os} ausstehende Pakete${s}`:i?`apt-Cache veraltet (${n}h)`:`Keine Updates${s}`)),t.appendChild(wi(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),t.appendChild(wi(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function ii(){try{zs(await $("/api/status"))}catch{zs(null)}}async function er(){try{Jd(await $("/api/jobs"))}catch{}}function tr(){const e=window.location.protocol==="https:"?"wss:":"ws:",t=new WebSocket(`${e}//${window.location.host}/api/system/stream`);t.onmessage=n=>{try{Qd(JSON.parse(n.data))}catch{}},t.onclose=()=>{setTimeout(tr,3e3)},t.onerror=()=>t.close()}var Ns;for(const e of ni)(Ns=e.mount)==null||Ns.call(e);const Ps=document.querySelector('.view[data-view="guides"]');Ps&&za(jl,{target:Ps});const Os=document.querySelector('.view[data-view="news"]');Os&&za(no,{target:Os});Hl("overview");const yi=document.getElementById("token");yi&&(yi.value=Da(),yi.addEventListener("change",e=>{Dl(e.target.value),ii()}));const xi=document.getElementById("hf-token");xi&&(xi.value=_n(),xi.addEventListener("change",e=>Ol(e.target.value)));const Bs=document.getElementById("nav-settings"),_i=document.getElementById("settings-modal"),Hs=document.getElementById("sm-close");Bs&&_i&&Hs&&(Bs.addEventListener("click",()=>_i.style.display="flex"),Hs.addEventListener("click",()=>_i.style.display="none"));function Xd(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",ii);ii();er();tr();setInterval(Xd,1e3);setInterval(ii,3e3);setInterval(er,1500);Xa();setInterval(Xa,6e4);