diff --git a/frontend/src/panels/HermesPanel.svelte b/frontend/src/panels/HermesPanel.svelte index 2636469..3a8f42e 100644 --- a/frontend/src/panels/HermesPanel.svelte +++ b/frontend/src/panels/HermesPanel.svelte @@ -59,13 +59,10 @@ }) - -
-
-

Hermes

-
Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
-
-
+ +
+

Hermes

+
+ +
{#if status?.hermes === 'ready'} {:else}
diff --git a/static/dist/main.js b/static/dist/main.js index 974bdde..e3685ab 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -657,8 +657,8 @@ Projektsprache: Deutsch. Bosgame M5 läuft mit Ubuntu 26.04. ...`);var z=i(E,2),U=r(z),ge=i(r(U),2),R=r(ge);R.value=R.__value="user";var ne=i(R);ne.value=ne.__value="instruction";var be=i(ne);be.value=be.__value="stable";var Pe=i(be);Pe.value=Pe.__value="versioned";var A=i(Pe);A.value=A.__value="ephemeral";var B=i(U,2),H=i(r(B),2),de=r(H);de.value=de.__value="import";var re=i(de);re.value=re.__value="claude";var q=i(re);q.value=q.__value="gemini";var G=i(q);G.value=G.__value="chatgpt";var x=i(G);x.value=x.__value="manual";var F=i(z,2);{var te=Xe=>{var C=gv(),J=r(C);P(()=>h(J,`${t(S).length??""} Eintrag/Einträge erkannt`)),f(Xe,C)};K(F,Xe=>{t(S).length>0&&Xe(te)})}var we=i(F,2),ye=r(we),ct=r(ye),mt=i(ye,2);P(()=>{ye.disabled=t(S).length===0||t(I),h(ct,t(I)?"Importiere…":`${t(S).length} Einträge speichern`)}),dn(E,()=>t(b),Xe=>u(b,Xe)),Jn(ge,()=>t(y),Xe=>u(y,Xe)),Jn(H,()=>t($),Xe=>u($,Xe)),M("click",ye,Ke),M("click",mt,()=>{u(T,!1),u(b,"")}),f(W,oe)};K(ze,W=>{t(T)&&W(ve)})}var Ze=i(ze,2);{var Ue=W=>{var oe=bv(),E=i(r(oe),4),z=i(E,4),U=r(z);U.value=U.__value="user";var ge=i(U);ge.value=ge.__value="instruction";var R=i(ge);R.value=R.__value="stable";var ne=i(R);ne.value=ne.__value="versioned";var be=i(ne);be.value=be.__value="ephemeral";var Pe=i(z,2),A=r(Pe),B=i(A,2);P(H=>A.disabled=H,[()=>!t(d).trim()]),M("keydown",E,H=>{H.key==="Enter"&&(H.ctrlKey||H.metaKey)&&Q()}),dn(E,()=>t(d),H=>u(d,H)),Jn(z,()=>t(c),H=>u(c,H)),M("click",A,Q),M("click",B,()=>{u(o,!1),u(d,"")}),f(W,oe)};K(Ze,W=>{t(o)&&W(Ue)})}var it=i(Ze,2),He=r(it),Ye=i(r(He),2);et(Ye,17,()=>[["all","Alle","",t(a).length],["user","Über mich","#a78bfa",xe("user")],["instruction","Verhalten","#fb923c",xe("instruction")],["stable","Stabil","var(--accent)",xe("stable")],["versioned","Versioniert","#f59e0b",xe("versioned")],["ephemeral","Temporär","var(--mut)",xe("ephemeral")]],nt,(W,oe)=>{var E=N(()=>Hn(t(oe),4));let z=()=>t(E)[0],U=()=>t(E)[1],ge=()=>t(E)[2],R=()=>t(E)[3];var ne=_v(),be=r(ne),Pe=i(be),A=r(Pe);P(()=>{zt(ne,`cursor:pointer;${t(l)===z()?`background:rgba(45,212,191,.12);border-color:${ge()||"var(--accent)"};color:${ge()||"var(--accent)"}`:""}`),h(be,`${U()??""} `),h(A,R())}),M("click",ne,()=>u(l,z(),!0)),M("keydown",ne,B=>B.key==="Enter"&&u(l,z(),!0)),f(W,ne)});var gt=i(it,2);{var Pt=W=>{var oe=yv();f(W,oe)},Dt=W=>{var oe=xv(),E=r(oe),z=r(E),U=r(z),ge=i(z,2),R=r(ge),ne=i(ge,2);{var be=Pe=>{var A=kv();M("click",A,()=>u(o,!0)),f(Pe,A)};K(ne,Pe=>{t(a).length===0&&Pe(be)})}P(()=>{h(U,t(a).length===0?"Noch keine Einträge":"Keine Treffer"),h(R,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(W,oe)},Rt=W=>{var oe=Ev();et(oe,23,()=>t(O),E=>E.id,(E,z,U)=>{var ge=Mv(),R=r(ge);{var ne=Pe=>{var A=wv(),B=at(A),H=i(B,2),de=r(H);de.value=de.__value="user";var re=i(de);re.value=re.__value="instruction";var q=i(re);q.value=q.__value="stable";var G=i(q);G.value=G.__value="versioned";var x=i(G);x.value=x.__value="ephemeral";var F=i(H,2),te=r(F),we=i(te,2);dn(B,()=>t(p),ye=>u(p,ye)),Jn(H,()=>t(_),ye=>u(_,ye)),M("click",te,()=>Z(t(z))),M("click",we,()=>u(v,null)),f(Pe,A)},be=Pe=>{var A=Sv(),B=r(A),H=r(B),de=r(H),re=i(H,2),q=r(re),G=r(q),x=i(q,2),F=r(x),te=i(x,2),we=r(te),ye=i(B,2),ct=r(ye),mt=i(ct,2);P(Xe=>{var C,J,Ie;h(de,t(z).content),zt(q,`border-color:${(((C=Te[t(z).category])==null?void 0:C.color)||"var(--mut)")??""};color:${(((J=Te[t(z).category])==null?void 0:J.color)||"var(--mut)")??""}`),h(G,((Ie=Te[t(z).category])==null?void 0:Ie.label)||t(z).category),h(F,t(z).source),h(we,Xe)},[()=>ke(t(z).updated_at)]),M("click",ct,()=>Ce(t(z))),M("click",mt,()=>pe(t(z))),f(Pe,A)};K(R,Pe=>{t(v)===t(z).id?Pe(ne):Pe(be,-1)})}P(()=>zt(ge,`padding:14px 16px;${t(U){t(s)?W(Pt):t(O).length===0?W(Dt,1):W(Rt,-1)})}var Ft=i(gt,2),At=i(r(Ft),2),Ct=i(r(At),3);P(()=>{h(V,t(T)?"Abbrechen":"⇩ Import"),h(ae,t(o)?"Abbrechen":"+ Eintrag")}),M("click",ie,()=>{u(T,!t(T)),u(o,!1),u(b,"")}),M("click",fe,()=>{u(o,!t(o)),u(T,!1),u(d,"")}),M("click",Ct,W=>{var oe;W.preventDefault(),(oe=document.querySelector(".nav-item[data-view='connect']"))==null||oe.click()}),f(e,je),Pn()}qn(["click","keydown"]);var ts=m(' '),Tv=m(`
Keine geplanten Jobs. Hermes kann selbst welche anlegen — sag ihm z. B. „Erinnere mich jeden Morgen um 9 Uhr an die offenen Modell-Upgrades".
`),zv=m(' '),Pv=m(`
`),$v=m('
'),Dv=m('
Keine Skills geladen (oder Agent offline).
'),Iv=m(' '),Lv=m(' '),Ov=m('
'),Bv=m('
'),Rv=m('

Agent-Cockpit

Status
Hermes-Gateway-Dienst (:8642) auf dem Bosgame
Geplante Aufgaben
Skills
'),Fv=m('
pip install faster-whisper
'),Kv=m('
'),Nv=m('
4. Bosgame-Key eintragen (in Windows PowerShell):
'),qv=m('
SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
'),Gv=m('
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
'),Vv=m('

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
'),Wv=m(''),jv=m(`
Hermes-Agent offline
Der Hermes-Gateway (:8642) bzw. das Dashboard (:9119) ist nicht erreichbar. - Status im Cockpit prüfen oder den Dienst neu starten.
`),Uv=m('

Hermes

Dein lokaler KI-Assistent — kennt den Bosgame, lernt mit.
',1);function Hv(e,n){zn(n,!0);let a=L(null),s=L(!1),l=L(!1),o=L(!1),d=L(null),c=L(Wt([])),v=L(Wt([])),p=L("");async function _(){try{u(a,await Ee("/api/hermes/status"),!0)}catch{u(a,null)}}async function T(){try{const V=await Ee("/api/hermes/pubkey");u(p,V.pubkey,!0)}catch{u(p,"")}}async function b(){u(o,!0);try{const[V,fe,ae]=await Promise.all([Ee("/api/hermes/agent"),Ee("/api/hermes/cron"),Ee("/api/hermes/skills")]);u(d,V,!0),u(c,fe.jobs||[],!0),u(v,ae.skills||[],!0)}catch{u(d,null)}u(o,!1)}let y=N(()=>[...t(v)].sort((V,fe)=>(fe.use_count||0)-(V.use_count||0)||(V.name||"").localeCompare(fe.name||""))),$=N(()=>t(v).filter(V=>(V.status||"").includes("enabled")).length);function I(){var V;(V=navigator.clipboard)==null||V.writeText(t(p)),se("SSH-Key kopiert")}bi(()=>{_()});var S=Uv(),O=at(S),Te=i(r(O),2),ke=r(Te),xe=r(ke),De=i(ke,2),Q=i(De,2),Z=i(O,2);{var pe=V=>{var fe=Rv(),ae=r(fe),ze=i(r(ae),2),ve=r(ze),Ze=i(ae,2),Ue=r(Ze),it=i(r(Ue),2),He=r(it),Ye=r(He),gt=i(He,2),Pt=r(gt),Dt=i(gt,2);{var Rt=q=>{var G=ts(),x=r(G);P(()=>h(x,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),f(q,G)};K(Dt,q=>{var G;((G=t(d))==null?void 0:G.heartbeat_age_s)!=null&&q(Rt)})}var Ft=i(Dt,2);{var At=q=>{var G=ts(),x=r(G);P(F=>{Ea(G,"title",t(d).version),h(x,F)},[()=>t(d).version.split(" · ")[0]]),f(q,G)};K(Ft,q=>{var G;(G=t(d))!=null&&G.version&&q(At)})}var Ct=i(Ze,2),W=r(Ct),oe=r(W),E=i(r(oe)),z=r(E),U=i(W,2);{var ge=q=>{var G=Tv();f(q,G)},R=q=>{var G=$v();et(G,21,()=>t(c),nt,(x,F)=>{var te=Pv();et(te,21,()=>Object.entries(t(F)),nt,(we,ye)=>{var ct=N(()=>Hn(t(ye),2));let mt=()=>t(ct)[0],Xe=()=>t(ct)[1];var C=ja(),J=at(C);{var Ie=ue=>{var Se=zv(),Oe=r(Se),Je=r(Oe),Re=i(Oe);P(()=>{h(Je,`${mt()??""}:`),h(Re,` ${Xe()??""}`)}),f(ue,Se)};K(J,ue=>{Xe()&&ue(Ie)})}f(we,C)}),f(x,te)}),f(q,G)};K(U,q=>{t(c).length===0?q(ge):q(R,-1)})}var ne=i(Ct,2),be=r(ne),Pe=r(be),A=i(r(Pe)),B=r(A),H=i(be,2);{var de=q=>{var G=Dv();f(q,G)},re=q=>{var G=Bv();et(G,21,()=>t(y),nt,(x,F)=>{var te=Ov(),we=r(te),ye=i(we,2),ct=r(ye),mt=i(ye,2);{var Xe=Se=>{var Oe=Iv(),Je=r(Oe);P(()=>h(Je,t(F).category)),f(Se,Oe)};K(mt,Se=>{t(F).category&&Se(Xe)})}var C=i(mt,4);{var J=Se=>{var Oe=Lv(),Je=r(Oe);P(()=>h(Je,`${t(F).use_count??""}× genutzt`)),f(Se,Oe)};K(C,Se=>{t(F).use_count>0&&Se(J)})}var Ie=i(C,2),ue=r(Ie);P((Se,Oe)=>{zt(te,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; + padding:6px 8px;background:rgba(255,255,255,.02);border-radius:6px">
`),$v=m('
'),Dv=m('
Keine Skills geladen (oder Agent offline).
'),Iv=m(' '),Lv=m(' '),Ov=m('
'),Bv=m('
'),Rv=m('

Agent-Cockpit

Status
Hermes-Gateway-Dienst (:8642) auf dem Bosgame
Geplante Aufgaben
Skills
'),Fv=m('
pip install faster-whisper
'),Kv=m('
'),Nv=m('
4. Bosgame-Key eintragen (in Windows PowerShell):
'),qv=m('
SSH-Key nicht gefunden — bitte auf dem Bosgame generieren: ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""
'),Gv=m('
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
'),Vv=m('

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
'),Wv=m(''),jv=m(`
Hermes-Agent offline
Der Hermes-Gateway (:8642) bzw. das Dashboard (:9119) ist nicht erreichbar. + Status im Cockpit prüfen oder den Dienst neu starten.
`),Uv=m('

Hermes

',1);function Hv(e,n){zn(n,!0);let a=L(null),s=L(!1),l=L(!1),o=L(!1),d=L(null),c=L(Wt([])),v=L(Wt([])),p=L("");async function _(){try{u(a,await Ee("/api/hermes/status"),!0)}catch{u(a,null)}}async function T(){try{const V=await Ee("/api/hermes/pubkey");u(p,V.pubkey,!0)}catch{u(p,"")}}async function b(){u(o,!0);try{const[V,fe,ae]=await Promise.all([Ee("/api/hermes/agent"),Ee("/api/hermes/cron"),Ee("/api/hermes/skills")]);u(d,V,!0),u(c,fe.jobs||[],!0),u(v,ae.skills||[],!0)}catch{u(d,null)}u(o,!1)}let y=N(()=>[...t(v)].sort((V,fe)=>(fe.use_count||0)-(V.use_count||0)||(V.name||"").localeCompare(fe.name||""))),$=N(()=>t(v).filter(V=>(V.status||"").includes("enabled")).length);function I(){var V;(V=navigator.clipboard)==null||V.writeText(t(p)),se("SSH-Key kopiert")}bi(()=>{_()});var S=Uv(),O=at(S),Te=i(r(O),2),ke=r(Te),xe=r(ke),De=i(ke,2),Q=i(De,2),Z=i(O,2);{var pe=V=>{var fe=Rv(),ae=r(fe),ze=i(r(ae),2),ve=r(ze),Ze=i(ae,2),Ue=r(Ze),it=i(r(Ue),2),He=r(it),Ye=r(He),gt=i(He,2),Pt=r(gt),Dt=i(gt,2);{var Rt=q=>{var G=ts(),x=r(G);P(()=>h(x,`Ticker vor ${t(d).heartbeat_age_s??""}s`)),f(q,G)};K(Dt,q=>{var G;((G=t(d))==null?void 0:G.heartbeat_age_s)!=null&&q(Rt)})}var Ft=i(Dt,2);{var At=q=>{var G=ts(),x=r(G);P(F=>{Ea(G,"title",t(d).version),h(x,F)},[()=>t(d).version.split(" · ")[0]]),f(q,G)};K(Ft,q=>{var G;(G=t(d))!=null&&G.version&&q(At)})}var Ct=i(Ze,2),W=r(Ct),oe=r(W),E=i(r(oe)),z=r(E),U=i(W,2);{var ge=q=>{var G=Tv();f(q,G)},R=q=>{var G=$v();et(G,21,()=>t(c),nt,(x,F)=>{var te=Pv();et(te,21,()=>Object.entries(t(F)),nt,(we,ye)=>{var ct=N(()=>Hn(t(ye),2));let mt=()=>t(ct)[0],Xe=()=>t(ct)[1];var C=ja(),J=at(C);{var Ie=ue=>{var Se=zv(),Oe=r(Se),Je=r(Oe),Re=i(Oe);P(()=>{h(Je,`${mt()??""}:`),h(Re,` ${Xe()??""}`)}),f(ue,Se)};K(J,ue=>{Xe()&&ue(Ie)})}f(we,C)}),f(x,te)}),f(q,G)};K(U,q=>{t(c).length===0?q(ge):q(R,-1)})}var ne=i(Ct,2),be=r(ne),Pe=r(be),A=i(r(Pe)),B=r(A),H=i(be,2);{var de=q=>{var G=Dv();f(q,G)},re=q=>{var G=Bv();et(G,21,()=>t(y),nt,(x,F)=>{var te=Ov(),we=r(te),ye=i(we,2),ct=r(ye),mt=i(ye,2);{var Xe=Se=>{var Oe=Iv(),Je=r(Oe);P(()=>h(Je,t(F).category)),f(Se,Oe)};K(mt,Se=>{t(F).category&&Se(Xe)})}var C=i(mt,4);{var J=Se=>{var Oe=Lv(),Je=r(Oe);P(()=>h(Je,`${t(F).use_count??""}× genutzt`)),f(Se,Oe)};K(C,Se=>{t(F).use_count>0&&Se(J)})}var Ie=i(C,2),ue=r(Ie);P((Se,Oe)=>{zt(te,`display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 8px; border-radius:6px;${Se??""}`),zt(we,`width:7px;height:7px;border-radius:50%;flex-shrink:0; background:${Oe??""}`),h(ct,t(F).name),h(ue,t(F).source)},[()=>(t(F).status||"").includes("enabled")?"":"opacity:.45",()=>(t(F).status||"").includes("enabled")?"var(--accent)":"var(--mut)"]),f(x,te)}),f(q,G)};K(H,q=>{t(v).length===0?q(de):q(re,-1)})}P(()=>{var q,G,x,F;h(ve,t(o)?"…":"↻ Aktualisieren"),zt(He,`font-size:11px;${((q=t(d))==null?void 0:q.gateway_state)==="running"?"color:#7ee29a;border-color:rgba(126,226,154,.4)":"color:#ff9b95;border-color:rgba(255,155,149,.4)"}`),h(Ye,`● ${((G=t(d))==null?void 0:G.gateway_state)??"offline"??""}`),zt(gt,`font-size:11px;${(x=t(d))!=null&&x.cron_running?"color:var(--accent);border-color:var(--accent)":"color:var(--mut)"}`),h(Pt,`⏱ Scheduler ${(F=t(d))!=null&&F.cron_running?"läuft":"inaktiv"}`),h(z,`(${t(c).length??""})`),h(B,`(${t($)??""} aktiv von ${t(v).length??""})`)}),M("click",ze,b),f(V,fe)};K(Z,V=>{t(l)&&V(pe)})}var Ce=i(Z,2);{var Ke=V=>{var fe=Vv(),ae=i(r(fe),2),ze=r(ae),ve=i(r(ze),2),Ze=r(ve),Ue=i(ze,2);{var it=z=>{var U=Fv();f(z,U)};K(Ue,z=>{var U;((U=t(a))==null?void 0:U.whisper)==="not_installed"&&z(it)})}var He=i(ae,2),Ye=r(He),gt=i(r(Ye),2),Pt=r(gt),Dt=i(Ye,2);{var Rt=z=>{var U=Kv(),ge=r(U),R=r(ge);P(ne=>h(R,ne),[()=>["# 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(z,U)};K(Dt,z=>{var U;((U=t(a))==null?void 0:U.piper)!=="ready"&&z(Rt)})}var Ft=i(He,2),At=r(Ft),Ct=i(r(At),2),W=r(Ct),oe=i(At,2);{var E=z=>{var U=Gv(),ge=i(r(U),4),R=i(r(ge),2),ne=r(R);ne.textContent=`Start-Service sshd