// overview.js — Dashboard: Quick Actions, Modelle & Recent Jobs import { $, esc, icon } from "../core/ui.js"; let S = null; // letzter Status let J = []; // letzte Job-Liste let SYS = null; const RUNNING = new Set(["running", "ready", "loading", "starting"]); function counts() { const models = S?.models || []; return { total: models.length, running: models.filter(m => RUNNING.has(m.state)).length, }; } function renderHero() { $("#hero").innerHTML = `
Dashboard

Mission Control

Steuerzentrale für deinen lokalen llama-swap-Stack. Hier verwaltest du Modelle, Downloads und Server-Wartung.

`; } function renderQuickActions() { // 3 Kacheln (Cookbook, Server-Status, Aktivität/Guides) $("#ov-quick").innerHTML = `

Modell finden

${icon("book")}

Durchsuche HuggingFace nach neuen Modellen im Cookbook.

Live Metriken

${icon("pulse")}

${SYS ? `System läuft (RAM: ${SYS.ram.percent.toFixed(0)}%, CPU: ${SYS.cpu.percent.toFixed(0)}%)` : 'Lade Metriken...'}

Wartung

${icon("server")}

Server neustarten, VRAM leeren oder Engine aktualisieren.

`; } function modelRow(m) { const on = RUNNING.has(m.state); const dot = m.state === "loading" || m.state === "starting" ? "load" : on ? "on" : ""; const state = on ? (m.state === "loading" ? "lädt…" : "geladen") : "bereit"; let caps = ""; if (m.meta && m.meta.caps) { caps = m.meta.caps.map(c => { if (c === "Code") return `{ }`; if (c === "Bild") return `👁`; return ""; }).join(""); } const filename = m.meta?.filename ? `
${esc(m.meta.filename)}
` : ''; return `
${esc(m.name)}${caps}
${filename}
${state}
`; } function renderModels() { const models = S?.models || []; $("#ov-models").innerHTML = `

Aktuelle Modelle im Stack

${models.length || ""}
${models.length ? `
${models.map(modelRow).join("")}
` : `
Keine Modelle konfiguriert
Hol dir unter „Cookbook“ eins von HuggingFace.
`}`; } function renderRecentJobs() { const latest = J.slice(0, 4); const statusBadge = (s) => { if (s === "done") return 'fertig'; if (s === "failed") return 'fehler'; return 'lädt…'; }; $("#ov-recent-jobs").innerHTML = `

Letzte Aktivitäten

Alle ansehen →
${latest.length ? `
${latest.map(j => `
${esc(j.label)}
${statusBadge(j.state)}
`).join("")}
` : `
Keine Aktivitäten
Alles läuft ruhig.
` } `; } function renderAll() { renderHero(); renderQuickActions(); renderModels(); renderRecentJobs(); } function mount() { renderAll(); } function onStatus(s) { S = s; renderModels(); } function onJobs(jobs) { J = jobs || []; renderRecentJobs(); } function onSystem(sys) { SYS = sys; renderQuickActions(); } export default { id: "overview", mount, onStatus, onJobs, onSystem };