function computeNotesPreview(notes) { if (!notes || notes.trim() === '') { return { has_notes: false, notes_preview: null }; } const firstParagraph = notes.split(/\n\n/)[0]; const stripped = firstParagraph .replace(/^#{1,6}\s+/gm, '') // headers .replace(/\*\*(.+?)\*\*/g, '$1') // bold .replace(/\*(.+?)\*/g, '$1') // italic with * .replace(/_(.+?)_/g, '$1') // italic with _ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links .replace(/^[-*+]\s+/gm, '') // list markers .replace(/\n/g, ' ') // collapse remaining newlines .replace(/\s+/g, ' ') // collapse whitespace .trim(); const truncated = stripped.length > 150 ? stripped.slice(0, 150) + '...' : stripped; return { has_notes: true, notes_preview: truncated }; } module.exports = { computeNotesPreview };