/** * Conversation history utilities for processing message history * * Provides standardized conversation history handling: * - Extract text from content (string or array format) * - Normalize content blocks to array format * - Format history as plain text for CLI-based providers * - Convert history to Claude SDK message format */ import type { ConversationMessage } from '@automaker/types'; /** * Extract plain text from message content (handles both string and array formats) * * @param content - Message content (string or array of content blocks) * @returns Extracted text content */ export function extractTextFromContent( content: string | Array<{ type: string; text?: string; source?: object }> ): string { if (typeof content === 'string') { return content; } // Extract text blocks only return content .filter((block) => block.type === 'text') .map((block) => block.text || '') .join('\n'); } /** * Normalize message content to array format * * @param content - Message content (string or array) * @returns Content as array of blocks */ export function normalizeContentBlocks( content: string | Array<{ type: string; text?: string; source?: object }> ): Array<{ type: string; text?: string; source?: object }> { if (Array.isArray(content)) { return content; } return [{ type: 'text', text: content }]; } /** * Format conversation history as plain text for CLI-based providers * * @param history - Array of conversation messages * @returns Formatted text with role labels */ export function formatHistoryAsText(history: ConversationMessage[]): string { if (history.length === 0) { return ''; } let historyText = 'Previous conversation:\n\n'; for (const msg of history) { const contentText = extractTextFromContent(msg.content); const role = msg.role === 'user' ? 'User' : 'Assistant'; historyText += `${role}: ${contentText}\n\n`; } historyText += '---\n\n'; return historyText; } /** * Convert conversation history to Claude SDK message format * * @param history - Array of conversation messages * @returns Array of Claude SDK formatted messages */ export function convertHistoryToMessages(history: ConversationMessage[]): Array<{ type: 'user' | 'assistant'; session_id: string; message: { role: 'user' | 'assistant'; content: Array<{ type: string; text?: string; source?: object }>; }; parent_tool_use_id: null; }> { return history.map((historyMsg) => ({ type: historyMsg.role, session_id: '', message: { role: historyMsg.role, content: normalizeContentBlocks(historyMsg.content), }, parent_tool_use_id: null, })); }