| export function extractTextFromChatContent( | |
| content: unknown, | |
| opts?: { | |
| sanitizeText?: (text: string) => string; | |
| joinWith?: string; | |
| normalizeText?: (text: string) => string; | |
| }, | |
| ): string | null { | |
| const normalize = opts?.normalizeText ?? ((text: string) => text.replace(/\s+/g, " ").trim()); | |
| const joinWith = opts?.joinWith ?? " "; | |
| if (typeof content === "string") { | |
| const value = opts?.sanitizeText ? opts.sanitizeText(content) : content; | |
| const normalized = normalize(value); | |
| return normalized ? normalized : null; | |
| } | |
| if (!Array.isArray(content)) { | |
| return null; | |
| } | |
| const chunks: string[] = []; | |
| for (const block of content) { | |
| if (!block || typeof block !== "object") { | |
| continue; | |
| } | |
| if ((block as { type?: unknown }).type !== "text") { | |
| continue; | |
| } | |
| const text = (block as { text?: unknown }).text; | |
| if (typeof text !== "string") { | |
| continue; | |
| } | |
| const value = opts?.sanitizeText ? opts.sanitizeText(text) : text; | |
| if (value.trim()) { | |
| chunks.push(value); | |
| } | |
| } | |
| const joined = normalize(chunks.join(joinWith)); | |
| return joined ? joined : null; | |
| } | |