create-ai-chat-context-experimental
Version:
Phase 2: TypeScript rewrite - AI Chat Context & Memory System with conversation extraction and AICF format support (powered by aicf-core v2.1.0).
89 lines • 3.42 kB
JavaScript
/**
* This file is part of create-ai-chat-context-experimental.
* Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
* See LICENSE file for details.
*/
import { ExtractionError } from '../types/index.js';
import { Ok, Err } from '../types/index.js';
/**
* Parse and aggregate conversation messages into comprehensive summary
* Preserves FULL content - NO TRUNCATION
*/
export class ConversationSummaryParser {
/**
* Extract comprehensive conversation summary from ALL messages
* NO TRUNCATION - preserves full content
*
* @param messages - Array of messages to summarize
* @returns Result with ConversationSummary or error
*/
extractSummary(messages) {
try {
if (!messages || messages.length === 0) {
return Ok(this.emptyConversationSummary());
}
const userMessages = messages.filter((m) => m.role === 'user');
const aiMessages = messages.filter((m) => m.role === 'assistant');
// Aggregate user queries with full content
const userQueries = userMessages.map((m, i) => `[User ${i + 1}] ${m.content}`).join('\n\n');
// Aggregate AI responses with full content
const aiResponses = aiMessages.map((m, i) => `[AI ${i + 1}] ${m.content}`).join('\n\n');
// Create full conversation with timestamps and roles
const fullConversation = messages
.map((m, i) => {
const role = m.role.toUpperCase();
const timestamp = m.timestamp;
return `[${i + 1}] ${role} (${timestamp}):\n${m.content}`;
})
.join('\n\n---\n\n');
// Calculate metrics
const metrics = this.calculateMetrics(messages);
const summary = {
userQueries,
aiResponses,
fullConversation,
metrics,
};
return Ok(summary);
}
catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
return Err(new ExtractionError(`Failed to extract conversation summary: ${message}`, error));
}
}
/**
* Calculate metrics about the conversation
* @param messages - Messages to analyze
* @returns ConversationMetrics
*/
calculateMetrics(messages) {
const totalChars = messages.reduce((sum, m) => sum + m.content.length, 0);
const avgMessageLength = messages.length > 0 ? Math.round(totalChars / messages.length) : 0;
return {
totalMessages: messages.length,
userMessages: messages.filter((m) => m.role === 'user').length,
aiMessages: messages.filter((m) => m.role === 'assistant').length,
totalChars,
avgMessageLength,
};
}
/**
* Create empty conversation summary
* @returns Empty ConversationSummary
*/
emptyConversationSummary() {
return {
userQueries: '',
aiResponses: '',
fullConversation: '',
metrics: {
totalMessages: 0,
userMessages: 0,
aiMessages: 0,
totalChars: 0,
avgMessageLength: 0,
},
};
}
}
//# sourceMappingURL=ConversationSummaryParser.js.map