| // ==================== Conversation Summary ==================== | |
| /** | |
| * OpenAI message format (used by director) | |
| */ | |
| export interface OpenAIMessage { | |
| role: 'system' | 'user' | 'assistant'; | |
| content: string; | |
| } | |
| /** | |
| * Summarize conversation history for the director agent | |
| * | |
| * Produces a condensed text summary of the last N messages, | |
| * truncating long messages and including role labels. | |
| * | |
| * @param messages - OpenAI-format messages to summarize | |
| * @param maxMessages - Maximum number of recent messages to include (default 10) | |
| * @param maxContentLength - Maximum content length per message (default 200) | |
| */ | |
| export function summarizeConversation( | |
| messages: OpenAIMessage[], | |
| maxMessages = 10, | |
| maxContentLength = 200, | |
| ): string { | |
| if (messages.length === 0) { | |
| return 'No conversation history yet.'; | |
| } | |
| const recent = messages.slice(-maxMessages); | |
| const lines = recent.map((msg) => { | |
| const roleLabel = | |
| msg.role === 'user' ? 'User' : msg.role === 'assistant' ? 'Assistant' : 'System'; | |
| const content = | |
| msg.content.length > maxContentLength | |
| ? msg.content.slice(0, maxContentLength) + '...' | |
| : msg.content; | |
| return `[${roleLabel}] ${content}`; | |
| }); | |
| return lines.join('\n'); | |
| } | |