llm-message-react 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -146,7 +146,15 @@ function repairIncompleteMath(text, showUnfinishedLatexBlocks) {
146
146
  display: true
147
147
  });
148
148
  } else {
149
- const masked = text.replace(/\$\$/g, " ");
149
+ let masked = text.replace(/\$\$/g, " ");
150
+ masked = masked.replace(
151
+ /(?<!\\)\$(?!\$)[^$\n]*?\\[a-zA-Z][^$\n]*?\$/g,
152
+ (m) => " ".repeat(m.length)
153
+ );
154
+ masked = masked.replace(
155
+ /(?<!\\)\$(?!\$)\d[\d\s.,+\-*/=]*\$/g,
156
+ (m) => " ".repeat(m.length)
157
+ );
150
158
  let lastDollar = -1;
151
159
  for (const match of masked.matchAll(/(?<!\\)\$(?!\d)/g)) {
152
160
  lastDollar = match.index;
@@ -405,7 +413,7 @@ function preprocessLaTeX(content) {
405
413
  );
406
414
  const latexExpressions = [];
407
415
  content = content.replace(
408
- /(\$\$[\s\S]*?\$\$|\\\[[\s\S]*?\\\]|\\\(.*?\\\))/g,
416
+ /(\$\$[\s\S]*?\$\$|\\\[[\s\S]*?\\\]|\\\(.*?\\\)|\$(?!\$)[^$\n]*?\\[a-zA-Z][^$\n]*?\$|\$(?!\$)\d[\d\s.,+\-*/=]*\$)/g,
409
417
  (match) => {
410
418
  latexExpressions.push(match);
411
419
  return `<<LATEX_${latexExpressions.length - 1}>>`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/completePartialTokens.ts","../src/CopyButton.tsx","../src/preprocess.ts","../src/LLMMessage.tsx","../src/createShikiHighlighter.tsx"],"names":["katex","jsxs","jsx","useState","useRef","useEffect","remarkGfm","remarkMath","rehypeKatex","clsx","Fragment","useMemo","ReactMarkdown"],"mappings":"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","file":"index.cjs","sourcesContent":["import katex from \"katex\";\n\n/** Options controlling how {@link completePartialTokens} repairs the stream. */\nexport interface CompletePartialTokensOptions {\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) by closing\n * the open constructs and keeping the largest prefix KaTeX accepts. This is\n * convenient (a long block reveals row by row) but costs a synchronous KaTeX\n * parse on every chunk while the block streams. Set to `false` to instead\n * hide the block entirely until its closing delimiter arrives, skipping the\n * KaTeX work. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n}\n\n/**\n * Repairs partially-streamed markdown / LaTeX so that incomplete syntax does\n * not leak raw delimiter characters into the rendered output.\n *\n * While an LLM streams a response, the text often ends mid-token, e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2` or `\\(a + b`. Rendered\n * as-is, those dangling delimiters show up as literal junk (`**`, `` ` ``, `[`,\n * `$`, `\\(`). This function detects the unterminated constructs at the tail of\n * the string and:\n * - closes safe inline formatting so it renders as intended (`**bold` →\n * `**bold**`, `` `code `` → `` `code` ``);\n * - hides fragments that cannot be completed yet, namely incomplete links and\n * incomplete inline math (`$…`, `\\(…`);\n * - progressively renders incomplete *block* math (`\\[…`, `$$…`): instead of\n * hiding the whole block until it finishes streaming, it closes the open\n * environments/braces and renders the largest prefix KaTeX accepts, so a\n * long aligned block reveals row by row instead of popping in at the end.\n *\n * It is a no-op for already-complete text, so it is safe to run on every chunk.\n *\n * @param text The (possibly mid-stream) markdown string.\n * @returns The string with trailing incomplete tokens repaired.\n */\nexport function completePartialTokens(\n text: string,\n options?: CompletePartialTokensOptions,\n): string {\n if (!text) return text;\n\n const showUnfinishedLatexBlocks = options?.showUnfinishedLatexBlocks ?? true;\n\n // An unterminated fenced code block is fine on its own: remark renders it to\n // the end of the document and the partial content reads correctly as code,\n // so we must not touch any of the (markdown-looking) characters inside it.\n if (hasUnclosedCodeFence(text)) {\n return text;\n }\n\n const protectedSpans: string[] = [];\n const protect = (value: string): string =>\n `\\u0000llmph${protectedSpans.push(value) - 1}\\u0000`;\n\n // Protect complete fenced code blocks and complete inline code spans so their\n // contents are never mistaken for markdown/LaTeX markers. Double-backtick\n // spans are protected before single-backtick ones so a span that itself\n // contains a backtick (`` a`b ``) is not mangled by the single-backtick pass.\n let working = text.replace(/```[\\s\\S]*?```/g, (match) => protect(match));\n working = working.replace(/``[\\s\\S]*?``/g, (match) => protect(match));\n working = working.replace(/`[^`\\n]+`/g, (match) => protect(match));\n\n // A leftover single backtick starts an unterminated inline code span. Protect\n // the rest of the line and close it so the in-progress code renders cleanly.\n const lastBacktick = working.lastIndexOf(\"`\");\n if (lastBacktick !== -1) {\n // Bound the in-progress span to its own line so trailing markdown on later\n // lines is not swallowed into the protected code.\n const newline = working.indexOf(\"\\n\", lastBacktick);\n const end = newline === -1 ? working.length : newline;\n const span = working.slice(lastBacktick, end);\n working =\n working.slice(0, lastBacktick) +\n protect(`${span}\\``) +\n working.slice(end);\n }\n\n working = repairIncompleteMath(working, showUnfinishedLatexBlocks);\n working = hideIncompleteLink(working);\n working = completePartialTable(working);\n working = hideDanglingListMarker(working);\n working = closeUnbalancedEmphasis(working);\n\n return working.replace(\n /\\u0000llmph(\\d+)\\u0000/g,\n (_match, index: string) => protectedSpans[Number(index)] ?? \"\",\n );\n}\n\n/**\n * Completes a partially-streamed GFM table delimiter row.\n *\n * A table needs a full delimiter row (`| --- | --- |`) to be recognised, so\n * while it streams the buffer ends with a header row followed by a fragment like\n * `| ---`. Without a valid delimiter remark-gfm collapses both lines into a\n * paragraph (\"| Feature | Works | | ---\"). Once a delimiter fragment appears we\n * already know the column count from the header, so we expand the fragment to a\n * complete delimiter, preserving any alignment colons that have streamed in.\n */\nfunction completePartialTable(text: string): string {\n const lines = text.split(\"\\n\");\n if (lines.length < 2) return text;\n\n const last = lines[lines.length - 1];\n // The candidate delimiter must contain only delimiter characters and at least\n // one dash; anything else (letters, etc.) means it is a header or body row.\n if (!/-/.test(last) || !/^[\\s|:-]*$/.test(last)) return text;\n\n const header = lines[lines.length - 2];\n if (!header.includes(\"|\")) return text;\n\n // If the table already has a delimiter row at or above the candidate, then\n // the candidate is just a body row that happens to contain only dashes/pipes\n // (not a streaming delimiter), so the table is complete and must be left\n // untouched. Walk up the contiguous block of pipe rows to detect that.\n for (let i = lines.length - 2; i >= 0; i--) {\n const line = lines[i];\n if (!line.includes(\"|\")) break;\n if (/-/.test(line) && /^[\\s|:-]*$/.test(line)) return text;\n }\n\n const columns = countTableColumns(header);\n lines[lines.length - 1] = buildDelimiterRow(last, columns);\n return lines.join(\"\\n\");\n}\n\n/** Counts the cells in a GFM table row, ignoring the outer pipes. */\nfunction countTableColumns(row: string): number {\n let inner = row.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n return inner.split(\"|\").length;\n}\n\n/**\n * Builds a delimiter row with `columns` cells, reusing any alignment colons\n * already present in the streamed fragment.\n */\nfunction buildDelimiterRow(fragment: string, columns: number): string {\n let inner = fragment.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n const existing = inner.split(\"|\").map((cell) => cell.trim());\n\n const cells = Array.from({ length: columns }, (_unused, index) => {\n const spec = existing[index] ?? \"\";\n const left = spec.startsWith(\":\");\n const right = spec.endsWith(\":\");\n if (left && right) return \":---:\";\n if (right) return \"---:\";\n if (left) return \":---\";\n return \"---\";\n });\n\n return `| ${cells.join(\" | \")} |`;\n}\n\n/**\n * Hides a trailing line that would be parsed as a setext heading underline.\n *\n * Mid-stream a bullet list arrives a character at a time, so the buffer briefly\n * ends with `paragraph\\n-` before the item text follows. In CommonMark a lone\n * run of dashes directly beneath a non-blank line is a setext H2 underline, so\n * a line like \"Unordered list:\" would flash as a heading until \"- Item\" streams\n * in. We drop the dangling marker until it gains content. A blank line above the\n * dashes makes them a thematic break instead, which is left untouched.\n */\nfunction hideDanglingListMarker(text: string): string {\n const match = text.match(/\\n[ \\t]{0,3}-+[ \\t]*$/);\n if (match?.index == null) return text;\n\n const before = text.slice(0, match.index);\n const prevLine = before.slice(before.lastIndexOf(\"\\n\") + 1);\n if (prevLine.trim() === \"\") return text;\n\n return before;\n}\n\n/**\n * True when a code fence is left open. Backtick (```) and tilde (~~~) fences are\n * counted separately so that a complete block of one kind that happens to\n * contain a line of the other kind is not mistaken for an unbalanced fence.\n */\nfunction hasUnclosedCodeFence(text: string): boolean {\n const backticks = (text.match(/^[ \\t]{0,3}```/gm) ?? []).length;\n const tildes = (text.match(/^[ \\t]{0,3}~~~/gm) ?? []).length;\n return backticks % 2 === 1 || tildes % 2 === 1;\n}\n\n/**\n * Drops a trailing, still-incomplete link or image, e.g. `[label`, `![alt` or\n * `[label](http`. Closed bracket fragments such as `arr[i]` or `[label]` are\n * left untouched to avoid hiding legitimate text.\n */\nfunction hideIncompleteLink(text: string): string {\n // Find the last \"[\" that is not an escaped LaTeX delimiter (\"\\[\").\n let open = -1;\n for (let i = text.length - 1; i >= 0; i--) {\n if (text[i] === \"[\" && text[i - 1] !== \"\\\\\") {\n open = i;\n break;\n }\n }\n if (open === -1) return text;\n\n const start = open > 0 && text[open - 1] === \"!\" ? open - 1 : open;\n const rest = text.slice(open);\n\n // Label is still open: \"[lab\" / \"![al\".\n if (!rest.includes(\"]\")) {\n return text.slice(0, start);\n }\n // Label closed, destination opened but not yet closed: \"[lab](http\".\n if (/^\\[[^\\]]*\\]\\([^)]*$/.test(rest)) {\n return text.slice(0, start);\n }\n return text;\n}\n\n/** A math delimiter that has been opened but not yet closed in the stream. */\ninterface OpenMath {\n /** Index of the opening delimiter in the source string. */\n index: number;\n /** The opening delimiter itself, e.g. `\"\\\\[\"` or `\"$$\"`. */\n open: string;\n /** The closing delimiter to append once repaired, empty for inline math. */\n close: string;\n /** Whether the math is block (display) math we try to render progressively. */\n block: boolean;\n /** Whether to render in KaTeX display mode when validating a candidate. */\n display: boolean;\n}\n\n/**\n * Repairs an unterminated LaTeX region at the tail of the stream.\n *\n * Inline math (`$…`, `\\(…`) is short, so it is simply hidden until it finishes\n * streaming. Block math (`\\[…`, `$$…`) is instead rendered progressively: we\n * close any open environments/braces and keep the largest leading slice that\n * KaTeX can parse, so a multi-line block reveals itself as it streams instead\n * of staying blank until the closing delimiter finally arrives.\n */\nfunction repairIncompleteMath(\n text: string,\n showUnfinishedLatexBlocks: boolean,\n): string {\n const countOf = (pattern: RegExp): number =>\n (text.match(pattern) ?? []).length;\n\n const opens: OpenMath[] = [];\n\n // Display math: \\[ ... \\]\n if (countOf(/\\\\\\[/g) > countOf(/\\\\\\]/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\[\"),\n open: \"\\\\[\",\n close: \"\\\\]\",\n block: true,\n display: true,\n });\n }\n\n // Inline math: \\( ... \\)\n if (countOf(/\\\\\\(/g) > countOf(/\\\\\\)/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\(\"),\n open: \"\\\\(\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n\n if (countOf(/\\$\\$/g) % 2 === 1) {\n // Display math: $$ ... $$\n opens.push({\n index: text.lastIndexOf(\"$$\"),\n open: \"$$\",\n close: \"$$\",\n block: true,\n display: true,\n });\n } else {\n // Inline math: $ ... $. Mask complete \"$$\" pairs (keeping indices stable),\n // then ignore escaped \"\\$\" and currency like \"$5\" to avoid false positives.\n const masked = text.replace(/\\$\\$/g, \" \");\n let lastDollar = -1;\n for (const match of masked.matchAll(/(?<!\\\\)\\$(?!\\d)/g)) {\n lastDollar = match.index;\n }\n const singles = masked.match(/(?<!\\\\)\\$(?!\\d)/g) ?? [];\n if (singles.length % 2 === 1 && lastDollar !== -1) {\n opens.push({\n index: lastDollar,\n open: \"$\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n }\n\n const valid = opens.filter((entry) => entry.index >= 0);\n if (valid.length === 0) return text;\n\n // The earliest opener marks where the incomplete math region begins; anything\n // after it is part of the unterminated construct.\n const open = valid.reduce((a, b) => (b.index < a.index ? b : a));\n const before = text.slice(0, open.index);\n\n if (!open.block) {\n // Inline math is hidden until it finishes streaming.\n return before;\n }\n\n // When progressive block rendering is disabled, hide the unterminated block\n // until its closing delimiter arrives, skipping the KaTeX validation cost.\n if (!showUnfinishedLatexBlocks) {\n return before;\n }\n\n const inner = text.slice(open.index + open.open.length);\n const body = bestRenderableMathBody(inner, open.display);\n if (body == null) return before;\n\n // Reproduce the original fenced layout so the markdown math parser can detect\n // the closing delimiter. When the block opens on its own line (`\\[\\n…`), the\n // closing delimiter must also sit on its own line; otherwise micromark treats\n // the run as inline math, never finds the closing fence, and KaTeX renders a\n // parse error that swallows the trailing delimiter.\n const blockLayout = /^[ \\t]*\\r?\\n/.test(inner);\n if (!blockLayout) {\n return before + open.open + body + open.close;\n }\n const opener =\n before === \"\" || before.endsWith(\"\\n\") ? open.open : `\\n${open.open}`;\n return `${before}${opener}${body.replace(/\\s+$/, \"\")}\\n${open.close}`;\n}\n\n/**\n * Returns the largest leading slice of incomplete block-math content that KaTeX\n * can render, with its open environments and braces closed, or `null` when no\n * usable prefix exists yet (in which case the caller hides the fragment).\n *\n * When an environment is still open (e.g. `\\begin{aligned}` mid-stream) we\n * prefer revealing only the complete rows so each equation appears fully formed,\n * falling back to a token-level repair so single-line blocks still stream in.\n */\nfunction bestRenderableMathBody(\n inner: string,\n display: boolean,\n): string | null {\n const candidates = unclosedEnvironments(inner).length > 0\n ? [closeOpenMathConstructs(truncateToLastRow(inner)), closeOpenMathConstructs(trimIncompleteMathTail(inner))]\n : [closeOpenMathConstructs(trimIncompleteMathTail(inner))];\n\n for (const candidate of candidates) {\n if (!hasRenderableMathContent(candidate)) continue;\n if (isRenderableMath(candidate, display)) return candidate;\n }\n return null;\n}\n\n/** True when a math body contains something other than empty environment scaffolding. */\nfunction hasRenderableMathContent(body: string): boolean {\n const stripped = body\n .replace(/\\\\(?:begin|end)\\s*\\{[^}]*\\}/g, \"\")\n .replace(/[\\s{}]/g, \"\");\n return stripped.length > 0;\n}\n\n/**\n * True when KaTeX can render the math body without raising a parse error.\n *\n * Uses the public, stable `renderToString` entry point (with `throwOnError`)\n * rather than any internal parse-only API, so it keeps working across KaTeX\n * upgrades. We only care whether it throws; the produced string is discarded.\n */\nfunction isRenderableMath(body: string, display: boolean): boolean {\n try {\n katex.renderToString(body, {\n displayMode: display,\n throwOnError: true,\n strict: false,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keeps only the complete rows of a multi-line environment by cutting back to\n * the last row separator (`\\\\`), dropping the partially-streamed current row.\n * Returns an empty string when no full row has streamed yet.\n */\nfunction truncateToLastRow(inner: string): string {\n const lastRow = inner.lastIndexOf(\"\\\\\\\\\");\n if (lastRow === -1) return \"\";\n return inner.slice(0, lastRow + 2);\n}\n\n/**\n * Drops trailing tokens that cannot render on their own yet: surrounding\n * whitespace, a dangling backslash, an in-progress control word (`\\frac` may\n * still be `\\fra`), and a subscript/superscript with no argument. A complete\n * `\\\\` row separator is preserved.\n */\nfunction trimIncompleteMathTail(inner: string): string {\n let result = inner;\n let previous: string;\n do {\n previous = result;\n result = result.replace(/\\s+$/, \"\");\n // A trailing odd run of backslashes ends in a lone \"\\\" (an incomplete \"\\\\\"\n // or the start of a command); drop it. An even run is complete \"\\\\\".\n const backslashes = result.match(/\\\\+$/);\n if (backslashes != null && backslashes[0].length % 2 === 1) {\n result = result.slice(0, -1);\n }\n // A trailing control word is ambiguous mid-stream; drop it so it cannot be\n // an unknown (and therefore error-rendered) command.\n result = result.replace(/\\\\[a-zA-Z]+\\*?$/, \"\");\n // A subscript/superscript needs an argument that has not arrived yet.\n result = result.replace(/[_^]$/, \"\");\n } while (result !== previous);\n return result;\n}\n\n/**\n * Closes the constructs left open in a math fragment so KaTeX can parse it:\n * unmatched `\\left`, unbalanced `{` groups, and unclosed environments. Order is\n * a best effort; the caller validates the result with KaTeX regardless.\n */\nfunction closeOpenMathConstructs(inner: string): string {\n let result = inner;\n\n const lefts = (result.match(/\\\\left(?![a-zA-Z])/g) ?? []).length;\n const rights = (result.match(/\\\\right(?![a-zA-Z])/g) ?? []).length;\n result += \"\\\\right.\".repeat(Math.max(0, lefts - rights));\n\n result += \"}\".repeat(openBraceDepth(result));\n\n const environments = unclosedEnvironments(result);\n for (let i = environments.length - 1; i >= 0; i--) {\n result += `\\\\end{${environments[i]}}`;\n }\n return result;\n}\n\n/** Counts unclosed `{` groups, ignoring escaped braces (`\\{`, `\\}`). */\nfunction openBraceDepth(text: string): number {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"{\") depth++;\n else if (char === \"}\" && depth > 0) depth--;\n }\n return depth;\n}\n\n/**\n * Returns the names of environments opened with `\\begin{…}` but not yet closed\n * with a matching `\\end{…}`, outermost first.\n */\nfunction unclosedEnvironments(text: string): string[] {\n const stack: string[] = [];\n const pattern = /\\\\(begin|end)\\s*\\{([^}]*)\\}/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) != null) {\n const name = match[2];\n if (match[1] === \"begin\") {\n stack.push(name);\n } else {\n const index = stack.lastIndexOf(name);\n if (index !== -1) stack.splice(index, 1);\n else stack.pop();\n }\n }\n return stack;\n}\n\n/**\n * Closes unterminated emphasis runs: ~~strike~~, **bold**, *italic*, __bold__\n * and _italic_.\n */\nfunction closeUnbalancedEmphasis(text: string): string {\n let result = text;\n result = closeRunMarker(result, \"~~\");\n // Close a single \"*\" first so a \"***\" opener becomes \"*\" + \"**\" and both\n // halves get closed, yielding a balanced \"***…***\".\n result = closeSingleAsterisk(result);\n result = closeRunMarker(result, \"**\");\n result = closeSingleUnderscore(result);\n result = closeDoubleUnderscore(result);\n return result;\n}\n\n/**\n * True when the marker at `index` begins a delimiter run that could open\n * emphasis: it sits at the start of the string or directly after a non-word\n * character (whitespace or punctuation). Underscores require this so intra-word\n * usage (`snake_case`, `__init__`) is never treated as a dangling emphasis\n * opener.\n */\nfunction opensAtWordBoundary(text: string, index: number): boolean {\n if (index <= 0) return true;\n // Whitespace or punctuation before the marker counts as a boundary; an\n // alphanumeric character (or another underscore) does not, so intra-word\n // usage (`snake_case`, `__init__`) is never treated as a dangling opener\n // while a leading-punctuation case like `(_italic` still closes.\n return !/[\\p{L}\\p{N}_]/u.test(text[index - 1]);\n}\n\n/**\n * Closes a single `_` italic marker. `__` pairs are masked out first, and the\n * marker is only closed when it both opens at a word boundary and sits directly\n * before a non-space character, so `snake_case` is left alone.\n */\nfunction closeSingleUnderscore(text: string): string {\n const masked = text.replace(/__/g, \"\");\n const count = (masked.match(/_/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"_\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s_]/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"_\");\n}\n\n/**\n * Closes a `__` bold marker when it is unbalanced, opens at a word boundary,\n * and is directly followed by a non-space character (so `a__b` and `__init__`\n * are left untouched).\n */\nfunction closeDoubleUnderscore(text: string): string {\n const count = (text.match(/__/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"__\");\n const after = text.slice(lastIndex + 2);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"__\");\n}\n\n/**\n * Closes a two-character emphasis marker (`**` or `~~`) when it is unbalanced\n * and the final marker looks like an opener (immediately followed by a\n * non-space character), which avoids touching list markers or operators.\n */\nfunction closeRunMarker(text: string, marker: string): string {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const count = (text.match(new RegExp(escaped, \"g\")) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(marker);\n const after = text.slice(lastIndex + marker.length);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, marker);\n}\n\n/**\n * Closes a single `*` italic marker. `**` pairs are masked out first, and the\n * marker is only closed when it sits directly before a non-space character so\n * bullet markers (`* item`) and multiplication (`2 * 3`) are left alone.\n */\nfunction closeSingleAsterisk(text: string): string {\n const masked = text.replace(/\\*\\*/g, \"\");\n const count = (masked.match(/\\*/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"*\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s*]/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"*\");\n}\n\n/**\n * Appends a closing emphasis marker, but places it before any trailing\n * whitespace. A closer such as `**` is only valid when it directly follows a\n * non-space character, so `**bold ` must become `**bold** ` rather than the\n * un-renderable `**bold **`.\n */\nfunction insertBeforeTrailingWhitespace(text: string, marker: string): string {\n const trailing = text.match(/\\s+$/)?.[0] ?? \"\";\n const core = text.slice(0, text.length - trailing.length);\n return core + marker + trailing;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { CopyButtonProps } from \"./types\";\n\nfunction CopyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const copy = () => {\n const clipboard = navigator.clipboard;\n if (!clipboard) return;\n // Only show the \"copied\" confirmation once the write actually succeeds.\n void clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard write failed; keep the idle state.\n });\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n className={className}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n data-copied={copied ? \"\" : undefined}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n );\n}\n","/**\n * Matches a fenced code block or an inline code span. Shared by\n * {@link preprocessLaTeX} and {@link escapeBrackets} so both functions treat\n * code identically; composed into the larger patterns below via `.source`.\n */\nconst CODE_SPAN = /```[\\s\\S]*?```|`[^`\\n]+`/;\n\n/**\n * Preprocesses LaTeX content by replacing delimiters and escaping certain characters.\n *\n * @param content The input string containing LaTeX expressions.\n * @returns The processed string with replaced delimiters and escaped characters.\n */\nexport function preprocessLaTeX(content: string): string {\n // Step 1: Protect code blocks\n const codeBlocks: string[] = [];\n content = content.replace(\n new RegExp(`(${CODE_SPAN.source})`, \"g\"),\n (_match, code) => {\n codeBlocks.push(code);\n return `<<CODE_BLOCK_${codeBlocks.length - 1}>>`;\n },\n );\n\n // Step 2: Protect existing LaTeX expressions. This is what makes the currency\n // escaping in Step 3 safe: by pulling complete `$$…$$` / `\\[…\\]` / `\\(…\\)`\n // regions out of the string first, the `\\$(?=\\d)` pass below cannot corrupt a\n // `$` that legitimately belongs to a math expression (e.g. `$$x = $5$$`).\n const latexExpressions: string[] = [];\n content = content.replace(\n /(\\$\\$[\\s\\S]*?\\$\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\))/g,\n (match) => {\n latexExpressions.push(match);\n return `<<LATEX_${latexExpressions.length - 1}>>`;\n },\n );\n\n // Step 3: Escape dollar signs that are likely currency indicators\n content = content.replace(/\\$(?=\\d)/g, \"\\\\$\");\n\n // Step 4: Restore LaTeX expressions\n content = content.replace(\n /<<LATEX_(\\d+)>>/g,\n (_, index) => latexExpressions[parseInt(index, 10)],\n );\n\n // Step 5: Restore code blocks\n content = content.replace(\n /<<CODE_BLOCK_(\\d+)>>/g,\n (_, index) => codeBlocks[parseInt(index, 10)],\n );\n\n // Step 6: Apply additional escaping functions\n content = escapeBrackets(content);\n content = escapeMhchem(content);\n\n return content;\n}\n\nexport function escapeBrackets(text: string): string {\n const pattern = new RegExp(\n `(${CODE_SPAN.source})|` +\n /\\\\\\[((?:[\\s\\S]*?[^\\\\])?)\\\\]|\\\\\\((.*?)\\\\\\)/.source,\n \"g\",\n );\n return text.replace(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock != null) {\n return codeBlock;\n } else if (squareBracket != null) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket != null) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\nexport function escapeMhchem(text: string): string {\n return text.replaceAll(\"$\\\\ce{\", \"$\\\\\\\\ce{\").replaceAll(\"$\\\\pu{\", \"$\\\\\\\\pu{\");\n}\n","import { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeKatex from \"rehype-katex\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nimport { completePartialTokens } from \"./completePartialTokens\";\nimport { CopyButton } from \"./CopyButton\";\nimport { preprocessLaTeX } from \"./preprocess\";\nimport type {\n CodeHighlighter,\n LLMMessageClassNames,\n LLMMessageComponents,\n} from \"./types\";\n\nexport interface LLMMessageProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"content\"> {\n /** The LLM message content as a markdown string. */\n children?: string;\n /** Alias for `children`. */\n content?: string;\n /** Class applied to the root element (merged with the built-in class). */\n className?: string;\n /** Per-element class overrides (merged with the built-in classes). */\n classNames?: LLMMessageClassNames;\n /** Per-element component overrides for full markup control. */\n components?: LLMMessageComponents;\n /**\n * Repair partially-streamed markdown/LaTeX so unterminated tokens (e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2`) do not render as raw\n * delimiter junk while the response is still streaming. Defaults to `true`.\n */\n completePartialTokens?: boolean;\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) while it\n * streams, instead of hiding it until the closing delimiter arrives. This is\n * nicer to watch (a long block reveals row by row) but costs a synchronous\n * KaTeX parse on every chunk that contains an open block. Set to `false` to\n * hide unfinished blocks and skip that work. Only relevant while\n * `completePartialTokens` is enabled. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n /**\n * Optional syntax highlighter for fenced code blocks. When omitted, code\n * blocks render as plain text (so no highlighter bundle is pulled in). Pass\n * `ShikiHighlighter` / `ShikiWebHighlighter`, or build your own with\n * `createShikiHighlighter`.\n */\n highlighter?: CodeHighlighter;\n}\n\nconst remarkPlugins = [remarkGfm, remarkMath];\nconst rehypePlugins = [rehypeKatex];\n\nfunction cx(...inputs: Array<string | undefined>): string | undefined {\n const result = clsx(inputs);\n return result === \"\" ? undefined : result;\n}\n\nfunction buildComponents(\n classNames: LLMMessageClassNames | undefined,\n overrides: LLMMessageComponents | undefined,\n highlighter: CodeHighlighter | undefined,\n): Components {\n const cn = classNames ?? {};\n const o = overrides ?? {};\n const Highlighter = highlighter;\n\n return {\n code({ node: _node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const codeText = String(children).replace(/\\n$/, \"\");\n // A fenced block always spans its own lines (so its text contains a\n // newline) even when no language info string is present; inline code\n // never does. Relying on the `language-` class alone would misrender a\n // bare ``` fence as inline code.\n const isBlock = match != null || String(children).includes(\"\\n\");\n\n if (isBlock) {\n const language = match?.[1] ?? \"\";\n if (o.codeBlock) {\n const CodeBlock = o.codeBlock;\n return (\n <CodeBlock\n code={codeText}\n language={language}\n className={cn.codeBlock}\n />\n );\n }\n return (\n <div className={cx(\"llm-code-block\", cn.codeBlock)}>\n <div className={cx(\"llm-code-header\", cn.codeHeader)}>\n <span className={cx(\"llm-code-language\", cn.codeLanguage)}>\n {language}\n </span>\n {o.copyButton ? (\n <o.copyButton text={codeText} className={cn.copyButton} />\n ) : (\n <CopyButton\n text={codeText}\n className={cx(\"llm-copy-button\", cn.copyButton)}\n />\n )}\n </div>\n <div className=\"llm-code-body\">\n {Highlighter ? (\n <Highlighter code={codeText} language={language} />\n ) : (\n <code className=\"llm-code-plain\">{codeText}</code>\n )}\n </div>\n </div>\n );\n }\n\n if (o.code) {\n const InlineCode = o.code;\n return (\n <InlineCode className={cx(\"llm-code\", cn.code, className)}>\n {children}\n </InlineCode>\n );\n }\n\n return (\n <code className={cx(\"llm-code\", cn.code, className)} {...props}>\n {children}\n </code>\n );\n },\n pre({ children }) {\n if (o.pre) {\n return <o.pre>{children}</o.pre>;\n }\n // Let the code component handle fenced blocks.\n return <>{children}</>;\n },\n table({ children }) {\n if (o.table) {\n return <o.table className={cn.table}>{children}</o.table>;\n }\n return (\n <div className={cx(\"llm-table-wrapper\", cn.tableWrapper)}>\n <table className={cx(\"llm-table\", cn.table)}>{children}</table>\n </div>\n );\n },\n th({ children }) {\n if (o.th) {\n return <o.th className={cn.th}>{children}</o.th>;\n }\n return <th className={cx(\"llm-th\", cn.th)}>{children}</th>;\n },\n td({ children }) {\n if (o.td) {\n return <o.td className={cn.td}>{children}</o.td>;\n }\n return <td className={cx(\"llm-td\", cn.td)}>{children}</td>;\n },\n blockquote({ children }) {\n if (o.blockquote) {\n return <o.blockquote className={cn.blockquote}>{children}</o.blockquote>;\n }\n return (\n <blockquote className={cx(\"llm-blockquote\", cn.blockquote)}>\n {children}\n </blockquote>\n );\n },\n ul({ children }) {\n if (o.ul) {\n return <o.ul className={cn.ul}>{children}</o.ul>;\n }\n return <ul className={cx(\"llm-ul\", cn.ul)}>{children}</ul>;\n },\n ol({ children }) {\n if (o.ol) {\n return <o.ol className={cn.ol}>{children}</o.ol>;\n }\n return <ol className={cx(\"llm-ol\", cn.ol)}>{children}</ol>;\n },\n li({ children }) {\n if (o.li) {\n return <o.li className={cn.li}>{children}</o.li>;\n }\n return <li className={cx(\"llm-li\", cn.li)}>{children}</li>;\n },\n p({ children }) {\n if (o.p) {\n return <o.p className={cn.p}>{children}</o.p>;\n }\n return <p className={cx(\"llm-p\", cn.p)}>{children}</p>;\n },\n h1({ children }) {\n if (o.h1) {\n return <o.h1 className={cn.h1}>{children}</o.h1>;\n }\n return <h1 className={cx(\"llm-h1\", cn.h1)}>{children}</h1>;\n },\n h2({ children }) {\n if (o.h2) {\n return <o.h2 className={cn.h2}>{children}</o.h2>;\n }\n return <h2 className={cx(\"llm-h2\", cn.h2)}>{children}</h2>;\n },\n h3({ children }) {\n if (o.h3) {\n return <o.h3 className={cn.h3}>{children}</o.h3>;\n }\n return <h3 className={cx(\"llm-h3\", cn.h3)}>{children}</h3>;\n },\n h4({ children }) {\n if (o.h4) {\n return <o.h4 className={cn.h4}>{children}</o.h4>;\n }\n return <h4 className={cx(\"llm-h4\", cn.h4)}>{children}</h4>;\n },\n h5({ children }) {\n if (o.h5) {\n return <o.h5 className={cn.h5}>{children}</o.h5>;\n }\n return <h5 className={cx(\"llm-h5\", cn.h5)}>{children}</h5>;\n },\n h6({ children }) {\n if (o.h6) {\n return <o.h6 className={cn.h6}>{children}</o.h6>;\n }\n return <h6 className={cx(\"llm-h6\", cn.h6)}>{children}</h6>;\n },\n input({ node: _node, type, checked, disabled, ...props }) {\n if (type === \"checkbox\") {\n if (o.checkbox) {\n return (\n <o.checkbox checked={Boolean(checked)} className={cn.checkbox} />\n );\n }\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(checked)}\n disabled\n aria-label={checked ? \"Completed task\" : \"Incomplete task\"}\n className={cx(\"llm-checkbox\", cn.checkbox)}\n readOnly\n />\n );\n }\n return (\n <input\n type={type}\n checked={checked}\n disabled={disabled}\n readOnly\n {...props}\n />\n );\n },\n a({ href, children }) {\n if (o.a) {\n return (\n <o.a href={href} className={cn.a}>\n {children}\n </o.a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cx(\"llm-a\", cn.a)}\n >\n {children}\n </a>\n );\n },\n img({ node: _node, src, alt, title, className: _className, ...props }) {\n if (o.img) {\n const Image = o.img;\n return (\n <Image\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cn.img}\n />\n );\n }\n return (\n <img\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cx(\"llm-img\", cn.img)}\n {...props}\n />\n );\n },\n hr() {\n if (o.hr) {\n return <o.hr className={cn.hr} />;\n }\n return <hr className={cx(\"llm-hr\", cn.hr)} />;\n },\n strong({ children }) {\n if (o.strong) {\n return <o.strong className={cn.strong}>{children}</o.strong>;\n }\n return <strong className={cx(\"llm-strong\", cn.strong)}>{children}</strong>;\n },\n em({ children }) {\n if (o.em) {\n return <o.em className={cn.em}>{children}</o.em>;\n }\n return <em className={cx(\"llm-em\", cn.em)}>{children}</em>;\n },\n del({ children }) {\n if (o.del) {\n return <o.del className={cn.del}>{children}</o.del>;\n }\n return <del className={cx(\"llm-del\", cn.del)}>{children}</del>;\n },\n };\n}\n\nexport function LLMMessage({\n children,\n content,\n className,\n classNames,\n components,\n completePartialTokens: repairPartialTokens = true,\n showUnfinishedLatexBlocks = true,\n highlighter,\n ...rest\n}: LLMMessageProps) {\n const source = content ?? children ?? \"\";\n\n const markdownComponents = useMemo(\n () => buildComponents(classNames, components, highlighter),\n [classNames, components, highlighter],\n );\n\n const processed = useMemo(() => {\n const repaired = repairPartialTokens\n ? completePartialTokens(source, { showUnfinishedLatexBlocks })\n : source;\n return preprocessLaTeX(repaired);\n }, [source, repairPartialTokens, showUnfinishedLatexBlocks]);\n\n return (\n <div className={cx(\"llm-message\", classNames?.root, className)} {...rest}>\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n components={markdownComponents}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nimport type { CodeHighlighter, CodeToHtml } from \"./types\";\n\ninterface CreateShikiHighlighterOptions {\n /** Theme pair forwarded to `codeToHtml`. Defaults to GitHub light/dark. */\n themes?: { light: string; dark: string };\n}\n\nconst DEFAULT_THEMES = { light: \"github-light\", dark: \"github-dark\" };\n\n/**\n * Builds a {@link CodeHighlighter} from any `codeToHtml`-compatible function.\n *\n * This factory imports no Shiki bundle itself, so importing it never drags\n * highlighting code into your app. You decide which bundle to pay for by\n * passing the `codeToHtml` from `shiki` (full), `shiki/bundle/web` (web), or a\n * minimal `createHighlighterCore` instance.\n *\n * @example\n * import { codeToHtml } from \"shiki/bundle/web\";\n * const Highlighter = createShikiHighlighter(codeToHtml);\n * <LLMMessage highlighter={Highlighter}>{content}</LLMMessage>\n */\nexport function createShikiHighlighter(\n codeToHtml: CodeToHtml,\n options?: CreateShikiHighlighterOptions,\n): CodeHighlighter {\n const themes = options?.themes ?? DEFAULT_THEMES;\n\n return function ShikiHighlighter({ code, language, className }) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n Promise.resolve(codeToHtml(code, { lang: language, themes }))\n .then((result) => {\n if (!cancelled) setHtml(result);\n })\n .catch(() => {\n // Fallback: if the language is unsupported, just show plain code.\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n // `codeToHtml` and `themes` are fixed for the lifetime of a highlighter\n // instance (captured from the factory closure), so they are intentionally\n // not listed: they never change between renders of this component.\n }, [code, language]);\n\n if (html) {\n return (\n <div\n className={className ?? \"llm-shiki\"}\n // The HTML is generated by Shiki, which is safe.\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n return <code className=\"llm-code-plain\">{code}</code>;\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/completePartialTokens.ts","../src/CopyButton.tsx","../src/preprocess.ts","../src/LLMMessage.tsx","../src/createShikiHighlighter.tsx"],"names":["katex","jsxs","jsx","useState","useRef","useEffect","remarkGfm","remarkMath","rehypeKatex","clsx","Fragment","useMemo","ReactMarkdown"],"mappings":"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","file":"index.cjs","sourcesContent":["import katex from \"katex\";\n\n/** Options controlling how {@link completePartialTokens} repairs the stream. */\nexport interface CompletePartialTokensOptions {\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) by closing\n * the open constructs and keeping the largest prefix KaTeX accepts. This is\n * convenient (a long block reveals row by row) but costs a synchronous KaTeX\n * parse on every chunk while the block streams. Set to `false` to instead\n * hide the block entirely until its closing delimiter arrives, skipping the\n * KaTeX work. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n}\n\n/**\n * Repairs partially-streamed markdown / LaTeX so that incomplete syntax does\n * not leak raw delimiter characters into the rendered output.\n *\n * While an LLM streams a response, the text often ends mid-token, e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2` or `\\(a + b`. Rendered\n * as-is, those dangling delimiters show up as literal junk (`**`, `` ` ``, `[`,\n * `$`, `\\(`). This function detects the unterminated constructs at the tail of\n * the string and:\n * - closes safe inline formatting so it renders as intended (`**bold` →\n * `**bold**`, `` `code `` → `` `code` ``);\n * - hides fragments that cannot be completed yet, namely incomplete links and\n * incomplete inline math (`$…`, `\\(…`);\n * - progressively renders incomplete *block* math (`\\[…`, `$$…`): instead of\n * hiding the whole block until it finishes streaming, it closes the open\n * environments/braces and renders the largest prefix KaTeX accepts, so a\n * long aligned block reveals row by row instead of popping in at the end.\n *\n * It is a no-op for already-complete text, so it is safe to run on every chunk.\n *\n * @param text The (possibly mid-stream) markdown string.\n * @returns The string with trailing incomplete tokens repaired.\n */\nexport function completePartialTokens(\n text: string,\n options?: CompletePartialTokensOptions,\n): string {\n if (!text) return text;\n\n const showUnfinishedLatexBlocks = options?.showUnfinishedLatexBlocks ?? true;\n\n // An unterminated fenced code block is fine on its own: remark renders it to\n // the end of the document and the partial content reads correctly as code,\n // so we must not touch any of the (markdown-looking) characters inside it.\n if (hasUnclosedCodeFence(text)) {\n return text;\n }\n\n const protectedSpans: string[] = [];\n const protect = (value: string): string =>\n `\\u0000llmph${protectedSpans.push(value) - 1}\\u0000`;\n\n // Protect complete fenced code blocks and complete inline code spans so their\n // contents are never mistaken for markdown/LaTeX markers. Double-backtick\n // spans are protected before single-backtick ones so a span that itself\n // contains a backtick (`` a`b ``) is not mangled by the single-backtick pass.\n let working = text.replace(/```[\\s\\S]*?```/g, (match) => protect(match));\n working = working.replace(/``[\\s\\S]*?``/g, (match) => protect(match));\n working = working.replace(/`[^`\\n]+`/g, (match) => protect(match));\n\n // A leftover single backtick starts an unterminated inline code span. Protect\n // the rest of the line and close it so the in-progress code renders cleanly.\n const lastBacktick = working.lastIndexOf(\"`\");\n if (lastBacktick !== -1) {\n // Bound the in-progress span to its own line so trailing markdown on later\n // lines is not swallowed into the protected code.\n const newline = working.indexOf(\"\\n\", lastBacktick);\n const end = newline === -1 ? working.length : newline;\n const span = working.slice(lastBacktick, end);\n working =\n working.slice(0, lastBacktick) +\n protect(`${span}\\``) +\n working.slice(end);\n }\n\n working = repairIncompleteMath(working, showUnfinishedLatexBlocks);\n working = hideIncompleteLink(working);\n working = completePartialTable(working);\n working = hideDanglingListMarker(working);\n working = closeUnbalancedEmphasis(working);\n\n return working.replace(\n /\\u0000llmph(\\d+)\\u0000/g,\n (_match, index: string) => protectedSpans[Number(index)] ?? \"\",\n );\n}\n\n/**\n * Completes a partially-streamed GFM table delimiter row.\n *\n * A table needs a full delimiter row (`| --- | --- |`) to be recognised, so\n * while it streams the buffer ends with a header row followed by a fragment like\n * `| ---`. Without a valid delimiter remark-gfm collapses both lines into a\n * paragraph (\"| Feature | Works | | ---\"). Once a delimiter fragment appears we\n * already know the column count from the header, so we expand the fragment to a\n * complete delimiter, preserving any alignment colons that have streamed in.\n */\nfunction completePartialTable(text: string): string {\n const lines = text.split(\"\\n\");\n if (lines.length < 2) return text;\n\n const last = lines[lines.length - 1];\n // The candidate delimiter must contain only delimiter characters and at least\n // one dash; anything else (letters, etc.) means it is a header or body row.\n if (!/-/.test(last) || !/^[\\s|:-]*$/.test(last)) return text;\n\n const header = lines[lines.length - 2];\n if (!header.includes(\"|\")) return text;\n\n // If the table already has a delimiter row at or above the candidate, then\n // the candidate is just a body row that happens to contain only dashes/pipes\n // (not a streaming delimiter), so the table is complete and must be left\n // untouched. Walk up the contiguous block of pipe rows to detect that.\n for (let i = lines.length - 2; i >= 0; i--) {\n const line = lines[i];\n if (!line.includes(\"|\")) break;\n if (/-/.test(line) && /^[\\s|:-]*$/.test(line)) return text;\n }\n\n const columns = countTableColumns(header);\n lines[lines.length - 1] = buildDelimiterRow(last, columns);\n return lines.join(\"\\n\");\n}\n\n/** Counts the cells in a GFM table row, ignoring the outer pipes. */\nfunction countTableColumns(row: string): number {\n let inner = row.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n return inner.split(\"|\").length;\n}\n\n/**\n * Builds a delimiter row with `columns` cells, reusing any alignment colons\n * already present in the streamed fragment.\n */\nfunction buildDelimiterRow(fragment: string, columns: number): string {\n let inner = fragment.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n const existing = inner.split(\"|\").map((cell) => cell.trim());\n\n const cells = Array.from({ length: columns }, (_unused, index) => {\n const spec = existing[index] ?? \"\";\n const left = spec.startsWith(\":\");\n const right = spec.endsWith(\":\");\n if (left && right) return \":---:\";\n if (right) return \"---:\";\n if (left) return \":---\";\n return \"---\";\n });\n\n return `| ${cells.join(\" | \")} |`;\n}\n\n/**\n * Hides a trailing line that would be parsed as a setext heading underline.\n *\n * Mid-stream a bullet list arrives a character at a time, so the buffer briefly\n * ends with `paragraph\\n-` before the item text follows. In CommonMark a lone\n * run of dashes directly beneath a non-blank line is a setext H2 underline, so\n * a line like \"Unordered list:\" would flash as a heading until \"- Item\" streams\n * in. We drop the dangling marker until it gains content. A blank line above the\n * dashes makes them a thematic break instead, which is left untouched.\n */\nfunction hideDanglingListMarker(text: string): string {\n const match = text.match(/\\n[ \\t]{0,3}-+[ \\t]*$/);\n if (match?.index == null) return text;\n\n const before = text.slice(0, match.index);\n const prevLine = before.slice(before.lastIndexOf(\"\\n\") + 1);\n if (prevLine.trim() === \"\") return text;\n\n return before;\n}\n\n/**\n * True when a code fence is left open. Backtick (```) and tilde (~~~) fences are\n * counted separately so that a complete block of one kind that happens to\n * contain a line of the other kind is not mistaken for an unbalanced fence.\n */\nfunction hasUnclosedCodeFence(text: string): boolean {\n const backticks = (text.match(/^[ \\t]{0,3}```/gm) ?? []).length;\n const tildes = (text.match(/^[ \\t]{0,3}~~~/gm) ?? []).length;\n return backticks % 2 === 1 || tildes % 2 === 1;\n}\n\n/**\n * Drops a trailing, still-incomplete link or image, e.g. `[label`, `![alt` or\n * `[label](http`. Closed bracket fragments such as `arr[i]` or `[label]` are\n * left untouched to avoid hiding legitimate text.\n */\nfunction hideIncompleteLink(text: string): string {\n // Find the last \"[\" that is not an escaped LaTeX delimiter (\"\\[\").\n let open = -1;\n for (let i = text.length - 1; i >= 0; i--) {\n if (text[i] === \"[\" && text[i - 1] !== \"\\\\\") {\n open = i;\n break;\n }\n }\n if (open === -1) return text;\n\n const start = open > 0 && text[open - 1] === \"!\" ? open - 1 : open;\n const rest = text.slice(open);\n\n // Label is still open: \"[lab\" / \"![al\".\n if (!rest.includes(\"]\")) {\n return text.slice(0, start);\n }\n // Label closed, destination opened but not yet closed: \"[lab](http\".\n if (/^\\[[^\\]]*\\]\\([^)]*$/.test(rest)) {\n return text.slice(0, start);\n }\n return text;\n}\n\n/** A math delimiter that has been opened but not yet closed in the stream. */\ninterface OpenMath {\n /** Index of the opening delimiter in the source string. */\n index: number;\n /** The opening delimiter itself, e.g. `\"\\\\[\"` or `\"$$\"`. */\n open: string;\n /** The closing delimiter to append once repaired, empty for inline math. */\n close: string;\n /** Whether the math is block (display) math we try to render progressively. */\n block: boolean;\n /** Whether to render in KaTeX display mode when validating a candidate. */\n display: boolean;\n}\n\n/**\n * Repairs an unterminated LaTeX region at the tail of the stream.\n *\n * Inline math (`$…`, `\\(…`) is short, so it is simply hidden until it finishes\n * streaming. Block math (`\\[…`, `$$…`) is instead rendered progressively: we\n * close any open environments/braces and keep the largest leading slice that\n * KaTeX can parse, so a multi-line block reveals itself as it streams instead\n * of staying blank until the closing delimiter finally arrives.\n */\nfunction repairIncompleteMath(\n text: string,\n showUnfinishedLatexBlocks: boolean,\n): string {\n const countOf = (pattern: RegExp): number =>\n (text.match(pattern) ?? []).length;\n\n const opens: OpenMath[] = [];\n\n // Display math: \\[ ... \\]\n if (countOf(/\\\\\\[/g) > countOf(/\\\\\\]/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\[\"),\n open: \"\\\\[\",\n close: \"\\\\]\",\n block: true,\n display: true,\n });\n }\n\n // Inline math: \\( ... \\)\n if (countOf(/\\\\\\(/g) > countOf(/\\\\\\)/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\(\"),\n open: \"\\\\(\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n\n if (countOf(/\\$\\$/g) % 2 === 1) {\n // Display math: $$ ... $$\n opens.push({\n index: text.lastIndexOf(\"$$\"),\n open: \"$$\",\n close: \"$$\",\n block: true,\n display: true,\n });\n } else {\n // Inline math: $ ... $. Mask complete \"$$\" pairs (keeping indices stable),\n // then ignore escaped \"\\$\" and currency like \"$5\" to avoid false positives.\n let masked = text.replace(/\\$\\$/g, \" \");\n // Also mask complete single-line \"$…$\" spans that contain a LaTeX command\n // (so they are real math, not \"$5\" currency). Their opening \"$\" may be\n // followed by a digit (e.g. \"$15 \\text{ г}$\"), which the currency guard\n // below would otherwise drop from the count while still counting the\n // closing \"$\", flipping the parity and hiding trailing content by mistake.\n masked = masked.replace(\n /(?<!\\\\)\\$(?!\\$)[^$\\n]*?\\\\[a-zA-Z][^$\\n]*?\\$/g,\n (m) => \" \".repeat(m.length),\n );\n // Same parity hazard for command-free numeric spans (e.g. \"$0$\", \"$15$\"):\n // the opening \"$\" is dropped by the currency guard below while the closing\n // \"$\" is still counted. Mask these balanced numeric spans too so neither\n // delimiter is counted. Plain currency (\"$5 and $10\") has prose between the\n // dollars, so it matches neither this nor the command mask and is left for\n // the currency guard to handle.\n masked = masked.replace(\n /(?<!\\\\)\\$(?!\\$)\\d[\\d\\s.,+\\-*/=]*\\$/g,\n (m) => \" \".repeat(m.length),\n );\n let lastDollar = -1;\n for (const match of masked.matchAll(/(?<!\\\\)\\$(?!\\d)/g)) {\n lastDollar = match.index;\n }\n const singles = masked.match(/(?<!\\\\)\\$(?!\\d)/g) ?? [];\n if (singles.length % 2 === 1 && lastDollar !== -1) {\n opens.push({\n index: lastDollar,\n open: \"$\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n }\n\n const valid = opens.filter((entry) => entry.index >= 0);\n if (valid.length === 0) return text;\n\n // The earliest opener marks where the incomplete math region begins; anything\n // after it is part of the unterminated construct.\n const open = valid.reduce((a, b) => (b.index < a.index ? b : a));\n const before = text.slice(0, open.index);\n\n if (!open.block) {\n // Inline math is hidden until it finishes streaming.\n return before;\n }\n\n // When progressive block rendering is disabled, hide the unterminated block\n // until its closing delimiter arrives, skipping the KaTeX validation cost.\n if (!showUnfinishedLatexBlocks) {\n return before;\n }\n\n const inner = text.slice(open.index + open.open.length);\n const body = bestRenderableMathBody(inner, open.display);\n if (body == null) return before;\n\n // Reproduce the original fenced layout so the markdown math parser can detect\n // the closing delimiter. When the block opens on its own line (`\\[\\n…`), the\n // closing delimiter must also sit on its own line; otherwise micromark treats\n // the run as inline math, never finds the closing fence, and KaTeX renders a\n // parse error that swallows the trailing delimiter.\n const blockLayout = /^[ \\t]*\\r?\\n/.test(inner);\n if (!blockLayout) {\n return before + open.open + body + open.close;\n }\n const opener =\n before === \"\" || before.endsWith(\"\\n\") ? open.open : `\\n${open.open}`;\n return `${before}${opener}${body.replace(/\\s+$/, \"\")}\\n${open.close}`;\n}\n\n/**\n * Returns the largest leading slice of incomplete block-math content that KaTeX\n * can render, with its open environments and braces closed, or `null` when no\n * usable prefix exists yet (in which case the caller hides the fragment).\n *\n * When an environment is still open (e.g. `\\begin{aligned}` mid-stream) we\n * prefer revealing only the complete rows so each equation appears fully formed,\n * falling back to a token-level repair so single-line blocks still stream in.\n */\nfunction bestRenderableMathBody(\n inner: string,\n display: boolean,\n): string | null {\n const candidates = unclosedEnvironments(inner).length > 0\n ? [closeOpenMathConstructs(truncateToLastRow(inner)), closeOpenMathConstructs(trimIncompleteMathTail(inner))]\n : [closeOpenMathConstructs(trimIncompleteMathTail(inner))];\n\n for (const candidate of candidates) {\n if (!hasRenderableMathContent(candidate)) continue;\n if (isRenderableMath(candidate, display)) return candidate;\n }\n return null;\n}\n\n/** True when a math body contains something other than empty environment scaffolding. */\nfunction hasRenderableMathContent(body: string): boolean {\n const stripped = body\n .replace(/\\\\(?:begin|end)\\s*\\{[^}]*\\}/g, \"\")\n .replace(/[\\s{}]/g, \"\");\n return stripped.length > 0;\n}\n\n/**\n * True when KaTeX can render the math body without raising a parse error.\n *\n * Uses the public, stable `renderToString` entry point (with `throwOnError`)\n * rather than any internal parse-only API, so it keeps working across KaTeX\n * upgrades. We only care whether it throws; the produced string is discarded.\n */\nfunction isRenderableMath(body: string, display: boolean): boolean {\n try {\n katex.renderToString(body, {\n displayMode: display,\n throwOnError: true,\n strict: false,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keeps only the complete rows of a multi-line environment by cutting back to\n * the last row separator (`\\\\`), dropping the partially-streamed current row.\n * Returns an empty string when no full row has streamed yet.\n */\nfunction truncateToLastRow(inner: string): string {\n const lastRow = inner.lastIndexOf(\"\\\\\\\\\");\n if (lastRow === -1) return \"\";\n return inner.slice(0, lastRow + 2);\n}\n\n/**\n * Drops trailing tokens that cannot render on their own yet: surrounding\n * whitespace, a dangling backslash, an in-progress control word (`\\frac` may\n * still be `\\fra`), and a subscript/superscript with no argument. A complete\n * `\\\\` row separator is preserved.\n */\nfunction trimIncompleteMathTail(inner: string): string {\n let result = inner;\n let previous: string;\n do {\n previous = result;\n result = result.replace(/\\s+$/, \"\");\n // A trailing odd run of backslashes ends in a lone \"\\\" (an incomplete \"\\\\\"\n // or the start of a command); drop it. An even run is complete \"\\\\\".\n const backslashes = result.match(/\\\\+$/);\n if (backslashes != null && backslashes[0].length % 2 === 1) {\n result = result.slice(0, -1);\n }\n // A trailing control word is ambiguous mid-stream; drop it so it cannot be\n // an unknown (and therefore error-rendered) command.\n result = result.replace(/\\\\[a-zA-Z]+\\*?$/, \"\");\n // A subscript/superscript needs an argument that has not arrived yet.\n result = result.replace(/[_^]$/, \"\");\n } while (result !== previous);\n return result;\n}\n\n/**\n * Closes the constructs left open in a math fragment so KaTeX can parse it:\n * unmatched `\\left`, unbalanced `{` groups, and unclosed environments. Order is\n * a best effort; the caller validates the result with KaTeX regardless.\n */\nfunction closeOpenMathConstructs(inner: string): string {\n let result = inner;\n\n const lefts = (result.match(/\\\\left(?![a-zA-Z])/g) ?? []).length;\n const rights = (result.match(/\\\\right(?![a-zA-Z])/g) ?? []).length;\n result += \"\\\\right.\".repeat(Math.max(0, lefts - rights));\n\n result += \"}\".repeat(openBraceDepth(result));\n\n const environments = unclosedEnvironments(result);\n for (let i = environments.length - 1; i >= 0; i--) {\n result += `\\\\end{${environments[i]}}`;\n }\n return result;\n}\n\n/** Counts unclosed `{` groups, ignoring escaped braces (`\\{`, `\\}`). */\nfunction openBraceDepth(text: string): number {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"{\") depth++;\n else if (char === \"}\" && depth > 0) depth--;\n }\n return depth;\n}\n\n/**\n * Returns the names of environments opened with `\\begin{…}` but not yet closed\n * with a matching `\\end{…}`, outermost first.\n */\nfunction unclosedEnvironments(text: string): string[] {\n const stack: string[] = [];\n const pattern = /\\\\(begin|end)\\s*\\{([^}]*)\\}/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) != null) {\n const name = match[2];\n if (match[1] === \"begin\") {\n stack.push(name);\n } else {\n const index = stack.lastIndexOf(name);\n if (index !== -1) stack.splice(index, 1);\n else stack.pop();\n }\n }\n return stack;\n}\n\n/**\n * Closes unterminated emphasis runs: ~~strike~~, **bold**, *italic*, __bold__\n * and _italic_.\n */\nfunction closeUnbalancedEmphasis(text: string): string {\n let result = text;\n result = closeRunMarker(result, \"~~\");\n // Close a single \"*\" first so a \"***\" opener becomes \"*\" + \"**\" and both\n // halves get closed, yielding a balanced \"***…***\".\n result = closeSingleAsterisk(result);\n result = closeRunMarker(result, \"**\");\n result = closeSingleUnderscore(result);\n result = closeDoubleUnderscore(result);\n return result;\n}\n\n/**\n * True when the marker at `index` begins a delimiter run that could open\n * emphasis: it sits at the start of the string or directly after a non-word\n * character (whitespace or punctuation). Underscores require this so intra-word\n * usage (`snake_case`, `__init__`) is never treated as a dangling emphasis\n * opener.\n */\nfunction opensAtWordBoundary(text: string, index: number): boolean {\n if (index <= 0) return true;\n // Whitespace or punctuation before the marker counts as a boundary; an\n // alphanumeric character (or another underscore) does not, so intra-word\n // usage (`snake_case`, `__init__`) is never treated as a dangling opener\n // while a leading-punctuation case like `(_italic` still closes.\n return !/[\\p{L}\\p{N}_]/u.test(text[index - 1]);\n}\n\n/**\n * Closes a single `_` italic marker. `__` pairs are masked out first, and the\n * marker is only closed when it both opens at a word boundary and sits directly\n * before a non-space character, so `snake_case` is left alone.\n */\nfunction closeSingleUnderscore(text: string): string {\n const masked = text.replace(/__/g, \"\");\n const count = (masked.match(/_/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"_\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s_]/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"_\");\n}\n\n/**\n * Closes a `__` bold marker when it is unbalanced, opens at a word boundary,\n * and is directly followed by a non-space character (so `a__b` and `__init__`\n * are left untouched).\n */\nfunction closeDoubleUnderscore(text: string): string {\n const count = (text.match(/__/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"__\");\n const after = text.slice(lastIndex + 2);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"__\");\n}\n\n/**\n * Closes a two-character emphasis marker (`**` or `~~`) when it is unbalanced\n * and the final marker looks like an opener (immediately followed by a\n * non-space character), which avoids touching list markers or operators.\n */\nfunction closeRunMarker(text: string, marker: string): string {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const count = (text.match(new RegExp(escaped, \"g\")) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(marker);\n const after = text.slice(lastIndex + marker.length);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, marker);\n}\n\n/**\n * Closes a single `*` italic marker. `**` pairs are masked out first, and the\n * marker is only closed when it sits directly before a non-space character so\n * bullet markers (`* item`) and multiplication (`2 * 3`) are left alone.\n */\nfunction closeSingleAsterisk(text: string): string {\n const masked = text.replace(/\\*\\*/g, \"\");\n const count = (masked.match(/\\*/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"*\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s*]/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"*\");\n}\n\n/**\n * Appends a closing emphasis marker, but places it before any trailing\n * whitespace. A closer such as `**` is only valid when it directly follows a\n * non-space character, so `**bold ` must become `**bold** ` rather than the\n * un-renderable `**bold **`.\n */\nfunction insertBeforeTrailingWhitespace(text: string, marker: string): string {\n const trailing = text.match(/\\s+$/)?.[0] ?? \"\";\n const core = text.slice(0, text.length - trailing.length);\n return core + marker + trailing;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { CopyButtonProps } from \"./types\";\n\nfunction CopyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const copy = () => {\n const clipboard = navigator.clipboard;\n if (!clipboard) return;\n // Only show the \"copied\" confirmation once the write actually succeeds.\n void clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard write failed; keep the idle state.\n });\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n className={className}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n data-copied={copied ? \"\" : undefined}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n );\n}\n","/**\n * Matches a fenced code block or an inline code span. Shared by\n * {@link preprocessLaTeX} and {@link escapeBrackets} so both functions treat\n * code identically; composed into the larger patterns below via `.source`.\n */\nconst CODE_SPAN = /```[\\s\\S]*?```|`[^`\\n]+`/;\n\n/**\n * Preprocesses LaTeX content by replacing delimiters and escaping certain characters.\n *\n * @param content The input string containing LaTeX expressions.\n * @returns The processed string with replaced delimiters and escaped characters.\n */\nexport function preprocessLaTeX(content: string): string {\n // Step 1: Protect code blocks\n const codeBlocks: string[] = [];\n content = content.replace(\n new RegExp(`(${CODE_SPAN.source})`, \"g\"),\n (_match, code) => {\n codeBlocks.push(code);\n return `<<CODE_BLOCK_${codeBlocks.length - 1}>>`;\n },\n );\n\n // Step 2: Protect existing LaTeX expressions. This is what makes the currency\n // escaping in Step 3 safe: by pulling complete `$$…$$` / `\\[…\\]` / `\\(…\\)`\n // regions out of the string first, the `\\$(?=\\d)` pass below cannot corrupt a\n // `$` that legitimately belongs to a math expression (e.g. `$$x = $5$$`).\n //\n // Single-dollar inline math whose content begins with a digit (e.g.\n // `$15 \\text{ г}$`) is protected too: without this its opening `$` would be\n // escaped as currency in Step 3, unbalancing the delimiters so remark-math\n // swallows the rest of the paragraph as one math region. Two shapes qualify:\n // 1. spans containing a LaTeX command (`\\…`), e.g. `$15 \\text{ г}$`;\n // 2. balanced spans whose content is purely numeric/math (digits, spaces\n // and basic operators, no prose letters), e.g. `$0$` or `$1288 / 3$`.\n // Both leave plain currency prose like `$5 and $10` for Step 3, because that\n // text contains letters between the dollars and so matches neither shape.\n const latexExpressions: string[] = [];\n content = content.replace(\n /(\\$\\$[\\s\\S]*?\\$\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\)|\\$(?!\\$)[^$\\n]*?\\\\[a-zA-Z][^$\\n]*?\\$|\\$(?!\\$)\\d[\\d\\s.,+\\-*/=]*\\$)/g,\n (match) => {\n latexExpressions.push(match);\n return `<<LATEX_${latexExpressions.length - 1}>>`;\n },\n );\n\n // Step 3: Escape dollar signs that are likely currency indicators\n content = content.replace(/\\$(?=\\d)/g, \"\\\\$\");\n\n // Step 4: Restore LaTeX expressions\n content = content.replace(\n /<<LATEX_(\\d+)>>/g,\n (_, index) => latexExpressions[parseInt(index, 10)],\n );\n\n // Step 5: Restore code blocks\n content = content.replace(\n /<<CODE_BLOCK_(\\d+)>>/g,\n (_, index) => codeBlocks[parseInt(index, 10)],\n );\n\n // Step 6: Apply additional escaping functions\n content = escapeBrackets(content);\n content = escapeMhchem(content);\n\n return content;\n}\n\nexport function escapeBrackets(text: string): string {\n const pattern = new RegExp(\n `(${CODE_SPAN.source})|` +\n /\\\\\\[((?:[\\s\\S]*?[^\\\\])?)\\\\]|\\\\\\((.*?)\\\\\\)/.source,\n \"g\",\n );\n return text.replace(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock != null) {\n return codeBlock;\n } else if (squareBracket != null) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket != null) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\nexport function escapeMhchem(text: string): string {\n return text.replaceAll(\"$\\\\ce{\", \"$\\\\\\\\ce{\").replaceAll(\"$\\\\pu{\", \"$\\\\\\\\pu{\");\n}\n","import { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeKatex from \"rehype-katex\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nimport { completePartialTokens } from \"./completePartialTokens\";\nimport { CopyButton } from \"./CopyButton\";\nimport { preprocessLaTeX } from \"./preprocess\";\nimport type {\n CodeHighlighter,\n LLMMessageClassNames,\n LLMMessageComponents,\n} from \"./types\";\n\nexport interface LLMMessageProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"content\"> {\n /** The LLM message content as a markdown string. */\n children?: string;\n /** Alias for `children`. */\n content?: string;\n /** Class applied to the root element (merged with the built-in class). */\n className?: string;\n /** Per-element class overrides (merged with the built-in classes). */\n classNames?: LLMMessageClassNames;\n /** Per-element component overrides for full markup control. */\n components?: LLMMessageComponents;\n /**\n * Repair partially-streamed markdown/LaTeX so unterminated tokens (e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2`) do not render as raw\n * delimiter junk while the response is still streaming. Defaults to `true`.\n */\n completePartialTokens?: boolean;\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) while it\n * streams, instead of hiding it until the closing delimiter arrives. This is\n * nicer to watch (a long block reveals row by row) but costs a synchronous\n * KaTeX parse on every chunk that contains an open block. Set to `false` to\n * hide unfinished blocks and skip that work. Only relevant while\n * `completePartialTokens` is enabled. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n /**\n * Optional syntax highlighter for fenced code blocks. When omitted, code\n * blocks render as plain text (so no highlighter bundle is pulled in). Pass\n * `ShikiHighlighter` / `ShikiWebHighlighter`, or build your own with\n * `createShikiHighlighter`.\n */\n highlighter?: CodeHighlighter;\n}\n\nconst remarkPlugins = [remarkGfm, remarkMath];\nconst rehypePlugins = [rehypeKatex];\n\nfunction cx(...inputs: Array<string | undefined>): string | undefined {\n const result = clsx(inputs);\n return result === \"\" ? undefined : result;\n}\n\nfunction buildComponents(\n classNames: LLMMessageClassNames | undefined,\n overrides: LLMMessageComponents | undefined,\n highlighter: CodeHighlighter | undefined,\n): Components {\n const cn = classNames ?? {};\n const o = overrides ?? {};\n const Highlighter = highlighter;\n\n return {\n code({ node: _node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const codeText = String(children).replace(/\\n$/, \"\");\n // A fenced block always spans its own lines (so its text contains a\n // newline) even when no language info string is present; inline code\n // never does. Relying on the `language-` class alone would misrender a\n // bare ``` fence as inline code.\n const isBlock = match != null || String(children).includes(\"\\n\");\n\n if (isBlock) {\n const language = match?.[1] ?? \"\";\n if (o.codeBlock) {\n const CodeBlock = o.codeBlock;\n return (\n <CodeBlock\n code={codeText}\n language={language}\n className={cn.codeBlock}\n />\n );\n }\n return (\n <div className={cx(\"llm-code-block\", cn.codeBlock)}>\n <div className={cx(\"llm-code-header\", cn.codeHeader)}>\n <span className={cx(\"llm-code-language\", cn.codeLanguage)}>\n {language}\n </span>\n {o.copyButton ? (\n <o.copyButton text={codeText} className={cn.copyButton} />\n ) : (\n <CopyButton\n text={codeText}\n className={cx(\"llm-copy-button\", cn.copyButton)}\n />\n )}\n </div>\n <div className=\"llm-code-body\">\n {Highlighter ? (\n <Highlighter code={codeText} language={language} />\n ) : (\n <code className=\"llm-code-plain\">{codeText}</code>\n )}\n </div>\n </div>\n );\n }\n\n if (o.code) {\n const InlineCode = o.code;\n return (\n <InlineCode className={cx(\"llm-code\", cn.code, className)}>\n {children}\n </InlineCode>\n );\n }\n\n return (\n <code className={cx(\"llm-code\", cn.code, className)} {...props}>\n {children}\n </code>\n );\n },\n pre({ children }) {\n if (o.pre) {\n return <o.pre>{children}</o.pre>;\n }\n // Let the code component handle fenced blocks.\n return <>{children}</>;\n },\n table({ children }) {\n if (o.table) {\n return <o.table className={cn.table}>{children}</o.table>;\n }\n return (\n <div className={cx(\"llm-table-wrapper\", cn.tableWrapper)}>\n <table className={cx(\"llm-table\", cn.table)}>{children}</table>\n </div>\n );\n },\n th({ children }) {\n if (o.th) {\n return <o.th className={cn.th}>{children}</o.th>;\n }\n return <th className={cx(\"llm-th\", cn.th)}>{children}</th>;\n },\n td({ children }) {\n if (o.td) {\n return <o.td className={cn.td}>{children}</o.td>;\n }\n return <td className={cx(\"llm-td\", cn.td)}>{children}</td>;\n },\n blockquote({ children }) {\n if (o.blockquote) {\n return <o.blockquote className={cn.blockquote}>{children}</o.blockquote>;\n }\n return (\n <blockquote className={cx(\"llm-blockquote\", cn.blockquote)}>\n {children}\n </blockquote>\n );\n },\n ul({ children }) {\n if (o.ul) {\n return <o.ul className={cn.ul}>{children}</o.ul>;\n }\n return <ul className={cx(\"llm-ul\", cn.ul)}>{children}</ul>;\n },\n ol({ children }) {\n if (o.ol) {\n return <o.ol className={cn.ol}>{children}</o.ol>;\n }\n return <ol className={cx(\"llm-ol\", cn.ol)}>{children}</ol>;\n },\n li({ children }) {\n if (o.li) {\n return <o.li className={cn.li}>{children}</o.li>;\n }\n return <li className={cx(\"llm-li\", cn.li)}>{children}</li>;\n },\n p({ children }) {\n if (o.p) {\n return <o.p className={cn.p}>{children}</o.p>;\n }\n return <p className={cx(\"llm-p\", cn.p)}>{children}</p>;\n },\n h1({ children }) {\n if (o.h1) {\n return <o.h1 className={cn.h1}>{children}</o.h1>;\n }\n return <h1 className={cx(\"llm-h1\", cn.h1)}>{children}</h1>;\n },\n h2({ children }) {\n if (o.h2) {\n return <o.h2 className={cn.h2}>{children}</o.h2>;\n }\n return <h2 className={cx(\"llm-h2\", cn.h2)}>{children}</h2>;\n },\n h3({ children }) {\n if (o.h3) {\n return <o.h3 className={cn.h3}>{children}</o.h3>;\n }\n return <h3 className={cx(\"llm-h3\", cn.h3)}>{children}</h3>;\n },\n h4({ children }) {\n if (o.h4) {\n return <o.h4 className={cn.h4}>{children}</o.h4>;\n }\n return <h4 className={cx(\"llm-h4\", cn.h4)}>{children}</h4>;\n },\n h5({ children }) {\n if (o.h5) {\n return <o.h5 className={cn.h5}>{children}</o.h5>;\n }\n return <h5 className={cx(\"llm-h5\", cn.h5)}>{children}</h5>;\n },\n h6({ children }) {\n if (o.h6) {\n return <o.h6 className={cn.h6}>{children}</o.h6>;\n }\n return <h6 className={cx(\"llm-h6\", cn.h6)}>{children}</h6>;\n },\n input({ node: _node, type, checked, disabled, ...props }) {\n if (type === \"checkbox\") {\n if (o.checkbox) {\n return (\n <o.checkbox checked={Boolean(checked)} className={cn.checkbox} />\n );\n }\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(checked)}\n disabled\n aria-label={checked ? \"Completed task\" : \"Incomplete task\"}\n className={cx(\"llm-checkbox\", cn.checkbox)}\n readOnly\n />\n );\n }\n return (\n <input\n type={type}\n checked={checked}\n disabled={disabled}\n readOnly\n {...props}\n />\n );\n },\n a({ href, children }) {\n if (o.a) {\n return (\n <o.a href={href} className={cn.a}>\n {children}\n </o.a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cx(\"llm-a\", cn.a)}\n >\n {children}\n </a>\n );\n },\n img({ node: _node, src, alt, title, className: _className, ...props }) {\n if (o.img) {\n const Image = o.img;\n return (\n <Image\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cn.img}\n />\n );\n }\n return (\n <img\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cx(\"llm-img\", cn.img)}\n {...props}\n />\n );\n },\n hr() {\n if (o.hr) {\n return <o.hr className={cn.hr} />;\n }\n return <hr className={cx(\"llm-hr\", cn.hr)} />;\n },\n strong({ children }) {\n if (o.strong) {\n return <o.strong className={cn.strong}>{children}</o.strong>;\n }\n return <strong className={cx(\"llm-strong\", cn.strong)}>{children}</strong>;\n },\n em({ children }) {\n if (o.em) {\n return <o.em className={cn.em}>{children}</o.em>;\n }\n return <em className={cx(\"llm-em\", cn.em)}>{children}</em>;\n },\n del({ children }) {\n if (o.del) {\n return <o.del className={cn.del}>{children}</o.del>;\n }\n return <del className={cx(\"llm-del\", cn.del)}>{children}</del>;\n },\n };\n}\n\nexport function LLMMessage({\n children,\n content,\n className,\n classNames,\n components,\n completePartialTokens: repairPartialTokens = true,\n showUnfinishedLatexBlocks = true,\n highlighter,\n ...rest\n}: LLMMessageProps) {\n const source = content ?? children ?? \"\";\n\n const markdownComponents = useMemo(\n () => buildComponents(classNames, components, highlighter),\n [classNames, components, highlighter],\n );\n\n const processed = useMemo(() => {\n const repaired = repairPartialTokens\n ? completePartialTokens(source, { showUnfinishedLatexBlocks })\n : source;\n return preprocessLaTeX(repaired);\n }, [source, repairPartialTokens, showUnfinishedLatexBlocks]);\n\n return (\n <div className={cx(\"llm-message\", classNames?.root, className)} {...rest}>\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n components={markdownComponents}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nimport type { CodeHighlighter, CodeToHtml } from \"./types\";\n\ninterface CreateShikiHighlighterOptions {\n /** Theme pair forwarded to `codeToHtml`. Defaults to GitHub light/dark. */\n themes?: { light: string; dark: string };\n}\n\nconst DEFAULT_THEMES = { light: \"github-light\", dark: \"github-dark\" };\n\n/**\n * Builds a {@link CodeHighlighter} from any `codeToHtml`-compatible function.\n *\n * This factory imports no Shiki bundle itself, so importing it never drags\n * highlighting code into your app. You decide which bundle to pay for by\n * passing the `codeToHtml` from `shiki` (full), `shiki/bundle/web` (web), or a\n * minimal `createHighlighterCore` instance.\n *\n * @example\n * import { codeToHtml } from \"shiki/bundle/web\";\n * const Highlighter = createShikiHighlighter(codeToHtml);\n * <LLMMessage highlighter={Highlighter}>{content}</LLMMessage>\n */\nexport function createShikiHighlighter(\n codeToHtml: CodeToHtml,\n options?: CreateShikiHighlighterOptions,\n): CodeHighlighter {\n const themes = options?.themes ?? DEFAULT_THEMES;\n\n return function ShikiHighlighter({ code, language, className }) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n Promise.resolve(codeToHtml(code, { lang: language, themes }))\n .then((result) => {\n if (!cancelled) setHtml(result);\n })\n .catch(() => {\n // Fallback: if the language is unsupported, just show plain code.\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n // `codeToHtml` and `themes` are fixed for the lifetime of a highlighter\n // instance (captured from the factory closure), so they are intentionally\n // not listed: they never change between renders of this component.\n }, [code, language]);\n\n if (html) {\n return (\n <div\n className={className ?? \"llm-shiki\"}\n // The HTML is generated by Shiki, which is safe.\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n return <code className=\"llm-code-plain\">{code}</code>;\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -136,7 +136,15 @@ function repairIncompleteMath(text, showUnfinishedLatexBlocks) {
136
136
  display: true
137
137
  });
