3 Commits

Author SHA1 Message Date
Hitonabi 18f36f52ce B9-Merge fertig: api.ts-Typ (unit) + frontend/dist gebaut
tsc bestaetigte exakt die vom Werkstatt-Gate angekuendigte Luecke (4x TS2339 unit)
-> ServicesResp.services um unit ergaenzt, Build gruen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 21:24:35 +02:00
Hitonabi 02fac7f55f Merge Werkstatt-Fix B9: ServicesCard nutzt systemd-Unit-Namen (Box-KI, Gesellenprüfung)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 21:23:37 +02:00
Hitonabi ff6c1daf6c Werkstatt: ServicesCard-Neustart-Bug fixieren
Das Frontend schickte den Anzeigenamen (z.B. 'Engine (llama-swap)')
an die Restart-API, die aber systemd-Unit-Namen (z.B. 'llama-swap')
erwartet. Backend gibt jetzt ein 'unit'-Feld mit; Frontend nutzt es
für restart(), disabled und key.
2026-07-02 19:00:26 +00:00
6 changed files with 14 additions and 14 deletions
+6 -6
View File
@@ -59,12 +59,12 @@ def services() -> dict:
gw_url = f"{GATEWAY_URL}/v1"
return {
"services": [
{"name": "Engine (llama-swap)", "url": LLAMA_SWAP_URL, "ok": engine_reachable()},
{"name": "Gateway (integriert)", "url": gw_url, "ok": gateway_reachable()},
{"name": "Hermes-Gateway", "url": HERMES_API_URL, "ok": a["gateway_reachable"]},
{"name": "Hermes-Terminal", "url": a["terminal_url"], "ok": a["terminal_reachable"]},
{"name": "Mem0 (Gedächtnis)", "url": MEM0_SERVICE_URL, "ok": _mem0_reachable()},
{"name": "Voice (STT/TTS)", "url": VOICE_SERVICE_URL, "ok": _voice_reachable()},
{"name": "Engine (llama-swap)", "unit": "llama-swap", "url": LLAMA_SWAP_URL, "ok": engine_reachable()},
{"name": "Gateway (integriert)", "unit": "mission-control-2", "url": gw_url, "ok": gateway_reachable()},
{"name": "Hermes-Gateway", "unit": "hermes-gateway", "url": HERMES_API_URL, "ok": a["gateway_reachable"]},
{"name": "Hermes-Terminal", "unit": "hermes-terminal", "url": a["terminal_url"], "ok": a["terminal_reachable"]},
{"name": "Mem0 (Gedächtnis)", "unit": "mem0-service", "url": MEM0_SERVICE_URL, "ok": _mem0_reachable()},
{"name": "Voice (STT/TTS)", "unit": "voice-service", "url": VOICE_SERVICE_URL, "ok": _voice_reachable()},
],
"links": {
"engine_ui": f"{LLAMA_SWAP_URL}/ui",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -7,7 +7,7 @@
<link rel="manifest" href="/manifest.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Mission Control 2.0</title>
<script type="module" crossorigin src="/assets/index-D08iKoV-.js"></script>
<script type="module" crossorigin src="/assets/index-CxXfDlAe.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-_Rap01H_.css">
</head>
<body>
@@ -43,7 +43,7 @@ export function ServicesCard() {
<div className="flex flex-1 flex-col">
<div className="space-y-1.5">
{svc.services.map((x) => (
<div key={x.name} className="group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5">
<div key={x.unit} className="group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5">
<div className="flex min-w-0 items-center gap-2">
<span className={cn("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40", x.ok ? "bg-emerald-500" : "bg-amber-500")} />
<div className="min-w-0">
@@ -52,11 +52,11 @@ export function ServicesCard() {
</div>
</div>
<button
onClick={() => restart(x.name)} disabled={restarting[x.name]}
onClick={() => restart(x.unit)} disabled={restarting[x.unit]}
className="flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100"
title="Dienst neu starten"
>
<RefreshCw className={cn("h-3.5 w-3.5", restarting[x.name] && "animate-spin")} />
<RefreshCw className={cn("h-3.5 w-3.5", restarting[x.unit] && "animate-spin")} />
</button>
</div>
))}
+1 -1
View File
@@ -280,7 +280,7 @@ export interface SystemStatus {
}
export interface ServicesResp {
services: { name: string; url: string; ok: boolean }[]
services: { name: string; unit: string; url: string; ok: boolean }[]
links: { engine_ui: string; gateway: string; hermes_terminal: string }
}