Feat: Hermes-Terminal (ttyd) statt AnythingLLM + AnythingLLM komplett raus
Paket B des Plans. AnythingLLM war nur ein Fallback-Chat zu Hermes; ersetzt durch das echte interaktive Agent-Terminal (`hermes chat`, mit Tools/PC) als eingebettetes Web-Terminal. Box: ttyd (apt) wrappt `hermes chat`; systemd-User-Unit deploy/hermes-terminal.service (LAN-Bind eno1:7681, apt-Default-ttyd-Dienst deaktiviert). In deploy.sh verankert. Backend: config HERMES_TERMINAL_URL statt ANYTHINGLLM_URL/_REPO; agent_status liefert terminal_url/terminal_reachable; maintenance ohne _anythingllm_update; system.py Dienst-Liste zeigt "Hermes-Terminal". Frontend: neue Terminal-Seite (iframe auf ttyd) + Nav-Tab; AgentView/AgentStatusCard/nav/api auf Terminal umgestellt; SystemDrawer toter hermes-dashboard raus, hermes-webui -> hermes-terminal; Guide-Texte aktualisiert. Cleanup: deploy/hermes-webui.service + deploy/lobechat/ entfernt (LobeChat-Migration hinfaellig), HERMES_WEBUI_URL-Env raus. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -135,20 +135,20 @@ export function AgentView() {
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{s?.webui_url && (
|
||||
{s?.terminal_url && (
|
||||
<a
|
||||
href={resolveExternalUrl(s.webui_url)}
|
||||
href={resolveExternalUrl(s.terminal_url)}
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
className={cn(
|
||||
"flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",
|
||||
s.webui_reachable
|
||||
s.terminal_reachable
|
||||
? "bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10"
|
||||
: "border border-border/60 text-muted-foreground bg-background/20"
|
||||
)}
|
||||
>
|
||||
<ExternalLink className="h-4 w-4" />
|
||||
<span>AnythingLLM öffnen</span>
|
||||
<span>Terminal öffnen</span>
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
@@ -170,9 +170,9 @@ export function AgentView() {
|
||||
icon={Bot}
|
||||
/>
|
||||
<Tile
|
||||
label="AnythingLLM"
|
||||
ok={s.webui_reachable}
|
||||
detail="Chat-UI (AnythingLLM)"
|
||||
label="Terminal"
|
||||
ok={s.terminal_reachable}
|
||||
detail="Web-Terminal (hermes chat)"
|
||||
icon={Activity}
|
||||
/>
|
||||
<Tile
|
||||
@@ -213,9 +213,9 @@ export function AgentView() {
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
{/* Connection: WebUI to Gateway */}
|
||||
{/* Connection: Terminal to Gateway */}
|
||||
<path d={getCurvePath(w * 0.15, h * 0.5, w * 0.5, h * 0.5)} stroke="url(#cyan-to-teal)" strokeWidth="1.5" fill="none" />
|
||||
{(hoveredNode === "webui" || s.webui_reachable) && (
|
||||
{(hoveredNode === "terminal" || s.terminal_reachable) && (
|
||||
<path d={getCurvePath(w * 0.15, h * 0.5, w * 0.5, h * 0.5)} stroke="#06b6d4" strokeWidth="2.5" fill="none" className="svg-flow-path" />
|
||||
)}
|
||||
|
||||
@@ -236,14 +236,14 @@ export function AgentView() {
|
||||
<div
|
||||
className="absolute cursor-pointer select-none z-10 w-36 h-9 -translate-y-1/2 -translate-x-1/2 rounded-xl border border-border/60 bg-card/75 backdrop-blur-md flex items-center justify-center gap-1.5 px-2.5 hover:border-primary transition-all text-[10px] font-semibold text-foreground shadow shadow-black/20"
|
||||
style={{ left: "15%", top: "50%" }}
|
||||
onMouseEnter={() => setHoveredNode("webui")}
|
||||
onMouseEnter={() => setHoveredNode("terminal")}
|
||||
onMouseLeave={() => setHoveredNode(null)}
|
||||
onClick={() => s.webui_reachable && window.open(resolveExternalUrl(s.webui_url), "_blank")}
|
||||
title={s.webui_reachable ? "Klicken um AnythingLLM zu öffnen" : "AnythingLLM offline"}
|
||||
onClick={() => s.terminal_reachable && window.open(resolveExternalUrl(s.terminal_url), "_blank")}
|
||||
title={s.terminal_reachable ? "Klicken um das Hermes-Terminal zu öffnen" : "Terminal offline"}
|
||||
>
|
||||
<Activity className={cn("h-3.5 w-3.5", s.webui_reachable ? "text-emerald-400" : "text-amber-500")} />
|
||||
<span>AnythingLLM</span>
|
||||
<span className={cn("w-1.5 h-1.5 rounded-full animate-pulse ml-auto", s.webui_reachable ? "bg-emerald-500" : "bg-amber-500")} />
|
||||
<Activity className={cn("h-3.5 w-3.5", s.terminal_reachable ? "text-emerald-400" : "text-amber-500")} />
|
||||
<span>Terminal</span>
|
||||
<span className={cn("w-1.5 h-1.5 rounded-full animate-pulse ml-auto", s.terminal_reachable ? "bg-emerald-500" : "bg-amber-500")} />
|
||||
</div>
|
||||
|
||||
{/* COLUMN 2: Gateway */}
|
||||
@@ -360,7 +360,7 @@ export function AgentView() {
|
||||
PC Executor verbunden
|
||||
</div>
|
||||
<p className="text-[10px]">
|
||||
Hermes kann jetzt per Telegram oder WebUI Befehle auf TobisNicerPC ausführen. Nutze <code className="text-foreground">pc_shell</code>, <code className="text-foreground">pc_screenshot</code> oder <code className="text-foreground">pc_open</code>.
|
||||
Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze <code className="text-foreground">pc_shell</code>, <code className="text-foreground">pc_screenshot</code> oder <code className="text-foreground">pc_open</code>.
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
@@ -395,7 +395,7 @@ export function AgentView() {
|
||||
<div className="p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1">
|
||||
<div className="text-muted-foreground/60"># Dienste manuell auf der Box prüfen:</div>
|
||||
<div className="text-primary">systemctl --user status hermes-gateway</div>
|
||||
<div className="text-primary">systemctl --user status hermes-webui</div>
|
||||
<div className="text-primary">systemctl --user status hermes-terminal</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
|
||||
Reference in New Issue
Block a user