From 6f4f25480afd562fa2aa4fb20517dfbf0aa09482 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 23 Jun 2026 18:25:17 +0200 Subject: [PATCH] feat(v8.3): Memory Import aus Cloud-KIs + Batch-POST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemoryPanel: "Import"-Button öffnet Formular - Jede Zeile wird ein eigener Gedächtnis-Eintrag (Batch-POST) - Kategorie + Quelle (claude/gemini/chatgpt/import) wählbar - Zeilen-Vorschau zeigt erkannte Einträge vor dem Speichern Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/panels/MemoryPanel.svelte | 89 ++++++++++++++++++++++++-- static/dist/main.js | 78 +++++++++++----------- 2 files changed, 126 insertions(+), 41 deletions(-) diff --git a/frontend/src/panels/MemoryPanel.svelte b/frontend/src/panels/MemoryPanel.svelte index 7c2ee7e..b32ab44 100644 --- a/frontend/src/panels/MemoryPanel.svelte +++ b/frontend/src/panels/MemoryPanel.svelte @@ -20,6 +20,15 @@ let editId = $state(null) let editContent = $state('') let editCategory = $state('stable') + let importing = $state(false) + let importText = $state('') + let importCategory = $state('stable') + let importSource = $state('import') + let importBusy = $state(false) + + const importLines = $derived( + importText.split('\n').map(l => l.trim()).filter(l => l.length > 0) + ) const filtered = $derived( filter === 'all' ? memories : memories.filter(m => m.category === filter) @@ -94,6 +103,26 @@ editId = m.id; editContent = m.content; editCategory = m.category } + async function runImport() { + if (importLines.length === 0) return + importBusy = true + let ok = 0 + for (const line of importLines) { + try { + const m = await api('/api/memory', { + method: 'POST', + body: JSON.stringify({ content: line, category: importCategory, source: importSource }) + }) + memories = [m, ...memories] + ok++ + } catch {} + } + importBusy = false + importing = false + importText = '' + toast(`${ok} von ${importLines.length} Einträgen importiert`) + } + $effect(() => { load() }) @@ -102,12 +131,64 @@

