{"version":3,"sources":["../src/negotiation.ts","../src/tokens.ts","../src/text.ts","../src/markdown.ts","../src/paths.ts","../src/bots.ts","../src/composition.ts","../src/llms-txt.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export interface ParsedMediaType {\n  type: string;\n  subtype: string;\n  quality: number;\n}\n\nexport function parseAcceptHeader(header: string): ParsedMediaType[] {\n  if (!header) return [];\n  return header\n    .split(\",\")\n    .map((range) => {\n      const [mediaType, ...params] = range.trim().split(\";\");\n      const [type = \"*\", subtype = \"*\"] = (mediaType ?? \"\").trim().split(\"/\");\n      let quality = 1.0;\n      for (const param of params) {\n        const [key, value] = param.trim().split(\"=\");\n        if (key?.trim() === \"q\") {\n          quality = Math.min(1.0, Math.max(0, parseFloat(value ?? \"0\") || 0));\n        }\n      }\n      return {\n        type: (type ?? \"*\").toLowerCase(),\n        subtype: (subtype ?? \"*\").toLowerCase(),\n        quality,\n      };\n    })\n    .sort((a, b) => {\n      if (b.quality !== a.quality) return b.quality - a.quality;\n      const specA = (a.type === \"*\" ? 0 : 1) + (a.subtype === \"*\" ? 0 : 1);\n      const specB = (b.type === \"*\" ? 0 : 1) + (b.subtype === \"*\" ? 0 : 1);\n      return specB - specA;\n    });\n}\n\nexport function mediaTypeMatches(\n  pref: ParsedMediaType,\n  type: string,\n  subtype: string,\n): boolean {\n  if (pref.quality === 0) return false;\n  if (pref.type !== \"*\" && pref.type !== type) return false;\n  if (pref.subtype !== \"*\" && pref.subtype !== subtype) return false;\n  return true;\n}\n\nconst FORMAT_REGISTRY = new Map<string, ReadonlyArray<readonly [string, string]>>([\n  [\n    \"html\",\n    [\n      [\"text\", \"html\"],\n      [\"application\", \"xhtml+xml\"],\n    ],\n  ],\n  [\"markdown\", [[\"text\", \"markdown\"]]],\n]);\n\nexport function registerFormat(\n  key: string,\n  mediaTypes: ReadonlyArray<readonly [string, string]>,\n): void {\n  FORMAT_REGISTRY.set(key, mediaTypes);\n}\n\nexport function getRegisteredFormats(): ReadonlyArray<string> {\n  return Array.from(FORMAT_REGISTRY.keys());\n}\n\nconst DEFAULT_AVAILABLE = [\"html\", \"markdown\"] as const;\n\nexport function negotiateFormat<T extends string = \"html\" | \"markdown\">(\n  accept: string,\n  available?: ReadonlyArray<T>,\n): T | null {\n  const formats = (available ?? (DEFAULT_AVAILABLE as ReadonlyArray<unknown> as ReadonlyArray<T>));\n  if (formats.length === 0) return null;\n\n  const prefs = parseAcceptHeader(accept);\n  if (prefs.length === 0) return formats[0] ?? null;\n\n  const formatQ = new Map<T, number>();\n  for (const fmt of formats) formatQ.set(fmt, -1);\n\n  for (const pref of prefs) {\n    for (const fmt of formats) {\n      if ((formatQ.get(fmt) ?? -1) >= 0) continue;\n      const mediaTypes = FORMAT_REGISTRY.get(fmt);\n      if (!mediaTypes) continue;\n      for (const [type, subtype] of mediaTypes) {\n        if (mediaTypeMatches(pref, type, subtype)) {\n          formatQ.set(fmt, pref.quality);\n          break;\n        }\n      }\n    }\n  }\n\n  for (const fmt of formats) {\n    if ((formatQ.get(fmt) ?? -1) >= 0) continue;\n    const mediaTypes = FORMAT_REGISTRY.get(fmt);\n    if (!mediaTypes) continue;\n    const primaryType = mediaTypes[0]?.[0];\n    for (const pref of prefs) {\n      if (\n        pref.type === \"*\" ||\n        (primaryType !== undefined && pref.type === primaryType && pref.subtype === \"*\")\n      ) {\n        formatQ.set(fmt, pref.quality);\n        break;\n      }\n    }\n  }\n\n  let best: { fmt: T; q: number; idx: number } | null = null;\n  formats.forEach((fmt, idx) => {\n    const q = formatQ.get(fmt) ?? -1;\n    if (q <= 0) return;\n    if (\n      best === null ||\n      q > best.q ||\n      (q === best.q && idx < best.idx)\n    ) {\n      best = { fmt, q, idx };\n    }\n  });\n\n  return best === null ? null : (best as { fmt: T; q: number; idx: number }).fmt;\n}\n\n/**\n * Decide whether a request should be served the markdown twin instead of HTML.\n *\n * This encodes the AEO spec §5 rule for UA-based markdown: a known AI bot MAY\n * receive markdown, but \"UA detection MUST NOT override an explicit `Accept`\".\n * Markdown is served when either:\n *\n *   1. RFC 7231 negotiation on the `Accept` header already picks markdown, or\n *   2. the request is from a known AI bot AND markdown is at least as\n *      acceptable as HTML for that `Accept` header.\n *\n * Case 2 is checked by negotiating with markdown listed first, so a tie (a\n * wildcard Accept, or no Accept at all) resolves to markdown for bots, while an\n * explicit `Accept: text/html` (where HTML strictly outranks markdown, or\n * markdown is not acceptable at all) keeps the bot on HTML.\n */\nexport function shouldServeMarkdown(accept: string, isBot: boolean): boolean {\n  if (negotiateFormat(accept) === \"markdown\") return true;\n  if (!isBot) return false;\n  return negotiateFormat(accept, [\"markdown\", \"html\"]) === \"markdown\";\n}\n","export type TokenEstimator = (text: string) => number;\n\nexport interface EstimateTokensOptions {\n  tokenizer?: TokenEstimator;\n}\n\nconst defaultEstimator: TokenEstimator = (text) => text.split(/\\s+/).filter(Boolean).length;\n\nlet currentEstimator: TokenEstimator = defaultEstimator;\n\nexport function estimateTokens(text: string, options?: EstimateTokensOptions): number {\n  const fn = options?.tokenizer ?? currentEstimator;\n  return fn(text);\n}\n\nexport function setTokenEstimator(fn: TokenEstimator): void {\n  currentEstimator = fn;\n}\n\nexport function resetTokenEstimator(): void {\n  currentEstimator = defaultEstimator;\n}\n","export function normalizeUnicode(text: string): string {\n  return text\n    .replace(/[\\u200B\\u200C\\u200D\\uFEFF]/g, \"\")\n    .replace(/\\uFE0F/g, \"\")\n    .replace(/\\u20E3/g, \"\")\n    .replace(/\\u00AD/g, \"\")\n    .replace(/[\\u00A0\\u200A\\u202F]/g, \" \")\n    .replace(/[\\u2010\\u2011]/g, \"-\")\n    .replace(/[\\u2018\\u2019\\u201A\\u02BC\\u02BB]/g, \"'\")\n    .replace(/[\\u201C\\u201D\\u201E\\u00AB\\u00BB]/g, '\"')\n    .replace(/\\u2013/g, \"-\")\n    .replace(/\\u2014/g, \"--\")\n    .replace(/\\u2026/g, \"...\")\n    .replace(/[\\u2022\\u00B7]/g, \"-\")\n    .replace(/\\u2192/g, \"->\")\n    .replace(/\\u2190/g, \"<-\")\n    .replace(/\\u00D7/g, \"x\")\n    .replace(/\\u00F7/g, \"/\")\n    .replace(/\\u2248/g, \"~=\")\n    .replace(/\\u2265/g, \">=\")\n    .replace(/\\u00A2/g, \"c\")\n    .replace(/\\u20B9/g, \"INR \")\n    .replace(/\\u20AC/g, \"EUR \")\n    .replace(/\\u00A3/g, \"GBP \")\n    .replace(/\\u00A5/g, \"JPY \")\n    .replace(/\\u20A9/g, \"KRW \")\n    .replace(/\\u20BD/g, \"RUB \")\n    .replace(/\\u20BA/g, \"TRY \")\n    .replace(/\\u20A8/g, \"Rs.\")\n    .replace(/\\u058F/g, \"AMD \")\n    .replace(/\\u20BC/g, \"AZN \")\n    .replace(/\\u09F3/g, \"BDT \")\n    .replace(/\\u20A1/g, \"CRC \")\n    .replace(/\\u20BE/g, \"GEL \")\n    .replace(/\\u20AA/g, \"ILS \")\n    .replace(/\\u20B8/g, \"KZT \")\n    .replace(/\\u20A6/g, \"NGN \")\n    .replace(/\\u20B1/g, \"PHP \")\n    .replace(/\\u0E3F/g, \"THB \")\n    .replace(/[\\u{1D5D4}-\\u{1D5ED}]/gu, (ch) =>\n      String.fromCharCode((ch.codePointAt(0) ?? 0) - 0x1d5d4 + 65),\n    )\n    .replace(/[\\u{1D5EE}-\\u{1D607}]/gu, (ch) =>\n      String.fromCharCode((ch.codePointAt(0) ?? 0) - 0x1d5ee + 97),\n    )\n    .replace(/[\\u{1D7EC}-\\u{1D7F5}]/gu, (ch) =>\n      String.fromCharCode((ch.codePointAt(0) ?? 0) - 0x1d7ec + 48),\n    );\n}\n\nexport interface CleanBodyOptions {\n  stripImages?: boolean;\n  htmlTagReplacements?: Record<string, string>;\n  collapseBlankLines?: boolean;\n}\n\nconst DEFAULT_TAG_REPLACEMENTS: Record<string, string> = {\n  Highlighted: \"**\",\n};\n\nexport function stripImages(md: string): string {\n  return md.replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, (_match, alt: string) => (alt ? alt : \"\"));\n}\n\nexport function cleanBody(body: string, opts: CleanBodyOptions = {}): string {\n  const stripImg = opts.stripImages !== false;\n  const collapse = opts.collapseBlankLines !== false;\n  const replacements = opts.htmlTagReplacements ?? DEFAULT_TAG_REPLACEMENTS;\n\n  let out = stripImg ? stripImages(body) : body;\n\n  for (const [tag, marker] of Object.entries(replacements)) {\n    // `s` (dotAll) so a tag whose content spans multiple lines is still\n    // replaced; without it a multi-line `<Tag>…</Tag>` leaks its raw markup\n    // into the cleaned markdown. `.*?` stays lazy, so it still stops at the\n    // first closing tag.\n    const re = new RegExp(`<${tag}>(.*?)<\\\\/${tag}>`, \"gs\");\n    out = out.replace(re, `${marker}$1${marker}`);\n  }\n\n  out = out.replace(/<br\\s*\\/?>/g, \"\\n\");\n\n  if (collapse) {\n    out = out.replace(/\\n{3,}/g, \"\\n\\n\");\n  }\n\n  return normalizeUnicode(out.trim());\n}\n\nexport function slugToTitle(slug: string): string {\n  return slug\n    .split(\"-\")\n    .filter(Boolean)\n    .map((w) => (w[0] ? w[0].toUpperCase() + w.slice(1) : w))\n    .join(\" \");\n}\n\nexport function fmtDate(d: Date): string {\n  const iso = d.toISOString();\n  return iso.split(\"T\")[0] ?? iso;\n}\n\nexport function joinLines(...parts: Array<string | false | null | undefined>): string {\n  return normalizeUnicode(parts.filter((x): x is string => Boolean(x)).join(\"\\n\"));\n}\n","import { normalizeUnicode } from \"./text.js\";\nimport { estimateTokens, type TokenEstimator } from \"./tokens.js\";\n\nexport interface MarkdownResponseOptions {\n  cacheControl?: string;\n  noindex?: boolean;\n  redirectFrom?: string;\n  redirectTo?: string;\n  extraHeaders?: HeadersInit;\n  status?: number;\n  tokenizer?: TokenEstimator;\n}\n\nconst DEFAULT_CACHE_CONTROL = \"public, max-age=3600\";\n\nexport function markdownResponse(\n  body: string,\n  options: MarkdownResponseOptions = {},\n): Response {\n  const normalized = normalizeUnicode(body);\n  const tokens = estimateTokens(normalized, { tokenizer: options.tokenizer });\n\n  const headers = new Headers({\n    \"Content-Type\": \"text/markdown; charset=utf-8\",\n    \"X-Content-Type-Options\": \"nosniff\",\n    \"X-Markdown-Tokens\": String(tokens),\n    \"Vary\": \"Accept\",\n    \"Cache-Control\": options.cacheControl ?? DEFAULT_CACHE_CONTROL,\n    \"X-AEO-Version\": \"1.0\",\n  });\n\n  if (options.noindex !== false) {\n    headers.set(\"X-Robots-Tag\", \"noindex\");\n  }\n\n  if (options.redirectFrom) headers.set(\"X-Redirect-From\", options.redirectFrom);\n  if (options.redirectTo) headers.set(\"X-Redirect-To\", options.redirectTo);\n\n  if (options.extraHeaders) {\n    const extra = new Headers(options.extraHeaders);\n    extra.forEach((value, key) => headers.set(key, value));\n  }\n\n  return new Response(normalized, {\n    status: options.status ?? 200,\n    headers,\n  });\n}\n\nexport function injectMarkdownAlternateLink(\n  response: Response,\n  htmlUrl: string,\n  mdUrl: string,\n): Response {\n  const headers = new Headers(response.headers);\n  const link = `<${mdUrl}>; rel=\"alternate\"; type=\"text/markdown\"`;\n  const existing = headers.get(\"Link\");\n  headers.set(\"Link\", existing ? `${existing}, ${link}` : link);\n  const vary = headers.get(\"Vary\");\n  if (!vary) {\n    headers.set(\"Vary\", \"Accept\");\n  } else if (!vary.split(\",\").map((s) => s.trim().toLowerCase()).includes(\"accept\")) {\n    headers.set(\"Vary\", `${vary}, Accept`);\n  }\n  void htmlUrl;\n  return new Response(response.body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n\nexport function renderLinkAlternateHeader(htmlUrl: string, mdUrl: string): string {\n  void htmlUrl;\n  return `<${mdUrl}>; rel=\"alternate\"; type=\"text/markdown\"`;\n}\n","/**\n * URL path utilities for the AEO markdown twin convention.\n *\n * Every HTML page at `/foo` has a markdown twin at `/foo.md`.\n * Root `/` maps to `/index.md`.\n *\n * Both helpers are idempotent: calling them on an already-`.md`\n * path returns it unchanged.\n */\n\n/**\n * Convert a URL pathname to its markdown-twin pathname.\n *\n *   \"/\"           → \"/index.md\"\n *   \"\"            → \"/index.md\"\n *   \"/blog/\"      → \"/blog.md\"\n *   \"/blog/post\"  → \"/blog/post.md\"\n *   \"/blog/x.md\"  → \"/blog/x.md\"   (idempotent)\n */\nexport function toMarkdownPath(pathname: string): string {\n  // Strip trailing slashes before the `.md` check, otherwise a markdown path\n  // with a trailing slash (e.g. \"/blog/post.md/\") defeats the idempotency\n  // guard and gets a doubled extension (\"/blog/post.md.md\").\n  const trimmed = pathname.replace(/\\/+$/, \"\");\n  if (trimmed === \"\") return \"/index.md\";\n  if (trimmed.endsWith(\".md\")) return trimmed;\n  return trimmed + \".md\";\n}\n\n/**\n * Convert a full URL (string or URL) to its markdown-twin URL.\n * Preserves origin, search, and hash.\n *\n *   \"https://x.com/blog?q=1\" → \"https://x.com/blog.md?q=1\"\n *   \"https://x.com/\"         → \"https://x.com/index.md\"\n *   \"https://x.com/blog.md\"  → \"https://x.com/blog.md\"   (idempotent)\n */\nexport function toMarkdownUrl(input: string | URL): string {\n  const u = typeof input === \"string\" ? new URL(input) : new URL(input.toString());\n  u.pathname = toMarkdownPath(u.pathname);\n  return u.toString();\n}\n","export type BotPurpose = \"training\" | \"search\" | \"user-action\" | \"unknown\";\n\nexport interface AIBotEntry {\n  name: string;\n  uaPattern: string | RegExp;\n  vendor: string;\n  purpose: BotPurpose;\n  docsUrl?: string;\n}\n\nexport interface AIBotInfo {\n  isBot: boolean;\n  name: string | null;\n  vendor: string | null;\n  purpose: BotPurpose | null;\n}\n\nexport const AI_BOTS: ReadonlyArray<AIBotEntry> = [\n  {\n    name: \"GPTBot\",\n    uaPattern: \"GPTBot\",\n    vendor: \"OpenAI\",\n    purpose: \"training\",\n    docsUrl: \"https://platform.openai.com/docs/gptbot\",\n  },\n  {\n    name: \"ChatGPT-User\",\n    uaPattern: \"ChatGPT-User\",\n    vendor: \"OpenAI\",\n    purpose: \"user-action\",\n    docsUrl: \"https://platform.openai.com/docs/bots\",\n  },\n  {\n    name: \"OAI-SearchBot\",\n    uaPattern: \"OAI-SearchBot\",\n    vendor: \"OpenAI\",\n    purpose: \"search\",\n    docsUrl: \"https://platform.openai.com/docs/bots\",\n  },\n  {\n    name: \"ClaudeBot\",\n    uaPattern: \"ClaudeBot\",\n    vendor: \"Anthropic\",\n    purpose: \"training\",\n    docsUrl: \"https://support.anthropic.com/en/articles/8896518\",\n  },\n  {\n    name: \"Anthropic-ai\",\n    uaPattern: \"Anthropic-ai\",\n    vendor: \"Anthropic\",\n    purpose: \"training\",\n  },\n  {\n    name: \"Claude-Web\",\n    uaPattern: \"Claude-Web\",\n    vendor: \"Anthropic\",\n    purpose: \"user-action\",\n  },\n  {\n    name: \"Claude-SearchBot\",\n    uaPattern: \"Claude-SearchBot\",\n    vendor: \"Anthropic\",\n    purpose: \"search\",\n    docsUrl: \"https://support.anthropic.com/en/articles/8896518\",\n  },\n  {\n    name: \"Claude-User\",\n    uaPattern: \"Claude-User\",\n    vendor: \"Anthropic\",\n    purpose: \"user-action\",\n    docsUrl: \"https://support.anthropic.com/en/articles/8896518\",\n  },\n  {\n    name: \"PerplexityBot\",\n    uaPattern: \"PerplexityBot\",\n    vendor: \"Perplexity\",\n    purpose: \"search\",\n    docsUrl: \"https://docs.perplexity.ai/guides/bots\",\n  },\n  {\n    name: \"Perplexity-User\",\n    uaPattern: \"Perplexity-User\",\n    vendor: \"Perplexity\",\n    purpose: \"user-action\",\n    docsUrl: \"https://docs.perplexity.ai/guides/bots\",\n  },\n  {\n    name: \"Google-Extended\",\n    uaPattern: \"Google-Extended\",\n    vendor: \"Google\",\n    purpose: \"training\",\n    docsUrl: \"https://developers.google.com/search/docs/crawling-indexing/google-extended\",\n  },\n  {\n    name: \"Applebot-Extended\",\n    uaPattern: \"Applebot-Extended\",\n    vendor: \"Apple\",\n    purpose: \"training\",\n    docsUrl: \"https://support.apple.com/en-us/119829\",\n  },\n  {\n    name: \"cohere-ai\",\n    uaPattern: \"cohere-ai\",\n    vendor: \"Cohere\",\n    purpose: \"training\",\n  },\n  {\n    name: \"CCBot\",\n    uaPattern: \"CCBot\",\n    vendor: \"Common Crawl\",\n    purpose: \"training\",\n    docsUrl: \"https://commoncrawl.org/ccbot\",\n  },\n  {\n    name: \"Bytespider\",\n    uaPattern: \"Bytespider\",\n    vendor: \"ByteDance\",\n    purpose: \"training\",\n  },\n  {\n    name: \"DeepSeekBot\",\n    uaPattern: \"DeepSeekBot\",\n    vendor: \"DeepSeek\",\n    purpose: \"training\",\n  },\n  {\n    name: \"Amazonbot\",\n    uaPattern: \"Amazonbot\",\n    vendor: \"Amazon\",\n    purpose: \"training\",\n    docsUrl: \"https://developer.amazon.com/amazonbot\",\n  },\n  {\n    name: \"YouBot\",\n    uaPattern: \"YouBot\",\n    vendor: \"You.com\",\n    purpose: \"search\",\n  },\n  {\n    name: \"Diffbot\",\n    uaPattern: \"Diffbot\",\n    vendor: \"Diffbot\",\n    purpose: \"training\",\n  },\n  {\n    name: \"ImagesiftBot\",\n    uaPattern: \"ImagesiftBot\",\n    vendor: \"ImageSift\",\n    purpose: \"training\",\n  },\n  {\n    name: \"Omgilibot\",\n    uaPattern: \"Omgilibot\",\n    vendor: \"Webz.io\",\n    purpose: \"training\",\n  },\n  {\n    name: \"DuckAssistBot\",\n    uaPattern: \"DuckAssistBot\",\n    vendor: \"DuckDuckGo\",\n    purpose: \"search\",\n  },\n  {\n    name: \"Meta-ExternalAgent\",\n    uaPattern: \"meta-externalagent\",\n    vendor: \"Meta\",\n    purpose: \"training\",\n  },\n  {\n    name: \"Meta-ExternalFetcher\",\n    uaPattern: \"meta-externalfetcher\",\n    vendor: \"Meta\",\n    purpose: \"user-action\",\n  },\n];\n\nfunction matches(ua: string, pattern: string | RegExp): boolean {\n  if (typeof pattern === \"string\") {\n    return ua.toLowerCase().includes(pattern.toLowerCase());\n  }\n  return pattern.test(ua);\n}\n\nexport function detectAIBot(userAgent: string): AIBotInfo {\n  if (!userAgent) {\n    return { isBot: false, name: null, vendor: null, purpose: null };\n  }\n  for (const entry of AI_BOTS) {\n    if (matches(userAgent, entry.uaPattern)) {\n      return {\n        isBot: true,\n        name: entry.name,\n        vendor: entry.vendor,\n        purpose: entry.purpose,\n      };\n    }\n  }\n  return { isBot: false, name: null, vendor: null, purpose: null };\n}\n","import { normalizeUnicode } from \"./text.js\";\n\nexport interface ListingItem {\n  title: string;\n  href: string;\n  description?: string;\n}\n\nexport interface ListingOptions {\n  title: string;\n  description: string;\n  url: string;\n  items: ListingItem[];\n  groupBy?: (item: ListingItem) => string;\n  footer?: string;\n}\n\nexport function listingToMarkdown(opts: ListingOptions): string {\n  const parts: string[] = [\n    `# ${opts.title}`,\n    `\\n> ${opts.description}`,\n    `\\n- **URL**: ${opts.url}`,\n    \"\\n---\\n\",\n  ];\n\n  if (opts.groupBy) {\n    const groups = new Map<string, ListingItem[]>();\n    for (const item of opts.items) {\n      const key = opts.groupBy(item);\n      const existing = groups.get(key);\n      if (existing) {\n        existing.push(item);\n      } else {\n        groups.set(key, [item]);\n      }\n    }\n    for (const [groupName, items] of groups) {\n      parts.push(`\\n## ${groupName}\\n`);\n      for (const item of items) {\n        parts.push(formatItem(item));\n      }\n    }\n  } else {\n    for (const item of opts.items) {\n      parts.push(formatItem(item));\n    }\n  }\n\n  if (opts.footer) {\n    parts.push(\"\");\n    parts.push(opts.footer);\n  }\n\n  return normalizeUnicode(parts.join(\"\\n\"));\n}\n\nfunction formatItem(item: ListingItem): string {\n  return item.description\n    ? `- [${item.title}](${item.href}): ${item.description}`\n    : `- [${item.title}](${item.href})`;\n}\n\nexport interface RelatedLinksGroup {\n  title: string;\n  href: string;\n}\n\nexport interface RelatedLinks {\n  siblings?: RelatedLinksGroup[];\n  parent?: RelatedLinksGroup;\n  comparisons?: RelatedLinksGroup[];\n  glossary?: RelatedLinksGroup[];\n  blogs?: RelatedLinksGroup[];\n  docs?: RelatedLinksGroup[];\n  custom?: RelatedLinksGroup[];\n}\n\nexport function renderRelatedLinks(related: RelatedLinks): string {\n  const sections: string[] = [];\n\n  const renderGroup = (label: string, links?: RelatedLinksGroup[]) => {\n    if (!links || links.length === 0) return;\n    const formatted = links.map((l) => `[${l.title}](${l.href})`).join(\" | \");\n    sections.push(`**${label}:** ${formatted}`);\n  };\n\n  renderGroup(\"Related features\", related.siblings);\n  if (related.parent) {\n    sections.push(`**Section:** [${related.parent.title}](${related.parent.href})`);\n  }\n  renderGroup(\"Comparisons\", related.comparisons);\n  renderGroup(\"Glossary\", related.glossary);\n  renderGroup(\"Further reading\", related.blogs);\n  renderGroup(\"Documentation\", related.docs);\n  renderGroup(\"See also\", related.custom);\n\n  if (sections.length === 0) return \"\";\n  return [\"\\n## Related Pages\\n\", ...sections].join(\"\\n\");\n}\n\nexport interface FAQItem {\n  question: string;\n  answer: string;\n}\n\nexport function renderFAQSection(faqs: FAQItem[]): string {\n  if (!faqs || faqs.length === 0) return \"\";\n  const parts = [\"\\n## FAQ\\n\"];\n  for (const faq of faqs) {\n    parts.push(`### ${faq.question}\\n`);\n    parts.push(`${faq.answer}\\n`);\n  }\n  return parts.join(\"\\n\");\n}\n\nexport interface PlatformFooter {\n  brand: string;\n  tagline?: string;\n  links: Array<{ title: string; href: string }>;\n}\n\nexport function renderPlatformFooter(footer: PlatformFooter): string {\n  const linkLine = footer.links.map((l) => `[${l.title}](${l.href})`).join(\" | \");\n  const parts = [\"\\n---\\n\"];\n  if (footer.tagline) {\n    parts.push(`**${footer.brand}** -- ${footer.tagline}`);\n  } else {\n    parts.push(`**${footer.brand}**`);\n  }\n  parts.push(linkLine);\n  return parts.join(\"\\n\");\n}\n","export interface LlmsTxtSection {\n  title: string;\n  description?: string;\n  links: Array<{ title: string; href: string; description?: string }>;\n}\n\nexport interface LlmsTxtOptions {\n  brandName: string;\n  description?: string;\n  sections: LlmsTxtSection[];\n}\n\nexport function renderLlmsTxt(opts: LlmsTxtOptions): string {\n  const lines: string[] = [`# ${opts.brandName}`, \"\"];\n\n  if (opts.description) {\n    lines.push(`> ${opts.description}`);\n    lines.push(\"\");\n  }\n\n  for (const section of opts.sections) {\n    lines.push(`## ${section.title}`);\n    lines.push(\"\");\n    if (section.description) {\n      lines.push(section.description);\n      lines.push(\"\");\n    }\n    for (const link of section.links) {\n      const desc = link.description ? `: ${link.description}` : \"\";\n      lines.push(`- [${link.title}](${link.href})${desc}`);\n    }\n    lines.push(\"\");\n  }\n\n  return lines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim() + \"\\n\";\n}\n","export {\n  parseAcceptHeader,\n  mediaTypeMatches,\n  negotiateFormat,\n  shouldServeMarkdown,\n  type ParsedMediaType,\n} from \"./negotiation.js\";\n\nexport {\n  estimateTokens,\n  setTokenEstimator,\n  resetTokenEstimator,\n  type TokenEstimator,\n  type EstimateTokensOptions,\n} from \"./tokens.js\";\n\nexport {\n  normalizeUnicode,\n  cleanBody,\n  slugToTitle,\n  fmtDate,\n  joinLines,\n  type CleanBodyOptions,\n} from \"./text.js\";\n\nexport {\n  markdownResponse,\n  injectMarkdownAlternateLink,\n  type MarkdownResponseOptions,\n} from \"./markdown.js\";\n\nexport { toMarkdownPath, toMarkdownUrl } from \"./paths.js\";\n\nexport {\n  AI_BOTS,\n  detectAIBot,\n  type AIBotEntry,\n  type AIBotInfo,\n  type BotPurpose,\n} from \"./bots.js\";\n\nexport {\n  listingToMarkdown,\n  renderRelatedLinks,\n  renderFAQSection,\n  type ListingItem,\n  type ListingOptions,\n  type RelatedLinks,\n  type RelatedLinksGroup,\n  type FAQItem,\n  type PlatformFooter,\n} from \"./composition.js\";\n\nexport {\n  renderLlmsTxt,\n  type LlmsTxtSection,\n  type LlmsTxtOptions,\n} from \"./llms-txt.js\";\n\nexport type {\n  TrailingSlashMode,\n  AIRequestInfo,\n  MissInfo,\n} from \"./analytics.js\";\n\nexport const AEO_SPEC_VERSION = \"1.0\";\n"]}