diff --git a/Endpoints/SharedEndpoint.cs b/Endpoints/SharedEndpoint.cs index cbb0acb..0c52d7e 100644 --- a/Endpoints/SharedEndpoint.cs +++ b/Endpoints/SharedEndpoint.cs @@ -126,7 +126,8 @@ public static class SharedEndpoint m.Id, m.Role, m.Content, - m.CreatedAt + m.CreatedAt, + m.Iteration }) .ToList(); diff --git a/wwwroot/css/form.css b/wwwroot/css/form.css index 00709ed..3f34d1c 100644 --- a/wwwroot/css/form.css +++ b/wwwroot/css/form.css @@ -10,6 +10,11 @@ margin-top: var(--box-spacing); } +.more { + margin: var(--box-spacing) auto; + cursor: pointer; +} + .avatar-section { display: flex; align-items: center; @@ -55,7 +60,7 @@ .form-actions { display: flex; gap: var(--badge-spacing); - margin-block: var(--box-spacing) calc(var(--page-spacing) * 4); + margin-block: var(--box-spacing) calc(var(--page-spacing) * 2); } /* ── Custom Commands ── */ @@ -211,12 +216,6 @@ label.skill-item { color: var(--dangerous); } -.profile-divider { - border: none; - border-top: var(--border-width) solid var(--f2-border); - margin: var(--box-spacing) 0; -} - .danger-btn { color: var(--dangerous); border-color: currentcolor; diff --git a/wwwroot/index.html b/wwwroot/index.html index b272ae8..cb0652c 100644 --- a/wwwroot/index.html +++ b/wwwroot/index.html @@ -108,34 +108,38 @@ - - - -
- - -
- - - -
- +
+ Weitere Einstellungen + -
@@ -162,57 +166,62 @@
- - - - - - - - - - - - - - -
- +
+ +
diff --git a/wwwroot/js/pages/agent-page.js b/wwwroot/js/pages/agent-page.js index 33cadd9..a3afa63 100644 --- a/wwwroot/js/pages/agent-page.js +++ b/wwwroot/js/pages/agent-page.js @@ -36,6 +36,7 @@ registerPage('agent', { const addCommandBtn = document.getElementById('agentAddCommandBtn'); const skillsSection = document.getElementById('agentSkillsSection'); const skillList = document.getElementById('agentSkillList'); + const more = document.querySelector('.more'); _agentAvatarData = null; @@ -120,6 +121,13 @@ registerPage('agent', { } }); + more.addEventListener('click', () => { + const content = more.querySelector('[hidden]'); + while (content.firstChild) + more.parentNode.insertBefore(content.firstChild, more); + more.remove(); + }); + // Speichern saveBtn.addEventListener('click', async () => { const data = { diff --git a/wwwroot/js/pages/session-page.js b/wwwroot/js/pages/session-page.js index 921050a..3348566 100644 --- a/wwwroot/js/pages/session-page.js +++ b/wwwroot/js/pages/session-page.js @@ -30,7 +30,8 @@ registerPage('session', { const deleteBtn = document.getElementById('sessionDeleteBtn'); const commandsList = document.getElementById('customCommandsList'); const addCommandBtn = document.getElementById('addCommandBtn'); - + const more = document.querySelector('.more'); + _sessionImageData = null; if (session) { @@ -125,6 +126,13 @@ registerPage('session', { } }); + more.addEventListener('click', () => { + const content = more.querySelector('[hidden]'); + while (content.firstChild) + more.parentNode.insertBefore(content.firstChild, more); + more.remove(); + }); + // Workspace Browse const workspaceBrowse = document.getElementById('sessionWorkspaceBrowse'); if (workspaceBrowse) { diff --git a/wwwroot/js/pages/shared-page.js b/wwwroot/js/pages/shared-page.js index 0cc9e0f..fdb40bd 100644 --- a/wwwroot/js/pages/shared-page.js +++ b/wwwroot/js/pages/shared-page.js @@ -13,23 +13,18 @@ registerPage('shared', { const data = await apiGetShared(token); container.innerHTML = ''; + let messages = []; + if (data.messages && data.messages.length > 0) { - // Mehrere Nachrichten (Thread mit Kontext) - data.messages.forEach(msg => { - const div = document.createElement('div'); - div.className = 'msg ' + (msg.role === 'user' ? 'user' : 'assistant') + ' markdown'; - if (msg.role === 'user') { - renderUserContent(div, msg.content); - } else { - div.innerHTML = renderMarkdown(msg.content); - parseFluentEmojis(div); - wrapKreaGalleries(div); - } - container.appendChild(div); - }); + messages = data.messages; } else if (data.message) { - // Einzelne Nachricht - const msg = data.message; + messages = [data.message]; + } + + // Aufeinanderfolgende Assistant-Text-Messages mergen (wie im Chat) + messages = _mergeConsecutiveTexts(messages); + + for (const msg of messages) { const div = document.createElement('div'); div.className = 'msg ' + (msg.role === 'user' ? 'user' : 'assistant') + ' markdown'; if (msg.role === 'user') { @@ -57,3 +52,20 @@ registerPage('shared', { }, destroy: () => {} }); + +function _mergeConsecutiveTexts(msgs) { + const result = []; + for (const msg of msgs) { + if (msg.role === 'assistant') { + const prev = result[result.length - 1]; + if (prev && prev.role === 'assistant' + && prev.iteration === msg.iteration) { + prev.content = (prev.content || '') + ' ' + (msg.content || ''); + if (msg.createdAt) prev.createdAt = msg.createdAt; + continue; + } + } + result.push(Object.assign({}, msg)); + } + return result; +}