perf: replace 8 filter passes with single-pass message categorization

Cherry-picked from upstream 9fa2590e
This commit is contained in:
iliya 2026-03-25 13:59:03 +02:00
parent 6fa075de51
commit aaa766b2ba

View file

@ -85,21 +85,42 @@ export class SessionParser {
* Process parsed messages into structured data. * Process parsed messages into structured data.
*/ */
private processMessages(messages: ParsedMessage[]): ParsedSession { private processMessages(messages: ParsedMessage[]): ParsedSession {
// Group by type // Single-pass categorization instead of 8 separate filter passes
const byType = { const byType = {
user: messages.filter((m) => m.type === 'user'), user: [] as ParsedMessage[],
realUser: messages.filter(isParsedRealUserMessage), realUser: [] as ParsedMessage[],
internalUser: messages.filter(isParsedInternalUserMessage), internalUser: [] as ParsedMessage[],
assistant: messages.filter((m) => m.type === 'assistant'), assistant: [] as ParsedMessage[],
system: messages.filter((m) => m.type === 'system'), system: [] as ParsedMessage[],
other: messages.filter( other: [] as ParsedMessage[],
(m) => m.type !== 'user' && m.type !== 'assistant' && m.type !== 'system'
),
}; };
const sidechainMessages: ParsedMessage[] = [];
const mainMessages: ParsedMessage[] = [];
// Separate sidechain and main messages for (const m of messages) {
const sidechainMessages = messages.filter((m) => m.isSidechain); switch (m.type) {
const mainMessages = messages.filter((m) => !m.isSidechain); case 'user':
byType.user.push(m);
if (isParsedRealUserMessage(m)) byType.realUser.push(m);
if (isParsedInternalUserMessage(m)) byType.internalUser.push(m);
break;
case 'assistant':
byType.assistant.push(m);
break;
case 'system':
byType.system.push(m);
break;
default:
byType.other.push(m);
break;
}
if (m.isSidechain) {
sidechainMessages.push(m);
} else {
mainMessages.push(m);
}
}
// Calculate metrics // Calculate metrics
const metrics = calculateMetrics(messages); const metrics = calculateMetrics(messages);