`;
async function api(path,method='GET'){const r=await fetch('/api/v1/'+path,{method,headers:method==='POST'?{'X-Athena-Deck':'1'}:{},signal:AbortSignal.timeout(15000)});if(r.status===401){location.reload();throw Error('Bitte erneut anmelden.')}if(!r.ok)throw Error(`API-Anfrage fehlgeschlagen (${r.status})`);return r.json()}
const metric=(title,value)=>`
${title}${value}
`;
const bar=v=>v==null?'':``;
const placeholders={chat:['Sprachmodelle / Chat','Modellprofile, Laufzeit und Chat','Hier werden später Modellprofile und native llama.cpp-Prozesse verwaltet.'],image:['Bildgenerierung','Worker und Aufträge','Hier entsteht später die Übersicht für Bild-Worker und deren Zustand.'],audio:['Audio','Spracheingabe und Sprachausgabe','Hier werden später getrennte Worker für Erkennung und Ausgabe eingebunden.'],services:['Weitere Dienste','Erweiterbare Dienste','Hier finden später zusätzliche Worker und ihre Schnittstellen Platz.']};
const DECK_THEME_KEY='athena-deck-theme';
const DECK_THEMES=new Set(['deck','athena-classic']);
function applyDeckTheme(theme){
const selected=DECK_THEMES.has(theme)?theme:'deck';
document.documentElement.dataset.theme=selected;
try{localStorage.setItem(DECK_THEME_KEY,selected)}catch(_){}
return selected;
}
try{applyDeckTheme(localStorage.getItem(DECK_THEME_KEY))}catch(_){applyDeckTheme('deck')}
function appearancePage(){
if(view.querySelector('#appearance-page'))return;
view.innerHTML=`
EINSTELLUNGEN / DARSTELLUNG
Darstellung
Wähle die Farben für Athena Deck. Die Auswahl gilt in diesem Browser und wird sofort angewendet.
Installation, Downloads, Presets und Modellwechsel sind in dieser Version nicht enthalten.
`;}
if((location.hash.slice(1)||'dashboard')===page){view.innerHTML=html;}
}catch(e){error.textContent=e.message;view.innerHTML=heading('VERBINDUNG','Status nicht verfügbar','Die API ist gerade nicht erreichbar. Angezeigte Messwerte wurden verworfen.');}finally{refreshing=false;}}
window.addEventListener('hashchange',refresh);refresh();setInterval(refresh,5000);