v6 Phase A: Dashboard & Toolbar

- 'Dein Stack' zeigt echtes Modell (Dateiname) hinter coder/scout/vision.
- Top-News-Karte auf der Uebersicht (neben Stack).
- Toolbar-Update-Badges: /api/updates (OS via apt-Cache + Modell-Upgrades),
  klickbar -> Server bzw. News. compute_upgrades aus cookbook wiederverwendet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-21 14:38:18 +02:00
parent b50323b521
commit d7a3253740
6 changed files with 76 additions and 11 deletions
+19
View File
@@ -72,6 +72,25 @@ def reboot(req: PwdReq):
pass
return {"ok": True, "note": "Reboot getriggert."}
@router.get("/updates")
def updates():
"""Ausstehende Updates für die Toolbar: OS-Pakete (apt-Cache) + Modell-Upgrades."""
import psutil
from routers.cookbook import compute_upgrades
os_count = 0
try:
out = subprocess.run(
["bash", "-c", "apt list --upgradable 2>/dev/null | grep -c upgradable || true"],
capture_output=True, text=True, timeout=10)
os_count = int((out.stdout or "0").strip() or 0)
except Exception: # noqa: BLE001
os_count = 0
try:
models = len(compute_upgrades(psutil.virtual_memory().total / (1024 ** 3)))
except Exception: # noqa: BLE001
models = 0
return {"os": os_count, "models": models}
@router.websocket("/logs/{service}")
async def stream_logs(websocket: WebSocket, service: str):
await websocket.accept()