// ── Dashboard Page ── registerPage('dashboard', { async init() { const agents = await apiGetAgents(); const agentMap = {}; for (const a of agents) agentMap[a.agentId] = a; // Sessions const sessions = await apiGetSessions(); const grid = document.getElementById('sessionCards'); grid.innerHTML = ''; for (const s of sessions) { const agent = s.agentId ? agentMap[s.agentId] : null; const card = document.createElement('div'); card.className = 'card clickable'; const msgLabel = s.messageCount !== undefined ? `${s.messageCount}${s.totalMessageCount !== s.messageCount ? ` (${s.totalMessageCount})` : ''} Nachrichten` : ''; const workspaceLabel = s.workspace ? s.workspace : ''; card.innerHTML = `
${s.image ? `` : ''}
${esc(s.name || 'Unbenannt')} ${agent ? `${esc(agent.name)}` : ''}
${s.description ? `
${esc(s.description)}
` : ''}
${msgLabel ? ` ${esc(msgLabel)}` : ''} ${workspaceLabel ? ` ${esc(workspaceLabel)}` : ''}
`; card.addEventListener('click', () => navigateTo('session', { id: s.sessionId })); grid.appendChild(card); // Git-Status asynchron laden if (s.workspace) { apiGitStatus(s.sessionId).then(status => { if (!status || status.error) return; const addCount = (status.add || []).length; const editCount = (status.edit || []).length; const deleteCount = (status.delete || []).length; const outgoing = status.outgoing || 0; if (addCount + editCount + deleteCount + outgoing === 0) return; const metaEl = card.querySelector('.card-meta'); if (!metaEl) return; const parts = []; const tooltipParts = []; if (addCount > 0) { parts.push(`+${addCount}`); tooltipParts.push(`${addCount} ${addCount === 1 ? 'Datei' : 'Dateien'} hinzugefügt`); } if (editCount > 0) { parts.push(`~${editCount}`); tooltipParts.push(`${editCount} ${editCount === 1 ? 'Datei' : 'Dateien'} geändert`); } if (deleteCount > 0) { parts.push(`-${deleteCount}`); tooltipParts.push(`${deleteCount} ${deleteCount === 1 ? 'Datei' : 'Dateien'} gelöscht`); } if (outgoing > 0) { parts.push(` ${outgoing}`); tooltipParts.push(`${outgoing} ${outgoing === 1 ? 'Commit muss' : 'Commits müssen'} noch gepusht werden`); } const gitEl = document.createElement('span'); gitEl.className = 'card-meta-item card-git-status'; gitEl.title = tooltipParts.join('\n'); gitEl.innerHTML = ` ${parts.join(' ')}`; metaEl.appendChild(gitEl); }); } } // Neue Session Placeholder const newSession = document.createElement('div'); newSession.className = 'card placeholder clickable'; newSession.innerHTML = '
+ Neue Session
'; newSession.addEventListener('click', () => navigateTo('session')); document.getElementById('newSessionCard').appendChild(newSession); // Agents const agentGrid = document.getElementById('agentCards'); agentGrid.innerHTML = ''; for (const a of agents) { const card = document.createElement('div'); card.className = 'card clickable'; card.innerHTML = `
${a.avatar ? `` : ''}
${esc(a.name)} ${esc(a.model)}
${a.description ? `
${esc(a.description)}
` : ''} ${a.persona ? `
${esc(a.persona)}
` : ''}
`; card.addEventListener('click', () => navigateTo('agent', { id: a.agentId })); agentGrid.appendChild(card); } const placeholder = document.createElement('div'); placeholder.className = 'card placeholder clickable'; placeholder.innerHTML = '
+ Neuer Agent
'; placeholder.addEventListener('click', () => navigateTo('agent')); document.getElementById('newAgentCard').appendChild(placeholder); }, destroy() {} }); function esc(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; } function formatDate(iso) { if (!iso) return ''; return new Date(iso).toLocaleString('de-AT', { day: '2-digit', month: '2-digit', year: '2-digit', hour: '2-digit', minute: '2-digit' }); }