diff --git a/frontend/src/panels/CookbookPanel.svelte b/frontend/src/panels/CookbookPanel.svelte index 77a8834..c0965ba 100644 --- a/frontend/src/panels/CookbookPanel.svelte +++ b/frontend/src/panels/CookbookPanel.svelte @@ -492,7 +492,7 @@
${n}
${n}
`:""} - + '),Ad=g('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const E=await sr({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(E)try{const Q=await Se("/api/os-update",{method:"POST",body:JSON.stringify({password:E})});ve("OS-Update gestartet."),_(Q.job_id,"OS-Update")}catch(Q){ve(Q.message,!0)}}async function Me(){if(!await hn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const E=await sr({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(E)try{await Se("/api/reboot",{method:"POST",body:JSON.stringify({password:E})}),ve("Reboot ausgelöst — bis gleich.")}catch(Q){ve(Q.message,!0)}}async function Ce(){u(De,"prüfe…");try{const E=await Se("/api/integration/test");u(De,E.ok?`✓ Engine antwortet — ${E.models.length} Modell(e): ${E.models.join(", ")}`:`✗ keine Verbindung: ${E.error}`,!0),u(ie,E.ok,!0)}catch(E){u(De,"✗ "+E.message),u(ie,!1)}}let De=B(""),ie=B(!1);const te=V(()=>{var E;return((E=t(a))==null?void 0:E.models)||[]}),_e=["running","ready","loading","starting"],Ie=V(()=>t(te).find(E=>_e.includes(E.state)));function He(E){if(!E||E.state!=="running")return null;if(typeof E.progress=="number")return Math.min(100,E.progress);const ce=((E.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return ce?Math.min(100,parseFloat(ce[1])):null}var Ne=ec(),ot=i(tt(Ne),2),P=r(ot),ye=i(r(P),2),qe=r(ye),Qe=i(P,4),q=r(Qe),oe=i(r(q)),Le=r(oe),Ge=i(q,2),je=i(r(Ge),2),Oe=r(je),dt=i(Ge,2),Xe=i(r(dt),2),pt=r(Xe),ct=i(Qe,2),mt=r(ct),Ct=i(mt,2);{var Tt=E=>{var Q=jd(),ce=r(Q);z(()=>{St(Q,`color:${t(ie)?"#7ee29a":"#ff9b95"}`),h(ce,t(De))}),p(E,Q)};O(Ct,E=>{t(De)&&E(Tt)})}var Mt=i(ot,2),Ft=i(r(Mt),4),zt=i(Ft,2),Et=i(zt,2),D=i(Et,2),J=i(D,2),I=i(Mt,2),W=i(r(I),4),M=i(W,2),ee=i(I,2);{var xe=E=>{const Q=V(()=>t(T)),ce=V(()=>t(Q).state==="done"),Ee=V(()=>t(Q).state==="failed"),Z=V(()=>t(Q).state==="canceled"),le=V(()=>t(ce)||t(Ee)||t(Z)),Ae=V(()=>He(t(Q)));var ze=Xd(),w=r(ze),j=i(r(w),2);{var pe=ue=>{var ge=Ud();S("click",ge,async()=>{await hn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Se(`/api/jobs/${t(Q).id}/cancel`,{method:"POST"})}),p(ue,ge)};O(j,ue=>{t(le)||ue(pe)})}var U=i(j,2),we=r(U);{var Be=ue=>{var ge=Hd();p(ue,ge)},Fe=ue=>{var ge=Jd();p(ue,ge)},$e=ue=>{var ge=Qd();p(ue,ge)},H=ue=>{var ge=Zd();p(ue,ge)};O(we,ue=>{t(ce)?ue(Be):t(Ee)?ue(Fe,1):t(Z)?ue($e,2):ue(H,-1)})}var Y=i(w,2),X=r(Y),K=i(Y,2);{var ae=ue=>{var ge=Yd(),kt=r(ge);z(()=>St(kt,`width:${t(Ae)??""}%`)),p(ue,ge)};O(K,ue=>{t(Ae)!=null&&!t(le)&&ue(ae)})}var fe=i(K,2),he=r(fe);z(ue=>{h(X,`${t(f)??""}${t(le)?t(ce)?" — erfolgreich.":t(Z)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(he,ue)},[()=>(t(Q).log||[]).join(`
-`)]),p(E,ze)};O(ee,E=>{t(T)&&E(xe)})}var Te=i(ee,2),C=r(Te),F=i(r(C),2),re=r(F);re.value=re.__value="llama-swap";var se=i(re);se.value=se.__value="mission-control";var ne=i(se);ne.value=ne.__value="system";var ke=i(C,4),de=r(ke);Uo(ke,E=>v=E,()=>v),z(E=>{var Q,ce,Ee;St(ye,`margin-left:auto;${(Q=t(a))!=null&&Q.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"}`),h(qe,(ce=t(a))!=null&&ce.swap_ok?"● erreichbar":"● offline"),h(Le,(((Ee=t(a))==null?void 0:Ee.swap_url)||"—")+"/v1"),h(Oe,t(Ie)?t(Ie).name+` (${t(Ie).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(pt,E),h(de,t(o))},[()=>t(te).filter(E=>!E.incomplete).length||"keine"]),S("click",mt,Ce),S("click",Ft,()=>$("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",zt,()=>$("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",Et,R),S("click",D,A),S("click",J,N),S("click",W,Pe),S("click",M,Me),S("change",F,x),Jn(F,()=>t(d),E=>u(d,E)),p(e,Ne),In()}Gn(["click","change"]);var nc=g('http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.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:
local). Jan AI fragt danach beim Einrichten.Datei anlegen oder öffnen: ~/.continue/config.json
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.
Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:
Settings → Models → Custom Endpoint → + hinzufügen:
local). Danach das Modell in der Model-Liste auswählen.Ö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.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):
Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc
"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.
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
local).Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
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.
pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.
pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.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.
'),Ed=g('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const E=await rr({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(E)try{const J=await Se("/api/os-update",{method:"POST",body:JSON.stringify({password:E})});ve("OS-Update gestartet."),_(J.job_id,"OS-Update")}catch(J){ve(J.message,!0)}}async function Ee(){if(!await hn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const E=await rr({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(E)try{await Se("/api/reboot",{method:"POST",body:JSON.stringify({password:E})}),ve("Reboot ausgelöst — bis gleich.")}catch(J){ve(J.message,!0)}}async function Ce(){u(Ie,"prüfe…");try{const E=await Se("/api/integration/test");u(Ie,E.ok?`✓ Engine antwortet — ${E.models.length} Modell(e): ${E.models.join(", ")}`:`✗ keine Verbindung: ${E.error}`,!0),u(re,E.ok,!0)}catch(E){u(Ie,"✗ "+E.message),u(re,!1)}}let Ie=R(""),re=R(!1);const ne=V(()=>{var E;return((E=t(a))==null?void 0:E.models)||[]}),_e=["running","ready","loading","starting"],Le=V(()=>t(ne).find(E=>_e.includes(E.state)));function He(E){if(!E||E.state!=="running")return null;if(typeof E.progress=="number")return Math.min(100,E.progress);const de=((E.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return de?Math.min(100,parseFloat(de[1])):null}var Ne=Xd(),ot=i(tt(Ne),2),I=r(ot),ye=i(r(I),2),qe=r(ye),Qe=i(I,4),G=r(Qe),oe=i(r(G)),Oe=r(oe),Ge=i(G,2),je=i(r(Ge),2),Be=r(je),dt=i(Ge,2),Xe=i(r(dt),2),pt=r(Xe),ct=i(Qe,2),mt=r(ct),Ct=i(mt,2);{var Tt=E=>{var J=Wd(),de=r(J);$(()=>{St(J,`color:${t(re)?"#7ee29a":"#ff9b95"}`),h(de,t(Ie))}),p(E,J)};B(Ct,E=>{t(Ie)&&E(Tt)})}var Mt=i(ot,2),Ft=i(r(Mt),4),zt=i(Ft,2),Et=i(zt,2),L=i(Et,2),H=i(L,2),O=i(Mt,2),W=i(r(O),4),M=i(W,2),ee=i(O,2);{var xe=E=>{const J=V(()=>t(C)),de=V(()=>t(J).state==="done"),Me=V(()=>t(J).state==="failed"),Q=V(()=>t(J).state==="canceled"),le=V(()=>t(de)||t(Me)||t(Q)),Ae=V(()=>He(t(J)));var $e=Yd(),x=r($e),Z=i(r(x),2);{var he=ue=>{var ge=jd();S("click",ge,async()=>{await hn({title:t(f)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Se(`/api/jobs/${t(J).id}/cancel`,{method:"POST"})}),p(ue,ge)};B(Z,ue=>{t(le)||ue(he)})}var j=i(Z,2),we=r(j);{var Pe=ue=>{var ge=Ud();p(ue,ge)},Fe=ue=>{var ge=Hd();p(ue,ge)},Te=ue=>{var ge=Jd();p(ue,ge)},U=ue=>{var ge=Qd();p(ue,ge)};B(we,ue=>{t(de)?ue(Pe):t(Me)?ue(Fe,1):t(Q)?ue(Te,2):ue(U,-1)})}var Y=i(x,2),X=r(Y),q=i(Y,2);{var te=ue=>{var ge=Zd(),kt=r(ge);$(()=>St(kt,`width:${t(Ae)??""}%`)),p(ue,ge)};B(q,ue=>{t(Ae)!=null&&!t(le)&&ue(te)})}var be=i(q,2),fe=r(be);$(ue=>{h(X,`${t(f)??""}${t(le)?t(de)?" — erfolgreich.":t(Q)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),h(fe,ue)},[()=>(t(J).log||[]).join(`
+`)]),p(E,$e)};B(ee,E=>{t(C)&&E(xe)})}var ze=i(ee,2),T=r(ze),K=i(r(T),2),se=r(K);se.value=se.__value="llama-swap";var ie=i(se);ie.value=ie.__value="mission-control";var ae=i(ie);ae.value=ae.__value="system";var ke=i(T,4),ce=r(ke);jo(ke,E=>v=E,()=>v),$(E=>{var J,de,Me;St(ye,`margin-left:auto;${(J=t(a))!=null&&J.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"}`),h(qe,(de=t(a))!=null&&de.swap_ok?"● erreichbar":"● offline"),h(Oe,(((Me=t(a))==null?void 0:Me.swap_url)||"—")+"/v1"),h(Be,t(Le)?t(Le).name+` (${t(Le).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),h(pt,E),h(ce,t(o))},[()=>t(ne).filter(E=>!E.incomplete).length||"keine"]),S("click",mt,Ce),S("click",Ft,()=>D("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),S("click",zt,()=>D("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),S("click",Et,F),S("click",L,A),S("click",H,N),S("click",W,De),S("click",M,Ee),S("change",K,y),Hn(K,()=>t(d),E=>u(d,E)),p(e,Ne),In()}qn(["click","change"]);var tc=g('http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.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:
local). Jan AI fragt danach beim Einrichten.Datei anlegen oder öffnen: ~/.continue/config.json
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.
Antigravity (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:
Settings → Models → Custom Endpoint → + hinzufügen:
local). Danach das Modell in der Model-Liste auswählen.Ö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.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Datei anlegen oder öffnen (OpenCode Desktop nutzt .jsonc — JSON mit Kommentaren):
Windows: %USERPROFILE%\\.config\\opencode\\opencode.jsonc
"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.
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
local).Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
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.
pip install mcp httpx ausführen — danach mcp_memory.py aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).Block in ~/.config/opencode/opencode.json unter "mcpServers" einfügen.
pip install mcp httpx — und Pfad zu mcp_memory.py im Snippet anpassen.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.
pip install faster-whisper ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0HERMES_WINDOWS_HOST=192.168.178.XXXpip install faster-whisper ssh-keygen -t ed25519 -C "hermes-agent@bosgame" -f ~/.ssh/id_ed25519_hermes_agent -N ""Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0HERMES_WINDOWS_HOST=192.168.178.XXX