// ── Avatar Transform Helper ── function _buildAvatarTransformStyle(obj) { const parts = []; if (obj.avatarScale && obj.avatarScale !== 1) parts.push(`scale(${obj.avatarScale})`); if (obj.avatarOffsetX || obj.avatarOffsetY) parts.push(`translate(${obj.avatarOffsetX || 0}%, ${obj.avatarOffsetY || 0}%)`); return parts.length ? ` style="transform: ${parts.join(' ')}"` : ''; } // ── Session Card Helper ── // Erzeugt ein .card-Element für eine Session (wiederverwendbar für Dashboard + Picker). function buildSessionCard(session, agent) { const card = document.createElement('div'); card.className = 'card'; const transformStyle = _buildAvatarTransformStyle(session); const imageHtml = session.image ? `` : ''; // Badges const badges = []; if (agent) badges.push(`${esc(agent.name)}`); if (session.reviewAgentId) badges.push(``); if (session.finalizerAgentId) badges.push(``); if (session.context) badges.push(``); if (session.telegramConfigured) badges.push(``); // Meta const metaParts = []; if (session.messageCount) metaParts.push(` ${esc(session.messageCount + ' Nachrichten')}`); if (session.archiveMessageCount) metaParts.push(` ${esc(session.archiveMessageCount + ' Nachrichten archiviert')}`); if (session.workspace) metaParts.push(` ${esc(session.workspace)}`); card.innerHTML = `
${imageHtml}
${esc(session.name || 'Unbenannt')} ${badges.join('')}
${metaParts.length ? `
${metaParts.join('')}
` : ''}
`; return card; } // ── Telegram Bot Card Helper ── function buildTelegramBotCard(bot) { const card = document.createElement('div'); card.className = 'card card-compact'; const badges = []; if (bot.isPublic) { badges.push(' Public'); } if (bot.isOwner === false) { badges.push(' Fremd'); } if (bot.sessionCount > 0) { badges.push(` ${bot.sessionCount} ${bot.sessionCount === 1 ? 'Session' : 'Sessions'}`); } // Meta-Items nur anzeigen wenn Daten vorhanden const metaParts = []; if (bot.botToken) { const maskedToken = '•••' + bot.botToken.slice(-4); metaParts.push(` ${esc(maskedToken)}`); } if (bot.createdAt) { metaParts.push(` ${formatDate(bot.createdAt)}`); } card.innerHTML = `
${esc(bot.name)} ${badges.join('')}
${metaParts.length ? `
${metaParts.join('')}
` : ''}
`; return card; } // ── User Card Helper ── // Erzeugt ein kompaktes .card-Element für einen Benutzer (für den Zuweisungs-Picker). function buildUserCard(user) { const card = document.createElement('div'); card.className = 'card card-compact'; const badges = []; if (user.isAdmin) { badges.push(' Admin'); } const metaParts = []; metaParts.push(` ${esc(user.username)}`); const title = user.displayName || user.username; card.innerHTML = `
${esc(title)} ${badges.join('')}
${metaParts.length ? `
${metaParts.join('')}
` : ''}
`; return card; } // ── Agent Card Helper ── // Erzeugt ein .card-Element für einen Agent (wiederverwendbar für Dashboard + Picker). function buildAgentCard(agent, skills) { const card = document.createElement('div'); card.className = 'card'; const agentTransformStyle = _buildAvatarTransformStyle(agent); const imageHtml = agent.avatar ? `` : ''; // Badges const badges = []; if (agent.allowUserChoice) badges.push(' Rückfragen'); if (agent.autoCommit === 'mention') badges.push(' Anmerken'); if (agent.autoCommit === 'enforce') badges.push(' Erzwungen'); if (agent.autoCommit === 'forbid') badges.push(' Verboten'); if (agent.useSoul) badges.push(' Seele'); if (agent.useIdentity) badges.push(' Ich'); if (agent.useUserInfo) badges.push(' Du'); if (agent.useMemory) badges.push(' Erinnerungen'); if (agent.useAutoContext) badges.push(' Auto-Kontext'); if (agent.useGitHubSearch) badges.push(' GitHub Search'); if (agent.useSerperSearch) badges.push(' Serper Search'); if (agent.webSearchVersion) { const wsYear = agent.webSearchVersion.includes('2025') ? 'Version 2025' : 'v2026'; badges.push(` Web-Suche`); } if (agent.isPublic) badges.push(' Public'); if (agent.isOwner === false) badges.push(' Fremd'); if (skills) { for (const skill of skills) { badges.push(` ${esc(skill.name)}`); } } card.innerHTML = `
${imageHtml}
${esc(agent.name)} ${prettyModelName(agent.model)}
${badges.length ? `
${badges.join('')}
` : ''}
`; return card; }