@copilotkit/markdown 0.0.0-stage → 2.0.0-rc.12
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/LICENSE +21 -0
- package/README.md +24 -2
- package/dist/index.cjs +2023 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +361 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +361 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2018 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react/index.cjs +538 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +190 -0
- package/dist/react/index.d.cts.map +1 -0
- package/dist/react/index.d.mts +190 -0
- package/dist/react/index.d.mts.map +1 -0
- package/dist/react/index.mjs +535 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/react-native/index.cjs +330 -0
- package/dist/react-native/index.cjs.map +1 -0
- package/dist/react-native/index.d.cts +74 -0
- package/dist/react-native/index.d.cts.map +1 -0
- package/dist/react-native/index.d.mts +74 -0
- package/dist/react-native/index.d.mts.map +1 -0
- package/dist/react-native/index.mjs +300 -0
- package/dist/react-native/index.mjs.map +1 -0
- package/dist/vue/index.cjs +256 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +116 -0
- package/dist/vue/index.d.cts.map +1 -0
- package/dist/vue/index.d.mts +116 -0
- package/dist/vue/index.d.mts.map +1 -0
- package/dist/vue/index.mjs +255 -0
- package/dist/vue/index.mjs.map +1 -0
- package/package.json +80 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["CLOSING_PUNCTUATION"],"sources":["../src/parser/helpers.ts","../src/parser/citations.ts","../src/parser/segments.ts","../src/parser/inline-parser.ts","../src/parser/block-parser.ts","../src/parser/ops.ts","../src/parser/state.ts","../src/dev-warning.ts"],"sourcesContent":["import type { StreamingMarkdownParserOptions } from \"./types\";\nimport type { SourceLine } from \"./internal\";\n\n/**\n * Default parser options for streaming markdown.\n */\nexport const DEFAULT_OPTIONS: StreamingMarkdownParserOptions = {\n segmenter: true,\n enableTables: true,\n enableAutolinks: true,\n};\n\n/**\n * Merges user-provided parser options with defaults.\n *\n * @param options - Optional partial parser options.\n * @returns Fully populated parser options.\n */\nexport function normalizeOptions(\n options: Partial<StreamingMarkdownParserOptions> | undefined,\n): StreamingMarkdownParserOptions {\n return {\n segmenter: options?.segmenter ?? DEFAULT_OPTIONS.segmenter,\n enableTables: options?.enableTables ?? DEFAULT_OPTIONS.enableTables,\n enableAutolinks:\n options?.enableAutolinks ?? DEFAULT_OPTIONS.enableAutolinks,\n };\n}\n\n/**\n * Normalizes streaming input chunks by handling trailing carriage-return boundaries.\n *\n * @param chunk - Incoming raw chunk.\n * @param hadPendingCR - Whether the previous chunk ended with `\\\\r`.\n * @returns Normalized text and whether this chunk now ends with a pending `\\\\r`.\n */\nexport function normalizeChunk(\n chunk: string,\n hadPendingCR: boolean,\n): { text: string; pendingCarriageReturn: boolean } {\n const input = (hadPendingCR ? \"\\r\" : \"\") + chunk;\n const pendingCarriageReturn = input.endsWith(\"\\r\");\n const head = pendingCarriageReturn ? input.slice(0, -1) : input;\n\n return {\n text: head.replace(/\\r\\n?/g, \"\\n\"),\n pendingCarriageReturn,\n };\n}\n\n/**\n * Splits normalized source text into lines with source offsets.\n *\n * @param source - Normalized source text.\n * @returns Line descriptors preserving absolute ranges.\n */\nexport function splitLines(source: string): SourceLine[] {\n const lines: SourceLine[] = [];\n let start = 0;\n\n for (let i = 0; i < source.length; i += 1) {\n if (source[i] !== \"\\n\") {\n continue;\n }\n\n lines.push({\n text: source.slice(start, i),\n start,\n end: i + 1,\n hasNewline: true,\n });\n start = i + 1;\n }\n\n if (start < source.length || source.length === 0) {\n lines.push({\n text: source.slice(start),\n start,\n end: source.length,\n hasNewline: false,\n });\n }\n\n return lines;\n}\n\n/**\n * Returns the trailing unterminated line text.\n *\n * @param source - Full source text.\n * @returns Last line content after the final newline.\n */\nexport function getLineBuffer(source: string): string {\n const newline = source.lastIndexOf(\"\\n\");\n return newline < 0 ? source : source.slice(newline + 1);\n}\n\n/**\n * Converts an absolute source index to 1-based line/column.\n *\n * @param source - Source text.\n * @param index - Absolute index.\n * @returns 1-based line and column coordinates.\n */\nexport function toLineColumn(\n source: string,\n index: number,\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < index; i += 1) {\n if (source[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Returns true for blank lines.\n */\nexport function isBlank(value: string): boolean {\n return /^\\s*$/.test(value);\n}\n\n/**\n * Returns true when a line is a citation definition.\n */\nexport function isCitationDefinitionLine(value: string): boolean {\n return /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.test(value);\n}\n\n/**\n * Returns true when a line is an unfinished citation-definition prefix candidate.\n *\n * This enables optimistic streaming behavior for definition lines that begin with\n * `[^` but are not yet complete enough to classify as either:\n * 1) a valid citation definition, or\n * 2) plain paragraph text.\n *\n * @param value - Raw line text.\n * @param hasNewline - Whether the source line is newline-terminated.\n * @param isComplete - Whether the parser has been finalized.\n */\nexport function isCitationDefinitionPrefixCandidate(\n value: string,\n hasNewline: boolean,\n isComplete: boolean,\n): boolean {\n if (hasNewline || isComplete || isCitationDefinitionLine(value)) {\n return false;\n }\n\n return (\n /^\\s{0,3}\\[\\^[^\\]\\s]*$/.test(value) || /^\\s{0,3}\\[\\^[^\\]\\s]+\\]$/.test(value)\n );\n}\n\n/**\n * Matches an opening fenced code block marker.\n */\nexport function matchFenceOpen(\n value: string,\n): { marker: \"```\" | \"~~~\"; length: number; info: string } | null {\n const trimmed = value.trimStart();\n const backtick = /^(`{3,})(.*)$/.exec(trimmed);\n if (backtick) {\n return {\n marker: \"```\",\n length: backtick[1].length,\n info: backtick[2].trim(),\n };\n }\n\n const tilde = /^(~{3,})(.*)$/.exec(trimmed);\n if (tilde) {\n return {\n marker: \"~~~\",\n length: tilde[1].length,\n info: tilde[2].trim(),\n };\n }\n\n return null;\n}\n\n/**\n * Matches a valid fenced code block closing line.\n */\nexport function matchFenceClose(\n value: string,\n marker: \"```\" | \"~~~\",\n length: number,\n): boolean {\n const re = marker === \"```\" ? /^\\s*`{3,}\\s*$/ : /^\\s*~{3,}\\s*$/;\n if (!re.test(value)) {\n return false;\n }\n\n const trimmed = value.trim();\n return trimmed.length >= length;\n}\n\n/**\n * Matches ATX heading syntax and extracts heading metadata.\n */\nexport function matchAtxHeading(value: string): {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n text: string;\n contentOffset: number;\n} | null {\n const match = /^\\s{0,3}(#{1,6})[ \\t]+(.+?)\\s*#*\\s*$/.exec(value);\n if (!match) {\n return null;\n }\n\n return {\n level: match[1].length as 1 | 2 | 3 | 4 | 5 | 6,\n text: match[2],\n contentOffset: value.indexOf(match[2]),\n };\n}\n\n/**\n * Returns true for setext heading underline lines.\n */\nexport function isSetextUnderline(value: string): boolean {\n return /^\\s{0,3}(=+|-+)\\s*$/.test(value);\n}\n\n/**\n * Returns true for thematic break syntax.\n */\nexport function isThematicBreak(value: string): boolean {\n return /^\\s{0,3}((\\*\\s*){3,}|(-\\s*){3,}|(_\\s*){3,})$/.test(value);\n}\n\n/**\n * Matches ordered and unordered list-item markers.\n */\nexport function matchListItem(value: string): {\n ordered: boolean;\n start: number;\n content: string;\n indent: number;\n contentIndent: number;\n} | null {\n const unordered = /^(\\s{0,3})([-+*])(\\s+)(.*)$/.exec(value);\n if (unordered) {\n const indent = unordered[1].length;\n const contentIndent = indent + unordered[2].length + unordered[3].length;\n return {\n ordered: false,\n start: 1,\n content: unordered[4],\n indent,\n contentIndent,\n };\n }\n\n const ordered = /^(\\s{0,3})(\\d{1,9})([.)])(\\s+)(.*)$/.exec(value);\n if (ordered) {\n const indent = ordered[1].length;\n const markerLength = ordered[2].length + ordered[3].length;\n const contentIndent = indent + markerLength + ordered[4].length;\n return {\n ordered: true,\n start: Number(ordered[2]),\n content: ordered[5],\n indent,\n contentIndent,\n };\n }\n\n return null;\n}\n\n/**\n * Returns true for blockquote marker lines.\n */\nexport function isBlockquoteLine(value: string): boolean {\n return /^\\s{0,3}>\\s?/.test(value);\n}\n\n/**\n * Returns true when two lines form a GFM table header + divider pair.\n */\nexport function isPipeTableHeader(\n first: SourceLine,\n second: SourceLine,\n): boolean {\n return looksLikeTableRow(first.text) && isTableDividerRow(second.text);\n}\n\n/**\n * Returns true when a line appears to be a table row.\n */\nexport function looksLikeTableRow(value: string): boolean {\n return value.includes(\"|\") && /\\S/.test(value.replace(/\\|/g, \"\"));\n}\n\n/**\n * Returns true for GFM table divider rows.\n */\nexport function isTableDividerRow(value: string): boolean {\n const cells = splitTableCells(value);\n if (cells.length === 0) {\n return false;\n }\n\n return cells.every((cell) => /^:?-{3,}:?$/.test(cell.trim()));\n}\n\n/**\n * Splits a pipe-table row into trimmed cell values.\n */\nexport function splitTableCells(value: string): string[] {\n const trimmed = value.trim();\n const body = trimmed.startsWith(\"|\") ? trimmed.slice(1) : trimmed;\n const core = body.endsWith(\"|\") ? body.slice(0, -1) : body;\n return core.split(\"|\").map((cell) => cell.trim());\n}\n\n/**\n * Converts table divider cells into alignment metadata.\n */\nexport function parseTableAlignment(\n cells: string[],\n): Array<\"left\" | \"right\" | \"center\" | \"none\"> {\n return cells.map((cell) => {\n const trimmed = cell.trim();\n const left = trimmed.startsWith(\":\");\n const right = trimmed.endsWith(\":\");\n\n if (left && right) {\n return \"center\";\n }\n if (left) {\n return \"left\";\n }\n if (right) {\n return \"right\";\n }\n\n return \"none\";\n });\n}\n\n/**\n * Determines whether a line starts a new block construct.\n */\nexport function startsNewBlock(\n lines: SourceLine[],\n index: number,\n enableTables: boolean,\n): boolean {\n const line = lines[index].text;\n\n return (\n !!matchFenceOpen(line) ||\n !!matchAtxHeading(line) ||\n isThematicBreak(line) ||\n !!matchListItem(line) ||\n isBlockquoteLine(line) ||\n (enableTables &&\n index + 1 < lines.length &&\n isPipeTableHeader(lines[index], lines[index + 1]))\n );\n}\n\n/**\n * Returns true when a character is escapable in CommonMark inline syntax.\n */\nexport function isEscapable(ch: string): boolean {\n return /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(ch);\n}\n\n/**\n * Finds the matching closing delimiter for a nested delimiter pair.\n */\nexport function findClosing(\n input: string,\n openAt: number,\n openChar: \"[\" | \"(\",\n closeChar: \"]\" | \")\",\n): number {\n let depth = 0;\n for (let i = openAt; i < input.length; i += 1) {\n const ch = input[i];\n if (ch === \"\\\\\") {\n i += 1;\n continue;\n }\n\n if (ch === openChar) {\n depth += 1;\n continue;\n }\n\n if (ch === closeChar) {\n depth -= 1;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Parses a markdown link destination and optional title.\n */\nexport function parseLinkDestination(input: string): {\n url: string;\n title?: string;\n} {\n const trimmed = input.trim();\n\n if (trimmed.startsWith(\"<\")) {\n const close = trimmed.indexOf(\">\");\n if (close > 0) {\n const url = trimmed.slice(1, close);\n const rest = trimmed.slice(close + 1).trim();\n const title = parseLinkTitle(rest);\n return title ? { url, title } : { url };\n }\n }\n\n const firstSpace = trimmed.search(/\\s/);\n if (firstSpace < 0) {\n return { url: trimmed };\n }\n\n const url = trimmed.slice(0, firstSpace);\n const title = parseLinkTitle(trimmed.slice(firstSpace).trim());\n\n return title ? { url, title } : { url };\n}\n\n/**\n * Parses CommonMark-style link titles (`\\\"...\\\"`, `'...'`, `( ... )`).\n */\nexport function parseLinkTitle(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n\n if (\n (input.startsWith('\"') && input.endsWith('\"')) ||\n (input.startsWith(\"'\") && input.endsWith(\"'\"))\n ) {\n return input.slice(1, -1);\n }\n\n if (input.startsWith(\"(\") && input.endsWith(\")\")) {\n return input.slice(1, -1);\n }\n\n return undefined;\n}\n\n/**\n * Returns true for URL-shaped text supported by autolink detection.\n */\nexport function isUrl(value: string): boolean {\n return /^(https?:\\/\\/|www\\.)\\S+$/.test(value);\n}\n\n/**\n * Returns true for email-shaped text supported by autolink detection.\n */\nexport function isEmail(value: string): boolean {\n return /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/.test(value);\n}\n\n/**\n * Trims punctuation suffixes from autolink candidates.\n */\nexport function trimAutolinkTrailingPunctuation(value: string): string {\n let end = value.length;\n while (end > 0 && /[.,;:!?]/.test(value[end - 1])) {\n end -= 1;\n }\n\n let candidate = value.slice(0, end);\n if (candidate.endsWith(\")\")) {\n const open = (candidate.match(/\\(/g) ?? []).length;\n const close = (candidate.match(/\\)/g) ?? []).length;\n if (close > open) {\n candidate = candidate.slice(0, -1);\n }\n }\n\n return candidate;\n}\n","import type { CitationState, StreamingMarkdownWarning } from \"./types\";\n\n/**\n * Extracts citation definitions from source text.\n *\n * @param source - Full normalized markdown source.\n * @param warnings - Mutable warning collection for parse diagnostics.\n * @returns Citation state with collected definitions and empty reference order.\n */\nexport function parseCitationDefinitions(source: string): {\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n} {\n const definitions: CitationState[\"definitions\"] = {};\n const warnings: StreamingMarkdownWarning[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n\n for (const line of lines) {\n const match = /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.exec(line);\n\n if (!match) {\n offset += line.length + 1;\n continue;\n }\n\n const id = match[1];\n\n if (definitions[id]) {\n warnings.push({ code: \"invalid_citation_definition\", at: offset });\n offset += line.length + 1;\n continue;\n }\n\n const extracted = extractTrailingUrl(match[2].trim());\n definitions[id] = {\n id,\n text: extracted.text,\n ...(extracted.url ? { url: extracted.url } : {}),\n };\n\n offset += line.length + 1;\n }\n\n return {\n citations: {\n order: [],\n numbers: {},\n definitions,\n },\n warnings,\n };\n}\n\n/**\n * Assigns or returns a stable citation number by first-seen inline reference order.\n *\n * @param citations - Citation state that tracks numbering.\n * @param idRef - Citation identifier (without `[^` and `]` markers).\n * @returns Stable numeric citation number.\n */\nexport function assignCitationNumber(\n citations: CitationState,\n idRef: string,\n): { citations: CitationState; number: number } {\n const existing = citations.numbers[idRef];\n if (typeof existing === \"number\") {\n return { citations, number: existing };\n }\n\n const next = citations.order.length + 1;\n return {\n citations: {\n ...citations,\n order: [...citations.order, idRef],\n numbers: { ...citations.numbers, [idRef]: next },\n },\n number: next,\n };\n}\n\nfunction extractTrailingUrl(input: string): { text: string; url?: string } {\n if (!input) {\n return { text: \"\" };\n }\n\n const match = /(?:\\s|^)(https?:\\/\\/\\S+|www\\.\\S+)$/.exec(input);\n\n if (!match) {\n return { text: input };\n }\n\n return {\n text: input.slice(0, match.index).trimEnd(),\n url: match[1],\n };\n}\n","import type { SegmenterOptions, TextSegment } from \"./types\";\n\n/**\n * Computes parse-time text segments for animation and incremental rendering.\n *\n * @param text - Raw text content for a single text node.\n * @param absoluteStart - Absolute source index where `text` begins.\n * @param context - Parse context containing segmenter options and warning state.\n * @returns Segment list or empty list when segmentation is disabled/unavailable.\n */\nexport function createSegments(\n text: string,\n absoluteStart: number,\n options: {\n segmenter: SegmenterOptions;\n hasWarnedSegmenterUnavailable: boolean;\n },\n): {\n segments: TextSegment[];\n warning?: { code: \"segmenter_unavailable\"; at: number };\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (options.segmenter === false) {\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n }\n\n const segmenterCtor =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n if (!segmenterCtor) {\n if (!options.hasWarnedSegmenterUnavailable) {\n return {\n segments: [],\n warning: { code: \"segmenter_unavailable\", at: absoluteStart },\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n const granularity =\n options.segmenter === true\n ? \"word\"\n : (options.segmenter.granularity ?? \"word\");\n const locale =\n options.segmenter === true ? undefined : options.segmenter.locale;\n\n const segmenter = new segmenterCtor(locale, { granularity });\n const segments: TextSegment[] = [];\n\n for (const segment of segmenter.segment(text)) {\n const segmentText = segment.segment;\n const start = absoluteStart + segment.index;\n\n segments.push({\n text: segmentText,\n start,\n end: start + segmentText.length,\n kind: granularity,\n isWhitespace: /^\\s+$/.test(segmentText),\n });\n }\n\n const clustered = clusterPunctuationSegments(segments);\n\n return {\n segments: clustered,\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction clusterPunctuationSegments(segments: TextSegment[]): TextSegment[] {\n const withClosingAttached = segments.reduce<TextSegment[]>((acc, segment) => {\n const previous = acc[acc.length - 1];\n if (\n previous &&\n !previous.isWhitespace &&\n isClosingPunctuationOnly(segment.text)\n ) {\n acc[acc.length - 1] = {\n ...previous,\n text: `${previous.text}${segment.text}`,\n end: segment.end,\n };\n\n return acc;\n }\n\n return [...acc, segment];\n }, []);\n\n const clustered: TextSegment[] = [];\n let i = 0;\n while (i < withClosingAttached.length) {\n const current = withClosingAttached[i];\n const next =\n i + 1 < withClosingAttached.length ? withClosingAttached[i + 1] : null;\n\n if (next && !next.isWhitespace && isOpeningPunctuationOnly(current.text)) {\n clustered.push({\n ...next,\n text: `${current.text}${next.text}`,\n start: current.start,\n });\n i += 2;\n continue;\n }\n\n clustered.push(current);\n i += 1;\n }\n\n return clustered;\n}\n\nfunction isClosingPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, CLOSING_PUNCTUATION);\n}\n\nfunction isOpeningPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, OPENING_PUNCTUATION);\n}\n\nfunction isOnlyFromSet(value: string, charset: ReadonlySet<string>): boolean {\n return (\n value.length > 0 && [...value].every((character) => charset.has(character))\n );\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nconst OPENING_PUNCTUATION = new Set([\n \"(\",\n \"{\",\n \"[\",\n '\"',\n \"'\",\n \"〈\",\n \"《\",\n \"「\",\n \"『\",\n \"【\",\n \"〔\",\n \"〖\",\n \"(\",\n \"[\",\n \"{\",\n]);\n","import { assignCitationNumber } from \"./citations\";\nimport {\n findClosing,\n isEmail,\n isEscapable,\n isUrl,\n parseLinkDestination,\n trimAutolinkTrailingPunctuation,\n} from \"./helpers\";\nimport type { DraftNode, ParseContext, ParseResult } from \"./internal\";\nimport { createSegments } from \"./segments\";\nimport type {\n CitationState,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Parses inline markdown content into inline draft nodes.\n *\n * @param text - Inline source text.\n * @param absoluteStart - Absolute source offset for the first character in `text`.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Immutable parse context shared across block/inline parsing.\n * @returns Inline draft nodes and updated immutable parser context.\n */\nexport function parseInline(\n text: string,\n absoluteStart: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode[]> {\n const nodes: DraftNode[] = [];\n let i = 0;\n let textBuffer = \"\";\n let textBufferStart = -1;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const flushTextBuffer = () => {\n if (textBuffer.length === 0 || textBufferStart < 0) {\n return;\n }\n\n const appendResult = appendText(\n nodes,\n textBuffer,\n textBufferStart,\n path,\n context.options.segmenter,\n hasWarnedSegmenterUnavailable,\n );\n warnings =\n appendResult.warnings.length > 0\n ? [...warnings, ...appendResult.warnings]\n : warnings;\n hasWarnedSegmenterUnavailable = appendResult.hasWarnedSegmenterUnavailable;\n textBuffer = \"\";\n textBufferStart = -1;\n };\n\n const appendBufferedText = (value: string, start: number) => {\n if (value.length === 0) {\n return;\n }\n\n if (textBuffer.length === 0) {\n textBufferStart = start;\n }\n\n textBuffer += value;\n };\n\n while (i < text.length) {\n const current = text[i];\n\n if (current === \"\\n\") {\n const trailingBackslashes = countTrailing(text, i - 1, \"\\\\\");\n const hardByBackslash = trailingBackslashes % 2 === 1;\n const hardBySpaces = i > 1 && text.slice(i - 2, i) === \" \";\n const hard = hardByBackslash || hardBySpaces;\n\n if (hardByBackslash && textBuffer.endsWith(\"\\\\\")) {\n textBuffer = textBuffer.slice(0, -1);\n }\n\n flushTextBuffer();\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: hard ? \"hard-break\" : \"soft-break\",\n range: { start: absoluteStart + i, end: absoluteStart + i + 1 },\n closed: true,\n props: {},\n children: [],\n });\n i += 1;\n continue;\n }\n\n if (current === \"\\\\\" && i + 1 < text.length && isEscapable(text[i + 1])) {\n appendBufferedText(text[i + 1], absoluteStart + i);\n i += 2;\n continue;\n }\n\n const citation = parseCitationInline(\n text,\n i,\n absoluteStart,\n path,\n citations,\n nodes.length,\n context.isComplete,\n );\n if (citation) {\n flushTextBuffer();\n nodes.push(citation.node);\n i = citation.next;\n citations = citation.citations;\n continue;\n }\n\n const image = parseImageInline(text, i, absoluteStart, path, nodes.length);\n if (image) {\n flushTextBuffer();\n nodes.push(image.node);\n i = image.next;\n continue;\n }\n\n const link = parseLinkInline(\n text,\n i,\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (link) {\n flushTextBuffer();\n nodes.push(link.node);\n i = link.next;\n citations = link.citations;\n warnings = link.warnings;\n hasWarnedSegmenterUnavailable = link.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const auto = parseAutolinkInline(\n text,\n i,\n absoluteStart,\n path,\n context.options.enableAutolinks,\n nodes.length,\n );\n if (auto) {\n flushTextBuffer();\n nodes.push(auto.node);\n i = auto.next;\n continue;\n }\n\n const code = parseInlineCode(text, i, absoluteStart, path, nodes.length);\n if (code) {\n flushTextBuffer();\n nodes.push(code.node);\n i = code.next;\n continue;\n }\n\n const strong =\n parseDelimitedInline(\n text,\n i,\n \"**\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"__\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strong) {\n flushTextBuffer();\n nodes.push(strong.node);\n i = strong.next;\n citations = strong.citations;\n warnings = strong.warnings;\n hasWarnedSegmenterUnavailable = strong.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const strike = parseDelimitedInline(\n text,\n i,\n \"~~\",\n \"strikethrough\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strike) {\n flushTextBuffer();\n nodes.push(strike.node);\n i = strike.next;\n citations = strike.citations;\n warnings = strike.warnings;\n hasWarnedSegmenterUnavailable = strike.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const em =\n parseDelimitedInline(\n text,\n i,\n \"*\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"_\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (em) {\n flushTextBuffer();\n nodes.push(em.node);\n i = em.next;\n citations = em.citations;\n warnings = em.warnings;\n hasWarnedSegmenterUnavailable = em.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n appendBufferedText(text[i], absoluteStart + i);\n i += 1;\n }\n\n flushTextBuffer();\n const inlineNodes = annotateNoBreakBeforeSegments(nodes);\n\n return {\n value: inlineNodes,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction countTrailing(text: string, index: number, value: string): number {\n let run = 0;\n let i = index;\n\n while (i >= 0 && text[i] === value) {\n run += 1;\n i -= 1;\n }\n\n return run;\n}\n\nfunction annotateNoBreakBeforeSegments(nodes: DraftNode[]): DraftNode[] {\n let changed = false;\n\n const next = nodes.map((node, index) => {\n if (node.type !== \"text\") {\n return node;\n }\n\n const segments = node.props[\"segments\"];\n if (!Array.isArray(segments) || segments.length === 0) {\n return node;\n }\n\n const typedSegments = segments as TextSegment[];\n const firstSegment = typedSegments[0];\n if (!firstSegment) {\n return node;\n }\n\n const previous = index > 0 ? nodes[index - 1] : null;\n const shouldMark =\n startsWithClosingPunctuation(firstSegment.text) &&\n shouldPreventBreakBeforeNode(previous);\n const alreadyMarked = firstSegment.noBreakBefore === true;\n\n if (shouldMark === alreadyMarked) {\n return node;\n }\n\n const nextFirst: TextSegment = shouldMark\n ? { ...firstSegment, noBreakBefore: true }\n : { ...firstSegment, noBreakBefore: undefined };\n const nextSegments = [nextFirst, ...typedSegments.slice(1)];\n\n changed = true;\n return {\n ...node,\n props: {\n ...node.props,\n segments: nextSegments,\n },\n };\n });\n\n return changed ? next : nodes;\n}\n\nfunction shouldPreventBreakBeforeNode(node: DraftNode | null): boolean {\n if (!node) {\n return false;\n }\n\n if (node.type === \"soft-break\" || node.type === \"hard-break\") {\n return false;\n }\n\n if (node.type === \"text\") {\n const text = String(node.props[\"text\"] ?? \"\");\n if (!text || /\\s$/u.test(text)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction startsWithClosingPunctuation(value: string): boolean {\n if (!value) {\n return false;\n }\n\n const [first] = [...value];\n return first != null && CLOSING_PUNCTUATION.has(first);\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nfunction appendText(\n nodes: DraftNode[],\n text: string,\n start: number,\n path: string,\n segmenter: ParseContext[\"options\"][\"segmenter\"],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (!text) {\n return { warnings: [], hasWarnedSegmenterUnavailable };\n }\n\n const segmentation = createSegments(text, start, {\n segmenter,\n hasWarnedSegmenterUnavailable,\n });\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: \"text\",\n range: { start, end: start + text.length },\n closed: true,\n props: {\n text,\n segments: segmentation.segments,\n },\n children: [],\n });\n\n return {\n warnings: segmentation.warning ? [segmentation.warning] : [],\n hasWarnedSegmenterUnavailable: segmentation.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCitationInline(\n text: string,\n at: number,\n start: number,\n path: string,\n citations: CitationState,\n index: number,\n isComplete: boolean,\n): { node: DraftNode; next: number; citations: CitationState } | null {\n if (!text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const close = text.indexOf(\"]\", at + 2);\n if (close >= 0) {\n const idRef = text.slice(at + 2, close).trim();\n if (!idRef) {\n return null;\n }\n\n const numbered = assignCitationNumber(citations, idRef);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { idRef, number: numbered.number },\n children: [],\n },\n next: close + 1,\n citations: numbered.citations,\n };\n }\n\n if (isComplete) {\n return null;\n }\n\n const partial = text.slice(at);\n if (!/^\\[\\^[^\\]\\s]+$/u.test(partial)) {\n return null;\n }\n\n const partialIdRef = partial.slice(2);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: { idRef: partialIdRef },\n children: [],\n },\n next: text.length,\n citations,\n };\n}\n\nfunction parseImageInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!text.startsWith(\"![\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at + 1, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const alt = text.slice(at + 2, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"image\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n alt,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: [],\n },\n next: destEnd + 1,\n };\n}\n\nfunction parseLinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (text[at] !== \"[\" || text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const label = text.slice(at + 1, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n const childResult = parseInline(label, start + at + 1, `${path}.${index}`, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"link\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: childResult.value,\n },\n next: destEnd + 1,\n citations: childResult.citations,\n warnings: childResult.warnings,\n hasWarnedSegmenterUnavailable: childResult.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseAutolinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n enabled: boolean,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!enabled) {\n return null;\n }\n\n if (text[at] === \"<\") {\n const close = text.indexOf(\">\", at + 1);\n if (close > at + 1) {\n const value = text.slice(at + 1, close).trim();\n if (isUrl(value) || isEmail(value)) {\n const url = isEmail(value) ? `mailto:${value}` : value;\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { url, text: value },\n children: [],\n },\n next: close + 1,\n };\n }\n }\n }\n\n const boundaryOk = at === 0 || /\\s|[([{\"'`]/.test(text[at - 1]);\n if (!boundaryOk) {\n return null;\n }\n\n const match =\n /^(https?:\\/\\/\\S+|www\\.\\S+|[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})/.exec(\n text.slice(at),\n );\n if (!match) {\n return null;\n }\n\n const raw = trimAutolinkTrailingPunctuation(match[1]);\n if (!raw) {\n return null;\n }\n\n const url = isEmail(raw)\n ? `mailto:${raw}`\n : raw.startsWith(\"www.\")\n ? `https://${raw}`\n : raw;\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + at + raw.length },\n closed: true,\n props: {\n url,\n text: raw,\n },\n children: [],\n },\n next: at + raw.length,\n };\n}\n\nfunction parseInlineCode(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (text[at] !== \"`\") {\n return null;\n }\n\n let len = 1;\n while (text[at + len] === \"`\") {\n len += 1;\n }\n\n const delimiter = \"`\".repeat(len);\n const close = text.indexOf(delimiter, at + len);\n if (close < 0) {\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {\n text: text.slice(at + len),\n },\n children: [],\n },\n next: text.length,\n };\n }\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + close + len },\n closed: true,\n props: {\n text: text.slice(at + len, close),\n },\n children: [],\n },\n next: close + len,\n };\n}\n\nfunction parseDelimitedInline(\n text: string,\n at: number,\n delimiter: string,\n type: \"em\" | \"strong\" | \"strikethrough\",\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (!text.startsWith(delimiter, at)) {\n return null;\n }\n\n const close = text.indexOf(delimiter, at + delimiter.length);\n if (close < 0) {\n const content = text.slice(at + delimiter.length);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {},\n children: children.value,\n },\n next: text.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n }\n\n const content = text.slice(at + delimiter.length, close);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + close + delimiter.length },\n closed: true,\n props: {},\n children: children.value,\n },\n next: close + delimiter.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import {\n isBlank,\n isBlockquoteLine,\n isCitationDefinitionLine,\n isCitationDefinitionPrefixCandidate,\n isPipeTableHeader,\n isSetextUnderline,\n isThematicBreak,\n looksLikeTableRow,\n matchAtxHeading,\n matchFenceClose,\n matchFenceOpen,\n matchListItem,\n parseTableAlignment,\n splitTableCells,\n startsNewBlock,\n} from \"./helpers\";\nimport type {\n DraftNode,\n ParseContext,\n ParseResult,\n SourceLine,\n} from \"./internal\";\nimport { parseInline } from \"./inline-parser\";\n\n/**\n * Parses a contiguous range of source lines into block-level draft nodes.\n *\n * @param lines - Line-split source with offsets.\n * @param from - Inclusive start line index.\n * @param to - Exclusive end line index.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Shared parse context carrying options, warnings, and citations.\n * @param isRoot - Whether this parse call is for the document root.\n * @returns Root draft node plus updated immutable parse context.\n */\nexport function parseBlocks(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n isRoot: boolean,\n): ParseResult<DraftNode> {\n let root: DraftNode = {\n path,\n type: \"document\",\n range: {\n start: from < to ? lines[from].start : 0,\n end: from < to ? lines[to - 1].end : 0,\n },\n closed: false,\n props: {},\n children: [],\n };\n\n let i = from;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const line = lines[i];\n const isCitationDefinition = isCitationDefinitionLine(line.text);\n const isCitationDefinitionPrefix = isCitationDefinitionPrefixCandidate(\n line.text,\n line.hasNewline,\n context.isComplete,\n );\n\n if (\n isBlank(line.text) ||\n isCitationDefinition ||\n isCitationDefinitionPrefix\n ) {\n i += 1;\n continue;\n }\n\n const fenced = matchFenceOpen(line.text);\n if (fenced) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseCodeFence(lines, i, to, nodePath, context, fenced);\n root.children = [...root.children, parsed.node];\n i = parsed.next;\n continue;\n }\n\n if (isBlockquoteLine(line.text)) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseBlockquote(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const listMarker = matchListItem(line.text);\n if (listMarker) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseList(\n lines,\n i,\n to,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n listMarker.ordered,\n );\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const heading = matchAtxHeading(line.text);\n if (heading) {\n const nodePath = `${path}.${root.children.length}`;\n const children = parseInline(\n heading.text,\n line.start + heading.contentOffset,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: line.end },\n closed: context.isComplete || line.hasNewline,\n props: { level: heading.level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 1;\n continue;\n }\n\n if (\n i + 1 < to &&\n isSetextUnderline(lines[i + 1].text) &&\n !isBlank(line.text)\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const level = lines[i + 1].text.trim().startsWith(\"=\") ? 1 : 2;\n const children = parseInline(line.text, line.start, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: lines[i + 1].end },\n closed: context.isComplete || lines[i + 1].hasNewline,\n props: { level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 2;\n continue;\n }\n\n if (isThematicBreak(line.text)) {\n root.children = [\n ...root.children,\n {\n path: `${path}.${root.children.length}`,\n type: \"thematic-break\",\n range: { start: line.start, end: line.end },\n closed: true,\n props: {},\n children: [],\n },\n ];\n i += 1;\n continue;\n }\n\n if (\n context.options.enableTables &&\n i + 1 < to &&\n isPipeTableHeader(lines[i], lines[i + 1])\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parsePipeTable(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseParagraph(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n root = {\n ...root,\n closed:\n !isRoot ||\n context.isComplete ||\n (to > from &&\n lines[to - 1].hasNewline &&\n root.children.every((child) => child.closed)),\n };\n\n return {\n value: root,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCodeFence(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n fenceOpen: { marker: \"```\" | \"~~~\"; length: number; info: string },\n): { node: DraftNode; next: number } {\n let i = from + 1;\n let closeLine = -1;\n\n while (i < to) {\n if (matchFenceClose(lines[i].text, fenceOpen.marker, fenceOpen.length)) {\n closeLine = i;\n break;\n }\n i += 1;\n }\n\n const endLine = closeLine >= 0 ? closeLine : to - 1;\n const textLines = lines.slice(from + 1, closeLine >= 0 ? closeLine : to);\n const text = textLines.map((line) => line.text).join(\"\\n\");\n const closed = closeLine >= 0 || context.isComplete;\n\n return {\n node: {\n path,\n type: \"code-block\",\n range: { start: lines[from].start, end: lines[endLine].end },\n closed,\n props: {\n fence: fenceOpen.marker,\n ...(fenceOpen.info ? { info: fenceOpen.info.split(/\\s+/)[0] } : {}),\n ...(fenceOpen.info.includes(\" \")\n ? { meta: fenceOpen.info.slice(fenceOpen.info.indexOf(\" \") + 1) }\n : {}),\n text,\n },\n children: [],\n },\n next: closeLine >= 0 ? closeLine + 1 : to,\n };\n}\n\nfunction parseBlockquote(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n const line = lines[i];\n if (isBlank(line.text) && picked.length > 0) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n if (\n isBlockquoteLine(line.text) ||\n (!isBlank(line.text) &&\n picked.length > 0 &&\n !startsNewBlock(lines, i, context.options.enableTables))\n ) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n break;\n }\n\n const stripped = picked.map((line) => {\n const marker = /^(\\s{0,3}>\\s?)/.exec(line.text);\n const markerWidth = marker?.[1].length ?? 0;\n const text = marker ? line.text.slice(markerWidth) : line.text;\n const start = line.start + markerWidth;\n\n return {\n text,\n start,\n end: start + text.length,\n hasNewline: line.hasNewline,\n };\n });\n const children = parseBlocks(\n stripped,\n 0,\n stripped.length,\n path,\n context,\n false,\n );\n\n return {\n value: {\n path,\n type: \"blockquote\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value.children,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseList(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n ordered: boolean,\n): ParseResult<DraftNode> & { next: number } {\n const items: DraftNode[] = [];\n let i = from;\n let sawBlankBetweenItems = false;\n let listStartNumber: number | null = null;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const marker = matchListItem(lines[i].text);\n if (!marker || marker.ordered !== ordered) {\n break;\n }\n\n if (ordered && listStartNumber === null) {\n listStartNumber = marker.start;\n }\n\n const contentLines: SourceLine[] = [\n {\n ...lines[i],\n text: marker.content,\n },\n ];\n const contentIndent = marker.contentIndent;\n\n i += 1;\n let hadBlank = false;\n\n while (i < to) {\n const next = lines[i];\n const nextMarker = matchListItem(next.text);\n\n if (nextMarker) {\n break;\n }\n\n if (isBlank(next.text)) {\n hadBlank = true;\n contentLines.push(next);\n i += 1;\n\n if (i < to) {\n const afterBlank = matchListItem(lines[i].text);\n if (afterBlank) {\n sawBlankBetweenItems = true;\n break;\n }\n }\n\n continue;\n }\n\n const leadingWhitespace = /^\\s*/.exec(next.text)?.[0].length ?? 0;\n if (leadingWhitespace < contentIndent) {\n break;\n }\n\n const continuation = next.text.slice(contentIndent);\n contentLines.push({ ...next, text: continuation });\n i += 1;\n }\n\n const paragraphText = contentLines\n .map((line) => line.text)\n .join(\"\\n\")\n .trimEnd();\n const itemPath = `${path}.${items.length}`;\n const parsedInline = parseInline(\n paragraphText,\n contentLines[0].start,\n `${itemPath}.0`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n const paragraph: DraftNode = {\n path: `${itemPath}.0`,\n type: \"paragraph\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: {},\n children: parsedInline.value,\n };\n\n items.push({\n path: itemPath,\n type: \"list-item\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: {},\n children: [paragraph],\n });\n\n citations = parsedInline.citations;\n warnings = parsedInline.warnings;\n hasWarnedSegmenterUnavailable = parsedInline.hasWarnedSegmenterUnavailable;\n\n if (hadBlank) {\n sawBlankBetweenItems = true;\n }\n }\n\n return {\n value: {\n path,\n type: \"list\",\n range: {\n start: lines[from].start,\n end: lines[Math.max(from, i - 1)].end,\n },\n closed: context.isComplete || lines[Math.max(from, i - 1)].hasNewline,\n props: {\n ordered,\n start: ordered ? (listStartNumber ?? 1) : null,\n tight: !sawBlankBetweenItems,\n },\n children: items,\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parsePipeTable(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const header = splitTableCells(lines[from].text);\n const align = parseTableAlignment(splitTableCells(lines[from + 1].text));\n\n const rows: string[][] = [];\n let i = from + 2;\n while (i < to && looksLikeTableRow(lines[i].text)) {\n rows.push(splitTableCells(lines[i].text));\n i += 1;\n }\n\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const headerChildren: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < header.length; cellIndex += 1) {\n const parsed = parseInline(\n header[cellIndex],\n lines[from].start,\n `${path}.0.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n headerChildren.push({\n path: `${path}.0.${cellIndex}`,\n type: \"table-cell\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n const headerRow: DraftNode = {\n path: `${path}.0`,\n type: \"table-row\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: { isHeader: true },\n children: headerChildren,\n };\n\n const bodyRows: DraftNode[] = [];\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) {\n const row = rows[rowIndex];\n const cellNodes: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < row.length; cellIndex += 1) {\n const parsed = parseInline(\n row[cellIndex],\n lines[from + 2 + rowIndex].start,\n `${path}.${rowIndex + 1}.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n cellNodes.push({\n path: `${path}.${rowIndex + 1}.${cellIndex}`,\n type: \"table-cell\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n bodyRows.push({\n path: `${path}.${rowIndex + 1}`,\n type: \"table-row\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: { isHeader: false },\n children: cellNodes,\n });\n }\n\n return {\n value: {\n path,\n type: \"table\",\n range: { start: lines[from].start, end: lines[i - 1].end },\n closed: context.isComplete || lines[i - 1].hasNewline,\n props: { align },\n children: [headerRow, ...bodyRows],\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseParagraph(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n if (isBlank(lines[i].text)) {\n break;\n }\n\n if (\n picked.length > 0 &&\n startsNewBlock(lines, i, context.options.enableTables)\n ) {\n break;\n }\n\n if (\n isCitationDefinitionLine(lines[i].text) ||\n isCitationDefinitionPrefixCandidate(\n lines[i].text,\n lines[i].hasNewline,\n context.isComplete,\n )\n ) {\n break;\n }\n\n picked.push(lines[i]);\n i += 1;\n }\n\n const text = picked.map((line) => line.text).join(\"\\n\");\n const children = parseInline(text, picked[0].start, path, context);\n\n return {\n value: {\n path,\n type: \"paragraph\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import type { DraftNode } from \"./internal\";\nimport type {\n CitationState,\n StreamingMarkdownAstNode,\n StreamingMarkdownHeadingNode,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Operation protocol used to reduce tokenized draft trees into immutable AST state.\n * @internal\n */\nexport type StreamingMarkdownAstOp =\n | {\n kind: \"upsert-node\";\n path: string;\n parentPath: string | null;\n type: DraftNode[\"type\"];\n range: { start: number; end: number };\n closed: boolean;\n props: Record<string, unknown>;\n childPaths: string[];\n }\n | { kind: \"set-warnings\"; warnings: StreamingMarkdownWarning[] }\n | { kind: \"set-citations\"; citations: CitationState }\n | {\n kind: \"set-segmenter-warning-state\";\n hasWarnedSegmenterUnavailable: boolean;\n };\n\n/**\n * Flattens a draft tree into reducer operations.\n *\n * @param root - Draft AST root.\n * @returns Ordered operations for reducer application.\n */\nexport function createAstOpsFromDraft(\n root: DraftNode,\n): StreamingMarkdownAstOp[] {\n const ops: StreamingMarkdownAstOp[] = [];\n\n function visit(node: DraftNode, parentPath: string | null) {\n const childPaths = node.children.map(\n (child, index) => `${node.path}.${index}`,\n );\n\n ops.push({\n kind: \"upsert-node\",\n path: node.path,\n parentPath,\n type: node.type,\n range: node.range,\n closed: node.closed,\n props: node.props,\n childPaths,\n });\n\n for (let index = 0; index < node.children.length; index += 1) {\n const child = node.children[index];\n visit({ ...child, path: `${node.path}.${index}` }, node.path);\n }\n }\n\n visit(root, null);\n return ops;\n}\n\n/**\n * Applies AST ops with identity reuse for unchanged nodes.\n *\n * @param input - Previous parser state fragments and ops to apply.\n * @returns Next materialized state fragments.\n */\nexport function applyAstOps(input: {\n previousNodes: StreamingMarkdownAstNode[];\n previousPathToId: Record<string, number>;\n nextId: number;\n ops: StreamingMarkdownAstOp[];\n}): {\n nodes: StreamingMarkdownAstNode[];\n rootId: number;\n nextId: number;\n pathToId: Record<string, number>;\n warnings: StreamingMarkdownWarning[];\n citations: CitationState;\n hasWarnedSegmenterUnavailable: boolean;\n} {\n const previousNodeById = new Map(\n input.previousNodes.map((node) => [node.id, node]),\n );\n const nodeOps = input.ops.filter(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }> =>\n op.kind === \"upsert-node\",\n );\n\n const pathToId: Record<string, number> = {};\n let nextId = input.nextId;\n\n for (const op of nodeOps) {\n const existingId = input.previousPathToId[op.path];\n const id = existingId ?? nextId++;\n pathToId[op.path] = id;\n }\n\n const nodesById = new Map<number, StreamingMarkdownAstNode>();\n\n for (const op of nodeOps) {\n const id = pathToId[op.path];\n const parentId = op.parentPath ? pathToId[op.parentPath] : null;\n const childIds = op.childPaths.map((childPath) => pathToId[childPath]);\n const materialized = opToAstNode(op, id, parentId, childIds);\n const previous = previousNodeById.get(id);\n const reconciled =\n previous?.type === \"text\" && materialized.type === \"text\"\n ? reconcileTextNode(previous, materialized)\n : materialized;\n\n nodesById.set(\n id,\n previous && astNodeEquals(previous, reconciled) ? previous : reconciled,\n );\n }\n\n const rootPath = nodeOps[0]?.path;\n if (!rootPath) {\n throw new Error(\"StreamingMarkdown op stream did not include a root node\");\n }\n\n const warnings =\n input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-warnings\" }> =>\n op.kind === \"set-warnings\",\n )?.warnings ?? [];\n const citations = input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-citations\" }> =>\n op.kind === \"set-citations\",\n )?.citations ?? { order: [], numbers: {}, definitions: {} };\n const hasWarnedSegmenterUnavailable =\n input.ops.find(\n (\n op,\n ): op is Extract<\n StreamingMarkdownAstOp,\n { kind: \"set-segmenter-warning-state\" }\n > => op.kind === \"set-segmenter-warning-state\",\n )?.hasWarnedSegmenterUnavailable ?? false;\n\n return {\n nodes: Array.from(nodesById.values()).sort((a, b) => a.id - b.id),\n rootId: pathToId[rootPath],\n nextId,\n pathToId,\n warnings,\n citations,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction opToAstNode(\n op: Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }>,\n id: number,\n parentId: number | null,\n children: number[],\n): StreamingMarkdownAstNode {\n const base = {\n id,\n type: op.type,\n parentId,\n closed: op.closed,\n range: op.range,\n };\n\n switch (op.type) {\n case \"document\":\n return { ...base, type: \"document\", children };\n case \"paragraph\":\n return { ...base, type: \"paragraph\", children };\n case \"heading\":\n return {\n ...base,\n type: \"heading\",\n level: op.props[\"level\"] as StreamingMarkdownHeadingNode[\"level\"],\n children,\n };\n case \"blockquote\":\n return { ...base, type: \"blockquote\", children };\n case \"list\":\n return {\n ...base,\n type: \"list\",\n ordered: op.props[\"ordered\"] as boolean,\n start: op.props[\"start\"] as number | null,\n tight: op.props[\"tight\"] as boolean,\n children,\n };\n case \"list-item\":\n return { ...base, type: \"list-item\", children };\n case \"code-block\":\n return {\n ...base,\n type: \"code-block\",\n fence: op.props[\"fence\"] as \"```\" | \"~~~\",\n info: op.props[\"info\"] as string | undefined,\n meta: op.props[\"meta\"] as string | undefined,\n text: op.props[\"text\"] as string,\n };\n case \"table\":\n return {\n ...base,\n type: \"table\",\n align: op.props[\"align\"] as Array<\"left\" | \"right\" | \"center\" | \"none\">,\n children,\n };\n case \"table-row\":\n return {\n ...base,\n type: \"table-row\",\n isHeader: op.props[\"isHeader\"] as boolean,\n children,\n };\n case \"table-cell\":\n return { ...base, type: \"table-cell\", children };\n case \"thematic-break\":\n return { ...base, type: \"thematic-break\" };\n case \"text\":\n return {\n ...base,\n type: \"text\",\n text: op.props[\"text\"] as string,\n segments: op.props[\"segments\"] as TextSegment[],\n };\n case \"em\":\n return { ...base, type: \"em\", children };\n case \"strong\":\n return { ...base, type: \"strong\", children };\n case \"strikethrough\":\n return { ...base, type: \"strikethrough\", children };\n case \"inline-code\":\n return {\n ...base,\n type: \"inline-code\",\n text: op.props[\"text\"] as string,\n };\n case \"soft-break\":\n return { ...base, type: \"soft-break\" };\n case \"hard-break\":\n return { ...base, type: \"hard-break\" };\n case \"link\":\n return {\n ...base,\n type: \"link\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n children,\n };\n case \"image\":\n return {\n ...base,\n type: \"image\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n alt: op.props[\"alt\"] as string,\n };\n case \"autolink\":\n return {\n ...base,\n type: \"autolink\",\n url: op.props[\"url\"] as string,\n text: op.props[\"text\"] as string,\n };\n default:\n return {\n ...base,\n type: \"citation\",\n idRef: op.props[\"idRef\"] as string,\n number: op.props[\"number\"] as number | undefined,\n };\n }\n}\n\nfunction astNodeEquals(\n a: StreamingMarkdownAstNode,\n b: StreamingMarkdownAstNode,\n): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction reconcileTextNode(\n previous: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n next: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n): Extract<StreamingMarkdownAstNode, { type: \"text\" }> {\n if (next.segments.length === 0 || previous.segments.length === 0) {\n return next;\n }\n\n const previousBySignature = groupSegmentsBySignature(previous.segments);\n let reusedAnySegment = false;\n\n const segments = next.segments.map((segment) => {\n const signature = getSegmentSignature(segment);\n const bucket = previousBySignature.get(signature);\n if (!bucket?.length) {\n return segment;\n }\n\n const [reused, ...rest] = bucket;\n if (rest.length) {\n previousBySignature.set(signature, rest);\n } else {\n previousBySignature.delete(signature);\n }\n\n reusedAnySegment = true;\n return reused;\n });\n\n if (areSegmentArraysIdentical(previous.segments, segments)) {\n return {\n ...next,\n segments: previous.segments,\n };\n }\n\n if (!reusedAnySegment) {\n return next;\n }\n\n return {\n ...next,\n segments,\n };\n}\n\n/**\n * Returns true when both arrays contain the same segment object references in order.\n */\nfunction areSegmentArraysIdentical(\n a: TextSegment[],\n b: TextSegment[],\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((segment, index) => segment === b[index]);\n}\n\n/**\n * Produces a stable signature for matching segments across immutable parse iterations.\n */\nfunction getSegmentSignature(segment: TextSegment): string {\n return `${segment.start}:${segment.end}:${segment.text}:${segment.kind}:${String(segment.isWhitespace)}:${String(segment.noBreakBefore === true)}`;\n}\n\n/**\n * Groups previous segments by signature to support one-to-one identity reuse.\n */\nfunction groupSegmentsBySignature(\n segments: TextSegment[],\n): Map<string, TextSegment[]> {\n const bySignature = new Map<string, TextSegment[]>();\n\n for (const segment of segments) {\n const signature = getSegmentSignature(segment);\n const existing = bySignature.get(signature) ?? [];\n bySignature.set(signature, [...existing, segment]);\n }\n\n return bySignature;\n}\n","import { parseBlocks } from \"./block-parser\";\nimport { parseCitationDefinitions } from \"./citations\";\nimport {\n getLineBuffer,\n normalizeChunk,\n normalizeOptions,\n splitLines,\n toLineColumn,\n} from \"./helpers\";\nimport { applyAstOps, createAstOpsFromDraft } from \"./ops\";\nimport type {\n StreamingMarkdownAstNode,\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserState,\n ParseMode,\n} from \"./types\";\n\n/**\n * Creates a new streaming markdown parser state.\n *\n * @param options - Optional parser option overrides.\n * @returns New immutable parser state.\n * @public\n */\nexport function createStreamingMarkdownParserState(\n options?: Partial<StreamingMarkdownParserOptions>,\n): StreamingMarkdownParserState {\n const normalizedOptions = normalizeOptions(options);\n const documentNode = {\n id: 1,\n type: \"document\" as const,\n parentId: null,\n closed: false,\n range: { start: 0, end: 0 },\n children: [],\n };\n\n return {\n nextId: 2,\n nodes: [documentNode],\n rootId: 1,\n stack: [1],\n mode: \"block\",\n warnings: [],\n citations: {\n order: [],\n numbers: {},\n definitions: {},\n },\n lineBuffer: \"\",\n isComplete: false,\n index: 0,\n line: 1,\n column: 1,\n options: normalizedOptions,\n source: \"\",\n pathToId: { \"0\": 1 },\n pendingCarriageReturn: false,\n hasWarnedSegmenterUnavailable: false,\n };\n}\n\n/**\n * Parses a streaming chunk and returns the next immutable parser state.\n *\n * @param state - Current parser state.\n * @param chunk - Incoming text chunk.\n * @returns Updated parser state.\n * @public\n */\nexport function parseStreamingMarkdownChunk(\n state: StreamingMarkdownParserState,\n chunk: string,\n): StreamingMarkdownParserState {\n const normalized = normalizeChunk(chunk, state.pendingCarriageReturn);\n const source = state.source + normalized.text;\n\n return rebuildState(state, {\n source,\n isComplete: false,\n pendingCarriageReturn: normalized.pendingCarriageReturn,\n });\n}\n\n/**\n * Finalizes parsing by closing any provisional nodes and flushing trailing CR.\n *\n * @param state - Current parser state.\n * @returns Final parser state.\n * @public\n */\nexport function finalizeStreamingMarkdown(\n state: StreamingMarkdownParserState,\n): StreamingMarkdownParserState {\n if (state.isComplete) {\n return state;\n }\n\n const source = state.source + (state.pendingCarriageReturn ? \"\\n\" : \"\");\n\n return rebuildState(state, {\n source,\n isComplete: true,\n pendingCarriageReturn: false,\n });\n}\n\nfunction rebuildState(\n prev: StreamingMarkdownParserState,\n input: {\n source: string;\n isComplete: boolean;\n pendingCarriageReturn: boolean;\n },\n): StreamingMarkdownParserState {\n const definitions = parseCitationDefinitions(input.source);\n const parseContext = {\n options: prev.options,\n warnings: definitions.warnings,\n citations: definitions.citations,\n isComplete: input.isComplete,\n hasWarnedSegmenterUnavailable: prev.hasWarnedSegmenterUnavailable,\n };\n\n const lines = splitLines(input.source);\n const parsedBlocks = parseBlocks(\n lines,\n 0,\n lines.length,\n \"0\",\n parseContext,\n true,\n );\n const ops = [\n { kind: \"set-warnings\", warnings: parsedBlocks.warnings } as const,\n { kind: \"set-citations\", citations: parsedBlocks.citations } as const,\n {\n kind: \"set-segmenter-warning-state\",\n hasWarnedSegmenterUnavailable: parsedBlocks.hasWarnedSegmenterUnavailable,\n } as const,\n ...createAstOpsFromDraft(parsedBlocks.value),\n ];\n\n const reduced = applyAstOps({\n previousNodes: prev.nodes,\n previousPathToId: prev.pathToId,\n nextId: prev.nextId,\n ops,\n });\n\n const lineBuffer = getLineBuffer(input.source);\n const { line, column } = toLineColumn(input.source, input.source.length);\n\n return {\n ...prev,\n nextId: reduced.nextId,\n nodes: reduced.nodes,\n rootId: reduced.rootId,\n stack: computeOpenStack(reduced.nodes, reduced.rootId),\n mode: inferMode(reduced.nodes, reduced.rootId),\n warnings: reduced.warnings,\n citations: reduced.citations,\n lineBuffer,\n isComplete: input.isComplete,\n index: input.source.length,\n line,\n column,\n source: input.source,\n pathToId: reduced.pathToId,\n pendingCarriageReturn: input.pendingCarriageReturn,\n hasWarnedSegmenterUnavailable: reduced.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction computeOpenStack(\n nodes: StreamingMarkdownAstNode[],\n rootId: number,\n): number[] {\n const nodeById = new Map(nodes.map((node) => [node.id, node]));\n const stack: number[] = [];\n\n let cursor: number | null = rootId;\n while (cursor != null) {\n const node = nodeById.get(cursor);\n if (!node || node.closed) {\n break;\n }\n\n stack.push(cursor);\n if (!(\"children\" in node) || node.children.length === 0) {\n break;\n }\n\n const lastChild = node.children[node.children.length - 1];\n cursor = typeof lastChild === \"number\" ? lastChild : null;\n }\n\n return stack;\n}\n\nfunction inferMode(\n nodes: StreamingMarkdownAstNode[],\n rootId: number | null,\n): ParseMode {\n if (rootId == null) {\n return \"block\";\n }\n\n const root = nodes.find((node) => node.id === rootId);\n if (!root || !(\"children\" in root) || root.children.length === 0) {\n return \"block\";\n }\n\n const lastChild = nodes.find(\n (node) => node.id === root.children[root.children.length - 1],\n );\n if (!lastChild || lastChild.closed) {\n return \"block\";\n }\n\n if (lastChild.type === \"paragraph\") {\n return \"paragraph\";\n }\n if (lastChild.type === \"heading\") {\n return \"heading\";\n }\n if (lastChild.type === \"blockquote\") {\n return \"blockquote\";\n }\n if (lastChild.type === \"list-item\") {\n return \"list-item\";\n }\n if (lastChild.type === \"code-block\") {\n return \"code-fence\";\n }\n if (lastChild.type === \"table\") {\n return \"table\";\n }\n\n return \"block\";\n}\n","let warned = false;\n\nconst MIGRATION_GUIDE_URL =\n \"https://docs.copilotkit.ai/migrate/markdown-renderer#migrate-with-your-ai-assistant\";\n\n// A ``` or ~~~ fence immediately followed by a language token (e.g. ```ts).\n// Plain fences with no language are not flagged — they render fine.\nconst HIGHLIGHTABLE_CODE = /(^|\\n)[ \\t]*(```|~~~)[ \\t]*[A-Za-z][\\w+#-]*/;\n// Block math: $$ … $$ or \\[ … \\]. Inline `$…$` is intentionally not flagged\n// (too many false positives with currency, e.g. \"$5 and $10\").\nconst BLOCK_MATH = /\\$\\$[\\s\\S]+?\\$\\$/;\nconst BRACKET_MATH = /\\\\\\[[\\s\\S]+?\\\\\\]/;\n\nfunction isProduction(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.env != null &&\n process.env.NODE_ENV === \"production\"\n );\n}\n\n/**\n * Dev-only, once-per-session warning emitted when CopilotKit's built-in default\n * markdown renderer encounters markdown it won't render richly — math\n * (`$$…$$` / `\\[…\\]`) or a language-tagged fenced code block (rendered as plain,\n * un-highlighted code). Helps people upgrading from the bundled Streamdown\n * default notice the behavioral change and points them at the migration guide.\n *\n * No-op in production and after the first warning. Only the built-in default\n * renderers call this — a custom `markdownRenderer` never triggers it.\n *\n * @internal\n */\nexport function warnUnsupportedRichSyntaxOnce(content: string): void {\n if (warned || !content || isProduction()) return;\n\n const hasMath = BLOCK_MATH.test(content) || BRACKET_MATH.test(content);\n const hasHighlightableCode = HIGHLIGHTABLE_CODE.test(content);\n if (!hasMath && !hasHighlightableCode) return;\n\n warned = true;\n const [feature, missing] = hasMath\n ? [\"math\", \"math typesetting\"]\n : [\"a syntax-highlighted code block\", \"syntax highlighting\"];\n // eslint-disable-next-line no-console\n console.warn(\n `[CopilotKit] The built-in markdown renderer rendered ${feature} without ${missing}. ` +\n `It supports GFM, tables, autolinks, and citations, but not math, syntax ` +\n `highlighting, or diagrams. To restore those, plug in a custom markdownRenderer ` +\n `(e.g. react-markdown or streamdown) — or paste the migration prompt into your ` +\n `AI assistant: ${MIGRATION_GUIDE_URL}`,\n );\n}\n\n/**\n * Resets the once-guard. Test-only.\n * @internal\n */\nexport function __resetUnsupportedRichSyntaxWarning(): void {\n warned = false;\n}\n"],"mappings":"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"}
|