138
138
  } else {
139
- const masked = text.replace(/\$\$/g, " ");
139
+ let masked = text.replace(/\$\$/g, " ");
140
+ masked = masked.replace(
141
+ /(?<!\\)\$(?!\$)[^$\n]*?\\[a-zA-Z][^$\n]*?\$/g,
142
+ (m) => " ".repeat(m.length)
143
+ );
144
+ masked = masked.replace(
145
+ /(?<!\\)\$(?!\$)\d[\d\s.,+\-*/=]*\$/g,
146
+ (m) => " ".repeat(m.length)
147
+ );
140
148
  let lastDollar = -1;
141
149
  for (const match of masked.matchAll(/(?<!\\)\$(?!\d)/g)) {
142
150
  lastDollar = match.index;
@@ -395,7 +403,7 @@ function preprocessLaTeX(content) {
395
403
  );
396
404
  const latexExpressions = [];
397
405
  content = content.replace(
398
- /(\$\$[\s\S]*?\$\$|\\\[[\s\S]*?\\\]|\\\(.*?\\\))/g,
406
+ /(\$\$[\s\S]*?\$\$|\\\[[\s\S]*?\\\]|\\\(.*?\\\)|\$(?!\$)[^$\n]*?\\[a-zA-Z][^$\n]*?\$|\$(?!\$)\d[\d\s.,+\-*/=]*\$)/g,
399
407
  (match) => {
400
408
  latexExpressions.push(match);
401
409
  return `<<LATEX_${latexExpressions.length - 1}>>`;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/completePartialTokens.ts","../src/CopyButton.tsx","../src/preprocess.ts","../src/LLMMessage.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import katex from \"katex\";\n\n/** Options controlling how {@link completePartialTokens} repairs the stream. */\nexport interface CompletePartialTokensOptions {\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) by closing\n * the open constructs and keeping the largest prefix KaTeX accepts. This is\n * convenient (a long block reveals row by row) but costs a synchronous KaTeX\n * parse on every chunk while the block streams. Set to `false` to instead\n * hide the block entirely until its closing delimiter arrives, skipping the\n * KaTeX work. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n}\n\n/**\n * Repairs partially-streamed markdown / LaTeX so that incomplete syntax does\n * not leak raw delimiter characters into the rendered output.\n *\n * While an LLM streams a response, the text often ends mid-token, e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2` or `\\(a + b`. Rendered\n * as-is, those dangling delimiters show up as literal junk (`**`, `` ` ``, `[`,\n * `$`, `\\(`). This function detects the unterminated constructs at the tail of\n * the string and:\n * - closes safe inline formatting so it renders as intended (`**bold` →\n * `**bold**`, `` `code `` → `` `code` ``);\n * - hides fragments that cannot be completed yet, namely incomplete links and\n * incomplete inline math (`$…`, `\\(…`);\n * - progressively renders incomplete *block* math (`\\[…`, `$$…`): instead of\n * hiding the whole block until it finishes streaming, it closes the open\n * environments/braces and renders the largest prefix KaTeX accepts, so a\n * long aligned block reveals row by row instead of popping in at the end.\n *\n * It is a no-op for already-complete text, so it is safe to run on every chunk.\n *\n * @param text The (possibly mid-stream) markdown string.\n * @returns The string with trailing incomplete tokens repaired.\n */\nexport function completePartialTokens(\n text: string,\n options?: CompletePartialTokensOptions,\n): string {\n if (!text) return text;\n\n const showUnfinishedLatexBlocks = options?.showUnfinishedLatexBlocks ?? true;\n\n // An unterminated fenced code block is fine on its own: remark renders it to\n // the end of the document and the partial content reads correctly as code,\n // so we must not touch any of the (markdown-looking) characters inside it.\n if (hasUnclosedCodeFence(text)) {\n return text;\n }\n\n const protectedSpans: string[] = [];\n const protect = (value: string): string =>\n `\\u0000llmph${protectedSpans.push(value) - 1}\\u0000`;\n\n // Protect complete fenced code blocks and complete inline code spans so their\n // contents are never mistaken for markdown/LaTeX markers. Double-backtick\n // spans are protected before single-backtick ones so a span that itself\n // contains a backtick (`` a`b ``) is not mangled by the single-backtick pass.\n let working = text.replace(/```[\\s\\S]*?```/g, (match) => protect(match));\n working = working.replace(/``[\\s\\S]*?``/g, (match) => protect(match));\n working = working.replace(/`[^`\\n]+`/g, (match) => protect(match));\n\n // A leftover single backtick starts an unterminated inline code span. Protect\n // the rest of the line and close it so the in-progress code renders cleanly.\n const lastBacktick = working.lastIndexOf(\"`\");\n if (lastBacktick !== -1) {\n // Bound the in-progress span to its own line so trailing markdown on later\n // lines is not swallowed into the protected code.\n const newline = working.indexOf(\"\\n\", lastBacktick);\n const end = newline === -1 ? working.length : newline;\n const span = working.slice(lastBacktick, end);\n working =\n working.slice(0, lastBacktick) +\n protect(`${span}\\``) +\n working.slice(end);\n }\n\n working = repairIncompleteMath(working, showUnfinishedLatexBlocks);\n working = hideIncompleteLink(working);\n working = completePartialTable(working);\n working = hideDanglingListMarker(working);\n working = closeUnbalancedEmphasis(working);\n\n return working.replace(\n /\\u0000llmph(\\d+)\\u0000/g,\n (_match, index: string) => protectedSpans[Number(index)] ?? \"\",\n );\n}\n\n/**\n * Completes a partially-streamed GFM table delimiter row.\n *\n * A table needs a full delimiter row (`| --- | --- |`) to be recognised, so\n * while it streams the buffer ends with a header row followed by a fragment like\n * `| ---`. Without a valid delimiter remark-gfm collapses both lines into a\n * paragraph (\"| Feature | Works | | ---\"). Once a delimiter fragment appears we\n * already know the column count from the header, so we expand the fragment to a\n * complete delimiter, preserving any alignment colons that have streamed in.\n */\nfunction completePartialTable(text: string): string {\n const lines = text.split(\"\\n\");\n if (lines.length < 2) return text;\n\n const last = lines[lines.length - 1];\n // The candidate delimiter must contain only delimiter characters and at least\n // one dash; anything else (letters, etc.) means it is a header or body row.\n if (!/-/.test(last) || !/^[\\s|:-]*$/.test(last)) return text;\n\n const header = lines[lines.length - 2];\n if (!header.includes(\"|\")) return text;\n\n // If the table already has a delimiter row at or above the candidate, then\n // the candidate is just a body row that happens to contain only dashes/pipes\n // (not a streaming delimiter), so the table is complete and must be left\n // untouched. Walk up the contiguous block of pipe rows to detect that.\n for (let i = lines.length - 2; i >= 0; i--) {\n const line = lines[i];\n if (!line.includes(\"|\")) break;\n if (/-/.test(line) && /^[\\s|:-]*$/.test(line)) return text;\n }\n\n const columns = countTableColumns(header);\n lines[lines.length - 1] = buildDelimiterRow(last, columns);\n return lines.join(\"\\n\");\n}\n\n/** Counts the cells in a GFM table row, ignoring the outer pipes. */\nfunction countTableColumns(row: string): number {\n let inner = row.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n return inner.split(\"|\").length;\n}\n\n/**\n * Builds a delimiter row with `columns` cells, reusing any alignment colons\n * already present in the streamed fragment.\n */\nfunction buildDelimiterRow(fragment: string, columns: number): string {\n let inner = fragment.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n const existing = inner.split(\"|\").map((cell) => cell.trim());\n\n const cells = Array.from({ length: columns }, (_unused, index) => {\n const spec = existing[index] ?? \"\";\n const left = spec.startsWith(\":\");\n const right = spec.endsWith(\":\");\n if (left && right) return \":---:\";\n if (right) return \"---:\";\n if (left) return \":---\";\n return \"---\";\n });\n\n return `| ${cells.join(\" | \")} |`;\n}\n\n/**\n * Hides a trailing line that would be parsed as a setext heading underline.\n *\n * Mid-stream a bullet list arrives a character at a time, so the buffer briefly\n * ends with `paragraph\\n-` before the item text follows. In CommonMark a lone\n * run of dashes directly beneath a non-blank line is a setext H2 underline, so\n * a line like \"Unordered list:\" would flash as a heading until \"- Item\" streams\n * in. We drop the dangling marker until it gains content. A blank line above the\n * dashes makes them a thematic break instead, which is left untouched.\n */\nfunction hideDanglingListMarker(text: string): string {\n const match = text.match(/\\n[ \\t]{0,3}-+[ \\t]*$/);\n if (match?.index == null) return text;\n\n const before = text.slice(0, match.index);\n const prevLine = before.slice(before.lastIndexOf(\"\\n\") + 1);\n if (prevLine.trim() === \"\") return text;\n\n return before;\n}\n\n/**\n * True when a code fence is left open. Backtick (```) and tilde (~~~) fences are\n * counted separately so that a complete block of one kind that happens to\n * contain a line of the other kind is not mistaken for an unbalanced fence.\n */\nfunction hasUnclosedCodeFence(text: string): boolean {\n const backticks = (text.match(/^[ \\t]{0,3}```/gm) ?? []).length;\n const tildes = (text.match(/^[ \\t]{0,3}~~~/gm) ?? []).length;\n return backticks % 2 === 1 || tildes % 2 === 1;\n}\n\n/**\n * Drops a trailing, still-incomplete link or image, e.g. `[label`, `![alt` or\n * `[label](http`. Closed bracket fragments such as `arr[i]` or `[label]` are\n * left untouched to avoid hiding legitimate text.\n */\nfunction hideIncompleteLink(text: string): string {\n // Find the last \"[\" that is not an escaped LaTeX delimiter (\"\\[\").\n let open = -1;\n for (let i = text.length - 1; i >= 0; i--) {\n if (text[i] === \"[\" && text[i - 1] !== \"\\\\\") {\n open = i;\n break;\n }\n }\n if (open === -1) return text;\n\n const start = open > 0 && text[open - 1] === \"!\" ? open - 1 : open;\n const rest = text.slice(open);\n\n // Label is still open: \"[lab\" / \"![al\".\n if (!rest.includes(\"]\")) {\n return text.slice(0, start);\n }\n // Label closed, destination opened but not yet closed: \"[lab](http\".\n if (/^\\[[^\\]]*\\]\\([^)]*$/.test(rest)) {\n return text.slice(0, start);\n }\n return text;\n}\n\n/** A math delimiter that has been opened but not yet closed in the stream. */\ninterface OpenMath {\n /** Index of the opening delimiter in the source string. */\n index: number;\n /** The opening delimiter itself, e.g. `\"\\\\[\"` or `\"$$\"`. */\n open: string;\n /** The closing delimiter to append once repaired, empty for inline math. */\n close: string;\n /** Whether the math is block (display) math we try to render progressively. */\n block: boolean;\n /** Whether to render in KaTeX display mode when validating a candidate. */\n display: boolean;\n}\n\n/**\n * Repairs an unterminated LaTeX region at the tail of the stream.\n *\n * Inline math (`$…`, `\\(…`) is short, so it is simply hidden until it finishes\n * streaming. Block math (`\\[…`, `$$…`) is instead rendered progressively: we\n * close any open environments/braces and keep the largest leading slice that\n * KaTeX can parse, so a multi-line block reveals itself as it streams instead\n * of staying blank until the closing delimiter finally arrives.\n */\nfunction repairIncompleteMath(\n text: string,\n showUnfinishedLatexBlocks: boolean,\n): string {\n const countOf = (pattern: RegExp): number =>\n (text.match(pattern) ?? []).length;\n\n const opens: OpenMath[] = [];\n\n // Display math: \\[ ... \\]\n if (countOf(/\\\\\\[/g) > countOf(/\\\\\\]/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\[\"),\n open: \"\\\\[\",\n close: \"\\\\]\",\n block: true,\n display: true,\n });\n }\n\n // Inline math: \\( ... \\)\n if (countOf(/\\\\\\(/g) > countOf(/\\\\\\)/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\(\"),\n open: \"\\\\(\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n\n if (countOf(/\\$\\$/g) % 2 === 1) {\n // Display math: $$ ... $$\n opens.push({\n index: text.lastIndexOf(\"$$\"),\n open: \"$$\",\n close: \"$$\",\n block: true,\n display: true,\n });\n } else {\n // Inline math: $ ... $. Mask complete \"$$\" pairs (keeping indices stable),\n // then ignore escaped \"\\$\" and currency like \"$5\" to avoid false positives.\n const masked = text.replace(/\\$\\$/g, \" \");\n let lastDollar = -1;\n for (const match of masked.matchAll(/(?<!\\\\)\\$(?!\\d)/g)) {\n lastDollar = match.index;\n }\n const singles = masked.match(/(?<!\\\\)\\$(?!\\d)/g) ?? [];\n if (singles.length % 2 === 1 && lastDollar !== -1) {\n opens.push({\n index: lastDollar,\n open: \"$\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n }\n\n const valid = opens.filter((entry) => entry.index >= 0);\n if (valid.length === 0) return text;\n\n // The earliest opener marks where the incomplete math region begins; anything\n // after it is part of the unterminated construct.\n const open = valid.reduce((a, b) => (b.index < a.index ? b : a));\n const before = text.slice(0, open.index);\n\n if (!open.block) {\n // Inline math is hidden until it finishes streaming.\n return before;\n }\n\n // When progressive block rendering is disabled, hide the unterminated block\n // until its closing delimiter arrives, skipping the KaTeX validation cost.\n if (!showUnfinishedLatexBlocks) {\n return before;\n }\n\n const inner = text.slice(open.index + open.open.length);\n const body = bestRenderableMathBody(inner, open.display);\n if (body == null) return before;\n\n // Reproduce the original fenced layout so the markdown math parser can detect\n // the closing delimiter. When the block opens on its own line (`\\[\\n…`), the\n // closing delimiter must also sit on its own line; otherwise micromark treats\n // the run as inline math, never finds the closing fence, and KaTeX renders a\n // parse error that swallows the trailing delimiter.\n const blockLayout = /^[ \\t]*\\r?\\n/.test(inner);\n if (!blockLayout) {\n return before + open.open + body + open.close;\n }\n const opener =\n before === \"\" || before.endsWith(\"\\n\") ? open.open : `\\n${open.open}`;\n return `${before}${opener}${body.replace(/\\s+$/, \"\")}\\n${open.close}`;\n}\n\n/**\n * Returns the largest leading slice of incomplete block-math content that KaTeX\n * can render, with its open environments and braces closed, or `null` when no\n * usable prefix exists yet (in which case the caller hides the fragment).\n *\n * When an environment is still open (e.g. `\\begin{aligned}` mid-stream) we\n * prefer revealing only the complete rows so each equation appears fully formed,\n * falling back to a token-level repair so single-line blocks still stream in.\n */\nfunction bestRenderableMathBody(\n inner: string,\n display: boolean,\n): string | null {\n const candidates = unclosedEnvironments(inner).length > 0\n ? [closeOpenMathConstructs(truncateToLastRow(inner)), closeOpenMathConstructs(trimIncompleteMathTail(inner))]\n : [closeOpenMathConstructs(trimIncompleteMathTail(inner))];\n\n for (const candidate of candidates) {\n if (!hasRenderableMathContent(candidate)) continue;\n if (isRenderableMath(candidate, display)) return candidate;\n }\n return null;\n}\n\n/** True when a math body contains something other than empty environment scaffolding. */\nfunction hasRenderableMathContent(body: string): boolean {\n const stripped = body\n .replace(/\\\\(?:begin|end)\\s*\\{[^}]*\\}/g, \"\")\n .replace(/[\\s{}]/g, \"\");\n return stripped.length > 0;\n}\n\n/**\n * True when KaTeX can render the math body without raising a parse error.\n *\n * Uses the public, stable `renderToString` entry point (with `throwOnError`)\n * rather than any internal parse-only API, so it keeps working across KaTeX\n * upgrades. We only care whether it throws; the produced string is discarded.\n */\nfunction isRenderableMath(body: string, display: boolean): boolean {\n try {\n katex.renderToString(body, {\n displayMode: display,\n throwOnError: true,\n strict: false,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keeps only the complete rows of a multi-line environment by cutting back to\n * the last row separator (`\\\\`), dropping the partially-streamed current row.\n * Returns an empty string when no full row has streamed yet.\n */\nfunction truncateToLastRow(inner: string): string {\n const lastRow = inner.lastIndexOf(\"\\\\\\\\\");\n if (lastRow === -1) return \"\";\n return inner.slice(0, lastRow + 2);\n}\n\n/**\n * Drops trailing tokens that cannot render on their own yet: surrounding\n * whitespace, a dangling backslash, an in-progress control word (`\\frac` may\n * still be `\\fra`), and a subscript/superscript with no argument. A complete\n * `\\\\` row separator is preserved.\n */\nfunction trimIncompleteMathTail(inner: string): string {\n let result = inner;\n let previous: string;\n do {\n previous = result;\n result = result.replace(/\\s+$/, \"\");\n // A trailing odd run of backslashes ends in a lone \"\\\" (an incomplete \"\\\\\"\n // or the start of a command); drop it. An even run is complete \"\\\\\".\n const backslashes = result.match(/\\\\+$/);\n if (backslashes != null && backslashes[0].length % 2 === 1) {\n result = result.slice(0, -1);\n }\n // A trailing control word is ambiguous mid-stream; drop it so it cannot be\n // an unknown (and therefore error-rendered) command.\n result = result.replace(/\\\\[a-zA-Z]+\\*?$/, \"\");\n // A subscript/superscript needs an argument that has not arrived yet.\n result = result.replace(/[_^]$/, \"\");\n } while (result !== previous);\n return result;\n}\n\n/**\n * Closes the constructs left open in a math fragment so KaTeX can parse it:\n * unmatched `\\left`, unbalanced `{` groups, and unclosed environments. Order is\n * a best effort; the caller validates the result with KaTeX regardless.\n */\nfunction closeOpenMathConstructs(inner: string): string {\n let result = inner;\n\n const lefts = (result.match(/\\\\left(?![a-zA-Z])/g) ?? []).length;\n const rights = (result.match(/\\\\right(?![a-zA-Z])/g) ?? []).length;\n result += \"\\\\right.\".repeat(Math.max(0, lefts - rights));\n\n result += \"}\".repeat(openBraceDepth(result));\n\n const environments = unclosedEnvironments(result);\n for (let i = environments.length - 1; i >= 0; i--) {\n result += `\\\\end{${environments[i]}}`;\n }\n return result;\n}\n\n/** Counts unclosed `{` groups, ignoring escaped braces (`\\{`, `\\}`). */\nfunction openBraceDepth(text: string): number {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"{\") depth++;\n else if (char === \"}\" && depth > 0) depth--;\n }\n return depth;\n}\n\n/**\n * Returns the names of environments opened with `\\begin{…}` but not yet closed\n * with a matching `\\end{…}`, outermost first.\n */\nfunction unclosedEnvironments(text: string): string[] {\n const stack: string[] = [];\n const pattern = /\\\\(begin|end)\\s*\\{([^}]*)\\}/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) != null) {\n const name = match[2];\n if (match[1] === \"begin\") {\n stack.push(name);\n } else {\n const index = stack.lastIndexOf(name);\n if (index !== -1) stack.splice(index, 1);\n else stack.pop();\n }\n }\n return stack;\n}\n\n/**\n * Closes unterminated emphasis runs: ~~strike~~, **bold**, *italic*, __bold__\n * and _italic_.\n */\nfunction closeUnbalancedEmphasis(text: string): string {\n let result = text;\n result = closeRunMarker(result, \"~~\");\n // Close a single \"*\" first so a \"***\" opener becomes \"*\" + \"**\" and both\n // halves get closed, yielding a balanced \"***…***\".\n result = closeSingleAsterisk(result);\n result = closeRunMarker(result, \"**\");\n result = closeSingleUnderscore(result);\n result = closeDoubleUnderscore(result);\n return result;\n}\n\n/**\n * True when the marker at `index` begins a delimiter run that could open\n * emphasis: it sits at the start of the string or directly after a non-word\n * character (whitespace or punctuation). Underscores require this so intra-word\n * usage (`snake_case`, `__init__`) is never treated as a dangling emphasis\n * opener.\n */\nfunction opensAtWordBoundary(text: string, index: number): boolean {\n if (index <= 0) return true;\n // Whitespace or punctuation before the marker counts as a boundary; an\n // alphanumeric character (or another underscore) does not, so intra-word\n // usage (`snake_case`, `__init__`) is never treated as a dangling opener\n // while a leading-punctuation case like `(_italic` still closes.\n return !/[\\p{L}\\p{N}_]/u.test(text[index - 1]);\n}\n\n/**\n * Closes a single `_` italic marker. `__` pairs are masked out first, and the\n * marker is only closed when it both opens at a word boundary and sits directly\n * before a non-space character, so `snake_case` is left alone.\n */\nfunction closeSingleUnderscore(text: string): string {\n const masked = text.replace(/__/g, \"\");\n const count = (masked.match(/_/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"_\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s_]/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"_\");\n}\n\n/**\n * Closes a `__` bold marker when it is unbalanced, opens at a word boundary,\n * and is directly followed by a non-space character (so `a__b` and `__init__`\n * are left untouched).\n */\nfunction closeDoubleUnderscore(text: string): string {\n const count = (text.match(/__/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"__\");\n const after = text.slice(lastIndex + 2);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"__\");\n}\n\n/**\n * Closes a two-character emphasis marker (`**` or `~~`) when it is unbalanced\n * and the final marker looks like an opener (immediately followed by a\n * non-space character), which avoids touching list markers or operators.\n */\nfunction closeRunMarker(text: string, marker: string): string {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const count = (text.match(new RegExp(escaped, \"g\")) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(marker);\n const after = text.slice(lastIndex + marker.length);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, marker);\n}\n\n/**\n * Closes a single `*` italic marker. `**` pairs are masked out first, and the\n * marker is only closed when it sits directly before a non-space character so\n * bullet markers (`* item`) and multiplication (`2 * 3`) are left alone.\n */\nfunction closeSingleAsterisk(text: string): string {\n const masked = text.replace(/\\*\\*/g, \"\");\n const count = (masked.match(/\\*/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"*\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s*]/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"*\");\n}\n\n/**\n * Appends a closing emphasis marker, but places it before any trailing\n * whitespace. A closer such as `**` is only valid when it directly follows a\n * non-space character, so `**bold ` must become `**bold** ` rather than the\n * un-renderable `**bold **`.\n */\nfunction insertBeforeTrailingWhitespace(text: string, marker: string): string {\n const trailing = text.match(/\\s+$/)?.[0] ?? \"\";\n const core = text.slice(0, text.length - trailing.length);\n return core + marker + trailing;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { CopyButtonProps } from \"./types\";\n\nfunction CopyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const copy = () => {\n const clipboard = navigator.clipboard;\n if (!clipboard) return;\n // Only show the \"copied\" confirmation once the write actually succeeds.\n void clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard write failed; keep the idle state.\n });\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n className={className}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n data-copied={copied ? \"\" : undefined}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n );\n}\n","/**\n * Matches a fenced code block or an inline code span. Shared by\n * {@link preprocessLaTeX} and {@link escapeBrackets} so both functions treat\n * code identically; composed into the larger patterns below via `.source`.\n */\nconst CODE_SPAN = /```[\\s\\S]*?```|`[^`\\n]+`/;\n\n/**\n * Preprocesses LaTeX content by replacing delimiters and escaping certain characters.\n *\n * @param content The input string containing LaTeX expressions.\n * @returns The processed string with replaced delimiters and escaped characters.\n */\nexport function preprocessLaTeX(content: string): string {\n // Step 1: Protect code blocks\n const codeBlocks: string[] = [];\n content = content.replace(\n new RegExp(`(${CODE_SPAN.source})`, \"g\"),\n (_match, code) => {\n codeBlocks.push(code);\n return `<<CODE_BLOCK_${codeBlocks.length - 1}>>`;\n },\n );\n\n // Step 2: Protect existing LaTeX expressions. This is what makes the currency\n // escaping in Step 3 safe: by pulling complete `$$…$$` / `\\[…\\]` / `\\(…\\)`\n // regions out of the string first, the `\\$(?=\\d)` pass below cannot corrupt a\n // `$` that legitimately belongs to a math expression (e.g. `$$x = $5$$`).\n const latexExpressions: string[] = [];\n content = content.replace(\n /(\\$\\$[\\s\\S]*?\\$\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\))/g,\n (match) => {\n latexExpressions.push(match);\n return `<<LATEX_${latexExpressions.length - 1}>>`;\n },\n );\n\n // Step 3: Escape dollar signs that are likely currency indicators\n content = content.replace(/\\$(?=\\d)/g, \"\\\\$\");\n\n // Step 4: Restore LaTeX expressions\n content = content.replace(\n /<<LATEX_(\\d+)>>/g,\n (_, index) => latexExpressions[parseInt(index, 10)],\n );\n\n // Step 5: Restore code blocks\n content = content.replace(\n /<<CODE_BLOCK_(\\d+)>>/g,\n (_, index) => codeBlocks[parseInt(index, 10)],\n );\n\n // Step 6: Apply additional escaping functions\n content = escapeBrackets(content);\n content = escapeMhchem(content);\n\n return content;\n}\n\nexport function escapeBrackets(text: string): string {\n const pattern = new RegExp(\n `(${CODE_SPAN.source})|` +\n /\\\\\\[((?:[\\s\\S]*?[^\\\\])?)\\\\]|\\\\\\((.*?)\\\\\\)/.source,\n \"g\",\n );\n return text.replace(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock != null) {\n return codeBlock;\n } else if (squareBracket != null) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket != null) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\nexport function escapeMhchem(text: string): string {\n return text.replaceAll(\"$\\\\ce{\", \"$\\\\\\\\ce{\").replaceAll(\"$\\\\pu{\", \"$\\\\\\\\pu{\");\n}\n","import { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeKatex from \"rehype-katex\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nimport { completePartialTokens } from \"./completePartialTokens\";\nimport { CopyButton } from \"./CopyButton\";\nimport { preprocessLaTeX } from \"./preprocess\";\nimport type {\n CodeHighlighter,\n LLMMessageClassNames,\n LLMMessageComponents,\n} from \"./types\";\n\nexport interface LLMMessageProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"content\"> {\n /** The LLM message content as a markdown string. */\n children?: string;\n /** Alias for `children`. */\n content?: string;\n /** Class applied to the root element (merged with the built-in class). */\n className?: string;\n /** Per-element class overrides (merged with the built-in classes). */\n classNames?: LLMMessageClassNames;\n /** Per-element component overrides for full markup control. */\n components?: LLMMessageComponents;\n /**\n * Repair partially-streamed markdown/LaTeX so unterminated tokens (e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2`) do not render as raw\n * delimiter junk while the response is still streaming. Defaults to `true`.\n */\n completePartialTokens?: boolean;\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) while it\n * streams, instead of hiding it until the closing delimiter arrives. This is\n * nicer to watch (a long block reveals row by row) but costs a synchronous\n * KaTeX parse on every chunk that contains an open block. Set to `false` to\n * hide unfinished blocks and skip that work. Only relevant while\n * `completePartialTokens` is enabled. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n /**\n * Optional syntax highlighter for fenced code blocks. When omitted, code\n * blocks render as plain text (so no highlighter bundle is pulled in). Pass\n * `ShikiHighlighter` / `ShikiWebHighlighter`, or build your own with\n * `createShikiHighlighter`.\n */\n highlighter?: CodeHighlighter;\n}\n\nconst remarkPlugins = [remarkGfm, remarkMath];\nconst rehypePlugins = [rehypeKatex];\n\nfunction cx(...inputs: Array<string | undefined>): string | undefined {\n const result = clsx(inputs);\n return result === \"\" ? undefined : result;\n}\n\nfunction buildComponents(\n classNames: LLMMessageClassNames | undefined,\n overrides: LLMMessageComponents | undefined,\n highlighter: CodeHighlighter | undefined,\n): Components {\n const cn = classNames ?? {};\n const o = overrides ?? {};\n const Highlighter = highlighter;\n\n return {\n code({ node: _node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const codeText = String(children).replace(/\\n$/, \"\");\n // A fenced block always spans its own lines (so its text contains a\n // newline) even when no language info string is present; inline code\n // never does. Relying on the `language-` class alone would misrender a\n // bare ``` fence as inline code.\n const isBlock = match != null || String(children).includes(\"\\n\");\n\n if (isBlock) {\n const language = match?.[1] ?? \"\";\n if (o.codeBlock) {\n const CodeBlock = o.codeBlock;\n return (\n <CodeBlock\n code={codeText}\n language={language}\n className={cn.codeBlock}\n />\n );\n }\n return (\n <div className={cx(\"llm-code-block\", cn.codeBlock)}>\n <div className={cx(\"llm-code-header\", cn.codeHeader)}>\n <span className={cx(\"llm-code-language\", cn.codeLanguage)}>\n {language}\n </span>\n {o.copyButton ? (\n <o.copyButton text={codeText} className={cn.copyButton} />\n ) : (\n <CopyButton\n text={codeText}\n className={cx(\"llm-copy-button\", cn.copyButton)}\n />\n )}\n </div>\n <div className=\"llm-code-body\">\n {Highlighter ? (\n <Highlighter code={codeText} language={language} />\n ) : (\n <code className=\"llm-code-plain\">{codeText}</code>\n )}\n </div>\n </div>\n );\n }\n\n if (o.code) {\n const InlineCode = o.code;\n return (\n <InlineCode className={cx(\"llm-code\", cn.code, className)}>\n {children}\n </InlineCode>\n );\n }\n\n return (\n <code className={cx(\"llm-code\", cn.code, className)} {...props}>\n {children}\n </code>\n );\n },\n pre({ children }) {\n if (o.pre) {\n return <o.pre>{children}</o.pre>;\n }\n // Let the code component handle fenced blocks.\n return <>{children}</>;\n },\n table({ children }) {\n if (o.table) {\n return <o.table className={cn.table}>{children}</o.table>;\n }\n return (\n <div className={cx(\"llm-table-wrapper\", cn.tableWrapper)}>\n <table className={cx(\"llm-table\", cn.table)}>{children}</table>\n </div>\n );\n },\n th({ children }) {\n if (o.th) {\n return <o.th className={cn.th}>{children}</o.th>;\n }\n return <th className={cx(\"llm-th\", cn.th)}>{children}</th>;\n },\n td({ children }) {\n if (o.td) {\n return <o.td className={cn.td}>{children}</o.td>;\n }\n return <td className={cx(\"llm-td\", cn.td)}>{children}</td>;\n },\n blockquote({ children }) {\n if (o.blockquote) {\n return <o.blockquote className={cn.blockquote}>{children}</o.blockquote>;\n }\n return (\n <blockquote className={cx(\"llm-blockquote\", cn.blockquote)}>\n {children}\n </blockquote>\n );\n },\n ul({ children }) {\n if (o.ul) {\n return <o.ul className={cn.ul}>{children}</o.ul>;\n }\n return <ul className={cx(\"llm-ul\", cn.ul)}>{children}</ul>;\n },\n ol({ children }) {\n if (o.ol) {\n return <o.ol className={cn.ol}>{children}</o.ol>;\n }\n return <ol className={cx(\"llm-ol\", cn.ol)}>{children}</ol>;\n },\n li({ children }) {\n if (o.li) {\n return <o.li className={cn.li}>{children}</o.li>;\n }\n return <li className={cx(\"llm-li\", cn.li)}>{children}</li>;\n },\n p({ children }) {\n if (o.p) {\n return <o.p className={cn.p}>{children}</o.p>;\n }\n return <p className={cx(\"llm-p\", cn.p)}>{children}</p>;\n },\n h1({ children }) {\n if (o.h1) {\n return <o.h1 className={cn.h1}>{children}</o.h1>;\n }\n return <h1 className={cx(\"llm-h1\", cn.h1)}>{children}</h1>;\n },\n h2({ children }) {\n if (o.h2) {\n return <o.h2 className={cn.h2}>{children}</o.h2>;\n }\n return <h2 className={cx(\"llm-h2\", cn.h2)}>{children}</h2>;\n },\n h3({ children }) {\n if (o.h3) {\n return <o.h3 className={cn.h3}>{children}</o.h3>;\n }\n return <h3 className={cx(\"llm-h3\", cn.h3)}>{children}</h3>;\n },\n h4({ children }) {\n if (o.h4) {\n return <o.h4 className={cn.h4}>{children}</o.h4>;\n }\n return <h4 className={cx(\"llm-h4\", cn.h4)}>{children}</h4>;\n },\n h5({ children }) {\n if (o.h5) {\n return <o.h5 className={cn.h5}>{children}</o.h5>;\n }\n return <h5 className={cx(\"llm-h5\", cn.h5)}>{children}</h5>;\n },\n h6({ children }) {\n if (o.h6) {\n return <o.h6 className={cn.h6}>{children}</o.h6>;\n }\n return <h6 className={cx(\"llm-h6\", cn.h6)}>{children}</h6>;\n },\n input({ node: _node, type, checked, disabled, ...props }) {\n if (type === \"checkbox\") {\n if (o.checkbox) {\n return (\n <o.checkbox checked={Boolean(checked)} className={cn.checkbox} />\n );\n }\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(checked)}\n disabled\n aria-label={checked ? \"Completed task\" : \"Incomplete task\"}\n className={cx(\"llm-checkbox\", cn.checkbox)}\n readOnly\n />\n );\n }\n return (\n <input\n type={type}\n checked={checked}\n disabled={disabled}\n readOnly\n {...props}\n />\n );\n },\n a({ href, children }) {\n if (o.a) {\n return (\n <o.a href={href} className={cn.a}>\n {children}\n </o.a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cx(\"llm-a\", cn.a)}\n >\n {children}\n </a>\n );\n },\n img({ node: _node, src, alt, title, className: _className, ...props }) {\n if (o.img) {\n const Image = o.img;\n return (\n <Image\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cn.img}\n />\n );\n }\n return (\n <img\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cx(\"llm-img\", cn.img)}\n {...props}\n />\n );\n },\n hr() {\n if (o.hr) {\n return <o.hr className={cn.hr} />;\n }\n return <hr className={cx(\"llm-hr\", cn.hr)} />;\n },\n strong({ children }) {\n if (o.strong) {\n return <o.strong className={cn.strong}>{children}</o.strong>;\n }\n return <strong className={cx(\"llm-strong\", cn.strong)}>{children}</strong>;\n },\n em({ children }) {\n if (o.em) {\n return <o.em className={cn.em}>{children}</o.em>;\n }\n return <em className={cx(\"llm-em\", cn.em)}>{children}</em>;\n },\n del({ children }) {\n if (o.del) {\n return <o.del className={cn.del}>{children}</o.del>;\n }\n return <del className={cx(\"llm-del\", cn.del)}>{children}</del>;\n },\n };\n}\n\nexport function LLMMessage({\n children,\n content,\n className,\n classNames,\n components,\n completePartialTokens: repairPartialTokens = true,\n showUnfinishedLatexBlocks = true,\n highlighter,\n ...rest\n}: LLMMessageProps) {\n const source = content ?? children ?? \"\";\n\n const markdownComponents = useMemo(\n () => buildComponents(classNames, components, highlighter),\n [classNames, components, highlighter],\n );\n\n const processed = useMemo(() => {\n const repaired = repairPartialTokens\n ? completePartialTokens(source, { showUnfinishedLatexBlocks })\n : source;\n return preprocessLaTeX(repaired);\n }, [source, repairPartialTokens, showUnfinishedLatexBlocks]);\n\n return (\n <div className={cx(\"llm-message\", classNames?.root, className)} {...rest}>\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n components={markdownComponents}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/completePartialTokens.ts","../src/CopyButton.tsx","../src/preprocess.ts","../src/LLMMessage.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import katex from \"katex\";\n\n/** Options controlling how {@link completePartialTokens} repairs the stream. */\nexport interface CompletePartialTokensOptions {\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) by closing\n * the open constructs and keeping the largest prefix KaTeX accepts. This is\n * convenient (a long block reveals row by row) but costs a synchronous KaTeX\n * parse on every chunk while the block streams. Set to `false` to instead\n * hide the block entirely until its closing delimiter arrives, skipping the\n * KaTeX work. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n}\n\n/**\n * Repairs partially-streamed markdown / LaTeX so that incomplete syntax does\n * not leak raw delimiter characters into the rendered output.\n *\n * While an LLM streams a response, the text often ends mid-token, e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2` or `\\(a + b`. Rendered\n * as-is, those dangling delimiters show up as literal junk (`**`, `` ` ``, `[`,\n * `$`, `\\(`). This function detects the unterminated constructs at the tail of\n * the string and:\n * - closes safe inline formatting so it renders as intended (`**bold` →\n * `**bold**`, `` `code `` → `` `code` ``);\n * - hides fragments that cannot be completed yet, namely incomplete links and\n * incomplete inline math (`$…`, `\\(…`);\n * - progressively renders incomplete *block* math (`\\[…`, `$$…`): instead of\n * hiding the whole block until it finishes streaming, it closes the open\n * environments/braces and renders the largest prefix KaTeX accepts, so a\n * long aligned block reveals row by row instead of popping in at the end.\n *\n * It is a no-op for already-complete text, so it is safe to run on every chunk.\n *\n * @param text The (possibly mid-stream) markdown string.\n * @returns The string with trailing incomplete tokens repaired.\n */\nexport function completePartialTokens(\n text: string,\n options?: CompletePartialTokensOptions,\n): string {\n if (!text) return text;\n\n const showUnfinishedLatexBlocks = options?.showUnfinishedLatexBlocks ?? true;\n\n // An unterminated fenced code block is fine on its own: remark renders it to\n // the end of the document and the partial content reads correctly as code,\n // so we must not touch any of the (markdown-looking) characters inside it.\n if (hasUnclosedCodeFence(text)) {\n return text;\n }\n\n const protectedSpans: string[] = [];\n const protect = (value: string): string =>\n `\\u0000llmph${protectedSpans.push(value) - 1}\\u0000`;\n\n // Protect complete fenced code blocks and complete inline code spans so their\n // contents are never mistaken for markdown/LaTeX markers. Double-backtick\n // spans are protected before single-backtick ones so a span that itself\n // contains a backtick (`` a`b ``) is not mangled by the single-backtick pass.\n let working = text.replace(/```[\\s\\S]*?```/g, (match) => protect(match));\n working = working.replace(/``[\\s\\S]*?``/g, (match) => protect(match));\n working = working.replace(/`[^`\\n]+`/g, (match) => protect(match));\n\n // A leftover single backtick starts an unterminated inline code span. Protect\n // the rest of the line and close it so the in-progress code renders cleanly.\n const lastBacktick = working.lastIndexOf(\"`\");\n if (lastBacktick !== -1) {\n // Bound the in-progress span to its own line so trailing markdown on later\n // lines is not swallowed into the protected code.\n const newline = working.indexOf(\"\\n\", lastBacktick);\n const end = newline === -1 ? working.length : newline;\n const span = working.slice(lastBacktick, end);\n working =\n working.slice(0, lastBacktick) +\n protect(`${span}\\``) +\n working.slice(end);\n }\n\n working = repairIncompleteMath(working, showUnfinishedLatexBlocks);\n working = hideIncompleteLink(working);\n working = completePartialTable(working);\n working = hideDanglingListMarker(working);\n working = closeUnbalancedEmphasis(working);\n\n return working.replace(\n /\\u0000llmph(\\d+)\\u0000/g,\n (_match, index: string) => protectedSpans[Number(index)] ?? \"\",\n );\n}\n\n/**\n * Completes a partially-streamed GFM table delimiter row.\n *\n * A table needs a full delimiter row (`| --- | --- |`) to be recognised, so\n * while it streams the buffer ends with a header row followed by a fragment like\n * `| ---`. Without a valid delimiter remark-gfm collapses both lines into a\n * paragraph (\"| Feature | Works | | ---\"). Once a delimiter fragment appears we\n * already know the column count from the header, so we expand the fragment to a\n * complete delimiter, preserving any alignment colons that have streamed in.\n */\nfunction completePartialTable(text: string): string {\n const lines = text.split(\"\\n\");\n if (lines.length < 2) return text;\n\n const last = lines[lines.length - 1];\n // The candidate delimiter must contain only delimiter characters and at least\n // one dash; anything else (letters, etc.) means it is a header or body row.\n if (!/-/.test(last) || !/^[\\s|:-]*$/.test(last)) return text;\n\n const header = lines[lines.length - 2];\n if (!header.includes(\"|\")) return text;\n\n // If the table already has a delimiter row at or above the candidate, then\n // the candidate is just a body row that happens to contain only dashes/pipes\n // (not a streaming delimiter), so the table is complete and must be left\n // untouched. Walk up the contiguous block of pipe rows to detect that.\n for (let i = lines.length - 2; i >= 0; i--) {\n const line = lines[i];\n if (!line.includes(\"|\")) break;\n if (/-/.test(line) && /^[\\s|:-]*$/.test(line)) return text;\n }\n\n const columns = countTableColumns(header);\n lines[lines.length - 1] = buildDelimiterRow(last, columns);\n return lines.join(\"\\n\");\n}\n\n/** Counts the cells in a GFM table row, ignoring the outer pipes. */\nfunction countTableColumns(row: string): number {\n let inner = row.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n return inner.split(\"|\").length;\n}\n\n/**\n * Builds a delimiter row with `columns` cells, reusing any alignment colons\n * already present in the streamed fragment.\n */\nfunction buildDelimiterRow(fragment: string, columns: number): string {\n let inner = fragment.trim();\n if (inner.startsWith(\"|\")) inner = inner.slice(1);\n if (inner.endsWith(\"|\")) inner = inner.slice(0, -1);\n const existing = inner.split(\"|\").map((cell) => cell.trim());\n\n const cells = Array.from({ length: columns }, (_unused, index) => {\n const spec = existing[index] ?? \"\";\n const left = spec.startsWith(\":\");\n const right = spec.endsWith(\":\");\n if (left && right) return \":---:\";\n if (right) return \"---:\";\n if (left) return \":---\";\n return \"---\";\n });\n\n return `| ${cells.join(\" | \")} |`;\n}\n\n/**\n * Hides a trailing line that would be parsed as a setext heading underline.\n *\n * Mid-stream a bullet list arrives a character at a time, so the buffer briefly\n * ends with `paragraph\\n-` before the item text follows. In CommonMark a lone\n * run of dashes directly beneath a non-blank line is a setext H2 underline, so\n * a line like \"Unordered list:\" would flash as a heading until \"- Item\" streams\n * in. We drop the dangling marker until it gains content. A blank line above the\n * dashes makes them a thematic break instead, which is left untouched.\n */\nfunction hideDanglingListMarker(text: string): string {\n const match = text.match(/\\n[ \\t]{0,3}-+[ \\t]*$/);\n if (match?.index == null) return text;\n\n const before = text.slice(0, match.index);\n const prevLine = before.slice(before.lastIndexOf(\"\\n\") + 1);\n if (prevLine.trim() === \"\") return text;\n\n return before;\n}\n\n/**\n * True when a code fence is left open. Backtick (```) and tilde (~~~) fences are\n * counted separately so that a complete block of one kind that happens to\n * contain a line of the other kind is not mistaken for an unbalanced fence.\n */\nfunction hasUnclosedCodeFence(text: string): boolean {\n const backticks = (text.match(/^[ \\t]{0,3}```/gm) ?? []).length;\n const tildes = (text.match(/^[ \\t]{0,3}~~~/gm) ?? []).length;\n return backticks % 2 === 1 || tildes % 2 === 1;\n}\n\n/**\n * Drops a trailing, still-incomplete link or image, e.g. `[label`, `![alt` or\n * `[label](http`. Closed bracket fragments such as `arr[i]` or `[label]` are\n * left untouched to avoid hiding legitimate text.\n */\nfunction hideIncompleteLink(text: string): string {\n // Find the last \"[\" that is not an escaped LaTeX delimiter (\"\\[\").\n let open = -1;\n for (let i = text.length - 1; i >= 0; i--) {\n if (text[i] === \"[\" && text[i - 1] !== \"\\\\\") {\n open = i;\n break;\n }\n }\n if (open === -1) return text;\n\n const start = open > 0 && text[open - 1] === \"!\" ? open - 1 : open;\n const rest = text.slice(open);\n\n // Label is still open: \"[lab\" / \"![al\".\n if (!rest.includes(\"]\")) {\n return text.slice(0, start);\n }\n // Label closed, destination opened but not yet closed: \"[lab](http\".\n if (/^\\[[^\\]]*\\]\\([^)]*$/.test(rest)) {\n return text.slice(0, start);\n }\n return text;\n}\n\n/** A math delimiter that has been opened but not yet closed in the stream. */\ninterface OpenMath {\n /** Index of the opening delimiter in the source string. */\n index: number;\n /** The opening delimiter itself, e.g. `\"\\\\[\"` or `\"$$\"`. */\n open: string;\n /** The closing delimiter to append once repaired, empty for inline math. */\n close: string;\n /** Whether the math is block (display) math we try to render progressively. */\n block: boolean;\n /** Whether to render in KaTeX display mode when validating a candidate. */\n display: boolean;\n}\n\n/**\n * Repairs an unterminated LaTeX region at the tail of the stream.\n *\n * Inline math (`$…`, `\\(…`) is short, so it is simply hidden until it finishes\n * streaming. Block math (`\\[…`, `$$…`) is instead rendered progressively: we\n * close any open environments/braces and keep the largest leading slice that\n * KaTeX can parse, so a multi-line block reveals itself as it streams instead\n * of staying blank until the closing delimiter finally arrives.\n */\nfunction repairIncompleteMath(\n text: string,\n showUnfinishedLatexBlocks: boolean,\n): string {\n const countOf = (pattern: RegExp): number =>\n (text.match(pattern) ?? []).length;\n\n const opens: OpenMath[] = [];\n\n // Display math: \\[ ... \\]\n if (countOf(/\\\\\\[/g) > countOf(/\\\\\\]/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\[\"),\n open: \"\\\\[\",\n close: \"\\\\]\",\n block: true,\n display: true,\n });\n }\n\n // Inline math: \\( ... \\)\n if (countOf(/\\\\\\(/g) > countOf(/\\\\\\)/g)) {\n opens.push({\n index: text.lastIndexOf(\"\\\\(\"),\n open: \"\\\\(\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n\n if (countOf(/\\$\\$/g) % 2 === 1) {\n // Display math: $$ ... $$\n opens.push({\n index: text.lastIndexOf(\"$$\"),\n open: \"$$\",\n close: \"$$\",\n block: true,\n display: true,\n });\n } else {\n // Inline math: $ ... $. Mask complete \"$$\" pairs (keeping indices stable),\n // then ignore escaped \"\\$\" and currency like \"$5\" to avoid false positives.\n let masked = text.replace(/\\$\\$/g, \" \");\n // Also mask complete single-line \"$…$\" spans that contain a LaTeX command\n // (so they are real math, not \"$5\" currency). Their opening \"$\" may be\n // followed by a digit (e.g. \"$15 \\text{ г}$\"), which the currency guard\n // below would otherwise drop from the count while still counting the\n // closing \"$\", flipping the parity and hiding trailing content by mistake.\n masked = masked.replace(\n /(?<!\\\\)\\$(?!\\$)[^$\\n]*?\\\\[a-zA-Z][^$\\n]*?\\$/g,\n (m) => \" \".repeat(m.length),\n );\n // Same parity hazard for command-free numeric spans (e.g. \"$0$\", \"$15$\"):\n // the opening \"$\" is dropped by the currency guard below while the closing\n // \"$\" is still counted. Mask these balanced numeric spans too so neither\n // delimiter is counted. Plain currency (\"$5 and $10\") has prose between the\n // dollars, so it matches neither this nor the command mask and is left for\n // the currency guard to handle.\n masked = masked.replace(\n /(?<!\\\\)\\$(?!\\$)\\d[\\d\\s.,+\\-*/=]*\\$/g,\n (m) => \" \".repeat(m.length),\n );\n let lastDollar = -1;\n for (const match of masked.matchAll(/(?<!\\\\)\\$(?!\\d)/g)) {\n lastDollar = match.index;\n }\n const singles = masked.match(/(?<!\\\\)\\$(?!\\d)/g) ?? [];\n if (singles.length % 2 === 1 && lastDollar !== -1) {\n opens.push({\n index: lastDollar,\n open: \"$\",\n close: \"\",\n block: false,\n display: false,\n });\n }\n }\n\n const valid = opens.filter((entry) => entry.index >= 0);\n if (valid.length === 0) return text;\n\n // The earliest opener marks where the incomplete math region begins; anything\n // after it is part of the unterminated construct.\n const open = valid.reduce((a, b) => (b.index < a.index ? b : a));\n const before = text.slice(0, open.index);\n\n if (!open.block) {\n // Inline math is hidden until it finishes streaming.\n return before;\n }\n\n // When progressive block rendering is disabled, hide the unterminated block\n // until its closing delimiter arrives, skipping the KaTeX validation cost.\n if (!showUnfinishedLatexBlocks) {\n return before;\n }\n\n const inner = text.slice(open.index + open.open.length);\n const body = bestRenderableMathBody(inner, open.display);\n if (body == null) return before;\n\n // Reproduce the original fenced layout so the markdown math parser can detect\n // the closing delimiter. When the block opens on its own line (`\\[\\n…`), the\n // closing delimiter must also sit on its own line; otherwise micromark treats\n // the run as inline math, never finds the closing fence, and KaTeX renders a\n // parse error that swallows the trailing delimiter.\n const blockLayout = /^[ \\t]*\\r?\\n/.test(inner);\n if (!blockLayout) {\n return before + open.open + body + open.close;\n }\n const opener =\n before === \"\" || before.endsWith(\"\\n\") ? open.open : `\\n${open.open}`;\n return `${before}${opener}${body.replace(/\\s+$/, \"\")}\\n${open.close}`;\n}\n\n/**\n * Returns the largest leading slice of incomplete block-math content that KaTeX\n * can render, with its open environments and braces closed, or `null` when no\n * usable prefix exists yet (in which case the caller hides the fragment).\n *\n * When an environment is still open (e.g. `\\begin{aligned}` mid-stream) we\n * prefer revealing only the complete rows so each equation appears fully formed,\n * falling back to a token-level repair so single-line blocks still stream in.\n */\nfunction bestRenderableMathBody(\n inner: string,\n display: boolean,\n): string | null {\n const candidates = unclosedEnvironments(inner).length > 0\n ? [closeOpenMathConstructs(truncateToLastRow(inner)), closeOpenMathConstructs(trimIncompleteMathTail(inner))]\n : [closeOpenMathConstructs(trimIncompleteMathTail(inner))];\n\n for (const candidate of candidates) {\n if (!hasRenderableMathContent(candidate)) continue;\n if (isRenderableMath(candidate, display)) return candidate;\n }\n return null;\n}\n\n/** True when a math body contains something other than empty environment scaffolding. */\nfunction hasRenderableMathContent(body: string): boolean {\n const stripped = body\n .replace(/\\\\(?:begin|end)\\s*\\{[^}]*\\}/g, \"\")\n .replace(/[\\s{}]/g, \"\");\n return stripped.length > 0;\n}\n\n/**\n * True when KaTeX can render the math body without raising a parse error.\n *\n * Uses the public, stable `renderToString` entry point (with `throwOnError`)\n * rather than any internal parse-only API, so it keeps working across KaTeX\n * upgrades. We only care whether it throws; the produced string is discarded.\n */\nfunction isRenderableMath(body: string, display: boolean): boolean {\n try {\n katex.renderToString(body, {\n displayMode: display,\n throwOnError: true,\n strict: false,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Keeps only the complete rows of a multi-line environment by cutting back to\n * the last row separator (`\\\\`), dropping the partially-streamed current row.\n * Returns an empty string when no full row has streamed yet.\n */\nfunction truncateToLastRow(inner: string): string {\n const lastRow = inner.lastIndexOf(\"\\\\\\\\\");\n if (lastRow === -1) return \"\";\n return inner.slice(0, lastRow + 2);\n}\n\n/**\n * Drops trailing tokens that cannot render on their own yet: surrounding\n * whitespace, a dangling backslash, an in-progress control word (`\\frac` may\n * still be `\\fra`), and a subscript/superscript with no argument. A complete\n * `\\\\` row separator is preserved.\n */\nfunction trimIncompleteMathTail(inner: string): string {\n let result = inner;\n let previous: string;\n do {\n previous = result;\n result = result.replace(/\\s+$/, \"\");\n // A trailing odd run of backslashes ends in a lone \"\\\" (an incomplete \"\\\\\"\n // or the start of a command); drop it. An even run is complete \"\\\\\".\n const backslashes = result.match(/\\\\+$/);\n if (backslashes != null && backslashes[0].length % 2 === 1) {\n result = result.slice(0, -1);\n }\n // A trailing control word is ambiguous mid-stream; drop it so it cannot be\n // an unknown (and therefore error-rendered) command.\n result = result.replace(/\\\\[a-zA-Z]+\\*?$/, \"\");\n // A subscript/superscript needs an argument that has not arrived yet.\n result = result.replace(/[_^]$/, \"\");\n } while (result !== previous);\n return result;\n}\n\n/**\n * Closes the constructs left open in a math fragment so KaTeX can parse it:\n * unmatched `\\left`, unbalanced `{` groups, and unclosed environments. Order is\n * a best effort; the caller validates the result with KaTeX regardless.\n */\nfunction closeOpenMathConstructs(inner: string): string {\n let result = inner;\n\n const lefts = (result.match(/\\\\left(?![a-zA-Z])/g) ?? []).length;\n const rights = (result.match(/\\\\right(?![a-zA-Z])/g) ?? []).length;\n result += \"\\\\right.\".repeat(Math.max(0, lefts - rights));\n\n result += \"}\".repeat(openBraceDepth(result));\n\n const environments = unclosedEnvironments(result);\n for (let i = environments.length - 1; i >= 0; i--) {\n result += `\\\\end{${environments[i]}}`;\n }\n return result;\n}\n\n/** Counts unclosed `{` groups, ignoring escaped braces (`\\{`, `\\}`). */\nfunction openBraceDepth(text: string): number {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"{\") depth++;\n else if (char === \"}\" && depth > 0) depth--;\n }\n return depth;\n}\n\n/**\n * Returns the names of environments opened with `\\begin{…}` but not yet closed\n * with a matching `\\end{…}`, outermost first.\n */\nfunction unclosedEnvironments(text: string): string[] {\n const stack: string[] = [];\n const pattern = /\\\\(begin|end)\\s*\\{([^}]*)\\}/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text)) != null) {\n const name = match[2];\n if (match[1] === \"begin\") {\n stack.push(name);\n } else {\n const index = stack.lastIndexOf(name);\n if (index !== -1) stack.splice(index, 1);\n else stack.pop();\n }\n }\n return stack;\n}\n\n/**\n * Closes unterminated emphasis runs: ~~strike~~, **bold**, *italic*, __bold__\n * and _italic_.\n */\nfunction closeUnbalancedEmphasis(text: string): string {\n let result = text;\n result = closeRunMarker(result, \"~~\");\n // Close a single \"*\" first so a \"***\" opener becomes \"*\" + \"**\" and both\n // halves get closed, yielding a balanced \"***…***\".\n result = closeSingleAsterisk(result);\n result = closeRunMarker(result, \"**\");\n result = closeSingleUnderscore(result);\n result = closeDoubleUnderscore(result);\n return result;\n}\n\n/**\n * True when the marker at `index` begins a delimiter run that could open\n * emphasis: it sits at the start of the string or directly after a non-word\n * character (whitespace or punctuation). Underscores require this so intra-word\n * usage (`snake_case`, `__init__`) is never treated as a dangling emphasis\n * opener.\n */\nfunction opensAtWordBoundary(text: string, index: number): boolean {\n if (index <= 0) return true;\n // Whitespace or punctuation before the marker counts as a boundary; an\n // alphanumeric character (or another underscore) does not, so intra-word\n // usage (`snake_case`, `__init__`) is never treated as a dangling opener\n // while a leading-punctuation case like `(_italic` still closes.\n return !/[\\p{L}\\p{N}_]/u.test(text[index - 1]);\n}\n\n/**\n * Closes a single `_` italic marker. `__` pairs are masked out first, and the\n * marker is only closed when it both opens at a word boundary and sits directly\n * before a non-space character, so `snake_case` is left alone.\n */\nfunction closeSingleUnderscore(text: string): string {\n const masked = text.replace(/__/g, \"\");\n const count = (masked.match(/_/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"_\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s_]/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"_\");\n}\n\n/**\n * Closes a `__` bold marker when it is unbalanced, opens at a word boundary,\n * and is directly followed by a non-space character (so `a__b` and `__init__`\n * are left untouched).\n */\nfunction closeDoubleUnderscore(text: string): string {\n const count = (text.match(/__/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"__\");\n const after = text.slice(lastIndex + 2);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n if (!opensAtWordBoundary(text, lastIndex)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"__\");\n}\n\n/**\n * Closes a two-character emphasis marker (`**` or `~~`) when it is unbalanced\n * and the final marker looks like an opener (immediately followed by a\n * non-space character), which avoids touching list markers or operators.\n */\nfunction closeRunMarker(text: string, marker: string): string {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const count = (text.match(new RegExp(escaped, \"g\")) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(marker);\n const after = text.slice(lastIndex + marker.length);\n if (after.length === 0 || /^\\s/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, marker);\n}\n\n/**\n * Closes a single `*` italic marker. `**` pairs are masked out first, and the\n * marker is only closed when it sits directly before a non-space character so\n * bullet markers (`* item`) and multiplication (`2 * 3`) are left alone.\n */\nfunction closeSingleAsterisk(text: string): string {\n const masked = text.replace(/\\*\\*/g, \"\");\n const count = (masked.match(/\\*/g) ?? []).length;\n if (count % 2 === 0) return text;\n\n const lastIndex = text.lastIndexOf(\"*\");\n const after = text.slice(lastIndex + 1);\n if (after.length === 0 || /^[\\s*]/.test(after)) return text;\n\n return insertBeforeTrailingWhitespace(text, \"*\");\n}\n\n/**\n * Appends a closing emphasis marker, but places it before any trailing\n * whitespace. A closer such as `**` is only valid when it directly follows a\n * non-space character, so `**bold ` must become `**bold** ` rather than the\n * un-renderable `**bold **`.\n */\nfunction insertBeforeTrailingWhitespace(text: string, marker: string): string {\n const trailing = text.match(/\\s+$/)?.[0] ?? \"\";\n const core = text.slice(0, text.length - trailing.length);\n return core + marker + trailing;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { CopyButtonProps } from \"./types\";\n\nfunction CopyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function CopyButton({ text, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const copy = () => {\n const clipboard = navigator.clipboard;\n if (!clipboard) return;\n // Only show the \"copied\" confirmation once the write actually succeeds.\n void clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (timeoutRef.current != null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard write failed; keep the idle state.\n });\n };\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n className={className}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n data-copied={copied ? \"\" : undefined}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n );\n}\n","/**\n * Matches a fenced code block or an inline code span. Shared by\n * {@link preprocessLaTeX} and {@link escapeBrackets} so both functions treat\n * code identically; composed into the larger patterns below via `.source`.\n */\nconst CODE_SPAN = /```[\\s\\S]*?```|`[^`\\n]+`/;\n\n/**\n * Preprocesses LaTeX content by replacing delimiters and escaping certain characters.\n *\n * @param content The input string containing LaTeX expressions.\n * @returns The processed string with replaced delimiters and escaped characters.\n */\nexport function preprocessLaTeX(content: string): string {\n // Step 1: Protect code blocks\n const codeBlocks: string[] = [];\n content = content.replace(\n new RegExp(`(${CODE_SPAN.source})`, \"g\"),\n (_match, code) => {\n codeBlocks.push(code);\n return `<<CODE_BLOCK_${codeBlocks.length - 1}>>`;\n },\n );\n\n // Step 2: Protect existing LaTeX expressions. This is what makes the currency\n // escaping in Step 3 safe: by pulling complete `$$…$$` / `\\[…\\]` / `\\(…\\)`\n // regions out of the string first, the `\\$(?=\\d)` pass below cannot corrupt a\n // `$` that legitimately belongs to a math expression (e.g. `$$x = $5$$`).\n //\n // Single-dollar inline math whose content begins with a digit (e.g.\n // `$15 \\text{ г}$`) is protected too: without this its opening `$` would be\n // escaped as currency in Step 3, unbalancing the delimiters so remark-math\n // swallows the rest of the paragraph as one math region. Two shapes qualify:\n // 1. spans containing a LaTeX command (`\\…`), e.g. `$15 \\text{ г}$`;\n // 2. balanced spans whose content is purely numeric/math (digits, spaces\n // and basic operators, no prose letters), e.g. `$0$` or `$1288 / 3$`.\n // Both leave plain currency prose like `$5 and $10` for Step 3, because that\n // text contains letters between the dollars and so matches neither shape.\n const latexExpressions: string[] = [];\n content = content.replace(\n /(\\$\\$[\\s\\S]*?\\$\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\)|\\$(?!\\$)[^$\\n]*?\\\\[a-zA-Z][^$\\n]*?\\$|\\$(?!\\$)\\d[\\d\\s.,+\\-*/=]*\\$)/g,\n (match) => {\n latexExpressions.push(match);\n return `<<LATEX_${latexExpressions.length - 1}>>`;\n },\n );\n\n // Step 3: Escape dollar signs that are likely currency indicators\n content = content.replace(/\\$(?=\\d)/g, \"\\\\$\");\n\n // Step 4: Restore LaTeX expressions\n content = content.replace(\n /<<LATEX_(\\d+)>>/g,\n (_, index) => latexExpressions[parseInt(index, 10)],\n );\n\n // Step 5: Restore code blocks\n content = content.replace(\n /<<CODE_BLOCK_(\\d+)>>/g,\n (_, index) => codeBlocks[parseInt(index, 10)],\n );\n\n // Step 6: Apply additional escaping functions\n content = escapeBrackets(content);\n content = escapeMhchem(content);\n\n return content;\n}\n\nexport function escapeBrackets(text: string): string {\n const pattern = new RegExp(\n `(${CODE_SPAN.source})|` +\n /\\\\\\[((?:[\\s\\S]*?[^\\\\])?)\\\\]|\\\\\\((.*?)\\\\\\)/.source,\n \"g\",\n );\n return text.replace(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock != null) {\n return codeBlock;\n } else if (squareBracket != null) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket != null) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\nexport function escapeMhchem(text: string): string {\n return text.replaceAll(\"$\\\\ce{\", \"$\\\\\\\\ce{\").replaceAll(\"$\\\\pu{\", \"$\\\\\\\\pu{\");\n}\n","import { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeKatex from \"rehype-katex\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nimport { completePartialTokens } from \"./completePartialTokens\";\nimport { CopyButton } from \"./CopyButton\";\nimport { preprocessLaTeX } from \"./preprocess\";\nimport type {\n CodeHighlighter,\n LLMMessageClassNames,\n LLMMessageComponents,\n} from \"./types\";\n\nexport interface LLMMessageProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"content\"> {\n /** The LLM message content as a markdown string. */\n children?: string;\n /** Alias for `children`. */\n content?: string;\n /** Class applied to the root element (merged with the built-in class). */\n className?: string;\n /** Per-element class overrides (merged with the built-in classes). */\n classNames?: LLMMessageClassNames;\n /** Per-element component overrides for full markup control. */\n components?: LLMMessageComponents;\n /**\n * Repair partially-streamed markdown/LaTeX so unterminated tokens (e.g.\n * `**bold`, `` `code ``, `[label](http`, `$E = mc^2`) do not render as raw\n * delimiter junk while the response is still streaming. Defaults to `true`.\n */\n completePartialTokens?: boolean;\n /**\n * Progressively render unterminated *block* math (`\\[…`, `$$…`) while it\n * streams, instead of hiding it until the closing delimiter arrives. This is\n * nicer to watch (a long block reveals row by row) but costs a synchronous\n * KaTeX parse on every chunk that contains an open block. Set to `false` to\n * hide unfinished blocks and skip that work. Only relevant while\n * `completePartialTokens` is enabled. Defaults to `true`.\n */\n showUnfinishedLatexBlocks?: boolean;\n /**\n * Optional syntax highlighter for fenced code blocks. When omitted, code\n * blocks render as plain text (so no highlighter bundle is pulled in). Pass\n * `ShikiHighlighter` / `ShikiWebHighlighter`, or build your own with\n * `createShikiHighlighter`.\n */\n highlighter?: CodeHighlighter;\n}\n\nconst remarkPlugins = [remarkGfm, remarkMath];\nconst rehypePlugins = [rehypeKatex];\n\nfunction cx(...inputs: Array<string | undefined>): string | undefined {\n const result = clsx(inputs);\n return result === \"\" ? undefined : result;\n}\n\nfunction buildComponents(\n classNames: LLMMessageClassNames | undefined,\n overrides: LLMMessageComponents | undefined,\n highlighter: CodeHighlighter | undefined,\n): Components {\n const cn = classNames ?? {};\n const o = overrides ?? {};\n const Highlighter = highlighter;\n\n return {\n code({ node: _node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const codeText = String(children).replace(/\\n$/, \"\");\n // A fenced block always spans its own lines (so its text contains a\n // newline) even when no language info string is present; inline code\n // never does. Relying on the `language-` class alone would misrender a\n // bare ``` fence as inline code.\n const isBlock = match != null || String(children).includes(\"\\n\");\n\n if (isBlock) {\n const language = match?.[1] ?? \"\";\n if (o.codeBlock) {\n const CodeBlock = o.codeBlock;\n return (\n <CodeBlock\n code={codeText}\n language={language}\n className={cn.codeBlock}\n />\n );\n }\n return (\n <div className={cx(\"llm-code-block\", cn.codeBlock)}>\n <div className={cx(\"llm-code-header\", cn.codeHeader)}>\n <span className={cx(\"llm-code-language\", cn.codeLanguage)}>\n {language}\n </span>\n {o.copyButton ? (\n <o.copyButton text={codeText} className={cn.copyButton} />\n ) : (\n <CopyButton\n text={codeText}\n className={cx(\"llm-copy-button\", cn.copyButton)}\n />\n )}\n </div>\n <div className=\"llm-code-body\">\n {Highlighter ? (\n <Highlighter code={codeText} language={language} />\n ) : (\n <code className=\"llm-code-plain\">{codeText}</code>\n )}\n </div>\n </div>\n );\n }\n\n if (o.code) {\n const InlineCode = o.code;\n return (\n <InlineCode className={cx(\"llm-code\", cn.code, className)}>\n {children}\n </InlineCode>\n );\n }\n\n return (\n <code className={cx(\"llm-code\", cn.code, className)} {...props}>\n {children}\n </code>\n );\n },\n pre({ children }) {\n if (o.pre) {\n return <o.pre>{children}</o.pre>;\n }\n // Let the code component handle fenced blocks.\n return <>{children}</>;\n },\n table({ children }) {\n if (o.table) {\n return <o.table className={cn.table}>{children}</o.table>;\n }\n return (\n <div className={cx(\"llm-table-wrapper\", cn.tableWrapper)}>\n <table className={cx(\"llm-table\", cn.table)}>{children}</table>\n </div>\n );\n },\n th({ children }) {\n if (o.th) {\n return <o.th className={cn.th}>{children}</o.th>;\n }\n return <th className={cx(\"llm-th\", cn.th)}>{children}</th>;\n },\n td({ children }) {\n if (o.td) {\n return <o.td className={cn.td}>{children}</o.td>;\n }\n return <td className={cx(\"llm-td\", cn.td)}>{children}</td>;\n },\n blockquote({ children }) {\n if (o.blockquote) {\n return <o.blockquote className={cn.blockquote}>{children}</o.blockquote>;\n }\n return (\n <blockquote className={cx(\"llm-blockquote\", cn.blockquote)}>\n {children}\n </blockquote>\n );\n },\n ul({ children }) {\n if (o.ul) {\n return <o.ul className={cn.ul}>{children}</o.ul>;\n }\n return <ul className={cx(\"llm-ul\", cn.ul)}>{children}</ul>;\n },\n ol({ children }) {\n if (o.ol) {\n return <o.ol className={cn.ol}>{children}</o.ol>;\n }\n return <ol className={cx(\"llm-ol\", cn.ol)}>{children}</ol>;\n },\n li({ children }) {\n if (o.li) {\n return <o.li className={cn.li}>{children}</o.li>;\n }\n return <li className={cx(\"llm-li\", cn.li)}>{children}</li>;\n },\n p({ children }) {\n if (o.p) {\n return <o.p className={cn.p}>{children}</o.p>;\n }\n return <p className={cx(\"llm-p\", cn.p)}>{children}</p>;\n },\n h1({ children }) {\n if (o.h1) {\n return <o.h1 className={cn.h1}>{children}</o.h1>;\n }\n return <h1 className={cx(\"llm-h1\", cn.h1)}>{children}</h1>;\n },\n h2({ children }) {\n if (o.h2) {\n return <o.h2 className={cn.h2}>{children}</o.h2>;\n }\n return <h2 className={cx(\"llm-h2\", cn.h2)}>{children}</h2>;\n },\n h3({ children }) {\n if (o.h3) {\n return <o.h3 className={cn.h3}>{children}</o.h3>;\n }\n return <h3 className={cx(\"llm-h3\", cn.h3)}>{children}</h3>;\n },\n h4({ children }) {\n if (o.h4) {\n return <o.h4 className={cn.h4}>{children}</o.h4>;\n }\n return <h4 className={cx(\"llm-h4\", cn.h4)}>{children}</h4>;\n },\n h5({ children }) {\n if (o.h5) {\n return <o.h5 className={cn.h5}>{children}</o.h5>;\n }\n return <h5 className={cx(\"llm-h5\", cn.h5)}>{children}</h5>;\n },\n h6({ children }) {\n if (o.h6) {\n return <o.h6 className={cn.h6}>{children}</o.h6>;\n }\n return <h6 className={cx(\"llm-h6\", cn.h6)}>{children}</h6>;\n },\n input({ node: _node, type, checked, disabled, ...props }) {\n if (type === \"checkbox\") {\n if (o.checkbox) {\n return (\n <o.checkbox checked={Boolean(checked)} className={cn.checkbox} />\n );\n }\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(checked)}\n disabled\n aria-label={checked ? \"Completed task\" : \"Incomplete task\"}\n className={cx(\"llm-checkbox\", cn.checkbox)}\n readOnly\n />\n );\n }\n return (\n <input\n type={type}\n checked={checked}\n disabled={disabled}\n readOnly\n {...props}\n />\n );\n },\n a({ href, children }) {\n if (o.a) {\n return (\n <o.a href={href} className={cn.a}>\n {children}\n </o.a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cx(\"llm-a\", cn.a)}\n >\n {children}\n </a>\n );\n },\n img({ node: _node, src, alt, title, className: _className, ...props }) {\n if (o.img) {\n const Image = o.img;\n return (\n <Image\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cn.img}\n />\n );\n }\n return (\n <img\n src={typeof src === \"string\" ? src : undefined}\n alt={alt}\n title={title}\n className={cx(\"llm-img\", cn.img)}\n {...props}\n />\n );\n },\n hr() {\n if (o.hr) {\n return <o.hr className={cn.hr} />;\n }\n return <hr className={cx(\"llm-hr\", cn.hr)} />;\n },\n strong({ children }) {\n if (o.strong) {\n return <o.strong className={cn.strong}>{children}</o.strong>;\n }\n return <strong className={cx(\"llm-strong\", cn.strong)}>{children}</strong>;\n },\n em({ children }) {\n if (o.em) {\n return <o.em className={cn.em}>{children}</o.em>;\n }\n return <em className={cx(\"llm-em\", cn.em)}>{children}</em>;\n },\n del({ children }) {\n if (o.del) {\n return <o.del className={cn.del}>{children}</o.del>;\n }\n return <del className={cx(\"llm-del\", cn.del)}>{children}</del>;\n },\n };\n}\n\nexport function LLMMessage({\n children,\n content,\n className,\n classNames,\n components,\n completePartialTokens: repairPartialTokens = true,\n showUnfinishedLatexBlocks = true,\n highlighter,\n ...rest\n}: LLMMessageProps) {\n const source = content ?? children ?? \"\";\n\n const markdownComponents = useMemo(\n () => buildComponents(classNames, components, highlighter),\n [classNames, components, highlighter],\n );\n\n const processed = useMemo(() => {\n const repaired = repairPartialTokens\n ? completePartialTokens(source, { showUnfinishedLatexBlocks })\n : source;\n return preprocessLaTeX(repaired);\n }, [source, repairPartialTokens, showUnfinishedLatexBlocks]);\n\n return (\n <div className={cx(\"llm-message\", classNames?.root, className)} {...rest}>\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n components={markdownComponents}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n"]}
package/dist/styles.css CHANGED
@@ -93,16 +93,17 @@
93
93
  .llm-ul,
94
94
  .llm-ol {
95
95
  margin: 0.75rem 0;
96
+ padding-inline-start: 1.25rem;
96
97
  display: flex;
97
98
  flex-direction: column;
98
99
  gap: 0.375rem;
99
100
  }
100
101
  .llm-ul {
101
- margin-left: 1.25rem;
102
+ margin-left: 0.25rem;
102
103
  list-style: disc;
103
104
  }
104
105
  .llm-ol {
105
- margin-left: 1.5rem;
106
+ margin-left: 0.25rem;
106
107
  list-style: decimal;
107
108
  }
108
109
  .llm-ul::marker,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-message-react",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "React component for rendering streaming LLM markdown, repairing incomplete tokens mid-stream, with GFM, KaTeX math and Shiki code highlighting.",
5
5
  "type": "module",
6
6
  "license": "MIT",