10. Pluggable Wrappers for Safe LLM Usage
10.1 Built-in Wrappers
Section titled “10.1 Built-in Wrappers”import { wrappers } from "@mvrx/mail/wrappers";
// XML — strongly recommended for Claude and models that follow XML instructionsconst email = await parse(message, { wrapper: wrappers.xml("email") });// forAI → "<email>\nHi Bob...\n</email>"
// Markdown blockquoteconst email = await parse(message, { wrapper: wrappers.markdown() });// forAI → "> Hi Bob..."
// Named blockconst email = await parse(message, { wrapper: wrappers.block("UNTRUSTED EMAIL") });// forAI → "--- UNTRUSTED EMAIL ---\nHi Bob...\n--- END UNTRUSTED EMAIL ---"10.2 Custom Wrapper
Section titled “10.2 Custom Wrapper”interface ForAIWrapper { wrap(content: string, email: NormalizedEmail): string;}
const email = await parse(message, { wrapper: { wrap: (content, email) => `[EMAIL FROM: ${email.metadata.from.email}]\n${content}\n[/EMAIL]`, },});10.3 Thread-Level Wrapping
Section titled “10.3 Thread-Level Wrapping”const thread = EmailThread.from(messages);
const prompt = thread.forAI({ wrapper: wrappers.xml("message"), maxMessages: 10, maxCharsPerMessage: 1500, includeMetadata: true, // prepend "From: X | Date: Y" to each message order: "asc",});