import { useState } from "react" import { SquareTerminal, ExternalLink, AlertTriangle, RefreshCw } from "lucide-react" import { api } from "@/lib/api" import { useAgentStatus, useQueryClient, qk, invalidate } from "@/lib/queries" import { resolveExternalUrl, cn } from "@/lib/utils" // Konsole = direkter, SSH-artiger Box-Zugriff (ttyd → Login-Shell auf :7682), eingebettet // per iframe — Schwester der Hermes-Terminal-Seite. Login per Box-Passwort (su-Prompt im // Terminal selbst). Die Passwort-Verwaltung liegt in System-Wartung → Einstellungen. export function KonsoleView() { const { data: agent } = useAgentStatus() const qc = useQueryClient() const url = agent?.box_console_url ? resolveExternalUrl(agent.box_console_url) : undefined const ok = agent?.box_console_reachable const [restarting, setRestarting] = useState(false) const [restartMsg, setRestartMsg] = useState("") // Ein-Klick-Reparatur statt SSH-Anweisung: box-console ist ein normaler User-Dienst. async function restartConsole() { setRestarting(true) setRestartMsg("") try { const r = await api<{ ok: boolean; err?: string }>("/api/maintenance/restart", { method: "POST", body: JSON.stringify({ service: "box-console" }), }) setRestartMsg(r.ok ? "Neu gestartet — einen Moment, dann lädt das Terminal." : `Fehlgeschlagen: ${r.err || "Unbekannter Fehler"}`) invalidate(qc, qk.agentStatus, qk.services) } catch (e: any) { setRestartMsg(`Fehlgeschlagen: ${e?.message || e}`) } finally { setRestarting(false) } } return (

Konsole

Direkte Shell auf der Box — wie ein SSH-Fenster, mitten im Browser.

{ok ? "online" : "offline"} {url && ( In neuem Tab )}
{url ? (
{ok === false && (
Konsole nicht erreichbar

Der Terminal-Dienst (box-console) läuft gerade nicht.

{restartMsg &&

{restartMsg}

}
)}