/** * Teammate Message Parser * * Parses XML content into structured data. * Handles single or multiple blocks in one message. * Pure function for cross-process use (renderer needs it in displayItemBuilder). */ export interface ParsedTeammateContent { teammateId: string; color: string; summary: string; content: string; } /** * Regex to match a single block (non-greedy content). * Captures: [1] teammate_id, [2] remaining attributes string, [3] inner content */ const TEAMMATE_BLOCK_RE = /]*)>([\s\S]*?)<\/teammate-message>/g; const COLOR_RE = /color="([^"]*)"/; const SUMMARY_RE = /summary="([^"]*)"/; /** * Parse all blocks from raw content. * Returns an array of parsed blocks (may be 0, 1, or many). */ export function parseAllTeammateMessages(rawContent: string): ParsedTeammateContent[] { const results: ParsedTeammateContent[] = []; const regex = new RegExp(TEAMMATE_BLOCK_RE.source, TEAMMATE_BLOCK_RE.flags); let match: RegExpExecArray | null; while ((match = regex.exec(rawContent)) !== null) { const teammateId = match[1]; const attrs = match[2]; const content = match[3].trim(); const colorMatch = COLOR_RE.exec(attrs); const summaryMatch = SUMMARY_RE.exec(attrs); results.push({ teammateId, color: colorMatch?.[1] ?? '', summary: summaryMatch?.[1] ?? '', content, }); } return results; }