fix: Nachrichtenanzahl zählt nur text-Messages, keine tool_use/tool_result

- 5 SQL COUNT-Queries mit 'type = text' Filter versehen:
  - GetSessionsWithStats (activeCount + totalCount)
  - GetActiveMessageCount
  - GetActiveMessageCountBeforeId
  - CreateArchive (messageCount)
- Dashboard: Aktive und archivierte Nachrichten separat angezeigt
- ArchiveMessageCount als eigenes Feld im Session-DTO
- TODO.md: Nachrichtenzählung-Bug als erledigt markiert
This commit is contained in:
Meleki committed 2026-03-05 16:33:03 +01:00
1 parent 4ae894304f
commit dbeba6535a
3 files changed
+12 -11

No files matched your search

+6 -5
View File
@@ -407,13 +407,13 @@ public class DatabaseService
var activeCount = await conn.ExecuteScalarAsync<int>(@"
SELECT COUNT(*) FROM messages m
JOIN chains c ON m.chain_id = c.chain_id
WHERE c.session_id = @sessionId AND c.archive_id IS NULL",
WHERE c.session_id = @sessionId AND c.archive_id IS NULL AND m.type = 'text'",
new { sessionId = s.SessionId });
var totalCount = await conn.ExecuteScalarAsync<int>(@"
SELECT COUNT(*) FROM messages m
JOIN chains c ON m.chain_id = c.chain_id
WHERE c.session_id = @sessionId",
WHERE c.session_id = @sessionId AND m.type = 'text'",
new { sessionId = s.SessionId });
results.Add(new
@@ -430,6 +430,7 @@ public class DatabaseService
s.CreatedAt,
s.UpdatedAt,
MessageCount = activeCount,
ArchiveMessageCount = totalCount - activeCount,
TotalMessageCount = totalCount,
TelegramConfigured = !string.IsNullOrEmpty(s.TelegramBotToken),
TelegramLinked = !string.IsNullOrEmpty(s.TelegramChatId)
@@ -499,7 +500,7 @@ public class DatabaseService
var messageCount = await conn.ExecuteScalarAsync<int>(@"
SELECT COUNT(*) FROM messages
WHERE chain_id IN (SELECT chain_id FROM chains WHERE archive_id IS NULL AND session_id = @sessionId)",
WHERE type = 'text' AND chain_id IN (SELECT chain_id FROM chains WHERE archive_id IS NULL AND session_id = @sessionId)",
new { sessionId });
var archive = new ArchiveRecord
@@ -671,7 +672,7 @@ public class DatabaseService
return await conn.ExecuteScalarAsync<int>($@"
SELECT COUNT(*) FROM messages m
JOIN chains c ON m.chain_id = c.chain_id
WHERE c.archive_id IS NULL AND c.session_id = @sessionId {deletedFilter}",
WHERE c.archive_id IS NULL AND c.session_id = @sessionId AND m.type = 'text' {deletedFilter}",
new { sessionId });
}
@@ -695,7 +696,7 @@ public class DatabaseService
return await conn.ExecuteScalarAsync<int>($@"
SELECT COUNT(*) FROM messages m
JOIN chains c ON m.chain_id = c.chain_id
WHERE m.id < @beforeId AND c.archive_id IS NULL AND c.session_id = @sessionId {deletedFilter}",
WHERE m.id < @beforeId AND c.archive_id IS NULL AND c.session_id = @sessionId AND m.type = 'text' {deletedFilter}",
new { sessionId, beforeId });
}
+2 -2
View File
@@ -16,13 +16,13 @@
- [x] Weitere Tools: Glob? Search? Todo List?
- [x] Settings in Datenbank speichern (users table) anstelle von localStorage
- [x] Einzelne Nachicht als Link teilen
- [ ] Geteilite Links verwalten (löschen)
- [x] Geteilte Links verwalten (löschen)
## Bugs
- [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte
- [x] Größere Tasks brechen irgendwann ab, könnte an der Limitierung von Antrophic/Claude liegen. Jedoch sollte wird es scheinbar nicht behandelt: Der Status bleibt auf "Streaming..." aber es passiert nichts mehr
- [x] Session -> Chat öffnen im Frontend soll nicht möglich sein, wenn kein Agent gesetzt ist
- [ ] Falsche Nachrichtenanzahl im Dashboard (tool uses werden fälschicherweise mitgezählt) - dasselbe bei "Ältere Nachrichten laden" im Chat
- [x] Falsche Nachrichtenanzahl im Dashboard (tool uses werden fälschicherweise mitgezählt) - dasselbe bei "Ältere Nachrichten laden" im Chat
## Backend
- [x] System-Prompt anpassen. Explizit auf Workspace-Pfad hinweisen, weil Model halluziniert oft und will in den nicht vorhandenen Pfad /workspace wechseln
+4 -4
View File
@@ -32,9 +32,8 @@ registerPage('dashboard', {
const agent = s.agentId ? agentMap[s.agentId] : null;
const card = document.createElement('div');
card.className = 'card';
const msgLabel = s.messageCount !== undefined
? `${s.messageCount}${s.totalMessageCount !== s.messageCount ? ` (${s.totalMessageCount})` : ''} Nachrichten`
: '';
const msgLabel1 = s.messageCount ? `${s.messageCount} Nachrichten` : '';
const msgLabel2 = s.archiveMessageCount ? `${s.archiveMessageCount} Nachrichten archiviert` : '';
const workspaceLabel = s.workspace ? s.workspace : '';
const sessionBadges = [];
@@ -57,7 +56,8 @@ registerPage('dashboard', {
</div>
</div>
<div class="card-meta">
${msgLabel ? `<span class="card-meta-item"><i class="fa fa-comment"></i> ${esc(msgLabel)}</span>` : ''}
${msgLabel1 ? `<span class="card-meta-item"><i class="fa fa-comment"></i> ${esc(msgLabel1)}</span>` : ''}
${msgLabel2 ? `<span class="card-meta-item"><i class="fa fa-archive"></i> ${esc(msgLabel2)}</span>` : ''}
${workspaceLabel ? `<span class="card-meta-item card-workspace" title="${esc(workspaceLabel)}"><i class="fa fa-folder"></i> ${esc(workspaceLabel)}</span>` : ''}
</div>
</div>