UNPKG

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
/** * 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