Gedächtnis

Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
- +
+ + +
+ +{#if importing} +
+

Import aus Claude / Gemini / ChatGPT

+
+ Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag. +
+ + +
+
+ + +
+
+ + +
+
+ {#if importLines.length > 0} +
{importLines.length} Eintrag/Einträge erkannt
+ {/if} +
+ + +
+
+{/if} + {#if adding}
diff --git a/static/dist/main.js b/static/dist/main.js index edffc01..eec2637 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,75 +1,75 @@ -var sl=Object.defineProperty;var $r=e=>{throw TypeError(e)};var ll=(e,n,a)=>n in e?sl(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a;var vn=(e,n,a)=>ll(e,typeof n!="symbol"?n+"":n,a),Ui=(e,n,a)=>n.has(e)||$r("Cannot "+a);var h=(e,n,a)=>(Ui(e,n,"read from private field"),a?a.call(e):n.get(e)),Oe=(e,n,a)=>n.has(e)?$r("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(e):n.set(e,a),Ce=(e,n,a,s)=>(Ui(e,n,"write to private field"),s?s.call(e,a):n.set(e,a),a),lt=(e,n,a)=>(Ui(e,n,"access private method"),a);var yr=Array.isArray,ol=Array.prototype.indexOf,zi=Array.prototype.includes,Fi=Array.from,dl=Object.defineProperty,ii=Object.getOwnPropertyDescriptor,cl=Object.getOwnPropertyDescriptors,vl=Object.prototype,ul=Array.prototype,cs=Object.getPrototypeOf,Ir=Object.isExtensible;const pl=()=>{};function fl(e){for(var n=0;n{e=s,n=l});return{promise:a,resolve:e,reject:n}}function na(e,n){if(Array.isArray(e))return e;if(n===void 0||!(Symbol.iterator in e))return Array.from(e);const a=[];for(const s of e)if(a.push(s),a.length===n)break;return a}const tn=2,Ka=4,Ki=8,us=1<<24,Cn=16,zn=32,sa=64,sr=128,kn=512,Ht=1024,Xt=2048,Kn=4096,an=8192,wn=16384,Ha=32768,lr=1<<25,Na=65536,Pi=1<<17,hl=1<<18,Ja=1<<19,gl=1<<20,Bn=1<<25,Sa=65536,Di=1<<21,Pa=1<<22,ra=1<<23,Da=Symbol("$state"),ml=Symbol(""),Si=Symbol("attributes"),or=Symbol("class"),dr=Symbol("style"),Xa=Symbol("text"),Mi=Symbol("form reset"),Ni=new class extends Error{constructor(){super(...arguments);vn(this,"name","StaleReactionError");vn(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var ss;const bl=!!((ss=globalThis.document)!=null&&ss.contentType)&&globalThis.document.contentType.includes("xml");function ps(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function _l(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function yl(e,n,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function xl(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function kl(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function wl(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Sl(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Ml(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function El(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Al(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Cl(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Tl=1,zl=2,fs=4,Pl=8,Dl=16,$l=1,Il=2,Ut=Symbol("uninitialized"),hs="http://www.w3.org/1999/xhtml",Ll="http://www.w3.org/2000/svg",Ol="http://www.w3.org/1998/Math/MathML";function Bl(){console.warn("https://svelte.dev/e/derived_inert")}function Rl(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Fl(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function gs(e){return e===this.v}function Kl(e,n){return e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function"}function ms(e){return!Kl(e,this.v)}let en=null;function qa(e){en=e}function Pn(e,n=!1,a){en={p:en,i:!1,c:null,e:null,s:e,x:null,r:He,l:null}}function Dn(e){var n=en,a=n.e;if(a!==null){n.e=null;for(var s of a)Fs(s)}return n.i=!0,en=n.p,{}}function bs(){return!0}let ca=[];function _s(){var e=ca;ca=[],fl(e)}function _a(e){if(ca.length===0&&!si){var n=ca;queueMicrotask(()=>{n===ca&&_s()})}ca.push(e)}function Nl(){for(;ca.length>0;)_s()}function ys(e){var n=He;if(n===null)return Ge.f|=ra,e;if((n.f&Ha)===0&&(n.f&Ka)===0)throw e;aa(e,n)}function aa(e,n){if(!(n!==null&&(n.f&wn)!==0)){for(;n!==null;){if((n.f&sr)!==0){if((n.f&Ha)===0)throw e;try{n.b.error(e);return}catch(a){e=a}}n=n.parent}throw e}}const ql=-7169;function Vt(e,n){e.f=e.f&ql|n}function xr(e){(e.f&kn)!==0||e.deps===null?Vt(e,Ht):Vt(e,Kn)}function xs(e){if(e!==null)for(const n of e)(n.f&tn)===0||(n.f&Sa)===0||(n.f^=Sa,xs(n.deps))}function ks(e,n,a){(e.f&Xt)!==0?n.add(e):(e.f&Kn)!==0&&a.add(e),xs(e.deps),Vt(e,Ht)}function Wl(e){let n=0,a=Ea(0),s;return()=>{Cr()&&(t(a),qi(()=>(n===0&&(s=Qa(()=>e(()=>li(a)))),n+=1,()=>{_a(()=>{n-=1,n===0&&(s==null||s(),s=void 0,li(a))})})))}}var Vl=Na|Ja;function Gl(e,n,a,s){new jl(e,n,a,s)}var mn,_r,bn,fa,sn,_n,nn,pn,Vn,ha,ea,$a,pi,fi,Gn,Oi,Ft,Ul,Hl,Jl,cr,Ei,Ai,vr,ur;class jl{constructor(n,a,s,l){Oe(this,Ft);vn(this,"parent");vn(this,"is_pending",!1);vn(this,"transform_error");Oe(this,mn);Oe(this,_r,null);Oe(this,bn);Oe(this,fa);Oe(this,sn);Oe(this,_n,null);Oe(this,nn,null);Oe(this,pn,null);Oe(this,Vn,null);Oe(this,ha,0);Oe(this,ea,0);Oe(this,$a,!1);Oe(this,pi,new Set);Oe(this,fi,new Set);Oe(this,Gn,null);Oe(this,Oi,Wl(()=>(Ce(this,Gn,Ea(h(this,ha))),()=>{Ce(this,Gn,null)})));var o;Ce(this,mn,n),Ce(this,bn,a),Ce(this,fa,c=>{var d=He;d.b=this,d.f|=sr,s(c)}),this.parent=He.b,this.transform_error=l??((o=this.parent)==null?void 0:o.transform_error)??(c=>c),Ce(this,sn,Tr(()=>{lt(this,Ft,cr).call(this)},Vl))}defer_effect(n){ks(n,h(this,pi),h(this,fi))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!h(this,bn).pending}update_pending_count(n,a){lt(this,Ft,vr).call(this,n,a),Ce(this,ha,h(this,ha)+n),!(!h(this,Gn)||h(this,$a))&&(Ce(this,$a,!0),_a(()=>{Ce(this,$a,!1),h(this,Gn)&&Wa(h(this,Gn),h(this,ha))}))}get_effect_pending(){return h(this,Oi).call(this),t(h(this,Gn))}error(n){if(!h(this,bn).onerror&&!h(this,bn).failed)throw n;fe!=null&&fe.is_fork?(h(this,_n)&&fe.skip_effect(h(this,_n)),h(this,nn)&&fe.skip_effect(h(this,nn)),h(this,pn)&&fe.skip_effect(h(this,pn)),fe.oncommit(()=>{lt(this,Ft,ur).call(this,n)})):lt(this,Ft,ur).call(this,n)}}mn=new WeakMap,_r=new WeakMap,bn=new WeakMap,fa=new WeakMap,sn=new WeakMap,_n=new WeakMap,nn=new WeakMap,pn=new WeakMap,Vn=new WeakMap,ha=new WeakMap,ea=new WeakMap,$a=new WeakMap,pi=new WeakMap,fi=new WeakMap,Gn=new WeakMap,Oi=new WeakMap,Ft=new WeakSet,Ul=function(){try{Ce(this,_n,yn(()=>h(this,fa).call(this,h(this,mn))))}catch(n){this.error(n)}},Hl=function(n){const a=h(this,bn).failed;a&&Ce(this,pn,yn(()=>{a(h(this,mn),()=>n,()=>()=>{})}))},Jl=function(){const n=h(this,bn).pending;n&&(this.is_pending=!0,Ce(this,nn,yn(()=>n(h(this,mn)))),_a(()=>{var a=Ce(this,Vn,document.createDocumentFragment()),s=Hn();a.append(s),Ce(this,_n,lt(this,Ft,Ai).call(this,()=>yn(()=>h(this,fa).call(this,s)))),h(this,ea)===0&&(h(this,mn).before(a),Ce(this,Vn,null),xa(h(this,nn),()=>{Ce(this,nn,null)}),lt(this,Ft,Ei).call(this,fe))}))},cr=function(){try{if(this.is_pending=this.has_pending_snippet(),Ce(this,ea,0),Ce(this,ha,0),Ce(this,_n,yn(()=>{h(this,fa).call(this,h(this,mn))})),h(this,ea)>0){var n=Ce(this,Vn,document.createDocumentFragment());Pr(h(this,_n),n);const a=h(this,bn).pending;Ce(this,nn,yn(()=>a(h(this,mn))))}else lt(this,Ft,Ei).call(this,fe)}catch(a){this.error(a)}},Ei=function(n){this.is_pending=!1,n.transfer_effects(h(this,pi),h(this,fi))},Ai=function(n){var a=He,s=Ge,l=en;Nn(h(this,sn)),Sn(h(this,sn)),qa(h(this,sn).ctx);try{return Ma.ensure(),n()}catch(o){return ys(o),null}finally{Nn(a),Sn(s),qa(l)}},vr=function(n,a){var s;if(!this.has_pending_snippet()){this.parent&<(s=this.parent,Ft,vr).call(s,n,a);return}Ce(this,ea,h(this,ea)+n),h(this,ea)===0&&(lt(this,Ft,Ei).call(this,a),h(this,nn)&&xa(h(this,nn),()=>{Ce(this,nn,null)}),h(this,Vn)&&(h(this,mn).before(h(this,Vn)),Ce(this,Vn,null)))},ur=function(n){h(this,_n)&&(cn(h(this,_n)),Ce(this,_n,null)),h(this,nn)&&(cn(h(this,nn)),Ce(this,nn,null)),h(this,pn)&&(cn(h(this,pn)),Ce(this,pn,null));var a=h(this,bn).onerror;let s=h(this,bn).failed;var l=!1,o=!1;const c=()=>{if(l){Fl();return}l=!0,o&&Cl(),h(this,pn)!==null&&xa(h(this,pn),()=>{Ce(this,pn,null)}),lt(this,Ft,Ai).call(this,()=>{lt(this,Ft,cr).call(this)})},d=v=>{try{o=!0,a==null||a(v,c),o=!1}catch(p){aa(p,h(this,sn)&&h(this,sn).parent)}s&&Ce(this,pn,lt(this,Ft,Ai).call(this,()=>{try{return yn(()=>{var p=He;p.b=this,p.f|=sr,s(h(this,mn),()=>v,()=>c)})}catch(p){return aa(p,h(this,sn).parent),null}}))};_a(()=>{var v;try{v=this.transform_error(n)}catch(p){aa(p,h(this,sn)&&h(this,sn).parent);return}v!==null&&typeof v=="object"&&typeof v.then=="function"?v.then(d,p=>aa(p,h(this,sn)&&h(this,sn).parent)):d(v)})};function Ql(e,n,a,s){const l=kr;var o=e.filter(y=>!y.settled),c=n.map(l);if(a.length===0&&o.length===0){s(c);return}var d=He,v=Zl(),p=o.length===1?o[0].promise:o.length>1?Promise.all(o.map(y=>y.promise)):null;function _(y){if((d.f&wn)===0){v();try{s([...c,...y])}catch(T){aa(T,d)}$i()}}var A=ws();if(a.length===0){p.then(()=>_([])).finally(A);return}function m(){Promise.all(a.map(y=>Yl(y))).then(_).catch(y=>aa(y,d)).finally(A)}p?p.then(()=>{v(),m(),$i()}):m()}function Zl(){var e=He,n=Ge,a=en,s=fe;return function(o=!0){Nn(e),Sn(n),qa(a),o&&(e.f&wn)===0&&(s==null||s.activate(),s==null||s.apply())}}function $i(e=!0){Nn(null),Sn(null),qa(null),e&&(fe==null||fe.deactivate())}function ws(){var e=He,n=e.b,a=fe,s=!!(n!=null&&n.is_rendered());return n==null||n.update_pending_count(1,a),a.increment(s,e),()=>{n==null||n.update_pending_count(-1,a),a.decrement(s,e)}}function kr(e){var n=tn|Xt;return He!==null&&(He.f|=Ja),{ctx:en,deps:null,effects:null,equals:gs,f:n,fn:e,reactions:null,rv:0,v:Ut,wv:0,parent:He,ac:null}}const ei=Symbol("obsolete");function Yl(e,n,a){let s=He;s===null&&_l();var l=void 0,o=Ea(Ut),c=!Ge,d=new Set;return go(()=>{var y,T;var v=He,p=vs();l=p.promise;try{Promise.resolve(e()).then(p.resolve,O=>{O!==Ni&&p.reject(O)}).finally($i)}catch(O){p.reject(O),$i()}var _=fe;if(c){if((v.f&Ha)!==0)var A=ws();if((y=s.b)!=null&&y.is_rendered())(T=_.async_deriveds.get(v))==null||T.reject(ei);else for(const O of d.values())O.reject(ei);d.add(p),_.async_deriveds.set(v,p)}const m=(O,E=void 0)=>{A==null||A(),d.delete(p),E!==ei&&(_.activate(),E?(o.f|=ra,Wa(o,E)):((o.f&ra)!==0&&(o.f^=ra),Wa(o,O)),_.deactivate())};p.promise.then(m,O=>m(null,O||"unknown"))}),Rs(()=>{for(const v of d)v.reject(ei)}),new Promise(v=>{function p(_){function A(){_===l?v(o):p(l)}_.then(A,A)}p(l)})}function q(e){const n=kr(e);return js(n),n}function Xl(e){const n=kr(e);return n.equals=ms,n}function eo(e){var n=e.effects;if(n!==null){e.effects=null;for(var a=0;athis.schedule(s)){var s=h(this,Ln).get(n);if(s){h(this,Ln).delete(n);for(var l of s.d)Vt(l,Xt),a(l);for(l of s.m)Vt(l,Kn),a(l)}h(this,Fa).add(n)}capture(n,a,s=!1){n.v!==Ut&&!this.previous.has(n)&&this.previous.set(n,n.v),(n.f&ra)===0&&(this.current.set(n,[a,s]),Yt==null||Yt.set(n,a)),this.is_fork||(n.v=a)}activate(){fe=this}deactivate(){fe=null,Yt=null}flush(){try{Ji=!0,fe=this,lt(this,mt,ti).call(this)}finally{Lr=0,pr=null,za=null,Ci=null,Ji=!1,fe=null,Yt=null,ya.clear()}}discard(){var n;for(const a of h(this,Oa))a(this);h(this,Oa).clear();for(const a of this.async_deriveds.values())a.reject(ei);lt(this,mt,ni).call(this),(n=h(this,Ra))==null||n.resolve()}register_created_effect(n){h(this,hi).push(n)}increment(n,a){if(Ce(this,Ba,h(this,Ba)+1),n){let s=h(this,jn).get(a)??0;h(this,jn).set(a,s+1)}}decrement(n,a){if(Ce(this,Ba,h(this,Ba)-1),n){let s=h(this,jn).get(a)??0;s===1?h(this,jn).delete(a):h(this,jn).set(a,s-1)}h(this,ma)||(Ce(this,ma,!0),_a(()=>{Ce(this,ma,!1),this.linked&&this.flush()}))}transfer_effects(n,a){for(const s of n)h(this,Un).add(s);for(const s of a)h(this,En).add(s);n.clear(),a.clear()}oncommit(n){h(this,La).add(n)}ondiscard(n){h(this,Oa).add(n)}settled(){return(h(this,Ra)??Ce(this,Ra,vs())).promise}static ensure(){if(fe===null){const n=fe=new Bi;!Ji&&!si&&_a(()=>{h(n,Ia)||n.flush()})}return fe}apply(){{Yt=null;return}}schedule(n){var l;if(pr=n,(l=n.b)!=null&&l.is_pending&&(n.f&(Ka|Ki|us))!==0&&(n.f&Ha)===0){n.b.defer_effect(n);return}for(var a=n;a.parent!==null;){a=a.parent;var s=a.f;if(za!==null&&a===He&&(Ge===null||(Ge.f&tn)===0))return;if((s&(sa|zn))!==0){if((s&Ht)===0)return;a.f^=Ht}}h(this,ln).push(a)}};Ia=new WeakMap,ta=new WeakMap,ga=new WeakMap,La=new WeakMap,Oa=new WeakMap,Ba=new WeakMap,jn=new WeakMap,Ra=new WeakMap,ln=new WeakMap,hi=new WeakMap,Un=new WeakMap,En=new WeakMap,Ln=new WeakMap,Fa=new WeakMap,ma=new WeakMap,mt=new WeakSet,fr=function(){if(this.is_fork)return!0;for(const s of h(this,jn).keys()){for(var n=s,a=!1;n.parent!==null;){if(h(this,Ln).has(n)){a=!0;break}n=n.parent}if(!a)return!0}return!1},ti=function(){var v,p,_,A;Ce(this,Ia,!0),Lr++>1e3&&(lt(this,mt,ni).call(this),ro());for(const m of h(this,Un))h(this,En).delete(m),Vt(m,Xt),this.schedule(m);for(const m of h(this,En))Vt(m,Kn),this.schedule(m);const n=h(this,ln);Ce(this,ln,[]),this.apply();var a=za=[],s=[],l=Ci=[];for(const m of n)try{lt(this,mt,hr).call(this,m,a,s)}catch(y){throw zs(m),lt(this,mt,fr).call(this)||this.discard(),y}if(fe=null,l.length>0){var o=Bi.ensure();for(const m of l)o.schedule(m)}if(za=null,Ci=null,lt(this,mt,fr).call(this)){lt(this,mt,Ta).call(this,s),lt(this,mt,Ta).call(this,a);for(const[m,y]of h(this,Ln))Ts(m,y);l.length>0&<(v=fe,mt,ti).call(v);return}const c=lt(this,mt,Es).call(this);if(c){lt(this,mt,Ta).call(this,s),lt(this,mt,Ta).call(this,a),lt(p=c,mt,As).call(p,this);return}h(this,Un).clear(),h(this,En).clear();for(const m of h(this,La))m(this);h(this,La).clear(),ri=this,Or(s),Or(a),ri=null,(_=h(this,Ra))==null||_.resolve();var d=fe;if(h(this,Ba)===0&&(h(this,ln).length===0||d!==null)&<(this,mt,ni).call(this),h(this,ln).length>0)if(d!==null){const m=d;h(m,ln).push(...h(this,ln).filter(y=>!h(m,ln).includes(y)))}else d=this;d!==null&<(A=d,mt,ti).call(A)},hr=function(n,a,s){n.f^=Ht;for(var l=n.first;l!==null;){var o=l.f,c=(o&(zn|sa))!==0,d=c&&(o&Ht)!==0,v=d||(o&an)!==0||h(this,Ln).has(l);if(!v&&l.fn!==null){c?l.f^=Ht:(o&Ka)!==0?a.push(l):_i(l)&&((o&Cn)!==0&&h(this,En).add(l),Ga(l));var p=l.first;if(p!==null){l=p;continue}}for(;l!==null;){var _=l.next;if(_!==null){l=_;break}l=l.parent}}},Es=function(){for(var n=h(this,ta);n!==null;){if(!n.is_fork){for(const[a,[,s]]of this.current)if(n.current.has(a)&&!s)return n}n=h(n,ta)}return null},As=function(n){var s;for(const[l,o]of n.current)!this.previous.has(l)&&n.previous.has(l)&&this.previous.set(l,n.previous.get(l)),this.current.set(l,o);for(const[l,o]of n.async_deriveds){const c=this.async_deriveds.get(l);c&&o.promise.then(c.resolve).catch(c.reject)}n.async_deriveds.clear(),this.transfer_effects(h(n,Un),h(n,En));const a=l=>{var o=l.reactions;if(o!==null)for(const v of o){var c=v.f;if((c&tn)!==0)a(v);else{var d=v;c&(Pa|Cn)&&!this.async_deriveds.has(d)&&(h(this,En).delete(d),Vt(d,Xt),this.schedule(d))}}};for(const l of this.current.keys())a(l);this.oncommit(()=>n.discard()),lt(s=n,mt,ni).call(s),fe=this,lt(this,mt,ti).call(this)},Ta=function(n){for(var a=0;a!m.current.get(y)[1]);if(!(!h(m,Ia)||l.length===0)){var o=l.filter(y=>!this.current.has(y));if(o.length===0)n&&m.discard();else if(a.length>0){if(n)for(const y of h(this,Fa))m.unskip_effect(y,T=>{var O;(T.f&(Cn|Pa))!==0?m.schedule(T):lt(O=m,mt,Ta).call(O,[T])});m.activate();var c=new Set,d=new Map;for(var v of a)Cs(v,o,c,d);d=new Map;var p=[...m.current].filter(([y,T])=>{const O=this.current.get(y);return O?O[0]!==T[0]||O[1]!==T[1]:!0}).map(([y])=>y);if(p.length>0)for(const y of h(this,hi))(y.f&(wn|an|Pi))===0&&Sr(y,p,d)&&((y.f&(Pa|Cn))!==0?(Vt(y,Xt),m.schedule(y)):h(m,Un).add(y));if(h(m,ln).length>0&&!h(m,ma)){m.apply();for(var _ of h(m,ln))lt(A=m,mt,hr).call(A,_,[],[]);Ce(m,ln,[])}m.deactivate()}}}},ni=function(){if(this.linked){var n=h(this,ta),a=h(this,ga);n===null?Hi=a:Ce(n,ga,a),a===null?Ca=n:Ce(a,ta,n),this.linked=!1}};let Ma=Bi;function io(e){var n=si;si=!0;try{for(var a;;){if(Nl(),fe===null)return a;fe.flush()}}finally{si=n}}function ro(){try{Sl()}catch(e){aa(e,pr)}}let Mn=null;function Or(e){var n=e.length;if(n!==0){for(var a=0;a0)){ya.clear();for(const l of Mn){if((l.f&(wn|an))!==0)continue;const o=[l];let c=l.parent;for(;c!==null;)Mn.has(c)&&(Mn.delete(c),o.push(c)),c=c.parent;for(let d=o.length-1;d>=0;d--){const v=o[d];(v.f&(wn|an))===0&&Ga(v)}}Mn.clear()}}Mn=null}}function Cs(e,n,a,s){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const l of e.reactions){const o=l.f;(o&tn)!==0?Cs(l,n,a,s):(o&(Pa|Cn))!==0&&(o&Xt)===0&&Sr(l,n,s)&&(Vt(l,Xt),Mr(l))}}function Sr(e,n,a){const s=a.get(e);if(s!==void 0)return s;if(e.deps!==null)for(const l of e.deps){if(zi.call(n,l))return!0;if((l.f&tn)!==0&&Sr(l,n,a))return a.set(l,!0),!0}return a.set(e,!1),!1}function Mr(e){fe.schedule(e)}function Ts(e,n){if(!((e.f&zn)!==0&&(e.f&Ht)!==0)){(e.f&Xt)!==0?n.d.push(e):(e.f&Kn)!==0&&n.m.push(e),Vt(e,Ht);for(var a=e.first;a!==null;)Ts(a,n),a=a.next}}function zs(e){Vt(e,Ht);for(var n=e.first;n!==null;)zs(n),n=n.next}let Ii=new Set;const ya=new Map;let Ps=!1;function Ea(e,n){var a={f:0,v:e,reactions:null,equals:gs,rv:0,wv:0};return a}function L(e,n){const a=Ea(e);return js(a),a}function so(e,n=!1,a=!0){const s=Ea(e);return n||(s.equals=ms),s}function u(e,n,a=!1){Ge!==null&&(!Tn||(Ge.f&Pi)!==0)&&bs()&&(Ge.f&(tn|Cn|Pa|Pi))!==0&&(Rn===null||!Rn.has(e))&&Al();let s=a?Jt(n):n;return Wa(e,s,Ci)}function Wa(e,n,a=null){if(!e.equals(n)){ya.set(e,la?n:e.v);var s=Ma.ensure();if(s.capture(e,n),(e.f&tn)!==0){const l=e;(e.f&Xt)!==0&&wr(l),Yt===null&&xr(l)}e.wv=Hs(),Ds(e,Xt,a),He!==null&&(He.f&Ht)!==0&&(He.f&(zn|sa))===0&&(gn===null?bo([e]):gn.push(e)),!s.is_fork&&Ii.size>0&&!Ps&&lo()}return n}function lo(){Ps=!1;for(const e of Ii){(e.f&Ht)!==0&&Vt(e,Kn);let n;try{n=_i(e)}catch{n=!0}n&&Ga(e)}Ii.clear()}function li(e){u(e,e.v+1)}function Ds(e,n,a){var s=e.reactions;if(s!==null)for(var l=s.length,o=0;o{if(ka===o)return d();var v=Ge,p=ka;Sn(null),Nr(o);var _=d();return Sn(v),Nr(p),_};return s&&a.set("length",L(e.length)),new Proxy(e,{defineProperty(d,v,p){(!("value"in p)||p.configurable===!1||p.enumerable===!1||p.writable===!1)&&Ml();var _=a.get(v);return _===void 0?c(()=>{var A=L(p.value);return a.set(v,A),A}):u(_,p.value,!0),!0},deleteProperty(d,v){var p=a.get(v);if(p===void 0){if(v in d){const _=c(()=>L(Ut));a.set(v,_),li(l)}}else u(p,Ut),li(l);return!0},get(d,v,p){var y;if(v===Da)return e;var _=a.get(v),A=v in d;if(_===void 0&&(!A||(y=ii(d,v))!=null&&y.writable)&&(_=c(()=>{var T=Jt(A?d[v]:Ut),O=L(T);return O}),a.set(v,_)),_!==void 0){var m=t(_);return m===Ut?void 0:m}return Reflect.get(d,v,p)},getOwnPropertyDescriptor(d,v){var p=Reflect.getOwnPropertyDescriptor(d,v);if(p&&"value"in p){var _=a.get(v);_&&(p.value=t(_))}else if(p===void 0){var A=a.get(v),m=A==null?void 0:A.v;if(A!==void 0&&m!==Ut)return{enumerable:!0,configurable:!0,value:m,writable:!0}}return p},has(d,v){var m;if(v===Da)return!0;var p=a.get(v),_=p!==void 0&&p.v!==Ut||Reflect.has(d,v);if(p!==void 0||He!==null&&(!_||(m=ii(d,v))!=null&&m.writable)){p===void 0&&(p=c(()=>{var y=_?Jt(d[v]):Ut,T=L(y);return T}),a.set(v,p));var A=t(p);if(A===Ut)return!1}return _},set(d,v,p,_){var be;var A=a.get(v),m=v in d;if(s&&v==="length")for(var y=p;yL(Ut)),a.set(y+"",T))}if(A===void 0)(!m||(be=ii(d,v))!=null&&be.writable)&&(A=c(()=>L(void 0)),u(A,Jt(p)),a.set(v,A));else{m=A.v!==Ut;var O=c(()=>Jt(p));u(A,O)}var E=Reflect.getOwnPropertyDescriptor(d,v);if(E!=null&&E.set&&E.set.call(_,p),!m){if(s&&typeof v=="string"){var B=a.get("length"),_e=Number(v);Number.isInteger(_e)&&_e>=B.v&&u(B,_e+1)}li(l)}return!0},ownKeys(d){t(l);var v=Reflect.ownKeys(d).filter(A=>{var m=a.get(A);return m===void 0||m.v!==Ut});for(var[p,_]of a)_.v!==Ut&&!(p in d)&&v.push(p);return v},setPrototypeOf(){El()}})}function Br(e){try{if(e!==null&&typeof e=="object"&&Da in e)return e[Da]}catch{}return e}function oo(e,n){return Object.is(Br(e),Br(n))}var Rr,$s,Is,Ls;function co(){if(Rr===void 0){Rr=window,$s=/Firefox/.test(navigator.userAgent);var e=Element.prototype,n=Node.prototype,a=Text.prototype;Is=ii(n,"firstChild").get,Ls=ii(n,"nextSibling").get,Ir(e)&&(e[or]=void 0,e[Si]=null,e[dr]=void 0,e.__e=void 0),Ir(a)&&(a[Xa]=void 0)}}function Hn(e=""){return document.createTextNode(e)}function ia(e){return Is.call(e)}function bi(e){return Ls.call(e)}function r(e,n){return ia(e)}function at(e,n=!1){{var a=ia(e);return a instanceof Comment&&a.data===""?bi(a):a}}function i(e,n=1,a=!1){let s=e;for(;n--;)s=bi(s);return s}function vo(e){e.textContent=""}function Os(){return!1}function Bs(e,n,a){return n==null||n===hs?a?document.createElement(e,{is:a}):document.createElement(e):a?document.createElementNS(n,e,{is:a}):document.createElementNS(n,e)}let Fr=!1;function uo(){Fr||(Fr=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var n;if(!e.defaultPrevented)for(const a of e.target.elements)(n=a[Mi])==null||n.call(a)})},{capture:!0}))}function Er(e){var n=Ge,a=He;Sn(null),Nn(null);try{return e()}finally{Sn(n),Nn(a)}}function Ar(e,n,a,s=a){e.addEventListener(n,()=>Er(a));const l=e[Mi];l?e[Mi]=()=>{l(),s(!0)}:e[Mi]=()=>s(!0),uo()}function po(e){He===null&&(Ge===null&&wl(),kl()),la&&xl()}function fo(e,n){var a=n.last;a===null?n.last=n.first=e:(a.next=e,e.prev=a,n.last=e)}function Jn(e,n){var a=He;a!==null&&(a.f&an)!==0&&(e|=an);var s={ctx:en,deps:null,nodes:null,f:e|Xt|kn,first:null,fn:n,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};fe==null||fe.register_created_effect(s);var l=s;if((e&Ka)!==0)za!==null?za.push(s):Ma.ensure().schedule(s);else if(n!==null){try{Ga(s)}catch(c){throw cn(s),c}l.deps===null&&l.teardown===null&&l.nodes===null&&l.first===l.last&&(l.f&Ja)===0&&(l=l.first,(e&Cn)!==0&&(e&Na)!==0&&l!==null&&(l.f|=Na))}if(l!==null&&(l.parent=a,a!==null&&fo(l,a),Ge!==null&&(Ge.f&tn)!==0&&(e&sa)===0)){var o=Ge;(o.effects??(o.effects=[])).push(l)}return s}function Cr(){return Ge!==null&&!Tn}function Rs(e){const n=Jn(Ki,null);return Vt(n,Ht),n.teardown=e,n}function Va(e){po();var n=He.f,a=!Ge&&(n&zn)!==0&&en!==null&&!en.i;if(a){var s=en;(s.e??(s.e=[])).push(e)}else return Fs(e)}function Fs(e){return Jn(Ka|gl,e)}function ho(e){Ma.ensure();const n=Jn(sa|Ja,e);return(a={})=>new Promise(s=>{a.outro?xa(n,()=>{cn(n),s(void 0)}):(cn(n),s(void 0))})}function Ks(e){return Jn(Ka,e)}function go(e){return Jn(Pa|Ja,e)}function qi(e,n=0){return Jn(Ki|n,e)}function z(e,n=[],a=[],s=[]){Ql(s,n,a,l=>{Jn(Ki,()=>{e(...l.map(t))})})}function Tr(e,n=0){var a=Jn(Cn|n,e);return a}function yn(e){return Jn(zn|Ja,e)}function Ns(e){var n=e.teardown;if(n!==null){const a=la,s=Ge;Kr(!0),Sn(null);try{n.call(null)}finally{Kr(a),Sn(s)}}}function zr(e,n=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const l=a.ac;l!==null&&Er(()=>{l.abort(Ni)});var s=a.next;(a.f&sa)!==0?a.parent=null:cn(a,n),a=s}}function mo(e){for(var n=e.first;n!==null;){var a=n.next;(n.f&zn)===0&&cn(n),n=a}}function cn(e,n=!0){var a=!1;(n||(e.f&hl)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(qs(e.nodes.start,e.nodes.end),a=!0),e.f|=lr,zr(e,n&&!a),vi(e,0);var s=e.nodes&&e.nodes.t;if(s!==null)for(const o of s)o.stop();Ns(e),e.f^=lr,e.f|=wn;var l=e.parent;l!==null&&l.first!==null&&Ws(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function qs(e,n){for(;e!==null;){var a=e===n?null:bi(e);e.remove(),e=a}}function Ws(e){var n=e.parent,a=e.prev,s=e.next;a!==null&&(a.next=s),s!==null&&(s.prev=a),n!==null&&(n.first===e&&(n.first=s),n.last===e&&(n.last=a))}function xa(e,n,a=!0){var s=[];Vs(e,s,!0);var l=()=>{a&&cn(e),n&&n()},o=s.length;if(o>0){var c=()=>--o||l();for(var d of s)d.out(c)}else l()}function Vs(e,n,a){if((e.f&an)===0){e.f^=an;var s=e.nodes&&e.nodes.t;if(s!==null)for(const d of s)(d.is_global||a)&&n.push(d);for(var l=e.first;l!==null;){var o=l.next;if((l.f&sa)===0){var c=(l.f&Na)!==0||(l.f&zn)!==0&&(e.f&Cn)!==0;Vs(l,n,c?a:!1)}l=o}}}function Li(e){Gs(e,!0)}function Gs(e,n){if((e.f&an)!==0){e.f^=an,(e.f&Ht)===0&&(Vt(e,Xt),Ma.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,l=(a.f&Na)!==0||(a.f&zn)!==0;Gs(a,l?n:!1),a=s}var o=e.nodes&&e.nodes.t;if(o!==null)for(const c of o)(c.is_global||n)&&c.in()}}function Pr(e,n){if(e.nodes)for(var a=e.nodes.start,s=e.nodes.end;a!==null;){var l=a===s?null:bi(a);n.append(a),a=l}}let Ti=!1,la=!1;function Kr(e){la=e}let Ge=null,Tn=!1;function Sn(e){Ge=e}let He=null;function Nn(e){He=e}let Rn=null;function js(e){Ge!==null&&(Rn??(Rn=new Set)).add(e)}let on=null,un=0,gn=null;function bo(e){gn=e}let Us=1,va=0,ka=va;function Nr(e){ka=e}function Hs(){return++Us}function _i(e){var n=e.f;if((n&Xt)!==0)return!0;if(n&tn&&(e.f&=~Sa),(n&Kn)!==0){for(var a=e.deps,s=a.length,l=0;le.wv)return!0}(n&kn)!==0&&Yt===null&&Vt(e,Ht)}return!1}function Js(e,n,a=!0){var s=e.reactions;if(s!==null&&!(Rn!==null&&Rn.has(e)))for(var l=0;l{e.ac.abort(Ni)}),e.ac=null);try{e.f|=Di;var _=e.fn,A=_();e.f|=Ha;var m=e.deps,y=fe==null?void 0:fe.is_fork;if(on!==null){var T;if(y||vi(e,un),m!==null&&un>0)for(m.length=un+on.length,T=0;T{throw B});throw m}}finally{e[ua]=n,delete e.currentTarget,Sn(_),Nn(A)}}}var ls;const Qi=((ls=globalThis==null?void 0:globalThis.window)==null?void 0:ls.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function wo(e){return(Qi==null?void 0:Qi.createHTML(e))??e}function So(e){var n=Bs("template");return n.innerHTML=wo(e.replaceAll("","")),n.content}function ja(e,n){var a=He;a.nodes===null&&(a.nodes={start:e,end:n,a:null,t:null})}function b(e,n){var a=(n&$l)!==0,s=(n&Il)!==0,l,o=!e.startsWith("");return()=>{l===void 0&&(l=So(o?e:""+e),a||(l=ia(l)));var c=s||$s?document.importNode(l,!0):l.cloneNode(!0);if(a){var d=ia(c),v=c.lastChild;ja(d,v)}else ja(c,c);return c}}function oi(e=""){{var n=Hn(e+"");return ja(n,n),n}}function Ua(){var e=document.createDocumentFragment(),n=document.createComment(""),a=Hn();return e.append(n,a),ja(n,a),e}function f(e,n){e!==null&&e.before(n)}function g(e,n){var a=n==null?"":typeof n=="object"?`${n}`:n;a!==(e[Xa]??(e[Xa]=e.nodeValue))&&(e[Xa]=a,e.nodeValue=`${a}`)}function Mo(e,n){return Eo(e,n)}const wi=new Map;function Eo(e,{target:n,anchor:a,props:s={},events:l,context:o,intro:c=!0,transformError:d}){co();var v=void 0,p=ho(()=>{var _=a??n.appendChild(Hn());Gl(_,{pending:()=>{}},y=>{Pn({});var T=en;o&&(T.c=o),l&&(s.$$events=l),v=e(y,s)||{},Dn()},d);var A=new Set,m=y=>{for(var T=0;T{var E;for(var y of A)for(const B of[n,document]){var T=wi.get(B),O=T.get(y);--O==0?(B.removeEventListener(y,Wr),T.delete(y),T.size===0&&wi.delete(B)):T.set(y,O)}gr.delete(m),_!==a&&((E=_.parentNode)==null||E.removeChild(_))}});return Ao.set(v,p),v}let Ao=new WeakMap;var An,On,fn,ba,gi,mi,Ri;class Co{constructor(n,a=!0){vn(this,"anchor");Oe(this,An,new Map);Oe(this,On,new Map);Oe(this,fn,new Map);Oe(this,ba,new Set);Oe(this,gi,!0);Oe(this,mi,n=>{if(h(this,An).has(n)){var a=h(this,An).get(n),s=h(this,On).get(a);if(s)Li(s),h(this,ba).delete(a);else{var l=h(this,fn).get(a);l&&(Li(l.effect),h(this,On).set(a,l.effect),h(this,fn).delete(a),l.fragment.lastChild.remove(),this.anchor.before(l.fragment),s=l.effect)}for(const[o,c]of h(this,An)){if(h(this,An).delete(o),o===n)break;const d=h(this,fn).get(c);d&&(cn(d.effect),h(this,fn).delete(c))}for(const[o,c]of h(this,On)){if(o===a||h(this,ba).has(o))continue;const d=()=>{if(Array.from(h(this,An).values()).includes(o)){var p=document.createDocumentFragment();Pr(c,p),p.append(Hn()),h(this,fn).set(o,{effect:c,fragment:p})}else cn(c);h(this,ba).delete(o),h(this,On).delete(o)};h(this,gi)||!s?(h(this,ba).add(o),xa(c,d,!1)):d()}}});Oe(this,Ri,n=>{h(this,An).delete(n);const a=Array.from(h(this,An).values());for(const[s,l]of h(this,fn))a.includes(s)||(cn(l.effect),h(this,fn).delete(s))});this.anchor=n,Ce(this,gi,a)}ensure(n,a){var s=fe,l=Os();if(a&&!h(this,On).has(n)&&!h(this,fn).has(n))if(l){var o=document.createDocumentFragment(),c=Hn();o.append(c),h(this,fn).set(n,{effect:yn(()=>a(c)),fragment:o})}else h(this,On).set(n,yn(()=>a(this.anchor)));if(h(this,An).set(s,n),l){for(const[d,v]of h(this,On))d===n?s.unskip_effect(v):s.skip_effect(v);for(const[d,v]of h(this,fn))d===n?s.unskip_effect(v.effect):s.skip_effect(v.effect);s.oncommit(h(this,mi)),s.ondiscard(h(this,Ri))}else h(this,mi).call(this,s)}}An=new WeakMap,On=new WeakMap,fn=new WeakMap,ba=new WeakMap,gi=new WeakMap,mi=new WeakMap,Ri=new WeakMap;function R(e,n,a=!1){var s=new Co(e),l=a?Na:0;function o(c,d){s.ensure(c,d)}Tr(()=>{var c=!1;n((d,v=0)=>{c=!0,o(v,d)}),c||o(-1,null)},l)}function ct(e,n){return n}function To(e,n,a){for(var s=[],l=n.length,o,c=n.length,d=0;d{if(o){if(o.pending.delete(A),o.done.add(A),o.pending.size===0){var m=e.outrogroups;mr(e,Fi(o.done)),m.delete(o),m.size===0&&(e.outrogroups=null)}}else c-=1},!1)}if(c===0){var v=s.length===0&&a!==null;if(v){var p=a,_=p.parentNode;vo(_),_.append(p),e.items.clear()}mr(e,n,!v)}else o={pending:new Set(n),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(o)}function mr(e,n,a=!0){var s;if(e.pending.size>0){s=new Set;for(const c of e.pending.values())for(const d of c)s.add(e.items.get(d).e)}for(var l=0;l{var be=a();return yr(be)?be:be==null?[]:Fi(be)}),m,y=new Map,T=!0;function O(be){(_e.effect.f&wn)===0&&(_e.pending.delete(be),_e.fallback=_,zo(_e,m,c,n,s),_!==null&&(m.length===0?(_.f&Bn)===0?Li(_):(_.f^=Bn,ai(_,null,c)):xa(_,()=>{_=null})))}function E(be){_e.pending.delete(be)}var B=Tr(()=>{m=t(A);for(var be=m.length,xe=new Set,Te=fe,H=Os(),Q=0;Qo(c)):(_=yn(()=>o(Vr??(Vr=Hn()))),_.f|=Bn)),be>xe.size&&yl(),!T)if(y.set(Te,xe),H){for(const[Qe,pt]of d)xe.has(Qe)||Te.skip_effect(pt.e);Te.oncommit(O),Te.ondiscard(E)}else O(Te);t(A)}),_e={effect:B,items:d,pending:y,outrogroups:null,fallback:_};T=!1}function Ya(e){for(;e!==null&&(e.f&zn)===0;)e=e.next;return e}function zo(e,n,a,s,l){var Be,Qe,pt,P,oe,ge,Xe,ce,Ke;var o=(s&Pl)!==0,c=n.length,d=e.items,v=Ya(e.effect.first),p,_=null,A,m=[],y=[],T,O,E,B;if(o)for(B=0;B0){var Ee=(s&fs)!==0&&c===0?a:null;if(o){for(B=0;B{var ue,V;if(A!==void 0)for(E of A)(V=(ue=E.nodes)==null?void 0:ue.a)==null||V.apply()})}function Po(e,n,a,s,l,o,c,d){var v=(c&Tl)!==0?(c&Dl)===0?so(a,!1,!1):Ea(a):null,p=(c&zl)!==0?Ea(l):null;return{v,i:p,e:yn(()=>(o(n,v??a,p??l,d),()=>{e.delete(s)}))}}function ai(e,n,a){if(e.nodes)for(var s=e.nodes.start,l=e.nodes.end,o=n&&(n.f&Bn)===0?n.nodes.start:a;s!==null;){var c=bi(s);if(o.before(s),s===l)return;s=c}}function Zn(e,n,a){n===null?e.effect.first=a:n.next=a,a===null?e.effect.last=n:a.prev=n}function Je(e,n,a=!1,s=!1,l=!1,o=!1){var c=e,d="";if(a)var v=e;z(()=>{var p=He;if(d!==(d=n()??"")){if(a){p.nodes=null,v.innerHTML=d,d!==""&&ja(ia(v),v.lastChild);return}if(p.nodes!==null&&(qs(p.nodes.start,p.nodes.end),p.nodes=null),d!==""){var _=s?Ll:l?Ol:void 0,A=Bs(s?"svg":l?"math":"template",_);A.innerHTML=d;var m=s||l?A:A.content;if(ja(ia(m),m.lastChild),s||l)for(;ia(m);)c.before(ia(m));else c.before(m)}}})}function Do(e,n,a){var s=e==null?"":""+e;return n&&(s=s?s+" "+n:n),s===""?null:s}function $o(e,n){return e==null?null:String(e)}function Dt(e,n,a,s,l,o){var c=e[or];if(c!==a||c===void 0){var d=Do(a,s);d==null?e.removeAttribute("class"):e.className=d,e[or]=a}return o}function Rt(e,n,a,s){var l=e[dr];if(l!==n){var o=$o(n);o==null?e.removeAttribute("style"):e.style.cssText=o,e[dr]=n}return s}function el(e,n,a=!1){if(e.multiple){if(n==null)return;if(!yr(n))return Rl();for(var s of e.options)s.selected=n.includes(di(s));return}for(s of e.options){var l=di(s);if(oo(l,n)){s.selected=!0;return}}(!a||n!==void 0)&&(e.selectedIndex=-1)}function Io(e){var n=new MutationObserver(()=>{el(e,e.__value)});n.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Rs(()=>{n.disconnect()})}function wa(e,n,a=n){var s=new WeakSet,l=!0;Ar(e,"change",o=>{var c=o?"[selected]":":checked",d;if(e.multiple)d=[].map.call(e.querySelectorAll(c),di);else{var v=e.querySelector(c)??e.querySelector("option:not([disabled])");d=v&&di(v)}a(d),e.__value=d,fe!==null&&s.add(fe)}),Ks(()=>{var o=n();if(e===document.activeElement){var c=fe;if(s.has(c))return}if(el(e,o,l),l&&o===void 0){var d=e.querySelector(":checked");d!==null&&(o=di(d),a(o))}e.__value=o,l=!1}),Io(e)}function di(e){return"__value"in e?e.__value:e.value}const Lo=Symbol("is custom element"),Oo=Symbol("is html"),Bo=bl?"progress":"PROGRESS";function Yn(e,n){var a=tl(e);a.value===(a.value=n??void 0)||e.value===n&&(n!==0||e.nodeName!==Bo)||(e.value=n??"")}function Za(e,n,a,s){var l=tl(e);l[n]!==(l[n]=a)&&(n==="loading"&&(e[ml]=a),a==null?e.removeAttribute(n):typeof a!="string"&&Ro(e).includes(n)?e[n]=a:e.setAttribute(n,a))}function tl(e){return e[Si]??(e[Si]={[Lo]:e.nodeName.includes("-"),[Oo]:e.namespaceURI===hs})}var Gr=new Map;function Ro(e){var n=e.getAttribute("is")||e.nodeName,a=Gr.get(n);if(a)return a;Gr.set(n,a=[]);for(var s,l=e,o=Element.prototype;o!==l;){s=cl(l);for(var c in s)s[c].set&&c!=="innerHTML"&&c!=="textContent"&&c!=="innerText"&&a.push(c);l=cs(l)}return a}function dn(e,n,a=n){var s=new WeakSet;Ar(e,"input",async l=>{var o=l?e.defaultValue:e.value;if(o=Zi(e)?Yi(o):o,a(o),fe!==null&&s.add(fe),await yo(),o!==(o=n())){var c=e.selectionStart,d=e.selectionEnd,v=e.value.length;if(e.value=o??"",d!==null){var p=e.value.length;c===d&&d===v&&p>v?(e.selectionStart=p,e.selectionEnd=p):(e.selectionStart=c,e.selectionEnd=Math.min(d,p))}}}),Qa(n)==null&&e.value&&(a(Zi(e)?Yi(e.value):e.value),fe!==null&&s.add(fe)),qi(()=>{var l=n();if(e===document.activeElement){var o=fe;if(s.has(o))return}Zi(e)&&l===Yi(e.value)||e.type==="date"&&!l&&!e.value||l!==e.value&&(e.value=l??"")})}function Fo(e,n,a=n){Ar(e,"change",s=>{var l=s?e.defaultChecked:e.checked;a(l)}),Qa(n)==null&&a(e.checked),qi(()=>{var s=n();e.checked=!!s})}function Zi(e){var n=e.type;return n==="number"||n==="range"}function Yi(e){return e===""?null:+e}function Xi(e,n){return e===n||(e==null?void 0:e[Da])===n}function Ko(e={},n,a,s){var l=en.r,o=He;return Ks(()=>{var c,d;return qi(()=>{c=d,d=[],Qa(()=>{Xi(a(...d),e)||(n(e,...d),c&&Xi(a(...c),e)&&n(null,...c))})}),()=>{let v=o;for(;v!==l&&v.parent!==null&&v.parent.f&lr;)v=v.parent;const p=()=>{d&&Xi(a(...d),e)&&n(null,...d)},_=v.teardown;v.teardown=()=>{p(),_==null||_()}}}),e}function yi(e){en===null&&ps(),Va(()=>{const n=Qa(e);if(typeof n=="function")return n})}function No(e){en===null&&ps(),yi(()=>()=>Qa(e))}let ui=localStorage.getItem("mc_token")||"";function nl(){return ui}function qo(e){ui=(e||"").trim(),localStorage.setItem("mc_token",ui)}function Wo(){const e={"Content-Type":"application/json"};return ui&&(e["X-MC-Token"]=ui),e}function ci(){return localStorage.getItem("mc_hf_token")||""}function Vo(e){localStorage.setItem("mc_hf_token",(e||"").trim())}async function De(e,n={}){const a=await fetch(e,{headers:Wo(),...n}),s=await a.json().catch(()=>({}));if(!a.ok)throw new Error(s.error||"HTTP "+a.status);return s}const Go=(e,n=document)=>n.querySelector(e),jr=(e,n=document)=>[...n.querySelectorAll(e)];function Fn(e){return String(e??"").replace(/[&<>]/g,n=>({"&":"&","<":"<",">":">"})[n])}let Ur;function re(e,n=!1){const a=Go("#toast");a&&(a.textContent=e,a.className="toast show"+(n?" err":""),clearTimeout(Ur),Ur=setTimeout(()=>a.className="toast",3200))}function jo(e,n){return e==="running"||e==="ready"?'geladen':e==="loading"||e==="starting"?'lädt…':e==="downloading"?`↓ Download${n!=null?` ${Math.round(n)}%`:""}`:'bereit'}const gt=e=>`${e}`,Wi={logo:gt(''),grid:gt(''),cpu:gt(''),pulse:gt(''),server:gt(''),book:gt(''),help:gt(''),settings:gt(''),swap:gt(''),monitor:gt(''),layers:gt(''),alert:gt(''),gauge:gt(''),search:gt(''),compass:gt(''),code:gt(''),eye:gt(''),refresh:gt(''),file:gt(''),database:gt(''),thermo:gt(''),shield:gt(''),info:gt(''),chevron:gt(''),bolt:gt(''),x:gt(''),check:gt(''),download:gt(''),clock:gt('')};function jt(e){return Wi[e]||""}function br(e){return`${Wi.info}`}function da(e){if(!e&&e!==0)return"–";const n=e/1024/1024/1024;return n>=1?n.toFixed(1)+" GB":Math.round(e/1024/1024)+" MB"}function xn({title:e,body:n,confirmLabel:a="Bestätigen",cancelLabel:s="Abbrechen",danger:l=!1}){return new Promise(o=>{const c=document.createElement("div");c.className="modal-overlay",c.innerHTML=``;const d=u=>{v.remove(),o(u)};v.addEventListener("click",u=>{if(u.target===v)return d(!1);const p=u.target.closest("[data-x]");p&&d(p.getAttribute("data-x")==="1")}),document.body.appendChild(v),v.querySelector('[data-x="1"]').focus()})}function er({title:e,body:n="",placeholder:a="",password:s=!1,confirmLabel:l="Weiter",danger:o=!1}){return new Promise(v=>{const d=document.createElement("div");d.className="modal-overlay",d.innerHTML=``;const v=d.querySelector("input"),p=_=>{d.remove(),c(_)};d.addEventListener("click",_=>{if(_.target===d)return p(null);const A=_.target.closest("[data-x]");A&&p(A.getAttribute("data-x")==="1"?v.value||"":null)}),v.addEventListener("keydown",_=>{_.key==="Enter"&&p(v.value||""),_.key==="Escape"&&p(null)}),document.body.appendChild(d),v.focus()})}function Uo(e="overview"){const n=jr(".nav-item[data-view]:not(.disabled)"),a=jr(".view[data-view]"),s=new Set(a.map(o=>o.dataset.view));function l(o){s.has(o)||(o=e),a.forEach(c=>c.hidden=c.dataset.view!==o),n.forEach(c=>c.classList.toggle("active",c.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",c=>{c.preventDefault(),l(o.dataset.view)})),window.addEventListener("hashchange",()=>l(location.hash.replace("#/",""))),l(location.hash.replace("#/","")||e),{show:l}}let Hr=L(null);const xi={get value(){return t(Hr)},set(e){u(Hr,e,!0)}};let Jr=L(Jt([])),Xn=L(Jt([]));const pa={get value(){return t(Jr)},set(e){u(Jr,e||[],!0)},get tracked(){return t(Xn)},track(e){t(Xn).includes(e)||u(Xn,[...t(Xn),e],!0)},toggle(e){u(Xn,t(Xn).includes(e)?t(Xn).filter(n=>n!==e):[...t(Xn),e],!0)}};let Qr=L(null);const Dr={get value(){return t(Qr)},set(e){u(Qr,e,!0)}},Ho="5";var os;typeof window<"u"&&((os=window.__svelte??(window.__svelte={})).v??(os.v=new Set)).add(Ho);var Jo=b('— bereit für Anfragen'),Qo=b('
Temperatur (GPU)
Freier Speicher
GB
',1),Zo=b('
Temperatur
messe…
Freier Speicher
messe…
',1),Yo=b('
'),Xo=b('
Warte auf Messwerte…
'),ed=b('
Noch kein Modell eingerichtet — starte hier:
',1),td=b('
Die häufigsten Aufgaben — ein Klick.
',1),nd=b('Bild'),ad=b('Code'),id=b('Text'),rd=b('∞ aktiv'),sd=b(''),ld=b('
'),Zr=b('
'),od=b('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),dd=b('
'),cd=b('
News gerade nicht ladbar.
'),vd=b('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function ud(e,n){Pn(n,!0);const a=q(()=>xi.value),s=q(()=>Dr.value),l=q(()=>{var C;return((C=t(a))==null?void 0:C.models)||[]}),o=q(()=>{var C;return((C=t(a))==null?void 0:C.swap_ok)??!1}),c=["running","ready","loading","starting"],d=q(()=>t(l).find(C=>c.includes(C.state))),v=q(()=>t(l).filter(C=>!C.incomplete)),p=q(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),_=q(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(t(s).ram.percent)} % — eventuell Speicher freigeben.`:`${t(v).length} ${t(v).length===1?"Modell":"Modelle"} konfiguriert · ${t(d)?`„${t(d).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),A=q(()=>()=>{var ee;const C=(ee=t(s))==null?void 0:ee.gpu;return C&&C.vram.total+C.gtt.total>0?(C.vram.used+C.gtt.used)/(C.vram.total+C.gtt.total)*100:0});let m=L(Jt([])),y=L(null);yi(async()=>{try{u(m,((await De("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function T(){await xn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await De("/api/unload",{method:"POST"}),E())}async function O(C){u(y,C,!0);try{await De("/api/preload?model="+encodeURIComponent(C),{method:"POST"})}catch(ee){re("Laden fehlgeschlagen: "+(ee.message||"Engine nicht erreichbar?"),!0)}u(y,null),E()}function E(){document.dispatchEvent(new Event("mc:refresh"))}function B(C){var ee;(ee=document.querySelector(`.nav-item[data-view="${C}"]`))==null||ee.dispatchEvent(new MouseEvent("click"))}function _e(C){return C>=90?"red":C>=75?"":"green"}function be(C){return C==null?"":C>=75?"red":C>=55?"":"green"}function xe(C){return C>=90?"red":C>=70?"":"green"}var Te=vd(),H=at(Te),Q=r(H),de=r(Q),Ee=r(de),Be=i(Ee);{var Qe=C=>{var ee=Jo();f(C,ee)};R(Be,C=>{t(o)&&!t(d)&&C(Qe)})}var pt=i(de,2),P=r(pt),oe=i(H,2),ge=r(oe),Xe=r(ge),ce=i(r(Xe),2);Je(ce,()=>jt("server"),!0);var Ke=i(Xe,2),ue=r(Ke),V=i(Ke,2),ne=r(V),me=i(ge,2),he=r(me),Re=i(r(he),2);Je(Re,()=>jt("cpu"),!0);var Ze=i(he,2),vt=r(Ze),ot=i(Ze,2),bt=r(ot);{var it=C=>{var ee=oi();z(Ve=>g(ee,`${Ve??""} · ${t(d).state??""}`),[()=>{var Ve;return(Ve=t(d).meta)!=null&&Ve.ctx?Math.round(t(d).meta.ctx/1024)+"k ctx":""}]),f(C,ee)},Ye=C=>{var ee=oi("lädt bei erster Anfrage");f(C,ee)};R(bt,C=>{t(d)?C(it):C(Ye,-1)})}var ft=i(me,2);{var We=C=>{const ee=q(()=>{var hn;return t(s).gpu_temp??((hn=t(s).cpu)==null?void 0:hn.temp)??null}),Ve=q(()=>be(t(ee))),te=q(()=>t(s).ram.total-t(s).ram.used),pe=q(()=>100-t(s).ram.percent);var Ne=Qo(),Ue=at(Ne),we=r(Ue),K=i(r(we));Je(K,()=>jt("thermo"),!0);var U=i(we,2),se=r(U),le=i(U,2),Pe=r(le),Le=i(Ue,2),Me=r(Le),ie=i(r(Me));Je(ie,()=>jt("database"),!0);var ve=i(Me,2),Ct=r(ve),Tt=i(ve,2),Kt=r(Tt);z((hn,oa,w,k)=>{Dt(Ue,1,`kpi ${t(Ve)??""}`),g(se,hn),g(Pe,t(ee)==null?"messe…":t(ee)<55?"kühl":t(ee)<75?"normal":"⚠ heiß"),Dt(Le,1,`kpi ${t(pe)<15?"red":t(pe)<30?"":"green"}`),g(Ct,oa),g(Kt,`von ${w??""} GB · ${k??""} % frei`)},[()=>t(ee)!=null?`${Math.round(t(ee))}°C`:"–",()=>Math.round(t(te)/1073741824),()=>Math.round(t(s).ram.total/1073741824),()=>Math.round(t(pe))]),f(C,Ne)},dt=C=>{var ee=Zo();f(C,ee)};R(ft,C=>{t(s)?C(We):C(dt,-1)})}var I=i(oe,2),W=r(I),Ae=i(r(W),4);{var et=C=>{const ee=q(()=>t(A)());var Ve=Ua(),te=at(Ve);nt(te,17,()=>{var pe;return[["Prozessor (CPU)",((pe=t(s).cpu)==null?void 0:pe.percent)??0,""],["Arbeitsspeicher (RAM)",t(s).ram.percent,_e(t(s).ram.percent)],["Grafikspeicher (VRAM)",t(ee),xe(t(ee))]]},ct,(pe,Ne)=>{var Ue=q(()=>na(t(Ne),3));let we=()=>t(Ue)[0],K=()=>t(Ue)[1];const U=q(()=>Math.max(0,Math.min(100,K()||0)));var se=Yo(),le=r(se),Pe=r(le),Le=r(Pe),Me=i(Pe),ie=r(Me),ve=i(le,2),Ct=r(ve);z((Tt,Kt)=>{g(Le,we()),g(ie,`${Tt??""} %`),Dt(ve,1,`bar ${t(U)>=90?"bad":t(U)>=75?"warn":""}`),Rt(Ct,`width:${Kt??""}%`)},[()=>Math.round(t(U)),()=>Math.max(2,t(U))]),f(pe,se)}),f(C,Ve)},G=C=>{var ee=Xo();f(C,ee)};R(Ae,C=>{t(s)?C(et):C(G,-1)})}var $e=i(W,2),D=i(r($e),2);{var N=C=>{var ee=ed(),Ve=i(at(ee),2),te=r(Ve);Je(te,()=>jt("search"),!0);var pe=i(te,4);Je(pe,()=>jt("chevron"),!0);var Ne=i(Ve,2),Ue=r(Ne);Je(Ue,()=>jt("swap"),!0);var we=i(Ue,4);Je(we,()=>jt("chevron"),!0);var K=i(Ne,2),U=r(K);Je(U,()=>jt("file"),!0);var se=i(U,4);Je(se,()=>jt("chevron"),!0),x("click",Ve,()=>B("cookbook")),x("click",Ne,()=>B("connect")),x("click",K,()=>B("guides")),f(C,ee)},S=C=>{var ee=td(),Ve=i(at(ee),2),te=r(Ve);Je(te,()=>jt("search"),!0);var pe=i(te,4);Je(pe,()=>jt("chevron"),!0);var Ne=i(Ve,2),Ue=r(Ne);Je(Ue,()=>jt("refresh"),!0);var we=i(Ue,4);Je(we,()=>jt("chevron"),!0);var K=i(Ne,2),U=r(K);Je(U,()=>jt("file"),!0);var se=i(U,4);Je(se,()=>jt("chevron"),!0);var le=i(K,2),Pe=r(le);Je(Pe,()=>jt("swap"),!0);var Le=i(Pe,4);Je(Le,()=>jt("chevron"),!0),x("click",Ve,()=>B("cookbook")),x("click",Ne,T),x("click",K,()=>B("server")),x("click",le,()=>B("connect")),f(C,ee)};R(D,C=>{t(v).length?C(S,-1):C(N)})}var $=i(I,2),Y=r($),j=r(Y),X=i(r(j),2),ke=r(X),Ie=i(j,2);{var M=C=>{var ee=Zr();nt(ee,21,()=>t(v),ct,(Ve,te)=>{const pe=q(()=>c.includes(t(te).state)),Ne=q(()=>t(te).state==="downloading"),Ue=q(()=>t(te).state==="loading"||t(te).state==="starting"||t(Ne)?"load":t(pe)?"on":""),we=q(()=>t(Ne)?`↓ ${t(te).download_progress!=null?Math.round(t(te).download_progress)+"%":"..."}`:t(te).state==="loading"||t(te).state==="starting"?"lädt…":t(pe)?"geladen ✓":"bereit");var K=ld(),U=r(K),se=i(U,2),le=r(se),Pe=r(le),Le=r(Pe),Me=i(Pe,2);{var ie=ye=>{var qe=nd();f(ye,qe)},ve=q(()=>{var ye,qe;return(qe=(ye=t(te).meta)==null?void 0:ye.caps)==null?void 0:qe.includes("Bild")}),Ct=ye=>{var qe=ad();f(ye,qe)},Tt=q(()=>{var ye,qe;return(qe=(ye=t(te).meta)==null?void 0:ye.caps)==null?void 0:qe.includes("Code")}),Kt=ye=>{var qe=id();f(ye,qe)};R(Me,ye=>{t(ve)?ye(ie):t(Tt)?ye(Ct,1):ye(Kt,-1)})}var hn=i(Me,2);{var oa=ye=>{var qe=rd();f(ye,qe)};R(hn,ye=>{t(te).ttl>=99999&&ye(oa)})}var w=i(le,2),k=r(w),Z=i(se,2),J=r(Z),Se=r(J),kt=i(J,2);{var Mt=ye=>{var qe=sd(),tt=r(qe);z(()=>{Rt(qe,`padding:3px 9px;font-size:12px;opacity:${t(y)===t(te).name?".5":"1"}`),qe.disabled=t(y)===t(te).name,g(tt,t(y)===t(te).name?"…":"Laden")}),x("click",qe,()=>O(t(te).name)),f(ye,qe)};R(kt,ye=>{!t(pe)&&!t(Ne)&&t(o)&&ye(Mt)})}z((ye,qe)=>{var tt;Dt(U,1,`li-dot ${t(Ue)??""}`),Rt(Pe,t(pe)?"color:var(--accent)":""),g(Le,t(te).name),g(k,`${ye??""} - ${(tt=t(te).meta)!=null&&tt.quant?" · "+t(te).meta.quant:""} - ${qe??""}`),Rt(J,`white-space:nowrap;color:${t(pe)?"var(--on)":"var(--mut)"}`),g(Se,t(we))},[()=>{var ye;return(ye=t(te).meta)!=null&&ye.ctx?Math.round(t(te).meta.ctx/1024)+"k ctx":""},()=>{var ye;return(ye=t(te).meta)!=null&&ye.size_bytes?" · "+(t(te).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),f(Ve,K)}),f(C,ee)},F=C=>{var ee=od(),Ve=i(r(ee),4);x("click",Ve,()=>B("cookbook")),f(C,ee)};R(Ie,C=>{t(v).length?C(M):C(F,-1)})}var ae=i(Y,2),ze=r(ae),je=i(r(ze),2),It=i(ze,2);{var xt=C=>{var ee=Zr();nt(ee,21,()=>t(m),ct,(Ve,te)=>{var pe=dd(),Ne=r(pe),Ue=r(Ne),we=r(Ue),K=i(Ue,2),U=r(K);z(()=>{Za(pe,"href",t(te).link),g(we,t(te).title),g(U,`${t(te).source??""}${t(te).relevant?" · für dich":""}`)}),f(Ve,pe)}),f(C,ee)},Lt=C=>{var ee=cd();f(C,ee)};R(It,C=>{t(m).length?C(xt):C(Lt,-1)})}z(C=>{g(Ee,`${t(p)??""} `),g(P,t(_)),Dt(ge,1,`kpi ${t(o)?"green":"red"}`),g(ue,t(o)?"Online":"Offline"),g(ne,C),Dt(me,1,`kpi ${t(d)?"blue":"muted"}`),g(vt,t(d)?t(d).name:"Keins"),g(ke,t(v).length?t(v).length+" konfiguriert":"")},[()=>{var C,ee;return((ee=(C=t(a))==null?void 0:C.swap_url)==null?void 0:ee.replace(/^https?:\/\//,""))??"—"}]),x("click",je,()=>B("news")),x("keydown",je,C=>C.key==="Enter"&&B("news")),f(e,Te),Dn()}qn(["click","keydown"]);var pd=b(""),fd=b('
'),hd=b('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),gd=b('
kein Modell hinterlegt
leere Rolleleer '),md=b(' '),bd=b('
'),_d=b(' '),yd=b('
API-Name:
'),xd=b('
ModellKannDetailsStatusPortAktionen
'),kd=b('
Empfohlen für deine Hardware

'),wd=b(''),Sd=b(''),Md=b(''),Ed=b('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Ad(e,n){Pn(n,!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.",s="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.",l=[{id:"coder",label:"Coder",desc:"Programmieren & Code"},{id:"vision",label:"Vision",desc:"Bilder verstehen"},{id:"scout",label:"Scout",desc:"Schneller Allrounder"},{id:"reviewer",label:"Reviewer",desc:"Code/Texte prüfen"},{id:"manager",label:"Manager",desc:"Planen & koordinieren"}],o=q(()=>{var I;return((I=xi.value)==null?void 0:I.models)||[]});function c(){document.dispatchEvent(new Event("mc:refresh"))}let d=L(""),v=L(""),p=L(""),_=L(!1);const A=q(()=>t(o).filter(I=>!I.incomplete));async function m(){var W;const I=t(d)||((W=t(A)[0])==null?void 0:W.name);if(!(!I||!t(v).trim())){u(_,!0),u(p,"(wecke Modell, kann beim Laden kurz dauern…)");try{const Ae=await De("/api/chat",{method:"POST",body:JSON.stringify({model:I,message:t(v)})});u(p,Ae.reply,!0)}catch(Ae){u(p,"Fehler: "+Ae.message)}u(_,!1),c()}}const y=300;let T=L(!1),O=L(null),E=L(8192),B=L(!1);function _e(I){var W;u(O,t(o).find(Ae=>Ae.name===I),!0),t(O)&&(u(E,((W=t(O).meta)==null?void 0:W.ctx)||8192,!0),u(B,(t(O).ttl??y)>=99999),u(T,!0))}async function be(){const I=t(B)?99999:y;try{await De("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(E),ttl:I})}),re("Gespeichert — aktiv beim nächsten Modell-Start."),u(T,!1),c()}catch(W){re(W.message,!0)}}let xe=L(!1),Te=L(""),H=L(""),Q=L("");function de(I){const W=t(o).find(Ae=>Ae.name===I);u(Te,I,!0),u(Q,(W==null?void 0:W.role)||"",!0),u(H,""),u(xe,!0)}async function Ee(I){try{await De("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Te),role:I})}),re(I?`Rolle gesetzt: ${I}`:"Rolle entfernt."),u(xe,!1),c()}catch(W){re(W.message,!0)}}async function Be(I){if(await xn({title:`„${I}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await De("/api/unload?model="+encodeURIComponent(I),{method:"POST"}),re("Entladen: "+I),setTimeout(c,600)}catch(W){re(W.message,!0)}}async function Qe(I){if(await xn({title:`„${I}" 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 W=await De("/api/delete_model",{method:"POST",body:JSON.stringify({alias:I})});re(W.note||"Gelöscht: "+I),setTimeout(c,600)}catch(W){re(W.message,!0)}}function pt(I){return I!=null&&I.length?I.map(W=>W==="Code"?'Code':W==="Bild"?'Bild':'Text').join(" "):"–"}function P(I){if(!I)return"–";const W=I.quant||"?",Ae=I.ctx?Math.round(I.ctx/1024)+"K":"?",et=I.size_bytes?(I.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${W} · ${Ae} · ${et}`}function oe(I){var W;(W=navigator.clipboard)==null||W.writeText(I),re("Kopiert: "+I)}var ge=Ed(),Xe=i(at(ge),2),ce=i(r(Xe),6);nt(ce,21,()=>t(A),ct,(I,W)=>{var Ae=pd(),et=r(Ae),G={};z(()=>{g(et,t(W).name),G!==(G=t(W).name)&&(Ae.value=(Ae.__value=t(W).name)??"")}),f(I,Ae)});var Ke=i(ce,4),ue=i(Ke,2),V=r(ue),ne=i(ue,2);{var me=I=>{var W=fd(),Ae=r(W);z(()=>g(Ae,t(p))),f(I,W)};R(ne,I=>{t(p)&&I(me)})}var he=i(Xe,2),Re=r(he),Ze=i(r(Re)),vt=r(Ze),ot=i(Re,4);{var bt=I=>{var W=hd();f(I,W)},it=I=>{var W=xd(),Ae=i(r(W));nt(Ae,21,()=>t(o),ct,(et,G)=>{var $e=Ua(),D=at($e);{var N=$=>{var Y=gd(),j=r(Y),X=r(j),ke=i(j,5),Ie=r(ke),M=i(Ie,2);z(()=>g(X,t(G).name)),x("click",Ie,()=>{var F;re("Lade im Cookbook ein Modell und setze den Alias auf: "+t(G).name),(F=document.querySelector(".nav-item[data-view='cookbook']"))==null||F.dispatchEvent(new MouseEvent("click"))}),x("click",M,()=>Qe(t(G).name)),f($,Y)},S=$=>{var Y=yd(),j=r(Y),X=r(j),ke=r(X),Ie=i(ke);{var M=we=>{var K=md(),U=r(K);z(()=>g(U,t(G).role)),f(we,K)};R(Ie,we=>{t(G).role&&we(M)})}var F=i(X,2);{var ae=we=>{var K=bd(),U=r(K);z(()=>g(U,t(G).meta.filename)),f(we,K)};R(F,we=>{var K;(K=t(G).meta)!=null&&K.filename&&we(ae)})}var ze=i(F,2),je=i(r(ze),2);nt(je,17,()=>{var we;return(we=t(G).api_ids)!=null&&we.length?t(G).api_ids:[t(G).name]},ct,(we,K)=>{var U=_d(),se=r(U);z(()=>g(se,t(K))),x("click",U,()=>oe(t(K))),f(we,U)});var It=i(j);Je(It,()=>{var we;return pt((we=t(G).meta)==null?void 0:we.caps)},!0);var xt=i(It);Je(xt,()=>P(t(G).meta),!0);var Lt=i(xt);Je(Lt,()=>jo(t(G).state,t(G).download_progress),!0);var C=i(Lt),ee=r(C),Ve=i(C),te=r(Ve),pe=i(te,2),Ne=i(pe,2),Ue=i(Ne,2);z(()=>{g(ke,`${t(G).name??""} `),g(ee,t(G).port??"auto")}),x("click",te,()=>de(t(G).name)),x("click",pe,()=>_e(t(G).name)),x("click",Ne,()=>Be(t(G).name)),x("click",Ue,()=>Qe(t(G).name)),f($,Y)};R(D,$=>{t(G).incomplete?$(N):$(S,-1)})}f(et,$e)}),f(I,W)};R(ot,I=>{t(o).length?I(it,-1):I(bt)})}var Ye=i(he,2);{var ft=I=>{var W=wd(),Ae=r(W),et=r(Ae),G=i(et,4),$e=r(G),D=i(G,2),N=i(r(D));Je(N,()=>br(a));var S=i(D,2),$=i(S,2);{var Y=ae=>{var ze=kd(),je=r(ze),It=i(r(je),2),xt=r(It),Lt=i(xt,2),C=i(je,2);z((ee,Ve)=>{g(xt,`Optimal ~${ee??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),g(Lt,` Aktuell ~${Ve??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),x("click",C,()=>u(E,t(O).meta.optimal_ctx,!0)),f(ae,ze)};R($,ae=>{var ze;(ze=t(O).meta)!=null&&ze.optimal_ctx&&ae(Y)})}var j=i($,4),X=i(r(j),2),ke=r(X),Ie=i(ke,2),M=r(Ie),F=i(j,2);z(()=>{g($e,t(O).name),Rt(Ie,`color:${t(B)?"var(--accent)":"var(--mut)"}`),g(M,t(B)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),x("click",W,ae=>{ae.target.classList.contains("modal-overlay")&&u(T,!1)}),x("click",et,()=>u(T,!1)),dn(S,()=>t(E),ae=>u(E,ae)),Fo(ke,()=>t(B),ae=>u(B,ae)),x("click",F,be),f(I,W)};R(Ye,I=>{t(T)&&t(O)&&I(ft)})}var We=i(Ye,2);{var dt=I=>{var W=Md(),Ae=r(W),et=r(Ae),G=i(et,2),$e=i(r(G));Je($e,()=>br(s));var D=i(G,2),N=r(D),S=i(D,4);nt(S,21,()=>l,ct,(ke,Ie)=>{var M=Sd(),F=r(M);z(()=>{Dt(M,1,t(Q)===t(Ie).id?"primary":"ghost"),Za(M,"title",t(Ie).desc),g(F,t(Ie).label)}),x("click",M,()=>Ee(t(Ie).id)),f(ke,M)});var $=i(S,4),Y=i($,2),j=r(Y),X=i(j,2);z(()=>g(N,t(Te))),x("click",W,ke=>{ke.target.classList.contains("modal-overlay")&&u(xe,!1)}),x("click",et,()=>u(xe,!1)),dn($,()=>t(H),ke=>u(H,ke)),x("click",j,()=>Ee("")),x("click",X,()=>Ee(t(H).trim().toLowerCase())),f(I,W)};R(We,I=>{t(xe)&&I(dt)})}z(()=>{ue.disabled=t(_),g(V,t(_)?"…":"Senden"),g(vt,t(o).length?t(o).length+" konfiguriert":"")}),wa(ce,()=>t(d),I=>u(d,I)),dn(Ke,()=>t(v),I=>u(v,I)),x("click",ue,m),f(e,ge),Dn()}qn(["click"]);var Cd=b('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Td=b(''),zd=b('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Pd=b(' '),Dd=b(''),$d=b(''),Id=b('
'),Ld=b('
'),Od=b('
'),Bd=b('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Rd(e,n){Pn(n,!0);const a=q(()=>pa.value),s=q(()=>pa.tracked),l=q(()=>Dr.value);let o=Jt({cpu:[],ram:[],gpu:[]});Va(()=>{var ge;if(!t(l))return;const P=t(l).gpu,oe=P&&P.vram.total+P.gtt.total>0?(P.vram.used+P.gtt.used)/(P.vram.total+P.gtt.total)*100:0;o.cpu=[...o.cpu,((ge=t(l).cpu)==null?void 0:ge.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,oe].slice(-60)});const c=q(()=>()=>{var oe;const P=(oe=t(l))==null?void 0:oe.gpu;return P&&P.vram.total+P.gtt.total>0?(P.vram.used+P.gtt.used)/(P.vram.total+P.gtt.total)*100:0}),d=q(()=>t(a).filter(P=>P.state!=="running"&&P.state!=="queued").length),v=q(()=>t(a).filter(P=>P.state==="failed").length);function p(P){if(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}function _(P){return P==null||P<0?"":P>=90?`noch ~${Math.round(P/60)} min`:`noch ~${Math.max(1,Math.round(P))} s`}function A(P){return P==="done"?'fertig':P==="failed"?'fehler':P==="canceled"?'abgebrochen':'läuft…'}function m(P){return P==="done"?"on":P==="failed"||P==="canceled"?"":"load"}async function y(P){try{await De(`/api/jobs/${P}/cancel`,{method:"POST"}),re("Abbruch angefordert…")}catch(oe){re(oe.message,!0)}}async function T(P){try{await De(`/api/jobs/${P}`,{method:"DELETE"})}catch(oe){re(oe.message,!0)}}async function O(){try{const P=await De("/api/jobs/clear",{method:"POST"});re(`${P.removed} Einträge entfernt.`)}catch(P){re(P.message,!0)}}function E(P,oe){return P.map(ge=>`
`).join("")}var B=Bd(),_e=i(at(B),2);{var be=P=>{const oe=q(()=>t(c)());var ge=Cd(),Xe=at(ge),ce=r(Xe),Ke=i(r(ce),2),ue=r(Ke),V=i(Ke,2),ne=r(V),me=i(ce,2),he=i(r(me),2),Re=r(he),Ze=i(he,2),vt=r(Ze),ot=i(me,2),bt=i(r(ot),2),it=r(bt),Ye=i(bt,2),ft=r(Ye),We=i(Xe,2),dt=i(r(We),4),I=r(dt),W=i(r(I)),Ae=r(W),et=i(I,2),G=i(r(et),2),$e=r(G),D=i(et,2),N=i(r(D)),S=r(N),$=i(D,2),Y=i(r($),2),j=r(Y),X=i(dt,2),ke=r(X),Ie=i(r(ke));Je(Ie,()=>E(o.cpu,"--accent"),!0);var M=i(ke,2),F=i(r(M));Je(F,()=>E(o.ram,"--purple"),!0);var ae=i(M,2),ze=i(r(ae));Je(ze,()=>E(o.gpu,"--on"),!0),z((je,It,xt,Lt,C,ee,Ve,te,pe,Ne,Ue,we,K)=>{g(ue,je),g(ne,It),g(Re,xt),g(vt,`${Lt??""} / ${C??""}`),g(it,ee),g(ft,Ve),g(Ae,`${te??""} / ${pe??""}`),g($e,Ne),g(S,`${Ue??""} % belegt`),g(j,`${we??""} / ${K??""}`)},[()=>{var je;return Math.round(((je=t(l).cpu)==null?void 0:je.percent)??0)},()=>{var je;return((je=t(l).cpu)==null?void 0:je.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>da(t(l).ram.used),()=>da(t(l).ram.total),()=>Math.round(t(oe)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>da(t(l).ram.used),()=>da(t(l).ram.total),()=>t(l).gpu?`${da(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${da(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var je;return Math.round(((je=t(l).disk)==null?void 0:je.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var je;return((je=t(l).cpu)==null?void 0:je.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),f(P,ge)};R(_e,P=>{t(l)&&P(be)})}var xe=i(_e,2),Te=r(xe),H=i(r(Te),2),Q=r(H),de=i(H,2);{var Ee=P=>{var oe=Td();x("click",oe,O),f(P,oe)};R(de,P=>{t(d)&&P(Ee)})}var Be=i(Te,4);{var Qe=P=>{var oe=zd();f(P,oe)},pt=P=>{var oe=Ua(),ge=at(oe);nt(ge,17,()=>t(a),ct,(Xe,ce)=>{const Ke=q(()=>p(t(ce))),ue=q(()=>t(ce).state==="running"?_(t(ce).eta_s):""),V=q(()=>t(ce).state==="running"&&t(ce).rate_bps?da(t(ce).rate_bps)+"/s":""),ne=q(()=>[t(ue),t(V)].filter(Boolean).join(" · ")),me=q(()=>t(s).includes(t(ce).id));var he=Od(),Re=r(he),Ze=r(Re),vt=i(Ze,2),ot=r(vt),bt=i(vt,2);{var it=G=>{var $e=Pd(),D=r($e);z(N=>g(D,`${N??""} %${t(ne)?` · ${t(ne)}`:""}`),[()=>Math.round(t(Ke))]),f(G,$e)};R(bt,G=>{t(Ke)!=null&&G(it)})}var Ye=i(bt,2);{var ft=G=>{var $e=Dd();z(()=>Rt($e,`${t(Ke)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),x("click",$e,D=>{D.stopPropagation(),y(t(ce).id)}),f(G,$e)},We=G=>{var $e=$d();x("click",$e,D=>{D.stopPropagation(),T(t(ce).id)}),f(G,$e)};R(Ye,G=>{t(ce).state==="running"?G(ft):G(We,-1)})}var dt=i(Ye,2);Je(dt,()=>A(t(ce).state));var I=i(Re,2);{var W=G=>{var $e=Id(),D=r($e);z(()=>Rt(D,`width:${t(Ke)??""}%`)),f(G,$e)};R(I,G=>{t(Ke)!=null&&t(ce).state==="running"&&G(W)})}var Ae=i(I,2);{var et=G=>{var $e=Ld(),D=r($e);z(N=>g(D,N),[()=>(t(ce).log||[]).join(` -`)]),f(G,$e)};R(Ae,G=>{t(me)&&G(et)})}z(G=>{Dt(Ze,1,`li-dot ${G??""}`),g(ot,t(ce).label)},[()=>m(t(ce).state)]),x("click",Re,()=>pa.toggle(t(ce).id)),x("keydown",Re,G=>G.key==="Enter"&&pa.toggle(t(ce).id)),f(Xe,he)}),f(P,oe)};R(Be,P=>{t(a).length?P(pt,-1):P(Qe)})}z(()=>g(Q,t(a).length?t(v)?t(v)+" Fehler":t(a).length+" gesamt":"")),f(e,B),Dn()}qn(["click","keydown"]);var Fd=b(' '),Kd=b(''),Nd=b('✓ fertig'),qd=b('✗ fehlgeschlagen'),Wd=b('abgebrochen'),Vd=b('läuft…'),Gd=b('
'),jd=b('

Aktueller Vorgang

'),Ud=b('

Server & Wartung

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

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Hd(e,n){Pn(n,!0);const a=q(()=>xi.value),s=q(()=>pa.value);let l=null,o=L(`Verbinde… -`),c=L("llama-swap"),d,v=L(null),p=L("");const _=new Set,A=q(()=>t(v)?t(s).find(M=>M.id===t(v)):null);Va(()=>{if(!t(A))return;const M=t(A),F=M.state==="done",ae=M.state==="failed",ze=M.state==="canceled";(F||ae||ze)&&!_.has(M.id)&&(_.add(M.id),re(F?`✓ ${t(p)} abgeschlossen.`:ze?`${t(p)} abgebrochen.`:`✗ ${t(p)} fehlgeschlagen.`,ae),F&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function m(M,F){u(v,M,!0),u(p,F,!0),pa.track(M)}yi(()=>{y()}),No(()=>{l==null||l.close()});function y(){l==null||l.close();const M=t(c);u(o,`Verbinde mit ${M}… -`);const F=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${F}//${location.host}/api/logs/${M}?token=${encodeURIComponent(nl())}`),l.onmessage=ae=>{u(o,t(o)+ae.data),d&&(d.scrollTop=d.scrollHeight)},l.onclose=()=>{u(o,t(o)+` -— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function T(M,F,ae){if(await xn({title:F,body:ae,confirmLabel:"Neustarten"}))try{await De(`/api/service/${M}/restart`,{method:"POST"}),re("Neustart ausgelöst: "+M),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(ze){re(ze.message,!0)}}async function O(){if(await xn({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 M=await De("/api/self-update",{method:"POST"});re("Update läuft — Dashboard startet gleich neu."),m(M.job_id,"Mission Control Update")}catch(M){re(M.message,!0)}}async function E(){if(!await xn({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."}))return;const M=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(M!==null)try{const F=await De("/api/update",{method:"POST",body:JSON.stringify({password:M})});re("LLM-Engine-Update läuft."),m(F.job_id,"LLM-Engine-Update")}catch(F){re(F.message,!0)}}async function B(){if(await xn({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 De("/api/unload",{method:"POST"}),re("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(M){re(M.message,!0)}}async function _e(){if(!await xn({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 M=await er({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(M)try{const F=await De("/api/os-update",{method:"POST",body:JSON.stringify({password:M})});re("OS-Update gestartet."),m(F.job_id,"OS-Update")}catch(F){re(F.message,!0)}}async function be(){if(!await xn({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 M=await er({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(M)try{await De("/api/reboot",{method:"POST",body:JSON.stringify({password:M})}),re("Reboot ausgelöst — bis gleich.")}catch(F){re(F.message,!0)}}async function xe(){u(Te,"prüfe…");try{const M=await De("/api/integration/test");u(Te,M.ok?`✓ Engine antwortet — ${M.models.length} Modell(e): ${M.models.join(", ")}`:`✗ keine Verbindung: ${M.error}`,!0),u(H,M.ok,!0)}catch(M){u(Te,"✗ "+M.message),u(H,!1)}}let Te=L(""),H=L(!1);const Q=q(()=>{var M;return((M=t(a))==null?void 0:M.models)||[]}),de=["running","ready","loading","starting"],Ee=q(()=>t(Q).find(M=>de.includes(M.state)));function Be(M){if(!M||M.state!=="running")return null;if(typeof M.progress=="number")return Math.min(100,M.progress);const ae=((M.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ae?Math.min(100,parseFloat(ae[1])):null}var Qe=Ud(),pt=i(at(Qe),2),P=r(pt),oe=i(r(P),2),ge=r(oe),Xe=i(P,4),ce=r(Xe),Ke=i(r(ce)),ue=r(Ke),V=i(ce,2),ne=i(r(V),2),me=r(ne),he=i(V,2),Re=i(r(he),2),Ze=r(Re),vt=i(Xe,2),ot=r(vt),bt=i(ot,2);{var it=M=>{var F=Fd(),ae=r(F);z(()=>{Rt(F,`color:${t(H)?"#7ee29a":"#ff9b95"}`),g(ae,t(Te))}),f(M,F)};R(bt,M=>{t(Te)&&M(it)})}var Ye=i(pt,2),ft=i(r(Ye),4),We=i(ft,2),dt=i(We,2),I=i(dt,2),W=i(I,2),Ae=i(Ye,2),et=i(r(Ae),4),G=i(et,2),$e=i(Ae,2);{var D=M=>{const F=q(()=>t(A)),ae=q(()=>t(F).state==="done"),ze=q(()=>t(F).state==="failed"),je=q(()=>t(F).state==="canceled"),It=q(()=>t(ae)||t(ze)||t(je)),xt=q(()=>Be(t(F)));var Lt=jd(),C=r(Lt),ee=i(r(C),2);{var Ve=ie=>{var ve=Kd();x("click",ve,async()=>{await xn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&De(`/api/jobs/${t(F).id}/cancel`,{method:"POST"})}),f(ie,ve)};R(ee,ie=>{t(It)||ie(Ve)})}var te=i(ee,2),pe=r(te);{var Ne=ie=>{var ve=Nd();f(ie,ve)},Ue=ie=>{var ve=qd();f(ie,ve)},we=ie=>{var ve=Wd();f(ie,ve)},K=ie=>{var ve=Vd();f(ie,ve)};R(pe,ie=>{t(ae)?ie(Ne):t(ze)?ie(Ue,1):t(je)?ie(we,2):ie(K,-1)})}var U=i(C,2),se=r(U),le=i(U,2);{var Pe=ie=>{var ve=Gd(),Ct=r(ve);z(()=>Rt(Ct,`width:${t(xt)??""}%`)),f(ie,ve)};R(le,ie=>{t(xt)!=null&&!t(It)&&ie(Pe)})}var Le=i(le,2),Me=r(Le);z(ie=>{g(se,`${t(p)??""}${t(It)?t(ae)?" — erfolgreich.":t(je)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),g(Me,ie)},[()=>(t(F).log||[]).join(` -`)]),f(M,Lt)};R($e,M=>{t(A)&&M(D)})}var N=i($e,2),S=r(N),$=i(r(S),2),Y=r($);Y.value=Y.__value="llama-swap";var j=i(Y);j.value=j.__value="mission-control";var X=i(j);X.value=X.__value="system";var ke=i(S,4),Ie=r(ke);Ko(ke,M=>d=M,()=>d),z(M=>{var F,ae,ze;Rt(oe,`margin-left:auto;${(F=t(a))!=null&&F.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"}`),g(ge,(ae=t(a))!=null&&ae.swap_ok?"● erreichbar":"● offline"),g(ue,(((ze=t(a))==null?void 0:ze.swap_url)||"—")+"/v1"),g(me,t(Ee)?t(Ee).name+` (${t(Ee).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),g(Ze,M),g(Ie,t(o))},[()=>t(Q).filter(M=>!M.incomplete).length||"keine"]),x("click",ot,xe),x("click",ft,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),x("click",We,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),x("click",dt,O),x("click",I,E),x("click",W,B),x("click",et,_e),x("click",G,be),x("change",$,y),wa($,()=>t(c),M=>u(c,M)),f(e,Qe),Dn()}qn(["click","change"]);var Jd=b('
Lade Setups…
'),Qd=b(' ×',1),tr=b('
★ Beste Wahl für dein System
'),Zd=b('
Dein Setup
'),Yd=b(''),Xd=b('
'),ec=b('· ⚠ Cache veraltet'),tc=b(" ",1),nc=b('
Frage Quellen ab…
'),ac=b('
'),ic=b('✓ installiert'),rc=b(''),sc=b('

'),lc=b('

'),oc=b(''),dc=b('

'),cc=b('
'),vc=b('
'),uc=b('
'),pc=b(" "),fc=b('
'),hc=b('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),gc=b('Alternative: — passt auf dein System.',1),mc=b('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),bc=b(''),_c=b('
Lade Dateien von HuggingFace…
'),Yr=b(""),yc=b('
Empfohlener Kontext für deine Hardware: übernehmen
'),xc=b('
Ressourcen-Check
'),kc=b('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),wc=b('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Sc=b('
',1),Mc=b('
Keine GGUF-Dateien im Repo gefunden.
'),Ec=b(''),Ac=b('
'),Cc=b(''),Tc=b('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function zc(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="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.",l={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},c=[{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 d(w){const k=(w||"").toLowerCase();for(const Z of c)if(Z.kw.some(J=>k.includes(J)))return Z.label;return"Allrounder"}function v(w=""){const k=w.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(k)||new RegExp("(?{vt(),ot()});async function vt(){u(O,!0);try{const w=await De("/api/cookbook/recipes");u(y,w.recipes||[],!0),u(T,w.recommended_id||null,!0)}catch(w){re(w.message,!0)}u(O,!1)}async function ot(w=!1){u(B,!0);try{const k=await De("/api/cookbook/discover"+(w?"?force=true":""));u(E,k,!0),u(_e,k.stale,!0)}catch(k){re("Empfehlungen nicht ladbar: "+k.message,!0)}u(B,!1)}function bt(w){w=w.trim();const k=w.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return k?k[1]:/^[\w.-]+\/[\w.-]+$/.test(w)?w:null}async function it(){const w=t(be).trim(),k=bt(w);let Z=w;if(t(H)&&!k&&(Z=Z?Z+" "+t(H):t(H)),!Z&&!k){u(xe,[],!0);return}u(Te,!0),u(de,[],!0),u(Ee,-1);try{if(k)u(xe,[{id:k,author:k.split("/")[0],downloads:0}],!0);else{const J=`https://huggingface.co/api/models?search=${encodeURIComponent(Z)}&filter=gguf&sort=${encodeURIComponent(t(Q))}&direction=-1&limit=40`,Se=await fetch(J);u(xe,await Se.json(),!0)}t(xe).forEach((J,Se)=>Ye(Se,J.id))}catch(J){re(J.message,!0),u(xe,[],!0)}u(Te,!1)}async function Ye(w,k){var Z;try{const J=await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:k,ctx:8192})});if(!((Z=J.files)!=null&&Z.length)){t(de)[w]=null,ft();return}const Se=J.files.find(kt=>{var Mt;return(Mt=kt.quant)==null?void 0:Mt.includes("Q4_K_M")})||J.files[0];t(de)[w]=Se.fit.level,ft()}catch{t(de)[w]=null,ft()}}function ft(){let w=-1,k=99;t(de).forEach((Z,J)=>{if(Z==null)return;const Se=l[Z]??99;Se=0&&k<=1?w:-1,!0)}function We(w){u(Be,t(y).find(k=>k.id===w),!0)}async function dt(w){const k=document.getElementById("cb-r-install-btn");k&&(k.disabled=!0,k.textContent="Starte…");try{const Z=await De("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:w,hf_token:ci()})});re(`${Z.count} Download${Z.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),u(Be,null),Ze("activity")}catch(Z){re(Z.message,!0),k&&(k.disabled=!1,k.textContent="Installieren")}}async function I(w,k){var Z,J;u(Qe,!0),u(pt,k,!0),u(P,w,!0),u(Xe,""),u(ce,8192),u(oe,null),u(ue,null),u(ge,""),u(Ke,!0);try{if(u(oe,await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:w,ctx:8192})}),!0),(J=(Z=t(oe))==null?void 0:Z.files)!=null&&J.length){const Se=t(oe).files.find(kt=>{var Mt;return(Mt=kt.quant)==null?void 0:Mt.includes("Q4_K_M")})||t(oe).files[0];u(ge,Se.filename,!0),Se.optimal_ctx&&t(ce)===8192&&u(ce,Se.optimal_ctx,!0),W()}}catch(Se){re(Se.message,!0)}u(Ke,!1)}function W(){var w,k,Z;!((k=(w=t(oe))==null?void 0:w.files)!=null&&k.length)||!t(ge)||(u(ue,t(oe).files.find(J=>J.filename===t(ge))||null,!0),(Z=t(ue))!=null&&Z.optimal_ctx&&t(ce)===8192&&u(ce,t(ue).optimal_ctx,!0))}async function Ae(){var w,k;if(!t(P)||!t(ge))return re("Bitte eine GGUF-Datei wählen.",!0);u(Ke,!0);try{const Z=((w=t(oe))==null?void 0:w.params_b)??7,J=((k=t(ue))==null?void 0:k.quant)??"Q4_K_M";await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(P),role:t(Xe),params_b:Z,quant:J,file:t(ge),ctx:t(ce),hf_token:ci()})}),re("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),u(Qe,!1),Ze("activity")}catch(Z){re("Fehler: "+Z.message,!0)}u(Ke,!1)}async function et(w,k,Z,J){J.disabled=!0,J.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:w,role:k,params_b:Z,quant:"Q4_K_M",hf_token:ci()})}),re("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Ze("activity")}catch(Se){re(Se.message,!0),J.disabled=!1,J.textContent="Installieren"}}function G(){u(Re,null),u(ne,""),u(me,""),u(he,[{repo:"",role:"",quant:"Q4_K_M"}],!0),u(V,!0)}function $e(w){const k=t(y).find(Z=>Z.id===w);k&&(u(Re,w,!0),u(ne,k.title,!0),u(me,k.desc||"",!0),u(he,k.models.map(Z=>({repo:Z.repo,role:Z.role,quant:Z.quant||"Q4_K_M"})),!0),u(V,!0))}async function D(){if(!t(ne).trim())return re("Bitte einen Titel angeben.",!0);const w=t(he).filter(k=>k.repo.trim());if(!w.length)return re("Mindestens ein Modell (Repo) angeben.",!0);try{t(Re)?(await De("/api/cookbook/user-recipe/"+encodeURIComponent(t(Re)),{method:"PUT",body:JSON.stringify({title:t(ne),desc:t(me),models:w})}),re("Setup aktualisiert.")):(await De("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(ne),desc:t(me),models:w})}),re("Setup gespeichert.")),u(V,!1),vt()}catch(k){re(k.message,!0)}}async function N(w){const k=t(y).find(Z=>Z.id===w);if(await xn({title:`„${(k==null?void 0:k.title)||w}" löschen?`,body:"Dein eigenes Setup wird aus dem Cookbook entfernt. Bereits installierte Modelle bleiben unangetastet.",confirmLabel:"Löschen",danger:!0}))try{await De("/api/cookbook/user-recipe/"+encodeURIComponent(w),{method:"DELETE"}),re("Setup gelöscht."),vt()}catch(Z){re(Z.message,!0)}}function S(w){if(!v(w))return"";const k=p(w);return`MoE${k?` · ~${k}B aktiv`:""}`}function $(w){return w?`${Fn(w)}`:""}var Y=Tc(),j=i(at(Y),2),X=r(j),ke=i(r(X),2),Ie=i(X,4);{var M=w=>{var k=Jd();f(w,k)},F=w=>{var k=Xd();nt(k,21,()=>t(y),ct,(Z,J)=>{const Se=q(()=>t(J).id===t(T));var kt=Yd(),Mt=r(kt);{var ye=Fe=>{var _t=Qd(),Zt=at(_t),Wt=i(Zt,2);x("click",Zt,Ot=>{Ot.stopPropagation(),$e(t(J).id)}),x("keydown",Zt,Ot=>{Ot.key==="Enter"&&(Ot.stopPropagation(),$e(t(J).id))}),x("click",Wt,Ot=>{Ot.stopPropagation(),N(t(J).id)}),x("keydown",Wt,Ot=>{Ot.key==="Enter"&&(Ot.stopPropagation(),N(t(J).id))}),f(Fe,_t)};R(Mt,Fe=>{t(J).user&&Fe(ye)})}var qe=i(Mt,2);{var tt=Fe=>{var _t=tr();f(Fe,_t)},zt=Fe=>{var _t=Zd();f(Fe,_t)};R(qe,Fe=>{t(Se)?Fe(tt):t(J).user&&Fe(zt,1)})}var rt=i(qe,2),ut=r(rt),Et=r(ut),Nt=r(Et),rn=i(ut,2),Pt=r(rn),st=i(rt,2),qt=r(st),Qt=i(st,2),$t=r(Qt);z((Fe,_t)=>{Dt(kt,1,`card-btn${t(Se)?" cb-best":""}`),g(Nt,t(J).title),Dt(rn,1,`fit-badge ${Fe??""}`),g(Pt,_t),g(qt,t(J).desc),g($t,`${t(J).models.length??""} Modell${t(J).models.length>1?"e":""} im Setup`)},[()=>_(t(J).fit_level),()=>A(t(J).fit_level)]),x("click",kt,()=>We(t(J).id)),f(Z,kt)}),f(w,k)};R(Ie,w=>{t(O)?w(M):w(F,-1)})}var ae=i(j,2),ze=r(ae),je=i(r(ze),2),It=r(je);{var xt=w=>{const k=q(()=>Math.round((Date.now()/1e3-t(E).updated)/60));var Z=tc(),J=at(Z);{var Se=tt=>{var zt=oi();z(()=>g(zt,`Quellen befragt vor ${t(k)??""} min`)),f(tt,zt)},kt=tt=>{var zt=oi();z(rt=>g(zt,`Quellen befragt vor ${rt??""} h`),[()=>Math.round(t(k)/60)]),f(tt,zt)},Mt=tt=>{var zt=oi();z(rt=>g(zt,`Quellen befragt vor ${rt??""} Tg.`),[()=>Math.round(t(k)/1440)]),f(tt,zt)};R(J,tt=>{t(k)<60?tt(Se):t(k)<1440?tt(kt,1):tt(Mt,-1)})}var ye=i(J,2);{var qe=tt=>{var zt=ec();f(tt,zt)};R(ye,tt=>{t(_e)&&tt(qe)})}f(w,Z)};R(It,w=>{var k;(k=t(E))!=null&&k.updated&&w(xt)})}var Lt=i(je,2),C=r(Lt),ee=i(ze,4);{var Ve=w=>{var k=nc();f(w,k)},te=w=>{var k=Ua(),Z=at(k);nt(Z,17,()=>t(E).categories,ct,(J,Se)=>{var kt=lc(),Mt=r(kt),ye=r(Mt),qe=r(ye),tt=i(Mt,2);nt(tt,21,()=>t(Se).models,ct,(zt,rt)=>{const ut=q(()=>t(Se).recommended&&t(rt).repo===t(Se).recommended);var Et=sc(),Nt=r(Et);{var rn=yt=>{var St=tr();f(yt,St)};R(Nt,yt=>{t(ut)&&yt(rn)})}var Pt=i(Nt,2),st=r(Pt),qt=r(st),Qt=r(qt),$t=i(qt,2),Fe=r($t),_t=i(st,2),Zt=r(_t),Wt=i(Pt,2),Ot=r(Wt);Je(Ot,()=>$(o[t(rt).role]||d(t(rt).repo)));var Wn=i(Ot,2);Je(Wn,()=>S(t(rt).repo));var Qn=i(Wt,2),$n=r(Qn),Aa=i(Qn,2);nt(Aa,17,()=>t(rt).requirements||[],ct,(yt,St)=>{var Gt=ac(),In=r(Gt);z(()=>g(In,`⚠ ${t(St)??""}`)),f(yt,Gt)});var At=i(Aa,4),ht=r(At);{var wt=yt=>{var St=ic();z(()=>Za(St,"title",`bereits eingerichtet als ${t(rt).installed??""}`)),f(yt,St)},Bt=yt=>{var St=rc();x("click",St,Gt=>et(t(rt).repo,t(rt).role,t(rt).params_b,Gt.currentTarget)),f(yt,St)};R(ht,yt=>{t(rt).installed?yt(wt):yt(Bt,-1)})}z((yt,St,Gt)=>{Dt(Et,1,`card${t(ut)?" res-best":""}`),g(Qt,t(rt).name),g(Fe,`${t(rt).author??""} · ${t(rt).params_b??""}B`),Dt(_t,1,`fit-badge ${yt??""}`),g(Zt,t(rt).fit.text),g($n,`${St??""} · ⬇ ${Gt??""}`)},[()=>_(t(rt).fit.level),()=>m(t(rt).fit),()=>(t(rt).downloads||0).toLocaleString()]),f(zt,Et)}),z(()=>g(qe,t(Se).title)),f(J,kt)}),f(w,k)};R(ee,w=>{var k;t(B)&&!t(E)?w(Ve):(k=t(E))!=null&&k.categories&&w(te,1)})}var pe=i(ae,2),Ne=i(r(pe),4),Ue=r(Ne),we=i(Ue,2),K=r(we);K.value=K.__value="downloads";var U=i(K);U.value=U.__value="trending";var se=i(U);se.value=se.__value="created_at";var le=i(we,2),Pe=r(le),Le=i(Ne,2);nt(Le,20,()=>["","coder","vision","reasoning","chat","agent"],ct,(w,k)=>{var Z=oc(),J=r(Z);z(()=>{Dt(Z,1,t(H)===k?"primary":"ghost"),g(J,k||"Alle")}),x("click",Z,()=>{u(H,k,!0),it()}),f(w,Z)});var Me=i(Le,2);{var ie=w=>{var k=cc();nt(k,21,()=>t(xe),ct,(Z,J,Se)=>{var kt=dc(),Mt=r(kt);{var ye=Wt=>{var Ot=tr();f(Wt,Ot)};R(Mt,Wt=>{Se===t(Ee)&&Wt(ye)})}var qe=i(Mt,2),tt=r(qe),zt=r(tt),rt=r(zt),ut=i(zt,2),Et=r(ut),Nt=i(tt,2),rn=r(Nt),Pt=i(qe,2),st=r(Pt);Je(st,()=>$(d(t(J).id)));var qt=i(st,2);Je(qt,()=>S(t(J).id));var Qt=i(Pt,4),$t=r(Qt),Fe=r($t),_t=i($t,2),Zt=r(_t);z((Wt,Ot,Wn,Qn,$n)=>{Dt(kt,1,`card${Se===t(Ee)?" res-best":""}`),g(rt,Wt),g(Et,t(J).author||""),Dt(Nt,1,`fit-badge ${Ot??""}`),g(rn,Wn),g(Fe,Qn),g(Zt,`⬇ ${$n??""}`)},[()=>t(J).id.split("/").pop(),()=>t(de)[Se]?_(t(de)[Se]):"warn",()=>t(de)[Se]?A(t(de)[Se]):"prüfe…",()=>t(de)[Se]?m({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(J).downloads||0).toLocaleString()]),x("click",kt,()=>I(t(J).id,t(J).id.split("/").pop())),f(Z,kt)}),f(w,k)};R(Me,w=>{t(xe).length&&w(ie)})}var ve=i(pe,2);{var Ct=w=>{const k=q(()=>t(Be));var Z=bc(),J=r(Z),Se=r(J),kt=i(Se,2),Mt=r(kt),ye=i(kt,2),qe=r(ye),tt=i(ye,2);nt(tt,21,()=>t(k).models,ct,(Pt,st)=>{var qt=fc(),Qt=r(qt),$t=r(Qt),Fe=r($t),_t=r(Fe),Zt=i(Fe,2),Wt=r(Zt),Ot=i(Zt,2);Je(Ot,()=>S(t(st).repo));var Wn=i($t,2);{var Qn=wt=>{var Bt=vc(),yt=r(Bt);z(()=>g(yt,t(st).why)),f(wt,Bt)};R(Wn,wt=>{t(st).why&&wt(Qn)})}var $n=i(Wn,2);{var Aa=wt=>{var Bt=uc(),yt=r(Bt);z((St,Gt,In)=>g(yt,`~${St??""} GB · ~${Gt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(st).fit.req_gb??0).toFixed(1),()=>Math.round(t(st).fit.tps??0),()=>Math.round((t(st).optimal_ctx||8192)/1024)]),f(wt,Bt)};R($n,wt=>{t(st).fit&&wt(Aa)})}var At=i(Qt,2);{var ht=wt=>{var Bt=pc(),yt=r(Bt);z(St=>{Dt(Bt,1,`fit-badge ${St??""}`),g(yt,t(st).fit.text)},[()=>_(t(st).fit.level)]),f(wt,Bt)};R(At,wt=>{t(st).fit&&wt(ht)})}z(()=>{g(_t,t(st).name),g(Wt,t(st).role)}),f(Pt,qt)});var zt=i(tt,2);{var rt=Pt=>{const st=q(()=>Math.max(...t(k).models.map(Fe=>{var _t;return((_t=Fe.fit)==null?void 0:_t.req_gb)??0})));var qt=hc(),Qt=i(r(qt)),$t=r(Qt);z(Fe=>g($t,`~${Fe??""} GB`),[()=>t(st).toFixed(1)]),f(Pt,qt)};R(zt,Pt=>{t(k).models.length&&t(k).models[0].fit&&Pt(rt)})}var ut=i(zt,2);{var Et=Pt=>{const st=q(()=>t(y).find(Fe=>!Fe.user&&Fe.fit_level!=="too_tight"&&Fe.id!==t(k).id));var qt=mc(),Qt=i(r(qt));{var $t=Fe=>{var _t=gc(),Zt=i(at(_t)),Wt=r(Zt);z(()=>g(Wt,`„${t(st).title??""}" ansehen`)),x("click",Zt,Ot=>{Ot.preventDefault(),u(Be,null),setTimeout(()=>We(t(st).id),50)}),f(Fe,_t)};R(Qt,Fe=>{t(st)&&Fe($t)})}f(Pt,qt)};R(ut,Pt=>{t(k).fit_level==="too_tight"&&Pt(Et)})}var Nt=i(ut,2),rn=r(Nt);z(()=>{g(Mt,t(k).title),g(qe,t(k).desc),Dt(Nt,1,`primary${t(k).fit_level==="too_tight"?" warn":""}`),g(rn,t(k).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),x("click",Z,Pt=>{Pt.target.classList.contains("modal-overlay")&&u(Be,null)}),x("click",Se,()=>u(Be,null)),x("click",Nt,()=>dt(t(k).id)),f(w,Z)};R(ve,w=>{t(Be)&&w(Ct)})}var Tt=i(ve,2);{var Kt=w=>{var k=Ec(),Z=r(k),J=r(Z),Se=i(J,2),kt=r(Se),Mt=i(Se,2),ye=r(Mt),qe=i(Mt,2);{var tt=ut=>{var Et=_c();f(ut,Et)},zt=ut=>{var Et=Sc(),Nt=i(at(Et),2);nt(Nt,21,()=>t(oe).files,ct,(At,ht)=>{const wt=q(()=>t(ht).fit.level==="perfect"?"●":t(ht).fit.level==="marginal"?"◐":"○");var Bt=Yr(),yt=r(Bt),St={};z(()=>{g(yt,`${t(wt)??""} ${t(ht).filename??""}`),St!==(St=t(ht).filename)&&(Bt.value=(Bt.__value=t(ht).filename)??"")}),f(At,Bt)});var rn=i(Nt,2),Pt=r(rn),st=i(r(Pt),2),qt=i(Pt,2),Qt=r(qt),$t=i(r(Qt));Je($t,()=>br(a));var Fe=i(Qt,2),_t=i(rn,2);{var Zt=At=>{var ht=yc(),wt=i(r(ht)),Bt=r(wt),yt=i(wt,2);z(St=>g(Bt,`~${St??""}k`),[()=>Math.round(t(ue).optimal_ctx/1024)]),x("click",yt,St=>{St.preventDefault(),u(ce,t(ue).optimal_ctx,!0)}),f(At,ht)};R(_t,At=>{var ht;(ht=t(ue))!=null&&ht.optimal_ctx&&At(Zt)})}var Wt=i(_t,2);{var Ot=At=>{var ht=xc(),wt=r(ht),Bt=i(r(wt),2),yt=r(Bt),St=i(wt,2),Gt=r(St);z((In,ki,Gi)=>{g(yt,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(ue).quant||"GGUF")??""}`),Dt(St,1,`fit-badge ${Gi??""}`),g(Gt,t(ue).fit.text)},[()=>(t(ue).fit.req_gb??0).toFixed(1),()=>Math.round(t(ue).fit.tps??0),()=>_(t(ue).fit.level)]),f(At,ht)};R(Wt,At=>{t(ue)&&At(Ot)})}var Wn=i(Wt,2);{var Qn=At=>{const ht=q(()=>t(oe).files.find(Gt=>Gt.fit.level!=="too_tight"&&Gt.filename!==t(ge)));var wt=Ua(),Bt=at(wt);{var yt=Gt=>{var In=kc(),ki=i(r(In)),Gi=r(ki);z(ji=>g(Gi,`${t(ht).filename??""} (${ji??""})`),[()=>A(t(ht).fit.level)]),x("click",ki,ji=>{ji.preventDefault(),u(ge,t(ht).filename,!0),W()}),f(Gt,In)},St=Gt=>{var In=wc();f(Gt,In)};R(Bt,Gt=>{t(ht)?Gt(yt):Gt(St,-1)})}f(At,wt)};R(Wn,At=>{var ht,wt;((ht=t(ue))==null?void 0:ht.fit.level)==="too_tight"&&((wt=t(oe))!=null&&wt.files)&&At(Qn)})}var $n=i(Wn,2),Aa=r($n);z(()=>{var At,ht;Dt($n,1,`primary${((At=t(ue))==null?void 0:At.fit.level)==="too_tight"?" warn":""}`),$n.disabled=t(Ke),g(Aa,t(Ke)?"Starte…":((ht=t(ue))==null?void 0:ht.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),x("change",Nt,W),wa(Nt,()=>t(ge),At=>u(ge,At)),dn(st,()=>t(Xe),At=>u(Xe,At)),dn(Fe,()=>t(ce),At=>u(ce,At)),x("click",$n,Ae),f(ut,Et)},rt=ut=>{var Et=Mc();f(ut,Et)};R(qe,ut=>{var Et,Nt;t(Ke)&&!t(oe)?ut(tt):(Nt=(Et=t(oe))==null?void 0:Et.files)!=null&&Nt.length?ut(zt,1):t(Ke)||ut(rt,2)})}z(()=>{g(kt,t(pt)),g(ye,t(P))}),x("click",k,ut=>{ut.target.classList.contains("modal-overlay")&&u(Qe,!1)}),x("click",J,()=>u(Qe,!1)),f(w,k)};R(Tt,w=>{t(Qe)&&w(Kt)})}var hn=i(Tt,2);{var oa=w=>{var k=Cc(),Z=r(k),J=r(Z),Se=i(J,2),kt=r(Se),Mt=i(Se,6),ye=i(Mt,4),qe=i(ye,4);nt(qe,17,()=>t(he),ct,(ut,Et,Nt)=>{var rn=Ac(),Pt=r(rn),st=i(Pt,2),qt=i(st,2);nt(qt,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],ct,($t,Fe)=>{var _t=Yr(),Zt=r(_t),Wt={};z(()=>{g(Zt,Fe),Wt!==(Wt=Fe)&&(_t.__value=Fe)}),f($t,_t)});var Qt=i(qt,2);dn(Pt,()=>t(Et).repo,$t=>t(Et).repo=$t),dn(st,()=>t(Et).role,$t=>t(Et).role=$t),wa(qt,()=>t(Et).quant,$t=>t(Et).quant=$t),x("click",Qt,()=>u(he,t(he).filter(($t,Fe)=>Fe!==Nt),!0)),f(ut,rn)});var tt=i(qe,2),zt=i(tt,4),rt=r(zt);z(()=>{g(kt,t(Re)?"Setup bearbeiten":"Eigenes Setup erstellen"),g(rt,t(Re)?"Änderungen speichern":"Setup speichern")}),x("click",k,ut=>{ut.target.classList.contains("modal-overlay")&&u(V,!1)}),x("click",J,()=>u(V,!1)),dn(Mt,()=>t(ne),ut=>u(ne,ut)),dn(ye,()=>t(me),ut=>u(me,ut)),x("click",tt,()=>u(he,[...t(he),{repo:"",role:"",quant:"Q4_K_M"}],!0)),x("click",zt,D),f(w,k)};R(hn,w=>{t(V)&&w(oa)})}z(()=>{Lt.disabled=t(B),g(C,t(B)?"Suche…":"Aktualisieren"),le.disabled=t(Te),g(Pe,t(Te)?"Lade…":"Suchen")}),x("click",ke,G),x("click",Lt,()=>ot(!0)),x("keydown",Ue,w=>w.key==="Enter"&&it()),dn(Ue,()=>t(be),w=>u(be,w)),wa(we,()=>t(Q),w=>u(Q,w)),x("click",le,it),f(e,Y),Dn()}qn(["click","keydown","change"]);var Pc=b(`
Du öffnest Mission Control über einen Proxy/Namen. 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.
`),Dc=b(' '),$c=b('
'),Ic=b(' '),Lc=b(''),Xr=b(''),Oc=b('

Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.

Jan AI öffnen → linke Leiste → Remote-Modelle+ Modell hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
',1),Bc=b('

Datei anlegen oder öffnen: ~/.continue/config.json

Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.

Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.

Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
',1),Rc=b('

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Fc=b('

Ö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.

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

Danach im Agent-Panel das Modell auswählen.
Zed herunterladen: zed.dev — kostenlos, native Performance, Windows/macOS/Linux.
',1),Kc=b('

Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):

Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc

Den "providers"-Block in die bestehende opencode.jsonc einfügen (nicht die ganze Datei ersetzen). Falls bereits ein "llama-swap"-Eintrag existiert: vorher löschen.

Danach in OpenCode /models wählen.

OpenCode Desktop: opencode.ai
',1),Nc=b('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
Cline für VS Code: VS Code Marketplace · für JetBrains: JetBrains Marketplace
',1),qc=b('

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

',1),Wc=b('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Vc=b('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?
Chat
Coding-Assistenten

4 · Config-Snippet

',1),Gc=b('

2 · Erst ein Modell installieren

Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),jc=b(''),Uc=b('

In Cline: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.

In Claude Code: Block in ~/.claude/settings.json unter "mcpServers" einfügen.

Einmalig auf dem Windows-PC: pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).
',1),Hc=b('

Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.

Einmalig: pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.
',1),Jc=b('

Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad /opt/mission-control/mcp_memory.py ist bereits korrekt — kein weiteres Setup nötig.

'),Qc=b(`

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

Gedächtnis-MCP

Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen - über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Zc(e,n){Pn(n,!0);const a=q(()=>xi.value),s=q(()=>{var S;return(((S=t(a))==null?void 0:S.models)||[]).filter($=>!$.incomplete)});let l=L("zed"),o=L(Jt([])),c=L(""),d=L(!1),v=L("cline"),p=L(Jt(localStorage.getItem("mc_ip_override")||""));function _(S){return/^\d{1,3}(\.\d{1,3}){3}$/.test(S)}function A(){return location.protocol==="https:"||!_(location.hostname)}function m(){return`http://${t(p).trim()||location.hostname}:8080/v1`}const y=q(m);function T(){const S=t(p).trim();S?localStorage.setItem("mc_ip_override",S):localStorage.removeItem("mc_ip_override")}const O=q(()=>Ee(t(v))),E=q(()=>t(o).length?t(o):t(s).map(S=>S.name)),B=q(()=>t(E)[0]||"coder"),_e=q(()=>{var S;return(S=t(s).find($=>{var Y,j;return(j=(Y=$.meta)==null?void 0:Y.caps)==null?void 0:j.includes("Bild")}))==null?void 0:S.name});function be(S,$){const j=($.length?t(s).filter(X=>$.includes(X.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(X=>{var M,F;const ke=(((M=X.meta)==null?void 0:M.caps)||[]).some(ae=>/Bild|Vision/i.test(ae)),Ie=((F=X.meta)==null?void 0:F.ctx)||131072;return` { "name": "${X.name}", "display_name": "${X.name}", "max_tokens": ${Ie}${ke?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, +
`;const u=d.querySelector("input"),p=_=>{d.remove(),v(_)};d.addEventListener("click",_=>{if(_.target===d)return p(null);const C=_.target.closest("[data-x]");C&&p(C.getAttribute("data-x")==="1"?u.value||"":null)}),u.addEventListener("keydown",_=>{_.key==="Enter"&&p(u.value||""),_.key==="Escape"&&p(null)}),document.body.appendChild(d),u.focus()})}function Uo(e="overview"){const n=jr(".nav-item[data-view]:not(.disabled)"),a=jr(".view[data-view]"),s=new Set(a.map(o=>o.dataset.view));function l(o){s.has(o)||(o=e),a.forEach(v=>v.hidden=v.dataset.view!==o),n.forEach(v=>v.classList.toggle("active",v.dataset.view===o)),location.hash!=="#/"+o&&(location.hash="#/"+o)}return n.forEach(o=>o.addEventListener("click",v=>{v.preventDefault(),l(o.dataset.view)})),window.addEventListener("hashchange",()=>l(location.hash.replace("#/",""))),l(location.hash.replace("#/","")||e),{show:l}}let Hr=L(null);const xi={get value(){return t(Hr)},set(e){c(Hr,e,!0)}};let Jr=L(Jt([])),ea=L(Jt([]));const fa={get value(){return t(Jr)},set(e){c(Jr,e||[],!0)},get tracked(){return t(ea)},track(e){t(ea).includes(e)||c(ea,[...t(ea),e],!0)},toggle(e){c(ea,t(ea).includes(e)?t(ea).filter(n=>n!==e):[...t(ea),e],!0)}};let Qr=L(null);const Dr={get value(){return t(Qr)},set(e){c(Qr,e,!0)}},Ho="5";var os;typeof window<"u"&&((os=window.__svelte??(window.__svelte={})).v??(os.v=new Set)).add(Ho);var Jo=b('— bereit für Anfragen'),Qo=b('
Temperatur (GPU)
Freier Speicher
GB
',1),Zo=b('
Temperatur
messe…
Freier Speicher
messe…
',1),Yo=b('
'),Xo=b('
Warte auf Messwerte…
'),ed=b('
Noch kein Modell eingerichtet — starte hier:
',1),td=b('
Die häufigsten Aufgaben — ein Klick.
',1),nd=b('Bild'),ad=b('Code'),id=b('Text'),rd=b('∞ aktiv'),sd=b(''),ld=b('
'),Zr=b('
'),od=b('
Noch keine Modelle
Hol dir unter „Cookbook" ein Modell, das auf deine Hardware passt.
'),dd=b('
'),cd=b('
News gerade nicht ladbar.
'),vd=b('

LLM-Engine
Aktives Modell

System-Gesundheit

Auslastung in Echtzeit.

Schnellstart

Dein Stack

Top-News

Alle →
',1);function ud(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>Dr.value),l=G(()=>{var T;return((T=t(a))==null?void 0:T.models)||[]}),o=G(()=>{var T;return((T=t(a))==null?void 0:T.swap_ok)??!1}),v=["running","ready","loading","starting"],d=G(()=>t(l).find(T=>v.includes(T.state))),u=G(()=>t(l).filter(T=>!T.incomplete)),p=G(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?"Achtung: Speicher wird knapp.":"Alles läuft rund.":"LLM-Engine offline":"Verbinde…"),_=G(()=>t(a)?t(o)?t(s)&&t(s).ram.percent>=90?`Arbeitsspeicher bei ${Math.round(t(s).ram.percent)} % — eventuell Speicher freigeben.`:`${t(u).length} ${t(u).length===1?"Modell":"Modelle"} konfiguriert · ${t(d)?`„${t(d).name}" geladen`:"keines geladen"} · keine Warnungen.`:"Der llama-swap-Dienst antwortet gerade nicht.":""),C=G(()=>()=>{var Q;const T=(Q=t(s))==null?void 0:Q.gpu;return T&&T.vram.total+T.gtt.total>0?(T.vram.used+T.gtt.used)/(T.vram.total+T.gtt.total)*100:0});let m=L(Jt([])),y=L(null);yi(async()=>{try{c(m,((await De("/api/news")).items||[]).slice(0,4),!0)}catch{}});async function $(){await xn({title:"Speicher freigeben?",body:"Alle aktuell geladenen Modelle werden aus dem Grafikspeicher geworfen. Sie laden beim nächsten Aufruf automatisch neu.",confirmLabel:"Speicher freigeben"})&&(await De("/api/unload",{method:"POST"}),M())}async function O(T){c(y,T,!0);try{await De("/api/preload?model="+encodeURIComponent(T),{method:"POST"})}catch(Q){ie("Laden fehlgeschlagen: "+(Q.message||"Engine nicht erreichbar?"),!0)}c(y,null),M()}function M(){document.dispatchEvent(new Event("mc:refresh"))}function F(T){var Q;(Q=document.querySelector(`.nav-item[data-view="${T}"]`))==null||Q.dispatchEvent(new MouseEvent("click"))}function ye(T){return T>=90?"red":T>=75?"":"green"}function xe(T){return T==null?"":T>=75?"red":T>=55?"":"green"}function ke(T){return T>=90?"red":T>=70?"":"green"}var Ie=vd(),Z=Xe(Ie),X=r(Z),ve=r(X),ze=r(ve),Re=i(ze);{var je=T=>{var Q=Jo();f(T,Q)};q(Re,T=>{t(o)&&!t(d)&&T(je)})}var ot=i(ve,2),I=r(ot),re=i(Z,2),be=r(re),Je=r(be),de=i(r(Je),2);He(de,()=>jt("server"),!0);var Fe=i(Je,2),ue=r(Fe),at=i(Fe,2),Qe=r(at),it=i(be,2),dt=r(it),rt=i(r(dt),2);He(rt,()=>jt("cpu"),!0);var Tt=i(dt,2),zt=r(Tt),Wt=i(Tt,2),qt=r(Wt);{var Gt=T=>{var Q=oi();D(Be=>g(Q,`${Be??""} · ${t(d).state??""}`),[()=>{var Be;return(Be=t(d).meta)!=null&&Be.ctx?Math.round(t(d).meta.ctx/1024)+"k ctx":""}]),f(T,Q)},Lt=T=>{var Q=oi("lädt bei erster Anfrage");f(T,Q)};q(qt,T=>{t(d)?T(Gt):T(Lt,-1)})}var Ot=i(it,2);{var U=T=>{const Q=G(()=>{var hn;return t(s).gpu_temp??((hn=t(s).cpu)==null?void 0:hn.temp)??null}),Be=G(()=>xe(t(Q))),ne=G(()=>t(s).ram.total-t(s).ram.used),he=G(()=>100-t(s).ram.percent);var Ne=Qo(),We=Xe(Ne),Ee=r(We),W=i(r(Ee));He(W,()=>jt("thermo"),!0);var J=i(Ee,2),le=r(J),oe=i(J,2),$e=r(oe),Le=i(We,2),Te=r(Le),se=i(r(Te));He(se,()=>jt("database"),!0);var ce=i(Te,2),wt=r(ce),St=i(ce,2),Bt=r(St);D((hn,da,E,S)=>{At(We,1,`kpi ${t(Be)??""}`),g(le,hn),g($e,t(Q)==null?"messe…":t(Q)<55?"kühl":t(Q)<75?"normal":"⚠ heiß"),At(Le,1,`kpi ${t(he)<15?"red":t(he)<30?"":"green"}`),g(wt,da),g(Bt,`von ${E??""} GB · ${S??""} % frei`)},[()=>t(Q)!=null?`${Math.round(t(Q))}°C`:"–",()=>Math.round(t(ne)/1073741824),()=>Math.round(t(s).ram.total/1073741824),()=>Math.round(t(he))]),f(T,Ne)},ae=T=>{var Q=Zo();f(T,Q)};q(Ot,T=>{t(s)?T(U):T(ae,-1)})}var A=i(re,2),B=r(A),_e=i(r(B),4);{var Ce=T=>{const Q=G(()=>t(C)());var Be=Ha(),ne=Xe(Be);Ye(ne,17,()=>{var he;return[["Prozessor (CPU)",((he=t(s).cpu)==null?void 0:he.percent)??0,""],["Arbeitsspeicher (RAM)",t(s).ram.percent,ye(t(s).ram.percent)],["Grafikspeicher (VRAM)",t(Q),ke(t(Q))]]},lt,(he,Ne)=>{var We=G(()=>aa(t(Ne),3));let Ee=()=>t(We)[0],W=()=>t(We)[1];const J=G(()=>Math.max(0,Math.min(100,W()||0)));var le=Yo(),oe=r(le),$e=r(oe),Le=r($e),Te=i($e),se=r(Te),ce=i(oe,2),wt=r(ce);D((St,Bt)=>{g(Le,Ee()),g(se,`${St??""} %`),At(ce,1,`bar ${t(J)>=90?"bad":t(J)>=75?"warn":""}`),$t(wt,`width:${Bt??""}%`)},[()=>Math.round(t(J)),()=>Math.max(2,t(J))]),f(he,le)}),f(T,Be)},V=T=>{var Q=Xo();f(T,Q)};q(_e,T=>{t(s)?T(Ce):T(V,-1)})}var pe=i(B,2),z=i(r(pe),2);{var R=T=>{var Q=ed(),Be=i(Xe(Q),2),ne=r(Be);He(ne,()=>jt("search"),!0);var he=i(ne,4);He(he,()=>jt("chevron"),!0);var Ne=i(Be,2),We=r(Ne);He(We,()=>jt("swap"),!0);var Ee=i(We,4);He(Ee,()=>jt("chevron"),!0);var W=i(Ne,2),J=r(W);He(J,()=>jt("file"),!0);var le=i(J,4);He(le,()=>jt("chevron"),!0),k("click",Be,()=>F("cookbook")),k("click",Ne,()=>F("connect")),k("click",W,()=>F("guides")),f(T,Q)},x=T=>{var Q=td(),Be=i(Xe(Q),2),ne=r(Be);He(ne,()=>jt("search"),!0);var he=i(ne,4);He(he,()=>jt("chevron"),!0);var Ne=i(Be,2),We=r(Ne);He(We,()=>jt("refresh"),!0);var Ee=i(We,4);He(Ee,()=>jt("chevron"),!0);var W=i(Ne,2),J=r(W);He(J,()=>jt("file"),!0);var le=i(J,4);He(le,()=>jt("chevron"),!0);var oe=i(W,2),$e=r(oe);He($e,()=>jt("swap"),!0);var Le=i($e,4);He(Le,()=>jt("chevron"),!0),k("click",Be,()=>F("cookbook")),k("click",Ne,$),k("click",W,()=>F("server")),k("click",oe,()=>F("connect")),f(T,Q)};q(z,T=>{t(u).length?T(x,-1):T(R)})}var P=i(A,2),N=r(P),j=r(N),H=i(r(j),2),fe=r(H),me=i(j,2);{var w=T=>{var Q=Zr();Ye(Q,21,()=>t(u),lt,(Be,ne)=>{const he=G(()=>v.includes(t(ne).state)),Ne=G(()=>t(ne).state==="downloading"),We=G(()=>t(ne).state==="loading"||t(ne).state==="starting"||t(Ne)?"load":t(he)?"on":""),Ee=G(()=>t(Ne)?`↓ ${t(ne).download_progress!=null?Math.round(t(ne).download_progress)+"%":"..."}`:t(ne).state==="loading"||t(ne).state==="starting"?"lädt…":t(he)?"geladen ✓":"bereit");var W=ld(),J=r(W),le=i(J,2),oe=r(le),$e=r(oe),Le=r($e),Te=i($e,2);{var se=Me=>{var qe=nd();f(Me,qe)},ce=G(()=>{var Me,qe;return(qe=(Me=t(ne).meta)==null?void 0:Me.caps)==null?void 0:qe.includes("Bild")}),wt=Me=>{var qe=ad();f(Me,qe)},St=G(()=>{var Me,qe;return(qe=(Me=t(ne).meta)==null?void 0:Me.caps)==null?void 0:qe.includes("Code")}),Bt=Me=>{var qe=id();f(Me,qe)};q(Te,Me=>{t(ce)?Me(se):t(St)?Me(wt,1):Me(Bt,-1)})}var hn=i(Te,2);{var da=Me=>{var qe=rd();f(Me,qe)};q(hn,Me=>{t(ne).ttl>=99999&&Me(da)})}var E=i(oe,2),S=r(E),te=i(le,2),Y=r(te),Ae=r(Y),mt=i(Y,2);{var yt=Me=>{var qe=sd(),Ze=r(qe);D(()=>{$t(qe,`padding:3px 9px;font-size:12px;opacity:${t(y)===t(ne).name?".5":"1"}`),qe.disabled=t(y)===t(ne).name,g(Ze,t(y)===t(ne).name?"…":"Laden")}),k("click",qe,()=>O(t(ne).name)),f(Me,qe)};q(mt,Me=>{!t(he)&&!t(Ne)&&t(o)&&Me(yt)})}D((Me,qe)=>{var Ze;At(J,1,`li-dot ${t(We)??""}`),$t($e,t(he)?"color:var(--accent)":""),g(Le,t(ne).name),g(S,`${Me??""} + ${(Ze=t(ne).meta)!=null&&Ze.quant?" · "+t(ne).meta.quant:""} + ${qe??""}`),$t(Y,`white-space:nowrap;color:${t(he)?"var(--on)":"var(--mut)"}`),g(Ae,t(Ee))},[()=>{var Me;return(Me=t(ne).meta)!=null&&Me.ctx?Math.round(t(ne).meta.ctx/1024)+"k ctx":""},()=>{var Me;return(Me=t(ne).meta)!=null&&Me.size_bytes?" · "+(t(ne).meta.size_bytes/1073741824).toFixed(1)+" GB":""}]),f(Be,W)}),f(T,Q)},K=T=>{var Q=od(),Be=i(r(Q),4);k("click",Be,()=>F("cookbook")),f(T,Q)};q(me,T=>{t(u).length?T(w):T(K,-1)})}var ee=i(N,2),we=r(ee),Se=i(r(we),2),ft=i(we,2);{var st=T=>{var Q=Zr();Ye(Q,21,()=>t(m),lt,(Be,ne)=>{var he=dd(),Ne=r(he),We=r(Ne),Ee=r(We),W=i(We,2),J=r(W);D(()=>{Aa(he,"href",t(ne).link),g(Ee,t(ne).title),g(J,`${t(ne).source??""}${t(ne).relevant?" · für dich":""}`)}),f(Be,he)}),f(T,Q)},Ue=T=>{var Q=cd();f(T,Q)};q(ft,T=>{t(m).length?T(st):T(Ue,-1)})}D(T=>{g(ze,`${t(p)??""} `),g(I,t(_)),At(be,1,`kpi ${t(o)?"green":"red"}`),g(ue,t(o)?"Online":"Offline"),g(Qe,T),At(it,1,`kpi ${t(d)?"blue":"muted"}`),g(zt,t(d)?t(d).name:"Keins"),g(fe,t(u).length?t(u).length+" konfiguriert":"")},[()=>{var T,Q;return((Q=(T=t(a))==null?void 0:T.swap_url)==null?void 0:Q.replace(/^https?:\/\//,""))??"—"}]),k("click",Se,()=>F("news")),k("keydown",Se,T=>T.key==="Enter"&&F("news")),f(e,Ie),Dn()}qn(["click","keydown"]);var pd=b(""),fd=b('
'),hd=b('
Noch keine Modelle konfiguriert
Hol dir unter „Cookbook" ein passendes Modell.
'),gd=b('
kein Modell hinterlegt
leere Rolleleer '),md=b(' '),bd=b('
'),_d=b(' '),yd=b('
API-Name:
'),xd=b('
ModellKannDetailsStatusPortAktionen
'),kd=b('
Empfohlen für deine Hardware

'),wd=b(''),Sd=b(''),Md=b(''),Ed=b('

Modelle

Deine konfigurierten Modelle — testen, Kontext anpassen oder aus dem Speicher werfen.

Schnelltest

Schreib eine Nachricht — das gewählte Modell wird automatisch geweckt.

Modelle & Ports

Modelle laden automatisch, sobald eine Anfrage kommt — du musst nichts manuell starten.
',1);function Ad(e,n){Pn(n,!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.",s="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.",l=[{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=G(()=>{var A;return((A=xi.value)==null?void 0:A.models)||[]});function v(){document.dispatchEvent(new Event("mc:refresh"))}let d=L(""),u=L(""),p=L(""),_=L(!1);const C=G(()=>t(o).filter(A=>!A.incomplete));async function m(){var B;const A=t(d)||((B=t(C)[0])==null?void 0:B.name);if(!(!A||!t(u).trim())){c(_,!0),c(p,"(wecke Modell, kann beim Laden kurz dauern…)");try{const _e=await De("/api/chat",{method:"POST",body:JSON.stringify({model:A,message:t(u)})});c(p,_e.reply,!0)}catch(_e){c(p,"Fehler: "+_e.message)}c(_,!1),v()}}const y=300;let $=L(!1),O=L(null),M=L(8192),F=L(!1);function ye(A){var B;c(O,t(o).find(_e=>_e.name===A),!0),t(O)&&(c(M,((B=t(O).meta)==null?void 0:B.ctx)||8192,!0),c(F,(t(O).ttl??y)>=99999),c($,!0))}async function xe(){const A=t(F)?99999:y;try{await De("/api/update_model",{method:"POST",body:JSON.stringify({alias:t(O).name,ctx:t(M),ttl:A})}),ie("Gespeichert — aktiv beim nächsten Modell-Start."),c($,!1),v()}catch(B){ie(B.message,!0)}}let ke=L(!1),Ie=L(""),Z=L(""),X=L("");function ve(A){const B=t(o).find(_e=>_e.name===A);c(Ie,A,!0),c(X,(B==null?void 0:B.role)||"",!0),c(Z,""),c(ke,!0)}async function ze(A){try{await De("/api/set_role",{method:"POST",body:JSON.stringify({alias:t(Ie),role:A})}),ie(A?`Rolle gesetzt: ${A}`:"Rolle entfernt."),c(ke,!1),v()}catch(B){ie(B.message,!0)}}async function Re(A){if(await xn({title:`„${A}" entladen?`,body:"Das Modell wird aus dem Grafikspeicher geworfen und lädt beim nächsten Aufruf automatisch neu.",confirmLabel:"Entladen"}))try{await De("/api/unload?model="+encodeURIComponent(A),{method:"POST"}),ie("Entladen: "+A),setTimeout(v,600)}catch(B){ie(B.message,!0)}}async function je(A){if(await xn({title:`„${A}" 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 B=await De("/api/delete_model",{method:"POST",body:JSON.stringify({alias:A})});ie(B.note||"Gelöscht: "+A),setTimeout(v,600)}catch(B){ie(B.message,!0)}}function ot(A){return A!=null&&A.length?A.map(B=>B==="Code"?'Code':B==="Bild"?'Bild':'Text').join(" "):"–"}function I(A){if(!A)return"–";const B=A.quant||"?",_e=A.ctx?Math.round(A.ctx/1024)+"K":"?",Ce=A.size_bytes?(A.size_bytes/1024**3).toFixed(1)+" GB":"?";return`${B} · ${_e} · ${Ce}`}function re(A){var B;(B=navigator.clipboard)==null||B.writeText(A),ie("Kopiert: "+A)}var be=Ed(),Je=i(Xe(be),2),de=i(r(Je),6);Ye(de,21,()=>t(C),lt,(A,B)=>{var _e=pd(),Ce=r(_e),V={};D(()=>{g(Ce,t(B).name),V!==(V=t(B).name)&&(_e.value=(_e.__value=t(B).name)??"")}),f(A,_e)});var Fe=i(de,4),ue=i(Fe,2),at=r(ue),Qe=i(ue,2);{var it=A=>{var B=fd(),_e=r(B);D(()=>g(_e,t(p))),f(A,B)};q(Qe,A=>{t(p)&&A(it)})}var dt=i(Je,2),rt=r(dt),Tt=i(r(rt)),zt=r(Tt),Wt=i(rt,4);{var qt=A=>{var B=hd();f(A,B)},Gt=A=>{var B=xd(),_e=i(r(B));Ye(_e,21,()=>t(o),lt,(Ce,V)=>{var pe=Ha(),z=Xe(pe);{var R=P=>{var N=gd(),j=r(N),H=r(j),fe=i(j,5),me=r(fe),w=i(me,2);D(()=>g(H,t(V).name)),k("click",me,()=>{var K;ie("Lade im Cookbook ein Modell und setze den Alias auf: "+t(V).name),(K=document.querySelector(".nav-item[data-view='cookbook']"))==null||K.dispatchEvent(new MouseEvent("click"))}),k("click",w,()=>je(t(V).name)),f(P,N)},x=P=>{var N=yd(),j=r(N),H=r(j),fe=r(H),me=i(fe);{var w=Ee=>{var W=md(),J=r(W);D(()=>g(J,t(V).role)),f(Ee,W)};q(me,Ee=>{t(V).role&&Ee(w)})}var K=i(H,2);{var ee=Ee=>{var W=bd(),J=r(W);D(()=>g(J,t(V).meta.filename)),f(Ee,W)};q(K,Ee=>{var W;(W=t(V).meta)!=null&&W.filename&&Ee(ee)})}var we=i(K,2),Se=i(r(we),2);Ye(Se,17,()=>{var Ee;return(Ee=t(V).api_ids)!=null&&Ee.length?t(V).api_ids:[t(V).name]},lt,(Ee,W)=>{var J=_d(),le=r(J);D(()=>g(le,t(W))),k("click",J,()=>re(t(W))),f(Ee,J)});var ft=i(j);He(ft,()=>{var Ee;return ot((Ee=t(V).meta)==null?void 0:Ee.caps)},!0);var st=i(ft);He(st,()=>I(t(V).meta),!0);var Ue=i(st);He(Ue,()=>jo(t(V).state,t(V).download_progress),!0);var T=i(Ue),Q=r(T),Be=i(T),ne=r(Be),he=i(ne,2),Ne=i(he,2),We=i(Ne,2);D(()=>{g(fe,`${t(V).name??""} `),g(Q,t(V).port??"auto")}),k("click",ne,()=>ve(t(V).name)),k("click",he,()=>ye(t(V).name)),k("click",Ne,()=>Re(t(V).name)),k("click",We,()=>je(t(V).name)),f(P,N)};q(z,P=>{t(V).incomplete?P(R):P(x,-1)})}f(Ce,pe)}),f(A,B)};q(Wt,A=>{t(o).length?A(Gt,-1):A(qt)})}var Lt=i(dt,2);{var Ot=A=>{var B=wd(),_e=r(B),Ce=r(_e),V=i(Ce,4),pe=r(V),z=i(V,2),R=i(r(z));He(R,()=>br(a));var x=i(z,2),P=i(x,2);{var N=ee=>{var we=kd(),Se=r(we),ft=i(r(Se),2),st=r(ft),Ue=i(st,2),T=i(Se,2);D((Q,Be)=>{g(st,`Optimal ~${Q??""}k → ~${t(O).meta.peak_ram_optimal_gb??""} GB Spitzenbedarf.`),g(Ue,` Aktuell ~${Be??""}k → ~${t(O).meta.peak_ram_gb??""} GB.`)},[()=>Math.round(t(O).meta.optimal_ctx/1024),()=>Math.round((t(O).meta.ctx||0)/1024)]),k("click",T,()=>c(M,t(O).meta.optimal_ctx,!0)),f(ee,we)};q(P,ee=>{var we;(we=t(O).meta)!=null&&we.optimal_ctx&&ee(N)})}var j=i(P,4),H=i(r(j),2),fe=r(H),me=i(fe,2),w=r(me),K=i(j,2);D(()=>{g(pe,t(O).name),$t(me,`color:${t(F)?"var(--accent)":"var(--mut)"}`),g(w,t(F)?"An (TTL = ∞)":"Aus (TTL = 5 min)")}),k("click",B,ee=>{ee.target.classList.contains("modal-overlay")&&c($,!1)}),k("click",Ce,()=>c($,!1)),an(x,()=>t(M),ee=>c(M,ee)),Fo(fe,()=>t(F),ee=>c(F,ee)),k("click",K,xe),f(A,B)};q(Lt,A=>{t($)&&t(O)&&A(Ot)})}var U=i(Lt,2);{var ae=A=>{var B=Md(),_e=r(B),Ce=r(_e),V=i(Ce,2),pe=i(r(V));He(pe,()=>br(s));var z=i(V,2),R=r(z),x=i(z,4);Ye(x,21,()=>l,lt,(fe,me)=>{var w=Sd(),K=r(w);D(()=>{At(w,1,t(X)===t(me).id?"primary":"ghost"),Aa(w,"title",t(me).desc),g(K,t(me).label)}),k("click",w,()=>ze(t(me).id)),f(fe,w)});var P=i(x,4),N=i(P,2),j=r(N),H=i(j,2);D(()=>g(R,t(Ie))),k("click",B,fe=>{fe.target.classList.contains("modal-overlay")&&c(ke,!1)}),k("click",Ce,()=>c(ke,!1)),an(P,()=>t(Z),fe=>c(Z,fe)),k("click",j,()=>ze("")),k("click",H,()=>ze(t(Z).trim().toLowerCase())),f(A,B)};q(U,A=>{t(ke)&&A(ae)})}D(()=>{ue.disabled=t(_),g(at,t(_)?"…":"Senden"),g(zt,t(o).length?t(o).length+" konfiguriert":"")}),Hn(de,()=>t(d),A=>c(d,A)),an(Fe,()=>t(u),A=>c(u,A)),k("click",ue,m),f(e,be),Dn()}qn(["click"]);var Cd=b('
Prozessor (CPU)
%
Arbeitsspeicher
%
Grafikspeicher
%

System-Metriken (Bosgame)

Live-Auslastung deines Mini-PCs, alle 0,5 Sekunden.
Arbeitsspeicher (RAM)
Grafikspeicher (VRAM + GTT)
Speicherplatz (Disk)
Temperatur (GPU / CPU)
CPU-Verlauf
RAM-Verlauf
VRAM-Verlauf
',1),Td=b(''),zd=b('
Gerade nichts los.
Alles ruhig — keine laufenden Aufgaben.
'),Pd=b(' '),Dd=b(''),$d=b(''),Id=b('
'),Ld=b('
'),Od=b('
'),Bd=b('

Aktivität

Live-Auslastung und laufende Aufgaben (Downloads, Updates) mit Protokoll.

Hintergrund-Aufgaben

Downloads & Updates erscheinen hier mit Live-Protokoll — zum Aufklappen klicken.
',1);function Rd(e,n){Pn(n,!0);const a=G(()=>fa.value),s=G(()=>fa.tracked),l=G(()=>Dr.value);let o=Jt({cpu:[],ram:[],gpu:[]});Ga(()=>{var be;if(!t(l))return;const I=t(l).gpu,re=I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0;o.cpu=[...o.cpu,((be=t(l).cpu)==null?void 0:be.percent)??0].slice(-60),o.ram=[...o.ram,t(l).ram.percent].slice(-60),o.gpu=[...o.gpu,re].slice(-60)});const v=G(()=>()=>{var re;const I=(re=t(l))==null?void 0:re.gpu;return I&&I.vram.total+I.gtt.total>0?(I.vram.used+I.gtt.used)/(I.vram.total+I.gtt.total)*100:0}),d=G(()=>t(a).filter(I=>I.state!=="running"&&I.state!=="queued").length),u=G(()=>t(a).filter(I=>I.state==="failed").length);function p(I){if(I.state!=="running")return null;if(typeof I.progress=="number")return Math.min(100,I.progress);const be=((I.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return be?Math.min(100,parseFloat(be[1])):null}function _(I){return I==null||I<0?"":I>=90?`noch ~${Math.round(I/60)} min`:`noch ~${Math.max(1,Math.round(I))} s`}function C(I){return I==="done"?'fertig':I==="failed"?'fehler':I==="canceled"?'abgebrochen':'läuft…'}function m(I){return I==="done"?"on":I==="failed"||I==="canceled"?"":"load"}async function y(I){try{await De(`/api/jobs/${I}/cancel`,{method:"POST"}),ie("Abbruch angefordert…")}catch(re){ie(re.message,!0)}}async function $(I){try{await De(`/api/jobs/${I}`,{method:"DELETE"})}catch(re){ie(re.message,!0)}}async function O(){try{const I=await De("/api/jobs/clear",{method:"POST"});ie(`${I.removed} Einträge entfernt.`)}catch(I){ie(I.message,!0)}}function M(I,re){return I.map(be=>`
`).join("")}var F=Bd(),ye=i(Xe(F),2);{var xe=I=>{const re=G(()=>t(v)());var be=Cd(),Je=Xe(be),de=r(Je),Fe=i(r(de),2),ue=r(Fe),at=i(Fe,2),Qe=r(at),it=i(de,2),dt=i(r(it),2),rt=r(dt),Tt=i(dt,2),zt=r(Tt),Wt=i(it,2),qt=i(r(Wt),2),Gt=r(qt),Lt=i(qt,2),Ot=r(Lt),U=i(Je,2),ae=i(r(U),4),A=r(ae),B=i(r(A)),_e=r(B),Ce=i(A,2),V=i(r(Ce),2),pe=r(V),z=i(Ce,2),R=i(r(z)),x=r(R),P=i(z,2),N=i(r(P),2),j=r(N),H=i(ae,2),fe=r(H),me=i(r(fe));He(me,()=>M(o.cpu,"--accent"),!0);var w=i(fe,2),K=i(r(w));He(K,()=>M(o.ram,"--purple"),!0);var ee=i(w,2),we=i(r(ee));He(we,()=>M(o.gpu,"--on"),!0),D((Se,ft,st,Ue,T,Q,Be,ne,he,Ne,We,Ee,W)=>{g(ue,Se),g(Qe,ft),g(rt,st),g(zt,`${Ue??""} / ${T??""}`),g(Gt,Q),g(Ot,Be),g(_e,`${ne??""} / ${he??""}`),g(pe,Ne),g(x,`${We??""} % belegt`),g(j,`${Ee??""} / ${W??""}`)},[()=>{var Se;return Math.round(((Se=t(l).cpu)==null?void 0:Se.percent)??0)},()=>{var Se;return((Se=t(l).cpu)==null?void 0:Se.temp)!=null?`${Math.round(t(l).cpu.temp)}° CPU-Temp`:"Auslastung"},()=>Math.round(t(l).ram.percent),()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>Math.round(t(re)),()=>t(l).gpu_temp!=null?`${Math.round(t(l).gpu_temp)}° GPU-Temp`:"VRAM + GTT",()=>ca(t(l).ram.used),()=>ca(t(l).ram.total),()=>t(l).gpu?`${ca(t(l).gpu.vram.used+t(l).gpu.gtt.used)} / ${ca(t(l).gpu.vram.total+t(l).gpu.gtt.total)}`:"–",()=>{var Se;return Math.round(((Se=t(l).disk)==null?void 0:Se.percent)??0)},()=>t(l).gpu_temp!=null?Math.round(t(l).gpu_temp)+"°":"–",()=>{var Se;return((Se=t(l).cpu)==null?void 0:Se.temp)!=null?Math.round(t(l).cpu.temp)+"°":"–"}]),f(I,be)};q(ye,I=>{t(l)&&I(xe)})}var ke=i(ye,2),Ie=r(ke),Z=i(r(Ie),2),X=r(Z),ve=i(Z,2);{var ze=I=>{var re=Td();k("click",re,O),f(I,re)};q(ve,I=>{t(d)&&I(ze)})}var Re=i(Ie,4);{var je=I=>{var re=zd();f(I,re)},ot=I=>{var re=Ha(),be=Xe(re);Ye(be,17,()=>t(a),lt,(Je,de)=>{const Fe=G(()=>p(t(de))),ue=G(()=>t(de).state==="running"?_(t(de).eta_s):""),at=G(()=>t(de).state==="running"&&t(de).rate_bps?ca(t(de).rate_bps)+"/s":""),Qe=G(()=>[t(ue),t(at)].filter(Boolean).join(" · ")),it=G(()=>t(s).includes(t(de).id));var dt=Od(),rt=r(dt),Tt=r(rt),zt=i(Tt,2),Wt=r(zt),qt=i(zt,2);{var Gt=V=>{var pe=Pd(),z=r(pe);D(R=>g(z,`${R??""} %${t(Qe)?` · ${t(Qe)}`:""}`),[()=>Math.round(t(Fe))]),f(V,pe)};q(qt,V=>{t(Fe)!=null&&V(Gt)})}var Lt=i(qt,2);{var Ot=V=>{var pe=Dd();D(()=>$t(pe,`${t(Fe)==null?"margin-left:auto;":""}margin-right:2px;padding:2px 9px;font-size:12px`)),k("click",pe,z=>{z.stopPropagation(),y(t(de).id)}),f(V,pe)},U=V=>{var pe=$d();k("click",pe,z=>{z.stopPropagation(),$(t(de).id)}),f(V,pe)};q(Lt,V=>{t(de).state==="running"?V(Ot):V(U,-1)})}var ae=i(Lt,2);He(ae,()=>C(t(de).state));var A=i(rt,2);{var B=V=>{var pe=Id(),z=r(pe);D(()=>$t(z,`width:${t(Fe)??""}%`)),f(V,pe)};q(A,V=>{t(Fe)!=null&&t(de).state==="running"&&V(B)})}var _e=i(A,2);{var Ce=V=>{var pe=Ld(),z=r(pe);D(R=>g(z,R),[()=>(t(de).log||[]).join(` +`)]),f(V,pe)};q(_e,V=>{t(it)&&V(Ce)})}D(V=>{At(Tt,1,`li-dot ${V??""}`),g(Wt,t(de).label)},[()=>m(t(de).state)]),k("click",rt,()=>fa.toggle(t(de).id)),k("keydown",rt,V=>V.key==="Enter"&&fa.toggle(t(de).id)),f(Je,dt)}),f(I,re)};q(Re,I=>{t(a).length?I(ot,-1):I(je)})}D(()=>g(X,t(a).length?t(u)?t(u)+" Fehler":t(a).length+" gesamt":"")),f(e,F),Dn()}qn(["click","keydown"]);var Fd=b(' '),Kd=b(''),Nd=b('✓ fertig'),qd=b('✗ fehlgeschlagen'),Vd=b('abgebrochen'),Wd=b('läuft…'),Gd=b('
'),jd=b('

Aktueller Vorgang

'),Ud=b('

Server & Wartung

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

LLM-Engine (llama-swap)

Das Herzstück: lädt bei jeder Anfrage automatisch das passende Modell.
Adresse (für deine Tools)
Aktuell geladen
Konfigurierte Modelle

Dienste & Applikation

Diese Aktionen sind harmlos und passwortlos — es geht nichts dabei verloren.

Betriebssystem (Bosgame)

Tiefe Eingriffe — das Dashboard fragt einmalig nach deinem sudo-Passwort.

Live-Konsole

Live mitlesen, was der Dienst gerade tut.
',1);function Hd(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>fa.value);let l=null,o=L(`Verbinde… +`),v=L("llama-swap"),d,u=L(null),p=L("");const _=new Set,C=G(()=>t(u)?t(s).find(w=>w.id===t(u)):null);Ga(()=>{if(!t(C))return;const w=t(C),K=w.state==="done",ee=w.state==="failed",we=w.state==="canceled";(K||ee||we)&&!_.has(w.id)&&(_.add(w.id),ie(K?`✓ ${t(p)} abgeschlossen.`:we?`${t(p)} abgebrochen.`:`✗ ${t(p)} fehlgeschlagen.`,ee),K&&setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),800))});function m(w,K){c(u,w,!0),c(p,K,!0),fa.track(w)}yi(()=>{y()}),No(()=>{l==null||l.close()});function y(){l==null||l.close();const w=t(v);c(o,`Verbinde mit ${w}… +`);const K=location.protocol==="https:"?"wss:":"ws:";l=new WebSocket(`${K}//${location.host}/api/logs/${w}?token=${encodeURIComponent(nl())}`),l.onmessage=ee=>{c(o,t(o)+ee.data),d&&(d.scrollTop=d.scrollHeight)},l.onclose=()=>{c(o,t(o)+` +— Verbindung getrennt —`)},l.onerror=()=>l==null?void 0:l.close()}async function $(w,K,ee){if(await xn({title:K,body:ee,confirmLabel:"Neustarten"}))try{await De(`/api/service/${w}/restart`,{method:"POST"}),ie("Neustart ausgelöst: "+w),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),2e3)}catch(we){ie(we.message,!0)}}async function O(){if(await xn({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 w=await De("/api/self-update",{method:"POST"});ie("Update läuft — Dashboard startet gleich neu."),m(w.job_id,"Mission Control Update")}catch(w){ie(w.message,!0)}}async function M(){if(!await xn({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."}))return;const w=await er({title:"sudo-Passwort",body:"Für das Engine-Update wird einmalig dein sudo-Passwort gebraucht (für den Update-Befehl).",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Update starten"});if(w!==null)try{const K=await De("/api/update",{method:"POST",body:JSON.stringify({password:w})});ie("LLM-Engine-Update läuft."),m(K.job_id,"LLM-Engine-Update")}catch(K){ie(K.message,!0)}}async function F(){if(await xn({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 De("/api/unload",{method:"POST"}),ie("Grafikspeicher geleert."),setTimeout(()=>document.dispatchEvent(new Event("mc:refresh")),600)}catch(w){ie(w.message,!0)}}async function ye(){if(!await xn({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 w=await er({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(w)try{const K=await De("/api/os-update",{method:"POST",body:JSON.stringify({password:w})});ie("OS-Update gestartet."),m(K.job_id,"OS-Update")}catch(K){ie(K.message,!0)}}async function xe(){if(!await xn({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 w=await er({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(w)try{await De("/api/reboot",{method:"POST",body:JSON.stringify({password:w})}),ie("Reboot ausgelöst — bis gleich.")}catch(K){ie(K.message,!0)}}async function ke(){c(Ie,"prüfe…");try{const w=await De("/api/integration/test");c(Ie,w.ok?`✓ Engine antwortet — ${w.models.length} Modell(e): ${w.models.join(", ")}`:`✗ keine Verbindung: ${w.error}`,!0),c(Z,w.ok,!0)}catch(w){c(Ie,"✗ "+w.message),c(Z,!1)}}let Ie=L(""),Z=L(!1);const X=G(()=>{var w;return((w=t(a))==null?void 0:w.models)||[]}),ve=["running","ready","loading","starting"],ze=G(()=>t(X).find(w=>ve.includes(w.state)));function Re(w){if(!w||w.state!=="running")return null;if(typeof w.progress=="number")return Math.min(100,w.progress);const ee=((w.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ee?Math.min(100,parseFloat(ee[1])):null}var je=Ud(),ot=i(Xe(je),2),I=r(ot),re=i(r(I),2),be=r(re),Je=i(I,4),de=r(Je),Fe=i(r(de)),ue=r(Fe),at=i(de,2),Qe=i(r(at),2),it=r(Qe),dt=i(at,2),rt=i(r(dt),2),Tt=r(rt),zt=i(Je,2),Wt=r(zt),qt=i(Wt,2);{var Gt=w=>{var K=Fd(),ee=r(K);D(()=>{$t(K,`color:${t(Z)?"#7ee29a":"#ff9b95"}`),g(ee,t(Ie))}),f(w,K)};q(qt,w=>{t(Ie)&&w(Gt)})}var Lt=i(ot,2),Ot=i(r(Lt),4),U=i(Ot,2),ae=i(U,2),A=i(ae,2),B=i(A,2),_e=i(Lt,2),Ce=i(r(_e),4),V=i(Ce,2),pe=i(_e,2);{var z=w=>{const K=G(()=>t(C)),ee=G(()=>t(K).state==="done"),we=G(()=>t(K).state==="failed"),Se=G(()=>t(K).state==="canceled"),ft=G(()=>t(ee)||t(we)||t(Se)),st=G(()=>Re(t(K)));var Ue=jd(),T=r(Ue),Q=i(r(T),2);{var Be=se=>{var ce=Kd();k("click",ce,async()=>{await xn({title:t(p)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&De(`/api/jobs/${t(K).id}/cancel`,{method:"POST"})}),f(se,ce)};q(Q,se=>{t(ft)||se(Be)})}var ne=i(Q,2),he=r(ne);{var Ne=se=>{var ce=Nd();f(se,ce)},We=se=>{var ce=qd();f(se,ce)},Ee=se=>{var ce=Vd();f(se,ce)},W=se=>{var ce=Wd();f(se,ce)};q(he,se=>{t(ee)?se(Ne):t(we)?se(We,1):t(Se)?se(Ee,2):se(W,-1)})}var J=i(T,2),le=r(J),oe=i(J,2);{var $e=se=>{var ce=Gd(),wt=r(ce);D(()=>$t(wt,`width:${t(st)??""}%`)),f(se,ce)};q(oe,se=>{t(st)!=null&&!t(ft)&&se($e)})}var Le=i(oe,2),Te=r(Le);D(se=>{g(le,`${t(p)??""}${t(ft)?t(ee)?" — erfolgreich.":t(Se)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),g(Te,se)},[()=>(t(K).log||[]).join(` +`)]),f(w,Ue)};q(pe,w=>{t(C)&&w(z)})}var R=i(pe,2),x=r(R),P=i(r(x),2),N=r(P);N.value=N.__value="llama-swap";var j=i(N);j.value=j.__value="mission-control";var H=i(j);H.value=H.__value="system";var fe=i(x,4),me=r(fe);Ko(fe,w=>d=w,()=>d),D(w=>{var K,ee,we;$t(re,`margin-left:auto;${(K=t(a))!=null&&K.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"}`),g(be,(ee=t(a))!=null&&ee.swap_ok?"● erreichbar":"● offline"),g(ue,(((we=t(a))==null?void 0:we.swap_url)||"—")+"/v1"),g(it,t(ze)?t(ze).name+` (${t(ze).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),g(Tt,w),g(me,t(o))},[()=>t(X).filter(w=>!w.incomplete).length||"keine"]),k("click",Wt,ke),k("click",Ot,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),k("click",U,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),k("click",ae,O),k("click",A,M),k("click",B,F),k("click",Ce,ye),k("click",V,xe),k("change",P,y),Hn(P,()=>t(v),w=>c(v,w)),f(e,je),Dn()}qn(["click","change"]);var Jd=b('
Lade Setups…
'),Qd=b(' ×',1),tr=b('
★ Beste Wahl für dein System
'),Zd=b('
Dein Setup
'),Yd=b(''),Xd=b('
'),ec=b('· ⚠ Cache veraltet'),tc=b(" ",1),nc=b('
Frage Quellen ab…
'),ac=b('
'),ic=b('✓ installiert'),rc=b(''),sc=b('

'),lc=b('

'),oc=b(''),dc=b('

'),cc=b('
'),vc=b('
'),uc=b('
'),pc=b(" "),fc=b('
'),hc=b('
Größter Spitzenbedarf: . Es läuft immer nur ein Modell gleichzeitig — das größte bestimmt, ob das Setup passt.
'),gc=b('Alternative: — passt auf dein System.',1),mc=b('
⚠ Dieses Setup übersteigt deinen verfügbaren Speicher.
'),bc=b(''),_c=b('
Lade Dateien von HuggingFace…
'),Yr=b(""),yc=b('
Empfohlener Kontext für deine Hardware: übernehmen
'),xc=b('
Ressourcen-Check
'),kc=b('
⚠ Diese Datei ist zu groß für deinen Speicher. Kleinere Alternative: — einfach auswählen.
'),wc=b('
⚠ Alle Varianten dieses Modells sind zu groß für deinen Speicher. Ein kleineres Modell aus den Empfehlungen wäre die bessere Wahl.
'),Sc=b('
',1),Mc=b('
Keine GGUF-Dateien im Repo gefunden.
'),Ec=b(''),Ac=b('
'),Cc=b(''),Tc=b('

Cookbook

Modelle finden, installieren und eigene Setups zusammenstellen.

1 · Anwendungsfall wählen & installieren

Hier starten: Fertige Modell-Bundles für deinen Anwendungsfall — ein Klick installiert alles. Die Hardware-Ampel zeigt vorab, ob das Setup auf deinen PC passt.

Aktuell die besten Modelle für dein System

Top-Modelle je Kategorie von HuggingFace — Hardware-Fit wird live für dein System berechnet.

Profi-Suche (HuggingFace)

Direkt HuggingFace durchsuchen — oder eine Modell-URL einfügen für den direkten Sprung.
',1);function zc(e,n){Pn(n,!0);const a="Kontext = das Kurzzeitgedächtnis des Modells. Größer = merkt sich mehr, braucht aber mehr Speicher und wird etwas langsamer.",s="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.",l={perfect:0,marginal:1,too_tight:2},o={vision:"Bilder",coder:"Coden",reasoning:"Logik",agent:"Agenten & Tools",scout:"Allrounder",reviewer:"Review",manager:"Manager"},v=[{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 d(E){const S=(E||"").toLowerCase();for(const te of v)if(te.kw.some(Y=>S.includes(Y)))return te.label;return"Allrounder"}function u(E=""){const S=E.toLowerCase();return/\d+x\d+(\.\d+)?b/.test(S)||new RegExp("(?{zt(),Wt()});async function zt(){c(O,!0);try{const E=await De("/api/cookbook/recipes");c(y,E.recipes||[],!0),c($,E.recommended_id||null,!0)}catch(E){ie(E.message,!0)}c(O,!1)}async function Wt(E=!1){c(F,!0);try{const S=await De("/api/cookbook/discover"+(E?"?force=true":""));c(M,S,!0),c(ye,S.stale,!0)}catch(S){ie("Empfehlungen nicht ladbar: "+S.message,!0)}c(F,!1)}function qt(E){E=E.trim();const S=E.match(/huggingface\.co\/([^\s/]+\/[^\s/?#]+)/i);return S?S[1]:/^[\w.-]+\/[\w.-]+$/.test(E)?E:null}async function Gt(){const E=t(xe).trim(),S=qt(E);let te=E;if(t(Z)&&!S&&(te=te?te+" "+t(Z):t(Z)),!te&&!S){c(ke,[],!0);return}c(Ie,!0),c(ve,[],!0),c(ze,-1);try{if(S)c(ke,[{id:S,author:S.split("/")[0],downloads:0}],!0);else{const Y=`https://huggingface.co/api/models?search=${encodeURIComponent(te)}&filter=gguf&sort=${encodeURIComponent(t(X))}&direction=-1&limit=40`,Ae=await fetch(Y);c(ke,await Ae.json(),!0)}t(ke).forEach((Y,Ae)=>Lt(Ae,Y.id))}catch(Y){ie(Y.message,!0),c(ke,[],!0)}c(Ie,!1)}async function Lt(E,S){var te;try{const Y=await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:S,ctx:8192})});if(!((te=Y.files)!=null&&te.length)){t(ve)[E]=null,Ot();return}const Ae=Y.files.find(mt=>{var yt;return(yt=mt.quant)==null?void 0:yt.includes("Q4_K_M")})||Y.files[0];t(ve)[E]=Ae.fit.level,Ot()}catch{t(ve)[E]=null,Ot()}}function Ot(){let E=-1,S=99;t(ve).forEach((te,Y)=>{if(te==null)return;const Ae=l[te]??99;Ae=0&&S<=1?E:-1,!0)}function U(E){c(Re,t(y).find(S=>S.id===E),!0)}async function ae(E){const S=document.getElementById("cb-r-install-btn");S&&(S.disabled=!0,S.textContent="Starte…");try{const te=await De("/api/cookbook/install-recipe",{method:"POST",body:JSON.stringify({recipe_id:E,hf_token:ci()})});ie(`${te.count} Download${te.count!==1?"s":""} läuft — Modelle erscheinen danach automatisch im Modelle-Tab.`),c(Re,null),Tt("activity")}catch(te){ie(te.message,!0),S&&(S.disabled=!1,S.textContent="Installieren")}}async function A(E,S){var te,Y;c(je,!0),c(ot,S,!0),c(I,E,!0),c(Je,""),c(de,8192),c(re,null),c(ue,null),c(be,""),c(Fe,!0);try{if(c(re,await De("/api/cookbook/analyze",{method:"POST",body:JSON.stringify({repo_id:E,ctx:8192})}),!0),(Y=(te=t(re))==null?void 0:te.files)!=null&&Y.length){const Ae=t(re).files.find(mt=>{var yt;return(yt=mt.quant)==null?void 0:yt.includes("Q4_K_M")})||t(re).files[0];c(be,Ae.filename,!0),Ae.optimal_ctx&&t(de)===8192&&c(de,Ae.optimal_ctx,!0),B()}}catch(Ae){ie(Ae.message,!0)}c(Fe,!1)}function B(){var E,S,te;!((S=(E=t(re))==null?void 0:E.files)!=null&&S.length)||!t(be)||(c(ue,t(re).files.find(Y=>Y.filename===t(be))||null,!0),(te=t(ue))!=null&&te.optimal_ctx&&t(de)===8192&&c(de,t(ue).optimal_ctx,!0))}async function _e(){var E,S;if(!t(I)||!t(be))return ie("Bitte eine GGUF-Datei wählen.",!0);c(Fe,!0);try{const te=((E=t(re))==null?void 0:E.params_b)??7,Y=((S=t(ue))==null?void 0:S.quant)??"Q4_K_M";await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:t(I),role:t(Je),params_b:te,quant:Y,file:t(be),ctx:t(de),hf_token:ci()})}),ie("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),c(je,!1),Tt("activity")}catch(te){ie("Fehler: "+te.message,!0)}c(Fe,!1)}async function Ce(E,S,te,Y){Y.disabled=!0,Y.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:E,role:S,params_b:te,quant:"Q4_K_M",hf_token:ci()})}),ie("Download läuft — Modell erscheint danach automatisch im Modelle-Tab."),Tt("activity")}catch(Ae){ie(Ae.message,!0),Y.disabled=!1,Y.textContent="Installieren"}}function V(){c(rt,null),c(Qe,""),c(it,""),c(dt,[{repo:"",role:"",quant:"Q4_K_M"}],!0),c(at,!0)}function pe(E){const S=t(y).find(te=>te.id===E);S&&(c(rt,E,!0),c(Qe,S.title,!0),c(it,S.desc||"",!0),c(dt,S.models.map(te=>({repo:te.repo,role:te.role,quant:te.quant||"Q4_K_M"})),!0),c(at,!0))}async function z(){if(!t(Qe).trim())return ie("Bitte einen Titel angeben.",!0);const E=t(dt).filter(S=>S.repo.trim());if(!E.length)return ie("Mindestens ein Modell (Repo) angeben.",!0);try{t(rt)?(await De("/api/cookbook/user-recipe/"+encodeURIComponent(t(rt)),{method:"PUT",body:JSON.stringify({title:t(Qe),desc:t(it),models:E})}),ie("Setup aktualisiert.")):(await De("/api/cookbook/user-recipe",{method:"POST",body:JSON.stringify({title:t(Qe),desc:t(it),models:E})}),ie("Setup gespeichert.")),c(at,!1),zt()}catch(S){ie(S.message,!0)}}async function R(E){const S=t(y).find(te=>te.id===E);if(await xn({title:`„${(S==null?void 0:S.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 De("/api/cookbook/user-recipe/"+encodeURIComponent(E),{method:"DELETE"}),ie("Setup gelöscht."),zt()}catch(te){ie(te.message,!0)}}function x(E){if(!u(E))return"";const S=p(E);return`MoE${S?` · ~${S}B aktiv`:""}`}function P(E){return E?`${Fn(E)}`:""}var N=Tc(),j=i(Xe(N),2),H=r(j),fe=i(r(H),2),me=i(H,4);{var w=E=>{var S=Jd();f(E,S)},K=E=>{var S=Xd();Ye(S,21,()=>t(y),lt,(te,Y)=>{const Ae=G(()=>t(Y).id===t($));var mt=Yd(),yt=r(mt);{var Me=Ke=>{var ht=Qd(),Zt=Xe(ht),Kt=i(Zt,2);k("click",Zt,Pt=>{Pt.stopPropagation(),pe(t(Y).id)}),k("keydown",Zt,Pt=>{Pt.key==="Enter"&&(Pt.stopPropagation(),pe(t(Y).id))}),k("click",Kt,Pt=>{Pt.stopPropagation(),R(t(Y).id)}),k("keydown",Kt,Pt=>{Pt.key==="Enter"&&(Pt.stopPropagation(),R(t(Y).id))}),f(Ke,ht)};q(yt,Ke=>{t(Y).user&&Ke(Me)})}var qe=i(yt,2);{var Ze=Ke=>{var ht=tr();f(Ke,ht)},Mt=Ke=>{var ht=Zd();f(Ke,ht)};q(qe,Ke=>{t(Ae)?Ke(Ze):t(Y).user&&Ke(Mt,1)})}var et=i(qe,2),ct=r(et),xt=r(ct),Rt=r(xt),sn=i(ct,2),Et=r(sn),tt=i(et,2),Ft=r(tt),Qt=i(tt,2),Ct=r(Qt);D((Ke,ht)=>{At(mt,1,`card-btn${t(Ae)?" cb-best":""}`),g(Rt,t(Y).title),At(sn,1,`fit-badge ${Ke??""}`),g(Et,ht),g(Ft,t(Y).desc),g(Ct,`${t(Y).models.length??""} Modell${t(Y).models.length>1?"e":""} im Setup`)},[()=>_(t(Y).fit_level),()=>C(t(Y).fit_level)]),k("click",mt,()=>U(t(Y).id)),f(te,mt)}),f(E,S)};q(me,E=>{t(O)?E(w):E(K,-1)})}var ee=i(j,2),we=r(ee),Se=i(r(we),2),ft=r(Se);{var st=E=>{const S=G(()=>Math.round((Date.now()/1e3-t(M).updated)/60));var te=tc(),Y=Xe(te);{var Ae=Ze=>{var Mt=oi();D(()=>g(Mt,`Quellen befragt vor ${t(S)??""} min`)),f(Ze,Mt)},mt=Ze=>{var Mt=oi();D(et=>g(Mt,`Quellen befragt vor ${et??""} h`),[()=>Math.round(t(S)/60)]),f(Ze,Mt)},yt=Ze=>{var Mt=oi();D(et=>g(Mt,`Quellen befragt vor ${et??""} Tg.`),[()=>Math.round(t(S)/1440)]),f(Ze,Mt)};q(Y,Ze=>{t(S)<60?Ze(Ae):t(S)<1440?Ze(mt,1):Ze(yt,-1)})}var Me=i(Y,2);{var qe=Ze=>{var Mt=ec();f(Ze,Mt)};q(Me,Ze=>{t(ye)&&Ze(qe)})}f(E,te)};q(ft,E=>{var S;(S=t(M))!=null&&S.updated&&E(st)})}var Ue=i(Se,2),T=r(Ue),Q=i(we,4);{var Be=E=>{var S=nc();f(E,S)},ne=E=>{var S=Ha(),te=Xe(S);Ye(te,17,()=>t(M).categories,lt,(Y,Ae)=>{var mt=lc(),yt=r(mt),Me=r(yt),qe=r(Me),Ze=i(yt,2);Ye(Ze,21,()=>t(Ae).models,lt,(Mt,et)=>{const ct=G(()=>t(Ae).recommended&&t(et).repo===t(Ae).recommended);var xt=sc(),Rt=r(xt);{var sn=gt=>{var _t=tr();f(gt,_t)};q(Rt,gt=>{t(ct)&>(sn)})}var Et=i(Rt,2),tt=r(Et),Ft=r(tt),Qt=r(Ft),Ct=i(Ft,2),Ke=r(Ct),ht=i(tt,2),Zt=r(ht),Kt=i(Et,2),Pt=r(Kt);He(Pt,()=>P(o[t(et).role]||d(t(et).repo)));var Vn=i(Pt,2);He(Vn,()=>x(t(et).repo));var Zn=i(Kt,2),$n=r(Zn),Ca=i(Zn,2);Ye(Ca,17,()=>t(et).requirements||[],lt,(gt,_t)=>{var Vt=ac(),In=r(Vt);D(()=>g(In,`⚠ ${t(_t)??""}`)),f(gt,Vt)});var kt=i(Ca,4),vt=r(kt);{var bt=gt=>{var _t=ic();D(()=>Aa(_t,"title",`bereits eingerichtet als ${t(et).installed??""}`)),f(gt,_t)},Dt=gt=>{var _t=rc();k("click",_t,Vt=>Ce(t(et).repo,t(et).role,t(et).params_b,Vt.currentTarget)),f(gt,_t)};q(vt,gt=>{t(et).installed?gt(bt):gt(Dt,-1)})}D((gt,_t,Vt)=>{At(xt,1,`card${t(ct)?" res-best":""}`),g(Qt,t(et).name),g(Ke,`${t(et).author??""} · ${t(et).params_b??""}B`),At(ht,1,`fit-badge ${gt??""}`),g(Zt,t(et).fit.text),g($n,`${_t??""} · ⬇ ${Vt??""}`)},[()=>_(t(et).fit.level),()=>m(t(et).fit),()=>(t(et).downloads||0).toLocaleString()]),f(Mt,xt)}),D(()=>g(qe,t(Ae).title)),f(Y,mt)}),f(E,S)};q(Q,E=>{var S;t(F)&&!t(M)?E(Be):(S=t(M))!=null&&S.categories&&E(ne,1)})}var he=i(ee,2),Ne=i(r(he),4),We=r(Ne),Ee=i(We,2),W=r(Ee);W.value=W.__value="downloads";var J=i(W);J.value=J.__value="trending";var le=i(J);le.value=le.__value="created_at";var oe=i(Ee,2),$e=r(oe),Le=i(Ne,2);Ye(Le,20,()=>["","coder","vision","reasoning","chat","agent"],lt,(E,S)=>{var te=oc(),Y=r(te);D(()=>{At(te,1,t(Z)===S?"primary":"ghost"),g(Y,S||"Alle")}),k("click",te,()=>{c(Z,S,!0),Gt()}),f(E,te)});var Te=i(Le,2);{var se=E=>{var S=cc();Ye(S,21,()=>t(ke),lt,(te,Y,Ae)=>{var mt=dc(),yt=r(mt);{var Me=Kt=>{var Pt=tr();f(Kt,Pt)};q(yt,Kt=>{Ae===t(ze)&&Kt(Me)})}var qe=i(yt,2),Ze=r(qe),Mt=r(Ze),et=r(Mt),ct=i(Mt,2),xt=r(ct),Rt=i(Ze,2),sn=r(Rt),Et=i(qe,2),tt=r(Et);He(tt,()=>P(d(t(Y).id)));var Ft=i(tt,2);He(Ft,()=>x(t(Y).id));var Qt=i(Et,4),Ct=r(Qt),Ke=r(Ct),ht=i(Ct,2),Zt=r(ht);D((Kt,Pt,Vn,Zn,$n)=>{At(mt,1,`card${Ae===t(ze)?" res-best":""}`),g(et,Kt),g(xt,t(Y).author||""),At(Rt,1,`fit-badge ${Pt??""}`),g(sn,Vn),g(Ke,Zn),g(Zt,`⬇ ${$n??""}`)},[()=>t(Y).id.split("/").pop(),()=>t(ve)[Ae]?_(t(ve)[Ae]):"warn",()=>t(ve)[Ae]?C(t(ve)[Ae]):"prüfe…",()=>t(ve)[Ae]?m({req_gb:0,tps:0}):"Hardware-Fit…",()=>(t(Y).downloads||0).toLocaleString()]),k("click",mt,()=>A(t(Y).id,t(Y).id.split("/").pop())),f(te,mt)}),f(E,S)};q(Te,E=>{t(ke).length&&E(se)})}var ce=i(he,2);{var wt=E=>{const S=G(()=>t(Re));var te=bc(),Y=r(te),Ae=r(Y),mt=i(Ae,2),yt=r(mt),Me=i(mt,2),qe=r(Me),Ze=i(Me,2);Ye(Ze,21,()=>t(S).models,lt,(Et,tt)=>{var Ft=fc(),Qt=r(Ft),Ct=r(Qt),Ke=r(Ct),ht=r(Ke),Zt=i(Ke,2),Kt=r(Zt),Pt=i(Zt,2);He(Pt,()=>x(t(tt).repo));var Vn=i(Ct,2);{var Zn=bt=>{var Dt=vc(),gt=r(Dt);D(()=>g(gt,t(tt).why)),f(bt,Dt)};q(Vn,bt=>{t(tt).why&&bt(Zn)})}var $n=i(Vn,2);{var Ca=bt=>{var Dt=uc(),gt=r(Dt);D((_t,Vt,In)=>g(gt,`~${_t??""} GB · ~${Vt??""} Tok/s · optimal ~${In??""}k Kontext`),[()=>(t(tt).fit.req_gb??0).toFixed(1),()=>Math.round(t(tt).fit.tps??0),()=>Math.round((t(tt).optimal_ctx||8192)/1024)]),f(bt,Dt)};q($n,bt=>{t(tt).fit&&bt(Ca)})}var kt=i(Qt,2);{var vt=bt=>{var Dt=pc(),gt=r(Dt);D(_t=>{At(Dt,1,`fit-badge ${_t??""}`),g(gt,t(tt).fit.text)},[()=>_(t(tt).fit.level)]),f(bt,Dt)};q(kt,bt=>{t(tt).fit&&bt(vt)})}D(()=>{g(ht,t(tt).name),g(Kt,t(tt).role)}),f(Et,Ft)});var Mt=i(Ze,2);{var et=Et=>{const tt=G(()=>Math.max(...t(S).models.map(Ke=>{var ht;return((ht=Ke.fit)==null?void 0:ht.req_gb)??0})));var Ft=hc(),Qt=i(r(Ft)),Ct=r(Qt);D(Ke=>g(Ct,`~${Ke??""} GB`),[()=>t(tt).toFixed(1)]),f(Et,Ft)};q(Mt,Et=>{t(S).models.length&&t(S).models[0].fit&&Et(et)})}var ct=i(Mt,2);{var xt=Et=>{const tt=G(()=>t(y).find(Ke=>!Ke.user&&Ke.fit_level!=="too_tight"&&Ke.id!==t(S).id));var Ft=mc(),Qt=i(r(Ft));{var Ct=Ke=>{var ht=gc(),Zt=i(Xe(ht)),Kt=r(Zt);D(()=>g(Kt,`„${t(tt).title??""}" ansehen`)),k("click",Zt,Pt=>{Pt.preventDefault(),c(Re,null),setTimeout(()=>U(t(tt).id),50)}),f(Ke,ht)};q(Qt,Ke=>{t(tt)&&Ke(Ct)})}f(Et,Ft)};q(ct,Et=>{t(S).fit_level==="too_tight"&&Et(xt)})}var Rt=i(ct,2),sn=r(Rt);D(()=>{g(yt,t(S).title),g(qe,t(S).desc),At(Rt,1,`primary${t(S).fit_level==="too_tight"?" warn":""}`),g(sn,t(S).fit_level==="too_tight"?"Trotzdem installieren (nicht empfohlen)":"Komplettes Setup installieren")}),k("click",te,Et=>{Et.target.classList.contains("modal-overlay")&&c(Re,null)}),k("click",Ae,()=>c(Re,null)),k("click",Rt,()=>ae(t(S).id)),f(E,te)};q(ce,E=>{t(Re)&&E(wt)})}var St=i(ce,2);{var Bt=E=>{var S=Ec(),te=r(S),Y=r(te),Ae=i(Y,2),mt=r(Ae),yt=i(Ae,2),Me=r(yt),qe=i(yt,2);{var Ze=ct=>{var xt=_c();f(ct,xt)},Mt=ct=>{var xt=Sc(),Rt=i(Xe(xt),2);Ye(Rt,21,()=>t(re).files,lt,(kt,vt)=>{const bt=G(()=>t(vt).fit.level==="perfect"?"●":t(vt).fit.level==="marginal"?"◐":"○");var Dt=Yr(),gt=r(Dt),_t={};D(()=>{g(gt,`${t(bt)??""} ${t(vt).filename??""}`),_t!==(_t=t(vt).filename)&&(Dt.value=(Dt.__value=t(vt).filename)??"")}),f(kt,Dt)});var sn=i(Rt,2),Et=r(sn),tt=i(r(Et),2),Ft=i(Et,2),Qt=r(Ft),Ct=i(r(Qt));He(Ct,()=>br(a));var Ke=i(Qt,2),ht=i(sn,2);{var Zt=kt=>{var vt=yc(),bt=i(r(vt)),Dt=r(bt),gt=i(bt,2);D(_t=>g(Dt,`~${_t??""}k`),[()=>Math.round(t(ue).optimal_ctx/1024)]),k("click",gt,_t=>{_t.preventDefault(),c(de,t(ue).optimal_ctx,!0)}),f(kt,vt)};q(ht,kt=>{var vt;(vt=t(ue))!=null&&vt.optimal_ctx&&kt(Zt)})}var Kt=i(ht,2);{var Pt=kt=>{var vt=xc(),bt=r(vt),Dt=i(r(bt),2),gt=r(Dt),_t=i(bt,2),Vt=r(_t);D((In,ki,Gi)=>{g(gt,`~${In??""} GB · ~${ki??""} Tok/s · ${(t(ue).quant||"GGUF")??""}`),At(_t,1,`fit-badge ${Gi??""}`),g(Vt,t(ue).fit.text)},[()=>(t(ue).fit.req_gb??0).toFixed(1),()=>Math.round(t(ue).fit.tps??0),()=>_(t(ue).fit.level)]),f(kt,vt)};q(Kt,kt=>{t(ue)&&kt(Pt)})}var Vn=i(Kt,2);{var Zn=kt=>{const vt=G(()=>t(re).files.find(Vt=>Vt.fit.level!=="too_tight"&&Vt.filename!==t(be)));var bt=Ha(),Dt=Xe(bt);{var gt=Vt=>{var In=kc(),ki=i(r(In)),Gi=r(ki);D(ji=>g(Gi,`${t(vt).filename??""} (${ji??""})`),[()=>C(t(vt).fit.level)]),k("click",ki,ji=>{ji.preventDefault(),c(be,t(vt).filename,!0),B()}),f(Vt,In)},_t=Vt=>{var In=wc();f(Vt,In)};q(Dt,Vt=>{t(vt)?Vt(gt):Vt(_t,-1)})}f(kt,bt)};q(Vn,kt=>{var vt,bt;((vt=t(ue))==null?void 0:vt.fit.level)==="too_tight"&&((bt=t(re))!=null&&bt.files)&&kt(Zn)})}var $n=i(Vn,2),Ca=r($n);D(()=>{var kt,vt;At($n,1,`primary${((kt=t(ue))==null?void 0:kt.fit.level)==="too_tight"?" warn":""}`),$n.disabled=t(Fe),g(Ca,t(Fe)?"Starte…":((vt=t(ue))==null?void 0:vt.fit.level)==="too_tight"?"Trotzdem holen (zu groß — nicht empfohlen)":"Herunterladen & Einpflegen")}),k("change",Rt,B),Hn(Rt,()=>t(be),kt=>c(be,kt)),an(tt,()=>t(Je),kt=>c(Je,kt)),an(Ke,()=>t(de),kt=>c(de,kt)),k("click",$n,_e),f(ct,xt)},et=ct=>{var xt=Mc();f(ct,xt)};q(qe,ct=>{var xt,Rt;t(Fe)&&!t(re)?ct(Ze):(Rt=(xt=t(re))==null?void 0:xt.files)!=null&&Rt.length?ct(Mt,1):t(Fe)||ct(et,2)})}D(()=>{g(mt,t(ot)),g(Me,t(I))}),k("click",S,ct=>{ct.target.classList.contains("modal-overlay")&&c(je,!1)}),k("click",Y,()=>c(je,!1)),f(E,S)};q(St,E=>{t(je)&&E(Bt)})}var hn=i(St,2);{var da=E=>{var S=Cc(),te=r(S),Y=r(te),Ae=i(Y,2),mt=r(Ae),yt=i(Ae,6),Me=i(yt,4),qe=i(Me,4);Ye(qe,17,()=>t(dt),lt,(ct,xt,Rt)=>{var sn=Ac(),Et=r(sn),tt=i(Et,2),Ft=i(tt,2);Ye(Ft,20,()=>["Q4_K_M","Q5_K_M","Q6_K","Q8_0","Q3_K_M"],lt,(Ct,Ke)=>{var ht=Yr(),Zt=r(ht),Kt={};D(()=>{g(Zt,Ke),Kt!==(Kt=Ke)&&(ht.__value=Ke)}),f(Ct,ht)});var Qt=i(Ft,2);an(Et,()=>t(xt).repo,Ct=>t(xt).repo=Ct),an(tt,()=>t(xt).role,Ct=>t(xt).role=Ct),Hn(Ft,()=>t(xt).quant,Ct=>t(xt).quant=Ct),k("click",Qt,()=>c(dt,t(dt).filter((Ct,Ke)=>Ke!==Rt),!0)),f(ct,sn)});var Ze=i(qe,2),Mt=i(Ze,4),et=r(Mt);D(()=>{g(mt,t(rt)?"Setup bearbeiten":"Eigenes Setup erstellen"),g(et,t(rt)?"Änderungen speichern":"Setup speichern")}),k("click",S,ct=>{ct.target.classList.contains("modal-overlay")&&c(at,!1)}),k("click",Y,()=>c(at,!1)),an(yt,()=>t(Qe),ct=>c(Qe,ct)),an(Me,()=>t(it),ct=>c(it,ct)),k("click",Ze,()=>c(dt,[...t(dt),{repo:"",role:"",quant:"Q4_K_M"}],!0)),k("click",Mt,z),f(E,S)};q(hn,E=>{t(at)&&E(da)})}D(()=>{Ue.disabled=t(F),g(T,t(F)?"Suche…":"Aktualisieren"),oe.disabled=t(Ie),g($e,t(Ie)?"Lade…":"Suchen")}),k("click",fe,V),k("click",Ue,()=>Wt(!0)),k("keydown",We,E=>E.key==="Enter"&&Gt()),an(We,()=>t(xe),E=>c(xe,E)),Hn(Ee,()=>t(X),E=>c(X,E)),k("click",oe,Gt),f(e,N),Dn()}qn(["click","keydown","change"]);var Pc=b(`
Du öffnest Mission Control über einen Proxy/Namen. 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.
`),Dc=b(' '),$c=b('
'),Ic=b(' '),Lc=b('
Auswahl aufheben (alle)
'),Xr=b(''),Oc=b('

Jan AI ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.

Jan AI öffnen → linke Leiste → Remote-Modelle+ Modell hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Jan AI fragt danach beim Einrichten.
Jan AI herunterladen: jan.ai — kostenlos, open source, Windows/macOS/Linux.
',1),Bc=b('

Datei anlegen oder öffnen: ~/.continue/config.json

Falls bereits eine config.json vorhanden: nur den "models"-Eintrag ergänzen, nicht die ganze Datei ersetzen.

Danach Continue in VS Code neu starten → im Chat-Panel das Modell wählen.

Continue: continue.dev — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.
',1),Rc=b('

Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:

Settings → Models → Custom Endpoint+ hinzufügen:

API-Key: ein beliebiger Wert (z.B. local). Danach das Modell in der Model-Liste auswählen.
Antigravity herunterladen: antigravityide.net — kostenlose Einzelperson-Tier, VS Code-basiert.
',1),Fc=b('

Ö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.

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

Danach im Agent-Panel das Modell auswählen.
Zed herunterladen: zed.dev — kostenlos, native Performance, Windows/macOS/Linux.
',1),Kc=b('

Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):

Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc

Den "providers"-Block in die bestehende opencode.jsonc einfügen (nicht die ganze Datei ersetzen). Falls bereits ein "llama-swap"-Eintrag existiert: vorher löschen.

Danach in OpenCode /models wählen.

OpenCode Desktop: opencode.ai
',1),Nc=b('

In Cline/Cursor den Provider „OpenAI Compatible" wählen:

API-Key: ein beliebiger Wert (z.B. local).
Cline für VS Code: VS Code Marketplace · für JetBrains: JetBrains Marketplace
',1),qc=b('

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

',1),Vc=b('

Bilder einbinden (Vision)

Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.
'),Wc=b('

2 · Modelle auswählen

Wähle, welche Modelle im Config-Snippet erscheinen sollen.

3 · Tool wählen

Für welches Werkzeug brauchst du die Konfiguration?
Chat
Coding-Assistenten

4 · Config-Snippet

',1),Gc=b('

2 · Erst ein Modell installieren

Noch kein Modell eingerichtet
Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.
'),jc=b(''),Uc=b('

In Cline: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.

In Claude Code: Block in ~/.claude/settings.json unter "mcpServers" einfügen.

Einmalig auf dem Windows-PC: pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).
',1),Hc=b('

Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.

Einmalig: pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.
',1),Jc=b('

Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad /opt/mission-control/mcp_memory.py ist bereits korrekt — kein weiteres Setup nötig.

'),Qc=b(`

Verbinden

Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.

1 · Verbindung prüfen

Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.

Wie funktioniert das Auto-Swap?

Gedächtnis-MCP

Neu in v7
Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen + über Sessions hinweg merken — geteilt über alle Tools, verwaltet im Gedächtnis-Tab.
`,1);function Zc(e,n){Pn(n,!0);const a=G(()=>xi.value),s=G(()=>{var x;return(((x=t(a))==null?void 0:x.models)||[]).filter(P=>!P.incomplete)});let l=L("zed"),o=L(Jt([])),v=L(""),d=L(!1),u=L("cline"),p=L(Jt(localStorage.getItem("mc_ip_override")||""));function _(x){return/^\d{1,3}(\.\d{1,3}){3}$/.test(x)}function C(){return location.protocol==="https:"||!_(location.hostname)}function m(){return`http://${t(p).trim()||location.hostname}:8080/v1`}const y=G(m);function $(){const x=t(p).trim();x?localStorage.setItem("mc_ip_override",x):localStorage.removeItem("mc_ip_override")}const O=G(()=>ze(t(u))),M=G(()=>t(o).length?t(o):t(s).map(x=>x.name)),F=G(()=>t(M)[0]||"coder"),ye=G(()=>{var x;return(x=t(s).find(P=>{var N,j;return(j=(N=P.meta)==null?void 0:N.caps)==null?void 0:j.includes("Bild")}))==null?void 0:x.name});function xe(x,P){const j=(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>{var w,K;const fe=(((w=H.meta)==null?void 0:w.caps)||[]).some(ee=>/Bild|Vision/i.test(ee)),me=((K=H.meta)==null?void 0:K.ctx)||131072;return` { "name": "${H.name}", "display_name": "${H.name}", "max_tokens": ${me}${fe?', "capabilities": { "tools": true, "images": true }':""} }`}).join(`, `);return`"language_models": { "openai_compatible": { "bosgame": { - "api_url": "${S}", + "api_url": "${x}", "available_models": [ ${j} ] } } -}`}function xe(S,$){const j=($.length?t(s).filter(X=>$.includes(X.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(X=>{var Ie;const ke=((Ie=X.meta)==null?void 0:Ie.ctx)||131072;return` "${X.name}": { "name": "${X.name}", "contextWindowSize": ${ke} }`}).join(`, +}`}function ke(x,P){const j=(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>{var me;const fe=((me=H.meta)==null?void 0:me.ctx)||131072;return` "${H.name}": { "name": "${H.name}", "contextWindowSize": ${fe} }`}).join(`, `);return`"providers": { "llama-swap": { "npm": "@ai-sdk/openai-compatible", "name": "Bosgame (llama-swap)", "options": { - "baseURL": "${S}", + "baseURL": "${x}", "apiKey": "local" }, "models": { ${j} } } -}`}function Te(S,$){return`{ +}`}function Ie(x,P){return`{ "models": [ -${($.length?t(s).filter(X=>$.includes(X.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(X=>` { - "title": "llama-swap / ${X.name}", +${(P.length?t(s).filter(H=>P.includes(H.name)):t(s).length?t(s):[{name:"coder",meta:{}}]).map(H=>` { + "title": "llama-swap / ${H.name}", "provider": "openai", - "model": "${X.name}", - "apiBase": "${S}", + "model": "${H.name}", + "apiBase": "${x}", "apiKey": "local" }`).join(`, `)} ] -}`}async function H(){u(c,"Teste…");try{const S=await De("/api/integration/test");u(d,S.ok,!0),u(c,S.ok?`✓ Verbunden — ${S.models.length} Modell(e): ${S.models.join(", ")}`:`✗ Keine Verbindung: ${S.error}`,!0)}catch(S){u(d,!1),u(c,"✗ "+S.message)}}function Q(S){var Y;const $=S.querySelector("code");$&&((Y=navigator.clipboard)==null||Y.writeText($.textContent||""))}function de(S){var $;($=navigator.clipboard)==null||$.writeText(S.value)}function Ee(S){return`{ +}`}async function Z(){c(v,"Teste…");try{const x=await De("/api/integration/test");c(d,x.ok,!0),c(v,x.ok?`✓ Verbunden — ${x.models.length} Modell(e): ${x.models.join(", ")}`:`✗ Keine Verbindung: ${x.error}`,!0)}catch(x){c(d,!1),c(v,"✗ "+x.message)}}function X(x){var N;const P=x.querySelector("code");P&&((N=navigator.clipboard)==null||N.writeText(P.textContent||""))}function ve(x){var P;(P=navigator.clipboard)==null||P.writeText(x.value)}function ze(x){return`{ "mcpServers": { "mission-control-memory": { - "command": "${S==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", - "args": ["${S==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], + "command": "${x==="bosgame"?"/opt/mission-control/.venv/bin/python":"python"}", + "args": ["${x==="bosgame"?"/opt/mission-control/mcp_memory.py":"C:\\\\Users\\\\\\\\mission-control\\\\mcp_memory.py"}"], "env": { "MC_URL": "http://192.168.178.151:9000" } } } -}`}var Be=Qc(),Qe=i(at(Be),2),pt=i(r(Qe),6),P=r(pt),oe=i(P,2),ge=i(pt,2),Xe=r(ge),ce=i(ge,2);{var Ke=S=>{var $=Pc();f(S,$)},ue=q(()=>A());R(ce,S=>{t(ue)&&S(Ke)})}var V=i(ce,2),ne=r(V),me=i(ne,2);{var he=S=>{var $=Dc(),Y=r($);z(()=>{Rt($,`color:${t(d)?"#7ee29a":"#ff9b95"}`),g(Y,t(c))}),f(S,$)};R(me,S=>{t(c)&&S(he)})}var Re=i(Qe,2),Ze=i(r(Re),2);nt(Ze,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],ct,(S,$)=>{var Y=q(()=>na($,3));let j=()=>t(Y)[0],X=()=>t(Y)[1],ke=()=>t(Y)[2];var Ie=$c(),M=r(Ie),F=r(M),ae=i(M,2),ze=r(ae),je=r(ze),It=i(ze,2),xt=r(It);z(()=>{g(F,j()),g(je,X()),g(xt,ke())}),f(S,Ie)});var vt=i(Re,2);{var ot=S=>{var $=Vc(),Y=at($),j=r(Y),X=i(r(j),2),ke=r(X),Ie=i(j,4);nt(Ie,21,()=>t(s),ct,(K,U)=>{const se=q(()=>t(o).includes(t(U).name));var le=Ic(),Pe=r(le);z(()=>{Rt(le,`cursor:pointer;${t(se)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),g(Pe,t(U).name)}),x("click",le,()=>u(o,t(se)?t(o).filter(Le=>Le!==t(U).name):[...t(o),t(U).name],!0)),x("keydown",le,Le=>Le.key==="Enter"&&u(o,t(se)?t(o).filter(Me=>Me!==t(U).name):[...t(o),t(U).name],!0)),f(K,le)});var M=i(Ie,2);{var F=K=>{var U=Lc(),se=r(U);x("click",se,le=>{le.preventDefault(),u(o,[],!0)}),f(K,U)};R(M,K=>{t(o).length&&K(F)})}var ae=i(Y,2),ze=i(r(ae),6);nt(ze,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],ct,(K,U)=>{var se=q(()=>na(U,3));let le=()=>t(se)[0],Pe=()=>t(se)[1],Le=()=>t(se)[2];var Me=Xr(),ie=r(Me),ve=r(ie),Ct=i(ie,2),Tt=r(Ct);z(()=>{Dt(Me,1,`card-btn${t(l)===le()?" cb-best":""}`),g(ve,Pe()),g(Tt,Le())}),x("click",Me,()=>u(l,le(),!0)),f(K,Me)});var je=i(ze,4);nt(je,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],ct,(K,U)=>{var se=q(()=>na(U,3));let le=()=>t(se)[0],Pe=()=>t(se)[1],Le=()=>t(se)[2];var Me=Xr(),ie=r(Me),ve=r(ie),Ct=i(ie,2),Tt=r(Ct);z(()=>{Dt(Me,1,`card-btn${t(l)===le()?" cb-best":""}`),g(ve,Pe()),g(Tt,Le())}),x("click",Me,()=>u(l,le(),!0)),f(K,Me)});var It=i(ae,2),xt=i(r(It),2);{var Lt=K=>{var U=Oc(),se=i(at(U),6),le=r(se),Pe=i(le,2),Le=i(se,4),Me=r(Le),ie=i(Me,2);z(()=>{Yn(le,t(y)),Yn(Me,t(B))}),x("click",Pe,ve=>de(ve.currentTarget.previousElementSibling)),x("click",ie,ve=>de(ve.currentTarget.previousElementSibling)),f(K,U)},C=K=>{const U=q(()=>Te(t(y),t(E)));var se=Bc(),le=i(at(se),4),Pe=r(le),Le=i(Pe,2),Me=r(Le),ie=r(Me),ve=i(le,2),Ct=i(r(ve)),Tt=r(Ct);z(()=>{g(ie,t(U)),g(Tt,`llama-swap / ${t(B)??""}`)}),x("click",Pe,Kt=>Q(Kt.currentTarget.parentElement)),f(K,se)},ee=K=>{var U=Rc(),se=i(at(U),6),le=r(se),Pe=i(le,2),Le=i(se,4),Me=r(Le),ie=i(Me,2),ve=i(Le,2),Ct=i(r(ve),3),Tt=r(Ct);z(()=>{Yn(le,t(y)),Yn(Me,t(B)),g(Tt,t(B))}),x("click",Pe,Kt=>de(Kt.currentTarget.previousElementSibling)),x("click",ie,Kt=>de(Kt.currentTarget.previousElementSibling)),f(K,U)},Ve=K=>{const U=q(()=>be(t(y),t(E)));var se=Fc(),le=i(at(se),4),Pe=r(le),Le=i(Pe,2),Me=r(Le),ie=r(Me),ve=i(le,4),Ct=i(r(ve)),Tt=r(Ct);z(()=>{g(ie,t(U)),g(Tt,`bosgame / ${t(B)??""}`)}),x("click",Pe,Kt=>Q(Kt.currentTarget.parentElement)),f(K,se)},te=K=>{const U=q(()=>xe(t(y),t(E)));var se=Kc(),le=i(at(se),6),Pe=r(le),Le=i(Pe,2),Me=r(Le),ie=r(Me),ve=i(le,2),Ct=i(r(ve),3),Tt=r(Ct);z(()=>{g(ie,t(U)),g(Tt,`llama-swap/${t(B)??""}`)}),x("click",Pe,Kt=>Q(Kt.currentTarget.parentElement)),f(K,se)},pe=K=>{var U=Nc(),se=i(at(U),4),le=r(se),Pe=i(le,2),Le=i(se,4),Me=r(Le),ie=i(Me,2);z(()=>{Yn(le,t(y)),Yn(Me,t(B))}),x("click",Pe,ve=>de(ve.currentTarget.previousElementSibling)),x("click",ie,ve=>de(ve.currentTarget.previousElementSibling)),f(K,U)},Ne=K=>{var U=qc(),se=i(at(U),4),le=r(se),Pe=i(le,2),Le=i(se,4),Me=r(Le),ie=i(Me,2);z(()=>Yn(le,t(y))),x("click",Pe,ve=>de(ve.currentTarget.previousElementSibling)),x("click",ie,ve=>de(ve.currentTarget.previousElementSibling)),f(K,U)};R(xt,K=>{t(l)==="janai"?K(Lt):t(l)==="continue"?K(C,1):t(l)==="antigravity"?K(ee,2):t(l)==="zed"?K(Ve,3):t(l)==="opencode"?K(te,4):t(l)==="cline"?K(pe,5):t(l)==="openwebui"&&K(Ne,6)})}var Ue=i(It,2);{var we=K=>{const U=q(()=>`curl ${t(y)}/chat/completions \\ +}`}var Re=Qc(),je=i(Xe(Re),2),ot=i(r(je),6),I=r(ot),re=i(I,2),be=i(ot,2),Je=r(be),de=i(be,2);{var Fe=x=>{var P=Pc();f(x,P)},ue=G(()=>C());q(de,x=>{t(ue)&&x(Fe)})}var at=i(de,2),Qe=r(at),it=i(Qe,2);{var dt=x=>{var P=Dc(),N=r(P);D(()=>{$t(P,`color:${t(d)?"#7ee29a":"#ff9b95"}`),g(N,t(v))}),f(x,P)};q(it,x=>{t(v)&&x(dt)})}var rt=i(je,2),Tt=i(r(rt),2);Ye(Tt,20,()=>[["⚡","Kein manuelles Starten nötig",'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],["🔄","Modelle wechseln sich automatisch ab","Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig."],["🧠","Zwei Modelle gleichzeitig aktiv halten","Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen."]],lt,(x,P)=>{var N=G(()=>aa(P,3));let j=()=>t(N)[0],H=()=>t(N)[1],fe=()=>t(N)[2];var me=$c(),w=r(me),K=r(w),ee=i(w,2),we=r(ee),Se=r(we),ft=i(we,2),st=r(ft);D(()=>{g(K,j()),g(Se,H()),g(st,fe())}),f(x,me)});var zt=i(rt,2);{var Wt=x=>{var P=Wc(),N=Xe(P),j=r(N),H=i(r(j),2),fe=r(H),me=i(j,4);Ye(me,21,()=>t(s),lt,(W,J)=>{const le=G(()=>t(o).includes(t(J).name));var oe=Ic(),$e=r(oe);D(()=>{$t(oe,`cursor:pointer;${t(le)?"background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)":""}`),g($e,t(J).name)}),k("click",oe,()=>c(o,t(le)?t(o).filter(Le=>Le!==t(J).name):[...t(o),t(J).name],!0)),k("keydown",oe,Le=>Le.key==="Enter"&&c(o,t(le)?t(o).filter(Te=>Te!==t(J).name):[...t(o),t(J).name],!0)),f(W,oe)});var w=i(me,2);{var K=W=>{var J=Lc(),le=r(J);k("click",le,oe=>{oe.preventDefault(),c(o,[],!0)}),f(W,J)};q(w,W=>{t(o).length&&W(K)})}var ee=i(N,2),we=i(r(ee),6);Ye(we,20,()=>[["janai","Jan AI","Einfachstes Chat-Interface — Desktop-App, kein Setup"],["openwebui","OpenWebUI","Browser-Chat für Teams — mehr Features, mehr Setup"]],lt,(W,J)=>{var le=G(()=>aa(J,3));let oe=()=>t(le)[0],$e=()=>t(le)[1],Le=()=>t(le)[2];var Te=Xr(),se=r(Te),ce=r(se),wt=i(se,2),St=r(wt);D(()=>{At(Te,1,`card-btn${t(l)===oe()?" cb-best":""}`),g(ce,$e()),g(St,Le())}),k("click",Te,()=>c(l,oe(),!0)),f(W,Te)});var Se=i(we,4);Ye(Se,20,()=>[["continue","Continue","VS Code/JetBrains — Hilfe ohne Agent-Overhead"],["cline","Cline","VS Code/JetBrains/Zed — voller Coding-Agent"],["antigravity","Antigravity","Googles agentic IDE — VS Code-basiert"],["opencode","OpenCode","Terminal-Agent — autonom, mächtig"],["zed","Zed","Schneller nativer Editor mit KI-Panel"]],lt,(W,J)=>{var le=G(()=>aa(J,3));let oe=()=>t(le)[0],$e=()=>t(le)[1],Le=()=>t(le)[2];var Te=Xr(),se=r(Te),ce=r(se),wt=i(se,2),St=r(wt);D(()=>{At(Te,1,`card-btn${t(l)===oe()?" cb-best":""}`),g(ce,$e()),g(St,Le())}),k("click",Te,()=>c(l,oe(),!0)),f(W,Te)});var ft=i(ee,2),st=i(r(ft),2);{var Ue=W=>{var J=Oc(),le=i(Xe(J),6),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>{Xn(oe,t(y)),Xn(Te,t(F))}),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)},T=W=>{const J=G(()=>Ie(t(y),t(M)));var le=Bc(),oe=i(Xe(le),4),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,2),wt=i(r(ce)),St=r(wt);D(()=>{g(se,t(J)),g(St,`llama-swap / ${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},Q=W=>{var J=Rc(),le=i(Xe(J),6),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2),ce=i(Le,2),wt=i(r(ce),3),St=r(wt);D(()=>{Xn(oe,t(y)),Xn(Te,t(F)),g(St,t(F))}),k("click",$e,Bt=>ve(Bt.currentTarget.previousElementSibling)),k("click",se,Bt=>ve(Bt.currentTarget.previousElementSibling)),f(W,J)},Be=W=>{const J=G(()=>xe(t(y),t(M)));var le=Fc(),oe=i(Xe(le),4),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,4),wt=i(r(ce)),St=r(wt);D(()=>{g(se,t(J)),g(St,`bosgame / ${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},ne=W=>{const J=G(()=>ke(t(y),t(M)));var le=Kc(),oe=i(Xe(le),6),$e=r(oe),Le=i($e,2),Te=r(Le),se=r(Te),ce=i(oe,2),wt=i(r(ce),3),St=r(wt);D(()=>{g(se,t(J)),g(St,`llama-swap/${t(F)??""}`)}),k("click",$e,Bt=>X(Bt.currentTarget.parentElement)),f(W,le)},he=W=>{var J=Nc(),le=i(Xe(J),4),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>{Xn(oe,t(y)),Xn(Te,t(F))}),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)},Ne=W=>{var J=qc(),le=i(Xe(J),4),oe=r(le),$e=i(oe,2),Le=i(le,4),Te=r(Le),se=i(Te,2);D(()=>Xn(oe,t(y))),k("click",$e,ce=>ve(ce.currentTarget.previousElementSibling)),k("click",se,ce=>ve(ce.currentTarget.previousElementSibling)),f(W,J)};q(st,W=>{t(l)==="janai"?W(Ue):t(l)==="continue"?W(T,1):t(l)==="antigravity"?W(Q,2):t(l)==="zed"?W(Be,3):t(l)==="opencode"?W(ne,4):t(l)==="cline"?W(he,5):t(l)==="openwebui"&&W(Ne,6)})}var We=i(ft,2);{var Ee=W=>{const J=G(()=>`curl ${t(y)}/chat/completions \\ -H "Content-Type: application/json" \\ -d '{ - "model": "${t(_e)}", + "model": "${t(ye)}", "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,"}}]}] -}'`);var se=Wc(),le=r(se),Pe=i(r(le),2),Le=r(Pe);Je(Le,()=>jt("check"));var Me=i(Le),ie=i(le,4),ve=r(ie),Ct=i(ve,2),Tt=r(Ct),Kt=r(Tt);z(()=>{g(Me,` „${t(_e)??""}" bereit`),g(Kt,t(U))}),x("click",ve,hn=>Q(hn.currentTarget.parentElement)),f(K,se)};R(Ue,K=>{t(_e)&&K(we)})}z(()=>g(ke,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),f(S,$)},bt=S=>{var $=Gc(),Y=i(r($),2),j=i(r(Y),4);x("click",j,()=>{var X;return(X=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:X.dispatchEvent(new MouseEvent("click"))}),f(S,$)};R(vt,S=>{t(s).length?S(ot):S(bt,-1)})}var it=i(vt,2),Ye=i(r(it),2),ft=i(r(Ye)),We=i(Ye,2);nt(We,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],ct,(S,$)=>{var Y=q(()=>na($,3));let j=()=>t(Y)[0],X=()=>t(Y)[1],ke=()=>t(Y)[2];var Ie=jc(),M=r(Ie),F=r(M),ae=i(M,2),ze=r(ae);z(()=>{Dt(Ie,1,`card-btn${t(v)===j()?" cb-best":""}`),g(F,X()),g(ze,ke())}),x("click",Ie,()=>u(v,j(),!0)),f(S,Ie)});var dt=i(We,2),I=r(dt),W=i(I,2),Ae=r(W),et=r(Ae),G=i(dt,2);{var $e=S=>{var $=Uc();f(S,$)},D=S=>{var $=Hc();f(S,$)},N=S=>{var $=Jc();f(S,$)};R(G,S=>{t(v)==="cline"?S($e):t(v)==="opencode"?S(D,1):S(N,-1)})}z(()=>{Yn(P,t(y)),g(et,t(O))}),x("click",oe,S=>{const $=S.currentTarget.previousElementSibling;de($)}),x("input",Xe,T),dn(Xe,()=>t(p),S=>u(p,S)),x("click",ne,H),x("click",ft,S=>{var $;S.preventDefault(),($=document.querySelector(".nav-item[data-view='memory']"))==null||$.click()}),x("click",I,S=>Q(S.currentTarget.parentElement)),f(e,Be),Dn()}qn(["click","input","keydown"]);var Yc=b('
'),Xc=b('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),ev=b('
Lade News… (erstes Laden kann kurz dauern)
'),tv=b('
'),nv=b('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),av=b('für dich'),iv=b('
'),rv=b('
'),sv=b('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function lv(e,n){Pn(n,!0);let a=L(Jt([])),s=L(Jt([])),l=L(!0),o=L("");const c=H=>H==="perfect"?"ok":H==="marginal"?"warn":"bad";function d(H){const Q=Math.max(0,Date.now()/1e3-H);return Q<60?Q+"s":Q<3600?Math.floor(Q/60)+"m":Q<86400?Math.floor(Q/3600)+"h":Math.floor(Q/86400)+"d"}async function v(){u(l,!0),u(o,"");try{u(a,(await De("/api/news")).items||[],!0)}catch(H){u(o,H.message||"Fehler beim Laden",!0)}finally{u(l,!1)}}async function p(){try{u(s,(await De("/api/cookbook/upgrades")).upgrades||[],!0)}catch{u(s,[],!0)}}async function _(H,Q){var de;Q.disabled=!0,Q.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:H.repo,role:H.role,params_b:H.params_b,quant:H.quant,hf_token:ci()})}),(de=document.querySelector(".nav-item[data-view='activity']"))==null||de.dispatchEvent(new MouseEvent("click"))}catch(Ee){Q.disabled=!1,Q.textContent="Installieren",alert("Fehler: "+Ee.message)}}function A(){v(),p()}yi(()=>{v(),p()});var m=sv(),y=at(m),T=i(r(y),2),O=i(y,2);{var E=H=>{var Q=Xc(),de=r(Q),Ee=i(r(de),2),Be=r(Ee),Qe=i(de,4);nt(Qe,21,()=>t(s),ct,(pt,P)=>{var oe=Yc(),ge=r(oe),Xe=r(ge),ce=r(Xe),Ke=r(ce),ue=i(ce,2),V=r(ue),ne=i(Xe,2),me=r(ne),he=i(ge,2);z(Re=>{g(Ke,t(P).name),Dt(ue,1,`fit-badge ${Re??""}`),g(V,t(P).fit.text),g(me,`Ersetzt dein „${t(P).old??""}". ${t(P).why??""}`)},[()=>c(t(P).fit.level)]),x("click",he,Re=>_(t(P),Re.currentTarget)),f(pt,oe)}),z(()=>g(Be,t(s).length)),f(H,Q)};R(O,H=>{t(s).length&&H(E)})}var B=i(O,2);{var _e=H=>{var Q=ev();f(H,Q)},be=H=>{var Q=tv(),de=r(Q);z(()=>g(de,t(o))),f(H,Q)},xe=H=>{var Q=nv();f(H,Q)},Te=H=>{var Q=rv();nt(Q,21,()=>t(a),ct,(de,Ee,Be)=>{var Qe=iv();Dt(Qe,1,`news-card${Be===0?" featured":""}`);var pt=r(Qe),P=r(pt),oe=r(P),ge=i(P,2);{var Xe=ne=>{var me=av();f(ne,me)};R(ge,ne=>{t(Ee).relevant&&ne(Xe)})}var ce=i(ge,2),Ke=r(ce),ue=i(pt,2),V=r(ue);z(ne=>{Za(Qe,"href",t(Ee).link),g(oe,t(Ee).source),g(Ke,ne),g(V,t(Ee).title)},[()=>t(Ee).ts?d(t(Ee).ts):""]),f(de,Qe)}),f(H,Q)};R(B,H=>{t(l)?H(_e):t(o)?H(be,1):t(a).length?H(Te,-1):H(xe,2)})}x("click",T,A),f(e,m),Dn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",` +}'`);var le=Vc(),oe=r(le),$e=i(r(oe),2),Le=r($e);He(Le,()=>jt("check"));var Te=i(Le),se=i(oe,4),ce=r(se),wt=i(ce,2),St=r(wt),Bt=r(St);D(()=>{g(Te,` „${t(ye)??""}" bereit`),g(Bt,t(J))}),k("click",ce,hn=>X(hn.currentTarget.parentElement)),f(W,le)};q(We,W=>{t(ye)&&W(Ee)})}D(()=>g(fe,t(o).length?`${t(o).length} von ${t(s).length} ausgewählt`:"alle werden eingeschlossen")),f(x,P)},qt=x=>{var P=Gc(),N=i(r(P),2),j=i(r(N),4);k("click",j,()=>{var H;return(H=document.querySelector(".nav-item[data-view='cookbook']"))==null?void 0:H.dispatchEvent(new MouseEvent("click"))}),f(x,P)};q(zt,x=>{t(s).length?x(Wt):x(qt,-1)})}var Gt=i(zt,2),Lt=i(r(Gt),2),Ot=i(r(Lt)),U=i(Lt,2);Ye(U,20,()=>[["cline","Cline / Claude Code","Windows — Tools auf dem Entwicklungs-PC"],["opencode","OpenCode","Windows — Terminal-Agent"],["bosgame","Direkt am Bosgame","Wenn das Tool am Server läuft"]],lt,(x,P)=>{var N=G(()=>aa(P,3));let j=()=>t(N)[0],H=()=>t(N)[1],fe=()=>t(N)[2];var me=jc(),w=r(me),K=r(w),ee=i(w,2),we=r(ee);D(()=>{At(me,1,`card-btn${t(u)===j()?" cb-best":""}`),g(K,H()),g(we,fe())}),k("click",me,()=>c(u,j(),!0)),f(x,me)});var ae=i(U,2),A=r(ae),B=i(A,2),_e=r(B),Ce=r(_e),V=i(ae,2);{var pe=x=>{var P=Uc();f(x,P)},z=x=>{var P=Hc();f(x,P)},R=x=>{var P=Jc();f(x,P)};q(V,x=>{t(u)==="cline"?x(pe):t(u)==="opencode"?x(z,1):x(R,-1)})}D(()=>{Xn(I,t(y)),g(Ce,t(O))}),k("click",re,x=>{const P=x.currentTarget.previousElementSibling;ve(P)}),k("input",Je,$),an(Je,()=>t(p),x=>c(p,x)),k("click",Qe,Z),k("click",Ot,x=>{var P;x.preventDefault(),(P=document.querySelector(".nav-item[data-view='memory']"))==null||P.click()}),k("click",A,x=>X(x.currentTarget.parentElement)),f(e,Re),Dn()}qn(["click","input","keydown"]);var Yc=b('
'),Xc=b('

Für dich: Upgrades

Neuere Modelle, die ein installiertes ersetzen können.
'),ev=b('
Lade News… (erstes Laden kann kurz dauern)
'),tv=b('
'),nv=b('
Keine News geladen
Die Quellen sind gerade nicht erreichbar — später nochmal probieren.
'),av=b('für dich'),iv=b('
'),rv=b('
'),sv=b('

News

Aktuelles aus der Local-LLM-Welt — aus kuratierten Quellen.
',1);function lv(e,n){Pn(n,!0);let a=L(Jt([])),s=L(Jt([])),l=L(!0),o=L("");const v=Z=>Z==="perfect"?"ok":Z==="marginal"?"warn":"bad";function d(Z){const X=Math.max(0,Date.now()/1e3-Z);return X<60?X+"s":X<3600?Math.floor(X/60)+"m":X<86400?Math.floor(X/3600)+"h":Math.floor(X/86400)+"d"}async function u(){c(l,!0),c(o,"");try{c(a,(await De("/api/news")).items||[],!0)}catch(Z){c(o,Z.message||"Fehler beim Laden",!0)}finally{c(l,!1)}}async function p(){try{c(s,(await De("/api/cookbook/upgrades")).upgrades||[],!0)}catch{c(s,[],!0)}}async function _(Z,X){var ve;X.disabled=!0,X.textContent="Starte…";try{await De("/api/cookbook/install-model",{method:"POST",body:JSON.stringify({repo:Z.repo,role:Z.role,params_b:Z.params_b,quant:Z.quant,hf_token:ci()})}),(ve=document.querySelector(".nav-item[data-view='activity']"))==null||ve.dispatchEvent(new MouseEvent("click"))}catch(ze){X.disabled=!1,X.textContent="Installieren",alert("Fehler: "+ze.message)}}function C(){u(),p()}yi(()=>{u(),p()});var m=sv(),y=Xe(m),$=i(r(y),2),O=i(y,2);{var M=Z=>{var X=Xc(),ve=r(X),ze=i(r(ve),2),Re=r(ze),je=i(ve,4);Ye(je,21,()=>t(s),lt,(ot,I)=>{var re=Yc(),be=r(re),Je=r(be),de=r(Je),Fe=r(de),ue=i(de,2),at=r(ue),Qe=i(Je,2),it=r(Qe),dt=i(be,2);D(rt=>{g(Fe,t(I).name),At(ue,1,`fit-badge ${rt??""}`),g(at,t(I).fit.text),g(it,`Ersetzt dein „${t(I).old??""}". ${t(I).why??""}`)},[()=>v(t(I).fit.level)]),k("click",dt,rt=>_(t(I),rt.currentTarget)),f(ot,re)}),D(()=>g(Re,t(s).length)),f(Z,X)};q(O,Z=>{t(s).length&&Z(M)})}var F=i(O,2);{var ye=Z=>{var X=ev();f(Z,X)},xe=Z=>{var X=tv(),ve=r(X);D(()=>g(ve,t(o))),f(Z,X)},ke=Z=>{var X=nv();f(Z,X)},Ie=Z=>{var X=rv();Ye(X,21,()=>t(a),lt,(ve,ze,Re)=>{var je=iv();At(je,1,`news-card${Re===0?" featured":""}`);var ot=r(je),I=r(ot),re=r(I),be=i(I,2);{var Je=Qe=>{var it=av();f(Qe,it)};q(be,Qe=>{t(ze).relevant&&Qe(Je)})}var de=i(be,2),Fe=r(de),ue=i(ot,2),at=r(ue);D(Qe=>{Aa(je,"href",t(ze).link),g(re,t(ze).source),g(Fe,Qe),g(at,t(ze).title)},[()=>t(ze).ts?d(t(ze).ts):""]),f(ve,je)}),f(Z,X)};q(F,Z=>{t(l)?Z(ye):t(o)?Z(xe,1):t(a).length?Z(Ie,-1):Z(ke,2)})}k("click",$,C),f(e,m),Dn()}qn(["click"]);const es=[{label:"Einstieg",tutorials:[["Dein erster Workflow — in 3 Schritten",`
  1. Modell holen: Tab Cookbook → Anwendungsfall wählen (z.B. „Coden & Programmieren") → Komplettes Setup installieren. Der Download läuft im Tab Aktivität — einfach warten bis der Job grün wird.
  2. @@ -649,20 +649,24 @@ src/
    Strg+Shift+R (Hard Reload). Wenn das nicht hilft: Tab Server → Mission Control → Neu starten.
    - `]]}],ov=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine 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 bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var dv=b('

    '),cv=b(""),vv=b('
    '),uv=b('
    '),pv=b('

    Guide

    Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

    Begriffe kurz erklärt

    ',1);function fv(e,n){Pn(n,!0);let a=L(0);function s(p){var _;u(a,p,!0),(_=document.getElementById(`guide-group-${p}`))==null||_.scrollIntoView({behavior:"smooth",block:"start"})}var l=pv(),o=i(at(l),2),c=i(r(o),2);nt(c,21,()=>ov,ct,(p,_)=>{var A=q(()=>na(t(_),2));let m=()=>t(A)[0],y=()=>t(A)[1];var T=dv(),O=r(T),E=r(O),B=i(O,2),_e=r(B);z(()=>{g(E,m()),g(_e,y())}),f(p,T)});var d=i(o,2);nt(d,21,()=>es,ct,(p,_,A)=>{var m=cv(),y=r(m);z(()=>{Dt(m,1,`guide-tab${t(a)===A?" active":""}`,"svelte-112sh7i"),g(y,t(_).label)}),x("click",m,()=>s(A)),f(p,m)});var v=i(d,2);nt(v,17,()=>es,ct,(p,_,A)=>{var m=uv();Za(m,"id",`guide-group-${A}`);var y=r(m),T=r(y),O=i(y,2);nt(O,17,()=>t(_).tutorials,ct,(E,B,_e)=>{var be=q(()=>na(t(B),2));let xe=()=>t(be)[0],Te=()=>t(be)[1];var H=vv();H.open=A===0&&_e===0;var Q=r(H),de=r(Q),Ee=i(Q,2);Je(Ee,Te,!0),z(()=>g(de,xe())),f(E,H)}),z(()=>g(T,t(_).label)),f(p,m)}),f(e,l),Dn()}qn(["click"]);var hv=b('

    Neuer Eintrag

    Strg+Enter zum Speichern
    '),gv=b(' '),mv=b('
    Lade…
    '),bv=b(''),_v=b('
    '),yv=b('
    ',1),xv=b('
    '),kv=b("
    "),wv=b('
    '),Sv=b(`

    Gedächtnis

    Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
    Filter:

    Wie KI-Tools dieses Gedächtnis nutzen

    Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu. +
    `]]}],ov=[["LLM / Modell","Die KI selbst — versteht und schreibt Text (wie ChatGPT, nur lokal auf deinem PC). Ein Modell ist eine konkrete Datei, oft auf etwas spezialisiert (Code, Bilder, Chat)."],["GGUF","Das lokal lauffähige Dateiformat. llama-swap lädt nur GGUF — Repos ohne GGUF kann die Engine 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 bewährte Sweetspot. Für Coding/Reasoning: Q8_0 (nahezu verlustfrei). Wenn Q4_K_M 1 GB zu groß ist: IQ4_XS als Alternative (ähnliche Qualität, etwas kleiner)."],["Kontextfenster","Das Kurzzeitgedächtnis: wie viel Text sich das Modell gleichzeitig merken kann. Größer = mehr Überblick, mehr Speicher, etwas langsamer."],["Token","Die kleinste Einheit die ein Modell verarbeitet — meist 3–4 Zeichen oder ein kurzes Wort. 1 000 Tokens ≈ 750 Wörter. Kontextfenster, Geschwindigkeit und Kosten werden in Tokens gemessen."],["Auto-Swap","llama-swap lädt/entlädt Modelle automatisch — immer nur eins gleichzeitig. Du managst nichts."],["TTL (Time to Live)","Wie lange ein Modell nach der letzten Anfrage im RAM bleibt bevor es entladen wird. Standard: 5 Minuten. ∞ = bleibt dauerhaft geladen (sinnvoll für den Scout)."],["Agent","Ein Programm (OpenCode, Cline, Continue), das das Modell in einer Handlungsschleife laufen lässt — Dateien lesen/ändern, Befehle ausführen, planen, bis die Aufgabe erledigt ist."],["MCP","Model Context Protocol — der Stecker, über den ein Agent zusätzliche Werkzeuge bekommt (Web, Datenbank, GitHub …). MCP = neue Fähigkeiten."],["Skills / Rules","Kurze Textdatei (AGENTS.md, .clinerules …) mit Anweisungen wie der Agent in deinem Projekt arbeiten soll — einmal geschrieben, immer befolgt. Seit 2026 plattformübergreifender Standard: AGENTS.md wird von über 10 Tools nativ gelesen."],["Memory Bank","Clines Konzept für dauerhaften Projekt-Kontext: projectbrief.md (Ziel & Scope), activeContext.md (aktueller Fokus), progress.md (Stand). Wird zu Beginn jeder Aufgabe automatisch gelesen — ähnlich wie AGENTS.md, aber aufgeteilt nach Zweck."],["System-Prompt","Eine unsichtbare Anweisung die vor deiner Nachricht steht und das Verhalten des Modells grundlegend prägt (Sprache, Ton, Rolle). Skills nutzen oft den System-Prompt."],["Vision","Modelle mit Vision-Fähigkeit können Bilder verstehen — Screenshots, Diagramme, Fehlerfotos. Erkennbar am mmproj-Projektor der mitgeladen wird."]];var dv=b('

    '),cv=b(""),vv=b('
    '),uv=b('
    '),pv=b('

    Guide

    Schritt für Schritt erklärt — von der ersten Einrichtung bis zu echten Agenten-Workflows.

    Begriffe kurz erklärt

    ',1);function fv(e,n){Pn(n,!0);let a=L(0);function s(p){var _;c(a,p,!0),(_=document.getElementById(`guide-group-${p}`))==null||_.scrollIntoView({behavior:"smooth",block:"start"})}var l=pv(),o=i(Xe(l),2),v=i(r(o),2);Ye(v,21,()=>ov,lt,(p,_)=>{var C=G(()=>aa(t(_),2));let m=()=>t(C)[0],y=()=>t(C)[1];var $=dv(),O=r($),M=r(O),F=i(O,2),ye=r(F);D(()=>{g(M,m()),g(ye,y())}),f(p,$)});var d=i(o,2);Ye(d,21,()=>es,lt,(p,_,C)=>{var m=cv(),y=r(m);D(()=>{At(m,1,`guide-tab${t(a)===C?" active":""}`,"svelte-112sh7i"),g(y,t(_).label)}),k("click",m,()=>s(C)),f(p,m)});var u=i(d,2);Ye(u,17,()=>es,lt,(p,_,C)=>{var m=uv();Aa(m,"id",`guide-group-${C}`);var y=r(m),$=r(y),O=i(y,2);Ye(O,17,()=>t(_).tutorials,lt,(M,F,ye)=>{var xe=G(()=>aa(t(F),2));let ke=()=>t(xe)[0],Ie=()=>t(xe)[1];var Z=vv();Z.open=C===0&&ye===0;var X=r(Z),ve=r(X),ze=i(X,2);He(ze,Ie,!0),D(()=>g(ve,ke())),f(M,Z)}),D(()=>g($,t(_).label)),f(p,m)}),f(e,l),Dn()}qn(["click"]);var hv=b('
    '),gv=b('

    Import aus Claude / Gemini / ChatGPT

    Füge Erkenntnisse aus anderen KI-Sessions ein — jede Zeile wird ein eigener Eintrag.
    '),mv=b('

    Neuer Eintrag

    Strg+Enter zum Speichern
    '),bv=b(' '),_v=b('
    Lade…
    '),yv=b(''),xv=b('
    '),kv=b('
    ',1),wv=b('
    '),Sv=b("
    "),Mv=b('
    '),Ev=b(`

    Gedächtnis

    Fakten, Entscheidungen und Kontext — geteilt von allen KI-Tools via MCP.
    Filter:

    Wie KI-Tools dieses Gedächtnis nutzen

    Cline, OpenCode und Claude Code greifen über den Memory MCP-Server auf diese Einträge zu. Beim Start einer Session lädt der Agent automatisch alle Einträge — er kennt dann deinen Stack, - deine Präferenzen und frühere Entscheidungen. Den Setup-Guide findest du unter Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Mv(e,n){Pn(n,!0);let a=L(Jt([])),s=L(!0),l=L("all"),o=L(!1),c=L(""),d=L("stable"),v=L(null),p=L(""),_=L("stable");const A=q(()=>t(l)==="all"?t(a):t(a).filter(V=>V.category===t(l))),m={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function y(V){const ne=Math.floor((Date.now()-new Date(V).getTime())/1e3);return ne<60?"gerade eben":ne<3600?`vor ${Math.floor(ne/60)} Min`:ne<86400?`vor ${Math.floor(ne/3600)} Std`:`vor ${Math.floor(ne/86400)} Tagen`}function T(V){return t(a).filter(ne=>ne.category===V).length}async function O(){try{u(a,await De("/api/memory"),!0)}catch(V){re("Laden fehlgeschlagen: "+V.message,!0)}finally{u(s,!1)}}async function E(){if(t(c).trim())try{const V=await De("/api/memory",{method:"POST",body:JSON.stringify({content:t(c).trim(),category:t(d),source:"manual"})});u(a,[V,...t(a)],!0),u(c,""),u(d,"stable"),u(o,!1),re("Gespeichert")}catch(V){re("Fehler: "+V.message,!0)}}async function B(V){try{const ne=await De(`/api/memory/${V.id}`,{method:"PUT",body:JSON.stringify({content:t(p),category:t(_)})});u(a,t(a).map(me=>me.id===V.id?ne:me),!0),u(v,null),re("Aktualisiert")}catch(ne){re("Fehler: "+ne.message,!0)}}async function _e(V){if(await xn({title:"Eintrag löschen?",body:`„${V.content.length>80?V.content.slice(0,80)+"…":V.content}" wird dauerhaft entfernt.`,danger:!0}))try{await De(`/api/memory/${V.id}`,{method:"DELETE"}),u(a,t(a).filter(me=>me.id!==V.id),!0),re("Gelöscht")}catch(me){re("Fehler: "+me.message,!0)}}function be(V){u(v,V.id,!0),u(p,V.content,!0),u(_,V.category,!0)}Va(()=>{O()});var xe=Sv(),Te=at(xe),H=i(r(Te),2),Q=r(H),de=i(Te,2);{var Ee=V=>{var ne=hv(),me=i(r(ne),4),he=i(me,4),Re=r(he);Re.value=Re.__value="user";var Ze=i(Re);Ze.value=Ze.__value="instruction";var vt=i(Ze);vt.value=vt.__value="stable";var ot=i(vt);ot.value=ot.__value="versioned";var bt=i(ot);bt.value=bt.__value="ephemeral";var it=i(he,2),Ye=r(it),ft=i(Ye,2);z(We=>Ye.disabled=We,[()=>!t(c).trim()]),x("keydown",me,We=>{We.key==="Enter"&&(We.ctrlKey||We.metaKey)&&E()}),dn(me,()=>t(c),We=>u(c,We)),wa(he,()=>t(d),We=>u(d,We)),x("click",Ye,E),x("click",ft,()=>{u(o,!1),u(c,"")}),f(V,ne)};R(de,V=>{t(o)&&V(Ee)})}var Be=i(de,2),Qe=r(Be),pt=i(r(Qe),2);nt(pt,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",T("user")],["instruction","Verhalten","#fb923c",T("instruction")],["stable","Stabil","var(--accent)",T("stable")],["versioned","Versioniert","#f59e0b",T("versioned")],["ephemeral","Temporär","var(--mut)",T("ephemeral")]],ct,(V,ne)=>{var me=q(()=>na(t(ne),4));let he=()=>t(me)[0],Re=()=>t(me)[1],Ze=()=>t(me)[2],vt=()=>t(me)[3];var ot=gv(),bt=r(ot),it=i(bt),Ye=r(it);z(()=>{Rt(ot,`cursor:pointer;${t(l)===he()?`background:rgba(45,212,191,.12);border-color:${Ze()||"var(--accent)"};color:${Ze()||"var(--accent)"}`:""}`),g(bt,`${Re()??""} `),g(Ye,vt())}),x("click",ot,()=>u(l,he(),!0)),x("keydown",ot,ft=>ft.key==="Enter"&&u(l,he(),!0)),f(V,ot)});var P=i(Be,2);{var oe=V=>{var ne=mv();f(V,ne)},ge=V=>{var ne=_v(),me=r(ne),he=r(me),Re=r(he),Ze=i(he,2),vt=r(Ze),ot=i(Ze,2);{var bt=it=>{var Ye=bv();x("click",Ye,()=>u(o,!0)),f(it,Ye)};R(ot,it=>{t(a).length===0&&it(bt)})}z(()=>{g(Re,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),g(vt,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),f(V,ne)},Xe=V=>{var ne=wv();nt(ne,23,()=>t(A),me=>me.id,(me,he,Re)=>{var Ze=kv(),vt=r(Ze);{var ot=it=>{var Ye=yv(),ft=at(Ye),We=i(ft,2),dt=r(We);dt.value=dt.__value="user";var I=i(dt);I.value=I.__value="instruction";var W=i(I);W.value=W.__value="stable";var Ae=i(W);Ae.value=Ae.__value="versioned";var et=i(Ae);et.value=et.__value="ephemeral";var G=i(We,2),$e=r(G),D=i($e,2);dn(ft,()=>t(p),N=>u(p,N)),wa(We,()=>t(_),N=>u(_,N)),x("click",$e,()=>B(t(he))),x("click",D,()=>u(v,null)),f(it,Ye)},bt=it=>{var Ye=xv(),ft=r(Ye),We=r(ft),dt=r(We),I=i(We,2),W=r(I),Ae=r(W),et=i(W,2),G=r(et),$e=i(et,2),D=r($e),N=i(ft,2),S=r(N),$=i(S,2);z(Y=>{var j,X,ke;g(dt,t(he).content),Rt(W,`border-color:${(((j=m[t(he).category])==null?void 0:j.color)||"var(--mut)")??""};color:${(((X=m[t(he).category])==null?void 0:X.color)||"var(--mut)")??""}`),g(Ae,((ke=m[t(he).category])==null?void 0:ke.label)||t(he).category),g(G,t(he).source),g(D,Y)},[()=>y(t(he).updated_at)]),x("click",S,()=>be(t(he))),x("click",$,()=>_e(t(he))),f(it,Ye)};R(vt,it=>{t(v)===t(he).id?it(ot):it(bt,-1)})}z(()=>Rt(Ze,`padding:14px 16px;${t(Re){t(s)?V(oe):t(A).length===0?V(ge,1):V(Xe,-1)})}var ce=i(P,2),Ke=i(r(ce),2),ue=i(r(Ke),3);z(()=>g(Q,t(o)?"Abbrechen":"+ Eintrag")),x("click",H,()=>{u(o,!t(o)),u(c,"")}),x("click",ue,V=>{var ne;V.preventDefault(),(ne=document.querySelector(".nav-item[data-view='connect']"))==null||ne.click()}),f(e,xe),Dn()}qn(["click","keydown"]);var Ev=b('
    pip install faster-whisper
    '),Av=b('
    '),Cv=b('
    4. Bosgame-Key eintragen (in Windows PowerShell):
    '),Tv=b('
    SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
    '),zv=b('
    Einrichtung (einmalig, ~3 Minuten):
    1. PowerShell als Admin — OpenSSH Server installieren:
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    2. Dienst starten und dauerhaft aktivieren:
    3. SSH-Ordner erstellen:
    5. Windows-IP in Mission Control Env-Var setzen:
    HERMES_WINDOWS_HOST=192.168.178.XXX
    '),Pv=b('

    Hermes Setup-Wizard

    Whisper (Sprache → Text)
    faster-whisper muss auf dem Bosgame installiert sein
    Piper TTS (Text → Sprache)
    Piper-Binary + deutsche Stimme
    Windows SSH-Verbindung
    Damit Hermes Dateien auf deinem Windows-PC ändern kann
    '),Dv=b(''),$v=b('
    Hermes ist bereit
    Stelle eine Frage oder gib einen Auftrag — per Text oder Sprache.
    '),Iv=b(`
    Verbinden → Gedächtnis-MCP.
    Über mich = wer du bist, Präferenzen · Verhalten = Regeln für alle KI-Tools · Stabil = Projektfakten · Versioniert = Tech-Versionen · Temporär = 7 Tage, dann weg
    `,1);function Av(e,n){Pn(n,!0);let a=L(Jt([])),s=L(!0),l=L("all"),o=L(!1),v=L(""),d=L("stable"),u=L(null),p=L(""),_=L("stable"),C=L(!1),m=L(""),y=L("stable"),$=L("import"),O=L(!1);const M=G(()=>t(m).split(` +`).map(U=>U.trim()).filter(U=>U.length>0)),F=G(()=>t(l)==="all"?t(a):t(a).filter(U=>U.category===t(l))),ye={user:{label:"Über mich",color:"#a78bfa"},instruction:{label:"Verhalten",color:"#fb923c"},stable:{label:"Stabil",color:"var(--accent)"},versioned:{label:"Versioniert",color:"#f59e0b"},ephemeral:{label:"Temporär",color:"var(--mut)"}};function xe(U){const ae=Math.floor((Date.now()-new Date(U).getTime())/1e3);return ae<60?"gerade eben":ae<3600?`vor ${Math.floor(ae/60)} Min`:ae<86400?`vor ${Math.floor(ae/3600)} Std`:`vor ${Math.floor(ae/86400)} Tagen`}function ke(U){return t(a).filter(ae=>ae.category===U).length}async function Ie(){try{c(a,await De("/api/memory"),!0)}catch(U){ie("Laden fehlgeschlagen: "+U.message,!0)}finally{c(s,!1)}}async function Z(){if(t(v).trim())try{const U=await De("/api/memory",{method:"POST",body:JSON.stringify({content:t(v).trim(),category:t(d),source:"manual"})});c(a,[U,...t(a)],!0),c(v,""),c(d,"stable"),c(o,!1),ie("Gespeichert")}catch(U){ie("Fehler: "+U.message,!0)}}async function X(U){try{const ae=await De(`/api/memory/${U.id}`,{method:"PUT",body:JSON.stringify({content:t(p),category:t(_)})});c(a,t(a).map(A=>A.id===U.id?ae:A),!0),c(u,null),ie("Aktualisiert")}catch(ae){ie("Fehler: "+ae.message,!0)}}async function ve(U){if(await xn({title:"Eintrag löschen?",body:`„${U.content.length>80?U.content.slice(0,80)+"…":U.content}" wird dauerhaft entfernt.`,danger:!0}))try{await De(`/api/memory/${U.id}`,{method:"DELETE"}),c(a,t(a).filter(A=>A.id!==U.id),!0),ie("Gelöscht")}catch(A){ie("Fehler: "+A.message,!0)}}function ze(U){c(u,U.id,!0),c(p,U.content,!0),c(_,U.category,!0)}async function Re(){if(t(M).length===0)return;c(O,!0);let U=0;for(const ae of t(M))try{const A=await De("/api/memory",{method:"POST",body:JSON.stringify({content:ae,category:t(y),source:t($)})});c(a,[A,...t(a)],!0),U++}catch{}c(O,!1),c(C,!1),c(m,""),ie(`${U} von ${t(M).length} Einträgen importiert`)}Ga(()=>{Ie()});var je=Ev(),ot=Xe(je),I=i(r(ot),2),re=r(I),be=r(re),Je=i(re,2),de=r(Je),Fe=i(ot,2);{var ue=U=>{var ae=gv(),A=i(r(ae),6);Aa(A,"placeholder",`Tobi arbeitet am liebsten abends. +Projektsprache: Deutsch. +Bosgame M5 läuft mit Ubuntu 26.04. +...`);var B=i(A,2),_e=r(B),Ce=i(r(_e),2),V=r(Ce);V.value=V.__value="user";var pe=i(V);pe.value=pe.__value="instruction";var z=i(pe);z.value=z.__value="stable";var R=i(z);R.value=R.__value="versioned";var x=i(R);x.value=x.__value="ephemeral";var P=i(_e,2),N=i(r(P),2),j=r(N);j.value=j.__value="import";var H=i(j);H.value=H.__value="claude";var fe=i(H);fe.value=fe.__value="gemini";var me=i(fe);me.value=me.__value="chatgpt";var w=i(me);w.value=w.__value="manual";var K=i(B,2);{var ee=Ue=>{var T=hv(),Q=r(T);D(()=>g(Q,`${t(M).length??""} Eintrag/Einträge erkannt`)),f(Ue,T)};q(K,Ue=>{t(M).length>0&&Ue(ee)})}var we=i(K,2),Se=r(we),ft=r(Se),st=i(Se,2);D(()=>{Se.disabled=t(M).length===0||t(O),g(ft,t(O)?"Importiere…":`${t(M).length} Einträge speichern`)}),an(A,()=>t(m),Ue=>c(m,Ue)),Hn(Ce,()=>t(y),Ue=>c(y,Ue)),Hn(N,()=>t($),Ue=>c($,Ue)),k("click",Se,Re),k("click",st,()=>{c(C,!1),c(m,"")}),f(U,ae)};q(Fe,U=>{t(C)&&U(ue)})}var at=i(Fe,2);{var Qe=U=>{var ae=mv(),A=i(r(ae),4),B=i(A,4),_e=r(B);_e.value=_e.__value="user";var Ce=i(_e);Ce.value=Ce.__value="instruction";var V=i(Ce);V.value=V.__value="stable";var pe=i(V);pe.value=pe.__value="versioned";var z=i(pe);z.value=z.__value="ephemeral";var R=i(B,2),x=r(R),P=i(x,2);D(N=>x.disabled=N,[()=>!t(v).trim()]),k("keydown",A,N=>{N.key==="Enter"&&(N.ctrlKey||N.metaKey)&&Z()}),an(A,()=>t(v),N=>c(v,N)),Hn(B,()=>t(d),N=>c(d,N)),k("click",x,Z),k("click",P,()=>{c(o,!1),c(v,"")}),f(U,ae)};q(at,U=>{t(o)&&U(Qe)})}var it=i(at,2),dt=r(it),rt=i(r(dt),2);Ye(rt,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",ke("user")],["instruction","Verhalten","#fb923c",ke("instruction")],["stable","Stabil","var(--accent)",ke("stable")],["versioned","Versioniert","#f59e0b",ke("versioned")],["ephemeral","Temporär","var(--mut)",ke("ephemeral")]],lt,(U,ae)=>{var A=G(()=>aa(t(ae),4));let B=()=>t(A)[0],_e=()=>t(A)[1],Ce=()=>t(A)[2],V=()=>t(A)[3];var pe=bv(),z=r(pe),R=i(z),x=r(R);D(()=>{$t(pe,`cursor:pointer;${t(l)===B()?`background:rgba(45,212,191,.12);border-color:${Ce()||"var(--accent)"};color:${Ce()||"var(--accent)"}`:""}`),g(z,`${_e()??""} `),g(x,V())}),k("click",pe,()=>c(l,B(),!0)),k("keydown",pe,P=>P.key==="Enter"&&c(l,B(),!0)),f(U,pe)});var Tt=i(it,2);{var zt=U=>{var ae=_v();f(U,ae)},Wt=U=>{var ae=xv(),A=r(ae),B=r(A),_e=r(B),Ce=i(B,2),V=r(Ce),pe=i(Ce,2);{var z=R=>{var x=yv();k("click",x,()=>c(o,!0)),f(R,x)};q(pe,R=>{t(a).length===0&&R(z)})}D(()=>{g(_e,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),g(V,t(a).length===0?'Klicke „+ Eintrag" um manuell etwas zu speichern, oder verbinde ein KI-Tool via MCP.':"Andere Kategorie wählen oder Eintrag anlegen.")}),f(U,ae)},qt=U=>{var ae=Mv();Ye(ae,23,()=>t(F),A=>A.id,(A,B,_e)=>{var Ce=Sv(),V=r(Ce);{var pe=R=>{var x=kv(),P=Xe(x),N=i(P,2),j=r(N);j.value=j.__value="user";var H=i(j);H.value=H.__value="instruction";var fe=i(H);fe.value=fe.__value="stable";var me=i(fe);me.value=me.__value="versioned";var w=i(me);w.value=w.__value="ephemeral";var K=i(N,2),ee=r(K),we=i(ee,2);an(P,()=>t(p),Se=>c(p,Se)),Hn(N,()=>t(_),Se=>c(_,Se)),k("click",ee,()=>X(t(B))),k("click",we,()=>c(u,null)),f(R,x)},z=R=>{var x=wv(),P=r(x),N=r(P),j=r(N),H=i(N,2),fe=r(H),me=r(fe),w=i(fe,2),K=r(w),ee=i(w,2),we=r(ee),Se=i(P,2),ft=r(Se),st=i(ft,2);D(Ue=>{var T,Q,Be;g(j,t(B).content),$t(fe,`border-color:${(((T=ye[t(B).category])==null?void 0:T.color)||"var(--mut)")??""};color:${(((Q=ye[t(B).category])==null?void 0:Q.color)||"var(--mut)")??""}`),g(me,((Be=ye[t(B).category])==null?void 0:Be.label)||t(B).category),g(K,t(B).source),g(we,Ue)},[()=>xe(t(B).updated_at)]),k("click",ft,()=>ze(t(B))),k("click",st,()=>ve(t(B))),f(R,x)};q(V,R=>{t(u)===t(B).id?R(pe):R(z,-1)})}D(()=>$t(Ce,`padding:14px 16px;${t(_e){t(s)?U(zt):t(F).length===0?U(Wt,1):U(qt,-1)})}var Gt=i(Tt,2),Lt=i(r(Gt),2),Ot=i(r(Lt),3);D(()=>{g(be,t(C)?"Abbrechen":"⇩ Import"),g(de,t(o)?"Abbrechen":"+ Eintrag")}),k("click",re,()=>{c(C,!t(C)),c(o,!1),c(m,"")}),k("click",Je,()=>{c(o,!t(o)),c(C,!1),c(v,"")}),k("click",Ot,U=>{var ae;U.preventDefault(),(ae=document.querySelector(".nav-item[data-view='connect']"))==null||ae.click()}),f(e,je),Dn()}qn(["click","keydown"]);var Cv=b('
    pip install faster-whisper
    '),Tv=b('
    '),zv=b('
    4. Bosgame-Key eintragen (in Windows PowerShell):
    '),Pv=b('
    SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
    '),Dv=b('
    Einrichtung (einmalig, ~3 Minuten):
    1. PowerShell als Admin — OpenSSH Server installieren:
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    2. Dienst starten und dauerhaft aktivieren:
    3. SSH-Ordner erstellen:
    5. Windows-IP in Mission Control Env-Var setzen:
    HERMES_WINDOWS_HOST=192.168.178.XXX
    '),$v=b('

    Hermes Setup-Wizard

    Whisper (Sprache → Text)
    faster-whisper muss auf dem Bosgame installiert sein
    Piper TTS (Text → Sprache)
    Piper-Binary + deutsche Stimme
    Windows SSH-Verbindung
    Damit Hermes Dateien auf deinem Windows-PC ändern kann
    '),Iv=b(''),Lv=b('
    Hermes ist bereit
    Stelle eine Frage oder gib einen Auftrag — per Text oder Sprache.
    '),Ov=b(`
    `),Lv=b(`
    `),Bv=b(`
    H
    `),Ov=b(` `),Bv=b(`
    `),Rv=b('
    '),Fv=b(`
    `),Kv=b(`
    `),Rv=b(` `),Fv=b(`
    `),Kv=b('
    '),Nv=b(`
    `),qv=b(`
    H
    denkt nach…
    `),Nv=b(''),qv=b(''),Wv=b('
    '),Vv=b('

    Hermes

    Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
    ',1);function Gv(e,n){Pn(n,!0);const a="hermes_chat_history";let s=L(Jt((()=>{try{return JSON.parse(sessionStorage.getItem(a)||"[]")}catch{return[]}})())),l=L(""),o=L(!1),c=L(!1),d=L(!1),v=L(!1),p=L(null),_=L(!1),A=L(""),m=L(null),y=L("");Va(()=>{try{sessionStorage.setItem(a,JSON.stringify(t(s)))}catch{}});function T(){const D=location.protocol==="https:"?"wss:":"ws:",N=localStorage.getItem("mc_token")||"",S=`${D}//${location.host}/api/hermes/chat${N?"?token="+N:""}`,$=new WebSocket(S);$.onmessage=Y=>{const j=JSON.parse(Y.data);if(j.type==="thinking")u(o,!0);else if(j.type!=="info")if(j.type==="token"){u(o,!1),u(y,t(y)+j.content);const X=t(s)[t(s).length-1];(X==null?void 0:X.role)==="hermes"?u(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)}],!0):u(s,[...t(s),{role:"hermes",content:t(y)}],!0)}else if(j.type==="tool_call"){u(o,!1);const X=j.args||{},ke=Object.values(X).join(" ").slice(0,60);u(s,[...t(s),{role:"tool",content:ke,tool:j.name}],!0)}else if(j.type==="tool_result"){const X=[...t(s)].reverse().find(ke=>ke.role==="tool"&&ke.tool===j.name);X&&(X.content=j.content),u(s,[...t(s)],!0)}else j.type==="error"?(u(o,!1),u(s,[...t(s),{role:"error",content:j.content}],!0)):j.type==="done"&&(u(o,!1),u(c,!1),u(y,""),t(d)&&Q())},$.onclose=()=>{u(m,null),setTimeout(T,3e3)},$.onerror=()=>$.close(),u(m,$,!0)}function O(){var D;u(c,!0),u(o,!1),t(y)&&u(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)+" ✋"}],!0),u(y,""),(D=t(m))==null||D.close()}async function E(){const D=t(l).trim();!D||!t(m)||t(m).readyState!==1||(u(s,[...t(s),{role:"user",content:D}],!0),u(l,""),u(y,""),u(c,!1),t(m).send(JSON.stringify({message:D})))}function B(){u(s,[],!0),u(y,"");try{sessionStorage.removeItem(a)}catch{}}let _e=null,be=[];async function xe(){try{const D=await navigator.mediaDevices.getUserMedia({audio:!0});be=[],_e=new MediaRecorder(D),_e.ondataavailable=N=>be.push(N.data),_e.onstop=()=>{D.getTracks().forEach(N=>N.stop()),H()},_e.start(),u(v,!0)}catch(D){re("Mikrofon-Zugriff verweigert: "+D.message,!0)}}function Te(){_e==null||_e.stop(),u(v,!1)}async function H(){const D=new Blob(be,{type:"audio/webm"}),N=new FormData;N.append("audio",D,"voice.webm");try{const $=await(await fetch("/api/hermes/transcribe",{method:"POST",headers:localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{},body:N})).json();$.text?(u(l,$.text,!0),E()):re("Konnte Audio nicht verstehen.",!0)}catch(S){re("Transkription fehlgeschlagen: "+S.message,!0)}}async function Q(){const D=[...t(s)].reverse().find(N=>N.role==="hermes");if(D)try{const N=await fetch("/api/hermes/tts",{method:"POST",headers:{"Content-Type":"application/json",...localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{}},body:JSON.stringify({text:D.content})});if(!N.ok)return;const S=await N.blob(),$=URL.createObjectURL(S),Y=new Audio($);Y.onended=()=>URL.revokeObjectURL($),Y.play()}catch{}}async function de(){try{u(p,await De("/api/hermes/status"),!0)}catch{u(p,null)}}async function Ee(){try{const D=await De("/api/hermes/pubkey");u(A,D.pubkey,!0)}catch{u(A,"")}}function Be(D){return{read_file:"📄 Lese Datei",list_directory:"📁 Liste Verzeichnis",run_command:"⚡ Befehl",get_system_status:"📊 System-Status",get_memories:"🧠 Gedächtnis",add_memory:"💾 Speichern",web_search:"🌐 Websuche"}[D]||D}function Qe(){var D;(D=navigator.clipboard)==null||D.writeText(t(A)),re("SSH-Key kopiert")}Va(()=>{T(),de()});var pt=Vv(),P=at(pt),oe=i(r(P),2),ge=r(oe),Xe=r(ge),ce=i(ge,2),Ke=r(ce),ue=i(ce,2),V=r(ue),ne=i(ue,2),me=i(P,2);{var he=D=>{var N=Pv(),S=i(r(N),2),$=r(S),Y=i(r($),2),j=r(Y),X=i($,2);{var ke=te=>{var pe=Ev();f(te,pe)};R(X,te=>{var pe;((pe=t(p))==null?void 0:pe.whisper)==="not_installed"&&te(ke)})}var Ie=i(S,2),M=r(Ie),F=i(r(M),2),ae=r(F),ze=i(M,2);{var je=te=>{var pe=Av(),Ne=r(pe),Ue=r(Ne);z(we=>g(Ue,we),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` -`)]),f(te,pe)};R(ze,te=>{var pe;((pe=t(p))==null?void 0:pe.piper)!=="ready"&&te(je)})}var It=i(Ie,2),xt=r(It),Lt=i(r(xt),2),C=r(Lt),ee=i(xt,2);{var Ve=te=>{var pe=zv(),Ne=i(r(pe),4),Ue=i(r(Ne),2),we=r(Ue);we.textContent=`Start-Service sshd -Set-Service -Name sshd -StartupType Automatic`;var K=i(Ne,2),U=i(r(K),2),se=r(U);se.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var le=i(K,2);{var Pe=ie=>{var ve=Cv(),Ct=i(r(ve),2),Tt=r(Ct),Kt=i(Tt,2),hn=r(Kt),oa=r(hn);z(()=>g(oa,'echo "'+t(A)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),x("click",Tt,Qe),f(ie,ve)},Le=ie=>{var ve=Tv();f(ie,ve)};R(le,ie=>{t(A)?ie(Pe):ie(Le,-1)})}var Me=i(le,4);x("click",Me,()=>{de(),re("Status aktualisiert")}),f(te,pe)};R(ee,te=>{var pe;(pe=t(p))!=null&&pe.ssh_ok||te(Ve)})}z(()=>{var te,pe,Ne,Ue,we,K;Rt(Y,`font-size:11px;${((te=t(p))==null?void 0:te.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),g(j,((pe=t(p))==null?void 0:pe.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),Rt(F,`font-size:11px;${((Ne=t(p))==null?void 0:Ne.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),g(ae,((Ue=t(p))==null?void 0:Ue.piper)==="ready"?"✓ OK":"✗ fehlt"),Rt(Lt,`font-size:11px;${(we=t(p))!=null&&we.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),g(C,(K=t(p))!=null&&K.ssh_ok?"✓ verbunden":"optional")}),f(D,N)};R(me,D=>{t(_)&&D(he)})}var Re=i(me,2),Ze=r(Re),vt=r(Ze);{var ot=D=>{var N=$v(),S=i(r(N),4);nt(S,20,()=>["Was läuft gerade auf dem System?","Zeig mir den Inhalt von /etc/llama-swap/config.yaml","Suche nach den neuesten Qwen3-Modellen"],ct,($,Y)=>{var j=Dv(),X=r(j);z(()=>g(X,Y)),x("click",j,()=>{u(l,Y,!0),E()}),f($,j)}),f(D,N)};R(vt,D=>{t(s).length===0&&D(ot)})}var bt=i(vt,2);nt(bt,16,()=>t(s),D=>D,(D,N)=>{var S=Ua(),$=at(S);{var Y=M=>{var F=Iv(),ae=r(F),ze=r(ae);z(()=>g(ze,N.content)),f(M,F)},j=M=>{var F=Lv(),ae=i(r(F),2),ze=r(ae);z(()=>g(ze,N.content)),f(M,F)},X=M=>{var F=Bv(),ae=r(F),ze=r(ae),je=i(ae,2);{var It=xt=>{var Lt=Ov(),C=r(Lt);z(()=>g(C,N.content)),f(xt,Lt)};R(je,xt=>{N.content&&xt(It)})}z(xt=>g(ze,xt),[()=>Be(N.tool||"")]),f(M,F)},ke=M=>{var F=Rv(),ae=r(F);z(()=>g(ae,N.content)),f(M,F)},Ie=M=>{var F=Fv(),ae=r(F);z(()=>g(ae,`⚠ ${N.content??""}`)),f(M,F)};R($,M=>{N.role==="user"?M(Y):N.role==="hermes"?M(j,1):N.role==="tool"?M(X,2):N.role==="info"?M(ke,3):N.role==="error"&&M(Ie,4)})}f(D,S)});var it=i(bt,2);{var Ye=D=>{var N=Kv();f(D,N)};R(it,D=>{t(o)&&D(Ye)})}var ft=i(Ze,2),We=r(ft),dt=i(We,2),I=r(dt),W=i(dt,2);{var Ae=D=>{var N=Nv();x("click",N,O),f(D,N)},et=D=>{var N=qv();z(S=>N.disabled=S,[()=>!t(l).trim()||!t(m)||t(m).readyState!==1]),x("click",N,E),f(D,N)};R(W,D=>{t(o)||t(c)?D(Ae):D(et,-1)})}var G=i(ft,2);{var $e=D=>{var N=Wv(),S=r(N);x("click",S,B),f(D,N)};R(G,D=>{t(s).length>0&&!t(o)&&D($e)})}z(()=>{var D,N,S,$,Y,j;Rt(ge,`font-size:11px;${((D=t(p))==null?void 0:D.whisper)==="ready"||((N=t(p))==null?void 0:N.whisper)==="installed"?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Xe,`🎙 Whisper: ${((S=t(p))==null?void 0:S.whisper)??"…"??""}`),Rt(ce,`font-size:11px;${($=t(p))!=null&&$.ssh_ok?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Ke,`🔑 SSH: ${(Y=t(p))!=null&&Y.ssh_ok?"verbunden":(j=t(p))!=null&&j.ssh_configured?"Fehler":"nicht eingerichtet"}`),Rt(ue,`padding:4px 12px;font-size:12px;${t(d)?"border-color:var(--accent);color:var(--accent)":""}`),g(V,`🔊 Voice ${t(d)?"an":"aus"}`),Rt(dt,`padding:10px 12px;flex-shrink:0;font-size:18px;line-height:1; - ${t(v)?"border-color:var(--err);color:var(--err)":""}`),Za(dt,"title",t(v)?"Aufnahme stoppen":"Spracheingabe"),g(I,t(v)?"⏹":"🎤")}),x("click",ue,()=>u(d,!t(d))),x("click",ne,()=>{u(_,!t(_)),t(_)&&(de(),Ee())}),x("keydown",We,D=>{D.key==="Enter"&&!D.shiftKey&&(D.preventDefault(),E())}),dn(We,()=>t(l),D=>u(l,D)),x("mousedown",dt,xe),x("mouseup",dt,Te),x("touchstart",dt,xe),x("touchend",dt,Te),f(e,pt),Dn()}qn(["click","keydown","mousedown","mouseup","touchstart","touchend"]);let ts={};function jv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ns(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),as("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const c=["running","ready","loading","starting"],d=(e.models||[]).find(p=>c.includes(p.state));if(s)if(d){const p=(l=d.meta)!=null&&l.ctx?` · ${Math.round(d.meta.ctx/1024)}k ctx`:"",_=d.state==="loading"||d.state==="starting"?' lädt…':"";s.innerHTML=`${d.name}${p}${_}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?Qv():as(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const v={};for(const p of e.models||[])v[p.name]=p.state;for(const[p,_]of Object.entries(v)){const A=ts[p];if(A&&A!==_&&(_==="running"||_==="loading")){jv();break}}ts=v}Uv(e),xi.set(e)}function Uv(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Hv(e){pa.set(e||[])}function Jv(e){Dr.set(e)}function as(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function Qv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const Zv=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>Zv(a),l}async function al(){try{const e=await De("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Vi(){try{ns(await De("/api/status"))}catch{ns(null)}}async function il(){try{Hv(await De("/api/jobs"))}catch{}}function rl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{Jv(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(rl,3e3)},n.onerror=()=>n.close()}var ds;((ds=document.getElementById("logo"))==null?void 0:ds.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Wi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Wi[e.dataset.ic||""]||""});const Yv=[["overview",ud],["models",Ad],["activity",Rd],["server",Hd],["cookbook",zc],["connect",Zc],["news",lv],["guides",fv],["memory",Mv],["hermes",Gv]];for(const[e,n]of Yv){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Mo(n,{target:a})}Uo("overview");const ar=document.getElementById("token");ar&&(ar.value=nl(),ar.addEventListener("change",e=>{qo(e.target.value),Vi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=ci(),ir.addEventListener("change",e=>Vo(e.target.value)));const is=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),rs=document.getElementById("sm-close");is&&rr&&rs&&(is.addEventListener("click",()=>rr.style.display="flex"),rs.addEventListener("click",()=>rr.style.display="none"));function Xv(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Vi);Vi();il();rl();setInterval(Xv,1e3);setInterval(Vi,3e3);setInterval(il,1500);al();setInterval(al,6e4); + justify-content:center;font-size:14px" class="svelte-h40163">H
    denkt nach…`),Vv=b(''),Wv=b(''),Gv=b('
    '),jv=b('

    Hermes

    Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
    ',1);function Uv(e,n){Pn(n,!0);const a="hermes_chat_history";let s=L(Jt((()=>{try{return JSON.parse(sessionStorage.getItem(a)||"[]")}catch{return[]}})())),l=L(""),o=L(!1),v=L(!1),d=L(!1),u=L(!1),p=L(null),_=L(!1),C=L(""),m=L(null),y=L("");Ga(()=>{try{sessionStorage.setItem(a,JSON.stringify(t(s)))}catch{}});function $(){const z=location.protocol==="https:"?"wss:":"ws:",R=localStorage.getItem("mc_token")||"",x=`${z}//${location.host}/api/hermes/chat${R?"?token="+R:""}`,P=new WebSocket(x);P.onmessage=N=>{const j=JSON.parse(N.data);if(j.type==="thinking")c(o,!0);else if(j.type!=="info")if(j.type==="token"){c(o,!1),c(y,t(y)+j.content);const H=t(s)[t(s).length-1];(H==null?void 0:H.role)==="hermes"?c(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)}],!0):c(s,[...t(s),{role:"hermes",content:t(y)}],!0)}else if(j.type==="tool_call"){c(o,!1);const H=j.args||{},fe=Object.values(H).join(" ").slice(0,60);c(s,[...t(s),{role:"tool",content:fe,tool:j.name}],!0)}else if(j.type==="tool_result"){const H=[...t(s)].reverse().find(fe=>fe.role==="tool"&&fe.tool===j.name);H&&(H.content=j.content),c(s,[...t(s)],!0)}else j.type==="error"?(c(o,!1),c(s,[...t(s),{role:"error",content:j.content}],!0)):j.type==="done"&&(c(o,!1),c(v,!1),c(y,""),t(d)&&X())},P.onclose=()=>{c(m,null),setTimeout($,3e3)},P.onerror=()=>P.close(),c(m,P,!0)}function O(){var z;c(v,!0),c(o,!1),t(y)&&c(s,[...t(s).slice(0,-1),{role:"hermes",content:t(y)+" ✋"}],!0),c(y,""),(z=t(m))==null||z.close()}async function M(){const z=t(l).trim();!z||!t(m)||t(m).readyState!==1||(c(s,[...t(s),{role:"user",content:z}],!0),c(l,""),c(y,""),c(v,!1),t(m).send(JSON.stringify({message:z})))}function F(){c(s,[],!0),c(y,"");try{sessionStorage.removeItem(a)}catch{}}let ye=null,xe=[];async function ke(){try{const z=await navigator.mediaDevices.getUserMedia({audio:!0});xe=[],ye=new MediaRecorder(z),ye.ondataavailable=R=>xe.push(R.data),ye.onstop=()=>{z.getTracks().forEach(R=>R.stop()),Z()},ye.start(),c(u,!0)}catch(z){ie("Mikrofon-Zugriff verweigert: "+z.message,!0)}}function Ie(){ye==null||ye.stop(),c(u,!1)}async function Z(){const z=new Blob(xe,{type:"audio/webm"}),R=new FormData;R.append("audio",z,"voice.webm");try{const P=await(await fetch("/api/hermes/transcribe",{method:"POST",headers:localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{},body:R})).json();P.text?(c(l,P.text,!0),M()):ie("Konnte Audio nicht verstehen.",!0)}catch(x){ie("Transkription fehlgeschlagen: "+x.message,!0)}}async function X(){const z=[...t(s)].reverse().find(R=>R.role==="hermes");if(z)try{const R=await fetch("/api/hermes/tts",{method:"POST",headers:{"Content-Type":"application/json",...localStorage.getItem("mc_token")?{"X-MC-Token":localStorage.getItem("mc_token")}:{}},body:JSON.stringify({text:z.content})});if(!R.ok)return;const x=await R.blob(),P=URL.createObjectURL(x),N=new Audio(P);N.onended=()=>URL.revokeObjectURL(P),N.play()}catch{}}async function ve(){try{c(p,await De("/api/hermes/status"),!0)}catch{c(p,null)}}async function ze(){try{const z=await De("/api/hermes/pubkey");c(C,z.pubkey,!0)}catch{c(C,"")}}function Re(z){return{read_file:"📄 Lese Datei",list_directory:"📁 Liste Verzeichnis",run_command:"⚡ Befehl",get_system_status:"📊 System-Status",get_memories:"🧠 Gedächtnis",add_memory:"💾 Speichern",web_search:"🌐 Websuche"}[z]||z}function je(){var z;(z=navigator.clipboard)==null||z.writeText(t(C)),ie("SSH-Key kopiert")}Ga(()=>{$(),ve()});var ot=jv(),I=Xe(ot),re=i(r(I),2),be=r(re),Je=r(be),de=i(be,2),Fe=r(de),ue=i(de,2),at=r(ue),Qe=i(ue,2),it=i(I,2);{var dt=z=>{var R=$v(),x=i(r(R),2),P=r(x),N=i(r(P),2),j=r(N),H=i(P,2);{var fe=ne=>{var he=Cv();f(ne,he)};q(H,ne=>{var he;((he=t(p))==null?void 0:he.whisper)==="not_installed"&&ne(fe)})}var me=i(x,2),w=r(me),K=i(r(w),2),ee=r(K),we=i(w,2);{var Se=ne=>{var he=Tv(),Ne=r(he),We=r(Ne);D(Ee=>g(We,Ee),[()=>["# 1. Piper Binary (Linux x86_64)","mkdir -p /opt/mission-control/piper/voices","cd /tmp && wget -q https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz","tar -xzf piper_linux_x86_64.tar.gz -C /opt/mission-control/piper/ --strip-components=1","","# 2. Deutsche Stimme — Kerstin (weiblich, ~25 MB)","wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx"',"wget -q -O /opt/mission-control/piper/voices/de_DE-kerstin-low.onnx.json \\",' "https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx.json"'].join(` +`)]),f(ne,he)};q(we,ne=>{var he;((he=t(p))==null?void 0:he.piper)!=="ready"&&ne(Se)})}var ft=i(me,2),st=r(ft),Ue=i(r(st),2),T=r(Ue),Q=i(st,2);{var Be=ne=>{var he=Dv(),Ne=i(r(he),4),We=i(r(Ne),2),Ee=r(We);Ee.textContent=`Start-Service sshd +Set-Service -Name sshd -StartupType Automatic`;var W=i(Ne,2),J=i(r(W),2),le=r(J);le.textContent='New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.ssh"';var oe=i(W,2);{var $e=se=>{var ce=zv(),wt=i(r(ce),2),St=r(wt),Bt=i(St,2),hn=r(Bt),da=r(hn);D(()=>g(da,'echo "'+t(C)+'" >> "$env:USERPROFILE\\.ssh\\authorized_keys"')),k("click",St,je),f(se,ce)},Le=se=>{var ce=Pv();f(se,ce)};q(oe,se=>{t(C)?se($e):se(Le,-1)})}var Te=i(oe,4);k("click",Te,()=>{ve(),ie("Status aktualisiert")}),f(ne,he)};q(Q,ne=>{var he;(he=t(p))!=null&&he.ssh_ok||ne(Be)})}D(()=>{var ne,he,Ne,We,Ee,W;$t(N,`font-size:11px;${((ne=t(p))==null?void 0:ne.whisper)!=="not_installed"?"color:#7ee29a":"color:#ff9b95"}`),g(j,((he=t(p))==null?void 0:he.whisper)!=="not_installed"?"✓ OK":"✗ fehlt"),$t(K,`font-size:11px;${((Ne=t(p))==null?void 0:Ne.piper)==="ready"?"color:#7ee29a":"color:#ff9b95"}`),g(ee,((We=t(p))==null?void 0:We.piper)==="ready"?"✓ OK":"✗ fehlt"),$t(Ue,`font-size:11px;${(Ee=t(p))!=null&&Ee.ssh_ok?"color:#7ee29a":"color:var(--mut)"}`),g(T,(W=t(p))!=null&&W.ssh_ok?"✓ verbunden":"optional")}),f(z,R)};q(it,z=>{t(_)&&z(dt)})}var rt=i(it,2),Tt=r(rt),zt=r(Tt);{var Wt=z=>{var R=Lv(),x=i(r(R),4);Ye(x,20,()=>["Was läuft gerade auf dem System?","Zeig mir den Inhalt von /etc/llama-swap/config.yaml","Suche nach den neuesten Qwen3-Modellen"],lt,(P,N)=>{var j=Iv(),H=r(j);D(()=>g(H,N)),k("click",j,()=>{c(l,N,!0),M()}),f(P,j)}),f(z,R)};q(zt,z=>{t(s).length===0&&z(Wt)})}var qt=i(zt,2);Ye(qt,16,()=>t(s),z=>z,(z,R)=>{var x=Ha(),P=Xe(x);{var N=w=>{var K=Ov(),ee=r(K),we=r(ee);D(()=>g(we,R.content)),f(w,K)},j=w=>{var K=Bv(),ee=i(r(K),2),we=r(ee);D(()=>g(we,R.content)),f(w,K)},H=w=>{var K=Fv(),ee=r(K),we=r(ee),Se=i(ee,2);{var ft=st=>{var Ue=Rv(),T=r(Ue);D(()=>g(T,R.content)),f(st,Ue)};q(Se,st=>{R.content&&st(ft)})}D(st=>g(we,st),[()=>Re(R.tool||"")]),f(w,K)},fe=w=>{var K=Kv(),ee=r(K);D(()=>g(ee,R.content)),f(w,K)},me=w=>{var K=Nv(),ee=r(K);D(()=>g(ee,`⚠ ${R.content??""}`)),f(w,K)};q(P,w=>{R.role==="user"?w(N):R.role==="hermes"?w(j,1):R.role==="tool"?w(H,2):R.role==="info"?w(fe,3):R.role==="error"&&w(me,4)})}f(z,x)});var Gt=i(qt,2);{var Lt=z=>{var R=qv();f(z,R)};q(Gt,z=>{t(o)&&z(Lt)})}var Ot=i(Tt,2),U=r(Ot),ae=i(U,2),A=r(ae),B=i(ae,2);{var _e=z=>{var R=Vv();k("click",R,O),f(z,R)},Ce=z=>{var R=Wv();D(x=>R.disabled=x,[()=>!t(l).trim()||!t(m)||t(m).readyState!==1]),k("click",R,M),f(z,R)};q(B,z=>{t(o)||t(v)?z(_e):z(Ce,-1)})}var V=i(Ot,2);{var pe=z=>{var R=Gv(),x=r(R);k("click",x,F),f(z,R)};q(V,z=>{t(s).length>0&&!t(o)&&z(pe)})}D(()=>{var z,R,x,P,N,j;$t(be,`font-size:11px;${((z=t(p))==null?void 0:z.whisper)==="ready"||((R=t(p))==null?void 0:R.whisper)==="installed"?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Je,`🎙 Whisper: ${((x=t(p))==null?void 0:x.whisper)??"…"??""}`),$t(de,`font-size:11px;${(P=t(p))!=null&&P.ssh_ok?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),g(Fe,`🔑 SSH: ${(N=t(p))!=null&&N.ssh_ok?"verbunden":(j=t(p))!=null&&j.ssh_configured?"Fehler":"nicht eingerichtet"}`),$t(ue,`padding:4px 12px;font-size:12px;${t(d)?"border-color:var(--accent);color:var(--accent)":""}`),g(at,`🔊 Voice ${t(d)?"an":"aus"}`),$t(ae,`padding:10px 12px;flex-shrink:0;font-size:18px;line-height:1; + ${t(u)?"border-color:var(--err);color:var(--err)":""}`),Aa(ae,"title",t(u)?"Aufnahme stoppen":"Spracheingabe"),g(A,t(u)?"⏹":"🎤")}),k("click",ue,()=>c(d,!t(d))),k("click",Qe,()=>{c(_,!t(_)),t(_)&&(ve(),ze())}),k("keydown",U,z=>{z.key==="Enter"&&!z.shiftKey&&(z.preventDefault(),M())}),an(U,()=>t(l),z=>c(l,z)),k("mousedown",ae,ke),k("mouseup",ae,Ie),k("touchstart",ae,ke),k("touchend",ae,Ie),f(e,ot),Dn()}qn(["click","keydown","mousedown","mouseup","touchstart","touchend"]);let ts={};function Hv(){const e=document.getElementById("top-active-text");e&&(e.classList.add("swap-flash"),setTimeout(()=>e.classList.remove("swap-flash"),900))}function ns(e){var l;const n=document.getElementById("swdot"),a=document.getElementById("swlabel"),s=document.getElementById("top-active-text");if(!e)n&&(n.className="dot off"),a&&(a.textContent="Backend nicht erreichbar"),s&&(s.textContent="Backend offline"),as("Backend nicht erreichbar – läuft uvicorn?",!1);else{const o=(e.swap_url||"").replace(/^https?:\/\//,"");n&&(n.className="dot "+(e.swap_ok?"on":"off")),a&&(a.textContent=(e.swap_ok?"LLM-Engine: Online – ":"LLM-Engine: Offline – ")+o);const v=["running","ready","loading","starting"],d=(e.models||[]).find(p=>v.includes(p.state));if(s)if(d){const p=(l=d.meta)!=null&&l.ctx?` · ${Math.round(d.meta.ctx/1024)}k ctx`:"",_=d.state==="loading"||d.state==="starting"?' lädt…':"";s.innerHTML=`${d.name}${p}${_}`}else s.innerHTML='Kein Modell im VRAM';e.swap_ok?Yv():as(`LLM-Engine nicht erreichbar unter ${o} – läuft der llama-swap Dienst?`,!0);const u={};for(const p of e.models||[])u[p.name]=p.state;for(const[p,_]of Object.entries(u)){const C=ts[p];if(C&&C!==_&&(_==="running"||_==="loading")){Hv();break}}ts=u}Jv(e),xi.set(e)}function Jv(e){const n=document.getElementById("sec-chip"),a=document.getElementById("sec-chip-tx");!n||!a||(n.classList.toggle("ok",!!(e!=null&&e.secured)),a.textContent=e!=null&&e.secured?"Geschützt · Heimnetz":"Nur im Heimnetz (offen)")}function Qv(e){fa.set(e||[])}function Zv(e){Dr.set(e)}function as(e,n){const a=document.getElementById("alert");a.className="alert"+(n?" warn":""),a.innerHTML=`${e}`,a.style.display="flex"}function Yv(){const e=document.getElementById("alert");e&&(e.style.display="none")}const Xv=e=>{var n;return(n=document.querySelector(`.nav-item[data-view="${e}"]`))==null?void 0:n.click()};function nr(e,n,a,s){const l=document.createElement("span");return l.className="upd-badge"+(n?" "+n:""),l.textContent=e,s&&(l.title=s),l.onclick=()=>Xv(a),l}async function al(){try{const e=await De("/api/updates"),n=document.getElementById("update-badges");if(!n)return;const a=e.apt_cache_age_h,s=a!=null&&a>24,l=a!=null?` · apt-Cache: vor ${a}h`:"";n.innerHTML="",n.appendChild(nr(e.os>0?`OS: ${e.os} Updates`:s?"OS: ?":"OS: aktuell",e.os>0||s?"warn":"ok","server",e.os>0?`${e.os} Pakete${l}`:s?`apt-Cache veraltet (${a}h)`:`Keine Updates${l}`)),n.appendChild(nr(e.engine>0?"Engine: Update":"Engine: aktuell",e.engine>0?"warn":"ok","server")),n.appendChild(nr(e.models>0?`Modelle: ${e.models}`:"Modelle: aktuell",e.models>0?"warn":"ok","news"))}catch{}}async function Wi(){try{ns(await De("/api/status"))}catch{ns(null)}}async function il(){try{Qv(await De("/api/jobs"))}catch{}}function rl(){const e=window.location.protocol==="https:"?"wss:":"ws:",n=new WebSocket(`${e}//${window.location.host}/api/system/stream`);n.onmessage=a=>{try{Zv(JSON.parse(a.data))}catch{}},n.onclose=()=>{setTimeout(rl,3e3)},n.onerror=()=>n.close()}var ds;((ds=document.getElementById("logo"))==null?void 0:ds.innerHTML)!==void 0&&(document.getElementById("logo").innerHTML=Vi.logo);document.querySelectorAll("[data-ic]").forEach(e=>{e.innerHTML=Vi[e.dataset.ic||""]||""});const eu=[["overview",ud],["models",Ad],["activity",Rd],["server",Hd],["cookbook",zc],["connect",Zc],["news",lv],["guides",fv],["memory",Av],["hermes",Uv]];for(const[e,n]of eu){const a=document.querySelector(`.view[data-view="${e}"]`);a&&Mo(n,{target:a})}Uo("overview");const ar=document.getElementById("token");ar&&(ar.value=nl(),ar.addEventListener("change",e=>{qo(e.target.value),Wi()}));const ir=document.getElementById("hf-token");ir&&(ir.value=ci(),ir.addEventListener("change",e=>Wo(e.target.value)));const is=document.getElementById("nav-settings"),rr=document.getElementById("settings-modal"),rs=document.getElementById("sm-close");is&&rr&&rs&&(is.addEventListener("click",()=>rr.style.display="flex"),rs.addEventListener("click",()=>rr.style.display="none"));function tu(){const e=document.getElementById("clock");e&&(e.textContent=new Date().toTimeString().slice(0,5))}document.addEventListener("mc:refresh",Wi);Wi();il();rl();setInterval(tu,1e3);setInterval(Wi,3e3);setInterval(il,1500);al();setInterval(al,6e4);